Merge branch 'jk/fetch-reflog-df-conflict'

Fix-up a test for portability.

* jk/fetch-reflog-df-conflict:
  t1410: fix breakage on case-insensitive filesystems
diff --git a/.gitignore b/.gitignore
index dc600f9..a052419 100644
--- a/.gitignore
+++ b/.gitignore
@@ -74,6 +74,7 @@
 /git-index-pack
 /git-init
 /git-init-db
+/git-interpret-trailers
 /git-instaweb
 /git-log
 /git-ls-files
@@ -165,6 +166,7 @@
 /git-upload-archive
 /git-upload-pack
 /git-var
+/git-verify-commit
 /git-verify-pack
 /git-verify-tag
 /git-web--browse
@@ -177,9 +179,11 @@
 /gitweb/static/gitweb.min.*
 /test-chmtime
 /test-ctype
+/test-config
 /test-date
 /test-delta
 /test-dump-cache-tree
+/test-dump-split-index
 /test-scrap-cache-tree
 /test-genrandom
 /test-hashmap
@@ -196,6 +200,7 @@
 /test-revision-walking
 /test-run-command
 /test-sha1
+/test-sha1-array
 /test-sigchain
 /test-string-list
 /test-subprocess
@@ -226,6 +231,7 @@
 /config.mak.autogen
 /config.mak.append
 /configure
+/unicode
 /tags
 /TAGS
 /cscope*
diff --git a/.mailmap b/.mailmap
index d0734d1..bb6f52e 100644
--- a/.mailmap
+++ b/.mailmap
@@ -85,6 +85,7 @@
 Jeff Muizelaar <jmuizelaar@mozilla.com> <jeff@infidigm.net>
 Jens Axboe <axboe@kernel.dk> <axboe@suse.de>
 Jens Axboe <axboe@kernel.dk> <jens.axboe@oracle.com>
+Jens Lindström <jl@opera.com> Jens Lindstrom <jl@opera.com>
 Jim Meyering <jim@meyering.net> <meyering@redhat.com>
 Joachim Berdal Haga <cjhaga@fys.uio.no>
 Johannes Schindelin <Johannes.Schindelin@gmx.de> <johannes.schindelin@gmx.de>
@@ -113,6 +114,7 @@
 Karsten Blees <blees@dcon.de> <karsten.blees@gmail.com>
 Kay Sievers <kay.sievers@vrfy.org> <kay.sievers@suse.de>
 Kay Sievers <kay.sievers@vrfy.org> <kay@mam.(none)>
+Kazuki Saitoh <ksaitoh560@gmail.com> kazuki saitoh <ksaitoh560@gmail.com>
 Keith Cascio <keith@CS.UCLA.EDU> <keith@cs.ucla.edu>
 Kent Engstrom <kent@lysator.liu.se>
 Kevin Leung <kevinlsk@gmail.com>
@@ -203,6 +205,7 @@
 Simon Hausmann <hausmann@kde.org> <simon@lst.de>
 Simon Hausmann <hausmann@kde.org> <shausman@trolltech.com>
 Stefan Beller <stefanbeller@gmail.com> <stefanbeller@googlemail.com>
+Stefan Beller <stefanbeller@gmail.com> <sbeller@google.com>
 Stefan Naewe <stefan.naewe@gmail.com> <stefan.naewe@atlas-elektronik.com>
 Stefan Naewe <stefan.naewe@gmail.com> <stefan.naewe@googlemail.com>
 Stefan Sperling <stsp@elego.de> <stsp@stsp.name>
@@ -230,6 +233,7 @@
 Tommy Thorn <tommy-git@thorn.ws> <tt1729@yahoo.com>
 Tony Luck <tony.luck@intel.com>
 Tor Arne Vestbø <torarnv@gmail.com> <tavestbo@trolltech.com>
+Trần Ngọc Quân <vnwildman@gmail.com> Tran Ngoc Quan <vnwildman@gmail.com>
 Trent Piepho <tpiepho@gmail.com> <tpiepho@freescale.com>
 Trent Piepho <tpiepho@gmail.com> <xyzzy@speakeasy.org>
 Uwe Kleine-König <u.kleine-koenig@pengutronix.de> <Uwe.Kleine-Koenig@digi.com>
diff --git a/Documentation/CodingGuidelines b/Documentation/CodingGuidelines
index f4137c6..894546d 100644
--- a/Documentation/CodingGuidelines
+++ b/Documentation/CodingGuidelines
@@ -18,6 +18,14 @@
    judgement call, the decision based more on real world
    constraints people face than what the paper standard says.
 
+ - Fixing style violations while working on a real change as a
+   preparatory clean-up step is good, but otherwise avoid useless code
+   churn for the sake of conforming to the style.
+
+   "Once it _is_ in the tree, it's not really worth the patch noise to
+   go and fix it up."
+   Cf. http://article.gmane.org/gmane.linux.kernel/943020
+
 Make your code readable and sensible, and don't try to be clever.
 
 As for more concrete guidelines, just imitate the existing code
@@ -34,7 +42,17 @@
 
  - We use tabs for indentation.
 
- - Case arms are indented at the same depth as case and esac lines.
+ - Case arms are indented at the same depth as case and esac lines,
+   like this:
+
+	case "$variable" in
+	pattern1)
+		do this
+		;;
+	pattern2)
+		do that
+		;;
+	esac
 
  - Redirection operators should be written with space before, but no
    space after them.  In other words, write 'echo test >"$file"'
@@ -43,6 +61,14 @@
    redirection target in a variable (as shown above), our code does so
    because some versions of bash issue a warning without the quotes.
 
+	(incorrect)
+	cat hello > world < universe
+	echo hello >$world
+
+	(correct)
+	cat hello >world <universe
+	echo hello >"$world"
+
  - We prefer $( ... ) for command substitution; unlike ``, it
    properly nests.  It should have been the way Bourne spelled
    it from day one, but unfortunately isn't.
@@ -81,14 +107,33 @@
    "then" should be on the next line for if statements, and "do"
    should be on the next line for "while" and "for".
 
+	(incorrect)
+	if test -f hello; then
+		do this
+	fi
+
+	(correct)
+	if test -f hello
+	then
+		do this
+	fi
+
  - We prefer "test" over "[ ... ]".
 
  - We do not write the noiseword "function" in front of shell
    functions.
 
- - We prefer a space between the function name and the parentheses. The
-   opening "{" should also be on the same line.
-   E.g.: my_function () {
+ - We prefer a space between the function name and the parentheses,
+   and no space inside the parentheses. The opening "{" should also
+   be on the same line.
+
+	(incorrect)
+	my_function(){
+		...
+
+	(correct)
+	my_function () {
+		...
 
  - As to use of grep, stick to a subset of BRE (namely, no \{m,n\},
    [::], [==], or [..]) for portability.
@@ -106,6 +151,19 @@
    interface translatable. See "Marking strings for translation" in
    po/README.
 
+ - We do not write our "test" command with "-a" and "-o" and use "&&"
+   or "||" to concatenate multiple "test" commands instead, because
+   the use of "-a/-o" is often error-prone.  E.g.
+
+     test -n "$x" -a "$a" = "$b"
+
+   is buggy and breaks when $x is "=", but
+
+     test -n "$x" && test "$a" = "$b"
+
+   does not have such a problem.
+
+
 For C programs:
 
  - We use tabs to indent, and interpret tabs as taking up to
@@ -149,7 +207,7 @@
    of "else if" statements, it can make sense to add braces to
    single line blocks.
 
- - We try to avoid assignments inside if().
+ - We try to avoid assignments in the condition of an "if" statement.
 
  - Try to make your code understandable.  You may put comments
    in, but comments invariably tend to stale out when the code
@@ -177,6 +235,88 @@
  - Double negation is often harder to understand than no negation
    at all.
 
+ - There are two schools of thought when it comes to comparison,
+   especially inside a loop. Some people prefer to have the less stable
+   value on the left hand side and the more stable value on the right hand
+   side, e.g. if you have a loop that counts variable i down to the
+   lower bound,
+
+	while (i > lower_bound) {
+		do something;
+		i--;
+	}
+
+   Other people prefer to have the textual order of values match the
+   actual order of values in their comparison, so that they can
+   mentally draw a number line from left to right and place these
+   values in order, i.e.
+
+	while (lower_bound < i) {
+		do something;
+		i--;
+	}
+
+   Both are valid, and we use both.  However, the more "stable" the
+   stable side becomes, the more we tend to prefer the former
+   (comparison with a constant, "i > 0", is an extreme example).
+   Just do not mix styles in the same part of the code and mimic
+   existing styles in the neighbourhood.
+
+ - There are two schools of thought when it comes to splitting a long
+   logical line into multiple lines.  Some people push the second and
+   subsequent lines far enough to the right with tabs and align them:
+
+        if (the_beginning_of_a_very_long_expression_that_has_to ||
+		span_more_than_a_single_line_of ||
+		the_source_text) {
+                ...
+
+   while other people prefer to align the second and the subsequent
+   lines with the column immediately inside the opening parenthesis,
+   with tabs and spaces, following our "tabstop is always a multiple
+   of 8" convention:
+
+        if (the_beginning_of_a_very_long_expression_that_has_to ||
+	    span_more_than_a_single_line_of ||
+	    the_source_text) {
+                ...
+
+   Both are valid, and we use both.  Again, just do not mix styles in
+   the same part of the code and mimic existing styles in the
+   neighbourhood.
+
+ - When splitting a long logical line, some people change line before
+   a binary operator, so that the result looks like a parse tree when
+   you turn your head 90-degrees counterclockwise:
+
+        if (the_beginning_of_a_very_long_expression_that_has_to
+	    || span_more_than_a_single_line_of_the_source_text) {
+
+   while other people prefer to leave the operator at the end of the
+   line:
+
+        if (the_beginning_of_a_very_long_expression_that_has_to ||
+	    span_more_than_a_single_line_of_the_source_text) {
+
+   Both are valid, but we tend to use the latter more, unless the
+   expression gets fairly complex, in which case the former tends to
+   be easier to read.  Again, just do not mix styles in the same part
+   of the code and mimic existing styles in the neighbourhood.
+
+ - When splitting a long logical line, with everything else being
+   equal, it is preferable to split after the operator at higher
+   level in the parse tree.  That is, this is more preferable:
+
+	if (a_very_long_variable * that_is_used_in +
+	    a_very_long_expression) {
+		...
+
+   than
+
+	if (a_very_long_variable *
+	    that_is_used_in + a_very_long_expression) {
+		...
+
  - Some clever tricks, like using the !! operator with arithmetic
    constructs, can be extremely confusing to others.  Avoid them,
    unless there is a compelling reason to use them.
diff --git a/Documentation/Makefile b/Documentation/Makefile
index fc6b2cf..2f6b6aa 100644
--- a/Documentation/Makefile
+++ b/Documentation/Makefile
@@ -5,6 +5,7 @@
 TECH_DOCS =
 ARTICLES =
 SP_ARTICLES =
+OBSOLETE_HTML =
 
 MAN1_TXT += $(filter-out \
 		$(addsuffix .txt, $(ARTICLES) $(SP_ARTICLES)), \
@@ -26,6 +27,7 @@
 MAN7_TXT += gitcredentials.txt
 MAN7_TXT += gitcvs-migration.txt
 MAN7_TXT += gitdiffcore.txt
+MAN7_TXT += giteveryday.txt
 MAN7_TXT += gitglossary.txt
 MAN7_TXT += gitnamespaces.txt
 MAN7_TXT += gitrevisions.txt
@@ -37,11 +39,11 @@
 MAN_XML = $(patsubst %.txt,%.xml,$(MAN_TXT))
 MAN_HTML = $(patsubst %.txt,%.html,$(MAN_TXT))
 
-OBSOLETE_HTML = git-remote-helpers.html
+OBSOLETE_HTML += everyday.html
+OBSOLETE_HTML += git-remote-helpers.html
 DOC_HTML = $(MAN_HTML) $(OBSOLETE_HTML)
 
 ARTICLES += howto-index
-ARTICLES += everyday
 ARTICLES += git-tools
 ARTICLES += git-bisect-lk2009
 # with their own formatting rules.
@@ -59,6 +61,7 @@
 SP_ARTICLES += howto/recover-corrupted-object-harder
 SP_ARTICLES += howto/rebuild-from-update-hook
 SP_ARTICLES += howto/rebase-from-internal-branch
+SP_ARTICLES += howto/keep-canonical-history-correct
 SP_ARTICLES += howto/maintain-git
 API_DOCS = $(patsubst %.txt,%,$(filter-out technical/api-index-skel.txt technical/api-index.txt, $(wildcard technical/api-*.txt)))
 SP_ARTICLES += $(API_DOCS)
@@ -96,6 +99,13 @@
 
 ASCIIDOC = asciidoc
 ASCIIDOC_EXTRA =
+ASCIIDOC_HTML = xhtml11
+ASCIIDOC_DOCBOOK = docbook
+ASCIIDOC_CONF = -f asciidoc.conf
+ASCIIDOC_COMMON = $(ASCIIDOC) $(ASCIIDOC_EXTRA) $(ASCIIDOC_CONF) \
+		-agit-version=$(GIT_VERSION)
+TXT_TO_HTML = $(ASCIIDOC_COMMON) -b $(ASCIIDOC_HTML)
+TXT_TO_XML = $(ASCIIDOC_COMMON) -b $(ASCIIDOC_DOCBOOK)
 MANPAGE_XSL = manpage-normal.xsl
 XMLTO = xmlto
 XMLTO_EXTRA =
@@ -303,14 +313,12 @@
 
 $(MAN_HTML): %.html : %.txt asciidoc.conf
 	$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
-	$(ASCIIDOC) -b xhtml11 -d manpage -f asciidoc.conf \
-		$(ASCIIDOC_EXTRA) -agit_version=$(GIT_VERSION) -o $@+ $< && \
+	$(TXT_TO_HTML) -d manpage -o $@+ $< && \
 	mv $@+ $@
 
 $(OBSOLETE_HTML): %.html : %.txto asciidoc.conf
 	$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
-	$(ASCIIDOC) -b xhtml11 -f asciidoc.conf \
-		$(ASCIIDOC_EXTRA) -agit_version=$(GIT_VERSION) -o $@+ $< && \
+	$(TXT_TO_HTML) -o $@+ $< && \
 	mv $@+ $@
 
 manpage-base-url.xsl: manpage-base-url.xsl.in
@@ -322,13 +330,12 @@
 
 %.xml : %.txt asciidoc.conf
 	$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
-	$(ASCIIDOC) -b docbook -d manpage -f asciidoc.conf \
-		$(ASCIIDOC_EXTRA) -agit_version=$(GIT_VERSION) -o $@+ $< && \
+	$(TXT_TO_XML) -d manpage -o $@+ $< && \
 	mv $@+ $@
 
 user-manual.xml: user-manual.txt user-manual.conf
 	$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
-	$(ASCIIDOC) $(ASCIIDOC_EXTRA) -b docbook -d article -o $@+ $< && \
+	$(TXT_TO_XML) -d article -o $@+ $< && \
 	mv $@+ $@
 
 technical/api-index.txt: technical/api-index-skel.txt \
@@ -337,8 +344,7 @@
 
 technical/%.html: ASCIIDOC_EXTRA += -a git-relative-html-prefix=../
 $(patsubst %,%.html,$(API_DOCS) technical/api-index $(TECH_DOCS)): %.html : %.txt asciidoc.conf
-	$(QUIET_ASCIIDOC)$(ASCIIDOC) -b xhtml11 -f asciidoc.conf \
-		$(ASCIIDOC_EXTRA) -agit_version=$(GIT_VERSION) $*.txt
+	$(QUIET_ASCIIDOC)$(TXT_TO_HTML) $*.txt
 
 XSLT = docbook.xsl
 XSLTOPTS = --xinclude --stringparam html.stylesheet docbook-xsl.css
@@ -385,14 +391,15 @@
 	mv $@+ $@
 
 $(patsubst %,%.html,$(ARTICLES)) : %.html : %.txt
-	$(QUIET_ASCIIDOC)$(ASCIIDOC) $(ASCIIDOC_EXTRA) -b xhtml11 $*.txt
+	$(QUIET_ASCIIDOC)$(TXT_TO_HTML) $*.txt
 
 WEBDOC_DEST = /pub/software/scm/git/docs
 
 howto/%.html: ASCIIDOC_EXTRA += -a git-relative-html-prefix=../
 $(patsubst %.txt,%.html,$(wildcard howto/*.txt)): %.html : %.txt
 	$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
-	sed -e '1,/^$$/d' $< | $(ASCIIDOC) $(ASCIIDOC_EXTRA) -b xhtml11 - >$@+ && \
+	sed -e '1,/^$$/d' $< | \
+	$(TXT_TO_HTML) - >$@+ && \
 	mv $@+ $@
 
 install-webdoc : html
diff --git a/Documentation/RelNotes/2.1.0.txt b/Documentation/RelNotes/2.1.0.txt
new file mode 100644
index 0000000..ae47537
--- /dev/null
+++ b/Documentation/RelNotes/2.1.0.txt
@@ -0,0 +1,391 @@
+Git v2.1 Release Notes
+======================
+
+Backward compatibility notes
+----------------------------
+
+ * The default value we give to the environment variable LESS has been
+   changed from "FRSX" to "FRX", losing "S" (chop long lines instead
+   of wrapping).  Existing users who prefer not to see line-wrapped
+   output may want to set
+
+     $ git config core.pager "less -S"
+
+   to restore the traditional behaviour.  It is expected that people
+   find output from most subcommands easier to read with the new
+   default, except for "blame" which tends to produce really long
+   lines.  To override the new default only for "git blame", you can
+   do this:
+
+     $ git config pager.blame "less -S"
+
+ * A few disused directories in contrib/ have been retired.
+
+
+Updates since v2.0
+------------------
+
+UI, Workflows & Features
+
+ * Since the very beginning of Git, we gave the LESS environment a
+   default value "FRSX" when we spawn "less" as the pager.  "S" (chop
+   long lines instead of wrapping) has been removed from this default
+   set of options, because it is more or less a personal taste thing,
+   as opposed to the others that have good justifications (i.e. "R" is
+   very much justified because many kinds of output we produce are
+   colored and "FX" is justified because output we produce is often
+   shorter than a page).
+
+ * The logic and data used to compute the display width needed for
+   UTF-8 strings have been updated to match Unicode 7.0 better.
+
+ * HTTP-based transports learned to better propagate the error messages from
+   the webserver to the client coming over the HTTP transport.
+
+ * The completion script for bash (in contrib/) has been updated to
+   better handle aliases that define a complex sequence of commands.
+
+ * The "core.preloadindex" configuration variable is enabled by default,
+   allowing modern platforms to take advantage of their
+   multiple cores.
+
+ * "git clone" applies the "if cloning from a local disk, physically
+   copy the repository using hardlinks, unless otherwise told not to with
+   --no-local" optimization when the url.*.insteadOf mechanism rewrites a
+   remote-repository "git clone $URL" into a
+   clone from a local disk.
+
+ * "git commit --date=<date>" option learned more
+   timestamp formats, including "--date=now".
+
+ * The `core.commentChar` configuration variable is used to specify a
+   custom comment character (other than the default "#") for
+   the commit message editor.  This can be set to `auto` to attempt to
+   choose a different character that does not conflict with any that
+   already starts a line in the message being edited, for cases like
+   "git commit --amend".
+
+ * "git format-patch" learned --signature-file=<file> to add the contents
+   of a file as a signature to the mail message it produces.
+
+ * "git grep" learned the grep.fullname configuration variable to force
+   "--full-name" to be the default.  This may cause regressions for
+   scripted users who do not expect this new behaviour.
+
+ * "git imap-send" learned to ask the credential helper for auth
+   material.
+
+ * "git log" and friends now understand the value "auto" for the
+   "log.decorate" configuration variable to enable the "--decorate"
+   option automatically when the output is sent to tty.
+
+ * "git merge" without an argument, even when there is an upstream
+   defined for the current branch, refused to run until
+   merge.defaultToUpstream is set to true.  Flip the default of that
+   configuration variable to true.
+
+ * "git mergetool" learned to drive the vimdiff3 backend.
+
+ * mergetool.prompt used to default to 'true', always asking "do you
+   really want to run the tool on this path?".  The default has been
+   changed to 'false'.  However, the prompt will still appear if
+   mergetool used its autodetection system to guess which tool to use.
+   Users who explicitly specify or configure a tool will no longer see
+   the prompt by default.
+
+   Strictly speaking, this is a backward incompatible change and
+   users need to explicitly set the variable to 'true' if they want
+   to be prompted to confirm running the tool on each path.
+
+ * "git replace" learned the "--edit" subcommand to create a
+   replacement by editing an existing object.
+
+ * "git replace" learned a "--graft" option to rewrite the parents of a
+   commit.
+
+ * "git send-email" learned "--to-cover" and "--cc-cover" options, to
+   tell it to copy To: and Cc: headers found in the first input file
+   when emitting later input files.
+
+ * "git svn" learned to cope with malformed timestamps with only one
+   digit in the hour part, e.g. 2014-01-07T5:01:02.048176Z, emitted
+   by some broken subversion server implementations.
+
+ * "git tag" when editing the tag message shows the name of the tag
+   being edited as a comment in the editor.
+
+ * "git tag" learned to pay attention to "tag.sort" configuration, to
+   be used as the default sort order when no --sort=<value> option
+   is given.
+
+ * A new "git verify-commit" command, to check GPG signatures in signed
+   commits, in a way similar to "git verify-tag" is used to check
+   signed tags, was added.
+
+
+Performance, Internal Implementation, etc.
+
+ * Build procedure for 'subtree' (in contrib/) has been cleaned up.
+
+ * Support for the profile-feedback build, which has
+   bit-rotted for quite a while, has been updated.
+
+ * An experimental format to use two files (the base file and
+   incremental changes relative to it) to represent the index has been
+   introduced; this may reduce I/O cost of rewriting a large index
+   when only small part of the working tree changes.
+
+ * Effort to shrink the size of patches Windows folks maintain on top
+   by upstreaming them continues.  More tests that are not applicable
+   to the Windows environment are identified and either skipped or
+   made more portable.
+
+ * Eradication of "test $condition -a $condition" from our scripts
+   continues.
+
+ * The `core.deltabasecachelimit` used to default to 16 MiB , but this
+   proved to be too small, and has been bumped to 96 MiB.
+
+ * "git blame" has been optimized greatly by reorganising the data
+   structure that is used to keep track of the work to be done.
+
+ * "git diff" that compares 3-or-more trees (e.g. parents and the
+   result of a merge) has been optimized.
+
+ * The API to update/delete references are being converted to handle
+   updates to multiple references in a transactional way.  As an
+   example, "update-ref --stdin [-z]" has been updated to use this
+   API.
+
+ * skip_prefix() and strip_suffix() API functions are used a lot more
+   widely throughout the codebase now.
+
+ * Parts of the test scripts can be skipped by using a range notation,
+   e.g. "sh t1234-test.sh --run='1-4 6 8-'" to omit test piece 5 and 7
+   and run everything else.
+
+
+Also contains various documentation updates and code clean-ups.
+
+
+Fixes since v2.0
+----------------
+
+Unless otherwise noted, all the fixes since v2.0 in the maintenance
+track are contained in this release (see the maintenance releases'
+notes for details).
+
+ * We used to unconditionally disable the pager in the pager process
+   we spawn to feed out output, but that prevented people who want to
+   run "less" within "less" from doing so.
+   (merge c0459ca je/pager-do-not-recurse later to maint).
+
+ * Tools that read diagnostic output in our standard error stream do
+   not want to see terminal control sequence (e.g. erase-to-eol).
+   Detect them by checking if the standard error stream is connected
+   to a tty.
+   (merge 38de156 mn/sideband-no-ansi later to maint).
+
+ * Mishandling of patterns in .gitignore that have trailing SPs quoted
+   with backslashes (e.g. ones that end with "\ ") has been
+   corrected.
+   (merge 97c1364be6b pb/trim-trailing-spaces later to maint).
+
+ * Reworded the error message given upon a failure to open an existing
+   loose object file due to e.g. permission issues; it was reported as
+   the object being corrupt, but that is not quite true.
+   (merge d6c8a05 jk/report-fail-to-read-objects-better later to maint).
+
+ * "git log -2master" is a common typo that shows two commits starting
+   from whichever random branch that is not 'master' that happens to
+   be checked out currently.
+   (merge e3fa568 jc/revision-dash-count-parsing later to maint).
+
+ * Code to avoid adding the same alternate object store twice was
+   subtly broken for a long time, but nobody seems to have noticed.
+   (merge 80b4785 rs/fix-alt-odb-path-comparison later to maint).
+   (merge 539e750 ek/alt-odb-entry-fix later to maint).
+
+ * The "%<(10,trunc)%s" pretty format specifier in the log family of
+   commands is used to truncate the string to a given length (e.g. 10
+   in the example) with padding to column-align the output, but did
+   not take into account that number of bytes and number of display
+   columns are different.
+   (merge 7d50987 as/pretty-truncate later to maint).
+
+ * "%G" (nothing after G) is an invalid pretty format specifier, but
+   the parser did not notice it as garbage.
+   (merge 958b2eb jk/pretty-G-format-fixes later to maint).
+
+ * A handful of code paths had to read the commit object more than
+   once when showing header fields that are usually not parsed.  The
+   internal data structure to keep track of the contents of the commit
+   object has been updated to reduce the need for this double-reading,
+   and to allow the caller find the length of the object.
+   (merge 218aa3a jk/commit-buffer-length later to maint).
+
+ * The "mailmap.file" configuration option did not support tilde
+   expansion (i.e. ~user/path and ~/path).
+   (merge 9352fd5 ow/config-mailmap-pathname later to maint).
+
+ * The completion scripts (in contrib/) did not know about quite a few
+   options that are common between "git merge" and "git pull", and a
+   couple of options unique to "git merge".
+   (merge 8fee872 jk/complete-merge-pull later to maint).
+
+ * The unix-domain socket used by the sample credential cache daemon
+   tried to unlink an existing stale one at a wrong path, if the path
+   to the socket was given as an overlong path that does not fit in
+   the sun_path member of the sockaddr_un structure.
+   (merge 2869b3e rs/fix-unlink-unix-socket later to maint).
+
+ * An ancient rewrite passed a wrong pointer to a curl library
+   function in a rarely used code path.
+   (merge 479eaa8 ah/fix-http-push later to maint).
+
+ * "--ignore-space-change" option of "git apply" ignored the spaces
+   at the beginning of lines too aggressively, which is inconsistent
+   with the option of the same name that "diff" and "git diff" have.
+   (merge 14d3bb4 jc/apply-ignore-whitespace later to maint).
+
+ * "git blame" miscounted the number of columns needed to show localized
+   timestamps, resulting in a jaggy left-side-edge for the source code
+   lines in its output.
+   (merge dd75553 jx/blame-align-relative-time later to maint).
+
+ * "git blame" assigned the blame to the copy in the working-tree if
+   the repository is set to core.autocrlf=input and the file used CRLF
+   line endings.
+   (merge 4d4813a bc/blame-crlf-test later to maint).
+
+ * "git clone -b brefs/tags/bar" would have mistakenly thought we were
+   following a single tag, even though it was a name of the branch,
+   because it incorrectly used strstr().
+   (merge 60a5f5f jc/fix-clone-single-starting-at-a-tag later to maint).
+
+ * "git commit --allow-empty-message -C $commit" did not work when the
+   commit did not have any log message.
+   (merge 076cbd6 jk/commit-C-pick-empty later to maint).
+
+ * "git diff --find-copies-harder" sometimes pretended as if the mode
+   bits have changed for paths that are marked with the assume-unchanged
+   bit.
+   (merge 5304810 jk/diff-files-assume-unchanged later to maint).
+
+ * "filter-branch" left an empty single-parent commit that results when
+   all parents of a merge commit get mapped to the same commit, even
+   under "--prune-empty".
+   (merge 79bc4ef cb/filter-branch-prune-empty-degenerate-merges later to maint).
+
+ * "git format-patch" did not enforce the rule that the "--follow"
+   option from the log/diff family of commands must be used with
+   exactly one pathspec.
+   (merge dd63f16 jk/diff-follow-must-take-one-pathspec later to maint).
+
+ * "git gc --auto" was recently changed to run in the background to
+   give control back early to the end-user sitting in front of the
+   terminal, but it forgot that housekeeping involving reflogs should
+   be done without other processes competing for accesses to the refs.
+   (merge 62aad18 nd/daemonize-gc later to maint).
+
+ * "git grep -O" to show the lines that hit in the pager did not work
+   well with case insensitive search.  We now spawn "less" with its
+   "-I" option when it is used as the pager (which is the default).
+   (merge f7febbe sk/spawn-less-case-insensitively-from-grep-O-i later to maint).
+
+ * We used to disable threaded "git index-pack" on platforms without
+   thread-safe pread(); use a different workaround for such
+   platforms to allow threaded "git index-pack".
+   (merge 3953949 nd/index-pack-one-fd-per-thread later to maint).
+
+ * The error reporting from "git index-pack" has been improved to
+   distinguish missing objects from type errors.
+   (merge 77583e7 jk/index-pack-report-missing later to maint).
+
+ * "log --show-signature" incorrectly decided the color to paint a
+   mergetag that was and was not correctly validated.
+   (merge 42c55ce mg/fix-log-mergetag-color later to maint).
+
+ * "log --show-signature" did not pay attention to the "--graph" option.
+   (merge cf3983d zk/log-graph-showsig later to maint).
+
+ * "git mailinfo" used to read beyond the ends of header strings while
+   parsing an incoming e-mail message to extract the patch.
+   (merge b1a013d rs/mailinfo-header-cmp later to maint).
+
+ * On a case insensitive filesystem, merge-recursive incorrectly
+   deleted the file that is to be renamed to a name that is the same
+   except for case differences.
+   (merge baa37bf dt/merge-recursive-case-insensitive later to maint).
+
+ * Merging changes into a file that ends in an incomplete line made the
+   last line into a complete one, even when the other branch did not
+   change anything around the end of file.
+   (merge ba31180 mk/merge-incomplete-files later to maint).
+
+ * "git pack-objects" unnecessarily copied the previous contents when
+   extending the hashtable, even though it will populate the table
+   from scratch anyway.
+   (merge fb79947 rs/pack-objects-no-unnecessary-realloc later to maint).
+
+ * Recent updates to "git repack" started to duplicate objects that
+   are in packfiles marked with the .keep flag into the new packfile by
+   mistake.
+   (merge d078d85 jk/repack-pack-keep-objects later to maint).
+
+ * "git rerere forget" did not work well when merge.conflictstyle
+   was set to a non-default value.
+   (merge de3d8bb fc/rerere-conflict-style later to maint).
+
+ * "git remote rm" and "git remote prune" can involve removing many
+   refs at once, which is not a very efficient thing to do when very
+   many refs exist in the packed-refs file.
+   (merge e6bea66 jl/remote-rm-prune later to maint).
+
+ * "git log --exclude=<glob> --all | git shortlog" worked as expected,
+   but "git shortlog --exclude=<glob> --all", which is supposed to be
+   identical to the above pipeline, was not accepted at the command
+   line argument parser level.
+   (merge eb07774 jc/shortlog-ref-exclude later to maint).
+
+ * The autostash mode of "git rebase -i" did not restore the dirty
+   working tree state if the user aborted the interactive rebase by
+   emptying the insn sheet.
+   (merge ddb5432 rr/rebase-autostash-fix later to maint).
+
+ * "git rebase --fork-point" did not filter out patch-identical
+   commits correctly.
+
+ * During "git rebase --merge", a conflicted patch could not be
+   skipped with "--skip" if the next one also conflicted.
+   (merge 95104c7 bc/fix-rebase-merge-skip later to maint).
+
+ * "git show -s" (i.e. show log message only) used to incorrectly emit
+   an extra blank line after a merge commit.
+   (merge ad2f725 mk/show-s-no-extra-blank-line-for-merges later to maint).
+
+ * "git status", even though it is a read-only operation, tries to
+   update the index with refreshed lstat(2) info to optimize future
+   accesses to the working tree opportunistically, but this could
+   race with a "read-write" operation that modifies the index while it
+   is running.  Detect such a race and avoid overwriting the index.
+   (merge 426ddee ym/fix-opportunistic-index-update-race later to maint).
+
+ * "git status" (and "git commit") behaved as if changes in a modified
+   submodule are not there if submodule.*.ignore configuration is set,
+   which was misleading.  The configuration is only to unclutter diff
+   output during the course of development, and not to hide
+   changes in the "status" output to cause the users forget to commit
+   them.
+   (merge c215d3d jl/status-added-submodule-is-never-ignored later to maint).
+
+ * Documentation for "git submodule sync" forgot to say that the subcommand
+   can take the "--recursive" option.
+   (merge 9393ae7 mc/doc-submodule-sync-recurse later to maint).
+
+ * "git update-index --cacheinfo" in 2.0 release crashed on a
+   malformed command line.
+   (merge c8e1ee4 jc/rev-parse-argh-dashed-multi-words later to maint).
+
+ * The mode to run tests with HTTP server tests disabled was broken.
+   (merge afa53fe na/no-http-test-in-the-middle later to maint).
diff --git a/Documentation/RelNotes/2.1.1.txt b/Documentation/RelNotes/2.1.1.txt
new file mode 100644
index 0000000..830fc3c
--- /dev/null
+++ b/Documentation/RelNotes/2.1.1.txt
@@ -0,0 +1,44 @@
+Git v2.1.1 Release Notes
+========================
+
+ * Git 2.0 had a regression where "git fetch" into a shallowly
+   cloned repository from a repository with bitmap object index
+   enabled did not work correctly.  This has been corrected.
+
+ * Git 2.0 had a regression which broke (rarely used) "git diff-tree
+   -t".  This has been corrected.
+
+ * "git log --pretty/format=" with an empty format string did not
+   mean the more obvious "No output whatsoever" but "Use default
+   format", which was counterintuitive.  Now it means "nothing shown
+   for the log message part".
+
+ * "git -c section.var command" and "git -c section.var= command"
+   should pass the configuration differently (the former should be a
+   boolean true, the latter should be an empty string), but they
+   didn't work that way.  Now it does.
+
+ * Applying a patch not generated by Git in a subdirectory used to
+   check the whitespace breakage using the attributes for incorrect
+   paths. Also whitespace checks were performed even for paths
+   excluded via "git apply --exclude=<path>" mechanism.
+
+ * "git bundle create" with date-range specification were meant to
+   exclude tags outside the range, but it did not work correctly.
+
+ * "git add x" where x that used to be a directory has become a
+   symbolic link to a directory misbehaved.
+
+ * The prompt script checked $GIT_DIR/ref/stash file to see if there
+   is a stash, which was a no-no.
+
+ * "git checkout -m" did not switch to another branch while carrying
+   the local changes forward when a path was deleted from the index.
+
+ * With sufficiently long refnames, fast-import could have overflown
+   an on-stack buffer.
+
+ * After "pack-refs --prune" packed refs at the top-level, it failed
+   to prune them.
+
+ * "git gc --auto" triggered from "git fetch --quiet" was not quiet.
diff --git a/Documentation/RelNotes/2.1.2.txt b/Documentation/RelNotes/2.1.2.txt
new file mode 100644
index 0000000..abc3b89
--- /dev/null
+++ b/Documentation/RelNotes/2.1.2.txt
@@ -0,0 +1,20 @@
+Git v2.1.2 Release Notes
+========================
+
+ * "git push" over HTTP transport had an artificial limit on number of
+   refs that can be pushed imposed by the command line length.
+
+ * When receiving an invalid pack stream that records the same object
+   twice, multiple threads got confused due to a race.
+
+ * An attempt to remove the entire tree in the "git fast-import" input
+   stream caused it to misbehave.
+
+ * Reachability check (used in "git prune" and friends) did not add a
+   detached HEAD as a starting point to traverse objects still in use.
+
+ * "git config --add section.var val" used to lose existing
+   section.var whose value was an empty string.
+
+ * "git fsck" failed to report that it found corrupt objects via its
+   exit status in some cases.
diff --git a/Documentation/RelNotes/2.1.3.txt b/Documentation/RelNotes/2.1.3.txt
new file mode 100644
index 0000000..acc9ebb
--- /dev/null
+++ b/Documentation/RelNotes/2.1.3.txt
@@ -0,0 +1,26 @@
+Git v2.1.3 Release Notes
+========================
+
+ * Some MUAs mangled a line in a message that begins with "From " to
+   ">From " when writing to a mailbox file and feeding such an input to
+   "git am" used to lose such a line.
+
+ * "git daemon" (with NO_IPV6 build configuration) used to incorrectly
+   use the hostname even when gethostbyname() reported that the given
+   hostname is not found.
+
+ * Newer versions of 'meld' breaks the auto-detection we use to see if
+   they are new enough to support the `--output` option.
+
+ * "git pack-objects" forgot to disable the codepath to generate
+   object recheability bitmap when it needs to split the resulting
+   pack.
+
+ * "gitweb" used deprecated CGI::startfrom, which was removed from
+   CGI.pm as of 4.04; use CGI::start_from instead.
+
+ * "git log" documentation had an example section marked up not
+   quite correctly, which passed AsciiDoc but failed with
+   AsciiDoctor.
+
+Also contains some documentation updates.
diff --git a/Documentation/RelNotes/2.2.0.txt b/Documentation/RelNotes/2.2.0.txt
new file mode 100644
index 0000000..a5c3381
--- /dev/null
+++ b/Documentation/RelNotes/2.2.0.txt
@@ -0,0 +1,297 @@
+Git v2.2 Release Notes
+======================
+
+Updates since v2.1
+------------------
+
+Ports
+
+ * Building on older MacOS X systems automatically sets
+   the necessary NO_APPLE_COMMON_CRYPTO build-time option.
+
+ * The support to build with NO_PTHREADS has been resurrected.
+
+ * Compilation options has been updated a bit to support z/OS port
+   better.
+
+
+UI, Workflows & Features
+
+ * "git archive" learned to filter what gets archived with pathspec.
+
+ * "git config --edit --global" starts from a skeletal per-user
+   configuration file contents, instead of a total blank, when the
+   user does not already have any.  This immediately reduces the
+   need for a later "Have you forgotten setting core.user?" and we
+   can add more to the template as we gain more experience.
+
+ * "git stash list -p" used to be almost always a no-op because each
+   stash entry is represented as a merge commit.  It learned to show
+   the difference between the base commit version and the working tree
+   version, which is in line with what "git show" gives.
+
+ * Sometimes users want to report a bug they experience on their
+   repository, but they are not at liberty to share the contents of
+   the repository.  "fast-export" was taught an "--anonymize" option
+   to replace blob contents, names of people and paths and log
+   messages with bland and simple strings to help them.
+
+ * "git difftool" learned an option to stop feeding paths to the
+   diff backend when it exits with a non-zero status.
+
+ * "git grep" allows to paint (or not paint) partial matches on
+   context lines when showing "grep -C<num>" output in color.
+
+ * "log --date=iso" uses a slight variant of ISO 8601 format that is
+   made more human readable.  A new "--date=iso-strict" option gives
+   datetime output that is more strictly conformant.
+
+ * The logic "git prune" uses is more resilient against various corner
+   cases.
+
+ * A broken reimplementation of Git could write an invalid index that
+   records both stage #0 and higher stage entries for the same path.
+   We now notice and reject such an index, as there is no sensible
+   fallback (we do not know if the broken tool wanted to resolve and
+   forgot to remove higher stage entries, or if it wanted to unresolve
+   and forgot to remove the stage#0 entry).
+
+ * The temporary files "git mergetool" uses are named to avoid too
+   many dots in them (e.g. a temporary file for "hello.c" used to be
+   named e.g. "hello.BASE.4321.c" but now uses underscore instead,
+   e.g. "hello_BASE_4321.c").
+
+ * The temporary files "git mergetools" uses can be placed in a newly
+   created temporary directory, instead of the current directory, by
+   setting the mergetool.writeToTemp configuration variable.
+
+ * "git mergetool" understands "--tool bc" now, as version 4 of
+   BeyondCompare can be driven the same way as its version 3 and it
+   feels awkward to say "--tool bc3".
+
+ * The "pre-receive" and "post-receive" hooks are no longer required
+   to consume their input fully (not following this requirement used
+   to result in intermittent errors in "git push").
+
+ * The pretty-format specifier "%d", which expanded to " (tagname)"
+   for a tagged commit, gained a cousin "%D" that just gives the
+   "tagname" without frills.
+
+ * "git push" learned "--signed" push, that allows a push (i.e.
+   request to update the refs on the other side to point at a new
+   history, together with the transmission of necessary objects) to be
+   signed, so that it can be verified and audited, using the GPG
+   signature of the person who pushed, that the tips of branches at a
+   public repository really point the commits the pusher wanted to,
+   without having to "trust" the server.
+
+ * "git interpret-trailers" is a new filter to programmatically edit
+    the tail end of the commit log messages.
+
+ * "git help everyday" shows the "Everyday Git in 20 commands or so"
+   document, whose contents have been updated to more modern Git
+   practice.
+
+ * On the "git svn" front, work to reduce memory consumption and
+   to improve handling of mergeinfo progresses.
+
+
+Performance, Internal Implementation, etc.
+
+ * The API to manipulate the "refs" has been restructured to make it
+   more transactional, with the eventual goal to allow all-or-none
+   atomic updates and migrating the storage to something other than
+   the traditional filesystem based one (e.g. databases).
+
+ * The lockfile API and its users have been cleaned up.
+
+ * We no longer attempt to keep track of individual dependencies to
+   the header files in the build procedure, relying on automated
+   dependency generation support from modern compilers.
+
+ * In tests, we have been using NOT_{MINGW,CYGWIN} test prerequisites
+   long before negated prerequisites e.g. !MINGW were invented.
+   The former has been converted to the latter to avoid confusion.
+
+ * Looking up remotes configuration in a repository with very many
+   remotes defined has been optimized.
+
+ * There are cases where you lock and open to write a file, close it
+   to show the updated contents to external processes, and then have
+   to update the file again while still holding the lock, but the
+   lockfile API lacked support for such an access pattern.
+
+ * The API to allocate the structure to keep track of commit
+   decoration has been updated to make it less cumbersome to use.
+
+ * An in-core caching layer to let us avoid reading the same
+   configuration files number of times has been added.  A few commands
+   have been converted to use this subsystem.
+
+ * Various code paths have been cleaned up and simplified by using
+   "strbuf", "starts_with()", and "skip_prefix()" APIs more.
+
+ * A few codepaths that died when large blobs that would not fit in
+   core are involved in their operation have been taught to punt
+   instead, by e.g. marking too large a blob as not to be diffed.
+
+ * A few more code paths in "commit" and "checkout" have been taught
+   to repopulate the cache-tree in the index, to help speed up later
+   "write-tree" (used in "commit") and "diff-index --cached" (used in
+   "status").
+
+ * A common programming mistake to assign the same short option name
+   to two separate options is detected by parse_options() API to help
+   developers.
+
+ * The code path to write out the packed-refs file has been optimized,
+   which especially matters in a repository with a large number of
+   refs.
+
+ * The check to see if a ref $F can be created by making sure no
+   existing ref has $F/ as its prefix has been optimized, which
+   especially matters in a repository with a large number of existing
+   refs.
+
+ * "git fsck" was taught to check contents of tag objects a bit more.
+
+ * "git hash-object" was taught a "--literally" option to help
+   debugging.
+
+ * When running a required clean filter, we do not have to mmap the
+   original before feeding the filter.  Instead, stream the file
+   contents directly to the filter and process its output.
+
+ * The scripts in the test suite can be run with "-x" option to show
+   a shell-trace of each command run in them.
+
+ * The "run-command" API learned to manage the argv and environment
+   array for child process, alleviating the need for the callers to
+   allocate and deallocate them.
+
+ * Some people use AsciiDoctor, instead of AsciiDoc, to format our
+   documentation set; the documentation has been adjusted, as
+   AsciiDoctor is pickier than AsciiDoc in its input mark-up.
+
+
+Also contains various documentation updates and code clean-ups.
+
+
+Fixes since v2.1
+----------------
+
+Unless otherwise noted, all the fixes since v2.1 in the maintenance
+track are contained in this release (see the maintenance releases'
+notes for details).
+
+ * "git log --pretty/format=" with an empty format string did not
+   mean the more obvious "No output whatsoever" but "Use default
+   format", which was counterintuitive.
+
+ * "git -c section.var command" and "git -c section.var= command"
+   should pass the configuration differently (the former should be a
+   boolean true, the latter should be an empty string).
+
+ * Applying a patch not generated by Git in a subdirectory used to
+   check the whitespace breakage using the attributes for incorrect
+   paths. Also whitespace checks were performed even for paths
+   excluded via "git apply --exclude=<path>" mechanism.
+
+ * "git bundle create" with date-range specification were meant to
+   exclude tags outside the range, but it didn't.
+
+ * "git add x" where x that used to be a directory has become a
+   symbolic link to a directory misbehaved.
+
+ * The prompt script checked $GIT_DIR/ref/stash file to see if there
+   is a stash, which was a no-no.
+
+ * Pack-protocol documentation had a minor typo.
+
+ * "git checkout -m" did not switch to another branch while carrying
+   the local changes forward when a path was deleted from the index.
+
+ * "git daemon" (with NO_IPV6 build configuration) used to incorrectly
+   use the hostname even when gethostbyname() reported that the given
+   hostname is not found.
+   (merge 107efbe rs/daemon-fixes later to maint).
+
+ * With sufficiently long refnames, "git fast-import" could have
+   overflown an on-stack buffer.
+
+ * After "pack-refs --prune" packed refs at the top-level, it failed
+   to prune them.
+
+ * Progress output from "git gc --auto" was visible in "git fetch -q".
+
+ * We used to pass -1000 to poll(2), expecting it to also mean "no
+   timeout", which should be spelled as -1.
+
+ * "git rebase" documentation was unclear that it is required to
+   specify on what <upstream> the rebase is to be done when telling it
+   to first check out <branch>.
+   (merge 95c6826 so/rebase-doc later to maint).
+
+ * "git push" over HTTP transport had an artificial limit on number of
+   refs that can be pushed imposed by the command line length.
+   (merge 26be19b jk/send-pack-many-refspecs later to maint).
+
+ * When receiving an invalid pack stream that records the same object
+   twice, multiple threads got confused due to a race.
+   (merge ab791dd jk/index-pack-threading-races later to maint).
+
+ * An attempt to remove the entire tree in the "git fast-import" input
+   stream caused it to misbehave.
+   (merge 2668d69 mb/fast-import-delete-root later to maint).
+
+ * Reachability check (used in "git prune" and friends) did not add a
+   detached HEAD as a starting point to traverse objects still in use.
+   (merge c40fdd0 mk/reachable-protect-detached-head later to maint).
+
+ * "git config --add section.var val" used to lose existing
+   section.var whose value was an empty string.
+   (merge c1063be ta/config-add-to-empty-or-true-fix later to maint).
+
+ * "git fsck" failed to report that it found corrupt objects via its
+   exit status in some cases.
+   (merge 30d1038 jk/fsck-exit-code-fix later to maint).
+
+ * Use of "--verbose" option used to break "git branch --merged".
+   (merge 12994dd jk/maint-branch-verbose-merged later to maint).
+
+ * Some MUAs mangled a line in a message that begins with "From " to
+   ">From " when writing to a mailbox file and feeding such an input
+   to "git am" used to lose such a line.
+   (merge 85de86a jk/mbox-from-line later to maint).
+
+ * "rev-parse --verify --quiet $name" is meant to quietly exit with a
+   non-zero status when $name is not a valid object name, but still
+   gave error messages in some cases.
+
+ * A handful of C source files have been updated to include
+   "git-compat-util.h" as the first thing, to conform better to our
+   coding guidelines.
+   (merge 1c4b660 da/include-compat-util-first-in-c later to maint).
+
+ * t7004 test, which tried to run Git with small stack space, has been
+   updated to give a bit larger stack to avoid false breakage on some
+   platforms.
+   (merge b9a1907 sk/tag-contains-wo-recursion later to maint).
+
+ * A few documentation pages had example sections marked up not quite
+   correctly, which passed AsciiDoc but failed with AsciiDoctor.
+   (merge c30c43c bc/asciidoc-pretty-formats-fix later to maint).
+   (merge f8a48af bc/asciidoc later to maint).
+
+ * "gitweb" used deprecated CGI::startfrom, which was removed from
+   CGI.pm as of 4.04; use CGI::start_from instead.
+   (merge 4750f4b rm/gitweb-start-form later to maint).
+
+ * Newer versions of 'meld' breaks the auto-detection we use to see if
+   they are new enough to support the `--output` option.
+   (merge b12d045 da/mergetool-meld later to maint).
+
+ * "git pack-objects" forgot to disable the codepath to generate
+   object reachability bitmap when it needs to split the resulting
+   pack.
+   (merge 2113471 jk/pack-objects-no-bitmap-when-splitting later to maint).
diff --git a/Documentation/config.txt b/Documentation/config.txt
index c08286e..9220725 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -204,13 +204,26 @@
 --
 
 core.fileMode::
-	If false, the executable bit differences between the index and
-	the working tree are ignored; useful on broken filesystems like FAT.
-	See linkgit:git-update-index[1].
+	Tells Git if the executable bit of files in the working tree
+	is to be honored.
 +
-The default is true, except linkgit:git-clone[1] or linkgit:git-init[1]
-will probe and set core.fileMode false if appropriate when the
-repository is created.
+Some filesystems lose the executable bit when a file that is
+marked as executable is checked out, or checks out an
+non-executable file with executable bit on.
+linkgit:git-clone[1] or linkgit:git-init[1] probe the filesystem
+to see if it handles the executable bit correctly
+and this variable is automatically set as necessary.
++
+A repository, however, may be on a filesystem that handles
+the filemode correctly, and this variable is set to 'true'
+when created, but later may be made accessible from another
+environment that loses the filemode (e.g. exporting ext4 via
+CIFS mount, visiting a Cygwin created repository with
+Git for Windows or Eclipse).
+In such a case it may be necessary to set this variable to 'false'.
+See linkgit:git-update-index[1].
++
+The default is true (when core.filemode is not specified in the config file).
 
 core.ignorecase::
 	If true, this option enables various workarounds to enable
@@ -381,7 +394,7 @@
 core.worktree::
 	Set the path to the root of the working tree.
 	This can be overridden by the GIT_WORK_TREE environment
-	variable and the '--work-tree' command line option.
+	variable and the '--work-tree' command-line option.
 	The value can be an absolute path or relative to the path to
 	the .git directory, which is either specified by --git-dir
 	or GIT_DIR, or automatically discovered.
@@ -489,7 +502,7 @@
 	to avoid unpacking and decompressing frequently used base
 	objects multiple times.
 +
-Default is 16 MiB on all platforms.  This should be reasonable
+Default is 96 MiB on all platforms.  This should be reasonable
 for all users/operating systems, except on the largest projects.
 You probably do not need to adjust this value.
 +
@@ -499,7 +512,8 @@
 	Files larger than this size are stored deflated, without
 	attempting delta compression.  Storing large files without
 	delta compression avoids excessive memory usage, at the
-	slight expense of increased disk usage.
+	slight expense of increased disk usage. Additionally files
+	larger than this size are always treated as binary.
 +
 Default is 512 MiB on all platforms.  This should be reasonable
 for most projects as source code and other text files can still
@@ -523,7 +537,7 @@
 	environment variable. If not set, fall back to the value of the
 	'SSH_ASKPASS' environment variable or, failing that, a simple password
 	prompt. The external program shall be given a suitable prompt as
-	command line argument and write the password on its STDOUT.
+	command-line argument and write the password on its STDOUT.
 
 core.attributesfile::
 	In addition to '.gitattributes' (per-directory) and
@@ -544,6 +558,9 @@
 	messages consider a line that begins with this character
 	commented, and removes them after the editor returns
 	(default '#').
++
+If set to "auto", `git-commit` would select a character that is not
+the beginning character of any line in existing commit messages.
 
 sequence.editor::
 	Text editor used by `git rebase -i` for editing the rebase instruction file.
@@ -558,14 +575,19 @@
 	configuration, then `$PAGER`, and then the default chosen at
 	compile time (usually 'less').
 +
-When the `LESS` environment variable is unset, Git sets it to `FRSX`
+When the `LESS` environment variable is unset, Git sets it to `FRX`
 (if `LESS` environment variable is set, Git does not change it at
 all).  If you want to selectively override Git's default setting
-for `LESS`, you can set `core.pager` to e.g. `less -+S`.  This will
+for `LESS`, you can set `core.pager` to e.g. `less -S`.  This will
 be passed to the shell by Git, which will translate the final
-command to `LESS=FRSX less -+S`. The environment tells the command
-to set the `S` option to chop long lines but the command line
-resets it to the default to fold long lines.
+command to `LESS=FRX less -S`. The environment does not set the
+`S` option but the command line does, instructing less to truncate
+long lines. Similarly, setting `core.pager` to `less -+F` will
+deactivate the `F` option specified by the environment from the
+command-line, deactivating the "quit if one screen" behavior of
+`less`.  One can specifically activate some flags for particular
+commands: for example, setting `pager.blame` to `less -S` enables
+line truncation only for `git blame`.
 +
 Likewise, when the `LV` environment variable is unset, Git sets it
 to `-c`.  You can override this setting by exporting `LV` with
@@ -613,9 +635,9 @@
 +
 This can speed up operations like 'git diff' and 'git status' especially
 on filesystems like NFS that have weak caching semantics and thus
-relatively high IO latencies.  With this set to 'true', Git will do the
+relatively high IO latencies.  When enabled, Git will do the
 index comparison to the filesystem data in parallel, allowing
-overlapping IO's.
+overlapping IO's.  Defaults to true.
 
 core.createObject::
 	You can set this to 'link', in which case a hardlink followed by
@@ -661,7 +683,7 @@
 	confusion and troubles with script usage, aliases that
 	hide existing Git commands are ignored. Arguments are split by
 	spaces, the usual shell quoting and escaping is supported.
-	quote pair and a backslash can be used to quote them.
+	A quote pair or a backslash can be used to quote them.
 +
 If the alias expansion is prefixed with an exclamation point,
 it will be treated as a shell command.  For example, defining
@@ -863,7 +885,11 @@
 `linenumber`;;
 	line number prefix (when using `-n`)
 `match`;;
-	matching text
+	matching text (same as setting `matchContext` and `matchSelected`)
+`matchContext`;;
+	matching text in context lines
+`matchSelected`;;
+	matching text in selected lines
 `selected`;;
 	non-matching text in selected lines
 `separator`;;
@@ -1114,6 +1140,10 @@
 	Set this variable to the empty string ("") to suppress
 	signature generation.
 
+format.signaturefile::
+	Works just like format.signature except the contents of the
+	file specified by this variable will be used as the signature.
+
 format.suffix::
 	The default for format-patch is to output files with the suffix
 	`.patch`. Use this variable to change that suffix (make sure to
@@ -1180,7 +1210,7 @@
 	default	value is 50.  Setting this to 0 disables it.
 
 gc.autodetach::
-	Make `git gc --auto` return immediately andrun in background
+	Make `git gc --auto` return immediately and run in background
 	if the system supports it. Default is true.
 
 gc.packrefs::
@@ -1324,10 +1354,10 @@
 gpg.program::
 	Use this custom program instead of "gpg" found on $PATH when
 	making or verifying a PGP signature. The program must support the
-	same command line interface as GPG, namely, to verify a detached
+	same command-line interface as GPG, namely, to verify a detached
 	signature, "gpg --verify $file - <$signature" is run, and the
 	program is expected to signal a good signature by exiting with
-	code 0, and to generate an ascii-armored detached signature, the
+	code 0, and to generate an ASCII-armored detached signature, the
 	standard input of "gpg -bsau $key" is fed with the contents to be
 	signed, and the program is expected to send the result to its
 	standard output.
@@ -1562,7 +1592,7 @@
 	Can be overridden by the 'GIT_HTTP_USER_AGENT' environment variable.
 
 http.<url>.*::
-	Any of the http.* options above can be applied selectively to some urls.
+	Any of the http.* options above can be applied selectively to some URLs.
 	For a config key to match a URL, each element of the config key is
 	compared to that of the URL, in the following order:
 +
@@ -1601,8 +1631,8 @@
 +
 All URLs are normalized before attempting any matching (the password part,
 if embedded in the URL, is always ignored for matching purposes) so that
-equivalent urls that are simply spelled differently will match properly.
-Environment variable settings always override any matches.  The urls that are
+equivalent URLs that are simply spelled differently will match properly.
+Environment variable settings always override any matches.  The URLs that are
 matched against are those given directly to Git commands.  This means any URLs
 visited as a result of a redirection do not participate in matching.
 
@@ -1742,6 +1772,15 @@
 	if the file has been updated, otherwise the user is prompted to
 	indicate the success of the merge.
 
+mergetool.meld.hasOutput::
+	Older versions of `meld` do not support the `--output` option.
+	Git will attempt to detect whether `meld` supports `--output`
+	by inspecting the output of `meld --help`.  Configuring
+	`mergetool.meld.hasOutput` will make Git skip these checks and
+	use the configured value instead.  Setting `mergetool.meld.hasOutput`
+	to `true` tells Git to unconditionally use the `--output` option,
+	and `false` avoids using `--output`.
+
 mergetool.keepBackup::
 	After performing a merge, the original file with conflict markers
 	can be saved as a file with a `.orig` extension.  If this variable
@@ -1755,6 +1794,12 @@
 	preserved, otherwise they will be removed after the tool has
 	exited. Defaults to `false`.
 
+mergetool.writeToTemp::
+	Git writes temporary 'BASE', 'LOCAL', and 'REMOTE' versions of
+	conflicting files in the worktree by default.  Git will attempt
+	to use a temporary directory for these files when set `true`.
+	Defaults to `false`.
+
 mergetool.prompt::
 	Prompt before each invocation of the merge resolution program.
 
@@ -1815,10 +1860,11 @@
 	maximum depth is given on the command line. Defaults to 50.
 
 pack.windowMemory::
-	The window memory size limit used by linkgit:git-pack-objects[1]
-	when no limit is given on the command line.  The value can be
-	suffixed with "k", "m", or "g".  Defaults to 0, meaning no
-	limit.
+	The maximum size of memory that is consumed by each thread
+	in linkgit:git-pack-objects[1] for pack window memory when
+	no limit is given on the command line.  The value can be
+	suffixed with "k", "m", or "g".  When left unconfigured (or
+	set explicitly to 0), there will be no limit.
 
 pack.compression::
 	An integer -1..9, indicating the compression level for objects
@@ -1893,12 +1939,7 @@
 	you are debugging pack bitmaps.
 
 pack.writebitmaps::
-	When true, git will write a bitmap index when packing all
-	objects to disk (e.g., when `git repack -a` is run).  This
-	index can speed up the "counting objects" phase of subsequent
-	packs created for clones and fetches, at the cost of some disk
-	space and extra time spent on the initial repack.  Defaults to
-	false.
+	This is a deprecated synonym for `repack.writeBitmaps`.
 
 pack.writeBitmapHashCache::
 	When true, git will include a "hash cache" section in the bitmap
@@ -2036,6 +2077,25 @@
 	receiving data from git-push and updating refs.  You can stop
 	it by setting this variable to false.
 
+receive.certnonceseed::
+	By setting this variable to a string, `git receive-pack`
+	will accept a `git push --signed` and verifies it by using
+	a "nonce" protected by HMAC using this string as a secret
+	key.
+
+receive.certnonceslop::
+	When a `git push --signed` sent a push certificate with a
+	"nonce" that was issued by a receive-pack serving the same
+	repository within this many seconds, export the "nonce"
+	found in the certificate to `GIT_PUSH_CERT_NONCE` to the
+	hooks (instead of what the receive-pack asked the sending
+	side to include).  This may allow writing checks in
+	`pre-receive` and `post-receive` a bit easier.  Instead of
+	checking `GIT_PUSH_CERT_NONCE_SLOP` environment variable
+	that records by how many seconds the nonce is stale to
+	decide if they want to accept the certificate, they only
+	can check `GIT_PUSH_CERT_NONCE_STATUS` is `OK`.
+
 receive.fsckObjects::
 	If it is set to true, git-receive-pack will check all received
 	objects. It will abort in the case of a malformed object or a
@@ -2175,7 +2235,15 @@
 	`--pack-kept-objects` was passed. See linkgit:git-repack[1] for
 	details. Defaults to `false` normally, but `true` if a bitmap
 	index is being written (either via `--write-bitmap-index` or
-	`pack.writeBitmaps`).
+	`repack.writeBitmaps`).
+
+repack.writeBitmaps::
+	When true, git will write a bitmap index when packing all
+	objects to disk (e.g., when `git repack -a` is run).  This
+	index can speed up the "counting objects" phase of subsequent
+	packs created for clones and fetches, at the cost of some disk
+	space and extra time spent on the initial repack.  Defaults to
+	false.
 
 rerere.autoupdate::
 	When set to true, `git-rerere` updates the index with the
@@ -2271,7 +2339,7 @@
 	files which are not currently tracked by Git. Directories which
 	contain only untracked files, are shown with the directory name
 	only. Showing untracked files means that Git needs to lstat() all
-	all the files in the whole repository, which might be slow on some
+	the files in the whole repository, which might be slow on some
 	systems. So, this variable controls how the commands displays
 	the untracked files. Possible values are:
 +
@@ -2297,7 +2365,7 @@
 	exception to that rule is that status and commit will show staged
 	submodule changes. To
 	also view the summary for ignored submodules you can either use
-	the --ignore-submodules=dirty command line option or the 'git
+	the --ignore-submodules=dirty command-line option or the 'git
 	submodule summary' command, which shows a similar output but does
 	not honor these settings.
 
@@ -2319,7 +2387,7 @@
 submodule.<name>.fetchRecurseSubmodules::
 	This option can be used to control recursive fetching of this
 	submodule. It can be overridden by using the --[no-]recurse-submodules
-	command line option to "git fetch" and "git pull".
+	command-line option to "git fetch" and "git pull".
 	This setting will override that from in the linkgit:gitmodules[5]
 	file.
 
@@ -2339,6 +2407,11 @@
 	"--ignore-submodules" option. The 'git submodule' commands are not
 	affected by this setting.
 
+tag.sort::
+	This variable controls the sort ordering of tags when displayed by
+	linkgit:git-tag[1]. Without the "--sort=<value>" option provided, the
+	value of this variable will be used as the default.
+
 tar.umask::
 	This variable can be used to restrict the permission bits of
 	tar archive entries.  The default is 0002, which turns off the
diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt
index f07b451..b001779 100644
--- a/Documentation/diff-config.txt
+++ b/Documentation/diff-config.txt
@@ -76,7 +76,7 @@
 	this setting when reporting uncommitted changes. Setting it to
 	'all' disables the submodule summary normally shown by 'git commit'
 	and 'git status' when 'status.submodulesummary' is set unless it is
-	overridden by using the --ignore-submodules command line option.
+	overridden by using the --ignore-submodules command-line option.
 	The 'git submodule' commands are not affected by this setting.
 
 diff.mnemonicprefix::
diff --git a/Documentation/everyday.txt b/Documentation/everyday.txt
deleted file mode 100644
index b2548ef..0000000
--- a/Documentation/everyday.txt
+++ /dev/null
@@ -1,413 +0,0 @@
-Everyday Git With 20 Commands Or So
-===================================
-
-<<Individual Developer (Standalone)>> commands are essential for
-anybody who makes a commit, even for somebody who works alone.
-
-If you work with other people, you will need commands listed in
-the <<Individual Developer (Participant)>> section as well.
-
-People who play the <<Integrator>> role need to learn some more
-commands in addition to the above.
-
-<<Repository Administration>> commands are for system
-administrators who are responsible for the care and feeding
-of Git repositories.
-
-
-Individual Developer (Standalone)[[Individual Developer (Standalone)]]
-----------------------------------------------------------------------
-
-A standalone individual developer does not exchange patches with
-other people, and works alone in a single repository, using the
-following commands.
-
-  * linkgit:git-init[1] to create a new repository.
-
-  * linkgit:git-show-branch[1] to see where you are.
-
-  * linkgit:git-log[1] to see what happened.
-
-  * linkgit:git-checkout[1] and linkgit:git-branch[1] to switch
-    branches.
-
-  * linkgit:git-add[1] to manage the index file.
-
-  * linkgit:git-diff[1] and linkgit:git-status[1] to see what
-    you are in the middle of doing.
-
-  * linkgit:git-commit[1] to advance the current branch.
-
-  * linkgit:git-reset[1] and linkgit:git-checkout[1] (with
-    pathname parameters) to undo changes.
-
-  * linkgit:git-merge[1] to merge between local branches.
-
-  * linkgit:git-rebase[1] to maintain topic branches.
-
-  * linkgit:git-tag[1] to mark known point.
-
-Examples
-~~~~~~~~
-
-Use a tarball as a starting point for a new repository.::
-+
-------------
-$ tar zxf frotz.tar.gz
-$ cd frotz
-$ git init
-$ git add . <1>
-$ git commit -m "import of frotz source tree."
-$ git tag v2.43 <2>
-------------
-+
-<1> add everything under the current directory.
-<2> make a lightweight, unannotated tag.
-
-Create a topic branch and develop.::
-+
-------------
-$ git checkout -b alsa-audio <1>
-$ edit/compile/test
-$ git checkout -- curses/ux_audio_oss.c <2>
-$ git add curses/ux_audio_alsa.c <3>
-$ edit/compile/test
-$ git diff HEAD <4>
-$ git commit -a -s <5>
-$ edit/compile/test
-$ git reset --soft HEAD^ <6>
-$ edit/compile/test
-$ git diff ORIG_HEAD <7>
-$ git commit -a -c ORIG_HEAD <8>
-$ git checkout master <9>
-$ git merge alsa-audio <10>
-$ git log --since='3 days ago' <11>
-$ git log v2.43.. curses/ <12>
-------------
-+
-<1> create a new topic branch.
-<2> revert your botched changes in `curses/ux_audio_oss.c`.
-<3> you need to tell Git if you added a new file; removal and
-modification will be caught if you do `git commit -a` later.
-<4> to see what changes you are committing.
-<5> commit everything as you have tested, with your sign-off.
-<6> take the last commit back, keeping what is in the working tree.
-<7> look at the changes since the premature commit we took back.
-<8> redo the commit undone in the previous step, using the message
-you originally wrote.
-<9> switch to the master branch.
-<10> merge a topic branch into your master branch.
-<11> review commit logs; other forms to limit output can be
-combined and include `--max-count=10` (show 10 commits),
-`--until=2005-12-10`, etc.
-<12> view only the changes that touch what's in `curses/`
-directory, since `v2.43` tag.
-
-
-Individual Developer (Participant)[[Individual Developer (Participant)]]
-------------------------------------------------------------------------
-
-A developer working as a participant in a group project needs to
-learn how to communicate with others, and uses these commands in
-addition to the ones needed by a standalone developer.
-
-  * linkgit:git-clone[1] from the upstream to prime your local
-    repository.
-
-  * linkgit:git-pull[1] and linkgit:git-fetch[1] from "origin"
-    to keep up-to-date with the upstream.
-
-  * linkgit:git-push[1] to shared repository, if you adopt CVS
-    style shared repository workflow.
-
-  * linkgit:git-format-patch[1] to prepare e-mail submission, if
-    you adopt Linux kernel-style public forum workflow.
-
-Examples
-~~~~~~~~
-
-Clone the upstream and work on it.  Feed changes to upstream.::
-+
-------------
-$ git clone git://git.kernel.org/pub/scm/.../torvalds/linux-2.6 my2.6
-$ cd my2.6
-$ edit/compile/test; git commit -a -s <1>
-$ git format-patch origin <2>
-$ git pull <3>
-$ git log -p ORIG_HEAD.. arch/i386 include/asm-i386 <4>
-$ git pull git://git.kernel.org/pub/.../jgarzik/libata-dev.git ALL <5>
-$ git reset --hard ORIG_HEAD <6>
-$ git gc <7>
-$ git fetch --tags <8>
-------------
-+
-<1> repeat as needed.
-<2> extract patches from your branch for e-mail submission.
-<3> `git pull` fetches from `origin` by default and merges into the
-current branch.
-<4> immediately after pulling, look at the changes done upstream
-since last time we checked, only in the
-area we are interested in.
-<5> fetch from a specific branch from a specific repository and merge.
-<6> revert the pull.
-<7> garbage collect leftover objects from reverted pull.
-<8> from time to time, obtain official tags from the `origin`
-and store them under `.git/refs/tags/`.
-
-
-Push into another repository.::
-+
-------------
-satellite$ git clone mothership:frotz frotz <1>
-satellite$ cd frotz
-satellite$ git config --get-regexp '^(remote|branch)\.' <2>
-remote.origin.url mothership:frotz
-remote.origin.fetch refs/heads/*:refs/remotes/origin/*
-branch.master.remote origin
-branch.master.merge refs/heads/master
-satellite$ git config remote.origin.push \
-           master:refs/remotes/satellite/master <3>
-satellite$ edit/compile/test/commit
-satellite$ git push origin <4>
-
-mothership$ cd frotz
-mothership$ git checkout master
-mothership$ git merge satellite/master <5>
-------------
-+
-<1> mothership machine has a frotz repository under your home
-directory; clone from it to start a repository on the satellite
-machine.
-<2> clone sets these configuration variables by default.
-It arranges `git pull` to fetch and store the branches of mothership
-machine to local `remotes/origin/*` remote-tracking branches.
-<3> arrange `git push` to push local `master` branch to
-`remotes/satellite/master` branch of the mothership machine.
-<4> push will stash our work away on `remotes/satellite/master`
-remote-tracking branch on the mothership machine.  You could use this
-as a back-up method.
-<5> on mothership machine, merge the work done on the satellite
-machine into the master branch.
-
-Branch off of a specific tag.::
-+
-------------
-$ git checkout -b private2.6.14 v2.6.14 <1>
-$ edit/compile/test; git commit -a
-$ git checkout master
-$ git format-patch -k -m --stdout v2.6.14..private2.6.14 |
-  git am -3 -k <2>
-------------
-+
-<1> create a private branch based on a well known (but somewhat behind)
-tag.
-<2> forward port all changes in `private2.6.14` branch to `master` branch
-without a formal "merging".
-
-
-Integrator[[Integrator]]
-------------------------
-
-A fairly central person acting as the integrator in a group
-project receives changes made by others, reviews and integrates
-them and publishes the result for others to use, using these
-commands in addition to the ones needed by participants.
-
-  * linkgit:git-am[1] to apply patches e-mailed in from your
-    contributors.
-
-  * linkgit:git-pull[1] to merge from your trusted lieutenants.
-
-  * linkgit:git-format-patch[1] to prepare and send suggested
-    alternative to contributors.
-
-  * linkgit:git-revert[1] to undo botched commits.
-
-  * linkgit:git-push[1] to publish the bleeding edge.
-
-
-Examples
-~~~~~~~~
-
-My typical Git day.::
-+
-------------
-$ git status <1>
-$ git show-branch <2>
-$ mailx <3>
-& s 2 3 4 5 ./+to-apply
-& s 7 8 ./+hold-linus
-& q
-$ git checkout -b topic/one master
-$ git am -3 -i -s -u ./+to-apply <4>
-$ compile/test
-$ git checkout -b hold/linus && git am -3 -i -s -u ./+hold-linus <5>
-$ git checkout topic/one && git rebase master <6>
-$ git checkout pu && git reset --hard next <7>
-$ git merge topic/one topic/two && git merge hold/linus <8>
-$ git checkout maint
-$ git cherry-pick master~4 <9>
-$ compile/test
-$ git tag -s -m "GIT 0.99.9x" v0.99.9x <10>
-$ git fetch ko && git show-branch master maint 'tags/ko-*' <11>
-$ git push ko <12>
-$ git push ko v0.99.9x <13>
-------------
-+
-<1> see what I was in the middle of doing, if any.
-<2> see what topic branches I have and think about how ready
-they are.
-<3> read mails, save ones that are applicable, and save others
-that are not quite ready.
-<4> apply them, interactively, with my sign-offs.
-<5> create topic branch as needed and apply, again with my
-sign-offs.
-<6> rebase internal topic branch that has not been merged to the
-master or exposed as a part of a stable branch.
-<7> restart `pu` every time from the next.
-<8> and bundle topic branches still cooking.
-<9> backport a critical fix.
-<10> create a signed tag.
-<11> make sure I did not accidentally rewind master beyond what I
-already pushed out.  `ko` shorthand points at the repository I have
-at kernel.org, and looks like this:
-+
-------------
-$ cat .git/remotes/ko
-URL: kernel.org:/pub/scm/git/git.git
-Pull: master:refs/tags/ko-master
-Pull: next:refs/tags/ko-next
-Pull: maint:refs/tags/ko-maint
-Push: master
-Push: next
-Push: +pu
-Push: maint
-------------
-+
-In the output from `git show-branch`, `master` should have
-everything `ko-master` has, and `next` should have
-everything `ko-next` has.
-
-<12> push out the bleeding edge.
-<13> push the tag out, too.
-
-
-Repository Administration[[Repository Administration]]
-------------------------------------------------------
-
-A repository administrator uses the following tools to set up
-and maintain access to the repository by developers.
-
-  * linkgit:git-daemon[1] to allow anonymous download from
-    repository.
-
-  * linkgit:git-shell[1] can be used as a 'restricted login shell'
-    for shared central repository users.
-
-link:howto/update-hook-example.html[update hook howto] has a good
-example of managing a shared central repository.
-
-
-Examples
-~~~~~~~~
-We assume the following in /etc/services::
-+
-------------
-$ grep 9418 /etc/services
-git		9418/tcp		# Git Version Control System
-------------
-
-Run git-daemon to serve /pub/scm from inetd.::
-+
-------------
-$ grep git /etc/inetd.conf
-git	stream	tcp	nowait	nobody \
-  /usr/bin/git-daemon git-daemon --inetd --export-all /pub/scm
-------------
-+
-The actual configuration line should be on one line.
-
-Run git-daemon to serve /pub/scm from xinetd.::
-+
-------------
-$ cat /etc/xinetd.d/git-daemon
-# default: off
-# description: The Git server offers access to Git repositories
-service git
-{
-        disable = no
-        type            = UNLISTED
-        port            = 9418
-        socket_type     = stream
-        wait            = no
-        user            = nobody
-        server          = /usr/bin/git-daemon
-        server_args     = --inetd --export-all --base-path=/pub/scm
-        log_on_failure  += USERID
-}
-------------
-+
-Check your xinetd(8) documentation and setup, this is from a Fedora system.
-Others might be different.
-
-Give push/pull only access to developers.::
-+
-------------
-$ grep git /etc/passwd <1>
-alice:x:1000:1000::/home/alice:/usr/bin/git-shell
-bob:x:1001:1001::/home/bob:/usr/bin/git-shell
-cindy:x:1002:1002::/home/cindy:/usr/bin/git-shell
-david:x:1003:1003::/home/david:/usr/bin/git-shell
-$ grep git /etc/shells <2>
-/usr/bin/git-shell
-------------
-+
-<1> log-in shell is set to /usr/bin/git-shell, which does not
-allow anything but `git push` and `git pull`.  The users should
-get an ssh access to the machine.
-<2> in many distributions /etc/shells needs to list what is used
-as the login shell.
-
-CVS-style shared repository.::
-+
-------------
-$ grep git /etc/group <1>
-git:x:9418:alice,bob,cindy,david
-$ cd /home/devo.git
-$ ls -l <2>
-  lrwxrwxrwx   1 david git    17 Dec  4 22:40 HEAD -> refs/heads/master
-  drwxrwsr-x   2 david git  4096 Dec  4 22:40 branches
-  -rw-rw-r--   1 david git    84 Dec  4 22:40 config
-  -rw-rw-r--   1 david git    58 Dec  4 22:40 description
-  drwxrwsr-x   2 david git  4096 Dec  4 22:40 hooks
-  -rw-rw-r--   1 david git 37504 Dec  4 22:40 index
-  drwxrwsr-x   2 david git  4096 Dec  4 22:40 info
-  drwxrwsr-x   4 david git  4096 Dec  4 22:40 objects
-  drwxrwsr-x   4 david git  4096 Nov  7 14:58 refs
-  drwxrwsr-x   2 david git  4096 Dec  4 22:40 remotes
-$ ls -l hooks/update <3>
-  -r-xr-xr-x   1 david git  3536 Dec  4 22:40 update
-$ cat info/allowed-users <4>
-refs/heads/master	alice\|cindy
-refs/heads/doc-update	bob
-refs/tags/v[0-9]*	david
-------------
-+
-<1> place the developers into the same git group.
-<2> and make the shared repository writable by the group.
-<3> use update-hook example by Carl from Documentation/howto/
-for branch policy control.
-<4> alice and cindy can push into master, only bob can push into doc-update.
-david is the release manager and is the only person who can
-create and push version tags.
-
-HTTP server to support dumb protocol transfer.::
-+
-------------
-dev$ git update-server-info <1>
-dev$ ftp user@isp.example.com <2>
-ftp> cp -r .git /home/user/myproject.git
-------------
-+
-<1> make sure your info/refs and objects/info/packs are up-to-date
-<2> upload to public HTTP server hosted by your ISP.
diff --git a/Documentation/everyday.txto b/Documentation/everyday.txto
new file mode 100644
index 0000000..c5047d8
--- /dev/null
+++ b/Documentation/everyday.txto
@@ -0,0 +1,9 @@
+Everyday Git With 20 Commands Or So
+===================================
+
+This document has been moved to linkgit:giteveryday[1].
+
+Please let the owners of the referring site know so that they can update the
+link you clicked to get here.
+
+Thanks.
diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
index 92c68c3..b09a783 100644
--- a/Documentation/fetch-options.txt
+++ b/Documentation/fetch-options.txt
@@ -72,6 +72,14 @@
 	setting. See linkgit:git-config[1].
 
 ifndef::git-pull[]
+--refmap=<refspec>::
+	When fetching refs listed on the command line, use the
+	specified refspec (can be given more than once) to map the
+	refs to remote-tracking branches, instead of the values of
+	`remote.*.fetch` configuration variables for the remote
+	repository.  See section on "Configured Remote-tracking
+	Branches" for details.
+
 -t::
 --tags::
 	Fetch all tags from the remote (i.e., fetch remote tags
diff --git a/Documentation/git-bisect-lk2009.txt b/Documentation/git-bisect-lk2009.txt
index afeb86c..0f0c6ff 100644
--- a/Documentation/git-bisect-lk2009.txt
+++ b/Documentation/git-bisect-lk2009.txt
@@ -119,7 +119,7 @@
 of people. And as there are often many people who depend (sometimes
 critically) on such software, regressions are a really big problem.
 
-One such software is the linux kernel. And if we look at the linux
+One such software is the Linux kernel. And if we look at the Linux
 kernel, we can see that a lot of time and effort is spent to fight
 regressions. The release cycle start with a 2 weeks long merge
 window. Then the first release candidate (rc) version is tagged. And
@@ -132,7 +132,7 @@
 time. But this is not the end of the fight yet, as of course it
 continues after the release.
 
-And then this is what Ingo Molnar (a well known linux kernel
+And then this is what Ingo Molnar (a well known Linux kernel
 developer) says about his use of git bisect:
 
 _____________
diff --git a/Documentation/git-bisect.txt b/Documentation/git-bisect.txt
index f986c5c..4cb52a7 100644
--- a/Documentation/git-bisect.txt
+++ b/Documentation/git-bisect.txt
@@ -117,7 +117,7 @@
 `view` may also be used as a synonym for `visualize`.
 
 If the 'DISPLAY' environment variable is not set, 'git log' is used
-instead.  You can also give command line options such as `-p` and
+instead.  You can also give command-line options such as `-p` and
 `--stat`.
 
 ------------
diff --git a/Documentation/git-clean.txt b/Documentation/git-clean.txt
index 8997922..94b6d19 100644
--- a/Documentation/git-clean.txt
+++ b/Documentation/git-clean.txt
@@ -98,7 +98,7 @@
 filter by pattern::
 
    This shows the files and directories to be deleted and issues an
-   "Input ignore patterns>>" prompt. You can input space-seperated
+   "Input ignore patterns>>" prompt. You can input space-separated
    patterns to exclude files and directories from deletion.
    E.g. "*.c *.h" will excludes files end with ".c" and ".h" from
    deletion. When you are satisfied with the filtered result, press
diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt
index e9917b8..9dfa1a5 100644
--- a/Documentation/git-config.txt
+++ b/Documentation/git-config.txt
@@ -256,7 +256,7 @@
 configuration file. Note that this also affects options like '--replace-all'
 and '--unset'. *'git config' will only ever change one file at a time*.
 
-You can override these rules either by command line options or by environment
+You can override these rules either by command-line options or by environment
 variables. The '--global' and the '--system' options will limit the file used
 to the global or system-wide file respectively. The GIT_CONFIG environment
 variable has a similar effect, but you can specify any filename you want.
diff --git a/Documentation/git-credential-cache--daemon.txt b/Documentation/git-credential-cache--daemon.txt
index d15db42..7051c6b 100644
--- a/Documentation/git-credential-cache--daemon.txt
+++ b/Documentation/git-credential-cache--daemon.txt
@@ -8,7 +8,7 @@
 SYNOPSIS
 --------
 [verse]
-git credential-cache--daemon <socket>
+git credential-cache--daemon [--debug] <socket>
 
 DESCRIPTION
 -----------
@@ -21,6 +21,10 @@
 credentials. Each credential is held for a timeout specified by the
 client; once no credentials are held, the daemon exits.
 
+If the `--debug` option is specified, the daemon does not close its
+stderr stream, and may output extra diagnostics to it even after it has
+begun listening for clients.
+
 GIT
 ---
 Part of the linkgit:git[1] suite
diff --git a/Documentation/git-credential-store.txt b/Documentation/git-credential-store.txt
index 8481cae..bc97071 100644
--- a/Documentation/git-credential-store.txt
+++ b/Documentation/git-credential-store.txt
@@ -29,7 +29,7 @@
 OPTIONS
 -------
 
---store=<path>::
+--file=<path>::
 
 	Use `<path>` to store credentials. The file will have its
 	filesystem permissions set to prevent other users on the system
diff --git a/Documentation/git-cvsimport.txt b/Documentation/git-cvsimport.txt
index 260f39f..00a0679 100644
--- a/Documentation/git-cvsimport.txt
+++ b/Documentation/git-cvsimport.txt
@@ -219,7 +219,7 @@
 * Multiple tags on the same revision are not imported.
 
 If you suspect that any of these issues may apply to the repository you
-want to imort, consider using cvs2git:
+want to import, consider using cvs2git:
 
 * cvs2git (part of cvs2svn), `http://subversion.apache.org/`
 
diff --git a/Documentation/git-cvsserver.txt b/Documentation/git-cvsserver.txt
index 472f5cb..4961f1a 100644
--- a/Documentation/git-cvsserver.txt
+++ b/Documentation/git-cvsserver.txt
@@ -110,7 +110,7 @@
 	authdb = /etc/cvsserver/passwd
 
 ------
-The format of these files is username followed by the crypted password,
+The format of these files is username followed by the encrypted password,
 for example:
 
 ------
diff --git a/Documentation/git-daemon.txt b/Documentation/git-daemon.txt
index 223f731..a69b361 100644
--- a/Documentation/git-daemon.txt
+++ b/Documentation/git-daemon.txt
@@ -169,7 +169,7 @@
 --forbid-override=<service>::
 	Allow/forbid overriding the site-wide default with per
 	repository configuration.  By default, all the services
-	are overridable.
+	may be overridden.
 
 --[no-]informative-errors::
 	When informative errors are turned on, git-daemon will report
@@ -184,7 +184,7 @@
 	Every time a client connects, first run an external command
 	specified by the <path> with service name (e.g. "upload-pack"),
 	path to the repository, hostname (%H), canonical hostname
-	(%CH), ip address (%IP), and tcp port (%P) as its command line
+	(%CH), IP address (%IP), and TCP port (%P) as its command-line
 	arguments. The external command can decide to decline the
 	service by exiting with a non-zero status (or to allow it by
 	exiting with a zero status).  It can also look at the $REMOTE_ADDR
@@ -204,7 +204,7 @@
 --------
 
 These services can be globally enabled/disabled using the
-command line options of this command.  If a finer-grained
+command-line options of this command.  If finer-grained
 control is desired (e.g. to allow 'git archive' to be run
 against only in a few selected repositories the daemon serves),
 the per-repository configuration file can be used to enable or
diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.txt
index 11887e6..333cf6f 100644
--- a/Documentation/git-difftool.txt
+++ b/Documentation/git-difftool.txt
@@ -91,6 +91,15 @@
 	the default diff tool will be read from the configured
 	`diff.guitool` variable instead of `diff.tool`.
 
+--[no-]trust-exit-code::
+	'git-difftool' invokes a diff tool individually on each file.
+	Errors reported by the diff tool are ignored by default.
+	Use `--trust-exit-code` to make 'git-difftool' exit when an
+	invoked diff tool returns a non-zero exit code.
++
+'git-difftool' will forward the exit code of the invoked tool when
+'--trust-exit-code' is used.
+
 See linkgit:git-diff[1] for the full list of supported options.
 
 CONFIG VARIABLES
@@ -116,6 +125,11 @@
 difftool.prompt::
 	Prompt before each invocation of the diff tool.
 
+difftool.trustExitCode::
+	Exit difftool if the invoked diff tool returns a non-zero exit status.
++
+See the `--trust-exit-code` option above for more details.
+
 SEE ALSO
 --------
 linkgit:git-diff[1]::
diff --git a/Documentation/git-fast-export.txt b/Documentation/git-fast-export.txt
index 85f1f30..dbe9a46 100644
--- a/Documentation/git-fast-export.txt
+++ b/Documentation/git-fast-export.txt
@@ -105,6 +105,15 @@
 	in the commit (as opposed to just listing the files which are
 	different from the commit's first parent).
 
+--anonymize::
+	Anonymize the contents of the repository while still retaining
+	the shape of the history and stored tree.  See the section on
+	`ANONYMIZING` below.
+
+--refspec::
+	Apply the specified refspec to each ref exported. Multiple of them can
+	be specified.
+
 [<git-rev-list-args>...]::
 	A list of arguments, acceptable to 'git rev-parse' and
 	'git rev-list', that specifies the specific objects and references
@@ -137,6 +146,62 @@
 'refs/heads/master'.
 
 
+ANONYMIZING
+-----------
+
+If the `--anonymize` option is given, git will attempt to remove all
+identifying information from the repository while still retaining enough
+of the original tree and history patterns to reproduce some bugs. The
+goal is that a git bug which is found on a private repository will
+persist in the anonymized repository, and the latter can be shared with
+git developers to help solve the bug.
+
+With this option, git will replace all refnames, paths, blob contents,
+commit and tag messages, names, and email addresses in the output with
+anonymized data.  Two instances of the same string will be replaced
+equivalently (e.g., two commits with the same author will have the same
+anonymized author in the output, but bear no resemblance to the original
+author string). The relationship between commits, branches, and tags is
+retained, as well as the commit timestamps (but the commit messages and
+refnames bear no resemblance to the originals). The relative makeup of
+the tree is retained (e.g., if you have a root tree with 10 files and 3
+trees, so will the output), but their names and the contents of the
+files will be replaced.
+
+If you think you have found a git bug, you can start by exporting an
+anonymized stream of the whole repository:
+
+---------------------------------------------------
+$ git fast-export --anonymize --all >anon-stream
+---------------------------------------------------
+
+Then confirm that the bug persists in a repository created from that
+stream (many bugs will not, as they really do depend on the exact
+repository contents):
+
+---------------------------------------------------
+$ git init anon-repo
+$ cd anon-repo
+$ git fast-import <../anon-stream
+$ ... test your bug ...
+---------------------------------------------------
+
+If the anonymized repository shows the bug, it may be worth sharing
+`anon-stream` along with a regular bug report. Note that the anonymized
+stream compresses very well, so gzipping it is encouraged. If you want
+to examine the stream to see that it does not contain any private data,
+you can peruse it directly before sending. You may also want to try:
+
+---------------------------------------------------
+$ perl -pe 's/\d+/X/g' <anon-stream | sort -u | less
+---------------------------------------------------
+
+which shows all of the unique lines (with numbers converted to "X", to
+collapse "User 0", "User 1", etc into "User X"). This produces a much
+smaller output, and it is usually easy to quickly confirm that there is
+no private data in the stream.
+
+
 Limitations
 -----------
 
diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt
index fd22a9a..377eeaa 100644
--- a/Documentation/git-fast-import.txt
+++ b/Documentation/git-fast-import.txt
@@ -231,7 +231,7 @@
 ~~~~~~~~~~~~
 The following date formats are supported.  A frontend should select
 the format it will use for this import by passing the format name
-in the \--date-format=<fmt> command line option.
+in the \--date-format=<fmt> command-line option.
 
 `raw`::
 	This is the Git native format and is `<time> SP <offutc>`.
@@ -348,7 +348,7 @@
 `done`::
 	Marks the end of the stream. This command is optional
 	unless the `done` feature was requested using the
-	`--done` command line option or `feature done` command.
+	`--done` command-line option or `feature done` command.
 
 `cat-blob`::
 	Causes fast-import to print a blob in 'cat-file --batch'
@@ -437,7 +437,7 @@
 of bytes, except `LT`, `GT` and `LF`.  `<name>` is typically UTF-8 encoded.
 
 The time of the change is specified by `<when>` using the date format
-that was selected by the \--date-format=<fmt> command line option.
+that was selected by the \--date-format=<fmt> command-line option.
 See ``Date Formats'' above for the set of supported formats, and
 their syntax.
 
@@ -483,6 +483,9 @@
 * Any valid Git SHA-1 expression that resolves to a commit.  See
   ``SPECIFYING REVISIONS'' in linkgit:gitrevisions[7] for details.
 
+* The special null SHA-1 (40 zeros) specifies that the branch is to be
+  removed.
+
 The special case of restarting an incremental import from the
 current branch value should be written as:
 ----
@@ -1085,7 +1088,7 @@
 feature commands), to give an option command after any non-option
 command is an error.
 
-The following commandline options change import semantics and may therefore
+The following command-line options change import semantics and may therefore
 not be passed as option:
 
 * date-format
@@ -1099,7 +1102,7 @@
 If the `done` feature is not in use, treated as if EOF was read.
 This can be used to tell fast-import to finish early.
 
-If the `--done` command line option or `feature done` command is
+If the `--done` command-line option or `feature done` command is
 in use, the `done` command is mandatory and marks the end of the
 stream.
 
diff --git a/Documentation/git-fetch.txt b/Documentation/git-fetch.txt
index 5809aa4..8deb614 100644
--- a/Documentation/git-fetch.txt
+++ b/Documentation/git-fetch.txt
@@ -17,22 +17,20 @@
 
 DESCRIPTION
 -----------
-Fetches named heads or tags from one or more other repositories,
-along with the objects necessary to complete them.
+Fetch branches and/or tags (collectively, "refs") from one or more
+other repositories, along with the objects necessary to complete their
+histories.  Remote-tracking branches are updated (see the description
+of <refspec> below for ways to control this behavior).
 
-The ref names and their object names of fetched refs are stored
-in `.git/FETCH_HEAD`.  This information is left for a later merge
-operation done by 'git merge'.
-
-By default, tags are auto-followed.  This means that when fetching
-from a remote, any tags on the remote that point to objects that exist
-in the local repository are fetched.  The effect is to fetch tags that
+By default, any tag that points into the histories being fetched is
+also fetched; the effect is to fetch tags that
 point at branches that you are interested in.  This default behavior
-can be changed by using the --tags or --no-tags options, by
-configuring remote.<name>.tagopt, or by using a refspec that fetches
-tags explicitly.
+can be changed by using the --tags or --no-tags options or by
+configuring remote.<name>.tagopt.  By using a refspec that fetches tags
+explicitly, you can fetch tags that do not point into branches you
+are interested in as well.
 
-'git fetch' can fetch from either a single named repository,
+'git fetch' can fetch from either a single named repository or URL,
 or from several repositories at once if <group> is given and
 there is a remotes.<group> entry in the configuration file.
 (See linkgit:git-config[1]).
@@ -40,6 +38,10 @@
 When no remote is specified, by default the `origin` remote will be used,
 unless there's an upstream branch configured for the current branch.
 
+The names of refs that are fetched, together with the object names
+they point at, are written to `.git/FETCH_HEAD`.  This information
+may be used by scripts or other git commands, such as linkgit:git-pull[1].
+
 OPTIONS
 -------
 include::fetch-options.txt[]
@@ -49,6 +51,55 @@
 include::urls-remotes.txt[]
 
 
+CONFIGURED REMOTE-TRACKING BRANCHES[[CRTB]]
+-------------------------------------------
+
+You often interact with the same remote repository by
+regularly and repeatedly fetching from it.  In order to keep track
+of the progress of such a remote repository, `git fetch` allows you
+to configure `remote.<repository>.fetch` configuration variables.
+
+Typically such a variable may look like this:
+
+------------------------------------------------
+[remote "origin"]
+	fetch = +refs/heads/*:refs/remotes/origin/*
+------------------------------------------------
+
+This configuration is used in two ways:
+
+* When `git fetch` is run without specifying what branches
+  and/or tags to fetch on the command line, e.g. `git fetch origin`
+  or `git fetch`, `remote.<repository>.fetch` values are used as
+  the refspecs---they specify which refs to fetch and which local refs
+  to update.  The example above will fetch
+  all branches that exist in the `origin` (i.e. any ref that matches
+  the left-hand side of the value, `refs/heads/*`) and update the
+  corresponding remote-tracking branches in the `refs/remotes/origin/*`
+  hierarchy.
+
+* When `git fetch` is run with explicit branches and/or tags
+  to fetch on the command line, e.g. `git fetch origin master`, the
+  <refspec>s given on the command line determine what are to be
+  fetched (e.g. `master` in the example,
+  which is a short-hand for `master:`, which in turn means
+  "fetch the 'master' branch but I do not explicitly say what
+  remote-tracking branch to update with it from the command line"),
+  and the example command will
+  fetch _only_ the 'master' branch.  The `remote.<repository>.fetch`
+  values determine which
+  remote-tracking branch, if any, is updated.  When used in this
+  way, the `remote.<repository>.fetch` values do not have any
+  effect in deciding _what_ gets fetched (i.e. the values are not
+  used as refspecs when the command-line lists refspecs); they are
+  only used to decide _where_ the refs that are fetched are stored
+  by acting as a mapping.
+
+The latter use of the `remote.<repository>.fetch` values can be
+overridden by giving the `--refmap=<refspec>` parameter(s) on the
+command line.
+
+
 EXAMPLES
 --------
 
@@ -76,6 +127,19 @@
 The `pu` branch will be updated even if it is does not fast-forward,
 because it is prefixed with a plus sign; `tmp` will not be.
 
+* Peek at a remote's branch, without configuring the remote in your local
+repository:
++
+------------------------------------------------
+$ git fetch git://git.kernel.org/pub/scm/git/git.git maint
+$ git log FETCH_HEAD
+------------------------------------------------
++
+The first command fetches the `maint` branch from the repository at
+`git://git.kernel.org/pub/scm/git/git.git` and the second command uses
+`FETCH_HEAD` to examine the branch with linkgit:git-log[1].  The fetched
+objects will eventually be removed by git's built-in housekeeping (see
+linkgit:git-gc[1]).
 
 BUGS
 ----
diff --git a/Documentation/git-filter-branch.txt b/Documentation/git-filter-branch.txt
index 09535f2..73fd9e8 100644
--- a/Documentation/git-filter-branch.txt
+++ b/Documentation/git-filter-branch.txt
@@ -451,8 +451,8 @@
 
 * By default The BFG takes full advantage of multi-core machines,
   cleansing commit file-trees in parallel. git-filter-branch cleans
-  commits sequentially (ie in a single-threaded manner), though it
-  _is_ possible to write filters that include their own parallellism,
+  commits sequentially (i.e. in a single-threaded manner), though it
+  _is_ possible to write filters that include their own parallelism,
   in the scripts executed against each commit.
 
 * The http://rtyley.github.io/bfg-repo-cleaner/#examples[command options]
diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt
index 5c0a4ab..c0fd470 100644
--- a/Documentation/git-format-patch.txt
+++ b/Documentation/git-format-patch.txt
@@ -14,6 +14,7 @@
 		   [(--attach|--inline)[=<boundary>] | --no-attach]
 		   [-s | --signoff]
 		   [--signature=<signature> | --no-signature]
+		   [--signature-file=<file>]
 		   [-n | --numbered | -N | --no-numbered]
 		   [--start-number <n>] [--numbered-files]
 		   [--in-reply-to=Message-Id] [--suffix=.<sfx>]
@@ -233,6 +234,9 @@
 	signature option is omitted the signature defaults to the Git version
 	number.
 
+--signature-file=<file>::
+	Works just like --signature except the signature is read from a file.
+
 --suffix=.<sfx>::
 	Instead of using `.patch` as the suffix for generated
 	filenames, use specified suffix.  A common alternative is
diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt
index f837334..31811f1 100644
--- a/Documentation/git-grep.txt
+++ b/Documentation/git-grep.txt
@@ -53,6 +53,9 @@
 	option is ignored when the 'grep.patternType' option is set to a value
 	other than 'default'.
 
+grep.fullName::
+	If set to true, enable '--full-name' option by default.
+
 
 OPTIONS
 -------
diff --git a/Documentation/git-help.txt b/Documentation/git-help.txt
index b21e9d7..3956525 100644
--- a/Documentation/git-help.txt
+++ b/Documentation/git-help.txt
@@ -80,9 +80,9 @@
 help.format
 ~~~~~~~~~~~
 
-If no command line option is passed, the 'help.format' configuration
+If no command-line option is passed, the 'help.format' configuration
 variable will be checked. The following values are supported for this
-variable; they make 'git help' behave as their corresponding command
+variable; they make 'git help' behave as their corresponding command-
 line option:
 
 * "man" corresponds to '-m|--man',
@@ -93,15 +93,15 @@
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 The 'help.browser', 'web.browser' and 'browser.<tool>.path' will also
-be checked if the 'web' format is chosen (either by command line
+be checked if the 'web' format is chosen (either by command-line
 option or configuration variable). See '-w|--web' in the OPTIONS
 section above and linkgit:git-web{litdd}browse[1].
 
 man.viewer
 ~~~~~~~~~~
 
-The 'man.viewer' config variable will be checked if the 'man' format
-is chosen. The following values are currently supported:
+The 'man.viewer' configuration variable will be checked if the 'man'
+format is chosen. The following values are currently supported:
 
 * "man": use the 'man' program as usual,
 * "woman": use 'emacsclient' to launch the "woman" mode in emacs
@@ -124,7 +124,7 @@
 		viewer = woman
 ------------------------------------------------
 
-will try to use konqueror first. But this may fail (for example if
+will try to use konqueror first. But this may fail (for example, if
 DISPLAY is not set) and in that case emacs' woman mode will be tried.
 
 If everything fails, or if no viewer is configured, the viewer specified
diff --git a/Documentation/git-imap-send.txt b/Documentation/git-imap-send.txt
index 875d283..c7c0d21 100644
--- a/Documentation/git-imap-send.txt
+++ b/Documentation/git-imap-send.txt
@@ -38,18 +38,17 @@
 imap.folder::
 	The folder to drop the mails into, which is typically the Drafts
 	folder. For example: "INBOX.Drafts", "INBOX/Drafts" or
-	"[Gmail]/Drafts". Required to use imap-send.
+	"[Gmail]/Drafts". Required.
 
 imap.tunnel::
 	Command used to setup a tunnel to the IMAP server through which
 	commands will be piped instead of using a direct network connection
-	to the server. Required when imap.host is not set to use imap-send.
+	to the server. Required when imap.host is not set.
 
 imap.host::
 	A URL identifying the server. Use a `imap://` prefix for non-secure
 	connections and a `imaps://` prefix for secure connections.
-	Ignored when imap.tunnel is set, but required to use imap-send
-	otherwise.
+	Ignored when imap.tunnel is set, but required otherwise.
 
 imap.user::
 	The username to use when logging in to the server.
@@ -76,7 +75,8 @@
 
 imap.authMethod::
 	Specify authenticate method for authentication with IMAP server.
-	Current supported method is 'CRAM-MD5' only.
+	Current supported method is 'CRAM-MD5' only. If this is not set
+	then 'git imap-send' uses the basic IMAP plaintext LOGIN command.
 
 Examples
 ~~~~~~~~
@@ -97,7 +97,7 @@
     host = imap://imap.example.com
     user = bob
     pass = p4ssw0rd
-..........................
+.........................
 
 Using direct mode with SSL:
 
@@ -109,7 +109,7 @@
     pass = p4ssw0rd
     port = 123
     sslverify = false
-..........................
+.........................
 
 
 EXAMPLE
diff --git a/Documentation/git-init.txt b/Documentation/git-init.txt
index afd721e..369f889 100644
--- a/Documentation/git-init.txt
+++ b/Documentation/git-init.txt
@@ -43,7 +43,7 @@
 -q::
 --quiet::
 
-Only print error and warning messages, all other output will be suppressed.
+Only print error and warning messages; all other output will be suppressed.
 
 --bare::
 
@@ -57,12 +57,12 @@
 
 --separate-git-dir=<git dir>::
 
-Instead of initializing the repository where it is supposed to be,
-place a filesytem-agnostic Git symbolic link there, pointing to the
-specified path, and initialize a Git repository at the path. The
-result is Git repository can be separated from working tree. If this
-is reinitialization, the repository will be moved to the specified
-path.
+Instead of initializing the repository as a directory to either `$GIT_DIR` or
+`./.git/`, create a text file there containing the path to the actual
+repository.  This file acts as filesystem-agnostic Git symbolic link to the
+repository.
++
+If this is reinitialization, the repository will be moved to the specified path.
 
 --shared[=(false|true|umask|group|all|world|everybody|0xxx)]::
 
@@ -72,60 +72,65 @@
 set so that files and directories under `$GIT_DIR` are created with the
 requested permissions.  When not specified, Git will use permissions reported
 by umask(2).
-
++
 The option can have the following values, defaulting to 'group' if no value
 is given:
++
+--
+'umask' (or 'false')::
 
- - 'umask' (or 'false'): Use permissions reported by umask(2). The default,
-   when `--shared` is not specified.
+Use permissions reported by umask(2). The default, when `--shared` is not
+specified.
 
- - 'group' (or 'true'): Make the repository group-writable, (and g+sx, since
-   the git group may be not the primary group of all users).
-   This is used to loosen the permissions of an otherwise safe umask(2) value.
-   Note that the umask still applies to the other permission bits (e.g. if
-   umask is '0022', using 'group' will not remove read privileges from other
-   (non-group) users). See '0xxx' for how to exactly specify the repository
-   permissions.
+'group' (or 'true')::
 
- - 'all' (or 'world' or 'everybody'): Same as 'group', but make the repository
-   readable by all users.
+Make the repository group-writable, (and g+sx, since the git group may be not
+the primary group of all users). This is used to loosen the permissions of an
+otherwise safe umask(2) value. Note that the umask still applies to the other
+permission bits (e.g. if umask is '0022', using 'group' will not remove read
+privileges from other (non-group) users). See '0xxx' for how to exactly specify
+the repository permissions.
 
- - '0xxx': '0xxx' is an octal number and each file will have mode '0xxx'.
-   '0xxx' will override users' umask(2) value (and not only loosen permissions
-   as 'group' and 'all' does). '0640' will create a repository which is
-   group-readable, but not group-writable or accessible to others. '0660' will
-   create a repo that is readable and writable to the current user and group,
-   but inaccessible to others.
+'all' (or 'world' or 'everybody')::
 
-By default, the configuration flag receive.denyNonFastForwards is enabled
+Same as 'group', but make the repository readable by all users.
+
+'0xxx'::
+
+'0xxx' is an octal number and each file will have mode '0xxx'. '0xxx' will
+override users' umask(2) value (and not only loosen permissions as 'group' and
+'all' does). '0640' will create a repository which is group-readable, but not
+group-writable or accessible to others. '0660' will create a repo that is
+readable and writable to the current user and group, but inaccessible to others.
+--
+
+By default, the configuration flag `receive.denyNonFastForwards` is enabled
 in shared repositories, so that you cannot force a non fast-forwarding push
 into it.
 
-If you name a (possibly non-existent) directory at the end of the command
-line, the command is run inside the directory (possibly after creating it).
+If you provide a 'directory', the command is run inside it. If this directory
+does not exist, it will be created.
 
 --
 
-
 TEMPLATE DIRECTORY
 ------------------
 
 The template directory contains files and directories that will be copied to
 the `$GIT_DIR` after it is created.
 
-The template directory used will (in order):
+The template directory will be one of the following (in order):
 
- - The argument given with the `--template` option.
+ - the argument given with the `--template` option;
 
- - The contents of the `$GIT_TEMPLATE_DIR` environment variable.
+ - the contents of the `$GIT_TEMPLATE_DIR` environment variable;
 
- - The `init.templatedir` configuration variable.
+ - the `init.templatedir` configuration variable; or
 
- - The default template directory: `/usr/share/git-core/templates`.
+ - the default template directory: `/usr/share/git-core/templates`.
 
-The default template directory includes some directory structure, some
-suggested "exclude patterns", and copies of sample "hook" files.
-The suggested patterns and hook files are all modifiable and extensible.
+The default template directory includes some directory structure, suggested
+"exclude patterns" (see linkgit:gitignore[5]), and sample hook files (see linkgit:githooks[5]).
 
 EXAMPLES
 --------
@@ -136,10 +141,12 @@
 $ cd /path/to/my/codebase
 $ git init      <1>
 $ git add .     <2>
+$ git commit    <3>
 ----------------
 +
-<1> prepare /path/to/my/codebase/.git directory
-<2> add all existing file to the index
+<1> Create a /path/to/my/codebase/.git directory.
+<2> Add all existing files to the index.
+<3> Record the pristine state as the first commit in the history.
 
 GIT
 ---
diff --git a/Documentation/git-interpret-trailers.txt b/Documentation/git-interpret-trailers.txt
new file mode 100644
index 0000000..d6d9231
--- /dev/null
+++ b/Documentation/git-interpret-trailers.txt
@@ -0,0 +1,314 @@
+git-interpret-trailers(1)
+=========================
+
+NAME
+----
+git-interpret-trailers - help add structured information into commit messages
+
+SYNOPSIS
+--------
+[verse]
+'git interpret-trailers' [--trim-empty] [(--trailer <token>[(=|:)<value>])...] [<file>...]
+
+DESCRIPTION
+-----------
+Help adding 'trailers' lines, that look similar to RFC 822 e-mail
+headers, at the end of the otherwise free-form part of a commit
+message.
+
+This command reads some patches or commit messages from either the
+<file> arguments or the standard input if no <file> is specified. Then
+this command applies the arguments passed using the `--trailer`
+option, if any, to the commit message part of each input file. The
+result is emitted on the standard output.
+
+Some configuration variables control the way the `--trailer` arguments
+are applied to each commit message and the way any existing trailer in
+the commit message is changed. They also make it possible to
+automatically add some trailers.
+
+By default, a '<token>=<value>' or '<token>:<value>' argument given
+using `--trailer` will be appended after the existing trailers only if
+the last trailer has a different (<token>, <value>) pair (or if there
+is no existing trailer). The <token> and <value> parts will be trimmed
+to remove starting and trailing whitespace, and the resulting trimmed
+<token> and <value> will appear in the message like this:
+
+------------------------------------------------
+token: value
+------------------------------------------------
+
+This means that the trimmed <token> and <value> will be separated by
+`': '` (one colon followed by one space).
+
+By default the new trailer will appear at the end of all the existing
+trailers. If there is no existing trailer, the new trailer will appear
+after the commit message part of the output, and, if there is no line
+with only spaces at the end of the commit message part, one blank line
+will be added before the new trailer.
+
+Existing trailers are extracted from the input message by looking for
+a group of one or more lines that contain a colon (by default), where
+the group is preceded by one or more empty (or whitespace-only) lines.
+The group must either be at the end of the message or be the last
+non-whitespace lines before a line that starts with '---'. Such three
+minus signs start the patch part of the message.
+
+When reading trailers, there can be whitespaces before and after the
+token, the separator and the value. There can also be whitespaces
+inside the token and the value.
+
+Note that 'trailers' do not follow and are not intended to follow many
+rules for RFC 822 headers. For example they do not follow the line
+folding rules, the encoding rules and probably many other rules.
+
+OPTIONS
+-------
+--trim-empty::
+	If the <value> part of any trailer contains only whitespace,
+	the whole trailer will be removed from the resulting message.
+	This apply to existing trailers as well as new trailers.
+
+--trailer <token>[(=|:)<value>]::
+	Specify a (<token>, <value>) pair that should be applied as a
+	trailer to the input messages. See the description of this
+	command.
+
+CONFIGURATION VARIABLES
+-----------------------
+
+trailer.separators::
+	This option tells which characters are recognized as trailer
+	separators. By default only ':' is recognized as a trailer
+	separator, except that '=' is always accepted on the command
+	line for compatibility with other git commands.
++
+The first character given by this option will be the default character
+used when another separator is not specified in the config for this
+trailer.
++
+For example, if the value for this option is "%=$", then only lines
+using the format '<token><sep><value>' with <sep> containing '%', '='
+or '$' and then spaces will be considered trailers. And '%' will be
+the default separator used, so by default trailers will appear like:
+'<token>% <value>' (one percent sign and one space will appear between
+the token and the value).
+
+trailer.where::
+	This option tells where a new trailer will be added.
++
+This can be `end`, which is the default, `start`, `after` or `before`.
++
+If it is `end`, then each new trailer will appear at the end of the
+existing trailers.
++
+If it is `start`, then each new trailer will appear at the start,
+instead of the end, of the existing trailers.
++
+If it is `after`, then each new trailer will appear just after the
+last trailer with the same <token>.
++
+If it is `before`, then each new trailer will appear just before the
+first trailer with the same <token>.
+
+trailer.ifexists::
+	This option makes it possible to choose what action will be
+	performed when there is already at least one trailer with the
+	same <token> in the message.
++
+The valid values for this option are: `addIfDifferentNeighbor` (this
+is the default), `addIfDifferent`, `add`, `overwrite` or `doNothing`.
++
+With `addIfDifferentNeighbor`, a new trailer will be added only if no
+trailer with the same (<token>, <value>) pair is above or below the line
+where the new trailer will be added.
++
+With `addIfDifferent`, a new trailer will be added only if no trailer
+with the same (<token>, <value>) pair is already in the message.
++
+With `add`, a new trailer will be added, even if some trailers with
+the same (<token>, <value>) pair are already in the message.
++
+With `replace`, an existing trailer with the same <token> will be
+deleted and the new trailer will be added. The deleted trailer will be
+the closest one (with the same <token>) to the place where the new one
+will be added.
++
+With `doNothing`, nothing will be done; that is no new trailer will be
+added if there is already one with the same <token> in the message.
+
+trailer.ifmissing::
+	This option makes it possible to choose what action will be
+	performed when there is not yet any trailer with the same
+	<token> in the message.
++
+The valid values for this option are: `add` (this is the default) and
+`doNothing`.
++
+With `add`, a new trailer will be added.
++
+With `doNothing`, nothing will be done.
+
+trailer.<token>.key::
+	This `key` will be used instead of <token> in the trailer. At
+	the end of this key, a separator can appear and then some
+	space characters. By default the only valid separator is ':',
+	but this can be changed using the `trailer.separators` config
+	variable.
++
+If there is a separator, then the key will be used instead of both the
+<token> and the default separator when adding the trailer.
+
+trailer.<token>.where::
+	This option takes the same values as the 'trailer.where'
+	configuration variable and it overrides what is specified by
+	that option for trailers with the specified <token>.
+
+trailer.<token>.ifexist::
+	This option takes the same values as the 'trailer.ifexist'
+	configuration variable and it overrides what is specified by
+	that option for trailers with the specified <token>.
+
+trailer.<token>.ifmissing::
+	This option takes the same values as the 'trailer.ifmissing'
+	configuration variable and it overrides what is specified by
+	that option for trailers with the specified <token>.
+
+trailer.<token>.command::
+	This option can be used to specify a shell command that will
+	be called to automatically add or modify a trailer with the
+	specified <token>.
++
+When this option is specified, the behavior is as if a special
+'<token>=<value>' argument were added at the beginning of the command
+line, where <value> is taken to be the standard output of the
+specified command with any leading and trailing whitespace trimmed
+off.
++
+If the command contains the `$ARG` string, this string will be
+replaced with the <value> part of an existing trailer with the same
+<token>, if any, before the command is launched.
++
+If some '<token>=<value>' arguments are also passed on the command
+line, when a 'trailer.<token>.command' is configured, the command will
+also be executed for each of these arguments. And the <value> part of
+these arguments, if any, will be used to replace the `$ARG` string in
+the command.
+
+EXAMPLES
+--------
+
+* Configure a 'sign' trailer with a 'Signed-off-by' key, and then
+  add two of these trailers to a message:
++
+------------
+$ git config trailer.sign.key "Signed-off-by"
+$ cat msg.txt
+subject
+
+message
+$ cat msg.txt | git interpret-trailers --trailer 'sign: Alice <alice@example.com>' --trailer 'sign: Bob <bob@example.com>'
+subject
+
+message
+
+Signed-off-by: Alice <alice@example.com>
+Signed-off-by: Bob <bob@example.com>
+------------
+
+* Extract the last commit as a patch, and add a 'Cc' and a
+  'Reviewed-by' trailer to it:
++
+------------
+$ git format-patch -1
+0001-foo.patch
+$ git interpret-trailers --trailer 'Cc: Alice <alice@example.com>' --trailer 'Reviewed-by: Bob <bob@example.com>' 0001-foo.patch >0001-bar.patch
+------------
+
+* Configure a 'sign' trailer with a command to automatically add a
+  'Signed-off-by: ' with the author information only if there is no
+  'Signed-off-by: ' already, and show how it works:
++
+------------
+$ git config trailer.sign.key "Signed-off-by: "
+$ git config trailer.sign.ifmissing add
+$ git config trailer.sign.ifexists doNothing
+$ git config trailer.sign.command 'echo "$(git config user.name) <$(git config user.email)>"'
+$ git interpret-trailers <<EOF
+> EOF
+
+Signed-off-by: Bob <bob@example.com>
+$ git interpret-trailers <<EOF
+> Signed-off-by: Alice <alice@example.com>
+> EOF
+
+Signed-off-by: Alice <alice@example.com>
+------------
+
+* Configure a 'fix' trailer with a key that contains a '#' and no
+  space after this character, and show how it works:
++
+------------
+$ git config trailer.separators ":#"
+$ git config trailer.fix.key "Fix #"
+$ echo "subject" | git interpret-trailers --trailer fix=42
+subject
+
+Fix #42
+------------
+
+* Configure a 'see' trailer with a command to show the subject of a
+  commit that is related, and show how it works:
++
+------------
+$ git config trailer.see.key "See-also: "
+$ git config trailer.see.ifExists "replace"
+$ git config trailer.see.ifMissing "doNothing"
+$ git config trailer.see.command "git log -1 --oneline --format=\"%h (%s)\" --abbrev-commit --abbrev=14 \$ARG"
+$ git interpret-trailers <<EOF
+> subject
+> 
+> message
+> 
+> see: HEAD~2
+> EOF
+subject
+
+message
+
+See-also: fe3187489d69c4 (subject of related commit)
+------------
+
+* Configure a commit template with some trailers with empty values
+  (using sed to show and keep the trailing spaces at the end of the
+  trailers), then configure a commit-msg hook that uses
+  'git interpret-trailers' to remove trailers with empty values and
+  to add a 'git-version' trailer:
++
+------------
+$ sed -e 's/ Z$/ /' >commit_template.txt <<EOF
+> ***subject***
+> 
+> ***message***
+> 
+> Fixes: Z
+> Cc: Z
+> Reviewed-by: Z
+> Signed-off-by: Z
+> EOF
+$ git config commit.template commit_template.txt
+$ cat >.git/hooks/commit-msg <<EOF
+> #!/bin/sh
+> git interpret-trailers --trim-empty --trailer "git-version: \$(git describe)" "\$1" > "\$1.new"
+> mv "\$1.new" "\$1"
+> EOF
+$ chmod +x .git/hooks/commit-msg
+------------
+
+SEE ALSO
+--------
+linkgit:git-commit[1], linkgit:git-format-patch[1], linkgit:git-config[1]
+
+GIT
+---
+Part of the linkgit:git[1] suite
diff --git a/Documentation/git-ls-files.txt b/Documentation/git-ls-files.txt
index c0856a6..e26f01f 100644
--- a/Documentation/git-ls-files.txt
+++ b/Documentation/git-ls-files.txt
@@ -185,15 +185,15 @@
 
 These exclude patterns come from these places, in order:
 
-  1. The command line flag --exclude=<pattern> specifies a
+  1. The command-line flag --exclude=<pattern> specifies a
      single pattern.  Patterns are ordered in the same order
      they appear in the command line.
 
-  2. The command line flag --exclude-from=<file> specifies a
+  2. The command-line flag --exclude-from=<file> specifies a
      file containing a list of patterns.  Patterns are ordered
      in the same order they appear in the file.
 
-  3. The command line flag --exclude-per-directory=<name> specifies
+  3. The command-line flag --exclude-per-directory=<name> specifies
      a name of the file in each directory 'git ls-files'
      examines, normally `.gitignore`.  Files in deeper
      directories take precedence.  Patterns are ordered in the
diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt
index a3c1fa3..cf2c374 100644
--- a/Documentation/git-merge.txt
+++ b/Documentation/git-merge.txt
@@ -101,9 +101,8 @@
 	Specifying more than one commit will create a merge with
 	more than two parents (affectionately called an Octopus merge).
 +
-If no commit is given from the command line, and if `merge.defaultToUpstream`
-configuration variable is set, merge the remote-tracking branches
-that the current branch is configured to use as its upstream.
+If no commit is given from the command line, merge the remote-tracking
+branches that the current branch is configured to use as its upstream.
 See also the configuration section of this manual page.
 
 
diff --git a/Documentation/git-mergetool.txt b/Documentation/git-mergetool.txt
index 07137f2..e846c2e 100644
--- a/Documentation/git-mergetool.txt
+++ b/Documentation/git-mergetool.txt
@@ -71,11 +71,13 @@
 --no-prompt::
 	Don't prompt before each invocation of the merge resolution
 	program.
+	This is the default if the merge resolution program is
+	explicitly specified with the `--tool` option or with the
+	`merge.tool` configuration variable.
 
 --prompt::
-	Prompt before each invocation of the merge resolution program.
-	This is the default behaviour; the option is provided to
-	override any configuration settings.
+	Prompt before each invocation of the merge resolution program
+	to give the user a chance to skip the path.
 
 TEMPORARY FILES
 ---------------
diff --git a/Documentation/git-patch-id.txt b/Documentation/git-patch-id.txt
index 312c3b1..31efc58 100644
--- a/Documentation/git-patch-id.txt
+++ b/Documentation/git-patch-id.txt
@@ -8,14 +8,14 @@
 SYNOPSIS
 --------
 [verse]
-'git patch-id' < <patch>
+'git patch-id' [--stable | --unstable] < <patch>
 
 DESCRIPTION
 -----------
-A "patch ID" is nothing but a SHA-1 of the diff associated with a patch, with
-whitespace and line numbers ignored.  As such, it's "reasonably stable", but at
-the same time also reasonably unique, i.e., two patches that have the same "patch
-ID" are almost guaranteed to be the same thing.
+A "patch ID" is nothing but a sum of SHA-1 of the file diffs associated with a
+patch, with whitespace and line numbers ignored.  As such, it's "reasonably
+stable", but at the same time also reasonably unique, i.e., two patches that
+have the same "patch ID" are almost guaranteed to be the same thing.
 
 IOW, you can use this thing to look for likely duplicate commits.
 
@@ -27,6 +27,33 @@
 
 OPTIONS
 -------
+
+--stable::
+	Use a "stable" sum of hashes as the patch ID. With this option:
+	 - Reordering file diffs that make up a patch does not affect the ID.
+	   In particular, two patches produced by comparing the same two trees
+	   with two different settings for "-O<orderfile>" result in the same
+	   patch ID signature, thereby allowing the computed result to be used
+	   as a key to index some meta-information about the change between
+	   the two trees;
+
+	 - Result is different from the value produced by git 1.9 and older
+	   or produced when an "unstable" hash (see --unstable below) is
+	   configured - even when used on a diff output taken without any use
+	   of "-O<orderfile>", thereby making existing databases storing such
+	   "unstable" or historical patch-ids unusable.
+
+	This is the default if patchid.stable is set to true.
+
+--unstable::
+	Use an "unstable" hash as the patch ID. With this option,
+	the result produced is compatible with the patch-id value produced
+	by git 1.9 and older.  Users with pre-existing databases storing
+	patch-ids produced by git 1.9 and older (who do not deal with reordered
+	patches) may want to use this option.
+
+	This is the default.
+
 <patch>::
 	The diff to create the ID of.
 
diff --git a/Documentation/git-prune-packed.txt b/Documentation/git-prune-packed.txt
index 6738055..9fed59a 100644
--- a/Documentation/git-prune-packed.txt
+++ b/Documentation/git-prune-packed.txt
@@ -1,5 +1,5 @@
 git-prune-packed(1)
-=====================
+===================
 
 NAME
 ----
diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt
index 21cd455..21b3f29 100644
--- a/Documentation/git-push.txt
+++ b/Documentation/git-push.txt
@@ -10,7 +10,8 @@
 --------
 [verse]
 'git push' [--all | --mirror | --tags] [--follow-tags] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
-	   [--repo=<repository>] [-f | --force] [--prune] [-v | --verbose] [-u | --set-upstream]
+	   [--repo=<repository>] [-f | --force] [--prune] [-v | --verbose]
+	   [-u | --set-upstream] [--signed]
 	   [--force-with-lease[=<refname>[:<expect>]]]
 	   [--no-verify] [<repository> [<refspec>...]]
 
@@ -129,6 +130,12 @@
 	from the remote but are pointing at commit-ish that are
 	reachable from the refs being pushed.
 
+--signed::
+	GPG-sign the push request to update refs on the receiving
+	side, to allow it to be checked by the hooks and/or be
+	logged.  See linkgit:git-receive-pack[1] for the details
+	on the receiving end.
+
 --receive-pack=<git-receive-pack>::
 --exec=<git-receive-pack>::
 	Path to the 'git-receive-pack' program on the remote
diff --git a/Documentation/git-quiltimport.txt b/Documentation/git-quiltimport.txt
index a356196..d64388c 100644
--- a/Documentation/git-quiltimport.txt
+++ b/Documentation/git-quiltimport.txt
@@ -1,5 +1,5 @@
 git-quiltimport(1)
-================
+==================
 
 NAME
 ----
diff --git a/Documentation/git-read-tree.txt b/Documentation/git-read-tree.txt
index 056c0db..fa1d557 100644
--- a/Documentation/git-read-tree.txt
+++ b/Documentation/git-read-tree.txt
@@ -283,7 +283,7 @@
 you are trying to merge (stage 2 and 3 respectively).
 
 The order of stages 1, 2 and 3 (hence the order of three
-<tree-ish> command line arguments) are significant when you
+<tree-ish> command-line arguments) are significant when you
 start a 3-way merge with an index file that is already
 populated.  Here is an outline of how the algorithm works:
 
diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt
index 2a93c64..924827d 100644
--- a/Documentation/git-rebase.txt
+++ b/Documentation/git-rebase.txt
@@ -9,7 +9,7 @@
 --------
 [verse]
 'git rebase' [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
-	[<upstream>] [<branch>]
+	[<upstream> [<branch>]]
 'git rebase' [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
 	--root [<branch>]
 'git rebase' --continue | --skip | --abort | --edit-todo
@@ -21,15 +21,17 @@
 it remains on the current branch.
 
 If <upstream> is not specified, the upstream configured in
-branch.<name>.remote and branch.<name>.merge options will be used; see
-linkgit:git-config[1] for details.  If you are currently not on any
-branch or if the current branch does not have a configured upstream,
-the rebase will abort.
+branch.<name>.remote and branch.<name>.merge options will be used (see
+linkgit:git-config[1] for details) and the `--fork-point` option is
+assumed.  If you are currently not on any branch or if the current
+branch does not have a configured upstream, the rebase will abort.
 
 All changes made by commits in the current branch but that are not
 in <upstream> are saved to a temporary area.  This is the same set
-of commits that would be shown by `git log <upstream>..HEAD` (or
-`git log HEAD`, if --root is specified).
+of commits that would be shown by `git log <upstream>..HEAD`; or by
+`git log 'fork_point'..HEAD`, if `--fork-point` is active (see the
+description on `--fork-point` below); or by `git log HEAD`, if the
+`--root` option is specified.
 
 The current branch is reset to <upstream>, or <newbase> if the
 --onto option was supplied.  This has the exact same effect as
@@ -316,11 +318,8 @@
 
 -f::
 --force-rebase::
-	Force the rebase even if the current branch is a descendant
-	of the commit you are rebasing onto.  Normally non-interactive rebase will
-	exit with the message "Current branch is up to date" in such a
-	situation.
-	Incompatible with the --interactive option.
+	Force a rebase even if the current branch is up-to-date and
+	the command without `--force` would return without doing anything.
 +
 You may find this (or --no-ff with an interactive rebase) helpful after
 reverting a topic branch merge, as this option recreates the topic branch with
@@ -330,13 +329,18 @@
 
 --fork-point::
 --no-fork-point::
-	Use 'git merge-base --fork-point' to find a better common ancestor
-	between `upstream` and `branch` when calculating which commits have
-	have been introduced by `branch` (see linkgit:git-merge-base[1]).
+	Use reflog to find a better common ancestor between <upstream>
+	and <branch> when calculating which commits have been
+	introduced by <branch>.
 +
-If no non-option arguments are given on the command line, then the default is
-`--fork-point @{u}` otherwise the `upstream` argument is interpreted literally
-unless the `--fork-point` option is specified.
+When --fork-point is active, 'fork_point' will be used instead of
+<upstream> to calculate the set of commits to rebase, where
+'fork_point' is the result of `git merge-base --fork-point <upstream>
+<branch>` command (see linkgit:git-merge-base[1]).  If 'fork_point'
+ends up being empty, the <upstream> will be used as a fallback.
++
+If either <upstream> or --root is given on the command line, then the
+default is `--no-fork-point`, otherwise the default is `--fork-point`.
 
 --ignore-whitespace::
 --whitespace=<option>::
diff --git a/Documentation/git-receive-pack.txt b/Documentation/git-receive-pack.txt
index b1f7dc6..9016960 100644
--- a/Documentation/git-receive-pack.txt
+++ b/Documentation/git-receive-pack.txt
@@ -53,6 +53,56 @@
 while refs to be deleted will have sha1-new equal to 0\{40}, otherwise
 sha1-old and sha1-new should be valid objects in the repository.
 
+When accepting a signed push (see linkgit:git-push[1]), the signed
+push certificate is stored in a blob and an environment variable
+`GIT_PUSH_CERT` can be consulted for its object name.  See the
+description of `post-receive` hook for an example.  In addition, the
+certificate is verified using GPG and the result is exported with
+the following environment variables:
+
+`GIT_PUSH_CERT_SIGNER`::
+	The name and the e-mail address of the owner of the key that
+	signed the push certificate.
+
+`GIT_PUSH_CERT_KEY`::
+	The GPG key ID of the key that signed the push certificate.
+
+`GIT_PUSH_CERT_STATUS`::
+	The status of GPG verification of the push certificate,
+	using the same mnemonic as used in `%G?` format of `git log`
+	family of commands (see linkgit:git-log[1]).
+
+`GIT_PUSH_CERT_NONCE`::
+	The nonce string the process asked the signer to include
+	in the push certificate.  If this does not match the value
+	recorded on the "nonce" header in the push certificate, it
+	may indicate that the certificate is a valid one that is
+	being replayed from a separate "git push" session.
+
+`GIT_PUSH_CERT_NONCE_STATUS`::
+`UNSOLICITED`;;
+	"git push --signed" sent a nonce when we did not ask it to
+	send one.
+`MISSING`;;
+	"git push --signed" did not send any nonce header.
+`BAD`;;
+	"git push --signed" sent a bogus nonce.
+`OK`;;
+	"git push --signed" sent the nonce we asked it to send.
+`SLOP`;;
+	"git push --signed" sent a nonce different from what we
+	asked it to send now, but in a previous session.  See
+	`GIT_PUSH_CERT_NONCE_SLOP` environment variable.
+
+`GIT_PUSH_CERT_NONCE_SLOP`::
+	"git push --signed" sent a nonce different from what we
+	asked it to send now, but in a different session whose
+	starting time is different by this many seconds from the
+	current session.  Only meaningful when
+	`GIT_PUSH_CERT_NONCE_STATUS` says `SLOP`.
+	Also read about `receive.certnonceslop` variable in
+	linkgit:git-config[1].
+
 This hook is called before any refname is updated and before any
 fast-forward checks are performed.
 
@@ -101,9 +151,14 @@
 0\{40}, otherwise sha1-old and sha1-new should be valid objects in
 the repository.
 
+The `GIT_PUSH_CERT*` environment variables can be inspected, just as
+in `pre-receive` hook, after accepting a signed push.
+
 Using this hook, it is easy to generate mails describing the updates
 to the repository.  This example script sends one mail message per
-ref listing the commits pushed to the repository:
+ref listing the commits pushed to the repository, and logs the push
+certificates of signed pushes with good signatures to a logger
+service:
 
 	#!/bin/sh
 	# mail out commit update information.
@@ -119,6 +174,14 @@
 		fi |
 		mail -s "Changes to ref $ref" commit-list@mydomain
 	done
+	# log signed push certificate, if any
+	if test -n "${GIT_PUSH_CERT-}" && test ${GIT_PUSH_CERT_STATUS} = G
+	then
+		(
+			echo expected nonce is ${GIT_PUSH_NONCE}
+			git cat-file blob ${GIT_PUSH_CERT}
+		) | mail -s "push certificate from $GIT_PUSH_CERT_SIGNER" push-log@mydomain
+	fi
 	exit 0
 
 The exit code from this hook invocation is ignored, however a
diff --git a/Documentation/git-replace.txt b/Documentation/git-replace.txt
index 0a02f70..8fff598 100644
--- a/Documentation/git-replace.txt
+++ b/Documentation/git-replace.txt
@@ -9,6 +9,8 @@
 --------
 [verse]
 'git replace' [-f] <object> <replacement>
+'git replace' [-f] --edit <object>
+'git replace' [-f] --graft <commit> [<parent>...]
 'git replace' -d <object>...
 'git replace' [--format=<format>] [-l [<pattern>]]
 
@@ -63,6 +65,32 @@
 --delete::
 	Delete existing replace refs for the given objects.
 
+--edit <object>::
+	Edit an object's content interactively. The existing content
+	for <object> is pretty-printed into a temporary file, an
+	editor is launched on the file, and the result is parsed to
+	create a new object of the same type as <object>. A
+	replacement ref is then created to replace <object> with the
+	newly created object. See linkgit:git-var[1] for details about
+	how the editor will be chosen.
+
+--raw::
+	When editing, provide the raw object contents rather than
+	pretty-printed ones. Currently this only affects trees, which
+	will be shown in their binary form. This is harder to work with,
+	but can help when repairing a tree that is so corrupted it
+	cannot be pretty-printed. Note that you may need to configure
+	your editor to cleanly read and write binary data.
+
+--graft <commit> [<parent>...]::
+	Create a graft commit. A new commit is created with the same
+	content as <commit> except that its parents will be
+	[<parent>...] instead of <commit>'s parents. A replacement ref
+	is then created to replace <commit> with the newly created
+	commit. See contrib/convert-grafts-to-replace-refs.sh for an
+	example script based on this option that can convert grafts to
+	replace refs.
+
 -l <pattern>::
 --list <pattern>::
 	List replace refs for objects that match the given pattern (or
@@ -92,7 +120,9 @@
 
 linkgit:git-filter-branch[1], linkgit:git-hash-object[1] and
 linkgit:git-rebase[1], among other git commands, can be used to create
-replacement objects from existing objects.
+replacement objects from existing objects. The `--edit` option can
+also be used with 'git replace' to create a replacement object by
+editing an existing object.
 
 If you want to replace many blobs, trees or commits that are part of a
 string of commits, you may just want to create a replacement string of
@@ -117,6 +147,8 @@
 linkgit:git-rebase[1]
 linkgit:git-tag[1]
 linkgit:git-branch[1]
+linkgit:git-commit[1]
+linkgit:git-var[1]
 linkgit:git[1]
 
 GIT
diff --git a/Documentation/git-rev-list.txt b/Documentation/git-rev-list.txt
index 7a1585d..fd7f8b5 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|rfc|short) ]
+	     [ \--date=(local|relative|default|iso|iso-strict|rfc|short) ]
 	     [ [\--objects | \--objects-edge] [ \--unpacked ] ]
 	     [ \--pretty | \--header ]
 	     [ \--bisect ]
diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt
index 54143a0..d6de42f 100644
--- a/Documentation/git-rev-parse.txt
+++ b/Documentation/git-rev-parse.txt
@@ -114,6 +114,7 @@
 	Only meaningful in `--verify` mode. Do not output an error
 	message if the first argument is not a valid object name;
 	instead exit with non-zero status silently.
+	SHA-1s for valid object names are printed to stdout on success.
 
 --sq::
 	Usually the output is made one line per flag and
@@ -183,7 +184,7 @@
 	consider. Repetitions of this option accumulate exclusion patterns
 	up to the next `--all`, `--branches`, `--tags`, `--remotes`, or
 	`--glob` option (other options or arguments do not clear
-	accumlated patterns).
+	accumulated patterns).
 +
 The patterns given should not begin with `refs/heads`, `refs/tags`, or
 `refs/remotes` when applied to `--branches`, `--tags`, or `--remotes`,
@@ -245,6 +246,10 @@
 --show-toplevel::
 	Show the absolute path of the top-level directory.
 
+--shared-index-path::
+	Show the path to the shared index file in split index mode, or
+	empty if not in split-index mode.
+
 Other Options
 ~~~~~~~~~~~~~
 
diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt
index f0e57a5..a60776e 100644
--- a/Documentation/git-send-email.txt
+++ b/Documentation/git-send-email.txt
@@ -20,7 +20,7 @@
 last case, any format accepted by linkgit:git-format-patch[1] can
 be passed to git send-email.
 
-The header of the email is configurable by command line options.  If not
+The header of the email is configurable via command-line options.  If not
 specified on the command line, the user will be prompted with a ReadLine
 enabled interface to provide the necessary information.
 
@@ -68,7 +68,7 @@
 When '--compose' is used, git send-email will use the From, Subject, and
 In-Reply-To headers specified in the message. If the body of the message
 (what you type after the headers and a blank line) only contains blank
-(or Git: prefixed) lines the summary won't be sent, but From, Subject,
+(or Git: prefixed) lines, the summary won't be sent, but From, Subject,
 and In-Reply-To headers will be used unless they are removed.
 +
 Missing From or In-Reply-To headers will be prompted for.
@@ -78,7 +78,7 @@
 --from=<address>::
 	Specify the sender of the emails.  If not specified on the command line,
 	the value of the 'sendemail.from' configuration option is used.  If
-	neither the command line option nor 'sendemail.from' are set, then the
+	neither the command-line option nor 'sendemail.from' are set, then the
 	user will be prompted for the value.  The default for the prompt will be
 	the value of GIT_AUTHOR_IDENT, or GIT_COMMITTER_IDENT if that is not
 	set, as returned by "git var -l".
@@ -248,6 +248,18 @@
 	cc list. Default is the value of 'sendemail.signedoffbycc' configuration
 	value; if that is unspecified, default to --signed-off-by-cc.
 
+--[no-]cc-cover::
+	If this is set, emails found in Cc: headers in the first patch of
+	the series (typically the cover letter) are added to the cc list
+	for each email set. Default is the value of 'sendemail.cccover'
+	configuration value; if that is unspecified, default to --no-cc-cover.
+
+--[no-]to-cover::
+	If this is set, emails found in To: headers in the first patch of
+	the series (typically the cover letter) are added to the to list
+	for each email set. Default is the value of 'sendemail.tocover'
+	configuration value; if that is unspecified, default to --no-to-cover.
+
 --suppress-cc=<category>::
 	Specify an additional category of recipients to suppress the
 	auto-cc of:
diff --git a/Documentation/git-send-pack.txt b/Documentation/git-send-pack.txt
index dc3a568..2a0de42 100644
--- a/Documentation/git-send-pack.txt
+++ b/Documentation/git-send-pack.txt
@@ -35,6 +35,16 @@
 	Instead of explicitly specifying which refs to update,
 	update all heads that locally exist.
 
+--stdin::
+	Take the list of refs from stdin, one per line. If there
+	are refs specified on the command line in addition to this
+	option, then the refs from stdin are processed after those
+	on the command line.
++
+If '--stateless-rpc' is specified together with this option then
+the list of refs must be in packet format (pkt-line). Each ref must
+be in a separate packet, and the list must end with a flush packet.
+
 --dry-run::
 	Do everything except actually send the updates.
 
@@ -77,7 +87,8 @@
 Without '--all' and without any '<ref>', the heads that exist
 both on the local side and on the remote side are updated.
 
-When one or more '<ref>' are specified explicitly, it can be either a
+When one or more '<ref>' are specified explicitly (whether on the
+command line or via `--stdin`), it can be either a
 single pattern, or a pair of such pattern separated by a colon
 ":" (this means that a ref name cannot have a colon in it).  A
 single pattern '<name>' is just a shorthand for '<name>:<name>'.
diff --git a/Documentation/git-stage.txt b/Documentation/git-stage.txt
index ba3fe0d..25bcda9 100644
--- a/Documentation/git-stage.txt
+++ b/Documentation/git-stage.txt
@@ -1,5 +1,5 @@
 git-stage(1)
-==============
+============
 
 NAME
 ----
diff --git a/Documentation/git-status.txt b/Documentation/git-status.txt
index def635f..4d8d530 100644
--- a/Documentation/git-status.txt
+++ b/Documentation/git-status.txt
@@ -116,7 +116,7 @@
 
 where `PATH1` is the path in the `HEAD`, and the " `-> PATH2`" part is
 shown only when `PATH1` corresponds to a different path in the
-index/worktree (i.e. the file is renamed). The 'XY' is a two-letter
+index/worktree (i.e. the file is renamed). The `XY` is a two-letter
 status code.
 
 The fields (including the `->`) are separated from each other by a
@@ -125,7 +125,7 @@
 literal: surrounded by ASCII double quote (34) characters, and with
 interior special characters backslash-escaped.
 
-For paths with merge conflicts, `X` and 'Y' show the modification
+For paths with merge conflicts, `X` and `Y` show the modification
 states of each side of the merge. For paths that do not have merge
 conflicts, `X` shows the status of the index, and `Y` shows the status
 of the work tree.  For untracked paths, `XY` are `??`.  Other status
diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
index fce5853..39e9a18 100644
--- a/Documentation/git-svn.txt
+++ b/Documentation/git-svn.txt
@@ -70,8 +70,8 @@
 --username=<user>;;
 	For transports that SVN handles authentication for (http,
 	https, and plain svn), specify the username.  For other
-	transports (eg svn+ssh://), you must include the username in
-	the URL, eg svn+ssh://foo@svn.bar.com/project
+	transports (e.g. svn+ssh://), you must include the username in
+	the URL, e.g. svn+ssh://foo@svn.bar.com/project
 --prefix=<prefix>;;
 	This allows one to specify a prefix which is prepended
 	to the names of remotes if trunk/branches/tags are
@@ -148,8 +148,8 @@
 [verse]
 config key: svn-remote.<name>.ignore-paths
 +
-If the ignore-paths config key is set and the command line option is
-also given, both regular expressions will be used.
+If the ignore-paths configuration key is set, and the command-line
+option is also given, both regular expressions will be used.
 +
 Examples:
 +
@@ -252,6 +252,10 @@
 config key: svn-remote.<name>.commiturl
 config key: svn.commiturl (overwrites all svn-remote.<name>.commiturl options)
 +
+Note that the SVN URL of the commiturl config key includes the SVN branch.
+If you rather want to set the commit URL for an entire SVN repository use
+svn-remote.<name>.pushurl instead.
++
 Using this option for any other purpose (don't ask) is very strongly
 discouraged.
 
@@ -386,11 +390,13 @@
 	tree-ish to specify which branch should be searched).  When given a
 	tree-ish, returns the corresponding SVN revision number.
 +
+-B;;
 --before;;
 	Don't require an exact match if given an SVN revision, instead find
 	the commit corresponding to the state of the SVN repository (on the
 	current branch) at the specified revision.
 +
+-A;;
 --after;;
 	Don't require an exact match if given an SVN revision; if there is
 	not an exact match return the closest match searching forward in the
@@ -608,21 +614,6 @@
 	Make 'git svn' less verbose. Specify a second time to make it
 	even less verbose.
 
---repack[=<n>]::
---repack-flags=<flags>::
-	These should help keep disk usage sane for large fetches with
-	many revisions.
-+
---repack takes an optional argument for the number of revisions
-to fetch before repacking.  This defaults to repacking every
-1000 commits fetched if no argument is specified.
-+
---repack-flags are passed directly to 'git repack'.
-+
-[verse]
-config key: svn.repack
-config key: svn.repackflags
-
 -m::
 --merge::
 -s<strategy>::
diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt
index 303de8e..e953ba4 100644
--- a/Documentation/git-tag.txt
+++ b/Documentation/git-tag.txt
@@ -99,7 +99,9 @@
 	Sort in a specific order. Supported type is "refname"
 	(lexicographic order), "version:refname" or "v:refname" (tag
 	names are treated as versions). Prepend "-" to reverse sort
-	order.
+	order. When this option is not given, the sort order defaults to the
+	value configured for the 'tag.sort' variable if it exists, or
+	lexicographic order otherwise. See linkgit:git-config[1].
 
 --column[=<options>]::
 --no-column::
@@ -317,6 +319,7 @@
 SEE ALSO
 --------
 linkgit:git-check-ref-format[1].
+linkgit:git-config[1].
 
 GIT
 ---
diff --git a/Documentation/git-update-index.txt b/Documentation/git-update-index.txt
index d6de4a0..929869b 100644
--- a/Documentation/git-update-index.txt
+++ b/Documentation/git-update-index.txt
@@ -161,6 +161,17 @@
 	Only meaningful with `--stdin` or `--index-info`; paths are
 	separated with NUL character instead of LF.
 
+--split-index::
+--no-split-index::
+	Enable or disable split index mode. If enabled, the index is
+	split into two files, $GIT_DIR/index and $GIT_DIR/sharedindex.<SHA-1>.
+	Changes are accumulated in $GIT_DIR/index while the shared
+	index file contains all index entries stays unchanged. If
+	split-index mode is already enabled and `--split-index` is
+	given again, all changes in $GIT_DIR/index are pushed back to
+	the shared index file. This mode is designed for very large
+	indexes that take a significant amount of time to read or write.
+
 \--::
 	Do not interpret any more arguments as options.
 
@@ -191,7 +202,7 @@
 To pretend you have a file with mode and sha1 at path, say:
 
 ----------------
-$ git update-index --cacheinfo mode sha1 path
+$ git update-index --cacheinfo <mode>,<sha1>,<path>
 ----------------
 
 '--info-only' is used to register files without placing them in the object
diff --git a/Documentation/git-update-ref.txt b/Documentation/git-update-ref.txt
index 0a0a551..c8f5ae5 100644
--- a/Documentation/git-update-ref.txt
+++ b/Documentation/git-update-ref.txt
@@ -68,7 +68,12 @@
 	option SP <opt> LF
 
 Quote fields containing whitespace as if they were strings in C source
-code.  Alternatively, use `-z` to specify commands without quoting:
+code; i.e., surrounded by double-quotes and with backslash escapes.
+Use 40 "0" characters or the empty string to specify a zero value.  To
+specify a missing value, omit the value and its preceding SP entirely.
+
+Alternatively, use `-z` to specify in NUL-terminated format, without
+quoting:
 
 	update SP <ref> NUL <newvalue> NUL [<oldvalue>] NUL
 	create SP <ref> NUL <newvalue> NUL
@@ -76,8 +81,12 @@
 	verify SP <ref> NUL [<oldvalue>] NUL
 	option SP <opt> NUL
 
-Lines of any other format or a repeated <ref> produce an error.
-Command meanings are:
+In this format, use 40 "0" to specify a zero value, and use the empty
+string to specify a missing value.
+
+In either format, values can be specified in any form that Git
+recognizes as an object name.  Commands in any other format or a
+repeated <ref> produce an error.  Command meanings are:
 
 update::
 	Set <ref> to <newvalue> after verifying <oldvalue>, if given.
@@ -102,9 +111,6 @@
 	The only valid option is `no-deref` to avoid dereferencing
 	a symbolic ref.
 
-Use 40 "0" or the empty string to specify a zero value, except that
-with `-z` an empty <oldvalue> is considered missing.
-
 If all <ref>s can be locked with matching <oldvalue>s
 simultaneously, all modifications are performed.  Otherwise, no
 modifications are performed.  Note that while each individual
diff --git a/Documentation/git-verify-commit.txt b/Documentation/git-verify-commit.txt
new file mode 100644
index 0000000..9413e28
--- /dev/null
+++ b/Documentation/git-verify-commit.txt
@@ -0,0 +1,28 @@
+git-verify-commit(1)
+====================
+
+NAME
+----
+git-verify-commit - Check the GPG signature of commits
+
+SYNOPSIS
+--------
+[verse]
+'git verify-commit' <commit>...
+
+DESCRIPTION
+-----------
+Validates the gpg signature created by 'git commit -S'.
+
+OPTIONS
+-------
+-v::
+--verbose::
+	Print the contents of the commit object before validating it.
+
+<commit>...::
+	SHA-1 identifiers of Git commit objects.
+
+GIT
+---
+Part of the linkgit:git[1] suite
diff --git a/Documentation/git-web--browse.txt b/Documentation/git-web--browse.txt
index 2de575f..16ede5b 100644
--- a/Documentation/git-web--browse.txt
+++ b/Documentation/git-web--browse.txt
@@ -62,7 +62,7 @@
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 The web browser can be specified using a configuration variable passed
-with the -c (or --config) command line option, or the 'web.browser'
+with the -c (or --config) command-line option, or the 'web.browser'
 configuration variable if the former is not used.
 
 browser.<tool>.path
@@ -87,7 +87,7 @@
 Note about konqueror
 --------------------
 
-When 'konqueror' is specified by a command line option or a
+When 'konqueror' is specified by a command-line option or a
 configuration variable, we launch 'kfmclient' to try to open the HTML
 man page on an already opened konqueror in a new tab if possible.
 
diff --git a/Documentation/git.txt b/Documentation/git.txt
index cd50977..9202010 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -22,14 +22,14 @@
 and full access to internals.
 
 See linkgit:gittutorial[7] to get started, then see
-link:everyday.html[Everyday Git] for a useful minimum set of
+linkgit:giteveryday[7] for a useful minimum set of
 commands.  The link:user-manual.html[Git User's Manual] has a more
 in-depth introduction.
 
 After you mastered the basic concepts, you can come back to this
 page to learn what commands Git offers.  You can learn more about
 individual Git commands with "git help command".  linkgit:gitcli[7]
-manual page gives you an overview of the command line command syntax.
+manual page gives you an overview of the command-line command syntax.
 
 Formatted and hyperlinked version of the latest Git documentation
 can be viewed at `http://git-htmldocs.googlecode.com/git/git.html`.
@@ -39,10 +39,18 @@
 ============
 
 You are reading the documentation for the latest (possibly
-unreleased) version of Git, that is available from 'master'
+unreleased) version of Git, that is available from the 'master'
 branch of the `git.git` repository.
 Documentation for older releases are available here:
 
+* link:v2.1.3/git.html[documentation for release 2.1.3]
+
+* release notes for
+  link:RelNotes/2.1.3.txt[2.1.3],
+  link:RelNotes/2.1.2.txt[2.1.2],
+  link:RelNotes/2.1.1.txt[2.1.1],
+  link:RelNotes/2.1.0.txt[2.1].
+
 * link:v2.0.4/git.html[documentation for release 2.0.4]
 
 * release notes for
@@ -447,6 +455,11 @@
 	given will override values from configuration files.
 	The <name> is expected in the same format as listed by
 	'git config' (subkeys separated by dots).
++
+Note that omitting the `=` in `git -c foo.bar ...` is allowed and sets
+`foo.bar` to the boolean true value (just like `[foo]bar` would in a
+config file). Including the equals but with an empty value (like `git -c
+foo.bar= ...`) sets `foo.bar` to the empty string.
 
 --exec-path[=<path>]::
 	Path to wherever your core Git programs are installed.
@@ -759,7 +772,7 @@
 
 'GIT_WORK_TREE'::
 	Set the path to the root of the working tree.
-	This can also be controlled by the '--work-tree' command line
+	This can also be controlled by the '--work-tree' command-line
 	option and the core.worktree configuration variable.
 
 'GIT_NAMESPACE'::
@@ -884,7 +897,7 @@
 'GIT_ASKPASS'::
 	If this environment variable is set, then Git commands which need to
 	acquire passwords or passphrases (e.g. for HTTP or IMAP authentication)
-	will call this program with a suitable prompt as command line argument
+	will call this program with a suitable prompt as command-line argument
 	and read the password from its STDOUT. See also the 'core.askpass'
 	option in linkgit:git-config[1].
 
@@ -908,31 +921,54 @@
 	based on whether stdout appears to be redirected to a file or not.
 
 'GIT_TRACE'::
-	If this variable is set to "1", "2" or "true" (comparison
-	is case insensitive), Git will print `trace:` messages on
-	stderr telling about alias expansion, built-in command
-	execution and external command execution.
-	If this variable is set to an integer value greater than 1
-	and lower than 10 (strictly) then Git will interpret this
-	value as an open file descriptor and will try to write the
-	trace messages into this file descriptor.
-	Alternatively, if this variable is set to an absolute path
-	(starting with a '/' character), Git will interpret this
-	as a file path and will try to write the trace messages
-	into it.
+	Enables general trace messages, e.g. alias expansion, built-in
+	command execution and external command execution.
++
+If this variable is set to "1", "2" or "true" (comparison
+is case insensitive), trace messages will be printed to
+stderr.
++
+If the variable is set to an integer value greater than 2
+and lower than 10 (strictly) then Git will interpret this
+value as an open file descriptor and will try to write the
+trace messages into this file descriptor.
++
+Alternatively, if the variable is set to an absolute path
+(starting with a '/' character), Git will interpret this
+as a file path and will try to write the trace messages
+into it.
++
+Unsetting the variable, or setting it to empty, "0" or
+"false" (case insensitive) disables trace messages.
 
 'GIT_TRACE_PACK_ACCESS'::
-	If this variable is set to a path, a file will be created at
-	the given path logging all accesses to any packs. For each
+	Enables trace messages for all accesses to any packs. For each
 	access, the pack file name and an offset in the pack is
 	recorded. This may be helpful for troubleshooting some
 	pack-related performance problems.
+	See 'GIT_TRACE' for available trace output options.
 
 'GIT_TRACE_PACKET'::
-	If this variable is set, it shows a trace of all packets
-	coming in or out of a given program. This can help with
-	debugging object negotiation or other protocol issues. Tracing
-	is turned off at a packet starting with "PACK".
+	Enables trace messages for all packets coming in or out of a
+	given program. This can help with debugging object negotiation
+	or other protocol issues. Tracing is turned off at a packet
+	starting with "PACK".
+	See 'GIT_TRACE' for available trace output options.
+
+'GIT_TRACE_PERFORMANCE'::
+	Enables performance related trace messages, e.g. total execution
+	time of each Git command.
+	See 'GIT_TRACE' for available trace output options.
+
+'GIT_TRACE_SETUP'::
+	Enables trace messages printing the .git, working tree and current
+	working directory after Git has completed its setup phase.
+	See 'GIT_TRACE' for available trace output options.
+
+'GIT_TRACE_SHALLOW'::
+	Enables trace messages that can help debugging fetching /
+	cloning of shallow repositories.
+	See 'GIT_TRACE' for available trace output options.
 
 GIT_LITERAL_PATHSPECS::
 	Setting this variable to `1` will cause Git to treat all
@@ -1063,7 +1099,7 @@
 SEE ALSO
 --------
 linkgit:gittutorial[7], linkgit:gittutorial-2[7],
-link:everyday.html[Everyday Git], linkgit:gitcvs-migration[7],
+linkgit:giteveryday[7], linkgit:gitcvs-migration[7],
 linkgit:gitglossary[7], linkgit:gitcore-tutorial[7],
 linkgit:gitcli[7], link:user-manual.html[The Git User's Manual],
 linkgit:gitworkflows[7]
diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
index 643c1ba..c892ffa 100644
--- a/Documentation/gitattributes.txt
+++ b/Documentation/gitattributes.txt
@@ -440,8 +440,8 @@
 
 	A path to which the `diff` attribute is unspecified
 	first gets its contents inspected, and if it looks like
-	text, it is treated as text.  Otherwise it would
-	generate `Binary files differ`.
+	text and is smaller than core.bigFileThreshold, it is treated
+	as text. Otherwise it would generate `Binary files differ`.
 
 String::
 
@@ -665,7 +665,7 @@
 may want to override its decision, either because a blob contains binary
 data later in the file, or because the content, while technically
 composed of text characters, is opaque to a human reader. For example,
-many postscript files contain only ascii characters, but produce noisy
+many postscript files contain only ASCII characters, but produce noisy
 and meaningless diffs.
 
 The simplest way to mark a file as binary is to unset the diff
@@ -680,7 +680,7 @@
 
 However, one may also want to specify other diff driver attributes. For
 example, you might want to use `textconv` to convert postscript files to
-an ascii representation for human viewing, but otherwise treat them as
+an ASCII representation for human viewing, but otherwise treat them as
 binary files. You cannot specify both `-diff` and `diff=ps` attributes.
 The solution is to use the `diff.*.binary` config option:
 
diff --git a/Documentation/gitcli.txt b/Documentation/gitcli.txt
index 1c3e109..dfe7d83 100644
--- a/Documentation/gitcli.txt
+++ b/Documentation/gitcli.txt
@@ -3,7 +3,7 @@
 
 NAME
 ----
-gitcli - Git command line interface and conventions
+gitcli - Git command-line interface and conventions
 
 SYNOPSIS
 --------
@@ -66,13 +66,13 @@
 Here are the rules regarding the "flags" that you should follow when you are
 scripting Git:
 
- * it's preferred to use the non dashed form of Git commands, which means that
+ * it's preferred to use the non-dashed form of Git commands, which means that
    you should prefer `git foo` to `git-foo`.
 
  * splitting short options to separate words (prefer `git foo -a -b`
    to `git foo -ab`, the latter may not even work).
 
- * when a command line option takes an argument, use the 'stuck' form.  In
+ * when a command-line option takes an argument, use the 'stuck' form.  In
    other words, write `git foo -oArg` instead of `git foo -o Arg` for short
    options, and `git foo --long-opt=Arg` instead of `git foo --long-opt Arg`
    for long options.  An option that takes optional option-argument must be
@@ -103,7 +103,7 @@
 Magic Options
 ~~~~~~~~~~~~~
 Commands which have the enhanced option parser activated all understand a
-couple of magic command line options:
+couple of magic command-line options:
 
 -h::
 	gives a pretty printed usage of the command.
diff --git a/Documentation/gitcore-tutorial.txt b/Documentation/gitcore-tutorial.txt
index d2d7c21..8475c07 100644
--- a/Documentation/gitcore-tutorial.txt
+++ b/Documentation/gitcore-tutorial.txt
@@ -1667,7 +1667,7 @@
 linkgit:gittutorial-2[7],
 linkgit:gitcvs-migration[7],
 linkgit:git-help[1],
-link:everyday.html[Everyday git],
+linkgit:giteveryday[7],
 link:user-manual.html[The Git User's Manual]
 
 GIT
diff --git a/Documentation/gitcvs-migration.txt b/Documentation/gitcvs-migration.txt
index 5f4e890..b06e852 100644
--- a/Documentation/gitcvs-migration.txt
+++ b/Documentation/gitcvs-migration.txt
@@ -194,7 +194,7 @@
 linkgit:gittutorial-2[7],
 linkgit:gitcore-tutorial[7],
 linkgit:gitglossary[7],
-link:everyday.html[Everyday Git],
+linkgit:giteveryday[7],
 link:user-manual.html[The Git User's Manual]
 
 GIT
diff --git a/Documentation/giteveryday.txt b/Documentation/giteveryday.txt
new file mode 100644
index 0000000..7be6e64
--- /dev/null
+++ b/Documentation/giteveryday.txt
@@ -0,0 +1,455 @@
+giteveryday(7)
+===============
+
+NAME
+----
+giteveryday - A useful minimum set of commands for Everyday Git
+
+SYNOPSIS
+--------
+
+Everyday Git With 20 Commands Or So
+
+DESCRIPTION
+-----------
+
+Git users can broadly be grouped into four categories for the purposes of
+describing here a small set of useful command for everyday Git.
+
+*	<<STANDALONE,Individual Developer (Standalone)>> commands are essential
+	for anybody who makes a commit, even for somebody who works alone.
+
+*	If you work with other people, you will need commands listed in
+	the <<PARTICIPANT,Individual Developer (Participant)>> section as well.
+
+*	People who play the <<INTEGRATOR,Integrator>> role need to learn some
+	more commands in addition to the above.
+
+*	<<ADMINISTRATION,Repository Administration>> commands are for system
+	administrators who are responsible for the care and feeding
+	of Git repositories.
+
+
+Individual Developer (Standalone)[[STANDALONE]]
+-----------------------------------------------
+
+A standalone individual developer does not exchange patches with
+other people, and works alone in a single repository, using the
+following commands.
+
+  * linkgit:git-init[1] to create a new repository.
+
+  * linkgit:git-log[1] to see what happened.
+
+  * linkgit:git-checkout[1] and linkgit:git-branch[1] to switch
+    branches.
+
+  * linkgit:git-add[1] to manage the index file.
+
+  * linkgit:git-diff[1] and linkgit:git-status[1] to see what
+    you are in the middle of doing.
+
+  * linkgit:git-commit[1] to advance the current branch.
+
+  * linkgit:git-reset[1] and linkgit:git-checkout[1] (with
+    pathname parameters) to undo changes.
+
+  * linkgit:git-merge[1] to merge between local branches.
+
+  * linkgit:git-rebase[1] to maintain topic branches.
+
+  * linkgit:git-tag[1] to mark a known point.
+
+Examples
+~~~~~~~~
+
+Use a tarball as a starting point for a new repository.::
++
+------------
+$ tar zxf frotz.tar.gz
+$ cd frotz
+$ git init
+$ git add . <1>
+$ git commit -m "import of frotz source tree."
+$ git tag v2.43 <2>
+------------
++
+<1> add everything under the current directory.
+<2> make a lightweight, unannotated tag.
+
+Create a topic branch and develop.::
++
+------------
+$ git checkout -b alsa-audio <1>
+$ edit/compile/test
+$ git checkout -- curses/ux_audio_oss.c <2>
+$ git add curses/ux_audio_alsa.c <3>
+$ edit/compile/test
+$ git diff HEAD <4>
+$ git commit -a -s <5>
+$ edit/compile/test
+$ git diff HEAD^ <6>
+$ git commit -a --amend <7>
+$ git checkout master <8>
+$ git merge alsa-audio <9>
+$ git log --since='3 days ago' <10>
+$ git log v2.43.. curses/ <11>
+------------
++
+<1> create a new topic branch.
+<2> revert your botched changes in `curses/ux_audio_oss.c`.
+<3> you need to tell Git if you added a new file; removal and
+modification will be caught if you do `git commit -a` later.
+<4> to see what changes you are committing.
+<5> commit everything, as you have tested, with your sign-off.
+<6> look at all your changes including the previous commit.
+<7> amend the previous commit, adding all your new changes,
+using your original message.
+<8> switch to the master branch.
+<9> merge a topic branch into your master branch.
+<10> review commit logs; other forms to limit output can be
+combined and include `-10` (to show up to 10 commits),
+`--until=2005-12-10`, etc.
+<11> view only the changes that touch what's in `curses/`
+directory, since `v2.43` tag.
+
+
+Individual Developer (Participant)[[PARTICIPANT]]
+-------------------------------------------------
+
+A developer working as a participant in a group project needs to
+learn how to communicate with others, and uses these commands in
+addition to the ones needed by a standalone developer.
+
+  * linkgit:git-clone[1] from the upstream to prime your local
+    repository.
+
+  * linkgit:git-pull[1] and linkgit:git-fetch[1] from "origin"
+    to keep up-to-date with the upstream.
+
+  * linkgit:git-push[1] to shared repository, if you adopt CVS
+    style shared repository workflow.
+
+  * linkgit:git-format-patch[1] to prepare e-mail submission, if
+    you adopt Linux kernel-style public forum workflow.
+
+  * linkgit:git-send-email[1] to send your e-mail submission without
+    corruption by your MUA.
+
+  * linkgit:git-request-pull[1] to create a summary of changes
+    for your upstream to pull.
+
+
+Examples
+~~~~~~~~
+
+Clone the upstream and work on it.  Feed changes to upstream.::
++
+------------
+$ git clone git://git.kernel.org/pub/scm/.../torvalds/linux-2.6 my2.6
+$ cd my2.6
+$ git checkout -b mine master <1>
+$ edit/compile/test; git commit -a -s <2>
+$ git format-patch master <3>
+$ git send-email --to="person <email@example.com>" 00*.patch <4>
+$ git checkout master <5>
+$ git pull <6>
+$ git log -p ORIG_HEAD.. arch/i386 include/asm-i386 <7>
+$ git ls-remote --heads http://git.kernel.org/.../jgarzik/libata-dev.git <8>
+$ git pull git://git.kernel.org/pub/.../jgarzik/libata-dev.git ALL <9>
+$ git reset --hard ORIG_HEAD <10>
+$ git gc <11>
+------------
++
+<1> checkout a new branch `mine` from master.
+<2> repeat as needed.
+<3> extract patches from your branch, relative to master,
+<4> and email them.
+<5> return to `master`, ready to see what's new
+<6> `git pull` fetches from `origin` by default and merges into the
+current branch.
+<7> immediately after pulling, look at the changes done upstream
+since last time we checked, only in the
+area we are interested in.
+<8> check the branch names in an external repository (if not known).
+<9> fetch from a specific branch `ALL` from a specific repository
+and merge it.
+<10> revert the pull.
+<11> garbage collect leftover objects from reverted pull.
+
+
+Push into another repository.::
++
+------------
+satellite$ git clone mothership:frotz frotz <1>
+satellite$ cd frotz
+satellite$ git config --get-regexp '^(remote|branch)\.' <2>
+remote.origin.url mothership:frotz
+remote.origin.fetch refs/heads/*:refs/remotes/origin/*
+branch.master.remote origin
+branch.master.merge refs/heads/master
+satellite$ git config remote.origin.push \
+	   +refs/heads/*:refs/remotes/satellite/* <3>
+satellite$ edit/compile/test/commit
+satellite$ git push origin <4>
+
+mothership$ cd frotz
+mothership$ git checkout master
+mothership$ git merge satellite/master <5>
+------------
++
+<1> mothership machine has a frotz repository under your home
+directory; clone from it to start a repository on the satellite
+machine.
+<2> clone sets these configuration variables by default.
+It arranges `git pull` to fetch and store the branches of mothership
+machine to local `remotes/origin/*` remote-tracking branches.
+<3> arrange `git push` to push all local branches to
+their corresponding branch of the mothership machine.
+<4> push will stash all our work away on `remotes/satellite/*`
+remote-tracking branches on the mothership machine.  You could use this
+as a back-up method. Likewise, you can pretend that mothership
+"fetched" from you (useful when access is one sided).
+<5> on mothership machine, merge the work done on the satellite
+machine into the master branch.
+
+Branch off of a specific tag.::
++
+------------
+$ git checkout -b private2.6.14 v2.6.14 <1>
+$ edit/compile/test; git commit -a
+$ git checkout master
+$ git cherry-pick v2.6.14..private2.6.14 <2>
+------------
++
+<1> create a private branch based on a well known (but somewhat behind)
+tag.
+<2> forward port all changes in `private2.6.14` branch to `master` branch
+without a formal "merging". Or longhand +
+`git format-patch -k -m --stdout v2.6.14..private2.6.14 |
+  git am -3 -k`
+
+An alternate participant submission mechanism is using the
+`git request-pull` or pull-request mechanisms (e.g as used on
+GitHub (www.github.com) to notify your upstream of your
+contribution.
+
+Integrator[[INTEGRATOR]]
+------------------------
+
+A fairly central person acting as the integrator in a group
+project receives changes made by others, reviews and integrates
+them and publishes the result for others to use, using these
+commands in addition to the ones needed by participants.
+
+This section can also be used by those who respond to `git
+request-pull` or pull-request on GitHub (www.github.com) to
+integrate the work of others into their history. An sub-area
+lieutenant for a repository will act both as a participant and
+as an integrator.
+
+
+  * linkgit:git-am[1] to apply patches e-mailed in from your
+    contributors.
+
+  * linkgit:git-pull[1] to merge from your trusted lieutenants.
+
+  * linkgit:git-format-patch[1] to prepare and send suggested
+    alternative to contributors.
+
+  * linkgit:git-revert[1] to undo botched commits.
+
+  * linkgit:git-push[1] to publish the bleeding edge.
+
+
+Examples
+~~~~~~~~
+
+A typical integrator's Git day.::
++
+------------
+$ git status <1>
+$ git branch --no-merged master <2>
+$ mailx <3>
+& s 2 3 4 5 ./+to-apply
+& s 7 8 ./+hold-linus
+& q
+$ git checkout -b topic/one master
+$ git am -3 -i -s ./+to-apply <4>
+$ compile/test
+$ git checkout -b hold/linus && git am -3 -i -s ./+hold-linus <5>
+$ git checkout topic/one && git rebase master <6>
+$ git checkout pu && git reset --hard next <7>
+$ git merge topic/one topic/two && git merge hold/linus <8>
+$ git checkout maint
+$ git cherry-pick master~4 <9>
+$ compile/test
+$ git tag -s -m "GIT 0.99.9x" v0.99.9x <10>
+$ git fetch ko && for branch in master maint next pu <11>
+    do
+	git show-branch ko/$branch $branch <12>
+    done
+$ git push --follow-tags ko <13>
+------------
++
+<1> see what you were in the middle of doing, if anything.
+<2> see which branches haven't been merged into `master` yet.
+Likewise for any other integration branches e.g. `maint`, `next`
+and `pu` (potential updates).
+<3> read mails, save ones that are applicable, and save others
+that are not quite ready (other mail readers are available).
+<4> apply them, interactively, with your sign-offs.
+<5> create topic branch as needed and apply, again with sign-offs.
+<6> rebase internal topic branch that has not been merged to the
+master or exposed as a part of a stable branch.
+<7> restart `pu` every time from the next.
+<8> and bundle topic branches still cooking.
+<9> backport a critical fix.
+<10> create a signed tag.
+<11> make sure master was not accidentally rewound beyond that
+already pushed out.  `ko` shorthand points at the Git maintainer's
+repository at kernel.org, and looks like this:
++
+------------
+(in .git/config)
+[remote "ko"]
+	url = kernel.org:/pub/scm/git/git.git
+	fetch = refs/heads/*:refs/remotes/ko/*
+	push = refs/heads/master
+	push = refs/heads/next
+	push = +refs/heads/pu
+	push = refs/heads/maint
+------------
++
+<12> In the output from `git show-branch`, `master` should have
+everything `ko/master` has, and `next` should have
+everything `ko/next` has, etc.
+<13> push out the bleeding edge, together with new tags that point
+into the pushed history.
+
+
+Repository Administration[[ADMINISTRATION]]
+-------------------------------------------
+
+A repository administrator uses the following tools to set up
+and maintain access to the repository by developers.
+
+  * linkgit:git-daemon[1] to allow anonymous download from
+    repository.
+
+  * linkgit:git-shell[1] can be used as a 'restricted login shell'
+    for shared central repository users.
+
+  * linkgit:git-http-backend[1] provides a server side implementation
+    of Git-over-HTTP ("Smart http") allowing both fetch and push services.
+
+  * linkgit:gitweb[1] provides a web front-end to Git repositories,
+    which can be set-up using the linkgit:git-instaweb[1] script.
+
+link:howto/update-hook-example.html[update hook howto] has a good
+example of managing a shared central repository.
+
+In addition there are a number of other widely deployed hosting, browsing
+and reviewing solutions such as:
+
+  * gitolite, gerrit code review, cgit and others.
+
+Examples
+~~~~~~~~
+We assume the following in /etc/services::
++
+------------
+$ grep 9418 /etc/services
+git		9418/tcp		# Git Version Control System
+------------
+
+Run git-daemon to serve /pub/scm from inetd.::
++
+------------
+$ grep git /etc/inetd.conf
+git	stream	tcp	nowait	nobody \
+  /usr/bin/git-daemon git-daemon --inetd --export-all /pub/scm
+------------
++
+The actual configuration line should be on one line.
+
+Run git-daemon to serve /pub/scm from xinetd.::
++
+------------
+$ cat /etc/xinetd.d/git-daemon
+# default: off
+# description: The Git server offers access to Git repositories
+service git
+{
+	disable = no
+	type            = UNLISTED
+	port            = 9418
+	socket_type     = stream
+	wait            = no
+	user            = nobody
+	server          = /usr/bin/git-daemon
+	server_args     = --inetd --export-all --base-path=/pub/scm
+	log_on_failure  += USERID
+}
+------------
++
+Check your xinetd(8) documentation and setup, this is from a Fedora system.
+Others might be different.
+
+Give push/pull only access to developers using git-over-ssh.::
+
+e.g. those using:
+`$ git push/pull ssh://host.xz/pub/scm/project`
++
+------------
+$ grep git /etc/passwd <1>
+alice:x:1000:1000::/home/alice:/usr/bin/git-shell
+bob:x:1001:1001::/home/bob:/usr/bin/git-shell
+cindy:x:1002:1002::/home/cindy:/usr/bin/git-shell
+david:x:1003:1003::/home/david:/usr/bin/git-shell
+$ grep git /etc/shells <2>
+/usr/bin/git-shell
+------------
++
+<1> log-in shell is set to /usr/bin/git-shell, which does not
+allow anything but `git push` and `git pull`.  The users require
+ssh access to the machine.
+<2> in many distributions /etc/shells needs to list what is used
+as the login shell.
+
+CVS-style shared repository.::
++
+------------
+$ grep git /etc/group <1>
+git:x:9418:alice,bob,cindy,david
+$ cd /home/devo.git
+$ ls -l <2>
+  lrwxrwxrwx   1 david git    17 Dec  4 22:40 HEAD -> refs/heads/master
+  drwxrwsr-x   2 david git  4096 Dec  4 22:40 branches
+  -rw-rw-r--   1 david git    84 Dec  4 22:40 config
+  -rw-rw-r--   1 david git    58 Dec  4 22:40 description
+  drwxrwsr-x   2 david git  4096 Dec  4 22:40 hooks
+  -rw-rw-r--   1 david git 37504 Dec  4 22:40 index
+  drwxrwsr-x   2 david git  4096 Dec  4 22:40 info
+  drwxrwsr-x   4 david git  4096 Dec  4 22:40 objects
+  drwxrwsr-x   4 david git  4096 Nov  7 14:58 refs
+  drwxrwsr-x   2 david git  4096 Dec  4 22:40 remotes
+$ ls -l hooks/update <3>
+  -r-xr-xr-x   1 david git  3536 Dec  4 22:40 update
+$ cat info/allowed-users <4>
+refs/heads/master	alice\|cindy
+refs/heads/doc-update	bob
+refs/tags/v[0-9]*	david
+------------
++
+<1> place the developers into the same git group.
+<2> and make the shared repository writable by the group.
+<3> use update-hook example by Carl from Documentation/howto/
+for branch policy control.
+<4> alice and cindy can push into master, only bob can push into doc-update.
+david is the release manager and is the only person who can
+create and push version tags.
+
+GIT
+---
+Part of the linkgit:git[1] suite
diff --git a/Documentation/gitglossary.txt b/Documentation/gitglossary.txt
index e52de7d..212e254 100644
--- a/Documentation/gitglossary.txt
+++ b/Documentation/gitglossary.txt
@@ -19,7 +19,7 @@
 linkgit:gittutorial[7],
 linkgit:gittutorial-2[7],
 linkgit:gitcvs-migration[7],
-link:everyday.html[Everyday Git],
+linkgit:giteveryday[7],
 link:user-manual.html[The Git User's Manual]
 
 GIT
diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt
index d954bf6..9ef2469 100644
--- a/Documentation/githooks.txt
+++ b/Documentation/githooks.txt
@@ -175,7 +175,7 @@
 
 This hook can be used in conjunction with a corresponding pre-commit hook to
 save and restore any form of metadata associated with the working tree
-(eg: permissions/ownership, ACLS, etc).  See contrib/hooks/setgitperms.perl
+(e.g.: permissions/ownership, ACLS, etc).  See contrib/hooks/setgitperms.perl
 for an example of how to do this.
 
 pre-push
diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt
index 8734c15..09e82c3 100644
--- a/Documentation/gitignore.txt
+++ b/Documentation/gitignore.txt
@@ -77,7 +77,7 @@
    Put a backslash ("`\`") in front of the first hash for patterns
    that begin with a hash.
 
- - Trailing spaces are ignored unless they are quoted with backlash
+ - Trailing spaces are ignored unless they are quoted with backslash
    ("`\`").
 
  - An optional prefix "`!`" which negates the pattern; any
diff --git a/Documentation/gitk.txt b/Documentation/gitk.txt
index 7e03fcc..7ae50aa 100644
--- a/Documentation/gitk.txt
+++ b/Documentation/gitk.txt
@@ -27,7 +27,7 @@
 
 gitk generally only understands options with arguments in the
 'sticked' form (see linkgit:gitcli[7]) due to limitations in the
-command line parser.
+command-line parser.
 
 rev-list options and arguments
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/Documentation/gitrepository-layout.txt b/Documentation/gitrepository-layout.txt
index 17d2ea6..79653f3 100644
--- a/Documentation/gitrepository-layout.txt
+++ b/Documentation/gitrepository-layout.txt
@@ -155,6 +155,10 @@
 	The current index file for the repository.  It is
 	usually not found in a bare repository.
 
+sharedindex.<SHA-1>::
+	The shared index part, to be referenced by $GIT_DIR/index and
+	other temporary index files. Only valid in split index mode.
+
 info::
 	Additional information about the repository is recorded
 	in this directory.
diff --git a/Documentation/gittutorial-2.txt b/Documentation/gittutorial-2.txt
index 3109ea8..f6fbf81 100644
--- a/Documentation/gittutorial-2.txt
+++ b/Documentation/gittutorial-2.txt
@@ -403,7 +403,7 @@
 
 At this point you should know everything necessary to read the man
 pages for any of the git commands; one good place to start would be
-with the commands mentioned in link:everyday.html[Everyday Git].  You
+with the commands mentioned in linkgit:giteveryday[7].  You
 should be able to find any unknown jargon in linkgit:gitglossary[7].
 
 The link:user-manual.html[Git User's Manual] provides a more
@@ -427,7 +427,7 @@
 linkgit:gitcore-tutorial[7],
 linkgit:gitglossary[7],
 linkgit:git-help[1],
-link:everyday.html[Everyday Git],
+linkgit:giteveryday[7],
 link:user-manual.html[The Git User's Manual]
 
 GIT
diff --git a/Documentation/gittutorial.txt b/Documentation/gittutorial.txt
index 8262196..af9f709 100644
--- a/Documentation/gittutorial.txt
+++ b/Documentation/gittutorial.txt
@@ -656,7 +656,7 @@
   * linkgit:gitworkflows[7]: Gives an overview of recommended
     workflows.
 
-  * link:everyday.html[Everyday Git with 20 Commands Or So]
+  * linkgit:giteveryday[7]: Everyday Git with 20 Commands Or So.
 
   * linkgit:gitcvs-migration[7]: Git for CVS users.
 
@@ -668,7 +668,7 @@
 linkgit:gitglossary[7],
 linkgit:git-help[1],
 linkgit:gitworkflows[7],
-link:everyday.html[Everyday Git],
+linkgit:giteveryday[7],
 link:user-manual.html[The Git User's Manual]
 
 GIT
diff --git a/Documentation/gitweb.conf.txt b/Documentation/gitweb.conf.txt
index 952f503..ebe7a6c 100644
--- a/Documentation/gitweb.conf.txt
+++ b/Documentation/gitweb.conf.txt
@@ -904,7 +904,7 @@
 	$feature{'snapshot'}{'override'} = 1;
 
 If you allow overriding for the snapshot feature, you can specify which
-snapshot formats are globally disabled. You can also add any command line
+snapshot formats are globally disabled. You can also add any command-line
 options you want (such as setting the compression level). For instance, you
 can disable Zip compressed snapshots and set *gzip*(1) to run at level 6 by
 adding the following lines to your gitweb configuration file:
diff --git a/Documentation/glossary-content.txt b/Documentation/glossary-content.txt
index 4e0b971..bf383c2 100644
--- a/Documentation/glossary-content.txt
+++ b/Documentation/glossary-content.txt
@@ -329,7 +329,7 @@
 signature" letters (which optionally is terminated by another colon `:`),
 and the remainder is the pattern to match against the path.
 The "magic signature" consists of ASCII symbols that are neither
-alphanumeric, glob, regex special charaters nor colon.
+alphanumeric, glob, regex special characters nor colon.
 The optional colon that terminates the "magic signature" can be
 omitted if the pattern begins with a character that does not belong to
 "magic signature" symbol set and is not a colon.
diff --git a/Documentation/howto/keep-canonical-history-correct.txt b/Documentation/howto/keep-canonical-history-correct.txt
new file mode 100644
index 0000000..35d48ef
--- /dev/null
+++ b/Documentation/howto/keep-canonical-history-correct.txt
@@ -0,0 +1,216 @@
+From: Junio C Hamano <gitster@pobox.com>
+Date: Wed, 07 May 2014 13:15:39 -0700
+Subject: Beginner question on "Pull is mostly evil"
+Abstract: This how-to explains a method for keeping a
+ project's history correct when using git pull.
+Content-type: text/asciidoc
+
+Keep authoritative canonical history correct with git pull
+==========================================================
+
+Sometimes a new project integrator will end up with project history
+that appears to be "backwards" from what other project developers
+expect. This howto presents a suggested integration workflow for
+maintaining a central repository.
+
+Suppose that that central repository has this history:
+
+------------
+    ---o---o---A
+------------
+
+which ends at commit `A` (time flows from left to right and each node
+in the graph is a commit, lines between them indicating parent-child
+relationship).
+
+Then you clone it and work on your own commits, which leads you to
+have this history in *your* repository:
+
+------------
+    ---o---o---A---B---C
+------------
+
+Imagine your coworker did the same and built on top of `A` in *his*
+repository in the meantime, and then pushed it to the
+central repository:
+
+------------
+    ---o---o---A---X---Y---Z
+------------
+
+Now, if you `git push` at this point, because your history that leads
+to `C` lacks `X`, `Y` and `Z`, it will fail.  You need to somehow make
+the tip of your history a descendant of `Z`.
+
+One suggested way to solve the problem is "fetch and then merge", aka
+`git pull`. When you fetch, your repository will have a history like
+this:
+
+------------
+    ---o---o---A---B---C
+		\
+		 X---Y---Z
+------------
+
+Once you run merge after that, while still on *your* branch, i.e. `C`,
+you will create a merge `M` and make the history look like this:
+
+------------
+    ---o---o---A---B---C---M
+		\         /
+		 X---Y---Z
+------------
+
+`M` is a descendant of `Z`, so you can push to update the central
+repository.  Such a merge `M` does not lose any commit in both
+histories, so in that sense it may not be wrong, but when people want
+to talk about "the authoritative canonical history that is shared
+among the project participants", i.e. "the trunk", they often view
+it as "commits you see by following the first-parent chain", and use
+this command to view it:
+
+------------
+    $ git log --first-parent
+------------
+
+For all other people who observed the central repository after your
+coworker pushed `Z` but before you pushed `M`, the commit on the trunk
+used to be `o-o-A-X-Y-Z`.  But because you made `M` while you were on
+`C`, `M`'s first parent is `C`, so by pushing `M` to advance the
+central repository, you made `X-Y-Z` a side branch, not on the trunk.
+
+You would rather want to have a history of this shape:
+
+------------
+    ---o---o---A---X---Y---Z---M'
+		\             /
+		 B-----------C
+------------
+
+so that in the first-parent chain, it is clear that the project first
+did `X` and then `Y` and then `Z` and merged a change that consists of
+two commits `B` and `C` that achieves a single goal.  You may have
+worked on fixing the bug #12345 with these two patches, and the merge
+`M'` with swapped parents can say in its log message "Merge
+fix-bug-12345". Having a way to tell `git pull` to create a merge
+but record the parents in reverse order may be a way to do so.
+
+Note that I said "achieves a single goal" above, because this is
+important.  "Swapping the merge order" only covers a special case
+where the project does not care too much about having unrelated
+things done on a single merge but cares a lot about first-parent
+chain.
+
+There are multiple schools of thought about the "trunk" management.
+
+ 1. Some projects want to keep a completely linear history without any
+    merges.  Obviously, swapping the merge order would not match their
+    taste.  You would need to flatten your history on top of the
+    updated upstream to result in a history of this shape instead:
++
+------------
+    ---o---o---A---X---Y---Z---B---C
+------------
++
+with `git pull --rebase` or something.
+
+ 2. Some projects tolerate merges in their history, but do not worry
+    too much about the first-parent order, and allow fast-forward
+    merges.  To them, swapping the merge order does not hurt, but
+    it is unnecessary.
+
+ 3. Some projects want each commit on the "trunk" to do one single
+    thing.  The output of `git log --first-parent` in such a project
+    would show either a merge of a side branch that completes a single
+    theme, or a single commit that completes a single theme by itself.
+    If your two commits `B` and `C` (or they may even be two groups of
+    commits) were solving two independent issues, then the merge `M'`
+    we made in the earlier example by swapping the merge order is
+    still not up to the project standard.  It merges two unrelated
+    efforts `B` and `C` at the same time.
+
+For projects in the last category (Git itself is one of them),
+individual developers would want to prepare a history more like
+this:
+
+------------
+		 C0--C1--C2     topic-c
+		/
+    ---o---o---A                master
+		\
+		 B0--B1--B2     topic-b
+------------
+
+That is, keeping separate topics on separate branches, perhaps like
+so:
+
+------------
+    $ git clone $URL work && cd work
+    $ git checkout -b topic-b master
+    $ ... work to create B0, B1 and B2 to complete one theme
+    $ git checkout -b topic-c master
+    $ ... same for the theme of topic-c
+------------
+
+And then
+
+------------
+    $ git checkout master
+    $ git pull --ff-only
+------------
+
+would grab `X`, `Y` and `Z` from the upstream and advance your master
+branch:
+
+------------
+		 C0--C1--C2     topic-c
+		/
+    ---o---o---A---X---Y---Z    master
+		\
+		 B0--B1--B2     topic-b
+------------
+
+And then you would merge these two branches separately:
+
+------------
+    $ git merge topic-b
+    $ git merge topic-c
+------------
+
+to result in
+
+------------
+		 C0--C1---------C2
+		/                 \
+    ---o---o---A---X---Y---Z---M---N
+		\             /
+		 B0--B1-----B2
+------------
+
+and push it back to the central repository.
+
+It is very much possible that while you are merging topic-b and
+topic-c, somebody again advanced the history in the central repository
+to put `W` on top of `Z`, and make your `git push` fail.
+
+In such a case, you would rewind to discard `M` and `N`, update the
+tip of your 'master' again and redo the two merges:
+
+------------
+    $ git reset --hard origin/master
+    $ git pull --ff-only
+    $ git merge topic-b
+    $ git merge topic-c
+------------
+
+The procedure will result in a history that looks like this:
+
+------------
+		 C0--C1--------------C2
+		/                     \
+    ---o---o---A---X---Y---Z---W---M'--N'
+		\                 /
+		 B0--B1---------B2
+------------
+
+See also http://git-blame.blogspot.com/2013/09/fun-with-first-parent-history.html
diff --git a/Documentation/howto/recover-corrupted-object-harder.txt b/Documentation/howto/recover-corrupted-object-harder.txt
index 6f33dac..23e685d 100644
--- a/Documentation/howto/recover-corrupted-object-harder.txt
+++ b/Documentation/howto/recover-corrupted-object-harder.txt
@@ -38,7 +38,7 @@
 Reading the zlib source code, I found that "incorrect data check" means
 that the adler-32 checksum at the end of the zlib data did not match the
 inflated data. So stepping the data through zlib would not help, as it
-did not fail until the very end, when we realize the crc does not match.
+did not fail until the very end, when we realize the CRC does not match.
 The problematic bytes could be anywhere in the object data.
 
 The first thing I did was pull the broken data out of the packfile. I
@@ -195,7 +195,7 @@
 -------
 
 I let it run to completion, and got a few more hits at the end (where it
-was munging the crc to match our broken data). So there was a good
+was munging the CRC to match our broken data). So there was a good
 chance this middle hit was the source of the problem.
 
 I confirmed by tweaking the byte in a hex editor, zlib inflating the
diff --git a/Documentation/howto/setup-git-server-over-http.txt b/Documentation/howto/setup-git-server-over-http.txt
index 6de4f3c..f44e5e9 100644
--- a/Documentation/howto/setup-git-server-over-http.txt
+++ b/Documentation/howto/setup-git-server-over-http.txt
@@ -181,7 +181,7 @@
 
    Most tests should pass.
 
-A command line tool to test WebDAV is cadaver. If you prefer GUIs, for
+A command-line tool to test WebDAV is cadaver. If you prefer GUIs, for
 example, konqueror can open WebDAV URLs as "webdav://..." or
 "webdavs://...".
 
diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
index 85d6353..dcf7429 100644
--- a/Documentation/pretty-formats.txt
+++ b/Documentation/pretty-formats.txt
@@ -95,7 +95,7 @@
 The author of fe6e0ee was Junio C Hamano, 23 hours ago
 The title was >>t4119: test autocomputing -p<n> for traditional diff input.<<
 
---------
+-------
 +
 The placeholders are:
 
@@ -115,19 +115,22 @@
 - '%aD': author date, RFC2822 style
 - '%ar': author date, relative
 - '%at': author date, UNIX timestamp
-- '%ai': author date, ISO 8601 format
+- '%ai': author date, ISO 8601-like format
+- '%aI': author date, strict ISO 8601 format
 - '%cn': committer name
 - '%cN': committer name (respecting .mailmap, see
   linkgit:git-shortlog[1] or linkgit:git-blame[1])
 - '%ce': committer email
 - '%cE': committer email (respecting .mailmap, see
   linkgit:git-shortlog[1] or linkgit:git-blame[1])
-- '%cd': committer date
+- '%cd': committer date (format respects --date= option)
 - '%cD': committer date, RFC2822 style
 - '%cr': committer date, relative
 - '%ct': committer date, UNIX timestamp
-- '%ci': committer date, ISO 8601 format
+- '%ci': committer date, ISO 8601-like format
+- '%cI': committer date, strict ISO 8601 format
 - '%d': ref names, like the --decorate option of linkgit:git-log[1]
+- '%D': ref names without the " (", ")" wrapping.
 - '%e': encoding
 - '%s': subject
 - '%f': sanitized subject line, suitable for a filename
@@ -182,8 +185,9 @@
 NOTE: Some placeholders may depend on other options given to the
 revision traversal engine. For example, the `%g*` reflog options will
 insert an empty string unless we are traversing reflog entries (e.g., by
-`git log -g`). The `%d` placeholder will use the "short" decoration
-format if `--decorate` was not already provided on the command line.
+`git log -g`). The `%d` and `%D` placeholders will use the "short"
+decoration format if `--decorate` was not already provided on the command
+line.
 
 If you add a `+` (plus sign) after '%' of a placeholder, a line-feed
 is inserted immediately before the expansion if and only if the
diff --git a/Documentation/pull-fetch-param.txt b/Documentation/pull-fetch-param.txt
index 18cffc2..1ebbf1d 100644
--- a/Documentation/pull-fetch-param.txt
+++ b/Documentation/pull-fetch-param.txt
@@ -12,9 +12,23 @@
 endif::git-pull[]
 
 <refspec>::
-	The format of a <refspec> parameter is an optional plus
-	`+`, followed by the source ref <src>, followed
-	by a colon `:`, followed by the destination ref <dst>.
+	Specifies which refs to fetch and which local refs to update.
+	When no <refspec>s appear on the command line, the refs to fetch
+	are read from `remote.<repository>.fetch` variables instead
+ifndef::git-pull[]
+	(see <<CRTB,CONFIGURED REMOTE-TRACKING BRANCHES>> below).
+endif::git-pull[]
+ifdef::git-pull[]
+	(see linkgit:git-fetch[1]).
+endif::git-pull[]
++
+The format of a <refspec> parameter is an optional plus
+`+`, followed by the source ref <src>, followed
+by a colon `:`, followed by the destination ref <dst>.
+The colon can be omitted when <dst> is empty.
++
+`tag <tag>` means the same as `refs/tags/<tag>:refs/tags/<tag>`;
+it requests fetching everything up to the given tag.
 +
 The remote ref that matches <src>
 is fetched, and if <dst> is not empty string, the local
@@ -24,55 +38,34 @@
 update.
 +
 [NOTE]
-If the remote branch from which you want to pull is
-modified in non-linear ways such as being rewound and
-rebased frequently, then a pull will attempt a merge with
-an older version of itself, likely conflict, and fail.
-It is under these conditions that you would want to use
-the `+` sign to indicate non-fast-forward updates will
-be needed.  There is currently no easy way to determine
-or declare that a branch will be made available in a
-repository with this behavior; the pulling user simply
+When the remote branch you want to fetch is known to
+be rewound and rebased regularly, it is expected that
+its new tip will not be descendant of its previous tip
+(as stored in your remote-tracking branch the last time
+you fetched).  You would want
+to use the `+` sign to indicate non-fast-forward updates
+will be needed for such branches.  There is no way to
+determine or declare that a branch will be made available
+in a repository with this behavior; the pulling user simply
 must know this is the expected usage pattern for a branch.
-+
-[NOTE]
-You never do your own development on branches that appear
-on the right hand side of a <refspec> colon on `Pull:` lines;
-they are to be updated by 'git fetch'.  If you intend to do
-development derived from a remote branch `B`, have a `Pull:`
-line to track it (i.e. `Pull: B:remote-B`), and have a separate
-branch `my-B` to do your development on top of it.  The latter
-is created by `git branch my-B remote-B` (or its equivalent `git
-checkout -b my-B remote-B`).  Run `git fetch` to keep track of
-the progress of the remote side, and when you see something new
-on the remote branch, merge it into your development branch with
-`git pull . remote-B`, while you are on `my-B` branch.
+ifdef::git-pull[]
 +
 [NOTE]
 There is a difference between listing multiple <refspec>
 directly on 'git pull' command line and having multiple
-`Pull:` <refspec> lines for a <repository> and running
+`remote.<repository>.fetch` entries in your configuration
+for a <repository> and running a
 'git pull' command without any explicit <refspec> parameters.
-<refspec> listed explicitly on the command line are always
+<refspec>s listed explicitly on the command line are always
 merged into the current branch after fetching.  In other words,
-if you list more than one remote refs, you would be making
-an Octopus.  While 'git pull' run without any explicit <refspec>
-parameter takes default <refspec>s from `Pull:` lines, it
-merges only the first <refspec> found into the current branch,
-after fetching all the remote refs.  This is because making an
+if you list more than one remote ref, 'git pull' will create
+an Octopus merge.  On the other hand, if you do not list any
+explicit <refspec> parameter on the command line, 'git pull'
+will fetch all the <refspec>s it finds in the
+`remote.<repository>.fetch` configuration and merge
+only the first <refspec> found into the current branch.
+This is because making an
 Octopus from remote refs is rarely done, while keeping track
 of multiple remote heads in one-go by fetching more than one
 is often useful.
-+
-Some short-cut notations are also supported.
-+
-* `tag <tag>` means the same as `refs/tags/<tag>:refs/tags/<tag>`;
-  it requests fetching everything up to the given tag.
-ifndef::git-pull[]
-* A parameter <ref> without a colon fetches that ref into FETCH_HEAD,
 endif::git-pull[]
-ifdef::git-pull[]
-* A parameter <ref> without a colon merges <ref> into the current
-  branch,
-endif::git-pull[]
-  and updates the remote-tracking branches (if any).
diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
index deb8cca..afccfdc 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -160,7 +160,7 @@
 	consider. Repetitions of this option accumulate exclusion patterns
 	up to the next `--all`, `--branches`, `--tags`, `--remotes`, or
 	`--glob` option (other options or arguments do not clear
-	accumlated patterns).
+	accumulated patterns).
 +
 The patterns given should not begin with `refs/heads`, `refs/tags`, or
 `refs/remotes` when applied to `--branches`, `--tags`, or `--remotes`,
@@ -168,6 +168,15 @@
 or `--all`. If a trailing '/{asterisk}' is intended, it must be given
 explicitly.
 
+--reflog::
+	Pretend as if all objects mentioned by reflogs are listed on the
+	command line as `<commit>`.
+
+--indexed-objects::
+	Pretend as if all trees and blobs used by the index are listed
+	on the command line.  Note that you probably want to use
+	`--objects`, too.
+
 --ignore-missing::
 	Upon seeing an invalid object name in the input, pretend as if
 	the bad input was not given.
@@ -677,7 +686,7 @@
 --relative-date::
 	Synonym for `--date=relative`.
 
---date=(relative|local|default|iso|rfc|short|raw)::
+--date=(relative|local|default|iso|iso-strict|rfc|short|raw)::
 	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.
@@ -687,7 +696,16 @@
 +
 `--date=local` shows timestamps in user's local time zone.
 +
-`--date=iso` (or `--date=iso8601`) shows timestamps in ISO 8601 format.
+`--date=iso` (or `--date=iso8601`) shows timestamps in a ISO 8601-like format.
+The differences to the strict ISO 8601 format are:
+
+	- a space instead of the `T` date/time delimiter
+	- a space between time and time zone
+	- no colon between hours and minutes of the time zone
+
++
+`--date=iso-strict` (or `--date=iso8601-strict`) shows timestamps in strict
+ISO 8601 format.
 +
 `--date=rfc` (or `--date=rfc2822`) shows timestamps in RFC 2822
 format, often found in email messages.
diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt
index 5a286d0..0796118 100644
--- a/Documentation/revisions.txt
+++ b/Documentation/revisions.txt
@@ -94,7 +94,9 @@
 '<branchname>@\{upstream\}', e.g. 'master@\{upstream\}', '@\{u\}'::
   The suffix '@\{upstream\}' to a branchname (short form '<branchname>@\{u\}')
   refers to the branch that the branch specified by branchname is set to build on
-  top of.  A missing branchname defaults to the current one.
+  top of (configured with `branch.<name>.remote` and
+  `branch.<name>.merge`).  A missing branchname defaults to the
+  current one.
 
 '<rev>{caret}', e.g. 'HEAD{caret}, v1.5.1{caret}0'::
   A suffix '{caret}' to a revision parameter means the first parent of
diff --git a/Documentation/technical/api-allocation-growing.txt b/Documentation/technical/api-allocation-growing.txt
index 542946b..5a59b54 100644
--- a/Documentation/technical/api-allocation-growing.txt
+++ b/Documentation/technical/api-allocation-growing.txt
@@ -34,3 +34,6 @@
 ------------
 
 You are responsible for updating the `nr` variable.
+
+If you need to specify the number of elements to allocate explicitly
+then use the macro `REALLOC_ARRAY(item, alloc)` instead of `ALLOC_GROW`.
diff --git a/Documentation/technical/api-argv-array.txt b/Documentation/technical/api-argv-array.txt
index a6b7d83..1a79781 100644
--- a/Documentation/technical/api-argv-array.txt
+++ b/Documentation/technical/api-argv-array.txt
@@ -53,11 +53,3 @@
 `argv_array_clear`::
 	Free all memory associated with the array and return it to the
 	initial, empty state.
-
-`argv_array_detach`::
-	Detach the argv array from the `struct argv_array`, transferring
-	ownership of the allocated array and strings.
-
-`argv_array_free_detached`::
-	Free the memory allocated by a `struct argv_array` that was later
-	detached and is now no longer needed.
diff --git a/Documentation/technical/api-builtin.txt b/Documentation/technical/api-builtin.txt
index e3d6e7a..22a39b9 100644
--- a/Documentation/technical/api-builtin.txt
+++ b/Documentation/technical/api-builtin.txt
@@ -22,11 +22,14 @@
 where options is the bitwise-or of:
 
 `RUN_SETUP`::
+	If there is not a Git directory to work on, abort.  If there
+	is a work tree, chdir to the top of it if the command was
+	invoked in a subdirectory.  If there is no work tree, no
+	chdir() is done.
 
-	Make sure there is a Git directory to work on, and if there is a
-	work tree, chdir to the top of it if the command was invoked
-	in a subdirectory.  If there is no work tree, no chdir() is
-	done.
+`RUN_SETUP_GENTLY`::
+	If there is a Git directory, chdir as per RUN_SETUP, otherwise,
+	don't chdir anywhere.
 
 `USE_PAGER`::
 
diff --git a/Documentation/technical/api-config.txt b/Documentation/technical/api-config.txt
index 230b3a0..0d8b99b 100644
--- a/Documentation/technical/api-config.txt
+++ b/Documentation/technical/api-config.txt
@@ -77,6 +77,99 @@
 `git_config_from_file`. This takes the same callback and data parameters
 as `git_config`.
 
+Querying For Specific Variables
+-------------------------------
+
+For programs wanting to query for specific variables in a non-callback
+manner, the config API provides two functions `git_config_get_value`
+and `git_config_get_value_multi`. They both read values from an internal
+cache generated previously from reading the config files.
+
+`int git_config_get_value(const char *key, const char **value)`::
+
+	Finds the highest-priority value for the configuration variable `key`,
+	stores the pointer to it in `value` and returns 0. When the
+	configuration variable `key` is not found, returns 1 without touching
+	`value`. The caller should not free or modify `value`, as it is owned
+	by the cache.
+
+`const struct string_list *git_config_get_value_multi(const char *key)`::
+
+	Finds and returns the value list, sorted in order of increasing priority
+	for the configuration variable `key`. When the configuration variable
+	`key` is not found, returns NULL. The caller should not free or modify
+	the returned pointer, as it is owned by the cache.
+
+`void git_config_clear(void)`::
+
+	Resets and invalidates the config cache.
+
+The config API also provides type specific API functions which do conversion
+as well as retrieval for the queried variable, including:
+
+`int git_config_get_int(const char *key, int *dest)`::
+
+	Finds and parses the value to an integer for the configuration variable
+	`key`. Dies on error; otherwise, stores the value of the parsed integer in
+	`dest` and returns 0. When the configuration variable `key` is not found,
+	returns 1 without touching `dest`.
+
+`int git_config_get_ulong(const char *key, unsigned long *dest)`::
+
+	Similar to `git_config_get_int` but for unsigned longs.
+
+`int git_config_get_bool(const char *key, int *dest)`::
+
+	Finds and parses the value into a boolean value, for the configuration
+	variable `key` respecting keywords like "true" and "false". Integer
+	values are converted into true/false values (when they are non-zero or
+	zero, respectively). Other values cause a die(). If parsing is successful,
+	stores the value of the parsed result in `dest` and returns 0. When the
+	configuration variable `key` is not found, returns 1 without touching
+	`dest`.
+
+`int git_config_get_bool_or_int(const char *key, int *is_bool, int *dest)`::
+
+	Similar to `git_config_get_bool`, except that integers are copied as-is,
+	and `is_bool` flag is unset.
+
+`int git_config_get_maybe_bool(const char *key, int *dest)`::
+
+	Similar to `git_config_get_bool`, except that it returns -1 on error
+	rather than dying.
+
+`int git_config_get_string_const(const char *key, const char **dest)`::
+
+	Allocates and copies the retrieved string into the `dest` parameter for
+	the configuration variable `key`; if NULL string is given, prints an
+	error message and returns -1. When the configuration variable `key` is
+	not found, returns 1 without touching `dest`.
+
+`int git_config_get_string(const char *key, char **dest)`::
+
+	Similar to `git_config_get_string_const`, except that retrieved value
+	copied into the `dest` parameter is a mutable string.
+
+`int git_config_get_pathname(const char *key, const char **dest)`::
+
+	Similar to `git_config_get_string`, but expands `~` or `~user` into
+	the user's home directory when found at the beginning of the path.
+
+`git_die_config(const char *key, const char *err, ...)`::
+
+	First prints the error message specified by the caller in `err` and then
+	dies printing the line number and the file name of the highest priority
+	value for the configuration variable `key`.
+
+`void git_die_config_linenr(const char *key, const char *filename, int linenr)`::
+
+	Helper function which formats the die error message according to the
+	parameters entered. Used by `git_die_config()`. It can be used by callers
+	handling `git_config_get_value_multi()` to print the correct error message
+	for the desired value.
+
+See test-config.c for usage examples.
+
 Value Parsing Helpers
 ---------------------
 
@@ -134,7 +227,98 @@
 `git_config` respects includes automatically. The lower-level
 `git_config_from_file` does not.
 
+Custom Configsets
+-----------------
+
+A `config_set` can be used to construct an in-memory cache for
+config-like files that the caller specifies (i.e., files like `.gitmodules`,
+`~/.gitconfig` etc.). For example,
+
+---------------------------------------
+struct config_set gm_config;
+git_configset_init(&gm_config);
+int b;
+/* we add config files to the config_set */
+git_configset_add_file(&gm_config, ".gitmodules");
+git_configset_add_file(&gm_config, ".gitmodules_alt");
+
+if (!git_configset_get_bool(gm_config, "submodule.frotz.ignore", &b)) {
+	/* hack hack hack */
+}
+
+/* when we are done with the configset */
+git_configset_clear(&gm_config);
+----------------------------------------
+
+Configset API provides functions for the above mentioned work flow, including:
+
+`void git_configset_init(struct config_set *cs)`::
+
+	Initializes the config_set `cs`.
+
+`int git_configset_add_file(struct config_set *cs, const char *filename)`::
+
+	Parses the file and adds the variable-value pairs to the `config_set`,
+	dies if there is an error in parsing the file. Returns 0 on success, or
+	-1 if the file does not exist or is inaccessible. The user has to decide
+	if he wants to free the incomplete configset or continue using it when
+	the function returns -1.
+
+`int git_configset_get_value(struct config_set *cs, const char *key, const char **value)`::
+
+	Finds the highest-priority value for the configuration variable `key`
+	and config set `cs`, stores the pointer to it in `value` and returns 0.
+	When the configuration variable `key` is not found, returns 1 without
+	touching `value`. The caller should not free or modify `value`, as it
+	is owned by the cache.
+
+`const struct string_list *git_configset_get_value_multi(struct config_set *cs, const char *key)`::
+
+	Finds and returns the value list, sorted in order of increasing priority
+	for the configuration variable `key` and config set `cs`. When the
+	configuration variable `key` is not found, returns NULL. The caller
+	should not free or modify the returned pointer, as it is owned by the cache.
+
+`void git_configset_clear(struct config_set *cs)`::
+
+	Clears `config_set` structure, removes all saved variable-value pairs.
+
+In addition to above functions, the `config_set` API provides type specific
+functions in the vein of `git_config_get_int` and family but with an extra
+parameter, pointer to struct `config_set`.
+They all behave similarly to the `git_config_get*()` family described in
+"Querying For Specific Variables" above.
+
 Writing Config Files
 --------------------
 
-TODO
+Git gives multiple entry points in the Config API to write config values to
+files namely `git_config_set_in_file` and `git_config_set`, which write to
+a specific config file or to `.git/config` respectively. They both take a
+key/value pair as parameter.
+In the end they both call `git_config_set_multivar_in_file` which takes four
+parameters:
+
+- the name of the file, as a string, to which key/value pairs will be written.
+
+- the name of key, as a string. This is in canonical "flat" form: the section,
+  subsection, and variable segments will be separated by dots, and the section
+  and variable segments will be all lowercase.
+  E.g., `core.ignorecase`, `diff.SomeType.textconv`.
+
+- the value of the variable, as a string. If value is equal to NULL, it will
+  remove the matching key from the config file.
+
+- the value regex, as a string. It will disregard key/value pairs where value
+  does not match.
+
+- a multi_replace value, as an int. If value is equal to zero, nothing or only
+  one matching key/value is replaced, else all matching key/values (regardless
+  how many) are removed, before the new pair is written.
+
+It returns 0 on success.
+
+Also, there are functions `git_config_rename_section` and
+`git_config_rename_section_in_file` with parameters `old_name` and `new_name`
+for renaming or removing sections in the config files. If NULL is passed
+through `new_name` parameter, the section will be removed from the config file.
diff --git a/Documentation/technical/api-hashmap.txt b/Documentation/technical/api-hashmap.txt
index b977ae8..ad7a5bd 100644
--- a/Documentation/technical/api-hashmap.txt
+++ b/Documentation/technical/api-hashmap.txt
@@ -8,11 +8,19 @@
 
 `struct hashmap`::
 
-	The hash table structure.
+	The hash table structure. Members can be used as follows, but should
+	not be modified directly:
 +
-The `size` member keeps track of the total number of entries. The `cmpfn`
-member is a function used to compare two entries for equality. The `table` and
-`tablesize` members store the hash table and its size, respectively.
+The `size` member keeps track of the total number of entries (0 means the
+hashmap is empty).
++
+`tablesize` is the allocated size of the hash table. A non-0 value indicates
+that the hashmap is initialized. It may also be useful for statistical purposes
+(i.e. `size / tablesize` is the current load factor).
++
+`cmpfn` stores the comparison function specified in `hashmap_init()`. In
+advanced scenarios, it may be useful to change this, e.g. to switch between
+case-sensitive and case-insensitive lookup.
 
 `struct hashmap_entry`::
 
@@ -58,6 +66,15 @@
 +
 `strihash` and `memihash` are case insensitive versions.
 
+`unsigned int sha1hash(const unsigned char *sha1)`::
+
+	Converts a cryptographic hash (e.g. SHA-1) into an int-sized hash code
+	for use in hash tables. Cryptographic hashes are supposed to have
+	uniform distribution, so in contrast to `memhash()`, this just copies
+	the first `sizeof(int)` bytes without shuffling any bits. Note that
+	the results will be different on big-endian and little-endian
+	platforms, so they should not be stored or transferred over the net.
+
 `void hashmap_init(struct hashmap *map, hashmap_cmp_fn equals_function, size_t initial_size)`::
 
 	Initializes a hashmap structure.
@@ -101,6 +118,20 @@
 If an entry with matching hash code is found, `key` and `keydata` are passed
 to `hashmap_cmp_fn` to decide whether the entry matches the key.
 
+`void *hashmap_get_from_hash(const struct hashmap *map, unsigned int hash, const void *keydata)`::
+
+	Returns the hashmap entry for the specified hash code and key data,
+	or NULL if not found.
++
+`map` is the hashmap structure.
++
+`hash` is the hash code of the entry to look up.
++
+If an entry with matching hash code is found, `keydata` is passed to
+`hashmap_cmp_fn` to decide whether the entry matches the key. The
+`entry_or_key` parameter points to a bogus hashmap_entry structure that
+should not be used in the comparison.
+
 `void *hashmap_get_next(const struct hashmap *map, const void *entry)`::
 
 	Returns the next equal hashmap entry, or NULL if not found. This can be
@@ -162,6 +193,21 @@
 `hashmap_iter_first` is a combination of both (i.e. initializes the iterator
 and returns the first entry, if any).
 
+`const char *strintern(const char *string)`::
+`const void *memintern(const void *data, size_t len)`::
+
+	Returns the unique, interned version of the specified string or data,
+	similar to the `String.intern` API in Java and .NET, respectively.
+	Interned strings remain valid for the entire lifetime of the process.
++
+Can be used as `[x]strdup()` or `xmemdupz` replacement, except that interned
+strings / data must not be modified or freed.
++
+Interned strings are best used for short strings with high probability of
+duplicates.
++
+Uses a hashmap to store the pool of interned strings.
+
 Usage example
 -------------
 
diff --git a/Documentation/technical/api-lockfile.txt b/Documentation/technical/api-lockfile.txt
index dd89404..93b5f23 100644
--- a/Documentation/technical/api-lockfile.txt
+++ b/Documentation/technical/api-lockfile.txt
@@ -3,20 +3,132 @@
 
 The lockfile API serves two purposes:
 
-* Mutual exclusion.  When we write out a new index file, first
-  we create a new file `$GIT_DIR/index.lock`, write the new
-  contents into it, and rename it to the final destination
-  `$GIT_DIR/index`.  We try to create the `$GIT_DIR/index.lock`
-  file with O_EXCL so that we can notice and fail when somebody
-  else is already trying to update the index file.
+* Mutual exclusion and atomic file updates. When we want to change a
+  file, we create a lockfile `<filename>.lock`, write the new file
+  contents into it, and then rename the lockfile to its final
+  destination `<filename>`. We create the `<filename>.lock` file with
+  `O_CREAT|O_EXCL` so that we can notice and fail if somebody else has
+  already locked the file, then atomically rename the lockfile to its
+  final destination to commit the changes and unlock the file.
 
-* Automatic cruft removal.  After we create the "lock" file, we
-  may decide to `die()`, and we would want to make sure that we
-  remove the file that has not been committed to its final
-  destination.  This is done by remembering the lockfiles we
-  created in a linked list and cleaning them up from an
-  `atexit(3)` handler.  Outstanding lockfiles are also removed
-  when the program dies on a signal.
+* Automatic cruft removal. If the program exits after we lock a file
+  but before the changes have been committed, we want to make sure
+  that we remove the lockfile. This is done by remembering the
+  lockfiles we have created in a linked list and setting up an
+  `atexit(3)` handler and a signal handler that clean up the
+  lockfiles. This mechanism ensures that outstanding lockfiles are
+  cleaned up if the program exits (including when `die()` is called)
+  or if the program dies on a signal.
+
+Please note that lockfiles only block other writers. Readers do not
+block, but they are guaranteed to see either the old contents of the
+file or the new contents of the file (assuming that the filesystem
+implements `rename(2)` atomically).
+
+
+Calling sequence
+----------------
+
+The caller:
+
+* Allocates a `struct lock_file` either as a static variable or on the
+  heap, initialized to zeros. Once you use the structure to call the
+  `hold_lock_file_*` family of functions, it belongs to the lockfile
+  subsystem and its storage must remain valid throughout the life of
+  the program (i.e. you cannot use an on-stack variable to hold this
+  structure).
+
+* Attempts to create a lockfile by passing that variable and the path
+  of the final destination (e.g. `$GIT_DIR/index`) to
+  `hold_lock_file_for_update` or `hold_lock_file_for_append`.
+
+* Writes new content for the destination file by either:
+
+  * writing to the file descriptor returned by the `hold_lock_file_*`
+    functions (also available via `lock->fd`).
+
+  * calling `fdopen_lock_file` to get a `FILE` pointer for the open
+    file and writing to the file using stdio.
+
+When finished writing, the caller can:
+
+* Close the file descriptor and rename the lockfile to its final
+  destination by calling `commit_lock_file` or `commit_lock_file_to`.
+
+* Close the file descriptor and remove the lockfile by calling
+  `rollback_lock_file`.
+
+* Close the file descriptor without removing or renaming the lockfile
+  by calling `close_lock_file`, and later call `commit_lock_file`,
+  `commit_lock_file_to`, `rollback_lock_file`, or `reopen_lock_file`.
+
+Even after the lockfile is committed or rolled back, the `lock_file`
+object must not be freed or altered by the caller. However, it may be
+reused; just pass it to another call of `hold_lock_file_for_update` or
+`hold_lock_file_for_append`.
+
+If the program exits before you have called one of `commit_lock_file`,
+`commit_lock_file_to`, `rollback_lock_file`, or `close_lock_file`, an
+`atexit(3)` handler will close and remove the lockfile, rolling back
+any uncommitted changes.
+
+If you need to close the file descriptor you obtained from a
+`hold_lock_file_*` function yourself, do so by calling
+`close_lock_file`. You should never call `close(2)` or `fclose(3)`
+yourself! Otherwise the `struct lock_file` structure would still think
+that the file descriptor needs to be closed, and a commit or rollback
+would result in duplicate calls to `close(2)`. Worse yet, if you close
+and then later open another file descriptor for a completely different
+purpose, then a commit or rollback might close that unrelated file
+descriptor.
+
+
+Error handling
+--------------
+
+The `hold_lock_file_*` functions return a file descriptor on success
+or -1 on failure (unless `LOCK_DIE_ON_ERROR` is used; see below). On
+errors, `errno` describes the reason for failure. Errors can be
+reported by passing `errno` to one of the following helper functions:
+
+unable_to_lock_message::
+
+	Append an appropriate error message to a `strbuf`.
+
+unable_to_lock_error::
+
+	Emit an appropriate error message using `error()`.
+
+unable_to_lock_die::
+
+	Emit an appropriate error message and `die()`.
+
+Similarly, `commit_lock_file`, `commit_lock_file_to`, and
+`close_lock_file` return 0 on success. On failure they set `errno`
+appropriately, do their best to roll back the lockfile, and return -1.
+
+
+Flags
+-----
+
+The following flags can be passed to `hold_lock_file_for_update` or
+`hold_lock_file_for_append`:
+
+LOCK_NO_DEREF::
+
+	Usually symbolic links in the destination path are resolved
+	and the lockfile is created by adding ".lock" to the resolved
+	path. If `LOCK_NO_DEREF` is set, then the lockfile is created
+	by adding ".lock" to the path argument itself. This option is
+	used, for example, when locking a symbolic reference, which
+	for backwards-compatibility reasons can be a symbolic link
+	containing the name of the referred-to-reference.
+
+LOCK_DIE_ON_ERROR::
+
+	If a lock is already taken for the file, `die()` with an error
+	message. If this option is not specified, trying to lock a
+	file that is already locked returns -1 to the caller.
 
 
 The functions
@@ -24,51 +136,85 @@
 
 hold_lock_file_for_update::
 
-	Take a pointer to `struct lock_file`, the filename of
-	the final destination (e.g. `$GIT_DIR/index`) and a flag
-	`die_on_error`.  Attempt to create a lockfile for the
-	destination and return the file descriptor for writing
-	to the file.  If `die_on_error` flag is true, it dies if
-	a lock is already taken for the file; otherwise it
-	returns a negative integer to the caller on failure.
+	Take a pointer to `struct lock_file`, the path of the file to
+	be locked (e.g. `$GIT_DIR/index`) and a flags argument (see
+	above). Attempt to create a lockfile for the destination and
+	return the file descriptor for writing to the file.
+
+hold_lock_file_for_append::
+
+	Like `hold_lock_file_for_update`, but before returning copy
+	the existing contents of the file (if any) to the lockfile and
+	position its write pointer at the end of the file.
+
+fdopen_lock_file::
+
+	Associate a stdio stream with the lockfile. Return NULL
+	(*without* rolling back the lockfile) on error. The stream is
+	closed automatically when `close_lock_file` is called or when
+	the file is committed or rolled back.
+
+get_locked_file_path::
+
+	Return the path of the file that is locked by the specified
+	lock_file object. The caller must free the memory.
 
 commit_lock_file::
 
-	Take a pointer to the `struct lock_file` initialized
-	with an earlier call to `hold_lock_file_for_update()`,
-	close the file descriptor and rename the lockfile to its
-	final destination.  Returns 0 upon success, a negative
-	value on failure to close(2) or rename(2).
+	Take a pointer to the `struct lock_file` initialized with an
+	earlier call to `hold_lock_file_for_update` or
+	`hold_lock_file_for_append`, close the file descriptor, and
+	rename the lockfile to its final destination. Return 0 upon
+	success. On failure, roll back the lock file and return -1,
+	with `errno` set to the value from the failing call to
+	`close(2)` or `rename(2)`. It is a bug to call
+	`commit_lock_file` for a `lock_file` object that is not
+	currently locked.
+
+commit_lock_file_to::
+
+	Like `commit_lock_file()`, except that it takes an explicit
+	`path` argument to which the lockfile should be renamed. The
+	`path` must be on the same filesystem as the lock file.
 
 rollback_lock_file::
 
-	Take a pointer to the `struct lock_file` initialized
-	with an earlier call to `hold_lock_file_for_update()`,
-	close the file descriptor and remove the lockfile.
+	Take a pointer to the `struct lock_file` initialized with an
+	earlier call to `hold_lock_file_for_update` or
+	`hold_lock_file_for_append`, close the file descriptor and
+	remove the lockfile. It is a NOOP to call
+	`rollback_lock_file()` for a `lock_file` object that has
+	already been committed or rolled back.
 
 close_lock_file::
-	Take a pointer to the `struct lock_file` initialized
-	with an earlier call to `hold_lock_file_for_update()`,
-	and close the file descriptor.  Returns 0 upon success,
-	a negative value on failure to close(2).
 
-Because the structure is used in an `atexit(3)` handler, its
-storage has to stay throughout the life of the program.  It
-cannot be an auto variable allocated on the stack.
+	Take a pointer to the `struct lock_file` initialized with an
+	earlier call to `hold_lock_file_for_update` or
+	`hold_lock_file_for_append`. Close the file descriptor (and
+	the file pointer if it has been opened using
+	`fdopen_lock_file`). Return 0 upon success. On failure to
+	`close(2)`, return a negative value and roll back the lock
+	file. Usually `commit_lock_file`, `commit_lock_file_to`, or
+	`rollback_lock_file` should eventually be called if
+	`close_lock_file` succeeds.
 
-Call `commit_lock_file()` or `rollback_lock_file()` when you are
-done writing to the file descriptor.  If you do not call either
-and simply `exit(3)` from the program, an `atexit(3)` handler
-will close and remove the lockfile.
+reopen_lock_file::
 
-If you need to close the file descriptor you obtained from
-`hold_lock_file_for_update` function yourself, do so by calling
-`close_lock_file()`.  You should never call `close(2)` yourself!
-Otherwise the `struct
-lock_file` structure still remembers that the file descriptor
-needs to be closed, and a later call to `commit_lock_file()` or
-`rollback_lock_file()` will result in duplicate calls to
-`close(2)`.  Worse yet, if you `close(2)`, open another file
-descriptor for completely different purpose, and then call
-`commit_lock_file()` or `rollback_lock_file()`, they may close
-that unrelated file descriptor.
+	Re-open a lockfile that has been closed (using
+	`close_lock_file`) but not yet committed or rolled back. This
+	can be used to implement a sequence of operations like the
+	following:
+
+	* Lock file.
+
+	* Write new contents to lockfile, then `close_lock_file` to
+	  cause the contents to be written to disk.
+
+	* Pass the name of the lockfile to another program to allow it
+	  (and nobody else) to inspect the contents you wrote, while
+	  still holding the lock yourself.
+
+	* `reopen_lock_file` to reopen the lockfile. Make further
+	  updates to the contents.
+
+	* `commit_lock_file` to make the final version permanent.
diff --git a/Documentation/technical/api-run-command.txt b/Documentation/technical/api-run-command.txt
index 5d7d7f2..a9fdb45 100644
--- a/Documentation/technical/api-run-command.txt
+++ b/Documentation/technical/api-run-command.txt
@@ -13,6 +13,10 @@
 Functions
 ---------
 
+`child_process_init`::
+
+	Initialize a struct child_process variable.
+
 `start_command`::
 
 	Start a sub-process. Takes a pointer to a `struct child_process`
@@ -96,8 +100,8 @@
 
 The caller:
 
-1. allocates and clears (memset(&chld, 0, sizeof(chld));) a
-   struct child_process variable;
+1. allocates and clears (using child_process_init() or
+   CHILD_PROCESS_INIT) a struct child_process variable;
 2. initializes the members;
 3. calls start_command();
 4. processes the data;
@@ -109,6 +113,13 @@
 without a path). If the command to run is a git command, set argv[0] to
 the command name without the 'git-' prefix and set .git_cmd = 1.
 
+Note that the ownership of the memory pointed to by .argv stays with the
+caller, but it should survive until `finish_command` completes. If the
+.argv member is NULL, `start_command` will point it at the .args
+`argv_array` (so you may use one or the other, but you must use exactly
+one). The memory in .args will be cleaned up automatically during
+`finish_command` (or during `start_command` when it is unsuccessful).
+
 The members .in, .out, .err are used to redirect stdin, stdout,
 stderr as follows:
 
@@ -158,6 +169,11 @@
 . If the string does not contain '=', it names an environment
   variable that will be removed from the child process's environment.
 
+If the .env member is NULL, `start_command` will point it at the
+.env_array `argv_array` (so you may use one or the other, but not both).
+The memory in .env_array will be cleaned up automatically during
+`finish_command` (or during `start_command` when it is unsuccessful).
+
 To specify a new initial working directory for the sub-process,
 specify it in the .dir member.
 
diff --git a/Documentation/technical/api-strbuf.txt b/Documentation/technical/api-strbuf.txt
index 1d00e4d..cca6543 100644
--- a/Documentation/technical/api-strbuf.txt
+++ b/Documentation/technical/api-strbuf.txt
@@ -121,10 +121,28 @@
 
 * Related to the contents of the buffer
 
+`strbuf_trim`::
+
+	Strip whitespace from the beginning and end of a string.
+	Equivalent to performing `strbuf_rtrim()` followed by `strbuf_ltrim()`.
+
 `strbuf_rtrim`::
 
 	Strip whitespace from the end of a string.
 
+`strbuf_ltrim`::
+
+	Strip whitespace from the beginning of a string.
+
+`strbuf_reencode`::
+
+	Replace the contents of the strbuf with a reencoded form.  Returns -1
+	on error, 0 on success.
+
+`strbuf_tolower`::
+
+	Lowercase each character in the buffer using `tolower`.
+
 `strbuf_cmp`::
 
 	Compare two buffers. Returns an integer less than, equal to, or greater
@@ -142,6 +160,10 @@
 
 	Add a single character to the buffer.
 
+`strbuf_addchars`::
+
+	Add a character the specified number of times to the buffer.
+
 `strbuf_insert`::
 
 	Insert data to the given position of the buffer. The remaining contents
@@ -289,6 +311,16 @@
 	use it unless you need the correct position in the file
 	descriptor.
 
+`strbuf_getcwd`::
+
+	Set the buffer to the path of the current working directory.
+
+`strbuf_add_absolute_path`
+
+	Add a path to a buffer, converting a relative path to an
+	absolute one in the process.  Symbolic links are not
+	resolved.
+
 `stripspace`::
 
 	Strip whitespace from a buffer. The second parameter controls if
diff --git a/Documentation/technical/api-string-list.txt b/Documentation/technical/api-string-list.txt
index 20be348..d51a657 100644
--- a/Documentation/technical/api-string-list.txt
+++ b/Documentation/technical/api-string-list.txt
@@ -68,6 +68,11 @@
 
 * General ones (works with sorted and unsorted lists as well)
 
+`string_list_init`::
+
+	Initialize the members of the string_list, set `strdup_strings`
+	member according to the value of the second parameter.
+
 `filter_string_list`::
 
 	Apply a function to each item in a list, retaining only the
@@ -200,3 +205,5 @@
   You should not tamper with it.
 . Setting the `strdup_strings` member to 1 will strdup() the strings
   before adding them, see above.
+. The `compare_strings_fn` member is used to specify a custom compare
+  function, otherwise `strcmp()` is used as the default function.
diff --git a/Documentation/technical/api-trace.txt b/Documentation/technical/api-trace.txt
new file mode 100644
index 0000000..097a651
--- /dev/null
+++ b/Documentation/technical/api-trace.txt
@@ -0,0 +1,97 @@
+trace API
+=========
+
+The trace API can be used to print debug messages to stderr or a file. Trace
+code is inactive unless explicitly enabled by setting `GIT_TRACE*` environment
+variables.
+
+The trace implementation automatically adds `timestamp file:line ... \n` to
+all trace messages. E.g.:
+
+------------
+23:59:59.123456 git.c:312               trace: built-in: git 'foo'
+00:00:00.000001 builtin/foo.c:99        foo: some message
+------------
+
+Data Structures
+---------------
+
+`struct trace_key`::
+
+	Defines a trace key (or category). The default (for API functions that
+	don't take a key) is `GIT_TRACE`.
++
+E.g. to define a trace key controlled by environment variable `GIT_TRACE_FOO`:
++
+------------
+static struct trace_key trace_foo = TRACE_KEY_INIT(FOO);
+
+static void trace_print_foo(const char *message)
+{
+	trace_print_key(&trace_foo, message);
+}
+------------
++
+Note: don't use `const` as the trace implementation stores internal state in
+the `trace_key` structure.
+
+Functions
+---------
+
+`int trace_want(struct trace_key *key)`::
+
+	Checks whether the trace key is enabled. Used to prevent expensive
+	string formatting before calling one of the printing APIs.
+
+`void trace_disable(struct trace_key *key)`::
+
+	Disables tracing for the specified key, even if the environment
+	variable was set.
+
+`void trace_printf(const char *format, ...)`::
+`void trace_printf_key(struct trace_key *key, const char *format, ...)`::
+
+	Prints a formatted message, similar to printf.
+
+`void trace_argv_printf(const char **argv, const char *format, ...)``::
+
+	Prints a formatted message, followed by a quoted list of arguments.
+
+`void trace_strbuf(struct trace_key *key, const struct strbuf *data)`::
+
+	Prints the strbuf, without additional formatting (i.e. doesn't
+	choke on `%` or even `\0`).
+
+`uint64_t getnanotime(void)`::
+
+	Returns nanoseconds since the epoch (01/01/1970), typically used
+	for performance measurements.
++
+Currently there are high precision timer implementations for Linux (using
+`clock_gettime(CLOCK_MONOTONIC)`) and Windows (`QueryPerformanceCounter`).
+Other platforms use `gettimeofday` as time source.
+
+`void trace_performance(uint64_t nanos, const char *format, ...)`::
+`void trace_performance_since(uint64_t start, const char *format, ...)`::
+
+	Prints the elapsed time (in nanoseconds), or elapsed time since
+	`start`, followed by a formatted message. Enabled via environment
+	variable `GIT_TRACE_PERFORMANCE`. Used for manual profiling, e.g.:
++
+------------
+uint64_t start = getnanotime();
+/* code section to measure */
+trace_performance_since(start, "foobar");
+------------
++
+------------
+uint64_t t = 0;
+for (;;) {
+	/* ignore */
+	t -= getnanotime();
+	/* code section to measure */
+	t += getnanotime();
+	/* ignore */
+}
+trace_performance(t, "frotz");
+------------
diff --git a/Documentation/technical/http-protocol.txt b/Documentation/technical/http-protocol.txt
index 58c7e87..229f845 100644
--- a/Documentation/technical/http-protocol.txt
+++ b/Documentation/technical/http-protocol.txt
@@ -374,7 +374,7 @@
    C: 0000
 
 The stream is organized into "commands", with each command
-appearing by itself in a pkt-line.  Within a command line
+appearing by itself in a pkt-line.  Within a command line,
 the text leading up to the first space is the command name,
 and the remainder of the line to the first LF is the value.
 Command lines are terminated with an LF as the last byte of
diff --git a/Documentation/technical/index-format.txt b/Documentation/technical/index-format.txt
index f352a9b..1250b5c 100644
--- a/Documentation/technical/index-format.txt
+++ b/Documentation/technical/index-format.txt
@@ -129,6 +129,9 @@
   (Version 4) In version 4, the padding after the pathname does not
   exist.
 
+  Interpretation of index entries in split index mode is completely
+  different. See below for details.
+
 == Extensions
 
 === Cached tree
@@ -198,3 +201,35 @@
   - At most three 160-bit object names of the entry in stages from 1 to 3
     (nothing is written for a missing stage).
 
+=== Split index
+
+  In split index mode, the majority of index entries could be stored
+  in a separate file. This extension records the changes to be made on
+  top of that to produce the final index.
+
+  The signature for this extension is { 'l', 'i, 'n', 'k' }.
+
+  The extension consists of:
+
+  - 160-bit SHA-1 of the shared index file. The shared index file path
+    is $GIT_DIR/sharedindex.<SHA-1>. If all 160 bits are zero, the
+    index does not require a shared index file.
+
+  - An ewah-encoded delete bitmap, each bit represents an entry in the
+    shared index. If a bit is set, its corresponding entry in the
+    shared index will be removed from the final index.  Note, because
+    a delete operation changes index entry positions, but we do need
+    original positions in replace phase, it's best to just mark
+    entries for removal, then do a mass deletion after replacement.
+
+  - An ewah-encoded replace bitmap, each bit represents an entry in
+    the shared index. If a bit is set, its corresponding entry in the
+    shared index will be replaced with an entry in this index
+    file. All replaced entries are stored in sorted order in this
+    index. The first "1" bit in the replace bitmap corresponds to the
+    first index entry, the second "1" bit to the second entry and so
+    on. Replaced entries may have empty path names to save space.
+
+  The remaining index entries after replaced ones will be added to the
+  final index. These added entries are also sorted by entry name then
+  stage.
diff --git a/Documentation/technical/pack-protocol.txt b/Documentation/technical/pack-protocol.txt
index 18dea8d..462e206 100644
--- a/Documentation/technical/pack-protocol.txt
+++ b/Documentation/technical/pack-protocol.txt
@@ -212,9 +212,9 @@
   want-list         =  first-want
 		       *additional-want
 
-  shallow-line      =  PKT_LINE("shallow" SP obj-id)
+  shallow-line      =  PKT-LINE("shallow" SP obj-id)
 
-  depth-request     =  PKT_LINE("deepen" SP depth)
+  depth-request     =  PKT-LINE("deepen" SP depth)
 
   first-want        =  PKT-LINE("want" SP obj-id SP capability-list LF)
   additional-want   =  PKT-LINE("want" SP obj-id LF)
@@ -465,9 +465,9 @@
 references.
 
 ----
-  update-request    =  *shallow command-list [pack-file]
+  update-request    =  *shallow ( command-list | push-cert ) [pack-file]
 
-  shallow           =  PKT-LINE("shallow" SP obj-id)
+  shallow           =  PKT-LINE("shallow" SP obj-id LF)
 
   command-list      =  PKT-LINE(command NUL capability-list LF)
 		       *PKT-LINE(command LF)
@@ -481,12 +481,27 @@
   old-id            =  obj-id
   new-id            =  obj-id
 
+  push-cert         = PKT-LINE("push-cert" NUL capability-list LF)
+		      PKT-LINE("certificate version 0.1" LF)
+		      PKT-LINE("pusher" SP ident LF)
+		      PKT-LINE("pushee" SP url LF)
+		      PKT-LINE("nonce" SP nonce LF)
+		      PKT-LINE(LF)
+		      *PKT-LINE(command LF)
+		      *PKT-LINE(gpg-signature-lines LF)
+		      PKT-LINE("push-cert-end" LF)
+
   pack-file         = "PACK" 28*(OCTET)
 ----
 
 If the receiving end does not support delete-refs, the sending end MUST
 NOT ask for delete command.
 
+If the receiving end does not support push-cert, the sending end
+MUST NOT send a push-cert command.  When a push-cert command is
+sent, command-list MUST NOT be sent; the commands recorded in the
+push certificate is used instead.
+
 The pack-file MUST NOT be sent if the only command used is 'delete'.
 
 A pack-file MUST be sent if either create or update command is used,
@@ -501,6 +516,34 @@
 it will run any update hooks to make sure that the update is acceptable.
 If all of that is fine, the server will then update the references.
 
+Push Certificate
+----------------
+
+A push certificate begins with a set of header lines.  After the
+header and an empty line, the protocol commands follow, one per
+line.
+
+Currently, the following header fields are defined:
+
+`pusher` ident::
+	Identify the GPG key in "Human Readable Name <email@address>"
+	format.
+
+`pushee` url::
+	The repository URL (anonymized, if the URL contains
+	authentication material) the user who ran `git push`
+	intended to push into.
+
+`nonce` nonce::
+	The 'nonce' string the receiving repository asked the
+	pushing user to include in the certificate, to prevent
+	replay attacks.
+
+The GPG signature lines are a detached signature for the contents
+recorded in the push certificate before the signature block begins.
+The detached signature is used to certify that the commands were
+given by the pusher, who must be the signer.
+
 Report Status
 -------------
 
diff --git a/Documentation/technical/protocol-capabilities.txt b/Documentation/technical/protocol-capabilities.txt
index e174343..6d5424c 100644
--- a/Documentation/technical/protocol-capabilities.txt
+++ b/Documentation/technical/protocol-capabilities.txt
@@ -18,8 +18,8 @@
 and server advertised.  As a consequence of these rules, server MUST
 NOT advertise capabilities it does not understand.
 
-The 'report-status', 'delete-refs', and 'quiet' capabilities are sent and
-recognized by the receive-pack (push to server) process.
+The 'report-status', 'delete-refs', 'quiet', and 'push-cert' capabilities
+are sent and recognized by the receive-pack (push to server) process.
 
 The 'ofs-delta' and 'side-band-64k' capabilities are sent and recognized
 by both upload-pack and receive-pack protocols.  The 'agent' capability
@@ -168,7 +168,7 @@
 ASCII characters except space (i.e., the byte range 32 < x < 127), and
 are typically of the form "package/version" (e.g., "git/1.8.3.1"). The
 agent strings are purely informative for statistics and debugging
-purposes, and MUST NOT be used to programatically assume the presence
+purposes, and MUST NOT be used to programmatically assume the presence
 or absence of particular features.
 
 shallow
@@ -250,3 +250,12 @@
 If the upload-pack server advertises this capability, fetch-pack may
 send "want" lines with SHA-1s that exist at the server but are not
 advertised by upload-pack.
+
+push-cert=<nonce>
+-----------------
+
+The receive-pack server that advertises this capability is willing
+to accept a signed push certificate, and asks the <nonce> to be
+included in the push certificate.  A send-pack client MUST NOT
+send a push-cert packet unless the receive-pack server advertises
+this capability.
diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt
index 46aa6bc..7330d88 100644
--- a/Documentation/user-manual.txt
+++ b/Documentation/user-manual.txt
@@ -4230,9 +4230,9 @@
 controls how and what revisions are walked, and more.
 
 The original job of `git rev-parse` is now taken by the function
-`setup_revisions()`, which parses the revisions and the common command line
+`setup_revisions()`, which parses the revisions and the common command-line
 options for the revision walker. This information is stored in the struct
-`rev_info` for later consumption. You can do your own command line option
+`rev_info` for later consumption. You can do your own command-line option
 parsing after calling `setup_revisions()`. After that, you have to call
 `prepare_revision_walk()` for initialization, and then you can get the
 commits one by one with the function `get_revision()`.
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index 3e9d508..7db860f 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v2.0.4
+DEF_VER=v2.2.0-rc1
 
 LF='
 '
diff --git a/INSTALL b/INSTALL
index ba01e74..6ec7a24 100644
--- a/INSTALL
+++ b/INSTALL
@@ -28,7 +28,7 @@
 If you're willing to trade off (much) longer build time for a later
 faster git you can also do a profile feedback build with
 
-	$ make prefix=/usr PROFILE=BUILD all
+	$ make prefix=/usr profile
 	# make prefix=/usr PROFILE=BUILD install
 
 This will run the complete test suite as training workload and then
@@ -36,10 +36,20 @@
 which is a few percent faster on CPU intensive workloads.  This
 may be a good tradeoff for distribution packagers.
 
+Alternatively you can run profile feedback only with the git benchmark
+suite. This runs significantly faster than the full test suite, but
+has less coverage:
+
+	$ make prefix=/usr profile-fast
+	# make prefix=/usr PROFILE=BUILD install
+
 Or if you just want to install a profile-optimized version of git into
 your home directory, you could run:
 
-	$ make PROFILE=BUILD install
+	$ make profile-install
+
+or
+	$ make profile-fast-install
 
 As a caveat: a profile-optimized build takes a *lot* longer since the
 git tree must be built twice, and in order for the profiling
diff --git a/Makefile b/Makefile
index e0caec3..827006b 100644
--- a/Makefile
+++ b/Makefile
@@ -14,11 +14,11 @@
 # Define INLINE to a suitable substitute (such as '__inline' or '') if git
 # fails to compile with errors about undefined inline functions or similar.
 #
-# Define SNPRINTF_RETURNS_BOGUS if your are on a system which snprintf()
+# Define SNPRINTF_RETURNS_BOGUS if you are on a system which snprintf()
 # or vsnprintf() return -1 instead of number of characters which would
 # have been written to the final string if enough space had been available.
 #
-# Define FREAD_READS_DIRECTORIES if your are on a system which succeeds
+# Define FREAD_READS_DIRECTORIES if you are on a system which succeeds
 # when attempting to read from an fopen'ed directory.
 #
 # Define NO_OPENSSL environment variable if you do not have OpenSSL.
@@ -30,6 +30,8 @@
 # Define LIBPCREDIR=/foo/bar if your libpcre header and library files are in
 # /foo/bar/include and /foo/bar/lib directories.
 #
+# Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header.
+#
 # Define NO_CURL if you do not have libcurl installed.  git-http-fetch and
 # git-http-push are not built, and you cannot use http:// and https://
 # transports (neither smart nor dumb).
@@ -315,9 +317,6 @@
 # dependency rules.  The default is "auto", which means to use computed header
 # dependencies if your compiler is detected to support it.
 #
-# Define CHECK_HEADER_DEPENDENCIES to check for problems in the hard-coded
-# dependency rules.
-#
 # Define NATIVE_CRLF if your platform uses CRLF for line endings.
 #
 # Define XDL_FAST_HASH to use an alternative line-hashing method in
@@ -338,6 +337,8 @@
 #
 # Define GMTIME_UNRELIABLE_ERRORS if your gmtime() function does not
 # return NULL when it receives a bogus time_t.
+#
+# Define HAVE_CLOCK_GETTIME if your platform has clock_gettime in librt.
 
 GIT-VERSION-FILE: FORCE
 	@$(SHELL_PATH) ./GIT-VERSION-GEN
@@ -428,7 +429,6 @@
 VCSSVN_OBJS =
 GENERATED_H =
 EXTRA_CPPFLAGS =
-LIB_H =
 LIB_OBJS =
 PROGRAM_OBJS =
 PROGRAMS =
@@ -547,9 +547,11 @@
 
 TEST_PROGRAMS_NEED_X += test-chmtime
 TEST_PROGRAMS_NEED_X += test-ctype
+TEST_PROGRAMS_NEED_X += test-config
 TEST_PROGRAMS_NEED_X += test-date
 TEST_PROGRAMS_NEED_X += test-delta
 TEST_PROGRAMS_NEED_X += test-dump-cache-tree
+TEST_PROGRAMS_NEED_X += test-dump-split-index
 TEST_PROGRAMS_NEED_X += test-genrandom
 TEST_PROGRAMS_NEED_X += test-hashmap
 TEST_PROGRAMS_NEED_X += test-index-version
@@ -566,6 +568,7 @@
 TEST_PROGRAMS_NEED_X += test-run-command
 TEST_PROGRAMS_NEED_X += test-scrap-cache-tree
 TEST_PROGRAMS_NEED_X += test-sha1
+TEST_PROGRAMS_NEED_X += test-sha1-array
 TEST_PROGRAMS_NEED_X += test-sigchain
 TEST_PROGRAMS_NEED_X += test-string-list
 TEST_PROGRAMS_NEED_X += test-subprocess
@@ -626,130 +629,11 @@
 
 GENERATED_H += common-cmds.h
 
-LIB_H += advice.h
-LIB_H += archive.h
-LIB_H += argv-array.h
-LIB_H += attr.h
-LIB_H += bisect.h
-LIB_H += blob.h
-LIB_H += branch.h
-LIB_H += builtin.h
-LIB_H += bulk-checkin.h
-LIB_H += bundle.h
-LIB_H += cache-tree.h
-LIB_H += cache.h
-LIB_H += color.h
-LIB_H += column.h
-LIB_H += commit.h
-LIB_H += compat/bswap.h
-LIB_H += compat/mingw.h
-LIB_H += compat/obstack.h
-LIB_H += compat/poll/poll.h
-LIB_H += compat/precompose_utf8.h
-LIB_H += compat/terminal.h
-LIB_H += compat/win32/dirent.h
-LIB_H += compat/win32/pthread.h
-LIB_H += compat/win32/syslog.h
-LIB_H += connected.h
-LIB_H += convert.h
-LIB_H += credential.h
-LIB_H += csum-file.h
-LIB_H += decorate.h
-LIB_H += delta.h
-LIB_H += diff.h
-LIB_H += diffcore.h
-LIB_H += dir.h
-LIB_H += exec_cmd.h
-LIB_H += ewah/ewok.h
-LIB_H += ewah/ewok_rlw.h
-LIB_H += fetch-pack.h
-LIB_H += fmt-merge-msg.h
-LIB_H += fsck.h
-LIB_H += gettext.h
-LIB_H += git-compat-util.h
-LIB_H += gpg-interface.h
-LIB_H += graph.h
-LIB_H += grep.h
-LIB_H += hashmap.h
-LIB_H += help.h
-LIB_H += http.h
-LIB_H += kwset.h
-LIB_H += levenshtein.h
-LIB_H += line-log.h
-LIB_H += line-range.h
-LIB_H += list-objects.h
-LIB_H += ll-merge.h
-LIB_H += log-tree.h
-LIB_H += mailmap.h
-LIB_H += merge-blobs.h
-LIB_H += merge-recursive.h
-LIB_H += mergesort.h
-LIB_H += notes-cache.h
-LIB_H += notes-merge.h
-LIB_H += notes-utils.h
-LIB_H += notes.h
-LIB_H += object.h
-LIB_H += pack-objects.h
-LIB_H += pack-revindex.h
-LIB_H += pack.h
-LIB_H += pack-bitmap.h
-LIB_H += parse-options.h
-LIB_H += patch-ids.h
-LIB_H += pathspec.h
-LIB_H += pkt-line.h
-LIB_H += prio-queue.h
-LIB_H += progress.h
-LIB_H += prompt.h
-LIB_H += quote.h
-LIB_H += reachable.h
-LIB_H += reflog-walk.h
-LIB_H += refs.h
-LIB_H += remote.h
-LIB_H += rerere.h
-LIB_H += resolve-undo.h
-LIB_H += revision.h
-LIB_H += run-command.h
-LIB_H += send-pack.h
-LIB_H += sequencer.h
-LIB_H += sha1-array.h
-LIB_H += sha1-lookup.h
-LIB_H += shortlog.h
-LIB_H += sideband.h
-LIB_H += sigchain.h
-LIB_H += strbuf.h
-LIB_H += streaming.h
-LIB_H += string-list.h
-LIB_H += submodule.h
-LIB_H += tag.h
-LIB_H += tar.h
-LIB_H += thread-utils.h
-LIB_H += transport.h
-LIB_H += tree-walk.h
-LIB_H += tree.h
-LIB_H += unpack-trees.h
-LIB_H += url.h
-LIB_H += urlmatch.h
-LIB_H += userdiff.h
-LIB_H += utf8.h
-LIB_H += varint.h
-LIB_H += vcs-svn/fast_export.h
-LIB_H += vcs-svn/line_buffer.h
-LIB_H += vcs-svn/repo_tree.h
-LIB_H += vcs-svn/sliding_window.h
-LIB_H += vcs-svn/svndiff.h
-LIB_H += vcs-svn/svndump.h
-LIB_H += walker.h
-LIB_H += wildmatch.h
-LIB_H += wt-status.h
-LIB_H += xdiff-interface.h
-LIB_H += xdiff/xdiff.h
-LIB_H += xdiff/xdiffi.h
-LIB_H += xdiff/xemit.h
-LIB_H += xdiff/xinclude.h
-LIB_H += xdiff/xmacros.h
-LIB_H += xdiff/xprepare.h
-LIB_H += xdiff/xtypes.h
-LIB_H += xdiff/xutils.h
+LIB_H = $(shell $(FIND) . \
+	-name .git -prune -o \
+	-name t -prune -o \
+	-name Documentation -prune -o \
+	-name '*.h' -print)
 
 LIB_OBJS += abspath.o
 LIB_OBJS += advice.o
@@ -872,6 +756,7 @@
 LIB_OBJS += shallow.o
 LIB_OBJS += sideband.o
 LIB_OBJS += sigchain.o
+LIB_OBJS += split-index.o
 LIB_OBJS += strbuf.o
 LIB_OBJS += streaming.o
 LIB_OBJS += string-list.o
@@ -879,6 +764,7 @@
 LIB_OBJS += symlinks.o
 LIB_OBJS += tag.o
 LIB_OBJS += trace.o
+LIB_OBJS += trailer.o
 LIB_OBJS += transport.o
 LIB_OBJS += transport-helper.o
 LIB_OBJS += tree-diff.o
@@ -943,6 +829,7 @@
 BUILTIN_OBJS += builtin/help.o
 BUILTIN_OBJS += builtin/index-pack.o
 BUILTIN_OBJS += builtin/init-db.o
+BUILTIN_OBJS += builtin/interpret-trailers.o
 BUILTIN_OBJS += builtin/log.o
 BUILTIN_OBJS += builtin/ls-files.o
 BUILTIN_OBJS += builtin/ls-remote.o
@@ -996,6 +883,7 @@
 BUILTIN_OBJS += builtin/update-server-info.o
 BUILTIN_OBJS += builtin/upload-archive.o
 BUILTIN_OBJS += builtin/var.o
+BUILTIN_OBJS += builtin/verify-commit.o
 BUILTIN_OBJS += builtin/verify-pack.o
 BUILTIN_OBJS += builtin/verify-tag.o
 BUILTIN_OBJS += builtin/write-tree.o
@@ -1017,11 +905,6 @@
 endif
 endif
 
-ifdef CHECK_HEADER_DEPENDENCIES
-COMPUTE_HEADER_DEPENDENCIES = no
-USE_COMPUTED_HEADER_DEPENDENCIES =
-endif
-
 ifndef COMPUTE_HEADER_DEPENDENCIES
 COMPUTE_HEADER_DEPENDENCIES = auto
 endif
@@ -1108,6 +991,10 @@
 	EXTLIBS += -lpcre
 endif
 
+ifdef HAVE_ALLOCA_H
+	BASIC_CFLAGS += -DHAVE_ALLOCA_H
+endif
+
 ifdef NO_CURL
 	BASIC_CFLAGS += -DNO_CURL
 	REMOTE_CURL_PRIMARY =
@@ -1369,7 +1256,6 @@
 endif
 ifndef NO_UNIX_SOCKETS
 	LIB_OBJS += unix-socket.o
-	LIB_H += unix-socket.h
 	PROGRAM_OBJS += credential-cache.o
 	PROGRAM_OBJS += credential-cache--daemon.o
 endif
@@ -1393,12 +1279,10 @@
 ifdef BLK_SHA1
 	SHA1_HEADER = "block-sha1/sha1.h"
 	LIB_OBJS += block-sha1/sha1.o
-	LIB_H += block-sha1/sha1.h
 else
 ifdef PPC_SHA1
 	SHA1_HEADER = "ppc/sha1.h"
 	LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
-	LIB_H += ppc/sha1.h
 else
 ifdef APPLE_COMMON_CRYPTO
 	COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL
@@ -1467,6 +1351,9 @@
 	COMPAT_CFLAGS += -Icompat/regex
 	COMPAT_OBJS += compat/regex/regex.o
 endif
+ifdef NATIVE_CRLF
+	BASIC_CFLAGS += -DNATIVE_CRLF
+endif
 
 ifdef USE_NED_ALLOCATOR
        COMPAT_CFLAGS += -Icompat/nedmalloc
@@ -1490,6 +1377,11 @@
 	BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
 endif
 
+ifdef HAVE_CLOCK_GETTIME
+	BASIC_CFLAGS += -DHAVE_CLOCK_GETTIME
+	EXTLIBS += -lrt
+endif
+
 ifeq ($(TCLTK_PATH),)
 NO_TCLTK = NoThanks
 endif
@@ -1545,13 +1437,13 @@
 PROFILE_DIR := $(CURDIR)
 
 ifeq ("$(PROFILE)","GEN")
-	CFLAGS += -fprofile-generate=$(PROFILE_DIR) -DNO_NORETURN=1
+	BASIC_CFLAGS += -fprofile-generate=$(PROFILE_DIR) -DNO_NORETURN=1
 	EXTLIBS += -lgcov
 	export CCACHE_DISABLE = t
 	V = 1
 else
 ifneq ("$(PROFILE)","")
-	CFLAGS += -fprofile-use=$(PROFILE_DIR) -fprofile-correction -DNO_NORETURN=1
+	BASIC_CFLAGS += -fprofile-use=$(PROFILE_DIR) -fprofile-correction -DNO_NORETURN=1
 	export CCACHE_DISABLE = t
 	V = 1
 endif
@@ -1636,12 +1528,24 @@
 all:: shell_compatibility_test
 
 ifeq "$(PROFILE)" "BUILD"
-ifeq ($(filter all,$(MAKECMDGOALS)),all)
-all:: profile-clean
+all:: profile
+endif
+
+profile:: profile-clean
 	$(MAKE) PROFILE=GEN all
 	$(MAKE) PROFILE=GEN -j1 test
-endif
-endif
+	@if test -n "$$GIT_PERF_REPO" || test -d .git; then \
+		$(MAKE) PROFILE=GEN -j1 perf; \
+	else \
+		echo "Skipping profile of perf tests..."; \
+	fi
+	$(MAKE) PROFILE=USE all
+
+profile-fast: profile-clean
+	$(MAKE) PROFILE=GEN all
+	$(MAKE) PROFILE=GEN -j1 perf
+	$(MAKE) PROFILE=USE all
+
 
 all:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) GIT-BUILD-OPTIONS
 ifneq (,$X)
@@ -1706,8 +1610,8 @@
 	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
 
 git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
-	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ git.o \
-		$(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS)
+	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) git.o \
+		$(BUILTIN_OBJS) $(LIBS)
 
 help.sp help.s help.o: common-cmds.h
 
@@ -1908,29 +1812,13 @@
 missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
 dep_file = $(dir $@).depend/$(notdir $@).d
 dep_args = -MF $(dep_file) -MQ $@ -MMD -MP
-ifdef CHECK_HEADER_DEPENDENCIES
-$(error cannot compute header dependencies outside a normal build. \
-Please unset CHECK_HEADER_DEPENDENCIES and try again)
-endif
 endif
 
 ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
-ifndef CHECK_HEADER_DEPENDENCIES
 dep_dirs =
 missing_dep_dirs =
 dep_args =
 endif
-endif
-
-ifdef CHECK_HEADER_DEPENDENCIES
-ifndef PRINT_HEADER_DEPENDENCIES
-missing_deps = $(filter-out $(notdir $^), \
-	$(notdir $(shell $(MAKE) -s $@ \
-		CHECK_HEADER_DEPENDENCIES=YesPlease \
-		USE_COMPUTED_HEADER_DEPENDENCIES=YesPlease \
-		PRINT_HEADER_DEPENDENCIES=YesPlease)))
-endif
-endif
 
 ASM_SRC := $(wildcard $(OBJECTS:o=S))
 ASM_OBJ := $(ASM_SRC:S=o)
@@ -1938,45 +1826,10 @@
 
 .SUFFIXES:
 
-ifdef PRINT_HEADER_DEPENDENCIES
-$(C_OBJ): %.o: %.c FORCE
-	echo $^
-$(ASM_OBJ): %.o: %.S FORCE
-	echo $^
-
-ifndef CHECK_HEADER_DEPENDENCIES
-$(error cannot print header dependencies during a normal build. \
-Please set CHECK_HEADER_DEPENDENCIES and try again)
-endif
-endif
-
-ifndef PRINT_HEADER_DEPENDENCIES
-ifdef CHECK_HEADER_DEPENDENCIES
-$(C_OBJ): %.o: %.c $(dep_files) FORCE
-	@set -e; echo CHECK $@; \
-	missing_deps="$(missing_deps)"; \
-	if test "$$missing_deps"; \
-	then \
-		echo missing dependencies: $$missing_deps; \
-		false; \
-	fi
-$(ASM_OBJ): %.o: %.S $(dep_files) FORCE
-	@set -e; echo CHECK $@; \
-	missing_deps="$(missing_deps)"; \
-	if test "$$missing_deps"; \
-	then \
-		echo missing dependencies: $$missing_deps; \
-		false; \
-	fi
-endif
-endif
-
-ifndef CHECK_HEADER_DEPENDENCIES
 $(C_OBJ): %.o: %.c GIT-CFLAGS $(missing_dep_dirs)
 	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
 $(ASM_OBJ): %.o: %.S GIT-CFLAGS $(missing_dep_dirs)
 	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
-endif
 
 %.s: %.c GIT-CFLAGS FORCE
 	$(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
@@ -2103,9 +1956,9 @@
 XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 	--keyword=gettextln --keyword=eval_gettextln
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --keyword=__ --language=Perl
-LOCALIZED_C := $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
-LOCALIZED_SH := $(SCRIPT_SH)
-LOCALIZED_PERL := $(SCRIPT_PERL)
+LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
+LOCALIZED_SH = $(SCRIPT_SH)
+LOCALIZED_PERL = $(SCRIPT_PERL)
 
 ifdef XGETTEXT_INCLUDE_TESTS
 LOCALIZED_C += t/t0200/test.c
@@ -2113,7 +1966,7 @@
 LOCALIZED_PERL += t/t0200/test.perl
 endif
 
-po/git.pot: $(LOCALIZED_C)
+po/git.pot: $(GENERATED_H) FORCE
 	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
 	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
 		$(LOCALIZED_SH)
@@ -2328,6 +2181,12 @@
 
 install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)
 
+profile-install: profile
+	$(MAKE) install
+
+profile-fast-install: profile-fast
+	$(MAKE) install
+
 install: all
 	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
 	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
diff --git a/README b/README
index 15a8e23..1083735 100644
--- a/README
+++ b/README
@@ -27,7 +27,7 @@
 Please read the file INSTALL for installation instructions.
 
 See Documentation/gittutorial.txt to get started, then see
-Documentation/everyday.txt for a useful minimum set of commands, and
+Documentation/giteveryday.txt for a useful minimum set of commands, and
 Documentation/git-commandname.txt for documentation of each command.
 If git has been correctly installed, then the tutorial can also be
 read with "man gittutorial" or "git help tutorial", and the
diff --git a/RelNotes b/RelNotes
index 76462ab..c473b35 120000
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/2.0.4.txt
\ No newline at end of file
+Documentation/RelNotes/2.2.0.txt
\ No newline at end of file
diff --git a/abspath.c b/abspath.c
index ca33558..5edb4e7 100644
--- a/abspath.c
+++ b/abspath.c
@@ -33,7 +33,7 @@
  */
 static const char *real_path_internal(const char *path, int die_on_error)
 {
-	static char bufs[2][PATH_MAX + 1], *buf = bufs[0], *next_buf = bufs[1];
+	static struct strbuf sb = STRBUF_INIT;
 	char *retval = NULL;
 
 	/*
@@ -41,16 +41,14 @@
 	 * here so that we can chdir() back to it at the end of the
 	 * function:
 	 */
-	char cwd[1024] = "";
-
-	int buf_index = 1;
+	struct strbuf cwd = STRBUF_INIT;
 
 	int depth = MAXDEPTH;
 	char *last_elem = NULL;
 	struct stat st;
 
 	/* We've already done it */
-	if (path == buf || path == next_buf)
+	if (path == sb.buf)
 		return path;
 
 	if (!*path) {
@@ -60,41 +58,38 @@
 			goto error_out;
 	}
 
-	if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX) {
-		if (die_on_error)
-			die("Too long path: %.*s", 60, path);
-		else
-			goto error_out;
-	}
+	strbuf_reset(&sb);
+	strbuf_addstr(&sb, path);
 
 	while (depth--) {
-		if (!is_directory(buf)) {
-			char *last_slash = find_last_dir_sep(buf);
+		if (!is_directory(sb.buf)) {
+			char *last_slash = find_last_dir_sep(sb.buf);
 			if (last_slash) {
 				last_elem = xstrdup(last_slash + 1);
-				last_slash[1] = '\0';
+				strbuf_setlen(&sb, last_slash - sb.buf + 1);
 			} else {
-				last_elem = xstrdup(buf);
-				*buf = '\0';
+				last_elem = xmemdupz(sb.buf, sb.len);
+				strbuf_reset(&sb);
 			}
 		}
 
-		if (*buf) {
-			if (!*cwd && !getcwd(cwd, sizeof(cwd))) {
+		if (sb.len) {
+			if (!cwd.len && strbuf_getcwd(&cwd)) {
 				if (die_on_error)
 					die_errno("Could not get current working directory");
 				else
 					goto error_out;
 			}
 
-			if (chdir(buf)) {
+			if (chdir(sb.buf)) {
 				if (die_on_error)
-					die_errno("Could not switch to '%s'", buf);
+					die_errno("Could not switch to '%s'",
+						  sb.buf);
 				else
 					goto error_out;
 			}
 		}
-		if (!getcwd(buf, PATH_MAX)) {
+		if (strbuf_getcwd(&sb)) {
 			if (die_on_error)
 				die_errno("Could not get current working directory");
 			else
@@ -102,48 +97,35 @@
 		}
 
 		if (last_elem) {
-			size_t len = strlen(buf);
-			if (len + strlen(last_elem) + 2 > PATH_MAX) {
-				if (die_on_error)
-					die("Too long path name: '%s/%s'",
-					    buf, last_elem);
-				else
-					goto error_out;
-			}
-			if (len && !is_dir_sep(buf[len - 1]))
-				buf[len++] = '/';
-			strcpy(buf + len, last_elem);
+			if (sb.len && !is_dir_sep(sb.buf[sb.len - 1]))
+				strbuf_addch(&sb, '/');
+			strbuf_addstr(&sb, last_elem);
 			free(last_elem);
 			last_elem = NULL;
 		}
 
-		if (!lstat(buf, &st) && S_ISLNK(st.st_mode)) {
-			ssize_t len = readlink(buf, next_buf, PATH_MAX);
+		if (!lstat(sb.buf, &st) && S_ISLNK(st.st_mode)) {
+			struct strbuf next_sb = STRBUF_INIT;
+			ssize_t len = strbuf_readlink(&next_sb, sb.buf, 0);
 			if (len < 0) {
 				if (die_on_error)
-					die_errno("Invalid symlink '%s'", buf);
+					die_errno("Invalid symlink '%s'",
+						  sb.buf);
 				else
 					goto error_out;
 			}
-			if (PATH_MAX <= len) {
-				if (die_on_error)
-					die("symbolic link too long: %s", buf);
-				else
-					goto error_out;
-			}
-			next_buf[len] = '\0';
-			buf = next_buf;
-			buf_index = 1 - buf_index;
-			next_buf = bufs[buf_index];
+			strbuf_swap(&sb, &next_sb);
+			strbuf_release(&next_sb);
 		} else
 			break;
 	}
 
-	retval = buf;
+	retval = sb.buf;
 error_out:
 	free(last_elem);
-	if (*cwd && chdir(cwd))
-		die_errno("Could not change back to '%s'", cwd);
+	if (cwd.len && chdir(cwd.buf))
+		die_errno("Could not change back to '%s'", cwd.buf);
+	strbuf_release(&cwd);
 
 	return retval;
 }
@@ -158,54 +140,16 @@
 	return real_path_internal(path, 0);
 }
 
-static const char *get_pwd_cwd(void)
-{
-	static char cwd[PATH_MAX + 1];
-	char *pwd;
-	struct stat cwd_stat, pwd_stat;
-	if (getcwd(cwd, PATH_MAX) == NULL)
-		return NULL;
-	pwd = getenv("PWD");
-	if (pwd && strcmp(pwd, cwd)) {
-		stat(cwd, &cwd_stat);
-		if ((cwd_stat.st_dev || cwd_stat.st_ino) &&
-		    !stat(pwd, &pwd_stat) &&
-		    pwd_stat.st_dev == cwd_stat.st_dev &&
-		    pwd_stat.st_ino == cwd_stat.st_ino) {
-			strlcpy(cwd, pwd, PATH_MAX);
-		}
-	}
-	return cwd;
-}
-
 /*
  * Use this to get an absolute path from a relative one. If you want
  * to resolve links, you should use real_path.
- *
- * If the path is already absolute, then return path. As the user is
- * never meant to free the return value, we're safe.
  */
 const char *absolute_path(const char *path)
 {
-	static char buf[PATH_MAX + 1];
-
-	if (!*path) {
-		die("The empty string is not a valid path");
-	} else if (is_absolute_path(path)) {
-		if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX)
-			die("Too long path: %.*s", 60, path);
-	} else {
-		size_t len;
-		const char *fmt;
-		const char *cwd = get_pwd_cwd();
-		if (!cwd)
-			die_errno("Cannot determine the current working directory");
-		len = strlen(cwd);
-		fmt = (len > 0 && is_dir_sep(cwd[len - 1])) ? "%s%s" : "%s/%s";
-		if (snprintf(buf, PATH_MAX, fmt, cwd, path) >= PATH_MAX)
-			die("Too long path: %.*s", 60, path);
-	}
-	return buf;
+	static struct strbuf sb = STRBUF_INIT;
+	strbuf_reset(&sb);
+	strbuf_add_absolute_path(&sb, path);
+	return sb.buf;
 }
 
 /*
diff --git a/advice.c b/advice.c
index 486f823..3b8bf3c 100644
--- a/advice.c
+++ b/advice.c
@@ -61,9 +61,12 @@
 
 int git_default_advice_config(const char *var, const char *value)
 {
-	const char *k = skip_prefix(var, "advice.");
+	const char *k;
 	int i;
 
+	if (!skip_prefix(var, "advice.", &k))
+		return 0;
+
 	for (i = 0; i < ARRAY_SIZE(advice_config); i++) {
 		if (strcmp(k, advice_config[i].name))
 			continue;
@@ -76,16 +79,14 @@
 
 int error_resolve_conflict(const char *me)
 {
-	error("'%s' is not possible because you have unmerged files.", me);
+	error("%s is not possible because you have unmerged files.", me);
 	if (advice_resolve_conflict)
 		/*
 		 * Message used both when 'git commit' fails and when
 		 * other commands doing a merge do.
 		 */
-		advise(_("Fix them up in the work tree,\n"
-			 "and then use 'git add/rm <file>' as\n"
-			 "appropriate to mark resolution and make a commit,\n"
-			 "or use 'git commit -a'."));
+		advise(_("Fix them up in the work tree, and then use 'git add/rm <file>'\n"
+			 "as appropriate to mark resolution and make a commit."));
 	return -1;
 }
 
diff --git a/alias.c b/alias.c
index 5efc3d6..6aa164a 100644
--- a/alias.c
+++ b/alias.c
@@ -1,25 +1,13 @@
 #include "cache.h"
 
-static const char *alias_key;
-static char *alias_val;
-
-static int alias_lookup_cb(const char *k, const char *v, void *cb)
-{
-	if (starts_with(k, "alias.") && !strcmp(k + 6, alias_key)) {
-		if (!v)
-			return config_error_nonbool(k);
-		alias_val = xstrdup(v);
-		return 0;
-	}
-	return 0;
-}
-
 char *alias_lookup(const char *alias)
 {
-	alias_key = alias;
-	alias_val = NULL;
-	git_config(alias_lookup_cb, NULL);
-	return alias_val;
+	char *v = NULL;
+	struct strbuf key = STRBUF_INIT;
+	strbuf_addf(&key, "alias.%s", alias);
+	git_config_get_string(key.buf, &v);
+	strbuf_release(&key);
+	return v;
 }
 
 #define SPLIT_CMDLINE_BAD_ENDING 1
diff --git a/archive-tar.c b/archive-tar.c
index 719b629..0d1e6bd 100644
--- a/archive-tar.c
+++ b/archive-tar.c
@@ -395,7 +395,7 @@
 				    struct archiver_args *args)
 {
 	struct strbuf cmd = STRBUF_INIT;
-	struct child_process filter;
+	struct child_process filter = CHILD_PROCESS_INIT;
 	const char *argv[2];
 	int r;
 
@@ -406,7 +406,6 @@
 	if (args->compression_level >= 0)
 		strbuf_addf(&cmd, " -%d", args->compression_level);
 
-	memset(&filter, 0, sizeof(filter));
 	argv[0] = cmd.buf;
 	argv[1] = NULL;
 	filter.argv = argv;
diff --git a/archive.c b/archive.c
index 3fc0fb2..94a9981 100644
--- a/archive.c
+++ b/archive.c
@@ -5,6 +5,7 @@
 #include "archive.h"
 #include "parse-options.h"
 #include "unpack-trees.h"
+#include "dir.h"
 
 static char const * const archive_usage[] = {
 	N_("git archive [options] <tree-ish> [<path>...]"),
@@ -98,9 +99,19 @@
 	check[1].attr = attr_export_subst;
 }
 
+struct directory {
+	struct directory *up;
+	unsigned char sha1[20];
+	int baselen, len;
+	unsigned mode;
+	int stage;
+	char path[FLEX_ARRAY];
+};
+
 struct archiver_context {
 	struct archiver_args *args;
 	write_archive_entry_fn_t write_entry;
+	struct directory *bottom;
 };
 
 static int write_archive_entry(const unsigned char *sha1, const char *base,
@@ -146,6 +157,65 @@
 	return write_entry(args, sha1, path.buf, path.len, mode);
 }
 
+static void queue_directory(const unsigned char *sha1,
+		const char *base, int baselen, const char *filename,
+		unsigned mode, int stage, struct archiver_context *c)
+{
+	struct directory *d;
+	d = xmallocz(sizeof(*d) + baselen + 1 + strlen(filename));
+	d->up	   = c->bottom;
+	d->baselen = baselen;
+	d->mode	   = mode;
+	d->stage   = stage;
+	c->bottom  = d;
+	d->len = sprintf(d->path, "%.*s%s/", baselen, base, filename);
+	hashcpy(d->sha1, sha1);
+}
+
+static int write_directory(struct archiver_context *c)
+{
+	struct directory *d = c->bottom;
+	int ret;
+
+	if (!d)
+		return 0;
+	c->bottom = d->up;
+	d->path[d->len - 1] = '\0'; /* no trailing slash */
+	ret =
+		write_directory(c) ||
+		write_archive_entry(d->sha1, d->path, d->baselen,
+				    d->path + d->baselen, d->mode,
+				    d->stage, c) != READ_TREE_RECURSIVE;
+	free(d);
+	return ret ? -1 : 0;
+}
+
+static int queue_or_write_archive_entry(const unsigned char *sha1,
+		const char *base, int baselen, const char *filename,
+		unsigned mode, int stage, void *context)
+{
+	struct archiver_context *c = context;
+
+	while (c->bottom &&
+	       !(baselen >= c->bottom->len &&
+		 !strncmp(base, c->bottom->path, c->bottom->len))) {
+		struct directory *next = c->bottom->up;
+		free(c->bottom);
+		c->bottom = next;
+	}
+
+	if (S_ISDIR(mode)) {
+		queue_directory(sha1, base, baselen, filename,
+				mode, stage, c);
+		return READ_TREE_RECURSIVE;
+	}
+
+	if (write_directory(c))
+		return -1;
+	return write_archive_entry(sha1, base, baselen, filename, mode,
+				   stage, context);
+}
+
 int write_archive_entries(struct archiver_args *args,
 		write_archive_entry_fn_t write_entry)
 {
@@ -167,6 +237,7 @@
 			return err;
 	}
 
+	memset(&context, 0, sizeof(context));
 	context.args = args;
 	context.write_entry = write_entry;
 
@@ -187,9 +258,17 @@
 	}
 
 	err = read_tree_recursive(args->tree, "", 0, 0, &args->pathspec,
-				  write_archive_entry, &context);
+				  args->pathspec.has_wildcard ?
+				  queue_or_write_archive_entry :
+				  write_archive_entry,
+				  &context);
 	if (err == READ_TREE_RECURSIVE)
 		err = 0;
+	while (context.bottom) {
+		struct directory *next = context.bottom->up;
+		free(context.bottom);
+		context.bottom = next;
+	}
 	return err;
 }
 
@@ -211,7 +290,16 @@
 			int baselen, const char *filename, unsigned mode,
 			int stage, void *context)
 {
-	return -1;
+	int ret = -1;
+	if (S_ISDIR(mode)) {
+		struct strbuf sb = STRBUF_INIT;
+		strbuf_addstr(&sb, base);
+		strbuf_addstr(&sb, filename);
+		if (!match_pathspec(context, sb.buf, sb.len, 0, NULL, 1))
+			ret = READ_TREE_RECURSIVE;
+		strbuf_release(&sb);
+	}
+	return ret;
 }
 
 static int path_exists(struct tree *tree, const char *path)
@@ -221,7 +309,9 @@
 	int ret;
 
 	parse_pathspec(&pathspec, 0, 0, "", paths);
-	ret = read_tree_recursive(tree, "", 0, 0, &pathspec, reject_entry, NULL);
+	pathspec.recursive = 1;
+	ret = read_tree_recursive(tree, "", 0, 0, &pathspec,
+				  reject_entry, &pathspec);
 	free_pathspec(&pathspec);
 	return ret != 0;
 }
@@ -237,6 +327,7 @@
 	parse_pathspec(&ar_args->pathspec, 0,
 		       PATHSPEC_PREFER_FULL,
 		       "", pathspec);
+	ar_args->pathspec.recursive = 1;
 	if (pathspec) {
 		while (*pathspec) {
 			if (**pathspec && !path_exists(ar_args->tree, *pathspec))
@@ -402,14 +493,6 @@
 	return argc;
 }
 
-static int git_default_archive_config(const char *var, const char *value,
-				      void *cb)
-{
-	if (!strcmp(var, "uploadarchive.allowunreachable"))
-		remote_allow_unreachable = git_config_bool(var, value);
-	return git_default_config(var, value, cb);
-}
-
 int write_archive(int argc, const char **argv, const char *prefix,
 		  int setup_prefix, const char *name_hint, int remote)
 {
@@ -420,7 +503,9 @@
 	if (setup_prefix && prefix == NULL)
 		prefix = setup_git_directory_gently(&nongit);
 
-	git_config(git_default_archive_config, NULL);
+	git_config_get_bool("uploadarchive.allowunreachable", &remote_allow_unreachable);
+	git_config(git_default_config, NULL);
+
 	init_tar_archiver();
 	init_zip_archiver();
 
diff --git a/argv-array.c b/argv-array.c
index 9e960d5..256741d 100644
--- a/argv-array.c
+++ b/argv-array.c
@@ -68,23 +68,3 @@
 	}
 	argv_array_init(array);
 }
-
-const char **argv_array_detach(struct argv_array *array, int *argc)
-{
-	const char **argv =
-		array->argv == empty_argv || array->argc == 0 ? NULL : array->argv;
-	if (argc)
-		*argc = array->argc;
-	argv_array_init(array);
-	return argv;
-}
-
-void argv_array_free_detached(const char **argv)
-{
-	if (argv) {
-		int i;
-		for (i = 0; argv[i]; i++)
-			free((char **)argv[i]);
-		free(argv);
-	}
-}
diff --git a/argv-array.h b/argv-array.h
index 85ba438..c65e6e8 100644
--- a/argv-array.h
+++ b/argv-array.h
@@ -19,7 +19,5 @@
 void argv_array_pushl(struct argv_array *, ...);
 void argv_array_pop(struct argv_array *);
 void argv_array_clear(struct argv_array *);
-const char **argv_array_detach(struct argv_array *array, int *argc);
-void argv_array_free_detached(const char **argv);
 
 #endif /* ARGV_ARRAY_H */
diff --git a/attr.c b/attr.c
index 734222d..cd54697 100644
--- a/attr.c
+++ b/attr.c
@@ -97,8 +97,7 @@
 	a->attr_nr = attr_nr++;
 	git_attr_hash[pos] = a;
 
-	check_all_attr = xrealloc(check_all_attr,
-				  sizeof(*check_all_attr) * attr_nr);
+	REALLOC_ARRAY(check_all_attr, attr_nr);
 	check_all_attr[a->attr_nr].attr = a;
 	check_all_attr[a->attr_nr].value = ATTR__UNKNOWN;
 	return a;
diff --git a/bisect.c b/bisect.c
index d6e851d..df09cbc 100644
--- a/bisect.c
+++ b/bisect.c
@@ -215,11 +215,12 @@
 	}
 	qsort(array, cnt, sizeof(*array), compare_commit_dist);
 	for (p = list, i = 0; i < cnt; i++) {
-		struct name_decoration *r = xmalloc(sizeof(*r) + 100);
+		char buf[100]; /* enough for dist=%d */
 		struct object *obj = &(array[i].commit->object);
 
-		sprintf(r->name, "dist=%d", array[i].distance);
-		r->next = add_decoration(&name_decoration, obj, r);
+		snprintf(buf, sizeof(buf), "dist=%d", array[i].distance);
+		add_name_decoration(DECORATION_NONE, buf, obj);
+
 		p->item = array[i].commit;
 		p = p->next;
 	}
diff --git a/branch.c b/branch.c
index 660097b..4bab55a 100644
--- a/branch.c
+++ b/branch.c
@@ -50,11 +50,11 @@
 
 void install_branch_config(int flag, const char *local, const char *origin, const char *remote)
 {
-	const char *shortname = skip_prefix(remote, "refs/heads/");
+	const char *shortname = NULL;
 	struct strbuf key = STRBUF_INIT;
 	int rebasing = should_setup_rebase(origin);
 
-	if (shortname
+	if (skip_prefix(remote, "refs/heads/", &shortname)
 	    && !strcmp(local, shortname)
 	    && !origin) {
 		warning(_("Not setting branch %s as its own upstream."),
@@ -140,33 +140,17 @@
 	return 0;
 }
 
-struct branch_desc_cb {
-	const char *config_name;
-	const char *value;
-};
-
-static int read_branch_desc_cb(const char *var, const char *value, void *cb)
-{
-	struct branch_desc_cb *desc = cb;
-	if (strcmp(desc->config_name, var))
-		return 0;
-	free((char *)desc->value);
-	return git_config_string(&desc->value, var, value);
-}
-
 int read_branch_desc(struct strbuf *buf, const char *branch_name)
 {
-	struct branch_desc_cb cb;
+	char *v = NULL;
 	struct strbuf name = STRBUF_INIT;
 	strbuf_addf(&name, "branch.%s.description", branch_name);
-	cb.config_name = name.buf;
-	cb.value = NULL;
-	if (git_config(read_branch_desc_cb, &cb) < 0) {
+	if (git_config_get_string(name.buf, &v)) {
 		strbuf_release(&name);
 		return -1;
 	}
-	if (cb.value)
-		strbuf_addstr(buf, cb.value);
+	strbuf_addstr(buf, v);
+	free(v);
 	strbuf_release(&name);
 	return 0;
 }
@@ -186,7 +170,7 @@
 		const char *head;
 		unsigned char sha1[20];
 
-		head = resolve_ref_unsafe("HEAD", sha1, 0, NULL);
+		head = resolve_ref_unsafe("HEAD", 0, sha1, NULL);
 		if (!is_bare_repository() && head && !strcmp(head, ref->buf))
 			die(_("Cannot force update the current branch."));
 	}
@@ -226,7 +210,6 @@
 		   int force, int reflog, int clobber_head,
 		   int quiet, enum branch_track track)
 {
-	struct ref_lock *lock = NULL;
 	struct commit *commit;
 	unsigned char sha1[20];
 	char *real_ref, msg[PATH_MAX + 20];
@@ -285,15 +268,6 @@
 		die(_("Not a valid branch point: '%s'."), start_name);
 	hashcpy(sha1, commit->object.sha1);
 
-	if (!dont_change_ref) {
-		lock = lock_any_ref_for_update(ref.buf, NULL, 0, NULL);
-		if (!lock)
-			die_errno(_("Failed to lock ref for update"));
-	}
-
-	if (reflog)
-		log_all_ref_updates = 1;
-
 	if (forcing)
 		snprintf(msg, sizeof msg, "branch: Reset to %s",
 			 start_name);
@@ -301,13 +275,26 @@
 		snprintf(msg, sizeof msg, "branch: Created from %s",
 			 start_name);
 
+	if (reflog)
+		log_all_ref_updates = 1;
+
+	if (!dont_change_ref) {
+		struct ref_transaction *transaction;
+		struct strbuf err = STRBUF_INIT;
+
+		transaction = ref_transaction_begin(&err);
+		if (!transaction ||
+		    ref_transaction_update(transaction, ref.buf, sha1,
+					   null_sha1, 0, !forcing, msg, &err) ||
+		    ref_transaction_commit(transaction, &err))
+			die("%s", err.buf);
+		ref_transaction_free(transaction);
+		strbuf_release(&err);
+	}
+
 	if (real_ref && track)
 		setup_tracking(ref.buf + 11, real_ref, track, quiet);
 
-	if (!dont_change_ref)
-		if (write_ref_sha1(lock, sha1, msg) < 0)
-			die_errno(_("Failed to write ref"));
-
 	strbuf_release(&ref);
 	free(real_ref);
 }
diff --git a/builtin.h b/builtin.h
index c47c110..b87df70 100644
--- a/builtin.h
+++ b/builtin.h
@@ -73,6 +73,7 @@
 extern int cmd_help(int argc, const char **argv, const char *prefix);
 extern int cmd_index_pack(int argc, const char **argv, const char *prefix);
 extern int cmd_init_db(int argc, const char **argv, const char *prefix);
+extern int cmd_interpret_trailers(int argc, const char **argv, const char *prefix);
 extern int cmd_log(int argc, const char **argv, const char *prefix);
 extern int cmd_log_reflog(int argc, const char **argv, const char *prefix);
 extern int cmd_ls_files(int argc, const char **argv, const char *prefix);
@@ -128,6 +129,7 @@
 extern int cmd_upload_archive(int argc, const char **argv, const char *prefix);
 extern int cmd_upload_archive_writer(int argc, const char **argv, const char *prefix);
 extern int cmd_var(int argc, const char **argv, const char *prefix);
+extern int cmd_verify_commit(int argc, const char **argv, const char *prefix);
 extern int cmd_verify_tag(int argc, const char **argv, const char *prefix);
 extern int cmd_version(int argc, const char **argv, const char *prefix);
 extern int cmd_whatchanged(int argc, const char **argv, const char *prefix);
diff --git a/builtin/add.c b/builtin/add.c
index 459208a..ae6d3e2 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -5,6 +5,7 @@
  */
 #include "cache.h"
 #include "builtin.h"
+#include "lockfile.h"
 #include "dir.h"
 #include "pathspec.h"
 #include "exec_cmd.h"
@@ -180,7 +181,7 @@
 	char *file = git_pathdup("ADD_EDIT.patch");
 	const char *apply_argv[] = { "apply", "--recount", "--cached",
 		NULL, NULL };
-	struct child_process child;
+	struct child_process child = CHILD_PROCESS_INIT;
 	struct rev_info rev;
 	int out;
 	struct stat st;
@@ -214,7 +215,6 @@
 	if (!st.st_size)
 		die(_("Empty patch. Aborted."));
 
-	memset(&child, 0, sizeof(child));
 	child.git_cmd = 1;
 	child.argv = apply_argv;
 	if (run_command(&child))
@@ -299,7 +299,6 @@
 int cmd_add(int argc, const char **argv, const char *prefix)
 {
 	int exit_status = 0;
-	int newfd;
 	struct pathspec pathspec;
 	struct dir_struct dir;
 	int flags;
@@ -345,7 +344,7 @@
 	add_new_files = !take_worktree_changes && !refresh_only;
 	require_pathspec = !take_worktree_changes;
 
-	newfd = hold_locked_index(&lock_file, 1);
+	hold_locked_index(&lock_file, 1);
 
 	flags = ((verbose ? ADD_CACHE_VERBOSE : 0) |
 		 (show_only ? ADD_CACHE_PRETEND : 0) |
@@ -443,8 +442,7 @@
 
 finish:
 	if (active_cache_changed) {
-		if (write_cache(newfd, active_cache, active_nr) ||
-		    commit_locked_index(&lock_file))
+		if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
 			die(_("Unable to write new index file"));
 	}
 
diff --git a/builtin/apply.c b/builtin/apply.c
index 622ee16..6696ea4 100644
--- a/builtin/apply.c
+++ b/builtin/apply.c
@@ -7,6 +7,7 @@
  *
  */
 #include "cache.h"
+#include "lockfile.h"
 #include "cache-tree.h"
 #include "quote.h"
 #include "blob.h"
@@ -435,7 +436,7 @@
 
 static int is_dev_null(const char *str)
 {
-	return !memcmp("/dev/null", str, 9) && isspace(str[9]);
+	return skip_prefix(str, "/dev/null", &str) && isspace(*str);
 }
 
 #define TERM_SPACE	1
@@ -1075,7 +1076,7 @@
 
 	line = ptr + 2;
 	ptr = strchr(line, ' ');
-	eol = strchr(line, '\n');
+	eol = strchrnul(line, '\n');
 
 	if (!ptr || eol < ptr)
 		ptr = eol;
@@ -1281,9 +1282,7 @@
 	 */
 	patch->def_name = git_header_name(line, len);
 	if (patch->def_name && root) {
-		char *s = xmalloc(root_len + strlen(patch->def_name) + 1);
-		strcpy(s, root);
-		strcpy(s + root_len, patch->def_name);
+		char *s = xstrfmt("%s%s", root, patch->def_name);
 		free(patch->def_name);
 		patch->def_name = s;
 	}
@@ -1922,6 +1921,66 @@
 	return used;
 }
 
+static void prefix_one(char **name)
+{
+	char *old_name = *name;
+	if (!old_name)
+		return;
+	*name = xstrdup(prefix_filename(prefix, prefix_length, *name));
+	free(old_name);
+}
+
+static void prefix_patch(struct patch *p)
+{
+	if (!prefix || p->is_toplevel_relative)
+		return;
+	prefix_one(&p->new_name);
+	prefix_one(&p->old_name);
+}
+
+/*
+ * include/exclude
+ */
+
+static struct string_list limit_by_name;
+static int has_include;
+static void add_name_limit(const char *name, int exclude)
+{
+	struct string_list_item *it;
+
+	it = string_list_append(&limit_by_name, name);
+	it->util = exclude ? NULL : (void *) 1;
+}
+
+static int use_patch(struct patch *p)
+{
+	const char *pathname = p->new_name ? p->new_name : p->old_name;
+	int i;
+
+	/* Paths outside are not touched regardless of "--include" */
+	if (0 < prefix_length) {
+		int pathlen = strlen(pathname);
+		if (pathlen <= prefix_length ||
+		    memcmp(prefix, pathname, prefix_length))
+			return 0;
+	}
+
+	/* See if it matches any of exclude/include rule */
+	for (i = 0; i < limit_by_name.nr; i++) {
+		struct string_list_item *it = &limit_by_name.items[i];
+		if (!wildmatch(it->string, pathname, 0, NULL))
+			return (it->util != NULL);
+	}
+
+	/*
+	 * If we had any include, a path that does not match any rule is
+	 * not used.  Otherwise, we saw bunch of exclude rules (or none)
+	 * and such a path is used.
+	 */
+	return !has_include;
+}
+
+
 /*
  * Read the patch text in "buffer" that extends for "size" bytes; stop
  * reading after seeing a single patch (i.e. changes to a single file).
@@ -1937,9 +1996,14 @@
 	if (offset < 0)
 		return offset;
 
-	patch->ws_rule = whitespace_rule(patch->new_name
-					 ? patch->new_name
-					 : patch->old_name);
+	prefix_patch(patch);
+
+	if (!use_patch(patch))
+		patch->ws_rule = 0;
+	else
+		patch->ws_rule = whitespace_rule(patch->new_name
+						 ? patch->new_name
+						 : patch->old_name);
 
 	patchsize = parse_single_patch(buffer + offset + hdrsize,
 				       size - offset - hdrsize, patch);
@@ -2563,7 +2627,7 @@
 		 * NOTE: this knows that we never call remove_first_line()
 		 * on anything other than pre/post image.
 		 */
-		img->line = xrealloc(img->line, nr * sizeof(*img->line));
+		REALLOC_ARRAY(img->line, nr);
 		img->line_allocated = img->line;
 	}
 	if (preimage_limit != postimage->nr)
@@ -3084,13 +3148,15 @@
 	}
 }
 
-static int checkout_target(struct cache_entry *ce, struct stat *st)
+static int checkout_target(struct index_state *istate,
+			   struct cache_entry *ce, struct stat *st)
 {
 	struct checkout costate;
 
 	memset(&costate, 0, sizeof(costate));
 	costate.base_dir = "";
 	costate.refresh_cache = 1;
+	costate.istate = istate;
 	if (checkout_entry(ce, &costate, NULL) || lstat(ce->name, st))
 		return error(_("cannot checkout %s"), ce->name);
 	return 0;
@@ -3257,7 +3323,7 @@
 	if (lstat(name, &st)) {
 		if (errno != ENOENT)
 			return error(_("%s: %s"), name, strerror(errno));
-		if (checkout_target(ce, &st))
+		if (checkout_target(&the_index, ce, &st))
 			return -1;
 	}
 	if (verify_index_match(ce, &st))
@@ -3411,7 +3477,7 @@
 		}
 		*ce = active_cache[pos];
 		if (stat_ret < 0) {
-			if (checkout_target(*ce, st))
+			if (checkout_target(&the_index, *ce, st))
 				return -1;
 		}
 		if (!cached && verify_index_match(*ce, st))
@@ -3644,7 +3710,7 @@
 {
 	struct patch *patch;
 	struct index_state result = { NULL };
-	int fd;
+	static struct lock_file lock;
 
 	/* Once we start supporting the reverse patch, it may be
 	 * worth showing the new sha1 prefix, but until then...
@@ -3682,8 +3748,8 @@
 			die ("Could not add %s to temporary index", name);
 	}
 
-	fd = open(filename, O_WRONLY | O_CREAT, 0666);
-	if (fd < 0 || write_index(&result, fd) || close(fd))
+	hold_lock_file_for_update(&lock, filename, LOCK_DIE_ON_ERROR);
+	if (write_locked_index(&result, &lock, COMMIT_LOCK))
 		die ("Could not write temporary index to %s", filename);
 
 	discard_index(&result);
@@ -3845,9 +3911,10 @@
 	ce->ce_flags = create_ce_flags(0);
 	ce->ce_namelen = namelen;
 	if (S_ISGITLINK(mode)) {
-		const char *s = buf;
+		const char *s;
 
-		if (get_sha1_hex(s + strlen("Subproject commit "), ce->sha1))
+		if (!skip_prefix(buf, "Subproject commit ", &s) ||
+		    get_sha1_hex(s, ce->sha1))
 			die(_("corrupt patch for submodule %s"), path);
 	} else {
 		if (!cached) {
@@ -4126,64 +4193,6 @@
 
 static struct lock_file lock_file;
 
-static struct string_list limit_by_name;
-static int has_include;
-static void add_name_limit(const char *name, int exclude)
-{
-	struct string_list_item *it;
-
-	it = string_list_append(&limit_by_name, name);
-	it->util = exclude ? NULL : (void *) 1;
-}
-
-static int use_patch(struct patch *p)
-{
-	const char *pathname = p->new_name ? p->new_name : p->old_name;
-	int i;
-
-	/* Paths outside are not touched regardless of "--include" */
-	if (0 < prefix_length) {
-		int pathlen = strlen(pathname);
-		if (pathlen <= prefix_length ||
-		    memcmp(prefix, pathname, prefix_length))
-			return 0;
-	}
-
-	/* See if it matches any of exclude/include rule */
-	for (i = 0; i < limit_by_name.nr; i++) {
-		struct string_list_item *it = &limit_by_name.items[i];
-		if (!wildmatch(it->string, pathname, 0, NULL))
-			return (it->util != NULL);
-	}
-
-	/*
-	 * If we had any include, a path that does not match any rule is
-	 * not used.  Otherwise, we saw bunch of exclude rules (or none)
-	 * and such a path is used.
-	 */
-	return !has_include;
-}
-
-
-static void prefix_one(char **name)
-{
-	char *old_name = *name;
-	if (!old_name)
-		return;
-	*name = xstrdup(prefix_filename(prefix, prefix_length, *name));
-	free(old_name);
-}
-
-static void prefix_patches(struct patch *p)
-{
-	if (!prefix || p->is_toplevel_relative)
-		return;
-	for ( ; p; p = p->next) {
-		prefix_one(&p->new_name);
-		prefix_one(&p->old_name);
-	}
-}
-
 #define INACCURATE_EOF	(1<<0)
 #define RECOUNT		(1<<1)
 
@@ -4209,8 +4218,6 @@
 			break;
 		if (apply_in_reverse)
 			reverse_patches(patch);
-		if (prefix)
-			prefix_patches(patch);
 		if (use_patch(patch)) {
 			patch_stats(patch);
 			*listp = patch;
@@ -4268,13 +4275,11 @@
 	return 0;
 }
 
-static int git_apply_config(const char *var, const char *value, void *cb)
+static void git_apply_config(void)
 {
-	if (!strcmp(var, "apply.whitespace"))
-		return git_config_string(&apply_default_whitespace, var, value);
-	else if (!strcmp(var, "apply.ignorewhitespace"))
-		return git_config_string(&apply_default_ignorewhitespace, var, value);
-	return git_default_config(var, value, cb);
+	git_config_get_string_const("apply.whitespace", &apply_default_whitespace);
+	git_config_get_string_const("apply.ignorewhitespace", &apply_default_ignorewhitespace);
+	git_config(git_default_config, NULL);
 }
 
 static int option_parse_exclude(const struct option *opt,
@@ -4422,7 +4427,7 @@
 
 	prefix = prefix_;
 	prefix_length = prefix ? strlen(prefix) : 0;
-	git_config(git_apply_config, NULL);
+	git_apply_config();
 	if (apply_default_whitespace)
 		parse_whitespace_option(apply_default_whitespace);
 	if (apply_default_ignorewhitespace)
@@ -4501,8 +4506,7 @@
 	}
 
 	if (update_index) {
-		if (write_cache(newfd, active_cache, active_nr) ||
-		    commit_locked_index(&lock_file))
+		if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
 			die(_("Unable to write new index file"));
 	}
 
diff --git a/builtin/blame.c b/builtin/blame.c
index eefd6bc..303e217 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -1,7 +1,8 @@
 /*
  * Blame
  *
- * Copyright (c) 2006, Junio C Hamano
+ * Copyright (c) 2006, 2014 by its authors
+ * See COPYING for licensing conditions
  */
 
 #include "cache.h"
@@ -18,7 +19,9 @@
 #include "cache-tree.h"
 #include "string-list.h"
 #include "mailmap.h"
+#include "mergesort.h"
 #include "parse-options.h"
+#include "prio-queue.h"
 #include "utf8.h"
 #include "userdiff.h"
 #include "line-range.h"
@@ -83,11 +86,42 @@
  */
 struct origin {
 	int refcnt;
+	/* Record preceding blame record for this blob */
 	struct origin *previous;
+	/* origins are put in a list linked via `next' hanging off the
+	 * corresponding commit's util field in order to make finding
+	 * them fast.  The presence in this chain does not count
+	 * towards the origin's reference count.  It is tempting to
+	 * let it count as long as the commit is pending examination,
+	 * but even under circumstances where the commit will be
+	 * present multiple times in the priority queue of unexamined
+	 * commits, processing the first instance will not leave any
+	 * work requiring the origin data for the second instance.  An
+	 * interspersed commit changing that would have to be
+	 * preexisting with a different ancestry and with the same
+	 * commit date in order to wedge itself between two instances
+	 * of the same commit in the priority queue _and_ produce
+	 * blame entries relevant for it.  While we don't want to let
+	 * us get tripped up by this case, it certainly does not seem
+	 * worth optimizing for.
+	 */
+	struct origin *next;
 	struct commit *commit;
+	/* `suspects' contains blame entries that may be attributed to
+	 * this origin's commit or to parent commits.  When a commit
+	 * is being processed, all suspects will be moved, either by
+	 * assigning them to an origin in a different commit, or by
+	 * shipping them to the scoreboard's ent list because they
+	 * cannot be attributed to a different commit.
+	 */
+	struct blame_entry *suspects;
 	mmfile_t file;
 	unsigned char blob_sha1[20];
 	unsigned mode;
+	/* guilty gets set when shipping any suspects to the final
+	 * blame list instead of other commits
+	 */
+	char guilty;
 	char path[FLEX_ARRAY];
 };
 
@@ -176,10 +210,22 @@
 static void origin_decref(struct origin *o)
 {
 	if (o && --o->refcnt <= 0) {
+		struct origin *p, *l = NULL;
 		if (o->previous)
 			origin_decref(o->previous);
 		free(o->file.ptr);
-		free(o);
+		/* Should be present exactly once in commit chain */
+		for (p = o->commit->util; p; l = p, p = p->next) {
+			if (p == o) {
+				if (l)
+					l->next = p->next;
+				else
+					o->commit->util = p->next;
+				free(o);
+				return;
+			}
+		}
+		die("internal error in blame::origin_decref");
 	}
 }
 
@@ -193,8 +239,12 @@
 
 /*
  * Each group of lines is described by a blame_entry; it can be split
- * as we pass blame to the parents.  They form a linked list in the
- * scoreboard structure, sorted by the target line number.
+ * as we pass blame to the parents.  They are arranged in linked lists
+ * kept as `suspects' of some unprocessed origin, or entered (when the
+ * blame origin has been finalized) into the scoreboard structure.
+ * While the scoreboard structure is only sorted at the end of
+ * processing (according to final image line number), the lists
+ * attached to an origin are sorted by the target line number.
  */
 struct blame_entry {
 	struct blame_entry *next;
@@ -210,15 +260,6 @@
 	/* the commit that introduced this group into the final image */
 	struct origin *suspect;
 
-	/* true if the suspect is truly guilty; false while we have not
-	 * checked if the group came from one of its parents.
-	 */
-	char guilty;
-
-	/* true if the entry has been scanned for copies in the current parent
-	 */
-	char scanned;
-
 	/* the line number of the first line of this group in the
 	 * suspect's file; internally all line numbers are 0 based.
 	 */
@@ -231,11 +272,112 @@
 };
 
 /*
+ * Any merge of blames happens on lists of blames that arrived via
+ * different parents in a single suspect.  In this case, we want to
+ * sort according to the suspect line numbers as opposed to the final
+ * image line numbers.  The function body is somewhat longish because
+ * it avoids unnecessary writes.
+ */
+
+static struct blame_entry *blame_merge(struct blame_entry *list1,
+				       struct blame_entry *list2)
+{
+	struct blame_entry *p1 = list1, *p2 = list2,
+		**tail = &list1;
+
+	if (!p1)
+		return p2;
+	if (!p2)
+		return p1;
+
+	if (p1->s_lno <= p2->s_lno) {
+		do {
+			tail = &p1->next;
+			if ((p1 = *tail) == NULL) {
+				*tail = p2;
+				return list1;
+			}
+		} while (p1->s_lno <= p2->s_lno);
+	}
+	for (;;) {
+		*tail = p2;
+		do {
+			tail = &p2->next;
+			if ((p2 = *tail) == NULL)  {
+				*tail = p1;
+				return list1;
+			}
+		} while (p1->s_lno > p2->s_lno);
+		*tail = p1;
+		do {
+			tail = &p1->next;
+			if ((p1 = *tail) == NULL) {
+				*tail = p2;
+				return list1;
+			}
+		} while (p1->s_lno <= p2->s_lno);
+	}
+}
+
+static void *get_next_blame(const void *p)
+{
+	return ((struct blame_entry *)p)->next;
+}
+
+static void set_next_blame(void *p1, void *p2)
+{
+	((struct blame_entry *)p1)->next = p2;
+}
+
+/*
+ * Final image line numbers are all different, so we don't need a
+ * three-way comparison here.
+ */
+
+static int compare_blame_final(const void *p1, const void *p2)
+{
+	return ((struct blame_entry *)p1)->lno > ((struct blame_entry *)p2)->lno
+		? 1 : -1;
+}
+
+static int compare_blame_suspect(const void *p1, const void *p2)
+{
+	const struct blame_entry *s1 = p1, *s2 = p2;
+	/*
+	 * to allow for collating suspects, we sort according to the
+	 * respective pointer value as the primary sorting criterion.
+	 * The actual relation is pretty unimportant as long as it
+	 * establishes a total order.  Comparing as integers gives us
+	 * that.
+	 */
+	if (s1->suspect != s2->suspect)
+		return (intptr_t)s1->suspect > (intptr_t)s2->suspect ? 1 : -1;
+	if (s1->s_lno == s2->s_lno)
+		return 0;
+	return s1->s_lno > s2->s_lno ? 1 : -1;
+}
+
+static struct blame_entry *blame_sort(struct blame_entry *head,
+				      int (*compare_fn)(const void *, const void *))
+{
+	return llist_mergesort (head, get_next_blame, set_next_blame, compare_fn);
+}
+
+static int compare_commits_by_reverse_commit_date(const void *a,
+						  const void *b,
+						  void *c)
+{
+	return -compare_commits_by_commit_date(a, b, c);
+}
+
+/*
  * The current state of the blame assignment.
  */
 struct scoreboard {
 	/* the final commit (i.e. where we started digging from) */
 	struct commit *final;
+	/* Priority queue for commits with unassigned blame records */
+	struct prio_queue commits;
 	struct rev_info *revs;
 	const char *path;
 
@@ -268,7 +410,6 @@
 
 	for (ent = sb->ent; ent && (next = ent->next); ent = next) {
 		if (ent->suspect == next->suspect &&
-		    ent->guilty == next->guilty &&
 		    ent->s_lno + ent->num_lines == next->s_lno) {
 			ent->num_lines += next->num_lines;
 			ent->next = next->next;
@@ -284,6 +425,30 @@
 }
 
 /*
+ * Merge the given sorted list of blames into a preexisting origin.
+ * If there were no previous blames to that commit, it is entered into
+ * the commit priority queue of the score board.
+ */
+
+static void queue_blames(struct scoreboard *sb, struct origin *porigin,
+			 struct blame_entry *sorted)
+{
+	if (porigin->suspects)
+		porigin->suspects = blame_merge(porigin->suspects, sorted);
+	else {
+		struct origin *o;
+		for (o = porigin->commit->util; o; o = o->next) {
+			if (o->suspects) {
+				porigin->suspects = sorted;
+				return;
+			}
+		}
+		porigin->suspects = sorted;
+		prio_queue_put(&sb->commits, porigin->commit);
+	}
+}
+
+/*
  * Given a commit and a path in it, create a new origin structure.
  * The callers that add blame to the scoreboard should use
  * get_origin() to obtain shared, refcounted copy instead of calling
@@ -295,23 +460,32 @@
 	o = xcalloc(1, sizeof(*o) + strlen(path) + 1);
 	o->commit = commit;
 	o->refcnt = 1;
+	o->next = commit->util;
+	commit->util = o;
 	strcpy(o->path, path);
 	return o;
 }
 
 /*
  * Locate an existing origin or create a new one.
+ * This moves the origin to front position in the commit util list.
  */
 static struct origin *get_origin(struct scoreboard *sb,
 				 struct commit *commit,
 				 const char *path)
 {
-	struct blame_entry *e;
+	struct origin *o, *l;
 
-	for (e = sb->ent; e; e = e->next) {
-		if (e->suspect->commit == commit &&
-		    !strcmp(e->suspect->path, path))
-			return origin_incref(e->suspect);
+	for (o = commit->util, l = NULL; o; l = o, o = o->next) {
+		if (!strcmp(o->path, path)) {
+			/* bump to front */
+			if (l) {
+				l->next = o->next;
+				o->next = commit->util;
+				commit->util = o;
+			}
+			return origin_incref(o);
+		}
 	}
 	return make_origin(commit, path);
 }
@@ -350,41 +524,19 @@
 				  struct commit *parent,
 				  struct origin *origin)
 {
-	struct origin *porigin = NULL;
+	struct origin *porigin;
 	struct diff_options diff_opts;
 	const char *paths[2];
 
-	if (parent->util) {
-		/*
-		 * Each commit object can cache one origin in that
-		 * commit.  This is a freestanding copy of origin and
-		 * not refcounted.
-		 */
-		struct origin *cached = parent->util;
-		if (!strcmp(cached->path, origin->path)) {
+	/* First check any existing origins */
+	for (porigin = parent->util; porigin; porigin = porigin->next)
+		if (!strcmp(porigin->path, origin->path)) {
 			/*
 			 * The same path between origin and its parent
 			 * without renaming -- the most common case.
 			 */
-			porigin = get_origin(sb, parent, cached->path);
-
-			/*
-			 * If the origin was newly created (i.e. get_origin
-			 * would call make_origin if none is found in the
-			 * scoreboard), it does not know the blob_sha1/mode,
-			 * so copy it.  Otherwise porigin was in the
-			 * scoreboard and already knows blob_sha1/mode.
-			 */
-			if (porigin->refcnt == 1) {
-				hashcpy(porigin->blob_sha1, cached->blob_sha1);
-				porigin->mode = cached->mode;
-			}
-			return porigin;
+			return origin_incref (porigin);
 		}
-		/* otherwise it was not very useful; free it */
-		free(parent->util);
-		parent->util = NULL;
-	}
 
 	/* See if the origin->path is different between parent
 	 * and origin first.  Most of the time they are the
@@ -450,19 +602,6 @@
 	}
 	diff_flush(&diff_opts);
 	free_pathspec(&diff_opts.pathspec);
-	if (porigin) {
-		/*
-		 * Create a freestanding copy that is not part of
-		 * the refcounted origin found in the scoreboard, and
-		 * cache it in the commit.
-		 */
-		struct origin *cached;
-
-		cached = make_origin(porigin->commit, porigin->path);
-		hashcpy(cached->blob_sha1, porigin->blob_sha1);
-		cached->mode = porigin->mode;
-		parent->util = cached;
-	}
 	return porigin;
 }
 
@@ -509,46 +648,31 @@
 }
 
 /*
- * Link in a new blame entry to the scoreboard.  Entries that cover the
- * same line range have been removed from the scoreboard previously.
+ * Append a new blame entry to a given output queue.
  */
-static void add_blame_entry(struct scoreboard *sb, struct blame_entry *e)
+static void add_blame_entry(struct blame_entry ***queue, struct blame_entry *e)
 {
-	struct blame_entry *ent, *prev = NULL;
-
 	origin_incref(e->suspect);
 
-	for (ent = sb->ent; ent && ent->lno < e->lno; ent = ent->next)
-		prev = ent;
-
-	/* prev, if not NULL, is the last one that is below e */
-
-	if (prev) {
-		e->next = prev->next;
-		prev->next = e;
-	}
-	else {
-		e->next = sb->ent;
-		sb->ent = e;
-	}
+	e->next = **queue;
+	**queue = e;
+	*queue = &e->next;
 }
 
 /*
  * src typically is on-stack; we want to copy the information in it to
- * a malloced blame_entry that is already on the linked list of the
- * scoreboard.  The origin of dst loses a refcnt while the origin of src
- * gains one.
+ * a malloced blame_entry that gets added to the given queue.  The
+ * origin of dst loses a refcnt.
  */
-static void dup_entry(struct blame_entry *dst, struct blame_entry *src)
+static void dup_entry(struct blame_entry ***queue,
+		      struct blame_entry *dst, struct blame_entry *src)
 {
-	struct blame_entry *n;
-
-	n = dst->next;
 	origin_incref(src->suspect);
 	origin_decref(dst->suspect);
 	memcpy(dst, src, sizeof(*src));
-	dst->next = n;
-	dst->score = 0;
+	dst->next = **queue;
+	**queue = dst;
+	*queue = &dst->next;
 }
 
 static const char *nth_line(struct scoreboard *sb, long lno)
@@ -620,10 +744,11 @@
 
 /*
  * split_overlap() divided an existing blame e into up to three parts
- * in split.  Adjust the linked list of blames in the scoreboard to
+ * in split.  Any assigned blame is moved to queue to
  * reflect the split.
  */
-static void split_blame(struct scoreboard *sb,
+static void split_blame(struct blame_entry ***blamed,
+			struct blame_entry ***unblamed,
 			struct blame_entry *split,
 			struct blame_entry *e)
 {
@@ -631,61 +756,39 @@
 
 	if (split[0].suspect && split[2].suspect) {
 		/* The first part (reuse storage for the existing entry e) */
-		dup_entry(e, &split[0]);
+		dup_entry(unblamed, e, &split[0]);
 
 		/* The last part -- me */
 		new_entry = xmalloc(sizeof(*new_entry));
 		memcpy(new_entry, &(split[2]), sizeof(struct blame_entry));
-		add_blame_entry(sb, new_entry);
+		add_blame_entry(unblamed, new_entry);
 
 		/* ... and the middle part -- parent */
 		new_entry = xmalloc(sizeof(*new_entry));
 		memcpy(new_entry, &(split[1]), sizeof(struct blame_entry));
-		add_blame_entry(sb, new_entry);
+		add_blame_entry(blamed, new_entry);
 	}
 	else if (!split[0].suspect && !split[2].suspect)
 		/*
 		 * The parent covers the entire area; reuse storage for
 		 * e and replace it with the parent.
 		 */
-		dup_entry(e, &split[1]);
+		dup_entry(blamed, e, &split[1]);
 	else if (split[0].suspect) {
 		/* me and then parent */
-		dup_entry(e, &split[0]);
+		dup_entry(unblamed, e, &split[0]);
 
 		new_entry = xmalloc(sizeof(*new_entry));
 		memcpy(new_entry, &(split[1]), sizeof(struct blame_entry));
-		add_blame_entry(sb, new_entry);
+		add_blame_entry(blamed, new_entry);
 	}
 	else {
 		/* parent and then me */
-		dup_entry(e, &split[1]);
+		dup_entry(blamed, e, &split[1]);
 
 		new_entry = xmalloc(sizeof(*new_entry));
 		memcpy(new_entry, &(split[2]), sizeof(struct blame_entry));
-		add_blame_entry(sb, new_entry);
-	}
-
-	if (DEBUG) { /* sanity */
-		struct blame_entry *ent;
-		int lno = sb->ent->lno, corrupt = 0;
-
-		for (ent = sb->ent; ent; ent = ent->next) {
-			if (lno != ent->lno)
-				corrupt = 1;
-			if (ent->s_lno < 0)
-				corrupt = 1;
-			lno += ent->num_lines;
-		}
-		if (corrupt) {
-			lno = sb->ent->lno;
-			for (ent = sb->ent; ent; ent = ent->next) {
-				printf("L %8d l %8d n %8d\n",
-				       lno, ent->lno, ent->num_lines);
-				lno = ent->lno + ent->num_lines;
-			}
-			die("oops");
-		}
+		add_blame_entry(unblamed, new_entry);
 	}
 }
 
@@ -702,74 +805,146 @@
 }
 
 /*
- * Helper for blame_chunk().  blame_entry e is known to overlap with
- * the patch hunk; split it and pass blame to the parent.
+ * reverse_blame reverses the list given in head, appending tail.
+ * That allows us to build lists in reverse order, then reverse them
+ * afterwards.  This can be faster than building the list in proper
+ * order right away.  The reason is that building in proper order
+ * requires writing a link in the _previous_ element, while building
+ * in reverse order just requires placing the list head into the
+ * _current_ element.
  */
-static void blame_overlap(struct scoreboard *sb, struct blame_entry *e,
-			  int tlno, int plno, int same,
-			  struct origin *parent)
+
+static struct blame_entry *reverse_blame(struct blame_entry *head,
+					 struct blame_entry *tail)
 {
-	struct blame_entry split[3];
-
-	split_overlap(split, e, tlno, plno, same, parent);
-	if (split[1].suspect)
-		split_blame(sb, split, e);
-	decref_split(split);
-}
-
-/*
- * Find the line number of the last line the target is suspected for.
- */
-static int find_last_in_target(struct scoreboard *sb, struct origin *target)
-{
-	struct blame_entry *e;
-	int last_in_target = -1;
-
-	for (e = sb->ent; e; e = e->next) {
-		if (e->guilty || e->suspect != target)
-			continue;
-		if (last_in_target < e->s_lno + e->num_lines)
-			last_in_target = e->s_lno + e->num_lines;
+	while (head) {
+		struct blame_entry *next = head->next;
+		head->next = tail;
+		tail = head;
+		head = next;
 	}
-	return last_in_target;
+	return tail;
 }
 
 /*
  * Process one hunk from the patch between the current suspect for
- * blame_entry e and its parent.  Find and split the overlap, and
- * pass blame to the overlapping part to the parent.
+ * blame_entry e and its parent.  This first blames any unfinished
+ * entries before the chunk (which is where target and parent start
+ * differing) on the parent, and then splits blame entries at the
+ * start and at the end of the difference region.  Since use of -M and
+ * -C options may lead to overlapping/duplicate source line number
+ * ranges, all we can rely on from sorting/merging is the order of the
+ * first suspect line number.
  */
-static void blame_chunk(struct scoreboard *sb,
-			int tlno, int plno, int same,
-			struct origin *target, struct origin *parent)
+static void blame_chunk(struct blame_entry ***dstq, struct blame_entry ***srcq,
+			int tlno, int offset, int same,
+			struct origin *parent)
 {
-	struct blame_entry *e;
+	struct blame_entry *e = **srcq;
+	struct blame_entry *samep = NULL, *diffp = NULL;
 
-	for (e = sb->ent; e; e = e->next) {
-		if (e->guilty || e->suspect != target)
-			continue;
-		if (same <= e->s_lno)
-			continue;
-		if (tlno < e->s_lno + e->num_lines)
-			blame_overlap(sb, e, tlno, plno, same, parent);
+	while (e && e->s_lno < tlno) {
+		struct blame_entry *next = e->next;
+		/*
+		 * current record starts before differing portion.  If
+		 * it reaches into it, we need to split it up and
+		 * examine the second part separately.
+		 */
+		if (e->s_lno + e->num_lines > tlno) {
+			/* Move second half to a new record */
+			int len = tlno - e->s_lno;
+			struct blame_entry *n = xcalloc(1, sizeof (struct blame_entry));
+			n->suspect = e->suspect;
+			n->lno = e->lno + len;
+			n->s_lno = e->s_lno + len;
+			n->num_lines = e->num_lines - len;
+			e->num_lines = len;
+			e->score = 0;
+			/* Push new record to diffp */
+			n->next = diffp;
+			diffp = n;
+		} else
+			origin_decref(e->suspect);
+		/* Pass blame for everything before the differing
+		 * chunk to the parent */
+		e->suspect = origin_incref(parent);
+		e->s_lno += offset;
+		e->next = samep;
+		samep = e;
+		e = next;
 	}
+	/*
+	 * As we don't know how much of a common stretch after this
+	 * diff will occur, the currently blamed parts are all that we
+	 * can assign to the parent for now.
+	 */
+
+	if (samep) {
+		**dstq = reverse_blame(samep, **dstq);
+		*dstq = &samep->next;
+	}
+	/*
+	 * Prepend the split off portions: everything after e starts
+	 * after the blameable portion.
+	 */
+	e = reverse_blame(diffp, e);
+
+	/*
+	 * Now retain records on the target while parts are different
+	 * from the parent.
+	 */
+	samep = NULL;
+	diffp = NULL;
+	while (e && e->s_lno < same) {
+		struct blame_entry *next = e->next;
+
+		/*
+		 * If current record extends into sameness, need to split.
+		 */
+		if (e->s_lno + e->num_lines > same) {
+			/*
+			 * Move second half to a new record to be
+			 * processed by later chunks
+			 */
+			int len = same - e->s_lno;
+			struct blame_entry *n = xcalloc(1, sizeof (struct blame_entry));
+			n->suspect = origin_incref(e->suspect);
+			n->lno = e->lno + len;
+			n->s_lno = e->s_lno + len;
+			n->num_lines = e->num_lines - len;
+			e->num_lines = len;
+			e->score = 0;
+			/* Push new record to samep */
+			n->next = samep;
+			samep = n;
+		}
+		e->next = diffp;
+		diffp = e;
+		e = next;
+	}
+	**srcq = reverse_blame(diffp, reverse_blame(samep, e));
+	/* Move across elements that are in the unblamable portion */
+	if (diffp)
+		*srcq = &diffp->next;
 }
 
 struct blame_chunk_cb_data {
-	struct scoreboard *sb;
-	struct origin *target;
 	struct origin *parent;
-	long plno;
-	long tlno;
+	long offset;
+	struct blame_entry **dstq;
+	struct blame_entry **srcq;
 };
 
+/* diff chunks are from parent to target */
 static int blame_chunk_cb(long start_a, long count_a,
 			  long start_b, long count_b, void *data)
 {
 	struct blame_chunk_cb_data *d = data;
-	blame_chunk(d->sb, d->tlno, d->plno, start_b, d->target, d->parent);
-	d->plno = start_a + count_a;
-	d->tlno = start_b + count_b;
+	if (start_a - start_b != d->offset)
+		die("internal error in blame::blame_chunk_cb");
+	blame_chunk(&d->dstq, &d->srcq, start_b, start_a - start_b,
+		    start_b + count_b, d->parent);
+	d->offset = start_a + count_a - (start_b + count_b);
 	return 0;
 }
 
@@ -778,29 +953,32 @@
  * for the lines it is suspected to its parent.  Run diff to find
  * which lines came from parent and pass blame for them.
  */
-static int pass_blame_to_parent(struct scoreboard *sb,
-				struct origin *target,
-				struct origin *parent)
+static void pass_blame_to_parent(struct scoreboard *sb,
+				 struct origin *target,
+				 struct origin *parent)
 {
-	int last_in_target;
 	mmfile_t file_p, file_o;
 	struct blame_chunk_cb_data d;
+	struct blame_entry *newdest = NULL;
 
-	memset(&d, 0, sizeof(d));
-	d.sb = sb; d.target = target; d.parent = parent;
-	last_in_target = find_last_in_target(sb, target);
-	if (last_in_target < 0)
-		return 1; /* nothing remains for this target */
+	if (!target->suspects)
+		return; /* nothing remains for this target */
+
+	d.parent = parent;
+	d.offset = 0;
+	d.dstq = &newdest; d.srcq = &target->suspects;
 
 	fill_origin_blob(&sb->revs->diffopt, parent, &file_p);
 	fill_origin_blob(&sb->revs->diffopt, target, &file_o);
 	num_get_patch++;
 
 	diff_hunks(&file_p, &file_o, 0, blame_chunk_cb, &d);
-	/* The rest (i.e. anything after tlno) are the same as the parent */
-	blame_chunk(sb, d.tlno, d.plno, last_in_target, target, parent);
+	/* The rest are the same as the parent */
+	blame_chunk(&d.dstq, &d.srcq, INT_MAX, d.offset, INT_MAX, parent);
+	*d.dstq = NULL;
+	queue_blames(sb, parent, newdest);
 
-	return 0;
+	return;
 }
 
 /*
@@ -945,43 +1123,80 @@
 	handle_split(sb, ent, d.tlno, d.plno, ent->num_lines, parent, split);
 }
 
+/* Move all blame entries from list *source that have a score smaller
+ * than score_min to the front of list *small.
+ * Returns a pointer to the link pointing to the old head of the small list.
+ */
+
+static struct blame_entry **filter_small(struct scoreboard *sb,
+					 struct blame_entry **small,
+					 struct blame_entry **source,
+					 unsigned score_min)
+{
+	struct blame_entry *p = *source;
+	struct blame_entry *oldsmall = *small;
+	while (p) {
+		if (ent_score(sb, p) <= score_min) {
+			*small = p;
+			small = &p->next;
+			p = *small;
+		} else {
+			*source = p;
+			source = &p->next;
+			p = *source;
+		}
+	}
+	*small = oldsmall;
+	*source = NULL;
+	return small;
+}
+
 /*
  * See if lines currently target is suspected for can be attributed to
  * parent.
  */
-static int find_move_in_parent(struct scoreboard *sb,
-			       struct origin *target,
-			       struct origin *parent)
+static void find_move_in_parent(struct scoreboard *sb,
+				struct blame_entry ***blamed,
+				struct blame_entry **toosmall,
+				struct origin *target,
+				struct origin *parent)
 {
-	int last_in_target, made_progress;
 	struct blame_entry *e, split[3];
+	struct blame_entry *unblamed = target->suspects;
+	struct blame_entry *leftover = NULL;
 	mmfile_t file_p;
 
-	last_in_target = find_last_in_target(sb, target);
-	if (last_in_target < 0)
-		return 1; /* nothing remains for this target */
+	if (!unblamed)
+		return; /* nothing remains for this target */
 
 	fill_origin_blob(&sb->revs->diffopt, parent, &file_p);
 	if (!file_p.ptr)
-		return 0;
+		return;
 
-	made_progress = 1;
-	while (made_progress) {
-		made_progress = 0;
-		for (e = sb->ent; e; e = e->next) {
-			if (e->guilty || e->suspect != target ||
-			    ent_score(sb, e) < blame_move_score)
-				continue;
+	/* At each iteration, unblamed has a NULL-terminated list of
+	 * entries that have not yet been tested for blame.  leftover
+	 * contains the reversed list of entries that have been tested
+	 * without being assignable to the parent.
+	 */
+	do {
+		struct blame_entry **unblamedtail = &unblamed;
+		struct blame_entry *next;
+		for (e = unblamed; e; e = next) {
+			next = e->next;
 			find_copy_in_blob(sb, e, parent, split, &file_p);
 			if (split[1].suspect &&
 			    blame_move_score < ent_score(sb, &split[1])) {
-				split_blame(sb, split, e);
-				made_progress = 1;
+				split_blame(blamed, &unblamedtail, split, e);
+			} else {
+				e->next = leftover;
+				leftover = e;
 			}
 			decref_split(split);
 		}
-	}
-	return 0;
+		*unblamedtail = NULL;
+		toosmall = filter_small(sb, toosmall, &unblamed, blame_move_score);
+	} while (unblamed);
+	target->suspects = reverse_blame(leftover, NULL);
 }
 
 struct blame_list {
@@ -993,62 +1208,46 @@
  * Count the number of entries the target is suspected for,
  * and prepare a list of entry and the best split.
  */
-static struct blame_list *setup_blame_list(struct scoreboard *sb,
-					   struct origin *target,
-					   int min_score,
+static struct blame_list *setup_blame_list(struct blame_entry *unblamed,
 					   int *num_ents_p)
 {
 	struct blame_entry *e;
 	int num_ents, i;
 	struct blame_list *blame_list = NULL;
 
-	for (e = sb->ent, num_ents = 0; e; e = e->next)
-		if (!e->scanned && !e->guilty &&
-		    e->suspect == target &&
-		    min_score < ent_score(sb, e))
-			num_ents++;
+	for (e = unblamed, num_ents = 0; e; e = e->next)
+		num_ents++;
 	if (num_ents) {
 		blame_list = xcalloc(num_ents, sizeof(struct blame_list));
-		for (e = sb->ent, i = 0; e; e = e->next)
-			if (!e->scanned && !e->guilty &&
-			    e->suspect == target &&
-			    min_score < ent_score(sb, e))
-				blame_list[i++].ent = e;
+		for (e = unblamed, i = 0; e; e = e->next)
+			blame_list[i++].ent = e;
 	}
 	*num_ents_p = num_ents;
 	return blame_list;
 }
 
 /*
- * Reset the scanned status on all entries.
- */
-static void reset_scanned_flag(struct scoreboard *sb)
-{
-	struct blame_entry *e;
-	for (e = sb->ent; e; e = e->next)
-		e->scanned = 0;
-}
-
-/*
  * For lines target is suspected for, see if we can find code movement
  * across file boundary from the parent commit.  porigin is the path
  * in the parent we already tried.
  */
-static int find_copy_in_parent(struct scoreboard *sb,
-			       struct origin *target,
-			       struct commit *parent,
-			       struct origin *porigin,
-			       int opt)
+static void find_copy_in_parent(struct scoreboard *sb,
+				struct blame_entry ***blamed,
+				struct blame_entry **toosmall,
+				struct origin *target,
+				struct commit *parent,
+				struct origin *porigin,
+				int opt)
 {
 	struct diff_options diff_opts;
 	int i, j;
-	int retval;
 	struct blame_list *blame_list;
 	int num_ents;
+	struct blame_entry *unblamed = target->suspects;
+	struct blame_entry *leftover = NULL;
 
-	blame_list = setup_blame_list(sb, target, blame_copy_score, &num_ents);
-	if (!blame_list)
-		return 1; /* nothing remains for this target */
+	if (!unblamed)
+		return; /* nothing remains for this target */
 
 	diff_setup(&diff_opts);
 	DIFF_OPT_SET(&diff_opts, RECURSIVE);
@@ -1078,9 +1277,9 @@
 	if (!DIFF_OPT_TST(&diff_opts, FIND_COPIES_HARDER))
 		diffcore_std(&diff_opts);
 
-	retval = 0;
-	while (1) {
-		int made_progress = 0;
+	do {
+		struct blame_entry **unblamedtail = &unblamed;
+		blame_list = setup_blame_list(unblamed, &num_ents);
 
 		for (i = 0; i < diff_queued_diff.nr; i++) {
 			struct diff_filepair *p = diff_queued_diff.queue[i];
@@ -1117,27 +1316,21 @@
 			struct blame_entry *split = blame_list[j].split;
 			if (split[1].suspect &&
 			    blame_copy_score < ent_score(sb, &split[1])) {
-				split_blame(sb, split, blame_list[j].ent);
-				made_progress = 1;
+				split_blame(blamed, &unblamedtail, split,
+					    blame_list[j].ent);
+			} else {
+				blame_list[j].ent->next = leftover;
+				leftover = blame_list[j].ent;
 			}
-			else
-				blame_list[j].ent->scanned = 1;
 			decref_split(split);
 		}
 		free(blame_list);
-
-		if (!made_progress)
-			break;
-		blame_list = setup_blame_list(sb, target, blame_copy_score, &num_ents);
-		if (!blame_list) {
-			retval = 1;
-			break;
-		}
-	}
-	reset_scanned_flag(sb);
+		*unblamedtail = NULL;
+		toosmall = filter_small(sb, toosmall, &unblamed, blame_copy_score);
+	} while (unblamed);
+	target->suspects = reverse_blame(leftover, NULL);
 	diff_flush(&diff_opts);
 	free_pathspec(&diff_opts.pathspec);
-	return retval;
 }
 
 /*
@@ -1147,20 +1340,21 @@
 static void pass_whole_blame(struct scoreboard *sb,
 			     struct origin *origin, struct origin *porigin)
 {
-	struct blame_entry *e;
+	struct blame_entry *e, *suspects;
 
 	if (!porigin->file.ptr && origin->file.ptr) {
 		/* Steal its file */
 		porigin->file = origin->file;
 		origin->file.ptr = NULL;
 	}
-	for (e = sb->ent; e; e = e->next) {
-		if (e->suspect != origin)
-			continue;
+	suspects = origin->suspects;
+	origin->suspects = NULL;
+	for (e = suspects; e; e = e->next) {
 		origin_incref(porigin);
 		origin_decref(e->suspect);
 		e->suspect = porigin;
 	}
+	queue_blames(sb, porigin, suspects);
 }
 
 /*
@@ -1177,11 +1371,29 @@
 
 static int num_scapegoats(struct rev_info *revs, struct commit *commit)
 {
-	int cnt;
 	struct commit_list *l = first_scapegoat(revs, commit);
-	for (cnt = 0; l; l = l->next)
-		cnt++;
-	return cnt;
+	return commit_list_count(l);
+}
+
+/* Distribute collected unsorted blames to the respected sorted lists
+ * in the various origins.
+ */
+static void distribute_blame(struct scoreboard *sb, struct blame_entry *blamed)
+{
+	blamed = blame_sort(blamed, compare_blame_suspect);
+	while (blamed)
+	{
+		struct origin *porigin = blamed->suspect;
+		struct blame_entry *suspects = NULL;
+		do {
+			struct blame_entry *next = blamed->next;
+			blamed->next = suspects;
+			suspects = blamed;
+			blamed = next;
+		} while (blamed && blamed->suspect == porigin);
+		suspects = reverse_blame(suspects, NULL);
+		queue_blames(sb, porigin, suspects);
+	}
 }
 
 #define MAXSG 16
@@ -1194,6 +1406,8 @@
 	struct commit_list *sg;
 	struct origin *sg_buf[MAXSG];
 	struct origin *porigin, **sg_origin = sg_buf;
+	struct blame_entry *toosmall = NULL;
+	struct blame_entry *blames, **blametail = &blames;
 
 	num_sg = num_scapegoats(revs, commit);
 	if (!num_sg)
@@ -1255,38 +1469,71 @@
 			origin_incref(porigin);
 			origin->previous = porigin;
 		}
-		if (pass_blame_to_parent(sb, origin, porigin))
+		pass_blame_to_parent(sb, origin, porigin);
+		if (!origin->suspects)
 			goto finish;
 	}
 
 	/*
 	 * Optionally find moves in parents' files.
 	 */
-	if (opt & PICKAXE_BLAME_MOVE)
-		for (i = 0, sg = first_scapegoat(revs, commit);
-		     i < num_sg && sg;
-		     sg = sg->next, i++) {
-			struct origin *porigin = sg_origin[i];
-			if (!porigin)
-				continue;
-			if (find_move_in_parent(sb, origin, porigin))
-				goto finish;
+	if (opt & PICKAXE_BLAME_MOVE) {
+		filter_small(sb, &toosmall, &origin->suspects, blame_move_score);
+		if (origin->suspects) {
+			for (i = 0, sg = first_scapegoat(revs, commit);
+			     i < num_sg && sg;
+			     sg = sg->next, i++) {
+				struct origin *porigin = sg_origin[i];
+				if (!porigin)
+					continue;
+				find_move_in_parent(sb, &blametail, &toosmall, origin, porigin);
+				if (!origin->suspects)
+					break;
+			}
 		}
+	}
 
 	/*
 	 * Optionally find copies from parents' files.
 	 */
-	if (opt & PICKAXE_BLAME_COPY)
+	if (opt & PICKAXE_BLAME_COPY) {
+		if (blame_copy_score > blame_move_score)
+			filter_small(sb, &toosmall, &origin->suspects, blame_copy_score);
+		else if (blame_copy_score < blame_move_score) {
+			origin->suspects = blame_merge(origin->suspects, toosmall);
+			toosmall = NULL;
+			filter_small(sb, &toosmall, &origin->suspects, blame_copy_score);
+		}
+		if (!origin->suspects)
+			goto finish;
+
 		for (i = 0, sg = first_scapegoat(revs, commit);
 		     i < num_sg && sg;
 		     sg = sg->next, i++) {
 			struct origin *porigin = sg_origin[i];
-			if (find_copy_in_parent(sb, origin, sg->item,
-						porigin, opt))
+			find_copy_in_parent(sb, &blametail, &toosmall,
+					    origin, sg->item, porigin, opt);
+			if (!origin->suspects)
 				goto finish;
 		}
+	}
 
- finish:
+finish:
+	*blametail = NULL;
+	distribute_blame(sb, blames);
+	/*
+	 * prepend toosmall to origin->suspects
+	 *
+	 * There is no point in sorting: this ends up on a big
+	 * unsorted list in the caller anyway.
+	 */
+	if (toosmall) {
+		struct blame_entry **tail = &toosmall;
+		while (*tail)
+			tail = &(*tail)->next;
+		*tail = origin->suspects;
+		origin->suspects = toosmall;
+	}
 	for (i = 0; i < num_sg; i++) {
 		if (sg_origin[i]) {
 			drop_origin_blob(sg_origin[i]);
@@ -1481,14 +1728,11 @@
 }
 
 /*
- * The blame_entry is found to be guilty for the range.  Mark it
- * as such, and show it in incremental output.
+ * The blame_entry is found to be guilty for the range.
+ * Show it in incremental output.
  */
 static void found_guilty_entry(struct blame_entry *ent)
 {
-	if (ent->guilty)
-		return;
-	ent->guilty = 1;
 	if (incremental) {
 		struct origin *suspect = ent->suspect;
 
@@ -1502,32 +1746,34 @@
 }
 
 /*
- * The main loop -- while the scoreboard has lines whose true origin
- * is still unknown, pick one blame_entry, and allow its current
- * suspect to pass blames to its parents.
- */
+ * The main loop -- while we have blobs with lines whose true origin
+ * is still unknown, pick one blob, and allow its lines to pass blames
+ * to its parents. */
 static void assign_blame(struct scoreboard *sb, int opt)
 {
 	struct rev_info *revs = sb->revs;
+	struct commit *commit = prio_queue_get(&sb->commits);
 
-	while (1) {
+	while (commit) {
 		struct blame_entry *ent;
-		struct commit *commit;
-		struct origin *suspect = NULL;
+		struct origin *suspect = commit->util;
 
 		/* find one suspect to break down */
-		for (ent = sb->ent; !suspect && ent; ent = ent->next)
-			if (!ent->guilty)
-				suspect = ent->suspect;
-		if (!suspect)
-			return; /* all done */
+		while (suspect && !suspect->suspects)
+			suspect = suspect->next;
+
+		if (!suspect) {
+			commit = prio_queue_get(&sb->commits);
+			continue;
+		}
+
+		assert(commit == suspect->commit);
 
 		/*
 		 * We will use this suspect later in the loop,
 		 * so hold onto it in the meantime.
 		 */
 		origin_incref(suspect);
-		commit = suspect->commit;
 		parse_commit(commit);
 		if (reverse ||
 		    (!(commit->object.flags & UNINTERESTING) &&
@@ -1543,9 +1789,22 @@
 			commit->object.flags |= UNINTERESTING;
 
 		/* Take responsibility for the remaining entries */
-		for (ent = sb->ent; ent; ent = ent->next)
-			if (ent->suspect == suspect)
+		ent = suspect->suspects;
+		if (ent) {
+			suspect->guilty = 1;
+			for (;;) {
+				struct blame_entry *next = ent->next;
 				found_guilty_entry(ent);
+				if (next) {
+					ent = next;
+					continue;
+				}
+				ent->next = sb->ent;
+				sb->ent = suspect->suspects;
+				suspect->suspects = NULL;
+				break;
+			}
+		}
 		origin_decref(suspect);
 
 		if (DEBUG) /* sanity */
@@ -1609,9 +1868,8 @@
 	char hex[41];
 
 	strcpy(hex, sha1_to_hex(suspect->commit->object.sha1));
-	printf("%s%c%d %d %d\n",
+	printf("%s %d %d %d\n",
 	       hex,
-	       ent->guilty ? ' ' : '*', /* purely for debugging */
 	       ent->s_lno + 1,
 	       ent->lno + 1,
 	       ent->num_lines);
@@ -1724,17 +1982,16 @@
 
 	if (option & OUTPUT_PORCELAIN) {
 		for (ent = sb->ent; ent; ent = ent->next) {
-			struct blame_entry *oth;
-			struct origin *suspect = ent->suspect;
-			struct commit *commit = suspect->commit;
+			int count = 0;
+			struct origin *suspect;
+			struct commit *commit = ent->suspect->commit;
 			if (commit->object.flags & MORE_THAN_ONE_PATH)
 				continue;
-			for (oth = ent->next; oth; oth = oth->next) {
-				if ((oth->suspect->commit != commit) ||
-				    !strcmp(oth->suspect->path, suspect->path))
-					continue;
-				commit->object.flags |= MORE_THAN_ONE_PATH;
-				break;
+			for (suspect = commit->util; suspect; suspect = suspect->next) {
+				if (suspect->guilty && count++) {
+					commit->object.flags |= MORE_THAN_ONE_PATH;
+					break;
+				}
 			}
 		}
 	}
@@ -1748,6 +2005,12 @@
 	}
 }
 
+static const char *get_next_line(const char *start, const char *end)
+{
+	const char *nl = memchr(start, '\n', end - start);
+	return nl ? nl + 1 : end;
+}
+
 /*
  * To allow quick access to the contents of nth line in the
  * final image, prepare an index in the scoreboard.
@@ -1759,39 +2022,19 @@
 	const char *end = buf + len;
 	const char *p;
 	int *lineno;
-	int num = 0, incomplete = 0;
+	int num = 0;
 
-	for (p = buf;;) {
-		p = memchr(p, '\n', end - p);
-		if (p) {
-			p++;
-			num++;
-			continue;
-		}
-		break;
-	}
+	for (p = buf; p < end; p = get_next_line(p, end))
+		num++;
 
-	if (len && end[-1] != '\n')
-		incomplete++; /* incomplete line at the end */
+	sb->lineno = lineno = xmalloc(sizeof(*sb->lineno) * (num + 1));
 
-	sb->lineno = xmalloc(sizeof(*sb->lineno) * (num + incomplete + 1));
-	lineno = sb->lineno;
+	for (p = buf; p < end; p = get_next_line(p, end))
+		*lineno++ = p - buf;
 
-	*lineno++ = 0;
-	for (p = buf;;) {
-		p = memchr(p, '\n', end - p);
-		if (p) {
-			p++;
-			*lineno++ = p - buf;
-			continue;
-		}
-		break;
-	}
+	*lineno = len;
 
-	if (incomplete)
-		*lineno++ = len;
-
-	sb->num_lines = num + incomplete;
+	sb->num_lines = num;
 	return sb->num_lines;
 }
 
@@ -2043,7 +2286,7 @@
 	commit->date = now;
 	parent_tail = &commit->parents;
 
-	if (!resolve_ref_unsafe("HEAD", head_sha1, 1, NULL))
+	if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, head_sha1, NULL))
 		die("no such ref: HEAD");
 
 	parent_tail = append_parent(parent_tail, head_sha1);
@@ -2109,7 +2352,6 @@
 	origin->file.ptr = buf.buf;
 	origin->file.size = buf.len;
 	pretend_sha1_file(buf.buf, buf.len, OBJ_BLOB, origin->blob_sha1);
-	commit->util = origin;
 
 	/*
 	 * Read the current index, replace the path entry with
@@ -2143,7 +2385,7 @@
 	 * right now, but someday we might optimize diff-index --cached
 	 * with cache-tree information.
 	 */
-	cache_tree_invalidate_path(active_cache_tree, path);
+	cache_tree_invalidate_path(&the_index, path);
 
 	return commit;
 }
@@ -2338,6 +2580,9 @@
 	case DATE_RFC2822:
 		blame_date_width = sizeof("Thu, 19 Oct 2006 16:00:04 -0700");
 		break;
+	case DATE_ISO8601_STRICT:
+		blame_date_width = sizeof("2006-10-19T16:00:04-07:00");
+		break;
 	case DATE_ISO8601:
 		blame_date_width = sizeof("2006-10-19 16:00:04 -0700");
 		break;
@@ -2427,12 +2672,16 @@
 	memset(&sb, 0, sizeof(sb));
 
 	sb.revs = &revs;
-	if (!reverse)
+	if (!reverse) {
 		final_commit_name = prepare_final(&sb);
+		sb.commits.compare = compare_commits_by_commit_date;
+	}
 	else if (contents_from)
 		die("--contents and --children do not blend well.");
-	else
+	else {
 		final_commit_name = prepare_initial(&sb);
+		sb.commits.compare = compare_commits_by_reverse_commit_date;
+	}
 
 	if (!sb.final) {
 		/*
@@ -2454,7 +2703,7 @@
 	 * uninteresting.
 	 */
 	if (prepare_revision_walk(&revs))
-		die("revision walk setup failed");
+		die(_("revision walk setup failed"));
 
 	if (is_null_sha1(sb.final->object.sha1)) {
 		o = sb.final->util;
@@ -2518,12 +2767,16 @@
 		ent->next = next;
 		origin_incref(o);
 	}
+
+	o->suspects = ent;
+	prio_queue_put(&sb.commits, o->commit);
+
 	origin_decref(o);
 
 	range_set_release(&ranges);
 	string_list_clear(&range_list, 0);
 
-	sb.ent = ent;
+	sb.ent = NULL;
 	sb.path = path;
 
 	read_mailmap(&mailmap, NULL);
@@ -2536,6 +2789,8 @@
 	if (incremental)
 		return 0;
 
+	sb.ent = blame_sort(sb.ent, compare_blame_final);
+
 	coalesce(&sb);
 
 	if (!(output_option & OUTPUT_PORCELAIN))
diff --git a/builtin/branch.c b/builtin/branch.c
index 652b1d2..3b79c50 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -62,39 +62,40 @@
 static struct string_list output = STRING_LIST_INIT_DUP;
 static unsigned int colopts;
 
-static int parse_branch_color_slot(const char *var, int ofs)
+static int parse_branch_color_slot(const char *slot)
 {
-	if (!strcasecmp(var+ofs, "plain"))
+	if (!strcasecmp(slot, "plain"))
 		return BRANCH_COLOR_PLAIN;
-	if (!strcasecmp(var+ofs, "reset"))
+	if (!strcasecmp(slot, "reset"))
 		return BRANCH_COLOR_RESET;
-	if (!strcasecmp(var+ofs, "remote"))
+	if (!strcasecmp(slot, "remote"))
 		return BRANCH_COLOR_REMOTE;
-	if (!strcasecmp(var+ofs, "local"))
+	if (!strcasecmp(slot, "local"))
 		return BRANCH_COLOR_LOCAL;
-	if (!strcasecmp(var+ofs, "current"))
+	if (!strcasecmp(slot, "current"))
 		return BRANCH_COLOR_CURRENT;
-	if (!strcasecmp(var+ofs, "upstream"))
+	if (!strcasecmp(slot, "upstream"))
 		return BRANCH_COLOR_UPSTREAM;
 	return -1;
 }
 
 static int git_branch_config(const char *var, const char *value, void *cb)
 {
+	const char *slot_name;
+
 	if (starts_with(var, "column."))
 		return git_column_config(var, value, "branch", &colopts);
 	if (!strcmp(var, "color.branch")) {
 		branch_use_color = git_config_colorbool(var, value);
 		return 0;
 	}
-	if (starts_with(var, "color.branch.")) {
-		int slot = parse_branch_color_slot(var, 13);
+	if (skip_prefix(var, "color.branch.", &slot_name)) {
+		int slot = parse_branch_color_slot(slot_name);
 		if (slot < 0)
 			return 0;
 		if (!value)
 			return config_error_nonbool(var);
-		color_parse(value, var, branch_colors[slot]);
-		return 0;
+		return color_parse(value, branch_colors[slot]);
 	}
 	return git_color_default_config(var, value, cb);
 }
@@ -129,7 +130,8 @@
 		    branch->merge[0] &&
 		    branch->merge[0]->dst &&
 		    (reference_name = reference_name_to_free =
-		     resolve_refdup(branch->merge[0]->dst, sha1, 1, NULL)) != NULL)
+		     resolve_refdup(branch->merge[0]->dst, RESOLVE_REF_READING,
+				    sha1, NULL)) != NULL)
 			reference_rev = lookup_commit_reference(sha1);
 	}
 	if (!reference_rev)
@@ -233,9 +235,12 @@
 		free(name);
 
 		name = mkpathdup(fmt, bname.buf);
-		target = resolve_ref_unsafe(name, sha1, 0, &flags);
-		if (!target ||
-		    (!(flags & REF_ISSYMREF) && is_null_sha1(sha1))) {
+		target = resolve_ref_unsafe(name,
+					    RESOLVE_REF_READING
+					    | RESOLVE_REF_NO_RECURSE
+					    | RESOLVE_REF_ALLOW_BAD_NAME,
+					    sha1, &flags);
+		if (!target) {
 			error(remote_branch
 			      ? _("remote branch '%s' not found.")
 			      : _("branch '%s' not found."), bname.buf);
@@ -243,7 +248,7 @@
 			continue;
 		}
 
-		if (!(flags & REF_ISSYMREF) &&
+		if (!(flags & (REF_ISSYMREF|REF_ISBROKEN)) &&
 		    check_branch_commit(bname.buf, name, sha1, head_rev, kinds,
 					force)) {
 			ret = 1;
@@ -263,8 +268,8 @@
 			       ? _("Deleted remote branch %s (was %s).\n")
 			       : _("Deleted branch %s (was %s).\n"),
 			       bname.buf,
-			       (flags & REF_ISSYMREF)
-			       ? target
+			       (flags & REF_ISBROKEN) ? "broken"
+			       : (flags & REF_ISSYMREF) ? target
 			       : find_unique_abbrev(sha1, DEFAULT_ABBREV));
 		}
 		delete_branch_config(bname.buf);
@@ -280,6 +285,7 @@
 	char *dest;
 	unsigned int kind, width;
 	struct commit *commit;
+	int ignore;
 };
 
 struct ref_list {
@@ -294,13 +300,13 @@
 {
 	unsigned char sha1[20];
 	int flag;
-	const char *dst, *cp;
+	const char *dst;
 
-	dst = resolve_ref_unsafe(src, sha1, 0, &flag);
+	dst = resolve_ref_unsafe(src, 0, sha1, &flag);
 	if (!(dst && (flag & REF_ISSYMREF)))
 		return NULL;
-	if (prefix && (cp = skip_prefix(dst, prefix)))
-		dst = cp;
+	if (prefix)
+		skip_prefix(dst, prefix, &dst);
 	return xstrdup(dst);
 }
 
@@ -334,20 +340,18 @@
 	static struct {
 		int kind;
 		const char *prefix;
-		int pfxlen;
 	} ref_kind[] = {
-		{ REF_LOCAL_BRANCH, "refs/heads/", 11 },
-		{ REF_REMOTE_BRANCH, "refs/remotes/", 13 },
+		{ 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 (strncmp(refname, prefix, ref_kind[i].pfxlen))
-			continue;
-		kind = ref_kind[i].kind;
-		refname += ref_kind[i].pfxlen;
-		break;
+		if (skip_prefix(refname, prefix, &refname)) {
+			kind = ref_kind[i].kind;
+			break;
+		}
 	}
 	if (ARRAY_SIZE(ref_kind) <= i)
 		return 0;
@@ -385,6 +389,7 @@
 	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)
@@ -484,17 +489,6 @@
 	free(ref);
 }
 
-static int matches_merge_filter(struct commit *commit)
-{
-	int is_merged;
-
-	if (merge_filter == NO_FILTER)
-		return 1;
-
-	is_merged = !!(commit->object.flags & UNINTERESTING);
-	return (is_merged == (merge_filter == SHOW_MERGED));
-}
-
 static void add_verbose_info(struct strbuf *out, struct ref_item *item,
 			     int verbose, int abbrev)
 {
@@ -522,10 +516,9 @@
 {
 	char c;
 	int color;
-	struct commit *commit = item->commit;
 	struct strbuf out = STRBUF_INIT, name = STRBUF_INIT;
 
-	if (!matches_merge_filter(commit))
+	if (item->ignore)
 		return;
 
 	switch (item->kind) {
@@ -575,7 +568,7 @@
 {
 	int i, w = 0;
 	for (i = 0; i < refs->index; i++) {
-		if (!matches_merge_filter(refs->list[i].commit))
+		if (refs->list[i].ignore)
 			continue;
 		if (refs->list[i].width > w)
 			w = refs->list[i].width;
@@ -618,6 +611,7 @@
 		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, "");
@@ -653,7 +647,23 @@
 		add_pending_object(&ref_list.revs,
 				   (struct object *) filter, "");
 		ref_list.revs.limited = 1;
-		prepare_revision_walk(&ref_list.revs);
+
+		if (prepare_revision_walk(&ref_list.revs))
+			die(_("revision walk setup failed"));
+
+		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);
+		}
+
+		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 (verbose)
 			ref_list.maxwidth = calc_maxwidth(&ref_list);
 	}
@@ -862,16 +872,13 @@
 
 	track = git_branch_track;
 
-	head = resolve_refdup("HEAD", head_sha1, 0, NULL);
+	head = resolve_refdup("HEAD", 0, head_sha1, NULL);
 	if (!head)
 		die(_("Failed to resolve HEAD as a valid ref."));
-	if (!strcmp(head, "HEAD")) {
+	if (!strcmp(head, "HEAD"))
 		detached = 1;
-	} else {
-		if (!starts_with(head, "refs/heads/"))
-			die(_("HEAD not found below refs/heads!"));
-		head += 11;
-	}
+	else if (!skip_prefix(head, "refs/heads/", &head))
+		die(_("HEAD not found below refs/heads!"));
 	hashcpy(merge_filter_ref, head_sha1);
 
 
diff --git a/builtin/cat-file.c b/builtin/cat-file.c
index 7073304..f8d8129 100644
--- a/builtin/cat-file.c
+++ b/builtin/cat-file.c
@@ -82,8 +82,9 @@
 				enum object_type type;
 				unsigned long size;
 				char *buffer = read_sha1_file(sha1, &type, &size);
-				if (memcmp(buffer, "object ", 7) ||
-				    get_sha1_hex(buffer + 7, blob_sha1))
+				const char *target;
+				if (!skip_prefix(buffer, "object ", &target) ||
+				    get_sha1_hex(target, blob_sha1))
 					die("%s not a valid tag", sha1_to_hex(sha1));
 				free(buffer);
 			} else
diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c
index 61e75eb..383dccf 100644
--- a/builtin/checkout-index.c
+++ b/builtin/checkout-index.c
@@ -5,7 +5,7 @@
  *
  */
 #include "builtin.h"
-#include "cache.h"
+#include "lockfile.h"
 #include "quote.h"
 #include "cache-tree.h"
 #include "parse-options.h"
@@ -135,6 +135,7 @@
 	int *newfd = opt->value;
 
 	state.refresh_cache = 1;
+	state.istate = &the_index;
 	if (*newfd < 0)
 		*newfd = hold_locked_index(&lock_file, 1);
 	return 0;
@@ -279,8 +280,7 @@
 		checkout_all(prefix, prefix_length);
 
 	if (0 <= newfd &&
-	    (write_cache(newfd, active_cache, active_nr) ||
-	     commit_locked_index(&lock_file)))
+	    write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
 		die("Unable to write new index file");
 	return 0;
 }
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 07cf555..5410dac 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -1,5 +1,5 @@
-#include "cache.h"
 #include "builtin.h"
+#include "lockfile.h"
 #include "parse-options.h"
 #include "refs.h"
 #include "commit.h"
@@ -225,7 +225,6 @@
 	int flag;
 	struct commit *head;
 	int errs = 0;
-	int newfd;
 	struct lock_file *lock_file;
 
 	if (opts->track != BRANCH_TRACK_UNSPECIFIED)
@@ -256,7 +255,7 @@
 
 	lock_file = xcalloc(1, sizeof(struct lock_file));
 
-	newfd = hold_locked_index(lock_file, 1);
+	hold_locked_index(lock_file, 1);
 	if (read_cache_preload(&opts->pathspec) < 0)
 		return error(_("corrupt index file"));
 
@@ -337,6 +336,7 @@
 	memset(&state, 0, sizeof(state));
 	state.force = 1;
 	state.refresh_cache = 1;
+	state.istate = &the_index;
 	for (pos = 0; pos < active_nr; pos++) {
 		struct cache_entry *ce = active_cache[pos];
 		if (ce->ce_flags & CE_MATCHED) {
@@ -352,11 +352,10 @@
 		}
 	}
 
-	if (write_cache(newfd, active_cache, active_nr) ||
-	    commit_locked_index(lock_file))
+	if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
 		die(_("unable to write new index file"));
 
-	read_ref_full("HEAD", rev, 0, &flag);
+	read_ref_full("HEAD", 0, rev, &flag);
 	head = lookup_commit_reference_gently(rev, 1);
 
 	errs |= post_checkout_hook(head, head, 0);
@@ -444,8 +443,8 @@
 {
 	int ret;
 	struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
-	int newfd = hold_locked_index(lock_file, 1);
 
+	hold_locked_index(lock_file, 1);
 	if (read_cache_preload(NULL) < 0)
 		return error(_("corrupt index file"));
 
@@ -553,8 +552,13 @@
 		}
 	}
 
-	if (write_cache(newfd, active_cache, active_nr) ||
-	    commit_locked_index(lock_file))
+	if (!active_cache_tree)
+		active_cache_tree = cache_tree();
+
+	if (!cache_tree_fully_valid(active_cache_tree))
+		cache_tree_update(&the_index, WRITE_TREE_SILENT | WRITE_TREE_REPAIR);
+
+	if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
 		die(_("unable to write new index file"));
 
 	if (!opts->force && !opts->quiet)
@@ -624,7 +628,7 @@
 		/* 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,
-			   REF_NODEREF, DIE_ON_ERR);
+			   REF_NODEREF, UPDATE_REFS_DIE_ON_ERR);
 		if (!opts->quiet) {
 			if (old->path && advice_detached_head)
 				detach_advice(new->name);
@@ -651,12 +655,8 @@
 			}
 		}
 		if (old->path && old->name) {
-			char log_file[PATH_MAX], ref_file[PATH_MAX];
-
-			git_snpath(log_file, sizeof(log_file), "logs/%s", old->path);
-			git_snpath(ref_file, sizeof(ref_file), "%s", old->path);
-			if (!file_exists(ref_file) && file_exists(log_file))
-				remove_path(log_file);
+			if (!ref_exists(old->path) && reflog_exists(old->path))
+				delete_reflog(old->path);
 		}
 	}
 	remove_branch_state();
@@ -775,13 +775,13 @@
 	unsigned char rev[20];
 	int flag, writeout_error = 0;
 	memset(&old, 0, sizeof(old));
-	old.path = path_to_free = resolve_refdup("HEAD", rev, 0, &flag);
+	old.path = path_to_free = resolve_refdup("HEAD", 0, rev, &flag);
 	old.commit = lookup_commit_reference_gently(rev, 1);
 	if (!(flag & REF_ISSYMREF))
 		old.path = NULL;
 
-	if (old.path && starts_with(old.path, "refs/heads/"))
-		old.name = old.path + strlen("refs/heads/");
+	if (old.path)
+		skip_prefix(old.path, "refs/heads/", &old.name);
 
 	if (!new->name) {
 		new->name = "HEAD";
@@ -1072,7 +1072,7 @@
 		unsigned char rev[20];
 		int flag;
 
-		if (!read_ref_full("HEAD", rev, 0, &flag) &&
+		if (!read_ref_full("HEAD", 0, rev, &flag) &&
 		    (flag & REF_ISSYMREF) && is_null_sha1(rev))
 			return switch_unborn_to_new_branch(opts);
 	}
@@ -1150,10 +1150,8 @@
 		const char *argv0 = argv[0];
 		if (!argc || !strcmp(argv0, "--"))
 			die (_("--track needs a branch name"));
-		if (starts_with(argv0, "refs/"))
-			argv0 += 5;
-		if (starts_with(argv0, "remotes/"))
-			argv0 += 8;
+		skip_prefix(argv0, "refs/", &argv0);
+		skip_prefix(argv0, "remotes/", &argv0);
 		argv0 = strchr(argv0, '/');
 		if (!argv0 || !argv0[1])
 			die (_("Missing branch name; try -b"));
diff --git a/builtin/clean.c b/builtin/clean.c
index 1032563..7784676 100644
--- a/builtin/clean.c
+++ b/builtin/clean.c
@@ -67,7 +67,7 @@
 	char hotkey;
 	const char *title;
 	int selected;
-	int (*fn)();
+	int (*fn)(void);
 };
 
 enum menu_stuff_type {
@@ -100,6 +100,8 @@
 
 static int git_clean_config(const char *var, const char *value, void *cb)
 {
+	const char *slot_name;
+
 	if (starts_with(var, "column."))
 		return git_column_config(var, value, "clean", &colopts);
 
@@ -109,15 +111,13 @@
 		clean_use_color = git_config_colorbool(var, value);
 		return 0;
 	}
-	if (starts_with(var, "color.interactive.")) {
-		int slot = parse_clean_color_slot(var +
-						  strlen("color.interactive."));
+	if (skip_prefix(var, "color.interactive.", &slot_name)) {
+		int slot = parse_clean_color_slot(slot_name);
 		if (slot < 0)
 			return 0;
 		if (!value)
 			return config_error_nonbool(var);
-		color_parse(value, var, clean_colors[slot]);
-		return 0;
+		return color_parse(value, clean_colors[slot]);
 	}
 
 	if (!strcmp(var, "clean.requireforce")) {
diff --git a/builtin/clone.c b/builtin/clone.c
index 545105a..d5e7532 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -9,6 +9,7 @@
  */
 
 #include "builtin.h"
+#include "lockfile.h"
 #include "parse-options.h"
 #include "fetch-pack.h"
 #include "refs.h"
@@ -390,7 +391,6 @@
 
 static const char *junk_work_tree;
 static const char *junk_git_dir;
-static pid_t junk_pid;
 static enum {
 	JUNK_LEAVE_NONE,
 	JUNK_LEAVE_REPO,
@@ -417,8 +417,6 @@
 		break;
 	}
 
-	if (getpid() != junk_pid)
-		return;
 	if (junk_git_dir) {
 		strbuf_addstr(&sb, junk_git_dir);
 		remove_dir_recursively(&sb, 0);
@@ -521,7 +519,7 @@
 		if (!has_sha1_file(ref->old_sha1))
 			continue;
 		update_ref(msg, ref->name, ref->old_sha1,
-			   NULL, 0, DIE_ON_ERR);
+			   NULL, 0, UPDATE_REFS_DIE_ON_ERR);
 	}
 }
 
@@ -584,19 +582,20 @@
 static void update_head(const struct ref *our, const struct ref *remote,
 			const char *msg)
 {
-	if (our && starts_with(our->name, "refs/heads/")) {
+	const char *head;
+	if (our && skip_prefix(our->name, "refs/heads/", &head)) {
 		/* Local default branch link */
 		create_symref("HEAD", our->name, NULL);
 		if (!option_bare) {
-			const char *head = skip_prefix(our->name, "refs/heads/");
-			update_ref(msg, "HEAD", our->old_sha1, NULL, 0, DIE_ON_ERR);
+			update_ref(msg, "HEAD", our->old_sha1, 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);
 		/* --branch specifies a non-branch (i.e. tags), detach HEAD */
 		update_ref(msg, "HEAD", c->object.sha1,
-			   NULL, REF_NODEREF, DIE_ON_ERR);
+			   NULL, REF_NODEREF, UPDATE_REFS_DIE_ON_ERR);
 	} else if (remote) {
 		/*
 		 * We know remote HEAD points to a non-branch, or
@@ -604,7 +603,7 @@
 		 * Detach HEAD in all these cases.
 		 */
 		update_ref(msg, "HEAD", remote->old_sha1,
-			   NULL, REF_NODEREF, DIE_ON_ERR);
+			   NULL, REF_NODEREF, UPDATE_REFS_DIE_ON_ERR);
 	}
 }
 
@@ -616,12 +615,12 @@
 	struct unpack_trees_options opts;
 	struct tree *tree;
 	struct tree_desc t;
-	int err = 0, fd;
+	int err = 0;
 
 	if (option_no_checkout)
 		return 0;
 
-	head = resolve_refdup("HEAD", sha1, 1, NULL);
+	head = resolve_refdup("HEAD", RESOLVE_REF_READING, sha1, NULL);
 	if (!head) {
 		warning(_("remote HEAD refers to nonexistent ref, "
 			  "unable to checkout.\n"));
@@ -640,7 +639,7 @@
 	setup_work_tree();
 
 	lock_file = xcalloc(1, sizeof(struct lock_file));
-	fd = hold_locked_index(lock_file, 1);
+	hold_locked_index(lock_file, 1);
 
 	memset(&opts, 0, sizeof opts);
 	opts.update = 1;
@@ -656,8 +655,7 @@
 	if (unpack_trees(1, &t, &opts) < 0)
 		die(_("unable to checkout working tree"));
 
-	if (write_cache(fd, active_cache, active_nr) ||
-	    commit_locked_index(lock_file))
+	if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
 		die(_("unable to write new index file"));
 
 	err |= run_hook_le(NULL, "post-checkout", sha1_to_hex(null_sha1),
@@ -685,9 +683,10 @@
 	}
 }
 
-static void write_refspec_config(const char* src_ref_prefix,
-		const struct ref* our_head_points_at,
-		const struct ref* remote_head_points_at, struct strbuf* branch_top)
+static void write_refspec_config(const char *src_ref_prefix,
+		const struct ref *our_head_points_at,
+		const struct ref *remote_head_points_at,
+		struct strbuf *branch_top)
 {
 	struct strbuf key = STRBUF_INIT;
 	struct strbuf value = STRBUF_INIT;
@@ -702,9 +701,12 @@
 					strbuf_addf(&value, "+%s:%s%s", our_head_points_at->name,
 						branch_top->buf, option_branch);
 			} else if (remote_head_points_at) {
+				const char *head = remote_head_points_at->name;
+				if (!skip_prefix(head, "refs/heads/", &head))
+					die("BUG: remote HEAD points at non-head?");
+
 				strbuf_addf(&value, "+%s:%s%s", remote_head_points_at->name,
-						branch_top->buf,
-						skip_prefix(remote_head_points_at->name, "refs/heads/"));
+						branch_top->buf, head);
 			}
 			/*
 			 * otherwise, the next "git fetch" will
@@ -755,8 +757,6 @@
 	struct refspec *refspec;
 	const char *fetch_pattern;
 
-	junk_pid = getpid();
-
 	packet_trace_identity("clone");
 	argc = parse_options(argc, argv, prefix, builtin_clone_options,
 			     builtin_clone_usage, 0);
@@ -796,18 +796,6 @@
 		die(_("repository '%s' does not exist"), repo_name);
 	else
 		repo = repo_name;
-	is_local = option_local != 0 && path && !is_bundle;
-	if (is_local) {
-		if (option_depth)
-			warning(_("--depth is ignored in local clones; use file:// instead."));
-		if (!access(mkpath("%s/shallow", path), F_OK)) {
-			if (option_local > 0)
-				warning(_("source repository is shallow, ignoring --local"));
-			is_local = 0;
-		}
-	}
-	if (option_local > 0 && !is_local)
-		warning(_("--local is ignored"));
 
 	/* no need to be strict, transport_set_option() will validate it again */
 	if (option_depth && atoi(option_depth) < 1)
@@ -900,6 +888,19 @@
 
 	remote = remote_get(option_origin);
 	transport = transport_get(remote, remote->url[0]);
+	path = get_repo_path(remote->url[0], &is_bundle);
+	is_local = option_local != 0 && path && !is_bundle;
+	if (is_local) {
+		if (option_depth)
+			warning(_("--depth is ignored in local clones; use file:// instead."));
+		if (!access(mkpath("%s/shallow", path), F_OK)) {
+			if (option_local > 0)
+				warning(_("source repository is shallow, ignoring --local"));
+			is_local = 0;
+		}
+	}
+	if (option_local > 0 && !is_local)
+		warning(_("--local is ignored"));
 	transport->cloning = 1;
 
 	if (!transport->get_refs_list || (!is_local && !transport->fetch))
@@ -1000,5 +1001,7 @@
 	strbuf_release(&key);
 	strbuf_release(&value);
 	junk_mode = JUNK_LEAVE_ALL;
+
+	free(refspec);
 	return err;
 }
diff --git a/builtin/commit.c b/builtin/commit.c
index 39cf897..e108c53 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -6,6 +6,7 @@
  */
 
 #include "cache.h"
+#include "lockfile.h"
 #include "cache-tree.h"
 #include "color.h"
 #include "dir.h"
@@ -42,7 +43,20 @@
 	NULL
 };
 
-static const char implicit_ident_advice[] =
+static const char implicit_ident_advice_noconfig[] =
+N_("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");
+
+static const char implicit_ident_advice_config[] =
 N_("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"
@@ -302,10 +316,9 @@
 		die_resolve_conflict("commit");
 }
 
-static char *prepare_index(int argc, const char **argv, const char *prefix,
-			   const struct commit *current_head, int is_status)
+static const char *prepare_index(int argc, const char **argv, const char *prefix,
+				 const struct commit *current_head, int is_status)
 {
-	int fd;
 	struct string_list partial;
 	struct pathspec pathspec;
 	int refresh_flags = REFRESH_QUIET;
@@ -321,16 +334,15 @@
 
 	if (interactive) {
 		char *old_index_env = NULL;
-		fd = hold_locked_index(&index_lock, 1);
+		hold_locked_index(&index_lock, 1);
 
 		refresh_cache_or_die(refresh_flags);
 
-		if (write_cache(fd, active_cache, active_nr) ||
-		    close_lock_file(&index_lock))
+		if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
 			die(_("unable to create temporary index"));
 
 		old_index_env = getenv(INDEX_ENVIRONMENT);
-		setenv(INDEX_ENVIRONMENT, index_lock.filename, 1);
+		setenv(INDEX_ENVIRONMENT, index_lock.filename.buf, 1);
 
 		if (interactive_add(argc, argv, prefix, patch_interactive) != 0)
 			die(_("interactive add failed"));
@@ -341,10 +353,17 @@
 			unsetenv(INDEX_ENVIRONMENT);
 
 		discard_cache();
-		read_cache_from(index_lock.filename);
+		read_cache_from(index_lock.filename.buf);
+		if (update_main_cache_tree(WRITE_TREE_SILENT) == 0) {
+			if (reopen_lock_file(&index_lock) < 0)
+				die(_("unable to write index file"));
+			if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
+				die(_("unable to update temporary index"));
+		} else
+			warning(_("Failed to update main cache tree"));
 
 		commit_style = COMMIT_NORMAL;
-		return index_lock.filename;
+		return index_lock.filename.buf;
 	}
 
 	/*
@@ -360,15 +379,14 @@
 	 * (B) on failure, rollback the real index.
 	 */
 	if (all || (also && pathspec.nr)) {
-		fd = hold_locked_index(&index_lock, 1);
+		hold_locked_index(&index_lock, 1);
 		add_files_to_cache(also ? prefix : NULL, &pathspec, 0);
 		refresh_cache_or_die(refresh_flags);
 		update_main_cache_tree(WRITE_TREE_SILENT);
-		if (write_cache(fd, active_cache, active_nr) ||
-		    close_lock_file(&index_lock))
+		if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
 			die(_("unable to write new_index file"));
 		commit_style = COMMIT_NORMAL;
-		return index_lock.filename;
+		return index_lock.filename.buf;
 	}
 
 	/*
@@ -381,12 +399,16 @@
 	 * We still need to refresh the index here.
 	 */
 	if (!only && !pathspec.nr) {
-		fd = hold_locked_index(&index_lock, 1);
+		hold_locked_index(&index_lock, 1);
 		refresh_cache_or_die(refresh_flags);
-		if (active_cache_changed) {
+		if (active_cache_changed
+		    || !cache_tree_fully_valid(active_cache_tree)) {
 			update_main_cache_tree(WRITE_TREE_SILENT);
-			if (write_cache(fd, active_cache, active_nr) ||
-			    commit_locked_index(&index_lock))
+			active_cache_changed = 1;
+		}
+		if (active_cache_changed) {
+			if (write_locked_index(&the_index, &index_lock,
+					       COMMIT_LOCK))
 				die(_("unable to write new_index file"));
 		} else {
 			rollback_lock_file(&index_lock);
@@ -423,8 +445,7 @@
 			die(_("cannot do a partial commit during a cherry-pick."));
 	}
 
-	memset(&partial, 0, sizeof(partial));
-	partial.strdup_strings = 1;
+	string_list_init(&partial, 1);
 	if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, &pathspec))
 		exit(1);
 
@@ -432,30 +453,29 @@
 	if (read_cache() < 0)
 		die(_("cannot read the index"));
 
-	fd = hold_locked_index(&index_lock, 1);
+	hold_locked_index(&index_lock, 1);
 	add_remove_files(&partial);
 	refresh_cache(REFRESH_QUIET);
-	if (write_cache(fd, active_cache, active_nr) ||
-	    close_lock_file(&index_lock))
+	update_main_cache_tree(WRITE_TREE_SILENT);
+	if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK))
 		die(_("unable to write new_index file"));
 
-	fd = hold_lock_file_for_update(&false_lock,
-				       git_path("next-index-%"PRIuMAX,
-						(uintmax_t) getpid()),
-				       LOCK_DIE_ON_ERROR);
+	hold_lock_file_for_update(&false_lock,
+				  git_path("next-index-%"PRIuMAX,
+					   (uintmax_t) getpid()),
+				  LOCK_DIE_ON_ERROR);
 
 	create_base_index(current_head);
 	add_remove_files(&partial);
 	refresh_cache(REFRESH_QUIET);
 
-	if (write_cache(fd, active_cache, active_nr) ||
-	    close_lock_file(&false_lock))
+	if (write_locked_index(&the_index, &false_lock, CLOSE_LOCK))
 		die(_("unable to write temporary index file"));
 
 	discard_cache();
-	read_cache_from(false_lock.filename);
+	read_cache_from(false_lock.filename.buf);
 
-	return false_lock.filename;
+	return false_lock.filename.buf;
 }
 
 static int run_status(FILE *fp, const char *index_file, const char *prefix, int nowarn,
@@ -526,56 +546,82 @@
 	return 1;
 }
 
+static int parse_force_date(const char *in, struct strbuf *out)
+{
+	strbuf_addch(out, '@');
+
+	if (parse_date(in, out) < 0) {
+		int errors = 0;
+		unsigned long t = approxidate_careful(in, &errors);
+		if (errors)
+			return -1;
+		strbuf_addf(out, "%lu", t);
+	}
+
+	return 0;
+}
+
+static void set_ident_var(char **buf, char *val)
+{
+	free(*buf);
+	*buf = val;
+}
+
+static char *envdup(const char *var)
+{
+	const char *val = getenv(var);
+	return val ? xstrdup(val) : NULL;
+}
+
 static void determine_author_info(struct strbuf *author_ident)
 {
 	char *name, *email, *date;
 	struct ident_split author;
 
-	name = getenv("GIT_AUTHOR_NAME");
-	email = getenv("GIT_AUTHOR_EMAIL");
-	date = getenv("GIT_AUTHOR_DATE");
+	name = envdup("GIT_AUTHOR_NAME");
+	email = envdup("GIT_AUTHOR_EMAIL");
+	date = envdup("GIT_AUTHOR_DATE");
 
 	if (author_message) {
-		const char *a, *lb, *rb, *eol;
+		struct ident_split ident;
 		size_t len;
+		const char *a;
 
-		a = strstr(author_message_buffer, "\nauthor ");
+		a = find_commit_header(author_message_buffer, "author", &len);
 		if (!a)
-			die(_("invalid commit: %s"), author_message);
+			die(_("commit '%s' lacks author header"), author_message);
+		if (split_ident_line(&ident, a, len) < 0)
+			die(_("commit '%s' has malformed author line"), author_message);
 
-		lb = strchrnul(a + strlen("\nauthor "), '<');
-		rb = strchrnul(lb, '>');
-		eol = strchrnul(rb, '\n');
-		if (!*lb || !*rb || !*eol)
-			die(_("invalid commit: %s"), author_message);
+		set_ident_var(&name, xmemdupz(ident.name_begin, ident.name_end - ident.name_begin));
+		set_ident_var(&email, xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin));
 
-		if (lb == a + strlen("\nauthor "))
-			/* \nauthor <foo@example.com> */
-			name = xcalloc(1, 1);
-		else
-			name = xmemdupz(a + strlen("\nauthor "),
-					(lb - strlen(" ") -
-					 (a + strlen("\nauthor "))));
-		email = xmemdupz(lb + strlen("<"), rb - (lb + strlen("<")));
-		len = eol - (rb + strlen("> "));
-		date = xmalloc(len + 2);
-		*date = '@';
-		memcpy(date + 1, rb + strlen("> "), len);
-		date[len + 1] = '\0';
+		if (ident.date_begin) {
+			struct strbuf date_buf = STRBUF_INIT;
+			strbuf_addch(&date_buf, '@');
+			strbuf_add(&date_buf, ident.date_begin, ident.date_end - ident.date_begin);
+			strbuf_addch(&date_buf, ' ');
+			strbuf_add(&date_buf, ident.tz_begin, ident.tz_end - ident.tz_begin);
+			set_ident_var(&date, strbuf_detach(&date_buf, NULL));
+		}
 	}
 
 	if (force_author) {
-		const char *lb = strstr(force_author, " <");
-		const char *rb = strchr(force_author, '>');
+		struct ident_split ident;
 
-		if (!lb || !rb)
+		if (split_ident_line(&ident, force_author, strlen(force_author)) < 0)
 			die(_("malformed --author parameter"));
-		name = xstrndup(force_author, lb - force_author);
-		email = xstrndup(lb + 2, rb - (lb + 2));
+		set_ident_var(&name, xmemdupz(ident.name_begin, ident.name_end - ident.name_begin));
+		set_ident_var(&email, xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin));
 	}
 
-	if (force_date)
-		date = force_date;
+	if (force_date) {
+		struct strbuf date_buf = STRBUF_INIT;
+		if (parse_force_date(force_date, &date_buf))
+			die(_("invalid date format: %s"), force_date);
+		set_ident_var(&date, strbuf_detach(&date_buf, NULL));
+	}
+
 	strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
 	if (!split_ident_line(&author, author_ident->buf, author_ident->len) &&
 	    sane_ident_split(&author)) {
@@ -583,15 +629,52 @@
 		export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0);
 		export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@');
 	}
+
+	free(name);
+	free(email);
+	free(date);
 }
 
-static char *cut_ident_timestamp_part(char *string)
+static void split_ident_or_die(struct ident_split *id, const struct strbuf *buf)
 {
-	char *ket = strrchr(string, '>');
-	if (!ket || ket[1] != ' ')
-		die(_("Malformed ident string: '%s'"), string);
-	*++ket = '\0';
-	return ket;
+	if (split_ident_line(id, buf->buf, buf->len) ||
+	    !sane_ident_split(id))
+		die(_("Malformed ident string: '%s'"), buf->buf);
+}
+
+static int author_date_is_interesting(void)
+{
+	return author_message || force_date;
+}
+
+static void adjust_comment_line_char(const struct strbuf *sb)
+{
+	char candidates[] = "#;@!$%^&|:";
+	char *candidate;
+	const char *p;
+
+	comment_line_char = candidates[0];
+	if (!memchr(sb->buf, comment_line_char, sb->len))
+		return;
+
+	p = sb->buf;
+	candidate = strchr(candidates, *p);
+	if (candidate)
+		*candidate = ' ';
+	for (p = sb->buf; *p; p++) {
+		if ((p[0] == '\n' || p[0] == '\r') && p[1]) {
+			candidate = strchr(candidates, p[1]);
+			if (candidate)
+				*candidate = ' ';
+		}
+	}
+
+	for (p = candidates; *p == ' '; p++)
+		;
+	if (!*p)
+		die(_("unable to select a comment character that is not used\n"
+		      "in the current commit message"));
+	comment_line_char = *p;
 }
 
 static int prepare_to_commit(const char *index_file, const char *prefix,
@@ -651,7 +734,7 @@
 		char *buffer;
 		buffer = strstr(use_message_buffer, "\n\n");
 		if (buffer)
-			strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
+			strbuf_addstr(&sb, buffer + 2);
 		hook_arg1 = "commit";
 		hook_arg2 = use_message;
 	} else if (fixup_message) {
@@ -747,6 +830,8 @@
 	if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
 		die_errno(_("could not write commit template"));
 
+	if (auto_comment_line_char)
+		adjust_comment_line_char(&sb);
 	strbuf_release(&sb);
 
 	/* This checks if committer ident is explicitly given */
@@ -754,7 +839,8 @@
 	if (use_editor && include_status) {
 		int ident_shown = 0;
 		int saved_color_setting;
-		char *ai_tmp, *ci_tmp;
+		struct ident_split ci, ai;
+
 		if (whence != FROM_COMMIT) {
 			if (cleanup_mode == CLEANUP_SCISSORS)
 				wt_status_add_cut_line(s->fp);
@@ -794,32 +880,39 @@
 			status_printf_ln(s, GIT_COLOR_NORMAL,
 					"%s", only_include_assumed);
 
-		ai_tmp = cut_ident_timestamp_part(author_ident->buf);
-		ci_tmp = cut_ident_timestamp_part(committer_ident.buf);
-		if (strcmp(author_ident->buf, committer_ident.buf))
+		split_ident_or_die(&ai, author_ident);
+		split_ident_or_die(&ci, &committer_ident);
+
+		if (ident_cmp(&ai, &ci))
 			status_printf_ln(s, GIT_COLOR_NORMAL,
 				_("%s"
-				"Author:    %s"),
+				"Author:    %.*s <%.*s>"),
 				ident_shown++ ? "" : "\n",
-				author_ident->buf);
+				(int)(ai.name_end - ai.name_begin), ai.name_begin,
+				(int)(ai.mail_end - ai.mail_begin), ai.mail_begin);
+
+		if (author_date_is_interesting())
+			status_printf_ln(s, GIT_COLOR_NORMAL,
+				_("%s"
+				"Date:      %s"),
+				ident_shown++ ? "" : "\n",
+				show_ident_date(&ai, DATE_NORMAL));
 
 		if (!committer_ident_sufficiently_given())
 			status_printf_ln(s, GIT_COLOR_NORMAL,
 				_("%s"
-				"Committer: %s"),
+				"Committer: %.*s <%.*s>"),
 				ident_shown++ ? "" : "\n",
-				committer_ident.buf);
+				(int)(ci.name_end - ci.name_begin), ci.name_begin,
+				(int)(ci.mail_end - ci.mail_begin), ci.mail_begin);
 
 		if (ident_shown)
-			status_printf_ln(s, GIT_COLOR_NORMAL, "");
+			status_printf_ln(s, GIT_COLOR_NORMAL, "%s", "");
 
 		saved_color_setting = s->use_color;
 		s->use_color = 0;
 		commitable = run_status(s->fp, index_file, prefix, 1, s);
 		s->use_color = saved_color_setting;
-
-		*ai_tmp = ' ';
-		*ci_tmp = ' ';
 	} else {
 		unsigned char sha1[20];
 		const char *parent = "HEAD";
@@ -954,7 +1047,7 @@
 static int template_untouched(struct strbuf *sb)
 {
 	struct strbuf tmpl = STRBUF_INIT;
-	char *start;
+	const char *start;
 
 	if (cleanup_mode == CLEANUP_NONE && sb->len)
 		return 0;
@@ -963,8 +1056,7 @@
 		return 0;
 
 	stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
-	start = (char *)skip_prefix(sb->buf, tmpl.buf);
-	if (!start)
+	if (!skip_prefix(sb->buf, tmpl.buf, &start))
 		start = sb->buf;
 	strbuf_release(&tmpl);
 	return rest_is_empty(sb, start - sb->buf);
@@ -989,7 +1081,8 @@
 	revs.mailmap = &mailmap;
 	read_mailmap(revs.mailmap, NULL);
 
-	prepare_revision_walk(&revs);
+	if (prepare_revision_walk(&revs))
+		die(_("revision walk setup failed"));
 	commit = get_revision(&revs);
 	if (commit) {
 		struct pretty_print_context ctx = {0};
@@ -1179,22 +1272,21 @@
 	return commitable ? 0 : 1;
 }
 
-static int parse_status_slot(const char *var, int offset)
+static int parse_status_slot(const char *slot)
 {
-	if (!strcasecmp(var+offset, "header"))
+	if (!strcasecmp(slot, "header"))
 		return WT_STATUS_HEADER;
-	if (!strcasecmp(var+offset, "branch"))
+	if (!strcasecmp(slot, "branch"))
 		return WT_STATUS_ONBRANCH;
-	if (!strcasecmp(var+offset, "updated")
-		|| !strcasecmp(var+offset, "added"))
+	if (!strcasecmp(slot, "updated") || !strcasecmp(slot, "added"))
 		return WT_STATUS_UPDATED;
-	if (!strcasecmp(var+offset, "changed"))
+	if (!strcasecmp(slot, "changed"))
 		return WT_STATUS_CHANGED;
-	if (!strcasecmp(var+offset, "untracked"))
+	if (!strcasecmp(slot, "untracked"))
 		return WT_STATUS_UNTRACKED;
-	if (!strcasecmp(var+offset, "nobranch"))
+	if (!strcasecmp(slot, "nobranch"))
 		return WT_STATUS_NOBRANCH;
-	if (!strcasecmp(var+offset, "unmerged"))
+	if (!strcasecmp(slot, "unmerged"))
 		return WT_STATUS_UNMERGED;
 	return -1;
 }
@@ -1202,6 +1294,7 @@
 static int git_status_config(const char *k, const char *v, void *cb)
 {
 	struct wt_status *s = cb;
+	const char *slot_name;
 
 	if (starts_with(k, "column."))
 		return git_column_config(k, v, "status", &s->colopts);
@@ -1231,14 +1324,14 @@
 		s->display_comment_prefix = git_config_bool(k, v);
 		return 0;
 	}
-	if (starts_with(k, "status.color.") || starts_with(k, "color.status.")) {
-		int slot = parse_status_slot(k, 13);
+	if (skip_prefix(k, "status.color.", &slot_name) ||
+	    skip_prefix(k, "color.status.", &slot_name)) {
+		int slot = parse_status_slot(slot_name);
 		if (slot < 0)
 			return 0;
 		if (!v)
 			return config_error_nonbool(k);
-		color_parse(v, k, s->color_palette[slot]);
-		return 0;
+		return color_parse(v, s->color_palette[slot]);
 	}
 	if (!strcmp(k, "status.relativepaths")) {
 		s->relative_paths = git_config_bool(k, v);
@@ -1343,6 +1436,24 @@
 	return 0;
 }
 
+static const char *implicit_ident_advice(void)
+{
+	char *user_config = NULL;
+	char *xdg_config = NULL;
+	int config_exists;
+
+	home_config_paths(&user_config, &xdg_config, "config");
+	config_exists = file_exists(user_config) || file_exists(xdg_config);
+	free(user_config);
+	free(xdg_config);
+
+	if (config_exists)
+		return _(implicit_ident_advice_config);
+	else
+		return _(implicit_ident_advice_noconfig);
+
+}
+
 static void print_summary(const char *prefix, const unsigned char *sha1,
 			  int initial_commit)
 {
@@ -1369,12 +1480,19 @@
 		strbuf_addstr(&format, "\n Author: ");
 		strbuf_addbuf_percentquote(&format, &author_ident);
 	}
+	if (author_date_is_interesting()) {
+		struct strbuf date = STRBUF_INIT;
+		format_commit_message(commit, "%ad", &date, &pctx);
+		strbuf_addstr(&format, "\n Date: ");
+		strbuf_addbuf_percentquote(&format, &date);
+		strbuf_release(&date);
+	}
 	if (!committer_ident_sufficiently_given()) {
 		strbuf_addstr(&format, "\n Committer: ");
 		strbuf_addbuf_percentquote(&format, &committer_ident);
 		if (advice_implicit_identity) {
 			strbuf_addch(&format, '\n');
-			strbuf_addstr(&format, _(implicit_ident_advice));
+			strbuf_addstr(&format, implicit_ident_advice());
 		}
 	}
 	strbuf_release(&author_ident);
@@ -1395,14 +1513,12 @@
 	rev.diffopt.break_opt = 0;
 	diff_setup_done(&rev.diffopt);
 
-	head = resolve_ref_unsafe("HEAD", junk_sha1, 0, NULL);
-	printf("[%s%s ",
-		starts_with(head, "refs/heads/") ?
-			head + 11 :
-			!strcmp(head, "HEAD") ?
-				_("detached HEAD") :
-				head,
-		initial_commit ? _(" (root-commit)") : "");
+	head = resolve_ref_unsafe("HEAD", 0, junk_sha1, NULL);
+	if (!strcmp(head, "HEAD"))
+		head = _("detached HEAD");
+	else
+		skip_prefix(head, "refs/heads/", &head);
+	printf("[%s%s ", head, initial_commit ? _(" (root-commit)") : "");
 
 	if (!log_tree_commit(&rev, commit)) {
 		rev.always_show_header = 1;
@@ -1442,7 +1558,7 @@
 {
 	/* oldsha1 SP newsha1 LF NUL */
 	static char buf[2*40 + 3];
-	struct child_process proc;
+	struct child_process proc = CHILD_PROCESS_INIT;
 	const char *argv[3];
 	int code;
 	size_t n;
@@ -1454,7 +1570,6 @@
 	argv[1] = "amend";
 	argv[2] = NULL;
 
-	memset(&proc, 0, sizeof(proc));
 	proc.argv = argv;
 	proc.in = -1;
 	proc.stdout_to_stderr = 1;
@@ -1554,11 +1669,12 @@
 	const char *index_file, *reflog_msg;
 	char *nl;
 	unsigned char sha1[20];
-	struct ref_lock *ref_lock;
 	struct commit_list *parents = NULL, **pptr = &parents;
 	struct stat statbuf;
 	struct commit *current_head = NULL;
 	struct commit_extra_header *extra = NULL;
+	struct ref_transaction *transaction;
+	struct strbuf err = STRBUF_INIT;
 
 	if (argc == 2 && !strcmp(argv[1], "-h"))
 		usage_with_options(builtin_commit_usage, builtin_commit_options);
@@ -1680,12 +1796,6 @@
 	strbuf_release(&author_ident);
 	free_commit_extra_headers(extra);
 
-	ref_lock = lock_any_ref_for_update("HEAD",
-					   !current_head
-					   ? NULL
-					   : current_head->object.sha1,
-					   0, NULL);
-
 	nl = strchr(sb.buf, '\n');
 	if (nl)
 		strbuf_setlen(&sb, nl + 1 - sb.buf);
@@ -1694,14 +1804,17 @@
 	strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
 	strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
 
-	if (!ref_lock) {
+	transaction = ref_transaction_begin(&err);
+	if (!transaction ||
+	    ref_transaction_update(transaction, "HEAD", sha1,
+				   current_head
+				   ? current_head->object.sha1 : NULL,
+				   0, !!current_head, sb.buf, &err) ||
+	    ref_transaction_commit(transaction, &err)) {
 		rollback_index_files();
-		die(_("cannot lock HEAD ref"));
+		die("%s", err.buf);
 	}
-	if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) {
-		rollback_index_files();
-		die(_("cannot update HEAD ref"));
-	}
+	ref_transaction_free(transaction);
 
 	unlink(git_path("CHERRY_PICK_HEAD"));
 	unlink(git_path("REVERT_HEAD"));
@@ -1712,7 +1825,7 @@
 
 	if (commit_index_files())
 		die (_("Repository has been updated, but unable to write\n"
-		     "new_index file. Check that disk is not full or quota is\n"
+		     "new_index file. Check that disk is not full and quota is\n"
 		     "not exceeded, and then \"git reset HEAD\" to recover."));
 
 	rerere(0);
@@ -1730,5 +1843,6 @@
 	if (!quiet)
 		print_summary(prefix, sha1, !current_head);
 
+	strbuf_release(&err);
 	return 0;
 }
diff --git a/builtin/config.c b/builtin/config.c
index 5677c94..8cc2604 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -296,7 +296,8 @@
 	if (!strcmp(var, get_color_slot)) {
 		if (!value)
 			config_error_nonbool(var);
-		color_parse(value, var, parsed_color);
+		if (color_parse(value, parsed_color) < 0)
+			return -1;
 		get_color_found = 1;
 	}
 	return 0;
@@ -309,8 +310,10 @@
 	git_config_with_options(git_get_color_config, NULL,
 				&given_config_source, respect_includes);
 
-	if (!get_color_found && def_color)
-		color_parse(def_color, "command line", parsed_color);
+	if (!get_color_found && def_color) {
+		if (color_parse(def_color, parsed_color) < 0)
+			die(_("unable to parse default color value"));
+	}
 
 	fputs(parsed_color, stdout);
 }
@@ -395,19 +398,6 @@
 	return 0;
 }
 
-static char *dup_downcase(const char *string)
-{
-	char *result;
-	size_t len, i;
-
-	len = strlen(string);
-	result = xmalloc(len + 1);
-	for (i = 0; i < len; i++)
-		result[i] = tolower(string[i]);
-	result[i] = '\0';
-	return result;
-}
-
 static int get_urlmatch(const char *var, const char *url)
 {
 	char *section_tail;
@@ -422,7 +412,7 @@
 	if (!url_normalize(url, &config.url))
 		die("%s", config.url.err);
 
-	config.section = dup_downcase(var);
+	config.section = xstrdup_tolower(var);
 	section_tail = strchr(config.section, '.');
 	if (section_tail) {
 		*section_tail = '\0';
@@ -458,6 +448,20 @@
 	return 0;
 }
 
+static char *default_user_config(void)
+{
+	struct strbuf buf = STRBUF_INIT;
+	strbuf_addf(&buf,
+		    _("# This is Git's per-user configuration file.\n"
+		      "[core]\n"
+		      "# Please adapt and uncomment the following lines:\n"
+		      "#	user = %s\n"
+		      "#	email = %s\n"),
+		    ident_default_name(),
+		    ident_default_email());
+	return strbuf_detach(&buf, NULL);
+}
+
 int cmd_config(int argc, const char **argv, const char *prefix)
 {
 	int nongit = !startup_info->have_repository;
@@ -564,6 +568,8 @@
 		}
 	}
 	else if (actions == ACTION_EDIT) {
+		const char *config_file = given_config_source.file ?
+			given_config_source.file : git_path("config");
 		check_argc(argc, 0, 0);
 		if (!given_config_source.file && nongit)
 			die("not in a git directory");
@@ -572,9 +578,18 @@
 		if (given_config_source.blob)
 			die("editing blobs is not supported");
 		git_config(git_default_config, NULL);
-		launch_editor(given_config_source.file ?
-			      given_config_source.file : git_path("config"),
-			      NULL, NULL);
+		if (use_global_config) {
+			int fd = open(config_file, O_CREAT | O_EXCL | O_WRONLY, 0666);
+			if (fd) {
+				char *content = default_user_config();
+				write_str_in_full(fd, content);
+				free(content);
+				close(fd);
+			}
+			else if (errno != EEXIST)
+				die_errno(_("cannot create configuration file %s"), config_file);
+		}
+		launch_editor(config_file, NULL, NULL);
 	}
 	else if (actions == ACTION_SET) {
 		int ret;
@@ -599,7 +614,8 @@
 		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, "^$", 0);
+						       argv[0], value,
+						       CONFIG_REGEX_NONE, 0);
 	}
 	else if (actions == ACTION_REPLACE_ALL) {
 		check_write();
diff --git a/builtin/count-objects.c b/builtin/count-objects.c
index a7f70cb..e47ef0b 100644
--- a/builtin/count-objects.c
+++ b/builtin/count-objects.c
@@ -11,6 +11,9 @@
 
 static unsigned long garbage;
 static off_t size_garbage;
+static int verbose;
+static unsigned long loose, packed, packed_loose;
+static off_t loose_size;
 
 static void real_report_garbage(const char *desc, const char *path)
 {
@@ -21,61 +24,31 @@
 	garbage++;
 }
 
-static void count_objects(DIR *d, char *path, int len, int verbose,
-			  unsigned long *loose,
-			  off_t *loose_size,
-			  unsigned long *packed_loose)
+static void loose_garbage(const char *path)
 {
-	struct dirent *ent;
-	while ((ent = readdir(d)) != NULL) {
-		char hex[41];
-		unsigned char sha1[20];
-		const char *cp;
-		int bad = 0;
+	if (verbose)
+		report_garbage("garbage found", path);
+}
 
-		if (is_dot_or_dotdot(ent->d_name))
-			continue;
-		for (cp = ent->d_name; *cp; cp++) {
-			int ch = *cp;
-			if (('0' <= ch && ch <= '9') ||
-			    ('a' <= ch && ch <= 'f'))
-				continue;
-			bad = 1;
-			break;
-		}
-		if (cp - ent->d_name != 38)
-			bad = 1;
-		else {
-			struct stat st;
-			memcpy(path + len + 3, ent->d_name, 38);
-			path[len + 2] = '/';
-			path[len + 41] = 0;
-			if (lstat(path, &st) || !S_ISREG(st.st_mode))
-				bad = 1;
-			else
-				(*loose_size) += xsize_t(on_disk_bytes(st));
-		}
-		if (bad) {
-			if (verbose) {
-				struct strbuf sb = STRBUF_INIT;
-				strbuf_addf(&sb, "%.*s/%s",
-					    len + 2, path, ent->d_name);
-				report_garbage("garbage found", sb.buf);
-				strbuf_release(&sb);
-			}
-			continue;
-		}
-		(*loose)++;
-		if (!verbose)
-			continue;
-		memcpy(hex, path+len, 2);
-		memcpy(hex+2, ent->d_name, 38);
-		hex[40] = 0;
-		if (get_sha1_hex(hex, sha1))
-			die("internal error");
-		if (has_sha1_pack(sha1))
-			(*packed_loose)++;
+static int count_loose(const unsigned char *sha1, const char *path, void *data)
+{
+	struct stat st;
+
+	if (lstat(path, &st) || !S_ISREG(st.st_mode))
+		loose_garbage(path);
+	else {
+		loose_size += on_disk_bytes(st);
+		loose++;
+		if (verbose && has_sha1_pack(sha1))
+			packed_loose++;
 	}
+	return 0;
+}
+
+static int count_cruft(const char *basename, const char *path, void *data)
+{
+	loose_garbage(path);
+	return 0;
 }
 
 static char const * const count_objects_usage[] = {
@@ -85,12 +58,7 @@
 
 int cmd_count_objects(int argc, const char **argv, const char *prefix)
 {
-	int i, verbose = 0, human_readable = 0;
-	const char *objdir = get_object_directory();
-	int len = strlen(objdir);
-	char *path = xmalloc(len + 50);
-	unsigned long loose = 0, packed = 0, packed_loose = 0;
-	off_t loose_size = 0;
+	int human_readable = 0;
 	struct option opts[] = {
 		OPT__VERBOSE(&verbose, N_("be verbose")),
 		OPT_BOOL('H', "human-readable", &human_readable,
@@ -104,19 +72,10 @@
 		usage_with_options(count_objects_usage, opts);
 	if (verbose)
 		report_garbage = real_report_garbage;
-	memcpy(path, objdir, len);
-	if (len && objdir[len-1] != '/')
-		path[len++] = '/';
-	for (i = 0; i < 256; i++) {
-		DIR *d;
-		sprintf(path + len, "%02x", i);
-		d = opendir(path);
-		if (!d)
-			continue;
-		count_objects(d, path, len, verbose,
-			      &loose, &loose_size, &packed_loose);
-		closedir(d);
-	}
+
+	for_each_loose_file_in_objdir(get_object_directory(),
+				      count_loose, count_cruft, NULL, NULL);
+
 	if (verbose) {
 		struct packed_git *p;
 		unsigned long num_pack = 0;
diff --git a/builtin/describe.c b/builtin/describe.c
index 24d740c..9103193 100644
--- a/builtin/describe.c
+++ b/builtin/describe.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "lockfile.h"
 #include "commit.h"
 #include "tag.h"
 #include "refs.h"
@@ -56,18 +57,9 @@
 	return hashcmp(cn1->peeled, peeled ? peeled : cn2->peeled);
 }
 
-static inline unsigned int hash_sha1(const unsigned char *sha1)
-{
-	unsigned int hash;
-	memcpy(&hash, sha1, sizeof(hash));
-	return hash;
-}
-
 static inline struct commit_name *find_commit_name(const unsigned char *peeled)
 {
-	struct commit_name key;
-	hashmap_entry_init(&key, hash_sha1(peeled));
-	return hashmap_get(&names, &key, peeled);
+	return hashmap_get_from_hash(&names, sha1hash(peeled), peeled);
 }
 
 static int replace_name(struct commit_name *e,
@@ -114,7 +106,7 @@
 		if (!e) {
 			e = xmalloc(sizeof(struct commit_name));
 			hashcpy(e->peeled, peeled);
-			hashmap_entry_init(e, hash_sha1(peeled));
+			hashmap_entry_init(e, sha1hash(peeled));
 			hashmap_add(&names, e);
 			e->path = NULL;
 		}
diff --git a/builtin/diff-tree.c b/builtin/diff-tree.c
index dddd0f9..1c4ad62 100644
--- a/builtin/diff-tree.c
+++ b/builtin/diff-tree.c
@@ -22,14 +22,10 @@
 	if (isspace(line[40]) && !get_sha1_hex(line+41, sha1)) {
 		/* Graft the fake parents locally to the commit */
 		int pos = 41;
-		struct commit_list **pptr, *parents;
+		struct commit_list **pptr;
 
 		/* Free the real parent list */
-		for (parents = commit->parents; parents; ) {
-			struct commit_list *tmp = parents->next;
-			free(parents);
-			parents = tmp;
-		}
+		free_commit_list(commit->parents);
 		commit->parents = NULL;
 		pptr = &(commit->parents);
 		while (line[pos] && !get_sha1_hex(line + pos, sha1)) {
diff --git a/builtin/diff.c b/builtin/diff.c
index 0f247d2..4326fa5 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -4,6 +4,7 @@
  * Copyright (c) 2006 Junio C Hamano
  */
 #include "cache.h"
+#include "lockfile.h"
 #include "color.h"
 #include "commit.h"
 #include "blob.h"
diff --git a/builtin/fast-export.c b/builtin/fast-export.c
index 05d161f..b8182c2 100644
--- a/builtin/fast-export.c
+++ b/builtin/fast-export.c
@@ -17,6 +17,8 @@
 #include "utf8.h"
 #include "parse-options.h"
 #include "quote.h"
+#include "remote.h"
+#include "blob.h"
 
 static const char *fast_export_usage[] = {
 	N_("git fast-export [rev-list-opts]"),
@@ -31,6 +33,9 @@
 static int no_data;
 static int full_tree;
 static struct string_list extra_refs = STRING_LIST_INIT_NODUP;
+static struct refspec *refspecs;
+static int refspecs_nr;
+static int anonymize;
 
 static int parse_opt_signed_tag_mode(const struct option *opt,
 				     const char *arg, int unset)
@@ -78,6 +83,76 @@
 	return 0;
 }
 
+struct anonymized_entry {
+	struct hashmap_entry hash;
+	const char *orig;
+	size_t orig_len;
+	const char *anon;
+	size_t anon_len;
+};
+
+static int anonymized_entry_cmp(const void *va, const void *vb,
+				const void *data)
+{
+	const struct anonymized_entry *a = va, *b = vb;
+	return a->orig_len != b->orig_len ||
+		memcmp(a->orig, b->orig, a->orig_len);
+}
+
+/*
+ * Basically keep a cache of X->Y so that we can repeatedly replace
+ * the same anonymized string with another. The actual generation
+ * is farmed out to the generate function.
+ */
+static const void *anonymize_mem(struct hashmap *map,
+				 void *(*generate)(const void *, size_t *),
+				 const void *orig, size_t *len)
+{
+	struct anonymized_entry key, *ret;
+
+	if (!map->cmpfn)
+		hashmap_init(map, anonymized_entry_cmp, 0);
+
+	hashmap_entry_init(&key, memhash(orig, *len));
+	key.orig = orig;
+	key.orig_len = *len;
+	ret = hashmap_get(map, &key, NULL);
+
+	if (!ret) {
+		ret = xmalloc(sizeof(*ret));
+		hashmap_entry_init(&ret->hash, key.hash.hash);
+		ret->orig = xstrdup(orig);
+		ret->orig_len = *len;
+		ret->anon = generate(orig, len);
+		ret->anon_len = *len;
+		hashmap_put(map, ret);
+	}
+
+	*len = ret->anon_len;
+	return ret->anon;
+}
+
+/*
+ * We anonymize each component of a path individually,
+ * so that paths a/b and a/c will share a common root.
+ * The paths are cached via anonymize_mem so that repeated
+ * lookups for "a" will yield the same value.
+ */
+static void anonymize_path(struct strbuf *out, const char *path,
+			   struct hashmap *map,
+			   void *(*generate)(const void *, size_t *))
+{
+	while (*path) {
+		const char *end_of_component = strchrnul(path, '/');
+		size_t len = end_of_component - path;
+		const char *c = anonymize_mem(map, generate, path, &len);
+		strbuf_add(out, c, len);
+		path = end_of_component;
+		if (*path)
+			strbuf_addch(out, *path++);
+	}
+}
+
 /* Since intptr_t is C99, we do not use it here */
 static inline uint32_t *mark_to_ptr(uint32_t mark)
 {
@@ -116,6 +191,26 @@
 		printf("progress %d objects\n", counter);
 }
 
+/*
+ * Ideally we would want some transformation of the blob data here
+ * that is unreversible, but would still be the same size and have
+ * the same data relationship to other blobs (so that we get the same
+ * delta and packing behavior as the original). But the first and last
+ * requirements there are probably mutually exclusive, so let's take
+ * the easy way out for now, and just generate arbitrary content.
+ *
+ * There's no need to cache this result with anonymize_mem, since
+ * we already handle blob content caching with marks.
+ */
+static char *anonymize_blob(unsigned long *size)
+{
+	static int counter;
+	struct strbuf out = STRBUF_INIT;
+	strbuf_addf(&out, "anonymous blob %d", counter++);
+	*size = out.len;
+	return strbuf_detach(&out, NULL);
+}
+
 static void export_blob(const unsigned char *sha1)
 {
 	unsigned long size;
@@ -134,12 +229,19 @@
 	if (object && object->flags & SHOWN)
 		return;
 
-	buf = read_sha1_file(sha1, &type, &size);
-	if (!buf)
-		die ("Could not read blob %s", sha1_to_hex(sha1));
-	if (check_sha1_signature(sha1, buf, size, typename(type)) < 0)
-		die("sha1 mismatch in blob %s", sha1_to_hex(sha1));
-	object = parse_object_buffer(sha1, type, size, buf, &eaten);
+	if (anonymize) {
+		buf = anonymize_blob(&size);
+		object = (struct object *)lookup_blob(sha1);
+		eaten = 0;
+	} else {
+		buf = read_sha1_file(sha1, &type, &size);
+		if (!buf)
+			die ("Could not read blob %s", sha1_to_hex(sha1));
+		if (check_sha1_signature(sha1, buf, size, typename(type)) < 0)
+			die("sha1 mismatch in blob %s", sha1_to_hex(sha1));
+		object = parse_object_buffer(sha1, type, size, buf, &eaten);
+	}
+
 	if (!object)
 		die("Could not read blob %s", sha1_to_hex(sha1));
 
@@ -187,7 +289,7 @@
 	return (a->status == 'R') - (b->status == 'R');
 }
 
-static void print_path(const char *path)
+static void print_path_1(const char *path)
 {
 	int need_quote = quote_c_style(path, NULL, NULL, 0);
 	if (need_quote)
@@ -198,6 +300,43 @@
 		printf("%s", path);
 }
 
+static void *anonymize_path_component(const void *path, size_t *len)
+{
+	static int counter;
+	struct strbuf out = STRBUF_INIT;
+	strbuf_addf(&out, "path%d", counter++);
+	return strbuf_detach(&out, len);
+}
+
+static void print_path(const char *path)
+{
+	if (!anonymize)
+		print_path_1(path);
+	else {
+		static struct hashmap paths;
+		static struct strbuf anon = STRBUF_INIT;
+
+		anonymize_path(&anon, path, &paths, anonymize_path_component);
+		print_path_1(anon.buf);
+		strbuf_reset(&anon);
+	}
+}
+
+static void *generate_fake_sha1(const void *old, size_t *len)
+{
+	static uint32_t counter = 1; /* avoid null sha1 */
+	unsigned char *out = xcalloc(20, 1);
+	put_be32(out + 16, counter++);
+	return out;
+}
+
+static const unsigned char *anonymize_sha1(const unsigned char *sha1)
+{
+	static struct hashmap sha1s;
+	size_t len = 20;
+	return anonymize_mem(&sha1s, generate_fake_sha1, sha1, &len);
+}
+
 static void show_filemodify(struct diff_queue_struct *q,
 			    struct diff_options *options, void *data)
 {
@@ -242,7 +381,9 @@
 			 */
 			if (no_data || S_ISGITLINK(spec->mode))
 				printf("M %06o %s ", spec->mode,
-				       sha1_to_hex(spec->sha1));
+				       sha1_to_hex(anonymize ?
+						   anonymize_sha1(spec->sha1) :
+						   spec->sha1));
 			else {
 				struct object *object = lookup_object(spec->sha1);
 				printf("M %06o :%d ", spec->mode,
@@ -276,6 +417,114 @@
 	return bol;
 }
 
+static void *anonymize_ref_component(const void *old, size_t *len)
+{
+	static int counter;
+	struct strbuf out = STRBUF_INIT;
+	strbuf_addf(&out, "ref%d", counter++);
+	return strbuf_detach(&out, len);
+}
+
+static const char *anonymize_refname(const char *refname)
+{
+	/*
+	 * If any of these prefixes is found, we will leave it intact
+	 * so that tags remain tags and so forth.
+	 */
+	static const char *prefixes[] = {
+		"refs/heads/",
+		"refs/tags/",
+		"refs/remotes/",
+		"refs/"
+	};
+	static struct hashmap refs;
+	static struct strbuf anon = STRBUF_INIT;
+	int i;
+
+	/*
+	 * We also leave "master" as a special case, since it does not reveal
+	 * anything interesting.
+	 */
+	if (!strcmp(refname, "refs/heads/master"))
+		return refname;
+
+	strbuf_reset(&anon);
+	for (i = 0; i < ARRAY_SIZE(prefixes); i++) {
+		if (skip_prefix(refname, prefixes[i], &refname)) {
+			strbuf_addstr(&anon, prefixes[i]);
+			break;
+		}
+	}
+
+	anonymize_path(&anon, refname, &refs, anonymize_ref_component);
+	return anon.buf;
+}
+
+/*
+ * We do not even bother to cache commit messages, as they are unlikely
+ * to be repeated verbatim, and it is not that interesting when they are.
+ */
+static char *anonymize_commit_message(const char *old)
+{
+	static int counter;
+	return xstrfmt("subject %d\n\nbody\n", counter++);
+}
+
+static struct hashmap idents;
+static void *anonymize_ident(const void *old, size_t *len)
+{
+	static int counter;
+	struct strbuf out = STRBUF_INIT;
+	strbuf_addf(&out, "User %d <user%d@example.com>", counter, counter);
+	counter++;
+	return strbuf_detach(&out, len);
+}
+
+/*
+ * Our strategy here is to anonymize the names and email addresses,
+ * but keep timestamps intact, as they influence things like traversal
+ * order (and by themselves should not be too revealing).
+ */
+static void anonymize_ident_line(const char **beg, const char **end)
+{
+	static struct strbuf buffers[] = { STRBUF_INIT, STRBUF_INIT };
+	static unsigned which_buffer;
+
+	struct strbuf *out;
+	struct ident_split split;
+	const char *end_of_header;
+
+	out = &buffers[which_buffer++];
+	which_buffer %= ARRAY_SIZE(buffers);
+	strbuf_reset(out);
+
+	/* skip "committer", "author", "tagger", etc */
+	end_of_header = strchr(*beg, ' ');
+	if (!end_of_header)
+		die("BUG: malformed line fed to anonymize_ident_line: %.*s",
+		    (int)(*end - *beg), *beg);
+	end_of_header++;
+	strbuf_add(out, *beg, end_of_header - *beg);
+
+	if (!split_ident_line(&split, end_of_header, *end - end_of_header) &&
+	    split.date_begin) {
+		const char *ident;
+		size_t len;
+
+		len = split.mail_end - split.name_begin;
+		ident = anonymize_mem(&idents, anonymize_ident,
+				      split.name_begin, &len);
+		strbuf_add(out, ident, len);
+		strbuf_addch(out, ' ');
+		strbuf_add(out, split.date_begin, split.tz_end - split.date_begin);
+	} else {
+		strbuf_addstr(out, "Malformed Ident <malformed@example.com> 0 -0000");
+	}
+
+	*beg = out->buf;
+	*end = out->buf + out->len;
+}
+
 static void handle_commit(struct commit *commit, struct rev_info *rev)
 {
 	int saved_output_format = rev->diffopt.output_format;
@@ -284,6 +533,7 @@
 	const char *encoding, *message;
 	char *reencoded = NULL;
 	struct commit_list *p;
+	const char *refname;
 	int i;
 
 	rev->diffopt.output_format = DIFF_FORMAT_CALLBACK;
@@ -323,13 +573,22 @@
 		if (!S_ISGITLINK(diff_queued_diff.queue[i]->two->mode))
 			export_blob(diff_queued_diff.queue[i]->two->sha1);
 
+	refname = commit->util;
+	if (anonymize) {
+		refname = anonymize_refname(refname);
+		anonymize_ident_line(&committer, &committer_end);
+		anonymize_ident_line(&author, &author_end);
+	}
+
 	mark_next_object(&commit->object);
-	if (!is_encoding_utf8(encoding))
+	if (anonymize)
+		reencoded = anonymize_commit_message(message);
+	else if (!is_encoding_utf8(encoding))
 		reencoded = reencode_string(message, "UTF-8", encoding);
 	if (!commit->parents)
-		printf("reset %s\n", (const char*)commit->util);
+		printf("reset %s\n", refname);
 	printf("commit %s\nmark :%"PRIu32"\n%.*s\n%.*s\ndata %u\n%s",
-	       (const char *)commit->util, last_idnum,
+	       refname, last_idnum,
 	       (int)(author_end - author), author,
 	       (int)(committer_end - committer), committer,
 	       (unsigned)(reencoded
@@ -360,6 +619,14 @@
 	show_progress();
 }
 
+static void *anonymize_tag(const void *old, size_t *len)
+{
+	static int counter;
+	struct strbuf out = STRBUF_INIT;
+	strbuf_addf(&out, "tag message %d", counter++);
+	return strbuf_detach(&out, len);
+}
+
 static void handle_tail(struct object_array *commits, struct rev_info *revs)
 {
 	struct commit *commit;
@@ -416,6 +683,17 @@
 	} else {
 		tagger++;
 		tagger_end = strchrnul(tagger, '\n');
+		if (anonymize)
+			anonymize_ident_line(&tagger, &tagger_end);
+	}
+
+	if (anonymize) {
+		name = anonymize_refname(name);
+		if (message) {
+			static struct hashmap tags;
+			message = anonymize_mem(&tags, anonymize_tag,
+						message, &message_size);
+		}
 	}
 
 	/* handle signed tags */
@@ -528,6 +806,15 @@
 		if (dwim_ref(e->name, strlen(e->name), sha1, &full_name) != 1)
 			continue;
 
+		if (refspecs) {
+			char *private;
+			private = apply_refspecs(refspecs, refspecs_nr, full_name);
+			if (private) {
+				free(full_name);
+				full_name = private;
+			}
+		}
+
 		commit = get_commit(e, full_name);
 		if (!commit) {
 			warning("%s: Unexpected object of type %s, skipping.",
@@ -572,6 +859,8 @@
 			handle_tag(name, (struct tag *)object);
 			break;
 		case OBJ_COMMIT:
+			if (anonymize)
+				name = anonymize_refname(name);
 			/* create refs pointing to already seen commits */
 			commit = (struct commit *)object;
 			printf("reset %s\nfrom :%d\n\n", name,
@@ -664,6 +953,19 @@
 	fclose(f);
 }
 
+static void handle_deletes(void)
+{
+	int i;
+	for (i = 0; i < refspecs_nr; i++) {
+		struct refspec *refspec = &refspecs[i];
+		if (*refspec->src)
+			continue;
+
+		printf("reset %s\nfrom %s\n\n",
+				refspec->dst, sha1_to_hex(null_sha1));
+	}
+}
+
 int cmd_fast_export(int argc, const char **argv, const char *prefix)
 {
 	struct rev_info revs;
@@ -671,6 +973,7 @@
 	struct commit *commit;
 	char *export_filename = NULL, *import_filename = NULL;
 	uint32_t lastimportid;
+	struct string_list refspecs_list = STRING_LIST_INIT_NODUP;
 	struct option options[] = {
 		OPT_INTEGER(0, "progress", &progress,
 			    N_("show progress after <n> objects")),
@@ -691,6 +994,9 @@
 		OPT_BOOL(0, "use-done-feature", &use_done_feature,
 			     N_("Use the done feature to terminate the stream")),
 		OPT_BOOL(0, "no-data", &no_data, N_("Skip output of blob data")),
+		OPT_STRING_LIST(0, "refspec", &refspecs_list, N_("refspec"),
+			     N_("Apply refspec to exported refs")),
+		OPT_BOOL(0, "anonymize", &anonymize, N_("anonymize output")),
 		OPT_END()
 	};
 
@@ -704,11 +1010,27 @@
 	revs.topo_order = 1;
 	revs.show_source = 1;
 	revs.rewrite_parents = 1;
+	argc = parse_options(argc, argv, prefix, options, fast_export_usage,
+			PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN);
 	argc = setup_revisions(argc, argv, &revs, NULL);
-	argc = parse_options(argc, argv, prefix, options, fast_export_usage, 0);
 	if (argc > 1)
 		usage_with_options (fast_export_usage, options);
 
+	if (refspecs_list.nr) {
+		const char **refspecs_str;
+		int i;
+
+		refspecs_str = xmalloc(sizeof(*refspecs_str) * refspecs_list.nr);
+		for (i = 0; i < refspecs_list.nr; i++)
+			refspecs_str[i] = refspecs_list.items[i].string;
+
+		refspecs_nr = refspecs_list.nr;
+		refspecs = parse_fetch_refspec(refspecs_nr, refspecs_str);
+
+		string_list_clear(&refspecs_list, 1);
+		free(refspecs_str);
+	}
+
 	if (use_done_feature)
 		printf("feature done\n");
 
@@ -736,6 +1058,7 @@
 	}
 
 	handle_tags_and_duplicates();
+	handle_deletes();
 
 	if (export_filename && lastimportid != last_idnum)
 		export_marks(export_filename);
@@ -743,5 +1066,7 @@
 	if (use_done_feature)
 		printf("done\n");
 
+	free_refspec(refspecs_nr, refspecs);
+
 	return 0;
 }
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 36f386d..7b84d35 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -45,6 +45,8 @@
 static const char *submodule_prefix = "";
 static const char *recurse_submodules_default;
 static int shown_url = 0;
+static int refmap_alloc, refmap_nr;
+static const char **refmap_array;
 
 static int option_parse_recurse_submodules(const struct option *opt,
 				   const char *arg, int unset)
@@ -69,6 +71,19 @@
 	return git_default_config(k, v, cb);
 }
 
+static int parse_refmap_arg(const struct option *opt, const char *arg, int unset)
+{
+	ALLOC_GROW(refmap_array, refmap_nr + 1, refmap_alloc);
+
+	/*
+	 * "git fetch --refmap='' origin foo"
+	 * can be used to tell the command not to store anywhere
+	 */
+	if (*arg)
+		refmap_array[refmap_nr++] = arg;
+	return 0;
+}
+
 static struct option builtin_fetch_options[] = {
 	OPT__VERBOSITY(&verbosity),
 	OPT_BOOL(0, "all", &all,
@@ -107,6 +122,8 @@
 		   N_("default mode for recursion"), PARSE_OPT_HIDDEN },
 	OPT_BOOL(0, "update-shallow", &update_shallow,
 		 N_("accept refs that update .git/shallow")),
+	{ OPTION_CALLBACK, 0, "refmap", NULL, N_("refmap"),
+	  N_("specify fetch refmap"), PARSE_OPT_NONEG, parse_refmap_arg },
 	OPT_END()
 };
 
@@ -278,6 +295,9 @@
 	const struct ref *remote_refs = transport_get_remote_refs(transport);
 
 	if (refspec_count) {
+		struct refspec *fetch_refspec;
+		int fetch_refspec_nr;
+
 		for (i = 0; i < refspec_count; i++) {
 			get_fetch_map(remote_refs, &refspecs[i], &tail, 0);
 			if (refspecs[i].dst && refspecs[i].dst[0])
@@ -307,12 +327,21 @@
 		 * by ref_remove_duplicates() in favor of one of these
 		 * opportunistic entries with FETCH_HEAD_IGNORE.
 		 */
-		for (i = 0; i < transport->remote->fetch_refspec_nr; i++)
-			get_fetch_map(ref_map, &transport->remote->fetch[i],
-				      &oref_tail, 1);
+		if (refmap_array) {
+			fetch_refspec = parse_fetch_refspec(refmap_nr, refmap_array);
+			fetch_refspec_nr = refmap_nr;
+		} else {
+			fetch_refspec = transport->remote->fetch;
+			fetch_refspec_nr = transport->remote->fetch_refspec_nr;
+		}
+
+		for (i = 0; i < fetch_refspec_nr; i++)
+			get_fetch_map(ref_map, &fetch_refspec[i], &oref_tail, 1);
 
 		if (tags == TAGS_SET)
 			get_fetch_map(remote_refs, tag_refspec, &tail, 0);
+	} else if (refmap_array) {
+		die("--refmap option is only meaningful with command-line refspec(s).");
 	} else {
 		/* Use the defaults */
 		struct remote *remote = transport->remote;
@@ -375,23 +404,37 @@
 {
 	char msg[1024];
 	char *rla = getenv("GIT_REFLOG_ACTION");
-	static struct ref_lock *lock;
+	struct ref_transaction *transaction;
+	struct strbuf err = STRBUF_INIT;
+	int ret, df_conflict = 0;
 
 	if (dry_run)
 		return 0;
 	if (!rla)
 		rla = default_rla.buf;
 	snprintf(msg, sizeof(msg), "%s: %s", rla, action);
-	lock = lock_any_ref_for_update(ref->name,
-				       check_old ? ref->old_sha1 : NULL,
-				       0, NULL);
-	if (!lock)
-		return errno == ENOTDIR ? STORE_REF_ERROR_DF_CONFLICT :
-					  STORE_REF_ERROR_OTHER;
-	if (write_ref_sha1(lock, ref->new_sha1, msg) < 0)
-		return errno == ENOTDIR ? STORE_REF_ERROR_DF_CONFLICT :
-					  STORE_REF_ERROR_OTHER;
+
+	transaction = ref_transaction_begin(&err);
+	if (!transaction ||
+	    ref_transaction_update(transaction, ref->name, ref->new_sha1,
+				   ref->old_sha1, 0, check_old, msg, &err))
+		goto fail;
+
+	ret = ref_transaction_commit(transaction, &err);
+	if (ret) {
+		df_conflict = (ret == TRANSACTION_NAME_CONFLICT);
+		goto fail;
+	}
+
+	ref_transaction_free(transaction);
+	strbuf_release(&err);
 	return 0;
+fail:
+	ref_transaction_free(transaction);
+	error("%s", err.buf);
+	strbuf_release(&err);
+	return df_conflict ? STORE_REF_ERROR_DF_CONFLICT
+			   : STORE_REF_ERROR_OTHER;
 }
 
 #define REFCOL_WIDTH  10
@@ -1053,16 +1096,11 @@
 		refs = xcalloc(argc + 1, sizeof(const char *));
 		for (i = 0; i < argc; i++) {
 			if (!strcmp(argv[i], "tag")) {
-				char *ref;
 				i++;
 				if (i >= argc)
 					die(_("You need to specify a tag name."));
-				ref = xmalloc(strlen(argv[i]) * 2 + 22);
-				strcpy(ref, "refs/tags/");
-				strcat(ref, argv[i]);
-				strcat(ref, ":refs/tags/");
-				strcat(ref, argv[i]);
-				refs[j++] = ref;
+				refs[j++] = xstrfmt("refs/tags/%s:refs/tags/%s",
+						    argv[i], argv[i]);
 			} else
 				refs[j++] = argv[i];
 		}
@@ -1086,9 +1124,7 @@
 	struct string_list list = STRING_LIST_INIT_NODUP;
 	struct remote *remote;
 	int result = 0;
-	static const char *argv_gc_auto[] = {
-		"gc", "--auto", NULL,
-	};
+	struct argv_array argv_gc_auto = ARGV_ARRAY_INIT;
 
 	packet_trace_identity("fetch");
 
@@ -1174,7 +1210,11 @@
 	list.strdup_strings = 1;
 	string_list_clear(&list, 0);
 
-	run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
+	argv_array_pushl(&argv_gc_auto, "gc", "--auto", NULL);
+	if (verbosity < 0)
+		argv_array_push(&argv_gc_auto, "--quiet");
+	run_command_v_opt(argv_gc_auto.argv, RUN_GIT_CMD);
+	argv_array_clear(&argv_gc_auto);
 
 	return result;
 }
diff --git a/builtin/fmt-merge-msg.c b/builtin/fmt-merge-msg.c
index ef8b254..37177c6 100644
--- a/builtin/fmt-merge-msg.c
+++ b/builtin/fmt-merge-msg.c
@@ -100,7 +100,8 @@
 {
 	int i, len = strlen(line);
 	struct origin_data *origin_data;
-	char *src, *origin;
+	char *src;
+	const char *origin;
 	struct src_data *src_data;
 	struct string_list_item *item;
 	int pulling_head = 0;
@@ -164,8 +165,7 @@
 		origin = line;
 		string_list_append(&src_data->tag, origin + 4);
 		src_data->head_status |= 2;
-	} else if (starts_with(line, "remote-tracking branch ")) {
-		origin = line + strlen("remote-tracking branch ");
+	} else if (skip_prefix(line, "remote-tracking branch ", &origin)) {
 		string_list_append(&src_data->r_branch, origin);
 		src_data->head_status |= 2;
 	} else {
@@ -178,11 +178,8 @@
 		int len = strlen(origin);
 		if (origin[0] == '\'' && origin[len - 1] == '\'')
 			origin = xmemdupz(origin + 1, len - 2);
-	} else {
-		char *new_origin = xmalloc(strlen(origin) + strlen(src) + 5);
-		sprintf(new_origin, "%s of %s", origin, src);
-		origin = new_origin;
-	}
+	} else
+		origin = xstrfmt("%s of %s", origin, src);
 	if (strcmp(".", src))
 		origin_data->is_local_branch = 0;
 	string_list_append(&origins, origin)->util = origin_data;
@@ -300,8 +297,8 @@
 	if (!them->nr ||
 	    (them->nr == 1 &&
 	     me &&
-	     (me = skip_prefix(me, them->items->string)) != NULL &&
-	     skip_prefix(me, " <")))
+	     skip_prefix(me, them->items->string, &me) &&
+	     starts_with(me, " <")))
 		return;
 	strbuf_addf(out, "\n%c %s ", comment_line_char, label);
 	add_people_count(out, them);
@@ -605,7 +602,7 @@
 
 	/* get current branch */
 	current_branch = current_branch_to_free =
-		resolve_refdup("HEAD", head_sha1, 1, NULL);
+		resolve_refdup("HEAD", RESOLVE_REF_READING, head_sha1, NULL);
 	if (!current_branch)
 		die("No current branch");
 	if (starts_with(current_branch, "refs/heads/"))
diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index 3e1d5c3..603a90e 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -138,10 +138,8 @@
 	/* Add it in, including the deref prefix */
 	at = used_atom_cnt;
 	used_atom_cnt++;
-	used_atom = xrealloc(used_atom,
-			     (sizeof *used_atom) * used_atom_cnt);
-	used_atom_type = xrealloc(used_atom_type,
-				  (sizeof(*used_atom_type) * used_atom_cnt));
+	REALLOC_ARRAY(used_atom, used_atom_cnt);
+	REALLOC_ARRAY(used_atom_type, used_atom_cnt);
 	used_atom[at] = xmemdupz(atom, ep - atom);
 	used_atom_type[at] = valid_atom[i].cmp_type;
 	if (*atom == '*')
@@ -193,7 +191,7 @@
 		at = parse_atom(sp + 2, ep);
 		cp = ep + 1;
 
-		if (!memcmp(used_atom[at], "color:", 6))
+		if (starts_with(used_atom[at], "color:"))
 			need_color_reset_at_eol = !!strcmp(used_atom[at], color_reset);
 	}
 	return 0;
@@ -283,18 +281,6 @@
 	}
 }
 
-static int num_parents(struct commit *commit)
-{
-	struct commit_list *parents;
-	int i;
-
-	for (i = 0, parents = commit->parents;
-	     parents;
-	     parents = parents->next)
-		i++;
-	return i;
-}
-
 /* See grab_values */
 static void grab_commit_values(struct atom_value *val, int deref, struct object *obj, void *buf, unsigned long sz)
 {
@@ -315,12 +301,12 @@
 		}
 		if (!strcmp(name, "numparent")) {
 			char *s = xmalloc(40);
-			v->ul = num_parents(commit);
+			v->ul = commit_list_count(commit->parents);
 			sprintf(s, "%lu", v->ul);
 			v->s = s;
 		}
 		else if (!strcmp(name, "parent")) {
-			int num = num_parents(commit);
+			int num = commit_list_count(commit->parents);
 			int i;
 			struct commit_list *parents;
 			char *s = xmalloc(41 * num + 1);
@@ -645,11 +631,12 @@
 	unsigned long size;
 	const unsigned char *tagged;
 
-	ref->value = xcalloc(sizeof(struct atom_value), used_atom_cnt);
+	ref->value = xcalloc(used_atom_cnt, sizeof(struct atom_value));
 
 	if (need_symref && (ref->flag & REF_ISSYMREF) && !ref->symref) {
 		unsigned char unused1[20];
-		ref->symref = resolve_refdup(ref->refname, unused1, 1, NULL);
+		ref->symref = resolve_refdup(ref->refname, RESOLVE_REF_READING,
+					     unused1, NULL);
 		if (!ref->symref)
 			ref->symref = "";
 	}
@@ -685,7 +672,8 @@
 		} else if (starts_with(name, "color:")) {
 			char color[COLOR_MAXLEN] = "";
 
-			color_parse(name + 6, "--format", color);
+			if (color_parse(name + 6, color) < 0)
+				die(_("unable to parse format"));
 			v->s = xstrdup(color);
 			continue;
 		} else if (!strcmp(name, "flag")) {
@@ -707,7 +695,8 @@
 			const char *head;
 			unsigned char sha1[20];
 
-			head = resolve_ref_unsafe("HEAD", sha1, 1, NULL);
+			head = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
+						  sha1, NULL);
 			if (!strcmp(ref->refname, head))
 				v->s = "*";
 			else
@@ -851,6 +840,11 @@
 	struct refinfo *ref;
 	int cnt;
 
+	if (flag & REF_BAD_NAME) {
+		  warning("ignoring ref with broken name %s", refname);
+		  return 0;
+	}
+
 	if (*cb->grab_pattern) {
 		const char **pattern;
 		int namelen = strlen(refname);
@@ -882,8 +876,7 @@
 	ref->flag = flag;
 
 	cnt = cb->grab_cnt;
-	cb->grab_array = xrealloc(cb->grab_array,
-				  sizeof(*cb->grab_array) * (cnt + 1));
+	REALLOC_ARRAY(cb->grab_array, cnt + 1);
 	cb->grab_array[cnt++] = ref;
 	cb->grab_cnt = cnt;
 	return 0;
@@ -1019,7 +1012,8 @@
 		struct atom_value resetv;
 		char color[COLOR_MAXLEN] = "";
 
-		color_parse("reset", "--format", color);
+		if (color_parse("reset", color) < 0)
+			die("BUG: couldn't parse 'reset' as a color");
 		resetv.s = color;
 		print_value(&resetv, quote_style);
 	}
diff --git a/builtin/fsck.c b/builtin/fsck.c
index 8aadca1..a27515a 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -298,7 +298,7 @@
 
 	if (fsck_walk(obj, mark_used, NULL))
 		objerror(obj, "broken links");
-	if (fsck_object(obj, check_strict, fsck_error_func))
+	if (fsck_object(obj, NULL, 0, check_strict, fsck_error_func))
 		return -1;
 
 	if (obj->type == OBJ_TREE) {
@@ -388,7 +388,8 @@
 		unsigned char *sha1 = entry->sha1;
 
 		sha1_list.entry[i] = NULL;
-		fsck_sha1(sha1);
+		if (fsck_sha1(sha1))
+			errors_found |= ERROR_OBJECT;
 		free(entry);
 	}
 	sha1_list.nr = 0;
@@ -481,11 +482,6 @@
 	return 0;
 }
 
-static int is_branch(const char *refname)
-{
-	return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
-}
-
 static int fsck_handle_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
 {
 	struct object *obj;
@@ -493,6 +489,7 @@
 	obj = parse_object(sha1);
 	if (!obj) {
 		error("%s: invalid sha1 pointer %s", refname, sha1_to_hex(sha1));
+		errors_found |= ERROR_REACHABLE;
 		/* We'll continue with the rest despite the error.. */
 		return 0;
 	}
@@ -509,7 +506,7 @@
 {
 	if (head_points_at && !is_null_sha1(head_sha1))
 		fsck_handle_ref("HEAD", head_sha1, 0, NULL);
-	for_each_ref(fsck_handle_ref, NULL);
+	for_each_rawref(fsck_handle_ref, NULL);
 	if (include_reflogs)
 		for_each_reflog(fsck_handle_reflog, NULL);
 
@@ -559,7 +556,7 @@
 	if (verbose)
 		fprintf(stderr, "Checking HEAD link\n");
 
-	head_points_at = resolve_ref_unsafe("HEAD", head_sha1, 0, &flag);
+	head_points_at = resolve_ref_unsafe("HEAD", 0, head_sha1, &flag);
 	if (!head_points_at)
 		return error("Invalid HEAD");
 	if (!strcmp(head_points_at, "HEAD"))
diff --git a/builtin/gc.c b/builtin/gc.c
index 8d219d8..005adbe 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -11,7 +11,7 @@
  */
 
 #include "builtin.h"
-#include "cache.h"
+#include "lockfile.h"
 #include "parse-options.h"
 #include "run-command.h"
 #include "sigchain.h"
@@ -55,44 +55,33 @@
 	raise(signo);
 }
 
-static int gc_config(const char *var, const char *value, void *cb)
+static void gc_config(void)
 {
-	if (!strcmp(var, "gc.packrefs")) {
+	const char *value;
+
+	if (!git_config_get_value("gc.packrefs", &value)) {
 		if (value && !strcmp(value, "notbare"))
 			pack_refs = -1;
 		else
-			pack_refs = git_config_bool(var, value);
-		return 0;
+			pack_refs = git_config_bool("gc.packrefs", value);
 	}
-	if (!strcmp(var, "gc.aggressivewindow")) {
-		aggressive_window = git_config_int(var, value);
-		return 0;
-	}
-	if (!strcmp(var, "gc.aggressivedepth")) {
-		aggressive_depth = git_config_int(var, value);
-		return 0;
-	}
-	if (!strcmp(var, "gc.auto")) {
-		gc_auto_threshold = git_config_int(var, value);
-		return 0;
-	}
-	if (!strcmp(var, "gc.autopacklimit")) {
-		gc_auto_pack_limit = git_config_int(var, value);
-		return 0;
-	}
-	if (!strcmp(var, "gc.autodetach")) {
-		detach_auto = git_config_bool(var, value);
-		return 0;
-	}
-	if (!strcmp(var, "gc.pruneexpire")) {
-		if (value && strcmp(value, "now")) {
+
+	git_config_get_int("gc.aggressivewindow", &aggressive_window);
+	git_config_get_int("gc.aggressivedepth", &aggressive_depth);
+	git_config_get_int("gc.auto", &gc_auto_threshold);
+	git_config_get_int("gc.autopacklimit", &gc_auto_pack_limit);
+	git_config_get_bool("gc.autodetach", &detach_auto);
+
+	if (!git_config_get_string_const("gc.pruneexpire", &prune_expire)) {
+		if (strcmp(prune_expire, "now")) {
 			unsigned long now = approxidate("now");
-			if (approxidate(value) >= now)
-				return error(_("Invalid %s: '%s'"), var, value);
+			if (approxidate(prune_expire) >= now) {
+				git_die_config("gc.pruneexpire", _("Invalid gc.pruneexpire: '%s'"),
+						prune_expire);
+			}
 		}
-		return git_config_string(&prune_expire, var, value);
 	}
-	return git_default_config(var, value, cb);
+	git_config(git_default_config, NULL);
 }
 
 static int too_many_loose_objects(void)
@@ -301,7 +290,7 @@
 	argv_array_pushl(&prune, "prune", "--expire", NULL );
 	argv_array_pushl(&rerere, "rerere", "gc", NULL);
 
-	git_config(gc_config, NULL);
+	gc_config();
 
 	if (pack_refs < 0)
 		pack_refs = !is_bare_repository();
diff --git a/builtin/get-tar-commit-id.c b/builtin/get-tar-commit-id.c
index aa72596..6f4147a 100644
--- a/builtin/get-tar-commit-id.c
+++ b/builtin/get-tar-commit-id.c
@@ -19,6 +19,7 @@
 	char buffer[HEADERSIZE];
 	struct ustar_header *header = (struct ustar_header *)buffer;
 	char *content = buffer + RECORDSIZE;
+	const char *comment;
 	ssize_t n;
 
 	if (argc != 1)
@@ -29,10 +30,10 @@
 		die("git get-tar-commit-id: read error");
 	if (header->typeflag[0] != 'g')
 		return 1;
-	if (memcmp(content, "52 comment=", 11))
+	if (!skip_prefix(content, "52 comment=", &comment))
 		return 1;
 
-	n = write_in_full(1, content + 11, 41);
+	n = write_in_full(1, comment, 41);
 	if (n < 41)
 		die_errno("git get-tar-commit-id: write error");
 
diff --git a/builtin/grep.c b/builtin/grep.c
index b8d440d..4063882 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -361,9 +361,7 @@
 		argv[i] = path_list->items[i].string;
 	argv[path_list->nr] = NULL;
 
-	if (prefix && chdir(prefix))
-		die(_("Failed to chdir: %s"), prefix);
-	status = run_command_v_opt(argv, RUN_USING_SHELL);
+	status = run_command_v_opt_cd_env(argv, RUN_USING_SHELL, prefix, NULL);
 	if (status)
 		exit(status);
 	free(argv);
@@ -458,10 +456,10 @@
 }
 
 static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec,
-		       struct object *obj, const char *name, struct object_context *oc)
+		       struct object *obj, const char *name, const char *path)
 {
 	if (obj->type == OBJ_BLOB)
-		return grep_sha1(opt, obj->sha1, name, 0, oc ? oc->path : NULL);
+		return grep_sha1(opt, obj->sha1, name, 0, path);
 	if (obj->type == OBJ_COMMIT || obj->type == OBJ_TREE) {
 		struct tree_desc tree;
 		void *data;
@@ -503,7 +501,7 @@
 	for (i = 0; i < nr; i++) {
 		struct object *real_obj;
 		real_obj = deref_tag(list->objects[i].item, NULL, 0);
-		if (grep_object(opt, pathspec, real_obj, list->objects[i].name, list->objects[i].context)) {
+		if (grep_object(opt, pathspec, real_obj, list->objects[i].name, list->objects[i].path)) {
 			hit = 1;
 			if (opt->status_only)
 				break;
@@ -823,7 +821,7 @@
 			struct object *object = parse_object_or_die(sha1, arg);
 			if (!seen_dashdash)
 				verify_non_filename(prefix, arg);
-			add_object_array_with_context(object, arg, &list, xmemdupz(&oc, sizeof(struct object_context)));
+			add_object_array_with_path(object, arg, &list, oc.mode, oc.path);
 			continue;
 		}
 		if (!strcmp(arg, "--")) {
diff --git a/builtin/hash-object.c b/builtin/hash-object.c
index d7fcf4c..6158363 100644
--- a/builtin/hash-object.c
+++ b/builtin/hash-object.c
@@ -10,35 +10,55 @@
 #include "parse-options.h"
 #include "exec_cmd.h"
 
-static void hash_fd(int fd, const char *type, int write_object, const char *path)
+/*
+ * This is to create corrupt objects for debugging and as such it
+ * needs to bypass the data conversion performed by, and the type
+ * limitation imposed by, index_fd() and its callees.
+ */
+static int hash_literally(unsigned char *sha1, int fd, const char *type, unsigned flags)
+{
+	struct strbuf buf = STRBUF_INIT;
+	int ret;
+
+	if (strbuf_read(&buf, fd, 4096) < 0)
+		ret = -1;
+	else if (flags & HASH_WRITE_OBJECT)
+		ret = write_sha1_file(buf.buf, buf.len, type, sha1);
+	else
+		ret = hash_sha1_file(buf.buf, buf.len, type, sha1);
+	strbuf_release(&buf);
+	return ret;
+}
+
+static void hash_fd(int fd, const char *type, const char *path, unsigned flags,
+		    int literally)
 {
 	struct stat st;
 	unsigned char sha1[20];
-	unsigned flags = (HASH_FORMAT_CHECK |
-			  (write_object ? HASH_WRITE_OBJECT : 0));
 
 	if (fstat(fd, &st) < 0 ||
-	    index_fd(sha1, fd, &st, type_from_string(type), path, flags))
-		die(write_object
+	    (literally
+	     ? hash_literally(sha1, fd, type, flags)
+	     : index_fd(sha1, fd, &st, type_from_string(type), path, flags)))
+		die((flags & HASH_WRITE_OBJECT)
 		    ? "Unable to add %s to database"
 		    : "Unable to hash %s", path);
 	printf("%s\n", sha1_to_hex(sha1));
 	maybe_flush_or_die(stdout, "hash to stdout");
 }
 
-static void hash_object(const char *path, const char *type, int write_object,
-			const char *vpath)
+static void hash_object(const char *path, const char *type, const char *vpath,
+			unsigned flags, int literally)
 {
 	int fd;
 	fd = open(path, O_RDONLY);
 	if (fd < 0)
 		die_errno("Cannot open '%s'", path);
-	hash_fd(fd, type, write_object, vpath);
+	hash_fd(fd, type, vpath, flags, literally);
 }
 
-static int no_filters;
-
-static void hash_stdin_paths(const char *type, int write_objects)
+static void hash_stdin_paths(const char *type, int no_filters, unsigned flags,
+			     int literally)
 {
 	struct strbuf buf = STRBUF_INIT, nbuf = STRBUF_INIT;
 
@@ -49,47 +69,46 @@
 				die("line is badly quoted");
 			strbuf_swap(&buf, &nbuf);
 		}
-		hash_object(buf.buf, type, write_objects,
-		    no_filters ? NULL : buf.buf);
+		hash_object(buf.buf, type, no_filters ? NULL : buf.buf, flags,
+			    literally);
 	}
 	strbuf_release(&buf);
 	strbuf_release(&nbuf);
 }
 
-static const char * const hash_object_usage[] = {
-	N_("git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] <file>..."),
-	N_("git hash-object  --stdin-paths < <list-of-paths>"),
-	NULL
-};
-
-static const char *type;
-static int write_object;
-static int hashstdin;
-static int stdin_paths;
-static const char *vpath;
-
-static const struct option hash_object_options[] = {
-	OPT_STRING('t', NULL, &type, N_("type"), N_("object type")),
-	OPT_BOOL('w', NULL, &write_object, N_("write the object into the object database")),
-	OPT_COUNTUP( 0 , "stdin", &hashstdin, N_("read the object from stdin")),
-	OPT_BOOL( 0 , "stdin-paths", &stdin_paths, N_("read file names from stdin")),
-	OPT_BOOL( 0 , "no-filters", &no_filters, N_("store file as is without filters")),
-	OPT_STRING( 0 , "path", &vpath, N_("file"), N_("process file as it were from this path")),
-	OPT_END()
-};
-
 int cmd_hash_object(int argc, const char **argv, const char *prefix)
 {
+	static const char * const hash_object_usage[] = {
+		N_("git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] <file>..."),
+		N_("git hash-object  --stdin-paths < <list-of-paths>"),
+		NULL
+	};
+	const char *type = blob_type;
+	int hashstdin = 0;
+	int stdin_paths = 0;
+	int no_filters = 0;
+	int literally = 0;
+	unsigned flags = HASH_FORMAT_CHECK;
+	const char *vpath = NULL;
+	const struct option hash_object_options[] = {
+		OPT_STRING('t', NULL, &type, N_("type"), N_("object type")),
+		OPT_BIT('w', NULL, &flags, N_("write the object into the object database"),
+			HASH_WRITE_OBJECT),
+		OPT_COUNTUP( 0 , "stdin", &hashstdin, N_("read the object from stdin")),
+		OPT_BOOL( 0 , "stdin-paths", &stdin_paths, N_("read file names from stdin")),
+		OPT_BOOL( 0 , "no-filters", &no_filters, N_("store file as is without filters")),
+		OPT_BOOL( 0, "literally", &literally, N_("just hash any random garbage to create corrupt objects for debugging Git")),
+		OPT_STRING( 0 , "path", &vpath, N_("file"), N_("process file as it were from this path")),
+		OPT_END()
+	};
 	int i;
 	int prefix_length = -1;
 	const char *errstr = NULL;
 
-	type = blob_type;
-
 	argc = parse_options(argc, argv, NULL, hash_object_options,
 			     hash_object_usage, 0);
 
-	if (write_object) {
+	if (flags & HASH_WRITE_OBJECT) {
 		prefix = setup_git_directory();
 		prefix_length = prefix ? strlen(prefix) : 0;
 		if (vpath && prefix)
@@ -119,19 +138,19 @@
 	}
 
 	if (hashstdin)
-		hash_fd(0, type, write_object, vpath);
+		hash_fd(0, type, vpath, flags, literally);
 
 	for (i = 0 ; i < argc; i++) {
 		const char *arg = argv[i];
 
 		if (0 <= prefix_length)
 			arg = prefix_filename(prefix, prefix_length, arg);
-		hash_object(arg, type, write_object,
-			    no_filters ? NULL : vpath ? vpath : arg);
+		hash_object(arg, type, no_filters ? NULL : vpath ? vpath : arg,
+			    flags, literally);
 	}
 
 	if (stdin_paths)
-		hash_stdin_paths(type, write_object);
+		hash_stdin_paths(type, no_filters, flags, literally);
 
 	return 0;
 }
diff --git a/builtin/help.c b/builtin/help.c
index 1fdefeb..b3c818e 100644
--- a/builtin/help.c
+++ b/builtin/help.c
@@ -79,12 +79,11 @@
 static int check_emacsclient_version(void)
 {
 	struct strbuf buffer = STRBUF_INIT;
-	struct child_process ec_process;
+	struct child_process ec_process = CHILD_PROCESS_INIT;
 	const char *argv_ec[] = { "emacsclient", "--version", NULL };
 	int version;
 
 	/* emacsclient prints its version number on stderr */
-	memset(&ec_process, 0, sizeof(ec_process));
 	ec_process.argv = argv_ec;
 	ec_process.err = -1;
 	ec_process.stdout_to_stderr = 1;
@@ -422,6 +421,7 @@
 	const char *help;
 } common_guides[] = {
 	{ "attributes", N_("Defining attributes per path") },
+	{ "everyday", N_("Everyday Git With 20 Commands Or So") },
 	{ "glossary", N_("A Git glossary") },
 	{ "ignore", N_("Specifies intentionally untracked files to ignore") },
 	{ "modules", N_("Defining submodule properties") },
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index 9ca0203..a369f55 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -112,6 +112,10 @@
 #define deepest_delta_lock()	lock_mutex(&deepest_delta_mutex)
 #define deepest_delta_unlock()	unlock_mutex(&deepest_delta_mutex)
 
+static pthread_mutex_t type_cas_mutex;
+#define type_cas_lock()		lock_mutex(&type_cas_mutex)
+#define type_cas_unlock()	unlock_mutex(&type_cas_mutex)
+
 static pthread_key_t key;
 
 static inline void lock_mutex(pthread_mutex_t *mutex)
@@ -135,6 +139,7 @@
 	init_recursive_mutex(&read_mutex);
 	pthread_mutex_init(&counter_mutex, NULL);
 	pthread_mutex_init(&work_mutex, NULL);
+	pthread_mutex_init(&type_cas_mutex, NULL);
 	if (show_stat)
 		pthread_mutex_init(&deepest_delta_mutex, NULL);
 	pthread_key_create(&key, NULL);
@@ -157,6 +162,7 @@
 	pthread_mutex_destroy(&read_mutex);
 	pthread_mutex_destroy(&counter_mutex);
 	pthread_mutex_destroy(&work_mutex);
+	pthread_mutex_destroy(&type_cas_mutex);
 	if (show_stat)
 		pthread_mutex_destroy(&deepest_delta_mutex);
 	for (i = 0; i < nr_threads; i++)
@@ -179,6 +185,9 @@
 #define deepest_delta_lock()
 #define deepest_delta_unlock()
 
+#define type_cas_lock()
+#define type_cas_unlock()
+
 #endif
 
 
@@ -773,7 +782,8 @@
 			if (!obj)
 				die(_("invalid %s"), typename(type));
 			if (do_fsck_object &&
-			    fsck_object(obj, 1, fsck_error_function))
+			    fsck_object(obj, buf, size, 1,
+				    fsck_error_function))
 				die(_("Error in object"));
 			if (fsck_walk(obj, mark_link, NULL))
 				die(_("Not all child objects of %s are reachable"), sha1_to_hex(obj->sha1));
@@ -862,7 +872,6 @@
 {
 	void *base_data, *delta_data;
 
-	delta_obj->real_type = base->obj->real_type;
 	if (show_stat) {
 		delta_obj->delta_depth = base->obj->delta_depth + 1;
 		deepest_delta_lock();
@@ -888,6 +897,26 @@
 	counter_unlock();
 }
 
+/*
+ * Standard boolean compare-and-swap: atomically check whether "*type" is
+ * "want"; if so, swap in "set" and return true. Otherwise, leave it untouched
+ * and return false.
+ */
+static int compare_and_swap_type(enum object_type *type,
+				 enum object_type want,
+				 enum object_type set)
+{
+	enum object_type old;
+
+	type_cas_lock();
+	old = *type;
+	if (old == want)
+		*type = set;
+	type_cas_unlock();
+
+	return old == want;
+}
+
 static struct base_data *find_unresolved_deltas_1(struct base_data *base,
 						  struct base_data *prev_base)
 {
@@ -915,7 +944,10 @@
 		struct object_entry *child = objects + deltas[base->ref_first].obj_no;
 		struct base_data *result = alloc_base_data();
 
-		assert(child->real_type == OBJ_REF_DELTA);
+		if (!compare_and_swap_type(&child->real_type, OBJ_REF_DELTA,
+					   base->obj->real_type))
+			die("BUG: child->real_type != OBJ_REF_DELTA");
+
 		resolve_delta(child, base, result);
 		if (base->ref_first == base->ref_last && base->ofs_last == -1)
 			free_base_data(base);
@@ -929,6 +961,7 @@
 		struct base_data *result = alloc_base_data();
 
 		assert(child->real_type == OBJ_OFS_DELTA);
+		child->real_type = base->obj->real_type;
 		resolve_delta(child, base, result);
 		if (base->ofs_first == base->ofs_last)
 			free_base_data(base);
@@ -1140,9 +1173,7 @@
 		int nr_objects_initial = nr_objects;
 		if (nr_unresolved <= 0)
 			die(_("confusion beyond insanity"));
-		objects = xrealloc(objects,
-				   (nr_objects + nr_unresolved + 1)
-				   * sizeof(*objects));
+		REALLOC_ARRAY(objects, nr_objects + nr_unresolved + 1);
 		memset(objects + nr_objects + 1, 0,
 		       nr_unresolved * sizeof(*objects));
 		f = sha1fd(output_fd, curr_pack);
@@ -1505,7 +1536,8 @@
 	const char *curr_index;
 	const char *index_name = NULL, *pack_name = NULL;
 	const char *keep_name = NULL, *keep_msg = NULL;
-	char *index_name_buf = NULL, *keep_name_buf = NULL;
+	struct strbuf index_name_buf = STRBUF_INIT,
+		      keep_name_buf = STRBUF_INIT;
 	struct pack_idx_entry **idx_objects;
 	struct pack_idx_option opts;
 	unsigned char pack_sha1[20];
@@ -1602,24 +1634,22 @@
 	if (fix_thin_pack && !from_stdin)
 		die(_("--fix-thin cannot be used without --stdin"));
 	if (!index_name && pack_name) {
-		int len = strlen(pack_name);
-		if (!has_extension(pack_name, ".pack"))
+		size_t len;
+		if (!strip_suffix(pack_name, ".pack", &len))
 			die(_("packfile name '%s' does not end with '.pack'"),
 			    pack_name);
-		index_name_buf = xmalloc(len);
-		memcpy(index_name_buf, pack_name, len - 5);
-		strcpy(index_name_buf + len - 5, ".idx");
-		index_name = index_name_buf;
+		strbuf_add(&index_name_buf, pack_name, len);
+		strbuf_addstr(&index_name_buf, ".idx");
+		index_name = index_name_buf.buf;
 	}
 	if (keep_msg && !keep_name && pack_name) {
-		int len = strlen(pack_name);
-		if (!has_extension(pack_name, ".pack"))
+		size_t len;
+		if (!strip_suffix(pack_name, ".pack", &len))
 			die(_("packfile name '%s' does not end with '.pack'"),
 			    pack_name);
-		keep_name_buf = xmalloc(len);
-		memcpy(keep_name_buf, pack_name, len - 5);
-		strcpy(keep_name_buf + len - 5, ".keep");
-		keep_name = keep_name_buf;
+		strbuf_add(&keep_name_buf, pack_name, len);
+		strbuf_addstr(&keep_name_buf, ".idx");
+		keep_name = keep_name_buf.buf;
 	}
 	if (verify) {
 		if (!index_name)
@@ -1667,8 +1697,8 @@
 	else
 		close(input_fd);
 	free(objects);
-	free(index_name_buf);
-	free(keep_name_buf);
+	strbuf_release(&index_name_buf);
+	strbuf_release(&keep_name_buf);
 	if (pack_name == NULL)
 		free((void *) curr_pack);
 	if (index_name == NULL)
diff --git a/builtin/init-db.c b/builtin/init-db.c
index 56f85e2..587a505 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -330,12 +330,12 @@
 		 * moving the target repo later on in separate_git_dir()
 		 */
 		git_link = xstrdup(real_path(git_dir));
+		set_git_dir(real_path(real_git_dir));
 	}
 	else {
-		real_git_dir = real_path(git_dir);
+		set_git_dir(real_path(git_dir));
 		git_link = NULL;
 	}
-	set_git_dir(real_path(real_git_dir));
 	return 0;
 }
 
@@ -426,8 +426,9 @@
 
 static int guess_repository_type(const char *git_dir)
 {
-	char cwd[PATH_MAX];
 	const char *slash;
+	char *cwd;
+	int cwd_is_git_dir;
 
 	/*
 	 * "GIT_DIR=. git init" is always bare.
@@ -435,9 +436,10 @@
 	 */
 	if (!strcmp(".", git_dir))
 		return 1;
-	if (!getcwd(cwd, sizeof(cwd)))
-		die_errno(_("cannot tell cwd"));
-	if (!strcmp(git_dir, cwd))
+	cwd = xgetcwd();
+	cwd_is_git_dir = !strcmp(git_dir, cwd);
+	free(cwd);
+	if (cwd_is_git_dir)
 		return 1;
 	/*
 	 * "GIT_DIR=.git or GIT_DIR=something/.git is usually not.
@@ -535,10 +537,9 @@
 		usage(init_db_usage[0]);
 	}
 	if (is_bare_repository_cfg == 1) {
-		static char git_dir[PATH_MAX+1];
-
-		setenv(GIT_DIR_ENVIRONMENT,
-			getcwd(git_dir, sizeof(git_dir)), argc > 0);
+		char *cwd = xgetcwd();
+		setenv(GIT_DIR_ENVIRONMENT, cwd, argc > 0);
+		free(cwd);
 	}
 
 	if (init_shared_repository != -1)
@@ -572,13 +573,10 @@
 			git_work_tree_cfg = xstrdup(real_path(rel));
 			free(rel);
 		}
-		if (!git_work_tree_cfg) {
-			git_work_tree_cfg = xcalloc(PATH_MAX, 1);
-			if (!getcwd(git_work_tree_cfg, PATH_MAX))
-				die_errno (_("Cannot access current working directory"));
-		}
+		if (!git_work_tree_cfg)
+			git_work_tree_cfg = xgetcwd();
 		if (work_tree)
-			set_git_work_tree(real_path(work_tree));
+			set_git_work_tree(work_tree);
 		else
 			set_git_work_tree(git_work_tree_cfg);
 		if (access(get_git_work_tree(), X_OK))
@@ -587,7 +585,7 @@
 	}
 	else {
 		if (work_tree)
-			set_git_work_tree(real_path(work_tree));
+			set_git_work_tree(work_tree);
 	}
 
 	set_git_dir_init(git_dir, real_git_dir, 1);
diff --git a/builtin/interpret-trailers.c b/builtin/interpret-trailers.c
new file mode 100644
index 0000000..46838d2
--- /dev/null
+++ b/builtin/interpret-trailers.c
@@ -0,0 +1,44 @@
+/*
+ * Builtin "git interpret-trailers"
+ *
+ * Copyright (c) 2013, 2014 Christian Couder <chriscool@tuxfamily.org>
+ *
+ */
+
+#include "cache.h"
+#include "builtin.h"
+#include "parse-options.h"
+#include "string-list.h"
+#include "trailer.h"
+
+static const char * const git_interpret_trailers_usage[] = {
+	N_("git interpret-trailers [--trim-empty] [(--trailer <token>[(=|:)<value>])...] [<file>...]"),
+	NULL
+};
+
+int cmd_interpret_trailers(int argc, const char **argv, const char *prefix)
+{
+	int trim_empty = 0;
+	struct string_list trailers = STRING_LIST_INIT_DUP;
+
+	struct option options[] = {
+		OPT_BOOL(0, "trim-empty", &trim_empty, N_("trim empty trailers")),
+		OPT_STRING_LIST(0, "trailer", &trailers, N_("trailer"),
+				N_("trailer(s) to add")),
+		OPT_END()
+	};
+
+	argc = parse_options(argc, argv, prefix, options,
+			     git_interpret_trailers_usage, 0);
+
+	if (argc) {
+		int i;
+		for (i = 0; i < argc; i++)
+			process_trailers(argv[i], trim_empty, &trailers);
+	} else
+		process_trailers(NULL, trim_empty, &trailers);
+
+	string_list_clear(&trailers, 0);
+
+	return 0;
+}
diff --git a/builtin/log.c b/builtin/log.c
index 4f67813..734aab3 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -63,6 +63,8 @@
 		return DECORATE_FULL_REFS;
 	else if (!strcmp(value, "short"))
 		return DECORATE_SHORT_REFS;
+	else if (!strcmp(value, "auto"))
+		return (isatty(1) || pager_in_use()) ? DECORATE_SHORT_REFS : 0;
 	return -1;
 }
 
@@ -76,7 +78,7 @@
 		decoration_style = DECORATE_SHORT_REFS;
 
 	if (decoration_style < 0)
-		die("invalid --decorate option: %s", arg);
+		die(_("invalid --decorate option: %s"), arg);
 
 	decoration_given = 1;
 
@@ -128,7 +130,7 @@
 		{ OPTION_CALLBACK, 0, "decorate", NULL, NULL, N_("decorate options"),
 		  PARSE_OPT_OPTARG, decorate_callback},
 		OPT_CALLBACK('L', NULL, &line_cb, "n,m:file",
-			     "Process line range n,m in file, counting from 1",
+			     N_("Process line range n,m in file, counting from 1"),
 			     log_line_range_callback),
 		OPT_END()
 	};
@@ -148,7 +150,7 @@
 
 	/* Any arguments at this point are not recognized */
 	if (argc > 1)
-		die("unrecognized argument: %s", argv[1]);
+		die(_("unrecognized argument: %s"), argv[1]);
 
 	memset(&w, 0, sizeof(w));
 	userformat_find_requirements(NULL, &w);
@@ -366,6 +368,8 @@
 
 static int git_log_config(const char *var, const char *value, void *cb)
 {
+	const char *slot_name;
+
 	if (!strcmp(var, "format.pretty"))
 		return git_config_string(&fmt_pretty, var, value);
 	if (!strcmp(var, "format.subjectprefix"))
@@ -386,8 +390,8 @@
 		default_show_root = git_config_bool(var, value);
 		return 0;
 	}
-	if (starts_with(var, "color.decorate."))
-		return parse_decorate_color_config(var, 15, value);
+	if (skip_prefix(var, "color.decorate.", &slot_name))
+		return parse_decorate_color_config(var, slot_name, value);
 	if (!strcmp(var, "log.mailmap")) {
 		use_mailmap_config = git_config_bool(var, value);
 		return 0;
@@ -445,13 +449,13 @@
 		return stream_blob_to_fd(1, sha1, NULL, 0);
 
 	if (get_sha1_with_context(obj_name, 0, sha1c, &obj_context))
-		die("Not a valid object name %s", obj_name);
+		die(_("Not a valid object name %s"), obj_name);
 	if (!obj_context.path[0] ||
 	    !textconv_object(obj_context.path, obj_context.mode, sha1c, 1, &buf, &size))
 		return stream_blob_to_fd(1, sha1, NULL, 0);
 
 	if (!buf)
-		die("git show %s: bad file", obj_name);
+		die(_("git show %s: bad file"), obj_name);
 
 	write_or_die(1, buf, size);
 	return 0;
@@ -668,6 +672,7 @@
 static int thread;
 static int do_signoff;
 static const char *signature = git_version_string;
+static const char *signature_file;
 static int config_cover_letter;
 
 enum {
@@ -737,6 +742,8 @@
 	}
 	if (!strcmp(var, "format.signature"))
 		return git_config_string(&signature, var, value);
+	if (!strcmp(var, "format.signaturefile"))
+		return git_config_pathname(&signature_file, var, value);
 	if (!strcmp(var, "format.coverletter")) {
 		if (value && !strcasecmp(value, "auto")) {
 			config_cover_letter = COVER_AUTO;
@@ -839,8 +846,13 @@
 
 static void print_signature(void)
 {
-	if (signature && *signature)
-		printf("-- \n%s\n\n", signature);
+	if (!signature || !*signature)
+		return;
+
+	printf("-- \n%s", signature);
+	if (signature[strlen(signature)-1] != '\n')
+		putchar('\n');
+	putchar('\n');
 }
 
 static void add_branch_description(struct strbuf *buf, const char *branch_name)
@@ -851,9 +863,10 @@
 	read_branch_desc(&desc, branch_name);
 	if (desc.len) {
 		strbuf_addch(buf, '\n');
-		strbuf_add(buf, desc.buf, desc.len);
+		strbuf_addbuf(buf, &desc);
 		strbuf_addch(buf, '\n');
 	}
+	strbuf_release(&desc);
 }
 
 static char *find_branch_name(struct rev_info *rev)
@@ -861,7 +874,7 @@
 	int i, positive = -1;
 	unsigned char branch_sha1[20];
 	const unsigned char *tip_sha1;
-	const char *ref;
+	const char *ref, *v;
 	char *full_ref, *branch = NULL;
 
 	for (i = 0; i < rev->cmdline.nr; i++) {
@@ -877,9 +890,9 @@
 	ref = rev->cmdline.rev[positive].name;
 	tip_sha1 = rev->cmdline.rev[positive].item->sha1;
 	if (dwim_ref(ref, strlen(ref), branch_sha1, &full_ref) &&
-	    starts_with(full_ref, "refs/heads/") &&
+	    skip_prefix(full_ref, "refs/heads/", &v) &&
 	    !hashcmp(tip_sha1, branch_sha1))
-		branch = xstrdup(full_ref + strlen("refs/heads/"));
+		branch = xstrdup(v);
 	free(full_ref);
 	return branch;
 }
@@ -1228,6 +1241,8 @@
 			    PARSE_OPT_OPTARG, thread_callback },
 		OPT_STRING(0, "signature", &signature, N_("signature"),
 			    N_("add a signature")),
+		OPT_FILENAME(0, "signature-file", &signature_file,
+				N_("add a signature from a file")),
 		OPT__QUIET(&quiet, N_("don't print the patch filenames")),
 		OPT_END()
 	};
@@ -1384,10 +1399,11 @@
 
 		if (check_head) {
 			unsigned char sha1[20];
-			const char *ref;
-			ref = resolve_ref_unsafe("HEAD", sha1, 1, NULL);
-			if (ref && starts_with(ref, "refs/heads/"))
-				branch_name = xstrdup(ref + strlen("refs/heads/"));
+			const char *ref, *v;
+			ref = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
+						 sha1, NULL);
+			if (ref && skip_prefix(ref, "refs/heads/", &v))
+				branch_name = xstrdup(v);
 			else
 				branch_name = xstrdup(""); /* no branch */
 		}
@@ -1427,7 +1443,7 @@
 			continue;
 
 		nr++;
-		list = xrealloc(list, nr * sizeof(list[0]));
+		REALLOC_ARRAY(list, nr);
 		list[nr - 1] = commit;
 	}
 	if (nr == 0)
@@ -1445,6 +1461,18 @@
 			cover_letter = (config_cover_letter == COVER_ON);
 	}
 
+	if (!signature) {
+		; /* --no-signature inhibits all signatures */
+	} else if (signature && signature != git_version_string) {
+		; /* non-default signature already set */
+	} else if (signature_file) {
+		struct strbuf buf = STRBUF_INIT;
+
+		if (strbuf_read_file(&buf, signature_file, 128) < 0)
+			die_errno(_("unable to read signature file '%s'"), signature_file);
+		signature = strbuf_detach(&buf, NULL);
+	}
+
 	if (in_reply_to || thread || cover_letter)
 		rev.ref_message_ids = xcalloc(1, sizeof(struct string_list));
 	if (in_reply_to) {
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index 47c3880..99cee20 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -474,7 +474,7 @@
 		OPT_BOOL('k', "killed", &show_killed,
 			N_("show files on the filesystem that need to be removed")),
 		OPT_BIT(0, "directory", &dir.flags,
-			N_("show 'other' directories' name only"),
+			N_("show 'other' directories' names only"),
 			DIR_SHOW_OTHER_DIRECTORIES),
 		OPT_NEGBIT(0, "empty-directory", &dir.flags,
 			N_("don't show empty directories"),
diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c
index cf11c8d..6a14d29 100644
--- a/builtin/mailinfo.c
+++ b/builtin/mailinfo.c
@@ -288,6 +288,22 @@
 			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)
 {
@@ -329,7 +345,7 @@
 
 	/* for inbody stuff */
 	if (starts_with(line->buf, ">From") && isspace(line->buf[5])) {
-		ret = 1; /* Should this return 0? */
+		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])) {
diff --git a/builtin/mailsplit.c b/builtin/mailsplit.c
index 06296d4..8e02ea1 100644
--- a/builtin/mailsplit.c
+++ b/builtin/mailsplit.c
@@ -53,14 +53,15 @@
  */
 static int split_one(FILE *mbox, const char *name, int allow_bare)
 {
-	FILE *output = NULL;
+	FILE *output;
 	int fd;
 	int status = 0;
 	int is_bare = !is_from_line(buf.buf, buf.len);
 
-	if (is_bare && !allow_bare)
-		goto corrupt;
-
+	if (is_bare && !allow_bare) {
+		fprintf(stderr, "corrupt mailbox\n");
+		exit(1);
+	}
 	fd = open(name, O_WRONLY | O_CREAT | O_EXCL, 0666);
 	if (fd < 0)
 		die_errno("cannot open output file '%s'", name);
@@ -91,13 +92,6 @@
 	}
 	fclose(output);
 	return status;
-
- corrupt:
-	if (output)
-		fclose(output);
-	unlink(name);
-	fprintf(stderr, "corrupt mailbox\n");
-	exit(1);
 }
 
 static int populate_maildir_list(struct string_list *list, const char *path)
diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c
index 61cbde4..f9ab485 100644
--- a/builtin/merge-tree.c
+++ b/builtin/merge-tree.c
@@ -25,7 +25,7 @@
 	merge_result_end = &entry->next;
 }
 
-static void merge_trees_recursive(struct tree_desc t[3], const char *base, int df_conflict);
+static void merge_trees(struct tree_desc t[3], const char *base);
 
 static const char *explanation(struct merge_list *entry)
 {
@@ -195,8 +195,8 @@
 	add_merge_entry(final);
 }
 
-static void unresolved_directory(const struct traverse_info *info, struct name_entry n[3],
-				 int df_conflict)
+static void unresolved_directory(const struct traverse_info *info,
+				 struct name_entry n[3])
 {
 	char *newbase;
 	struct name_entry *p;
@@ -218,7 +218,7 @@
 	buf2 = fill_tree_descriptor(t+2, ENTRY_SHA1(n + 2));
 #undef ENTRY_SHA1
 
-	merge_trees_recursive(t, newbase, df_conflict);
+	merge_trees(t, newbase);
 
 	free(buf0);
 	free(buf1);
@@ -259,7 +259,7 @@
 			dirmask |= (1 << i);
 	}
 
-	unresolved_directory(info, n, dirmask && (dirmask != mask));
+	unresolved_directory(info, n);
 
 	if (dirmask == mask)
 		return;
@@ -335,21 +335,15 @@
 	return mask;
 }
 
-static void merge_trees_recursive(struct tree_desc t[3], const char *base, int df_conflict)
+static void merge_trees(struct tree_desc t[3], const char *base)
 {
 	struct traverse_info info;
 
 	setup_traverse_info(&info, base);
-	info.data = &df_conflict;
 	info.fn = threeway_callback;
 	traverse_trees(3, t, &info);
 }
 
-static void merge_trees(struct tree_desc t[3], const char *base)
-{
-	merge_trees_recursive(t, base, 0);
-}
-
 static void *get_tree_descriptor(struct tree_desc *desc, const char *rev)
 {
 	unsigned char sha1[20];
diff --git a/builtin/merge.c b/builtin/merge.c
index 8763b2e..bebbe5b 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -9,6 +9,7 @@
 #include "cache.h"
 #include "parse-options.h"
 #include "builtin.h"
+#include "lockfile.h"
 #include "run-command.h"
 #include "diff.h"
 #include "refs.h"
@@ -63,7 +64,7 @@
 static int allow_rerere_auto;
 static int abort_current_merge;
 static int show_progress = -1;
-static int default_to_upstream;
+static int default_to_upstream = 1;
 static const char *sign_commit;
 
 static struct strategy all_strategy[] = {
@@ -237,11 +238,10 @@
 static int save_state(unsigned char *stash)
 {
 	int len;
-	struct child_process cp;
+	struct child_process cp = CHILD_PROCESS_INIT;
 	struct strbuf buffer = STRBUF_INIT;
 	const char *argv[] = {"stash", "create", NULL};
 
-	memset(&cp, 0, sizeof(cp));
 	cp.argv = argv;
 	cp.out = -1;
 	cp.git_cmd = 1;
@@ -398,7 +398,7 @@
 			const char *argv_gc_auto[] = { "gc", "--auto", NULL };
 			update_ref(reflog_message.buf, "HEAD",
 				new_head, head, 0,
-				DIE_ON_ERR);
+				UPDATE_REFS_DIE_ON_ERR);
 			/*
 			 * We ignore errors in 'gc --auto', since the
 			 * user should see them.
@@ -557,7 +557,7 @@
 	if (argc < 0)
 		die(_("Bad branch.%s.mergeoptions string: %s"), branch,
 		    split_cmdline_strerror(argc));
-	argv = xrealloc(argv, sizeof(*argv) * (argc + 2));
+	REALLOC_ARRAY(argv, argc + 2);
 	memmove(argv + 1, argv, sizeof(*argv) * (argc + 1));
 	argc++;
 	argv[0] = "branch.*.mergeoptions";
@@ -657,22 +657,18 @@
 			      struct commit_list *remoteheads,
 			      struct commit *head, const char *head_arg)
 {
-	int index_fd;
-	struct lock_file *lock = xcalloc(1, sizeof(struct lock_file));
+	static struct lock_file lock;
 
-	index_fd = hold_locked_index(lock, 1);
+	hold_locked_index(&lock, 1);
 	refresh_cache(REFRESH_QUIET);
 	if (active_cache_changed &&
-			(write_cache(index_fd, active_cache, active_nr) ||
-			 commit_locked_index(lock)))
+	    write_locked_index(&the_index, &lock, COMMIT_LOCK))
 		return error(_("Unable to write index."));
-	rollback_lock_file(lock);
+	rollback_lock_file(&lock);
 
 	if (!strcmp(strategy, "recursive") || !strcmp(strategy, "subtree")) {
 		int clean, x;
 		struct commit *result;
-		struct lock_file *lock = xcalloc(1, sizeof(struct lock_file));
-		int index_fd;
 		struct commit_list *reversed = NULL;
 		struct merge_options o;
 		struct commit_list *j;
@@ -700,14 +696,13 @@
 		for (j = common; j; j = j->next)
 			commit_list_insert(j->item, &reversed);
 
-		index_fd = hold_locked_index(lock, 1);
+		hold_locked_index(&lock, 1);
 		clean = merge_recursive(&o, head,
 				remoteheads->item, reversed, &result);
 		if (active_cache_changed &&
-				(write_cache(index_fd, active_cache, active_nr) ||
-				 commit_locked_index(lock)))
+		    write_locked_index(&the_index, &lock, COMMIT_LOCK))
 			die (_("unable to write %s"), get_index_file());
-		rollback_lock_file(lock);
+		rollback_lock_file(&lock);
 		return clean ? 0 : 1;
 	} else {
 		return try_merge_command(strategy, xopts_nr, xopts,
@@ -843,16 +838,14 @@
 static int merge_trivial(struct commit *head, struct commit_list *remoteheads)
 {
 	unsigned char result_tree[20], result_commit[20];
-	struct commit_list *parent = xmalloc(sizeof(*parent));
+	struct commit_list *parents, **pptr = &parents;
 
 	write_tree_trivial(result_tree);
 	printf(_("Wonderful.\n"));
-	parent->item = head;
-	parent->next = xmalloc(sizeof(*parent->next));
-	parent->next->item = remoteheads->item;
-	parent->next->next = NULL;
+	pptr = commit_list_append(head, pptr);
+	pptr = commit_list_append(remoteheads->item, pptr);
 	prepare_to_commit(remoteheads);
-	if (commit_tree(merge_msg.buf, merge_msg.len, result_tree, parent,
+	if (commit_tree(merge_msg.buf, merge_msg.len, result_tree, parents,
 			result_commit, NULL, sign_commit))
 		die(_("failed to write commit object"));
 	finish(head, remoteheads, result_commit, "In-index merge");
@@ -1108,7 +1101,7 @@
 	 * Check if we are _not_ on a detached HEAD, i.e. if there is a
 	 * current branch.
 	 */
-	branch = branch_to_free = resolve_refdup("HEAD", head_sha1, 0, &flag);
+	branch = branch_to_free = resolve_refdup("HEAD", 0, head_sha1, &flag);
 	if (branch && starts_with(branch, "refs/heads/"))
 		branch += 11;
 	if (!branch || is_null_sha1(head_sha1))
@@ -1150,14 +1143,14 @@
 		 */
 		if (advice_resolve_conflict)
 			die(_("You have not concluded your merge (MERGE_HEAD exists).\n"
-				  "Please, commit your changes before you can merge."));
+				  "Please, commit your changes before you merge."));
 		else
 			die(_("You have not concluded your merge (MERGE_HEAD exists)."));
 	}
 	if (file_exists(git_path("CHERRY_PICK_HEAD"))) {
 		if (advice_resolve_conflict)
 			die(_("You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
-			    "Please, commit your changes before you can merge."));
+			    "Please, commit your changes before you merge."));
 		else
 			die(_("You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."));
 	}
@@ -1222,7 +1215,7 @@
 			die(_("%s - not something we can merge"), argv[0]);
 		read_empty(remote_head->object.sha1, 0);
 		update_ref("initial pull", "HEAD", remote_head->object.sha1,
-			   NULL, 0, DIE_ON_ERR);
+			   NULL, 0, UPDATE_REFS_DIE_ON_ERR);
 		goto done;
 	} else {
 		struct strbuf merge_names = STRBUF_INIT;
@@ -1282,10 +1275,7 @@
 				printf(_("Commit %s has a good GPG signature by %s\n"),
 				       hex, signature_check.signer);
 
-			free(signature_check.gpg_output);
-			free(signature_check.gpg_status);
-			free(signature_check.signer);
-			free(signature_check.key);
+			signature_check_clear(&signature_check);
 		}
 	}
 
@@ -1339,7 +1329,7 @@
 	}
 
 	update_ref("updating ORIG_HEAD", "ORIG_HEAD", head_commit->object.sha1,
-		   NULL, 0, DIE_ON_ERR);
+		   NULL, 0, UPDATE_REFS_DIE_ON_ERR);
 
 	if (remoteheads && !common)
 		; /* No common ancestors found. We need a real merge. */
diff --git a/builtin/mv.c b/builtin/mv.c
index 180ef99..563d05b 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -3,8 +3,8 @@
  *
  * Copyright (C) 2006 Johannes Schindelin
  */
-#include "cache.h"
 #include "builtin.h"
+#include "lockfile.h"
 #include "dir.h"
 #include "cache-tree.h"
 #include "string-list.h"
@@ -61,9 +61,49 @@
 static struct lock_file lock_file;
 #define SUBMODULE_WITH_GITDIR ((const char *)1)
 
+static void prepare_move_submodule(const char *src, int first,
+				   const char **submodule_gitfile)
+{
+	struct strbuf submodule_dotgit = STRBUF_INIT;
+	if (!S_ISGITLINK(active_cache[first]->ce_mode))
+		die(_("Directory %s is in index and no submodule?"), src);
+	if (!is_staging_gitmodules_ok())
+		die(_("Please stage your changes to .gitmodules or stash them to proceed"));
+	strbuf_addf(&submodule_dotgit, "%s/.git", src);
+	*submodule_gitfile = read_gitfile(submodule_dotgit.buf);
+	if (*submodule_gitfile)
+		*submodule_gitfile = xstrdup(*submodule_gitfile);
+	else
+		*submodule_gitfile = SUBMODULE_WITH_GITDIR;
+	strbuf_release(&submodule_dotgit);
+}
+
+static int index_range_of_same_dir(const char *src, int length,
+				   int *first_p, int *last_p)
+{
+	const char *src_w_slash = add_slash(src);
+	int first, last, len_w_slash = length + 1;
+
+	first = cache_name_pos(src_w_slash, len_w_slash);
+	if (first >= 0)
+		die(_("%.*s is in index"), len_w_slash, src_w_slash);
+
+	first = -1 - first;
+	for (last = first; last < active_nr; last++) {
+		const char *path = active_cache[last]->name;
+		if (strncmp(path, src_w_slash, len_w_slash))
+			break;
+	}
+	if (src_w_slash != src)
+		free((char *)src_w_slash);
+	*first_p = first;
+	*last_p = last;
+	return last - first;
+}
+
 int cmd_mv(int argc, const char **argv, const char *prefix)
 {
-	int i, newfd, gitmodules_modified = 0;
+	int i, gitmodules_modified = 0;
 	int verbose = 0, show_only = 0, force = 0, ignore_errors = 0;
 	struct option builtin_mv_options[] = {
 		OPT__VERBOSE(&verbose, N_("be verbose")),
@@ -85,7 +125,7 @@
 	if (--argc < 1)
 		usage_with_options(builtin_mv_usage, builtin_mv_options);
 
-	newfd = hold_locked_index(&lock_file, 1);
+	hold_locked_index(&lock_file, 1);
 	if (read_cache() < 0)
 		die(_("index file corrupt"));
 
@@ -108,7 +148,7 @@
 		destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
 	} else {
 		if (argc != 1)
-			die("destination '%s' is not a directory", dest_path[0]);
+			die(_("destination '%s' is not a directory"), dest_path[0]);
 		destination = dest_path;
 	}
 
@@ -131,75 +171,36 @@
 				&& lstat(dst, &st) == 0)
 			bad = _("cannot move directory over file");
 		else if (src_is_dir) {
-			int first = cache_name_pos(src, length);
-			if (first >= 0) {
-				struct strbuf submodule_dotgit = STRBUF_INIT;
-				if (!S_ISGITLINK(active_cache[first]->ce_mode))
-					die (_("Huh? Directory %s is in index and no submodule?"), src);
-				if (!is_staging_gitmodules_ok())
-					die (_("Please, stage your changes to .gitmodules or stash them to proceed"));
-				strbuf_addf(&submodule_dotgit, "%s/.git", src);
-				submodule_gitfile[i] = read_gitfile(submodule_dotgit.buf);
-				if (submodule_gitfile[i])
-					submodule_gitfile[i] = xstrdup(submodule_gitfile[i]);
-				else
-					submodule_gitfile[i] = SUBMODULE_WITH_GITDIR;
-				strbuf_release(&submodule_dotgit);
-			} else {
-				const char *src_w_slash = add_slash(src);
-				int last, len_w_slash = length + 1;
+			int first = cache_name_pos(src, length), last;
+
+			if (first >= 0)
+				prepare_move_submodule(src, first,
+						       submodule_gitfile + i);
+			else if (index_range_of_same_dir(src, length,
+							 &first, &last) < 1)
+				bad = _("source directory is empty");
+			else { /* last - first >= 1 */
+				int j, dst_len, n;
 
 				modes[i] = WORKING_DIRECTORY;
+				n = argc + last - first;
+				REALLOC_ARRAY(source, n);
+				REALLOC_ARRAY(destination, n);
+				REALLOC_ARRAY(modes, n);
+				REALLOC_ARRAY(submodule_gitfile, n);
 
-				first = cache_name_pos(src_w_slash, len_w_slash);
-				if (first >= 0)
-					die (_("Huh? %.*s is in index?"),
-							len_w_slash, src_w_slash);
+				dst = add_slash(dst);
+				dst_len = strlen(dst);
 
-				first = -1 - first;
-				for (last = first; last < active_nr; last++) {
-					const char *path = active_cache[last]->name;
-					if (strncmp(path, src_w_slash, len_w_slash))
-						break;
+				for (j = 0; j < last - first; j++) {
+					const char *path = active_cache[first + j]->name;
+					source[argc + j] = path;
+					destination[argc + j] =
+						prefix_path(dst, dst_len, path + length + 1);
+					modes[argc + j] = INDEX;
+					submodule_gitfile[argc + j] = NULL;
 				}
-				if (src_w_slash != src)
-					free((char *)src_w_slash);
-
-				if (last - first < 1)
-					bad = _("source directory is empty");
-				else {
-					int j, dst_len;
-
-					if (last - first > 0) {
-						source = xrealloc(source,
-								(argc + last - first)
-								* sizeof(char *));
-						destination = xrealloc(destination,
-								(argc + last - first)
-								* sizeof(char *));
-						modes = xrealloc(modes,
-								(argc + last - first)
-								* sizeof(enum update_mode));
-						submodule_gitfile = xrealloc(submodule_gitfile,
-								(argc + last - first)
-								* sizeof(char *));
-					}
-
-					dst = add_slash(dst);
-					dst_len = strlen(dst);
-
-					for (j = 0; j < last - first; j++) {
-						const char *path =
-							active_cache[first + j]->name;
-						source[argc + j] = path;
-						destination[argc + j] =
-							prefix_path(dst, dst_len,
-								path + length + 1);
-						modes[argc + j] = INDEX;
-						submodule_gitfile[argc + j] = NULL;
-					}
-					argc += last - first;
-				}
+				argc += last - first;
 			}
 		} else if (cache_name_pos(src, length) < 0)
 			bad = _("not under version control");
@@ -225,24 +226,22 @@
 		else
 			string_list_insert(&src_for_dst, dst);
 
-		if (bad) {
-			if (ignore_errors) {
-				if (--argc > 0) {
-					memmove(source + i, source + i + 1,
-						(argc - i) * sizeof(char *));
-					memmove(destination + i,
-						destination + i + 1,
-						(argc - i) * sizeof(char *));
-					memmove(modes + i, modes + i + 1,
-						(argc - i) * sizeof(enum update_mode));
-					memmove(submodule_gitfile + i,
-						submodule_gitfile + i + 1,
-						(argc - i) * sizeof(char *));
-					i--;
-				}
-			} else
-				die (_("%s, source=%s, destination=%s"),
-				     bad, src, dst);
+		if (!bad)
+			continue;
+		if (!ignore_errors)
+			die(_("%s, source=%s, destination=%s"),
+			     bad, src, dst);
+		if (--argc > 0) {
+			int n = argc - i;
+			memmove(source + i, source + i + 1,
+				n * sizeof(char *));
+			memmove(destination + i, destination + i + 1,
+				n * sizeof(char *));
+			memmove(modes + i, modes + i + 1,
+				n * sizeof(enum update_mode));
+			memmove(submodule_gitfile + i, submodule_gitfile + i + 1,
+				n * sizeof(char *));
+			i--;
 		}
 	}
 
@@ -254,7 +253,7 @@
 			printf(_("Renaming %s to %s\n"), src, dst);
 		if (!show_only && mode != INDEX) {
 			if (rename(src, dst) < 0 && !ignore_errors)
-				die_errno (_("renaming '%s' failed"), src);
+				die_errno(_("renaming '%s' failed"), src);
 			if (submodule_gitfile[i]) {
 				if (submodule_gitfile[i] != SUBMODULE_WITH_GITDIR)
 					connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
@@ -275,11 +274,9 @@
 	if (gitmodules_modified)
 		stage_updated_gitmodules();
 
-	if (active_cache_changed) {
-		if (write_cache(newfd, active_cache, active_nr) ||
-		    commit_locked_index(&lock_file))
-			die(_("Unable to write new index file"));
-	}
+	if (active_cache_changed &&
+	    write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
+		die(_("Unable to write new index file"));
 
 	return 0;
 }
diff --git a/builtin/name-rev.c b/builtin/name-rev.c
index c824d4e..3c8f319 100644
--- a/builtin/name-rev.c
+++ b/builtin/name-rev.c
@@ -33,10 +33,7 @@
 		return;
 
 	if (deref) {
-		char *new_name = xmalloc(strlen(tip_name)+3);
-		strcpy(new_name, tip_name);
-		strcat(new_name, "^0");
-		tip_name = new_name;
+		tip_name = xstrfmt("%s^0", tip_name);
 
 		if (generation)
 			die("generation: %d, but deref?", generation);
diff --git a/builtin/notes.c b/builtin/notes.c
index 39c8573..68b6cd8 100644
--- a/builtin/notes.c
+++ b/builtin/notes.c
@@ -122,12 +122,11 @@
 {
 	const char *show_args[5] =
 		{"show", "--stat", "--no-notes", sha1_to_hex(object), NULL};
-	struct child_process show;
+	struct child_process show = CHILD_PROCESS_INIT;
 	struct strbuf buf = STRBUF_INIT;
 	struct strbuf cbuf = STRBUF_INIT;
 
 	/* Invoke "git show --stat --no-notes $object" */
-	memset(&show, 0, sizeof(show));
 	show.argv = show_args;
 	show.no_stdin = 1;
 	show.out = -1;
@@ -211,7 +210,7 @@
 		if (write_sha1_file(msg->buf.buf, msg->buf.len, blob_type, result)) {
 			error(_("unable to write note object"));
 			if (path)
-				error(_("The note contents has been left in %s"),
+				error(_("The note contents have been left in %s"),
 				      path);
 			exit(128);
 		}
@@ -703,7 +702,7 @@
 	init_notes(t, "NOTES_MERGE_PARTIAL", combine_notes_overwrite, 0);
 
 	o->local_ref = local_ref_to_free =
-		resolve_refdup("NOTES_MERGE_REF", sha1, 0, NULL);
+		resolve_refdup("NOTES_MERGE_REF", 0, sha1, NULL);
 	if (!o->local_ref)
 		die("Failed to resolve NOTES_MERGE_REF");
 
@@ -717,7 +716,7 @@
 	strbuf_insert(&msg, 0, "notes: ", 7);
 	update_ref(msg.buf, o->local_ref, sha1,
 		   is_null_sha1(parent_sha1) ? NULL : parent_sha1,
-		   0, DIE_ON_ERR);
+		   0, UPDATE_REFS_DIE_ON_ERR);
 
 	free_notes(t);
 	strbuf_release(&msg);
@@ -812,11 +811,11 @@
 	if (result >= 0) /* Merge resulted (trivially) in result_sha1 */
 		/* Update default notes ref with new commit */
 		update_ref(msg.buf, default_notes_ref(), result_sha1, NULL,
-			   0, DIE_ON_ERR);
+			   0, UPDATE_REFS_DIE_ON_ERR);
 	else { /* Merge has unresolved conflicts */
 		/* Update .git/NOTES_MERGE_PARTIAL with partial merge result */
 		update_ref(msg.buf, "NOTES_MERGE_PARTIAL", result_sha1, NULL,
-			   0, DIE_ON_ERR);
+			   0, UPDATE_REFS_DIE_ON_ERR);
 		/* Store ref-to-be-updated into .git/NOTES_MERGE_REF */
 		if (create_symref("NOTES_MERGE_REF", default_notes_ref(), NULL))
 			die("Failed to store link to current notes ref (%s)",
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index de36c60..3f9f5c7 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -20,6 +20,9 @@
 #include "streaming.h"
 #include "thread-utils.h"
 #include "pack-bitmap.h"
+#include "reachable.h"
+#include "sha1-array.h"
+#include "argv-array.h"
 
 static const char *pack_usage[] = {
 	N_("git pack-objects --stdout [options...] [< ref-list | < object-list]"),
@@ -89,8 +92,7 @@
 {
 	if (indexed_commits_nr >= indexed_commits_alloc) {
 		indexed_commits_alloc = (indexed_commits_alloc + 32) * 2;
-		indexed_commits = xrealloc(indexed_commits,
-			indexed_commits_alloc * sizeof(struct commit *));
+		REALLOC_ARRAY(indexed_commits, indexed_commits_alloc);
 	}
 
 	indexed_commits[indexed_commits_nr++] = commit;
@@ -812,6 +814,7 @@
 			fixup_pack_header_footer(fd, sha1, pack_tmp_name,
 						 nr_written, sha1, offset);
 			close(fd);
+			write_bitmap_index = 0;
 		}
 
 		if (!pack_to_stdout) {
@@ -1973,8 +1976,6 @@
 
 	init_threaded_search();
 
-	if (!delta_search_threads)	/* --threads=0 means autodetect */
-		delta_search_threads = online_cpus();
 	if (delta_search_threads <= 1) {
 		find_deltas(list, &list_size, window, depth, processed);
 		cleanup_threaded_search();
@@ -2214,10 +2215,6 @@
 		cache_max_small_delta_size = git_config_int(k, v);
 		return 0;
 	}
-	if (!strcmp(k, "pack.writebitmaps")) {
-		write_bitmap_index = git_config_bool(k, v);
-		return 0;
-	}
 	if (!strcmp(k, "pack.writebitmaphashcache")) {
 		if (git_config_bool(k, v))
 			write_bitmap_options |= BITMAP_OPT_HASH_CACHE;
@@ -2412,6 +2409,27 @@
 	return 0;
 }
 
+/*
+ * Store a list of sha1s that are should not be discarded
+ * because they are either written too recently, or are
+ * reachable from another object that was.
+ *
+ * This is filled by get_object_list.
+ */
+static struct sha1_array recent_objects;
+
+static int loosened_object_can_be_discarded(const unsigned char *sha1,
+					    unsigned long mtime)
+{
+	if (!unpack_unreachable_expiration)
+		return 0;
+	if (mtime > unpack_unreachable_expiration)
+		return 0;
+	if (sha1_array_lookup(&recent_objects, sha1) >= 0)
+		return 0;
+	return 1;
+}
+
 static void loosen_unused_packed_objects(struct rev_info *revs)
 {
 	struct packed_git *p;
@@ -2422,17 +2440,14 @@
 		if (!p->pack_local || p->pack_keep)
 			continue;
 
-		if (unpack_unreachable_expiration &&
-		    p->mtime < unpack_unreachable_expiration)
-			continue;
-
 		if (open_pack_index(p))
 			die("cannot open pack index");
 
 		for (i = 0; i < p->num_objects; i++) {
 			sha1 = nth_packed_object_sha1(p, i);
 			if (!packlist_find(&to_pack, sha1, NULL) &&
-				!has_sha1_pack_kept_or_nonlocal(sha1))
+			    !has_sha1_pack_kept_or_nonlocal(sha1) &&
+			    !loosened_object_can_be_discarded(sha1, p->mtime))
 				if (force_object_loose(sha1, p->mtime))
 					die("unable to force loose object");
 		}
@@ -2468,6 +2483,19 @@
 	return 0;
 }
 
+static void record_recent_object(struct object *obj,
+				 const struct name_path *path,
+				 const char *last,
+				 void *data)
+{
+	sha1_array_append(&recent_objects, obj->sha1);
+}
+
+static void record_recent_commit(struct commit *commit, void *data)
+{
+	sha1_array_append(&recent_objects, commit->object.sha1);
+}
+
 static void get_object_list(int ac, const char **av)
 {
 	struct rev_info revs;
@@ -2498,6 +2526,7 @@
 				if (get_sha1_hex(line + 10, sha1))
 					die("not an SHA-1 '%s'", line + 10);
 				register_shallow(sha1);
+				use_bitmap_index = 0;
 				continue;
 			}
 			die("not a rev '%s'", line);
@@ -2514,10 +2543,23 @@
 	mark_edges_uninteresting(&revs, show_edge);
 	traverse_commit_list(&revs, show_commit, show_object, NULL);
 
+	if (unpack_unreachable_expiration) {
+		revs.ignore_missing_links = 1;
+		if (add_unseen_recent_objects_to_traversal(&revs,
+				unpack_unreachable_expiration))
+			die("unable to add recent objects");
+		if (prepare_revision_walk(&revs))
+			die("revision walk setup failed");
+		traverse_commit_list(&revs, record_recent_commit,
+				     record_recent_object, NULL);
+	}
+
 	if (keep_unreachable)
 		add_objects_in_unpacked_packs(&revs);
 	if (unpack_unreachable)
 		loosen_unused_packed_objects(&revs);
+
+	sha1_array_clear(&recent_objects);
 }
 
 static int option_parse_index_version(const struct option *opt,
@@ -2572,9 +2614,9 @@
 	int use_internal_rev_list = 0;
 	int thin = 0;
 	int all_progress_implied = 0;
-	const char *rp_av[6];
-	int rp_ac = 0;
+	struct argv_array rp = ARGV_ARRAY_INIT;
 	int rev_list_unpacked = 0, rev_list_all = 0, rev_list_reflog = 0;
+	int rev_list_index = 0;
 	struct option pack_objects_options[] = {
 		OPT_SET_INT('q', "quiet", &progress,
 			    N_("do not show progress meter"), 0),
@@ -2621,6 +2663,9 @@
 		{ OPTION_SET_INT, 0, "reflog", &rev_list_reflog, NULL,
 		  N_("include objects referred by reflog entries"),
 		  PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, 1 },
+		{ OPTION_SET_INT, 0, "indexed-objects", &rev_list_index, NULL,
+		  N_("include objects referred to by the index"),
+		  PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, 1 },
 		OPT_BOOL(0, "stdout", &pack_to_stdout,
 			 N_("output pack to stdout")),
 		OPT_BOOL(0, "include-tag", &include_tag,
@@ -2663,24 +2708,28 @@
 	if (pack_to_stdout != !base_name || argc)
 		usage_with_options(pack_usage, pack_objects_options);
 
-	rp_av[rp_ac++] = "pack-objects";
+	argv_array_push(&rp, "pack-objects");
 	if (thin) {
 		use_internal_rev_list = 1;
-		rp_av[rp_ac++] = "--objects-edge";
+		argv_array_push(&rp, "--objects-edge");
 	} else
-		rp_av[rp_ac++] = "--objects";
+		argv_array_push(&rp, "--objects");
 
 	if (rev_list_all) {
 		use_internal_rev_list = 1;
-		rp_av[rp_ac++] = "--all";
+		argv_array_push(&rp, "--all");
 	}
 	if (rev_list_reflog) {
 		use_internal_rev_list = 1;
-		rp_av[rp_ac++] = "--reflog";
+		argv_array_push(&rp, "--reflog");
+	}
+	if (rev_list_index) {
+		use_internal_rev_list = 1;
+		argv_array_push(&rp, "--indexed-objects");
 	}
 	if (rev_list_unpacked) {
 		use_internal_rev_list = 1;
-		rp_av[rp_ac++] = "--unpacked";
+		argv_array_push(&rp, "--unpacked");
 	}
 
 	if (!reuse_object)
@@ -2689,6 +2738,10 @@
 		pack_compression_level = Z_DEFAULT_COMPRESSION;
 	else if (pack_compression_level < 0 || pack_compression_level > Z_BEST_COMPRESSION)
 		die("bad pack compression level %d", pack_compression_level);
+
+	if (!delta_search_threads)	/* --threads=0 means autodetect */
+		delta_search_threads = online_cpus();
+
 #ifdef NO_PTHREADS
 	if (delta_search_threads != 1)
 		warning("no threads support, ignoring --threads");
@@ -2707,6 +2760,8 @@
 
 	if (keep_unreachable && unpack_unreachable)
 		die("--keep-unreachable and --unpack-unreachable are incompatible.");
+	if (!rev_list_all || !rev_list_reflog || !rev_list_index)
+		unpack_unreachable_expiration = 0;
 
 	if (!use_internal_rev_list || !pack_to_stdout || is_repository_shallow())
 		use_bitmap_index = 0;
@@ -2724,8 +2779,8 @@
 	if (!use_internal_rev_list)
 		read_object_list_from_stdin();
 	else {
-		rp_av[rp_ac] = NULL;
-		get_object_list(rp_ac, rp_av);
+		get_object_list(rp.argc, rp.argv);
+		argv_array_clear(&rp);
 	}
 	cleanup_preferred_base();
 	if (include_tag && nr_result)
diff --git a/builtin/patch-id.c b/builtin/patch-id.c
index 3cfe02d..77db873 100644
--- a/builtin/patch-id.c
+++ b/builtin/patch-id.c
@@ -1,17 +1,14 @@
 #include "builtin.h"
 
-static void flush_current_id(int patchlen, unsigned char *id, git_SHA_CTX *c)
+static void flush_current_id(int patchlen, unsigned char *id, unsigned char *result)
 {
-	unsigned char result[20];
 	char name[50];
 
 	if (!patchlen)
 		return;
 
-	git_SHA1_Final(result, c);
 	memcpy(name, sha1_to_hex(id), 41);
 	printf("%s %s\n", sha1_to_hex(result), name);
-	git_SHA1_Init(c);
 }
 
 static int remove_space(char *line)
@@ -56,10 +53,31 @@
 	return 1;
 }
 
-static int get_one_patchid(unsigned char *next_sha1, git_SHA_CTX *ctx, struct strbuf *line_buf)
+static void flush_one_hunk(unsigned char *result, git_SHA_CTX *ctx)
+{
+	unsigned char hash[20];
+	unsigned short carry = 0;
+	int i;
+
+	git_SHA1_Final(hash, ctx);
+	git_SHA1_Init(ctx);
+	/* 20-byte sum, with carry */
+	for (i = 0; i < 20; ++i) {
+		carry += result[i] + hash[i];
+		result[i] = carry;
+		carry >>= 8;
+	}
+}
+
+static int get_one_patchid(unsigned char *next_sha1, unsigned char *result,
+			   struct strbuf *line_buf, int stable)
 {
 	int patchlen = 0, found_next = 0;
 	int before = -1, after = -1;
+	git_SHA_CTX ctx;
+
+	git_SHA1_Init(&ctx);
+	hashclr(result);
 
 	while (strbuf_getwholeline(line_buf, stdin, '\n') != EOF) {
 		char *line = line_buf->buf;
@@ -107,6 +125,8 @@
 				break;
 
 			/* Else we're parsing another header.  */
+			if (stable)
+				flush_one_hunk(result, &ctx);
 			before = after = -1;
 		}
 
@@ -119,39 +139,63 @@
 		/* Compute the sha without whitespace */
 		len = remove_space(line);
 		patchlen += len;
-		git_SHA1_Update(ctx, line, len);
+		git_SHA1_Update(&ctx, line, len);
 	}
 
 	if (!found_next)
 		hashclr(next_sha1);
 
+	flush_one_hunk(result, &ctx);
+
 	return patchlen;
 }
 
-static void generate_id_list(void)
+static void generate_id_list(int stable)
 {
-	unsigned char sha1[20], n[20];
-	git_SHA_CTX ctx;
+	unsigned char sha1[20], n[20], result[20];
 	int patchlen;
 	struct strbuf line_buf = STRBUF_INIT;
 
-	git_SHA1_Init(&ctx);
 	hashclr(sha1);
 	while (!feof(stdin)) {
-		patchlen = get_one_patchid(n, &ctx, &line_buf);
-		flush_current_id(patchlen, sha1, &ctx);
+		patchlen = get_one_patchid(n, result, &line_buf, stable);
+		flush_current_id(patchlen, sha1, result);
 		hashcpy(sha1, n);
 	}
 	strbuf_release(&line_buf);
 }
 
-static const char patch_id_usage[] = "git patch-id < patch";
+static const char patch_id_usage[] = "git patch-id [--stable | --unstable] < patch";
+
+static int git_patch_id_config(const char *var, const char *value, void *cb)
+{
+	int *stable = cb;
+
+	if (!strcmp(var, "patchid.stable")) {
+		*stable = git_config_bool(var, value);
+		return 0;
+	}
+
+	return git_default_config(var, value, cb);
+}
 
 int cmd_patch_id(int argc, const char **argv, const char *prefix)
 {
-	if (argc != 1)
+	int stable = -1;
+
+	git_config(git_patch_id_config, &stable);
+
+	/* If nothing is set, default to unstable. */
+	if (stable < 0)
+		stable = 0;
+
+	if (argc == 2 && !strcmp(argv[1], "--stable"))
+		stable = 1;
+	else if (argc == 2 && !strcmp(argv[1], "--unstable"))
+		stable = 0;
+	else if (argc != 1)
 		usage(patch_id_usage);
 
-	generate_id_list();
+	generate_id_list(stable);
 	return 0;
 }
diff --git a/builtin/prune-packed.c b/builtin/prune-packed.c
index 6879468..f24a2c2 100644
--- a/builtin/prune-packed.c
+++ b/builtin/prune-packed.c
@@ -10,63 +10,41 @@
 
 static struct progress *progress;
 
-static void prune_dir(int i, DIR *dir, struct strbuf *pathname, int opts)
+static int prune_subdir(int nr, const char *path, void *data)
 {
-	struct dirent *de;
-	char hex[40];
-	int top_len = pathname->len;
+	int *opts = data;
+	display_progress(progress, nr + 1);
+	if (!(*opts & PRUNE_PACKED_DRY_RUN))
+		rmdir(path);
+	return 0;
+}
 
-	sprintf(hex, "%02x", i);
-	while ((de = readdir(dir)) != NULL) {
-		unsigned char sha1[20];
-		if (strlen(de->d_name) != 38)
-			continue;
-		memcpy(hex + 2, de->d_name, 38);
-		if (get_sha1_hex(hex, sha1))
-			continue;
-		if (!has_sha1_pack(sha1))
-			continue;
+static int prune_object(const unsigned char *sha1, const char *path,
+			 void *data)
+{
+	int *opts = data;
 
-		strbuf_add(pathname, de->d_name, 38);
-		if (opts & PRUNE_PACKED_DRY_RUN)
-			printf("rm -f %s\n", pathname->buf);
-		else
-			unlink_or_warn(pathname->buf);
-		display_progress(progress, i + 1);
-		strbuf_setlen(pathname, top_len);
-	}
+	if (!has_sha1_pack(sha1))
+		return 0;
+
+	if (*opts & PRUNE_PACKED_DRY_RUN)
+		printf("rm -f %s\n", path);
+	else
+		unlink_or_warn(path);
+	return 0;
 }
 
 void prune_packed_objects(int opts)
 {
-	int i;
-	const char *dir = get_object_directory();
-	struct strbuf pathname = STRBUF_INIT;
-	int top_len;
-
-	strbuf_addstr(&pathname, dir);
 	if (opts & PRUNE_PACKED_VERBOSE)
 		progress = start_progress_delay(_("Removing duplicate objects"),
 			256, 95, 2);
 
-	if (pathname.len && pathname.buf[pathname.len - 1] != '/')
-		strbuf_addch(&pathname, '/');
+	for_each_loose_file_in_objdir(get_object_directory(),
+				      prune_object, NULL, prune_subdir, &opts);
 
-	top_len = pathname.len;
-	for (i = 0; i < 256; i++) {
-		DIR *d;
-
-		display_progress(progress, i + 1);
-		strbuf_setlen(&pathname, top_len);
-		strbuf_addf(&pathname, "%02x/", i);
-		d = opendir(pathname.buf);
-		if (!d)
-			continue;
-		prune_dir(i, d, &pathname, opts);
-		closedir(d);
-		strbuf_setlen(&pathname, top_len + 2);
-		rmdir(pathname.buf);
-	}
+	/* Ensure we show 100% before finishing progress */
+	display_progress(progress, 256);
 	stop_progress(&progress);
 }
 
diff --git a/builtin/prune.c b/builtin/prune.c
index 144a3bd..04d3b12 100644
--- a/builtin/prune.c
+++ b/builtin/prune.c
@@ -31,11 +31,23 @@
 	return 0;
 }
 
-static int prune_object(const char *fullpath, const unsigned char *sha1)
+static int prune_object(const unsigned char *sha1, const char *fullpath,
+			void *data)
 {
 	struct stat st;
-	if (lstat(fullpath, &st))
-		return error("Could not stat '%s'", fullpath);
+
+	/*
+	 * Do we know about this object?
+	 * It must have been reachable
+	 */
+	if (lookup_object(sha1))
+		return 0;
+
+	if (lstat(fullpath, &st)) {
+		/* report errors, but do not stop pruning */
+		error("Could not stat '%s'", fullpath);
+		return 0;
+	}
 	if (st.st_mtime > expire)
 		return 0;
 	if (show_only || verbose) {
@@ -48,68 +60,20 @@
 	return 0;
 }
 
-static int prune_dir(int i, struct strbuf *path)
+static int prune_cruft(const char *basename, const char *path, void *data)
 {
-	size_t baselen = path->len;
-	DIR *dir = opendir(path->buf);
-	struct dirent *de;
-
-	if (!dir)
-		return 0;
-
-	while ((de = readdir(dir)) != NULL) {
-		char name[100];
-		unsigned char sha1[20];
-
-		if (is_dot_or_dotdot(de->d_name))
-			continue;
-		if (strlen(de->d_name) == 38) {
-			sprintf(name, "%02x", i);
-			memcpy(name+2, de->d_name, 39);
-			if (get_sha1_hex(name, sha1) < 0)
-				break;
-
-			/*
-			 * Do we know about this object?
-			 * It must have been reachable
-			 */
-			if (lookup_object(sha1))
-				continue;
-
-			strbuf_addf(path, "/%s", de->d_name);
-			prune_object(path->buf, sha1);
-			strbuf_setlen(path, baselen);
-			continue;
-		}
-		if (starts_with(de->d_name, "tmp_obj_")) {
-			strbuf_addf(path, "/%s", de->d_name);
-			prune_tmp_file(path->buf);
-			strbuf_setlen(path, baselen);
-			continue;
-		}
-		fprintf(stderr, "bad sha1 file: %s/%s\n", path->buf, de->d_name);
-	}
-	closedir(dir);
-	if (!show_only)
-		rmdir(path->buf);
+	if (starts_with(basename, "tmp_obj_"))
+		prune_tmp_file(path);
+	else
+		fprintf(stderr, "bad sha1 file: %s\n", path);
 	return 0;
 }
 
-static void prune_object_dir(const char *path)
+static int prune_subdir(int nr, const char *path, void *data)
 {
-	struct strbuf buf = STRBUF_INIT;
-	size_t baselen;
-	int i;
-
-	strbuf_addstr(&buf, path);
-	strbuf_addch(&buf, '/');
-	baselen = buf.len;
-
-	for (i = 0; i < 256; i++) {
-		strbuf_addf(&buf, "%02x", i);
-		prune_dir(i, &buf);
-		strbuf_setlen(&buf, baselen);
-	}
+	if (!show_only)
+		rmdir(path);
+	return 0;
 }
 
 /*
@@ -171,9 +135,10 @@
 	if (show_progress)
 		progress = start_progress_delay(_("Checking connectivity"), 0, 0, 2);
 
-	mark_reachable_objects(&revs, 1, progress);
+	mark_reachable_objects(&revs, 1, expire, progress);
 	stop_progress(&progress);
-	prune_object_dir(get_object_directory());
+	for_each_loose_file_in_objdir(get_object_directory(), prune_object,
+				      prune_cruft, prune_subdir, NULL);
 
 	prune_packed_objects(show_only ? PRUNE_PACKED_DRY_RUN : 0);
 	remove_temporary_files(get_object_directory());
diff --git a/builtin/push.c b/builtin/push.c
index f8dfea4..a076b19 100644
--- a/builtin/push.c
+++ b/builtin/push.c
@@ -127,11 +127,10 @@
 	 * them the big ugly fully qualified ref.
 	 */
 	const char *advice_maybe = "";
-	const char *short_upstream =
-		skip_prefix(branch->merge[0]->src, "refs/heads/");
+	const char *short_upstream = branch->merge[0]->src;
 
-	if (!short_upstream)
-		short_upstream = branch->merge[0]->src;
+	skip_prefix(short_upstream, "refs/heads/", &short_upstream);
+
 	/*
 	 * Don't show advice for people who explicitly set
 	 * push.default.
@@ -472,6 +471,17 @@
 	return 0;
 }
 
+static int git_push_config(const char *k, const char *v, void *cb)
+{
+	struct wt_status *s = cb;
+	int status;
+
+	status = git_gpg_config(k, v, NULL);
+	if (status)
+		return status;
+	return git_default_config(k, v, s);
+}
+
 int cmd_push(int argc, const char **argv, const char *prefix)
 {
 	int flags = 0;
@@ -507,11 +517,12 @@
 		OPT_BIT(0, "no-verify", &flags, N_("bypass pre-push hook"), TRANSPORT_PUSH_NO_HOOK),
 		OPT_BIT(0, "follow-tags", &flags, N_("push missing but relevant tags"),
 			TRANSPORT_PUSH_FOLLOW_TAGS),
+		OPT_BIT(0, "signed", &flags, N_("GPG sign the push"), TRANSPORT_PUSH_CERT),
 		OPT_END()
 	};
 
 	packet_trace_identity("push");
-	git_config(git_default_config, NULL);
+	git_config(git_push_config, NULL);
 	argc = parse_options(argc, argv, prefix, options, push_usage, 0);
 
 	if (deleterefs && (tags || (flags & (TRANSPORT_PUSH_ALL | TRANSPORT_PUSH_MIRROR))))
diff --git a/builtin/read-tree.c b/builtin/read-tree.c
index 0d7ef84..43b47f7 100644
--- a/builtin/read-tree.c
+++ b/builtin/read-tree.c
@@ -5,6 +5,7 @@
  */
 
 #include "cache.h"
+#include "lockfile.h"
 #include "object.h"
 #include "tree.h"
 #include "tree-walk.h"
@@ -99,7 +100,7 @@
 
 int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
 {
-	int i, newfd, stage = 0;
+	int i, stage = 0;
 	unsigned char sha1[20];
 	struct tree_desc t[MAX_UNPACK_TREES];
 	struct unpack_trees_options opts;
@@ -149,12 +150,21 @@
 	argc = parse_options(argc, argv, unused_prefix, read_tree_options,
 			     read_tree_usage, 0);
 
-	newfd = hold_locked_index(&lock_file, 1);
+	hold_locked_index(&lock_file, 1);
 
 	prefix_set = opts.prefix ? 1 : 0;
 	if (1 < opts.merge + opts.reset + prefix_set)
 		die("Which one? -m, --reset, or --prefix?");
 
+	/*
+	 * NEEDSWORK
+	 *
+	 * The old index should be read anyway even if we're going to
+	 * destroy all index entries because we still need to preserve
+	 * certain information such as index version or split-index
+	 * mode.
+	 */
+
 	if (opts.reset || opts.merge || opts.prefix) {
 		if (read_cache_unmerged() && (opts.prefix || opts.merge))
 			die("You need to resolve your current index first");
@@ -231,10 +241,9 @@
 	 * what came from the tree.
 	 */
 	if (nr_trees == 1 && !opts.prefix)
-		prime_cache_tree(&active_cache_tree, trees[0]);
+		prime_cache_tree(&the_index, trees[0]);
 
-	if (write_cache(newfd, active_cache, active_nr) ||
-	    commit_locked_index(&lock_file))
+	if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
 		die("unable to write new index file");
 	return 0;
 }
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index c323081..32fc540 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -1,4 +1,5 @@
 #include "builtin.h"
+#include "lockfile.h"
 #include "pack.h"
 #include "refs.h"
 #include "pkt-line.h"
@@ -15,6 +16,9 @@
 #include "connected.h"
 #include "argv-array.h"
 #include "version.h"
+#include "tag.h"
+#include "gpg-interface.h"
+#include "sigchain.h"
 
 static const char receive_pack_usage[] = "git receive-pack <git-dir>";
 
@@ -41,11 +45,27 @@
 static int auto_update_server_info;
 static int auto_gc = 1;
 static int fix_thin = 1;
+static int stateless_rpc;
+static const char *service_dir;
 static const char *head_name;
 static void *head_name_to_free;
 static int sent_capabilities;
 static int shallow_update;
 static const char *alt_shallow_file;
+static struct strbuf push_cert = STRBUF_INIT;
+static unsigned char push_cert_sha1[20];
+static struct signature_check sigcheck;
+static const char *push_cert_nonce;
+static const char *cert_nonce_seed;
+
+static const char *NONCE_UNSOLICITED = "UNSOLICITED";
+static const char *NONCE_BAD = "BAD";
+static const char *NONCE_MISSING = "MISSING";
+static const char *NONCE_OK = "OK";
+static const char *NONCE_SLOP = "SLOP";
+static const char *nonce_status;
+static long nonce_stamp_slop;
+static unsigned long nonce_stamp_slop_limit;
 
 static enum deny_action parse_deny_action(const char *var, const char *value)
 {
@@ -129,6 +149,14 @@
 		return 0;
 	}
 
+	if (strcmp(var, "receive.certnonceseed") == 0)
+		return git_config_string(&cert_nonce_seed, var, value);
+
+	if (strcmp(var, "receive.certnonceslop") == 0) {
+		nonce_stamp_slop_limit = git_config_ulong(var, value);
+		return 0;
+	}
+
 	return git_default_config(var, value, cb);
 }
 
@@ -137,15 +165,23 @@
 	if (ref_is_hidden(path))
 		return;
 
-	if (sent_capabilities)
+	if (sent_capabilities) {
 		packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
-	else
-		packet_write(1, "%s %s%c%s%s agent=%s\n",
-			     sha1_to_hex(sha1), path, 0,
-			     " report-status delete-refs side-band-64k quiet",
-			     prefer_ofs_delta ? " ofs-delta" : "",
-			     git_user_agent_sanitized());
-	sent_capabilities = 1;
+	} else {
+		struct strbuf cap = STRBUF_INIT;
+
+		strbuf_addstr(&cap,
+			      "report-status delete-refs side-band-64k quiet");
+		if (prefer_ofs_delta)
+			strbuf_addstr(&cap, " ofs-delta");
+		if (push_cert_nonce)
+			strbuf_addf(&cap, " push-cert=%s", push_cert_nonce);
+		strbuf_addf(&cap, " agent=%s", git_user_agent_sanitized());
+		packet_write(1, "%s %s%c%s\n",
+			     sha1_to_hex(sha1), path, 0, cap.buf);
+		strbuf_release(&cap);
+		sent_capabilities = 1;
+	}
 }
 
 static int show_ref_cb(const char *path, const unsigned char *sha1, int flag, void *unused)
@@ -252,10 +288,231 @@
 	return 0;
 }
 
+#define HMAC_BLOCK_SIZE 64
+
+static void hmac_sha1(unsigned char *out,
+		      const char *key_in, size_t key_len,
+		      const char *text, size_t text_len)
+{
+	unsigned char key[HMAC_BLOCK_SIZE];
+	unsigned char k_ipad[HMAC_BLOCK_SIZE];
+	unsigned char k_opad[HMAC_BLOCK_SIZE];
+	int i;
+	git_SHA_CTX ctx;
+
+	/* RFC 2104 2. (1) */
+	memset(key, '\0', HMAC_BLOCK_SIZE);
+	if (HMAC_BLOCK_SIZE < key_len) {
+		git_SHA1_Init(&ctx);
+		git_SHA1_Update(&ctx, key_in, key_len);
+		git_SHA1_Final(key, &ctx);
+	} else {
+		memcpy(key, key_in, key_len);
+	}
+
+	/* RFC 2104 2. (2) & (5) */
+	for (i = 0; i < sizeof(key); i++) {
+		k_ipad[i] = key[i] ^ 0x36;
+		k_opad[i] = key[i] ^ 0x5c;
+	}
+
+	/* RFC 2104 2. (3) & (4) */
+	git_SHA1_Init(&ctx);
+	git_SHA1_Update(&ctx, k_ipad, sizeof(k_ipad));
+	git_SHA1_Update(&ctx, text, text_len);
+	git_SHA1_Final(out, &ctx);
+
+	/* RFC 2104 2. (6) & (7) */
+	git_SHA1_Init(&ctx);
+	git_SHA1_Update(&ctx, k_opad, sizeof(k_opad));
+	git_SHA1_Update(&ctx, out, 20);
+	git_SHA1_Final(out, &ctx);
+}
+
+static char *prepare_push_cert_nonce(const char *path, unsigned long stamp)
+{
+	struct strbuf buf = STRBUF_INIT;
+	unsigned char sha1[20];
+
+	strbuf_addf(&buf, "%s:%lu", path, stamp);
+	hmac_sha1(sha1, buf.buf, buf.len, cert_nonce_seed, strlen(cert_nonce_seed));;
+	strbuf_release(&buf);
+
+	/* RFC 2104 5. HMAC-SHA1-80 */
+	strbuf_addf(&buf, "%lu-%.*s", stamp, 20, sha1_to_hex(sha1));
+	return strbuf_detach(&buf, NULL);
+}
+
+/*
+ * NEEDSWORK: reuse find_commit_header() from jk/commit-author-parsing
+ * after dropping "_commit" from its name and possibly moving it out
+ * of commit.c
+ */
+static char *find_header(const char *msg, size_t len, const char *key)
+{
+	int key_len = strlen(key);
+	const char *line = msg;
+
+	while (line && line < msg + len) {
+		const char *eol = strchrnul(line, '\n');
+
+		if ((msg + len <= eol) || line == eol)
+			return NULL;
+		if (line + key_len < eol &&
+		    !memcmp(line, key, key_len) && line[key_len] == ' ') {
+			int offset = key_len + 1;
+			return xmemdupz(line + offset, (eol - line) - offset);
+		}
+		line = *eol ? eol + 1 : NULL;
+	}
+	return NULL;
+}
+
+static const char *check_nonce(const char *buf, size_t len)
+{
+	char *nonce = find_header(buf, len, "nonce");
+	unsigned long stamp, ostamp;
+	char *bohmac, *expect = NULL;
+	const char *retval = NONCE_BAD;
+
+	if (!nonce) {
+		retval = NONCE_MISSING;
+		goto leave;
+	} else if (!push_cert_nonce) {
+		retval = NONCE_UNSOLICITED;
+		goto leave;
+	} else if (!strcmp(push_cert_nonce, nonce)) {
+		retval = NONCE_OK;
+		goto leave;
+	}
+
+	if (!stateless_rpc) {
+		/* returned nonce MUST match what we gave out earlier */
+		retval = NONCE_BAD;
+		goto leave;
+	}
+
+	/*
+	 * In stateless mode, we may be receiving a nonce issued by
+	 * another instance of the server that serving the same
+	 * repository, and the timestamps may not match, but the
+	 * nonce-seed and dir should match, so we can recompute and
+	 * report the time slop.
+	 *
+	 * In addition, when a nonce issued by another instance has
+	 * timestamp within receive.certnonceslop seconds, we pretend
+	 * as if we issued that nonce when reporting to the hook.
+	 */
+
+	/* nonce is concat(<seconds-since-epoch>, "-", <hmac>) */
+	if (*nonce <= '0' || '9' < *nonce) {
+		retval = NONCE_BAD;
+		goto leave;
+	}
+	stamp = strtoul(nonce, &bohmac, 10);
+	if (bohmac == nonce || bohmac[0] != '-') {
+		retval = NONCE_BAD;
+		goto leave;
+	}
+
+	expect = prepare_push_cert_nonce(service_dir, stamp);
+	if (strcmp(expect, nonce)) {
+		/* Not what we would have signed earlier */
+		retval = NONCE_BAD;
+		goto leave;
+	}
+
+	/*
+	 * By how many seconds is this nonce stale?  Negative value
+	 * would mean it was issued by another server with its clock
+	 * skewed in the future.
+	 */
+	ostamp = strtoul(push_cert_nonce, NULL, 10);
+	nonce_stamp_slop = (long)ostamp - (long)stamp;
+
+	if (nonce_stamp_slop_limit &&
+	    abs(nonce_stamp_slop) <= nonce_stamp_slop_limit) {
+		/*
+		 * Pretend as if the received nonce (which passes the
+		 * HMAC check, so it is not a forged by third-party)
+		 * is what we issued.
+		 */
+		free((void *)push_cert_nonce);
+		push_cert_nonce = xstrdup(nonce);
+		retval = NONCE_OK;
+	} else {
+		retval = NONCE_SLOP;
+	}
+
+leave:
+	free(nonce);
+	free(expect);
+	return retval;
+}
+
+static void prepare_push_cert_sha1(struct child_process *proc)
+{
+	static int already_done;
+
+	if (!push_cert.len)
+		return;
+
+	if (!already_done) {
+		struct strbuf gpg_output = STRBUF_INIT;
+		struct strbuf gpg_status = STRBUF_INIT;
+		int bogs /* beginning_of_gpg_sig */;
+
+		already_done = 1;
+		if (write_sha1_file(push_cert.buf, push_cert.len, "blob", push_cert_sha1))
+			hashclr(push_cert_sha1);
+
+		memset(&sigcheck, '\0', sizeof(sigcheck));
+		sigcheck.result = 'N';
+
+		bogs = parse_signature(push_cert.buf, push_cert.len);
+		if (verify_signed_buffer(push_cert.buf, bogs,
+					 push_cert.buf + bogs, push_cert.len - bogs,
+					 &gpg_output, &gpg_status) < 0) {
+			; /* error running gpg */
+		} else {
+			sigcheck.payload = push_cert.buf;
+			sigcheck.gpg_output = gpg_output.buf;
+			sigcheck.gpg_status = gpg_status.buf;
+			parse_gpg_output(&sigcheck);
+		}
+
+		strbuf_release(&gpg_output);
+		strbuf_release(&gpg_status);
+		nonce_status = check_nonce(push_cert.buf, bogs);
+	}
+	if (!is_null_sha1(push_cert_sha1)) {
+		argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT=%s",
+				 sha1_to_hex(push_cert_sha1));
+		argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT_SIGNER=%s",
+				 sigcheck.signer ? sigcheck.signer : "");
+		argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT_KEY=%s",
+				 sigcheck.key ? sigcheck.key : "");
+		argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT_STATUS=%c",
+				 sigcheck.result);
+		if (push_cert_nonce) {
+			argv_array_pushf(&proc->env_array,
+					 "GIT_PUSH_CERT_NONCE=%s",
+					 push_cert_nonce);
+			argv_array_pushf(&proc->env_array,
+					 "GIT_PUSH_CERT_NONCE_STATUS=%s",
+					 nonce_status);
+			if (nonce_status == NONCE_SLOP)
+				argv_array_pushf(&proc->env_array,
+						 "GIT_PUSH_CERT_NONCE_SLOP=%ld",
+						 nonce_stamp_slop);
+		}
+	}
+}
+
 typedef int (*feed_fn)(void *, const char **, size_t *);
 static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_state)
 {
-	struct child_process proc;
+	struct child_process proc = CHILD_PROCESS_INIT;
 	struct async muxer;
 	const char *argv[2];
 	int code;
@@ -266,7 +523,6 @@
 
 	argv[1] = NULL;
 
-	memset(&proc, 0, sizeof(proc));
 	proc.argv = argv;
 	proc.in = -1;
 	proc.stdout_to_stderr = 1;
@@ -281,6 +537,8 @@
 		proc.err = muxer.in;
 	}
 
+	prepare_push_cert_sha1(&proc);
+
 	code = start_command(&proc);
 	if (code) {
 		if (use_sideband)
@@ -288,6 +546,8 @@
 		return code;
 	}
 
+	sigchain_push(SIGPIPE, SIG_IGN);
+
 	while (1) {
 		const char *buf;
 		size_t n;
@@ -299,6 +559,9 @@
 	close(proc.in);
 	if (use_sideband)
 		finish_async(&muxer);
+
+	sigchain_pop(SIGPIPE);
+
 	return finish_command(&proc);
 }
 
@@ -350,7 +613,7 @@
 static int run_update_hook(struct command *cmd)
 {
 	const char *argv[5];
-	struct child_process proc;
+	struct child_process proc = CHILD_PROCESS_INIT;
 	int code;
 
 	argv[0] = find_hook("update");
@@ -362,7 +625,6 @@
 	argv[3] = sha1_to_hex(cmd->new_sha1);
 	argv[4] = NULL;
 
-	memset(&proc, 0, sizeof(proc));
 	proc.no_stdin = 1;
 	proc.stdout_to_stderr = 1;
 	proc.err = use_sideband ? -1 : 0;
@@ -438,7 +700,7 @@
 	uint32_t mask = 1 << (cmd->index % 32);
 	int i;
 
-	trace_printf_key("GIT_TRACE_SHALLOW",
+	trace_printf_key(&trace_shallow,
 			 "shallow: update_shallow_ref %s\n", cmd->ref_name);
 	for (i = 0; i < si->shallow->nr; i++)
 		if (si->used_shallow[i] &&
@@ -475,7 +737,6 @@
 	const char *namespaced_name;
 	unsigned char *old_sha1 = cmd->old_sha1;
 	unsigned char *new_sha1 = cmd->new_sha1;
-	struct ref_lock *lock;
 
 	/* only refs/... are allowed */
 	if (!starts_with(name, "refs/") || check_refname_format(name + 5, 0)) {
@@ -576,19 +837,28 @@
 		return NULL; /* good */
 	}
 	else {
+		struct strbuf err = STRBUF_INIT;
+		struct ref_transaction *transaction;
+
 		if (shallow_update && si->shallow_ref[cmd->index] &&
 		    update_shallow_ref(cmd, si))
 			return "shallow error";
 
-		lock = lock_any_ref_for_update(namespaced_name, old_sha1,
-					       0, NULL);
-		if (!lock) {
-			rp_error("failed to lock %s", name);
-			return "failed to lock";
+		transaction = ref_transaction_begin(&err);
+		if (!transaction ||
+		    ref_transaction_update(transaction, namespaced_name,
+					   new_sha1, old_sha1, 0, 1, "push",
+					   &err) ||
+		    ref_transaction_commit(transaction, &err)) {
+			ref_transaction_free(transaction);
+
+			rp_error("%s", err.buf);
+			strbuf_release(&err);
+			return "failed to update ref";
 		}
-		if (write_ref_sha1(lock, new_sha1, "push")) {
-			return "failed to write"; /* error() already called */
-		}
+
+		ref_transaction_free(transaction);
+		strbuf_release(&err);
 		return NULL; /* good */
 	}
 }
@@ -598,7 +868,7 @@
 	struct command *cmd;
 	int argc;
 	const char **argv;
-	struct child_process proc;
+	struct child_process proc = CHILD_PROCESS_INIT;
 	char *hook;
 
 	hook = find_hook("post-update");
@@ -614,17 +884,13 @@
 	argv[0] = hook;
 
 	for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
-		char *p;
 		if (cmd->error_string || cmd->did_not_exist)
 			continue;
-		p = xmalloc(strlen(cmd->ref_name) + 1);
-		strcpy(p, cmd->ref_name);
-		argv[argc] = p;
+		argv[argc] = xstrdup(cmd->ref_name);
 		argc++;
 	}
 	argv[argc] = NULL;
 
-	memset(&proc, 0, sizeof(proc));
 	proc.no_stdin = 1;
 	proc.stdout_to_stderr = 1;
 	proc.err = use_sideband ? -1 : 0;
@@ -648,7 +914,7 @@
 	int flag;
 
 	strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
-	dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag);
+	dst_name = resolve_ref_unsafe(buf.buf, 0, sha1, &flag);
 	strbuf_release(&buf);
 
 	if (!(flag & REF_ISSYMREF))
@@ -809,7 +1075,7 @@
 	check_aliased_updates(commands);
 
 	free(head_name_to_free);
-	head_name = head_name_to_free = resolve_refdup("HEAD", sha1, 0, NULL);
+	head_name = head_name_to_free = resolve_refdup("HEAD", 0, sha1, NULL);
 
 	checked_connectivity = 1;
 	for (cmd = commands; cmd; cmd = cmd->next) {
@@ -834,40 +1100,79 @@
 		      "the reported refs above");
 }
 
+static struct command **queue_command(struct command **tail,
+				      const char *line,
+				      int linelen)
+{
+	unsigned char old_sha1[20], new_sha1[20];
+	struct command *cmd;
+	const char *refname;
+	int reflen;
+
+	if (linelen < 83 ||
+	    line[40] != ' ' ||
+	    line[81] != ' ' ||
+	    get_sha1_hex(line, old_sha1) ||
+	    get_sha1_hex(line + 41, new_sha1))
+		die("protocol error: expected old/new/ref, got '%s'", line);
+
+	refname = line + 82;
+	reflen = linelen - 82;
+	cmd = xcalloc(1, sizeof(struct command) + reflen + 1);
+	hashcpy(cmd->old_sha1, old_sha1);
+	hashcpy(cmd->new_sha1, new_sha1);
+	memcpy(cmd->ref_name, refname, reflen);
+	cmd->ref_name[reflen] = '\0';
+	*tail = cmd;
+	return &cmd->next;
+}
+
+static void queue_commands_from_cert(struct command **tail,
+				     struct strbuf *push_cert)
+{
+	const char *boc, *eoc;
+
+	if (*tail)
+		die("protocol error: got both push certificate and unsigned commands");
+
+	boc = strstr(push_cert->buf, "\n\n");
+	if (!boc)
+		die("malformed push certificate %.*s", 100, push_cert->buf);
+	else
+		boc += 2;
+	eoc = push_cert->buf + parse_signature(push_cert->buf, push_cert->len);
+
+	while (boc < eoc) {
+		const char *eol = memchr(boc, '\n', eoc - boc);
+		tail = queue_command(tail, boc, eol ? eol - boc : eoc - eol);
+		boc = eol ? eol + 1 : eoc;
+	}
+}
+
 static struct command *read_head_info(struct sha1_array *shallow)
 {
 	struct command *commands = NULL;
 	struct command **p = &commands;
 	for (;;) {
 		char *line;
-		unsigned char old_sha1[20], new_sha1[20];
-		struct command *cmd;
-		char *refname;
-		int len, reflen;
+		int len, linelen;
 
 		line = packet_read_line(0, &len);
 		if (!line)
 			break;
 
 		if (len == 48 && starts_with(line, "shallow ")) {
-			if (get_sha1_hex(line + 8, old_sha1))
-				die("protocol error: expected shallow sha, got '%s'", line + 8);
-			sha1_array_append(shallow, old_sha1);
+			unsigned char sha1[20];
+			if (get_sha1_hex(line + 8, sha1))
+				die("protocol error: expected shallow sha, got '%s'",
+				    line + 8);
+			sha1_array_append(shallow, sha1);
 			continue;
 		}
 
-		if (len < 83 ||
-		    line[40] != ' ' ||
-		    line[81] != ' ' ||
-		    get_sha1_hex(line, old_sha1) ||
-		    get_sha1_hex(line + 41, new_sha1))
-			die("protocol error: expected old/new/ref, got '%s'",
-			    line);
-
-		refname = line + 82;
-		reflen = strlen(refname);
-		if (reflen + 82 < len) {
-			const char *feature_list = refname + reflen + 1;
+		linelen = strlen(line);
+		if (linelen < len) {
+			const char *feature_list = line + linelen + 1;
 			if (parse_feature_request(feature_list, "report-status"))
 				report_status = 1;
 			if (parse_feature_request(feature_list, "side-band-64k"))
@@ -875,13 +1180,34 @@
 			if (parse_feature_request(feature_list, "quiet"))
 				quiet = 1;
 		}
-		cmd = xcalloc(1, sizeof(struct command) + len - 80);
-		hashcpy(cmd->old_sha1, old_sha1);
-		hashcpy(cmd->new_sha1, new_sha1);
-		memcpy(cmd->ref_name, line + 82, len - 81);
-		*p = cmd;
-		p = &cmd->next;
+
+		if (!strcmp(line, "push-cert")) {
+			int true_flush = 0;
+			char certbuf[1024];
+
+			for (;;) {
+				len = packet_read(0, NULL, NULL,
+						  certbuf, sizeof(certbuf), 0);
+				if (!len) {
+					true_flush = 1;
+					break;
+				}
+				if (!strcmp(certbuf, "push-cert-end\n"))
+					break; /* end of cert */
+				strbuf_addstr(&push_cert, certbuf);
+			}
+
+			if (true_flush)
+				break;
+			continue;
+		}
+
+		p = queue_command(p, line, linelen);
 	}
+
+	if (push_cert.len)
+		queue_commands_from_cert(p, &push_cert);
+
 	return commands;
 }
 
@@ -910,11 +1236,10 @@
 static const char *unpack(int err_fd, struct shallow_info *si)
 {
 	struct pack_header hdr;
-	struct argv_array av = ARGV_ARRAY_INIT;
 	const char *hdr_err;
 	int status;
 	char hdr_arg[38];
-	struct child_process child;
+	struct child_process child = CHILD_PROCESS_INIT;
 	int fsck_objects = (receive_fsck_objects >= 0
 			    ? receive_fsck_objects
 			    : transfer_fsck_objects >= 0
@@ -933,17 +1258,16 @@
 
 	if (si->nr_ours || si->nr_theirs) {
 		alt_shallow_file = setup_temporary_shallow(si->shallow);
-		argv_array_pushl(&av, "--shallow-file", alt_shallow_file, NULL);
+		argv_array_push(&child.args, "--shallow-file");
+		argv_array_push(&child.args, alt_shallow_file);
 	}
 
-	memset(&child, 0, sizeof(child));
 	if (ntohl(hdr.hdr_entries) < unpack_limit) {
-		argv_array_pushl(&av, "unpack-objects", hdr_arg, NULL);
+		argv_array_pushl(&child.args, "unpack-objects", hdr_arg, NULL);
 		if (quiet)
-			argv_array_push(&av, "-q");
+			argv_array_push(&child.args, "-q");
 		if (fsck_objects)
-			argv_array_push(&av, "--strict");
-		child.argv = av.argv;
+			argv_array_push(&child.args, "--strict");
 		child.no_stdout = 1;
 		child.err = err_fd;
 		child.git_cmd = 1;
@@ -958,13 +1282,12 @@
 		if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
 			strcpy(keep_arg + s, "localhost");
 
-		argv_array_pushl(&av, "index-pack",
+		argv_array_pushl(&child.args, "index-pack",
 				 "--stdin", hdr_arg, keep_arg, NULL);
 		if (fsck_objects)
-			argv_array_push(&av, "--strict");
+			argv_array_push(&child.args, "--strict");
 		if (fix_thin)
-			argv_array_push(&av, "--fix-thin");
-		child.argv = av.argv;
+			argv_array_push(&child.args, "--fix-thin");
 		child.out = -1;
 		child.err = err_fd;
 		child.git_cmd = 1;
@@ -1123,9 +1446,7 @@
 int cmd_receive_pack(int argc, const char **argv, const char *prefix)
 {
 	int advertise_refs = 0;
-	int stateless_rpc = 0;
 	int i;
-	char *dir = NULL;
 	struct command *commands;
 	struct sha1_array shallow = SHA1_ARRAY_INIT;
 	struct sha1_array ref = SHA1_ARRAY_INIT;
@@ -1158,19 +1479,21 @@
 
 			usage(receive_pack_usage);
 		}
-		if (dir)
+		if (service_dir)
 			usage(receive_pack_usage);
-		dir = xstrdup(arg);
+		service_dir = arg;
 	}
-	if (!dir)
+	if (!service_dir)
 		usage(receive_pack_usage);
 
 	setup_path();
 
-	if (!enter_repo(dir, 0))
-		die("'%s' does not appear to be a git repository", dir);
+	if (!enter_repo(service_dir, 0))
+		die("'%s' does not appear to be a git repository", service_dir);
 
 	git_config(receive_pack_config, NULL);
+	if (cert_nonce_seed)
+		push_cert_nonce = prepare_push_cert_nonce(service_dir, time(NULL));
 
 	if (0 <= transfer_unpack_limit)
 		unpack_limit = transfer_unpack_limit;
@@ -1215,5 +1538,6 @@
 		packet_flush(1);
 	sha1_array_clear(&shallow);
 	sha1_array_clear(&ref);
+	free((void *)push_cert_nonce);
 	return 0;
 }
diff --git a/builtin/reflog.c b/builtin/reflog.c
index c12a9784..2d85d26 100644
--- a/builtin/reflog.c
+++ b/builtin/reflog.c
@@ -1,5 +1,5 @@
-#include "cache.h"
 #include "builtin.h"
+#include "lockfile.h"
 #include "commit.h"
 #include "refs.h"
 #include "dir.h"
@@ -369,7 +369,7 @@
 	if (!lock)
 		return error("cannot lock ref '%s'", ref);
 	log_file = git_pathdup("logs/%s", ref);
-	if (!file_exists(log_file))
+	if (!reflog_exists(ref))
 		goto finish;
 	if (!cmd->dry_run) {
 		newlog_path = git_pathdup("logs/%s.lock", ref);
@@ -431,7 +431,7 @@
 			 write_str_in_full(lock->lock_fd, "\n") != 1 ||
 			 close_ref(lock) < 0)) {
 			status |= error("Couldn't write %s",
-				lock->lk->filename);
+					lock->lk->filename.buf);
 			unlink(newlog_path);
 		} else if (rename(newlog_path, log_file)) {
 			status |= error("cannot rename %s to %s",
@@ -649,7 +649,7 @@
 		init_revisions(&cb.revs, prefix);
 		if (cb.verbose)
 			printf("Marking reachable objects...");
-		mark_reachable_objects(&cb.revs, 0, NULL);
+		mark_reachable_objects(&cb.revs, 0, 0, NULL);
 		if (cb.verbose)
 			putchar('\n');
 	}
diff --git a/builtin/remote-ext.c b/builtin/remote-ext.c
index 692c834..3b8c22c 100644
--- a/builtin/remote-ext.c
+++ b/builtin/remote-ext.c
@@ -30,16 +30,14 @@
 	size_t rpos = 0;
 	int escape = 0;
 	char special = 0;
-	size_t psoff = 0;
+	const char *service_noprefix = service;
 	struct strbuf ret = STRBUF_INIT;
 
-	/* Calculate prefix length for \s and lengths for \s and \S */
-	if (!strncmp(service, "git-", 4))
-		psoff = 4;
+	skip_prefix(service_noprefix, "git-", &service_noprefix);
 
 	/* Pass the service to command. */
 	setenv("GIT_EXT_SERVICE", service, 1);
-	setenv("GIT_EXT_SERVICE_NOPREFIX", service + psoff, 1);
+	setenv("GIT_EXT_SERVICE_NOPREFIX", service_noprefix, 1);
 
 	/* Scan the length of argument. */
 	while (str[rpos] && (escape || str[rpos] != ' ')) {
@@ -85,7 +83,7 @@
 				strbuf_addch(&ret, str[rpos]);
 				break;
 			case 's':
-				strbuf_addstr(&ret, service + psoff);
+				strbuf_addstr(&ret, service_noprefix);
 				break;
 			case 'S':
 				strbuf_addstr(&ret, service);
@@ -179,9 +177,8 @@
 static int run_child(const char *arg, const char *service)
 {
 	int r;
-	struct child_process child;
+	struct child_process child = CHILD_PROCESS_INIT;
 
-	memset(&child, 0, sizeof(child));
 	child.in = -1;
 	child.out = -1;
 	child.err = 0;
diff --git a/builtin/remote.c b/builtin/remote.c
index c9102e8..7f28f92 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -250,9 +250,7 @@
 
 static const char *abbrev_ref(const char *name, const char *prefix)
 {
-	const char *abbrev = skip_prefix(name, prefix);
-	if (abbrev)
-		return abbrev;
+	skip_prefix(name, prefix, &name);
 	return name;
 }
 #define abbrev_branch(name) abbrev_ref((name), "refs/heads/")
@@ -265,16 +263,17 @@
 		struct string_list_item *item;
 		struct branch_info *info;
 		enum { REMOTE, MERGE, REBASE } type;
+		size_t key_len;
 
 		key += 7;
-		if (ends_with(key, ".remote")) {
-			name = xstrndup(key, strlen(key) - 7);
+		if (strip_suffix(key, ".remote", &key_len)) {
+			name = xmemdupz(key, key_len);
 			type = REMOTE;
-		} else if (ends_with(key, ".merge")) {
-			name = xstrndup(key, strlen(key) - 6);
+		} else if (strip_suffix(key, ".merge", &key_len)) {
+			name = xmemdupz(key, key_len);
 			type = MERGE;
-		} else if (ends_with(key, ".rebase")) {
-			name = xstrndup(key, strlen(key) - 7);
+		} else if (strip_suffix(key, ".rebase", &key_len)) {
+			name = xmemdupz(key, key_len);
 			type = REBASE;
 		} else
 			return 0;
@@ -568,7 +567,8 @@
 	strbuf_addf(&buf, "refs/remotes/%s/", rename->old);
 	if (starts_with(refname, buf.buf)) {
 		item = string_list_append(rename->remote_branches, xstrdup(refname));
-		symref = resolve_ref_unsafe(refname, orig_sha1, 1, &flag);
+		symref = resolve_ref_unsafe(refname, RESOLVE_REF_READING,
+					    orig_sha1, &flag);
 		if (flag & REF_ISSYMREF)
 			item->util = xstrdup(symref);
 		else
@@ -704,7 +704,7 @@
 		int flag = 0;
 		unsigned char sha1[20];
 
-		read_ref_full(item->string, sha1, 1, &flag);
+		read_ref_full(item->string, RESOLVE_REF_READING, sha1, &flag);
 		if (!(flag & REF_ISSYMREF))
 			continue;
 		if (delete_ref(item->string, NULL, REF_NODEREF))
@@ -749,13 +749,16 @@
 
 static int remove_branches(struct string_list *branches)
 {
+	struct strbuf err = STRBUF_INIT;
 	const char **branch_names;
 	int i, result = 0;
 
 	branch_names = xmalloc(branches->nr * sizeof(*branch_names));
 	for (i = 0; i < branches->nr; i++)
 		branch_names[i] = branches->items[i].string;
-	result |= repack_without_refs(branch_names, branches->nr);
+	if (repack_without_refs(branch_names, branches->nr, &err))
+		result |= error("%s", err.buf);
+	strbuf_release(&err);
 	free(branch_names);
 
 	for (i = 0; i < branches->nr; i++) {
@@ -1332,8 +1335,13 @@
 		delete_refs = xmalloc(states.stale.nr * sizeof(*delete_refs));
 		for (i = 0; i < states.stale.nr; i++)
 			delete_refs[i] = states.stale.items[i].util;
-		if (!dry_run)
-			result |= repack_without_refs(delete_refs, states.stale.nr);
+		if (!dry_run) {
+			struct strbuf err = STRBUF_INIT;
+			if (repack_without_refs(delete_refs, states.stale.nr,
+						&err))
+				result |= error("%s", err.buf);
+			strbuf_release(&err);
+		}
 		free(delete_refs);
 	}
 
diff --git a/builtin/repack.c b/builtin/repack.c
index 36c1cf9..2845620 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -10,7 +10,7 @@
 
 static int delta_base_offset = 1;
 static int pack_kept_objects = -1;
-static int write_bitmaps = -1;
+static int write_bitmaps;
 static char *packdir, *packtmp;
 
 static const char *const git_repack_usage[] = {
@@ -28,7 +28,8 @@
 		pack_kept_objects = git_config_bool(var, value);
 		return 0;
 	}
-	if (!strcmp(var, "pack.writebitmaps")) {
+	if (!strcmp(var, "repack.writebitmaps") ||
+	    !strcmp(var, "pack.writebitmaps")) {
 		write_bitmaps = git_config_bool(var, value);
 		return 0;
 	}
@@ -82,16 +83,15 @@
 	DIR *dir;
 	struct dirent *e;
 	char *fname;
-	size_t len;
 
 	if (!(dir = opendir(packdir)))
 		return;
 
 	while ((e = readdir(dir)) != NULL) {
-		if (!ends_with(e->d_name, ".pack"))
+		size_t len;
+		if (!strip_suffix(e->d_name, ".pack", &len))
 			continue;
 
-		len = strlen(e->d_name) - strlen(".pack");
 		fname = xmemdupz(e->d_name, len);
 
 		if (!file_exists(mkpath("%s/%s.keep", packdir, fname)))
@@ -133,7 +133,7 @@
 		{".idx"},
 		{".bitmap", 1},
 	};
-	struct child_process cmd;
+	struct child_process cmd = CHILD_PROCESS_INIT;
 	struct string_list_item *item;
 	struct argv_array cmd_args = ARGV_ARRAY_INIT;
 	struct string_list names = STRING_LIST_INIT_DUP;
@@ -195,7 +195,7 @@
 				git_repack_usage, 0);
 
 	if (pack_kept_objects < 0)
-		pack_kept_objects = write_bitmaps > 0;
+		pack_kept_objects = write_bitmaps;
 
 	packdir = mkpathdup("%s/pack", get_object_directory());
 	packtmp = mkpathdup("%s/.tmp-%d-pack", packdir, (int)getpid());
@@ -209,6 +209,7 @@
 	argv_array_push(&cmd_args, "--non-empty");
 	argv_array_push(&cmd_args, "--all");
 	argv_array_push(&cmd_args, "--reflog");
+	argv_array_push(&cmd_args, "--indexed-objects");
 	if (window)
 		argv_array_pushf(&cmd_args, "--window=%s", window);
 	if (window_memory)
@@ -221,9 +222,8 @@
 		argv_array_pushf(&cmd_args, "--no-reuse-delta");
 	if (no_reuse_object)
 		argv_array_pushf(&cmd_args, "--no-reuse-object");
-	if (write_bitmaps >= 0)
-		argv_array_pushf(&cmd_args, "--%swrite-bitmap-index",
-				 write_bitmaps ? "" : "no-");
+	if (write_bitmaps)
+		argv_array_push(&cmd_args, "--write-bitmap-index");
 
 	if (pack_everything & ALL_INTO_ONE) {
 		get_non_kept_pack_filenames(&existing_packs);
@@ -251,7 +251,6 @@
 
 	argv_array_push(&cmd_args, packtmp);
 
-	memset(&cmd, 0, sizeof(cmd));
 	cmd.argv = cmd_args.argv;
 	cmd.git_cmd = 1;
 	cmd.out = -1;
@@ -379,6 +378,7 @@
 	/* End of pack replacement. */
 
 	if (delete_redundant) {
+		int opts = 0;
 		sort_string_list(&names);
 		for_each_string_list_item(item, &existing_packs) {
 			char *sha1;
@@ -389,25 +389,13 @@
 			if (!string_list_has_string(&names, sha1))
 				remove_redundant_pack(packdir, item->string);
 		}
-		argv_array_push(&cmd_args, "prune-packed");
-		if (quiet)
-			argv_array_push(&cmd_args, "--quiet");
-
-		memset(&cmd, 0, sizeof(cmd));
-		cmd.argv = cmd_args.argv;
-		cmd.git_cmd = 1;
-		run_command(&cmd);
-		argv_array_clear(&cmd_args);
+		if (!quiet && isatty(2))
+			opts |= PRUNE_PACKED_VERBOSE;
+		prune_packed_objects(opts);
 	}
 
-	if (!no_update_server_info) {
-		argv_array_push(&cmd_args, "update-server-info");
-		memset(&cmd, 0, sizeof(cmd));
-		cmd.argv = cmd_args.argv;
-		cmd.git_cmd = 1;
-		run_command(&cmd);
-		argv_array_clear(&cmd_args);
-	}
+	if (!no_update_server_info)
+		update_server_info(0);
 	remove_temporary_files();
 	string_list_clear(&names, 0);
 	string_list_clear(&rollback, 0);
diff --git a/builtin/replace.c b/builtin/replace.c
index b62420a..85d39b5 100644
--- a/builtin/replace.c
+++ b/builtin/replace.c
@@ -12,18 +12,22 @@
 #include "builtin.h"
 #include "refs.h"
 #include "parse-options.h"
+#include "run-command.h"
+#include "tag.h"
 
 static const char * const git_replace_usage[] = {
 	N_("git replace [-f] <object> <replacement>"),
+	N_("git replace [-f] --edit <object>"),
+	N_("git replace [-f] --graft <commit> [<parent>...]"),
 	N_("git replace -d <object>..."),
 	N_("git replace [--format=<format>] [-l [<pattern>]]"),
 	NULL
 };
 
 enum replace_format {
-      REPLACE_FORMAT_SHORT,
-      REPLACE_FORMAT_MEDIUM,
-      REPLACE_FORMAT_LONG
+	REPLACE_FORMAT_SHORT,
+	REPLACE_FORMAT_MEDIUM,
+	REPLACE_FORMAT_LONG
 };
 
 struct show_data {
@@ -123,26 +127,37 @@
 	return 0;
 }
 
-static int replace_object(const char *object_ref, const char *replace_ref,
-			  int force)
+static void check_ref_valid(unsigned char object[20],
+			    unsigned char prev[20],
+			    char *ref,
+			    int ref_size,
+			    int force)
 {
-	unsigned char object[20], prev[20], repl[20];
-	enum object_type obj_type, repl_type;
-	char ref[PATH_MAX];
-	struct ref_lock *lock;
-
-	if (get_sha1(object_ref, object))
-		die("Failed to resolve '%s' as a valid ref.", object_ref);
-	if (get_sha1(replace_ref, repl))
-		die("Failed to resolve '%s' as a valid ref.", replace_ref);
-
-	if (snprintf(ref, sizeof(ref),
+	if (snprintf(ref, ref_size,
 		     "refs/replace/%s",
-		     sha1_to_hex(object)) > sizeof(ref) - 1)
+		     sha1_to_hex(object)) > ref_size - 1)
 		die("replace ref name too long: %.*s...", 50, ref);
 	if (check_refname_format(ref, 0))
 		die("'%s' is not a valid ref name.", ref);
 
+	if (read_ref(ref, prev))
+		hashclr(prev);
+	else if (!force)
+		die("replace ref '%s' already exists", ref);
+}
+
+static int replace_object_sha1(const char *object_ref,
+			       unsigned char object[20],
+			       const char *replace_ref,
+			       unsigned char repl[20],
+			       int force)
+{
+	unsigned char prev[20];
+	enum object_type obj_type, repl_type;
+	char ref[PATH_MAX];
+	struct ref_transaction *transaction;
+	struct strbuf err = STRBUF_INIT;
+
 	obj_type = sha1_object_info(object, NULL);
 	repl_type = sha1_object_info(repl, NULL);
 	if (!force && obj_type != repl_type)
@@ -152,28 +167,274 @@
 		    object_ref, typename(obj_type),
 		    replace_ref, typename(repl_type));
 
-	if (read_ref(ref, prev))
-		hashclr(prev);
-	else if (!force)
-		die("replace ref '%s' already exists", ref);
+	check_ref_valid(object, prev, ref, sizeof(ref), force);
 
-	lock = lock_any_ref_for_update(ref, prev, 0, NULL);
-	if (!lock)
-		die("%s: cannot lock the ref", ref);
-	if (write_ref_sha1(lock, repl, NULL) < 0)
-		die("%s: cannot update the ref", ref);
+	transaction = ref_transaction_begin(&err);
+	if (!transaction ||
+	    ref_transaction_update(transaction, ref, repl, prev,
+				   0, 1, NULL, &err) ||
+	    ref_transaction_commit(transaction, &err))
+		die("%s", err.buf);
 
+	ref_transaction_free(transaction);
 	return 0;
 }
 
+static int replace_object(const char *object_ref, const char *replace_ref, int force)
+{
+	unsigned char object[20], repl[20];
+
+	if (get_sha1(object_ref, object))
+		die("Failed to resolve '%s' as a valid ref.", object_ref);
+	if (get_sha1(replace_ref, repl))
+		die("Failed to resolve '%s' as a valid ref.", replace_ref);
+
+	return replace_object_sha1(object_ref, object, replace_ref, repl, force);
+}
+
+/*
+ * Write the contents of the object named by "sha1" to the file "filename".
+ * If "raw" is true, then the object's raw contents are printed according to
+ * "type". Otherwise, we pretty-print the contents for human editing.
+ */
+static void export_object(const unsigned char *sha1, enum object_type type,
+			  int raw, const char *filename)
+{
+	struct child_process cmd = CHILD_PROCESS_INIT;
+	int fd;
+
+	fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+	if (fd < 0)
+		die_errno("unable to open %s for writing", filename);
+
+	argv_array_push(&cmd.args, "--no-replace-objects");
+	argv_array_push(&cmd.args, "cat-file");
+	if (raw)
+		argv_array_push(&cmd.args, typename(type));
+	else
+		argv_array_push(&cmd.args, "-p");
+	argv_array_push(&cmd.args, sha1_to_hex(sha1));
+	cmd.git_cmd = 1;
+	cmd.out = fd;
+
+	if (run_command(&cmd))
+		die("cat-file reported failure");
+}
+
+/*
+ * Read a previously-exported (and possibly edited) object back from "filename",
+ * interpreting it as "type", and writing the result to the object database.
+ * The sha1 of the written object is returned via sha1.
+ */
+static void import_object(unsigned char *sha1, enum object_type type,
+			  int raw, const char *filename)
+{
+	int fd;
+
+	fd = open(filename, O_RDONLY);
+	if (fd < 0)
+		die_errno("unable to open %s for reading", filename);
+
+	if (!raw && type == OBJ_TREE) {
+		const char *argv[] = { "mktree", NULL };
+		struct child_process cmd = CHILD_PROCESS_INIT;
+		struct strbuf result = STRBUF_INIT;
+
+		cmd.argv = argv;
+		cmd.git_cmd = 1;
+		cmd.in = fd;
+		cmd.out = -1;
+
+		if (start_command(&cmd))
+			die("unable to spawn mktree");
+
+		if (strbuf_read(&result, cmd.out, 41) < 0)
+			die_errno("unable to read from mktree");
+		close(cmd.out);
+
+		if (finish_command(&cmd))
+			die("mktree reported failure");
+		if (get_sha1_hex(result.buf, sha1) < 0)
+			die("mktree did not return an object name");
+
+		strbuf_release(&result);
+	} else {
+		struct stat st;
+		int flags = HASH_FORMAT_CHECK | HASH_WRITE_OBJECT;
+
+		if (fstat(fd, &st) < 0)
+			die_errno("unable to fstat %s", filename);
+		if (index_fd(sha1, fd, &st, type, NULL, flags) < 0)
+			die("unable to write object to database");
+		/* index_fd close()s fd for us */
+	}
+
+	/*
+	 * No need to close(fd) here; both run-command and index-fd
+	 * will have done it for us.
+	 */
+}
+
+static int edit_and_replace(const char *object_ref, int force, int raw)
+{
+	char *tmpfile = git_pathdup("REPLACE_EDITOBJ");
+	enum object_type type;
+	unsigned char old[20], new[20], prev[20];
+	char ref[PATH_MAX];
+
+	if (get_sha1(object_ref, old) < 0)
+		die("Not a valid object name: '%s'", object_ref);
+
+	type = sha1_object_info(old, NULL);
+	if (type < 0)
+		die("unable to get object type for %s", sha1_to_hex(old));
+
+	check_ref_valid(old, prev, ref, sizeof(ref), force);
+
+	export_object(old, type, raw, tmpfile);
+	if (launch_editor(tmpfile, NULL, NULL) < 0)
+		die("editing object file failed");
+	import_object(new, type, raw, tmpfile);
+
+	free(tmpfile);
+
+	if (!hashcmp(old, new))
+		return error("new object is the same as the old one: '%s'", sha1_to_hex(old));
+
+	return replace_object_sha1(object_ref, old, "replacement", new, force);
+}
+
+static void replace_parents(struct strbuf *buf, int argc, const char **argv)
+{
+	struct strbuf new_parents = STRBUF_INIT;
+	const char *parent_start, *parent_end;
+	int i;
+
+	/* find existing parents */
+	parent_start = buf->buf;
+	parent_start += 46; /* "tree " + "hex sha1" + "\n" */
+	parent_end = parent_start;
+
+	while (starts_with(parent_end, "parent "))
+		parent_end += 48; /* "parent " + "hex sha1" + "\n" */
+
+	/* prepare new parents */
+	for (i = 0; i < argc; i++) {
+		unsigned char sha1[20];
+		if (get_sha1(argv[i], sha1) < 0)
+			die(_("Not a valid object name: '%s'"), argv[i]);
+		lookup_commit_or_die(sha1, argv[i]);
+		strbuf_addf(&new_parents, "parent %s\n", sha1_to_hex(sha1));
+	}
+
+	/* replace existing parents with new ones */
+	strbuf_splice(buf, parent_start - buf->buf, parent_end - parent_start,
+		      new_parents.buf, new_parents.len);
+
+	strbuf_release(&new_parents);
+}
+
+struct check_mergetag_data {
+	int argc;
+	const char **argv;
+};
+
+static void check_one_mergetag(struct commit *commit,
+			       struct commit_extra_header *extra,
+			       void *data)
+{
+	struct check_mergetag_data *mergetag_data = (struct check_mergetag_data *)data;
+	const char *ref = mergetag_data->argv[0];
+	unsigned char tag_sha1[20];
+	struct tag *tag;
+	int i;
+
+	hash_sha1_file(extra->value, extra->len, typename(OBJ_TAG), tag_sha1);
+	tag = lookup_tag(tag_sha1);
+	if (!tag)
+		die(_("bad mergetag in commit '%s'"), ref);
+	if (parse_tag_buffer(tag, extra->value, extra->len))
+		die(_("malformed mergetag in commit '%s'"), ref);
+
+	/* 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)
+			die(_("Not a valid object name: '%s'"), mergetag_data->argv[i]);
+		if (!hashcmp(tag->tagged->sha1, sha1))
+			return; /* found */
+	}
+
+	die(_("original commit '%s' contains mergetag '%s' that is discarded; "
+	      "use --edit instead of --graft"), ref, sha1_to_hex(tag_sha1));
+}
+
+static void check_mergetags(struct commit *commit, int argc, const char **argv)
+{
+	struct check_mergetag_data mergetag_data;
+
+	mergetag_data.argc = argc;
+	mergetag_data.argv = argv;
+	for_each_mergetag(check_one_mergetag, commit, &mergetag_data);
+}
+
+static int create_graft(int argc, const char **argv, int force)
+{
+	unsigned char old[20], new[20];
+	const char *old_ref = argv[0];
+	struct commit *commit;
+	struct strbuf buf = STRBUF_INIT;
+	const char *buffer;
+	unsigned long size;
+
+	if (get_sha1(old_ref, old) < 0)
+		die(_("Not a valid object name: '%s'"), old_ref);
+	commit = lookup_commit_or_die(old, old_ref);
+
+	buffer = get_commit_buffer(commit, &size);
+	strbuf_add(&buf, buffer, size);
+	unuse_commit_buffer(commit, buffer);
+
+	replace_parents(&buf, argc - 1, &argv[1]);
+
+	if (remove_signature(&buf)) {
+		warning(_("the original commit '%s' has a gpg signature."), old_ref);
+		warning(_("the signature will be removed in the replacement commit!"));
+	}
+
+	check_mergetags(commit, argc, argv);
+
+	if (write_sha1_file(buf.buf, buf.len, commit_type, new))
+		die(_("could not write replacement commit for: '%s'"), old_ref);
+
+	strbuf_release(&buf);
+
+	if (!hashcmp(old, new))
+		return error("new commit is the same as the old one: '%s'", sha1_to_hex(old));
+
+	return replace_object_sha1(old_ref, old, "replacement", new, force);
+}
+
 int cmd_replace(int argc, const char **argv, const char *prefix)
 {
-	int list = 0, delete = 0, force = 0;
+	int force = 0;
+	int raw = 0;
 	const char *format = NULL;
+	enum {
+		MODE_UNSPECIFIED = 0,
+		MODE_LIST,
+		MODE_DELETE,
+		MODE_EDIT,
+		MODE_GRAFT,
+		MODE_REPLACE
+	} cmdmode = MODE_UNSPECIFIED;
 	struct option options[] = {
-		OPT_BOOL('l', "list", &list, N_("list replace refs")),
-		OPT_BOOL('d', "delete", &delete, N_("delete replace refs")),
+		OPT_CMDMODE('l', "list", &cmdmode, N_("list replace refs"), MODE_LIST),
+		OPT_CMDMODE('d', "delete", &cmdmode, N_("delete replace refs"), MODE_DELETE),
+		OPT_CMDMODE('e', "edit", &cmdmode, N_("edit existing object"), MODE_EDIT),
+		OPT_CMDMODE('g', "graft", &cmdmode, N_("change a commit's parents"), MODE_GRAFT),
 		OPT_BOOL('f', "force", &force, N_("replace the ref if it exists")),
+		OPT_BOOL(0, "raw", &raw, N_("do not pretty-print contents for --edit")),
 		OPT_STRING(0, "format", &format, N_("format"), N_("use this format")),
 		OPT_END()
 	};
@@ -182,44 +443,56 @@
 
 	argc = parse_options(argc, argv, prefix, options, git_replace_usage, 0);
 
-	if (list && delete)
-		usage_msg_opt("-l and -d cannot be used together",
+	if (!cmdmode)
+		cmdmode = argc ? MODE_REPLACE : MODE_LIST;
+
+	if (format && cmdmode != MODE_LIST)
+		usage_msg_opt("--format cannot be used when not listing",
 			      git_replace_usage, options);
 
-	if (format && delete)
-		usage_msg_opt("--format and -d cannot be used together",
+	if (force &&
+	    cmdmode != MODE_REPLACE &&
+	    cmdmode != MODE_EDIT &&
+	    cmdmode != MODE_GRAFT)
+		usage_msg_opt("-f only makes sense when writing a replacement",
 			      git_replace_usage, options);
 
-	if (force && (list || delete))
-		usage_msg_opt("-f cannot be used with -d or -l",
+	if (raw && cmdmode != MODE_EDIT)
+		usage_msg_opt("--raw only makes sense with --edit",
 			      git_replace_usage, options);
 
-	/* Delete refs */
-	if (delete) {
+	switch (cmdmode) {
+	case MODE_DELETE:
 		if (argc < 1)
 			usage_msg_opt("-d needs at least one argument",
 				      git_replace_usage, options);
 		return for_each_replace_name(argv, delete_replace_ref);
-	}
 
-	/* Replace object */
-	if (!list && argc) {
+	case MODE_REPLACE:
 		if (argc != 2)
 			usage_msg_opt("bad number of arguments",
 				      git_replace_usage, options);
-		if (format)
-			usage_msg_opt("--format cannot be used when not listing",
-				      git_replace_usage, options);
 		return replace_object(argv[0], argv[1], force);
+
+	case MODE_EDIT:
+		if (argc != 1)
+			usage_msg_opt("-e needs exactly one argument",
+				      git_replace_usage, options);
+		return edit_and_replace(argv[0], force, raw);
+
+	case MODE_GRAFT:
+		if (argc < 1)
+			usage_msg_opt("-g needs at least one argument",
+				      git_replace_usage, options);
+		return create_graft(argc, argv, force);
+
+	case MODE_LIST:
+		if (argc > 1)
+			usage_msg_opt("only one pattern can be given with -l",
+				      git_replace_usage, options);
+		return list_replace_refs(argv[0], format);
+
+	default:
+		die("BUG: invalid cmdmode %d", (int)cmdmode);
 	}
-
-	/* List refs, even if "list" is not set */
-	if (argc > 1)
-		usage_msg_opt("only one pattern can be given with -l",
-			      git_replace_usage, options);
-	if (force)
-		usage_msg_opt("-f needs some arguments",
-			      git_replace_usage, options);
-
-	return list_replace_refs(argv[0], format);
 }
diff --git a/builtin/reset.c b/builtin/reset.c
index 6bd6245..4c08ddc 100644
--- a/builtin/reset.c
+++ b/builtin/reset.c
@@ -8,6 +8,7 @@
  * Copyright (c) 2005, 2006 Linus Torvalds and Junio C Hamano
  */
 #include "builtin.h"
+#include "lockfile.h"
 #include "tag.h"
 #include "object.h"
 #include "commit.h"
@@ -84,7 +85,7 @@
 
 	if (reset_type == MIXED || reset_type == HARD) {
 		tree = parse_tree_indirect(sha1);
-		prime_cache_tree(&active_cache_tree, tree);
+		prime_cache_tree(&the_index, tree);
 	}
 
 	return 0;
@@ -252,11 +253,13 @@
 	if (!get_sha1("HEAD", sha1_orig)) {
 		orig = sha1_orig;
 		set_reflog_message(&msg, "updating ORIG_HEAD", NULL);
-		update_ref(msg.buf, "ORIG_HEAD", orig, old_orig, 0, MSG_ON_ERR);
+		update_ref(msg.buf, "ORIG_HEAD", orig, old_orig, 0,
+			   UPDATE_REFS_MSG_ON_ERR);
 	} else if (old_orig)
 		delete_ref("ORIG_HEAD", old_orig, 0);
 	set_reflog_message(&msg, "updating HEAD", rev);
-	update_ref_status = update_ref(msg.buf, "HEAD", sha1, orig, 0, MSG_ON_ERR);
+	update_ref_status = update_ref(msg.buf, "HEAD", sha1, orig, 0,
+				       UPDATE_REFS_MSG_ON_ERR);
 	strbuf_release(&msg);
 	return update_ref_status;
 }
@@ -351,7 +354,7 @@
 
 	if (reset_type != SOFT) {
 		struct lock_file *lock = xcalloc(1, sizeof(*lock));
-		int newfd = hold_locked_index(lock, 1);
+		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))
@@ -367,8 +370,7 @@
 				die(_("Could not reset index file to revision '%s'."), rev);
 		}
 
-		if (write_cache(newfd, active_cache, active_nr) ||
-		    commit_locked_index(lock))
+		if (write_locked_index(&the_index, lock, COMMIT_LOCK))
 			die(_("Could not write new index file."));
 	}
 
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 1a6122d..35d3c43 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -11,6 +11,7 @@
 #include "parse-options.h"
 #include "diff.h"
 #include "revision.h"
+#include "split-index.h"
 
 #define DO_REVS		1
 #define DO_NOREV	2
@@ -150,6 +151,7 @@
 				error("refname '%s' is ambiguous", name);
 				break;
 			}
+			free(full);
 		} else {
 			show_with_type(type, name);
 		}
@@ -506,7 +508,9 @@
 	int has_dashdash = 0;
 	int output_prefix = 0;
 	unsigned char sha1[20];
+	unsigned int flags = 0;
 	const char *name = NULL;
+	struct object_context unused;
 
 	if (argc > 1 && !strcmp("--parseopt", argv[1]))
 		return cmd_parseopt(argc - 1, argv + 1, prefix);
@@ -594,6 +598,7 @@
 			}
 			if (!strcmp(arg, "--quiet") || !strcmp(arg, "-q")) {
 				quiet = 1;
+				flags |= GET_SHA1_QUIETLY;
 				continue;
 			}
 			if (!strcmp(arg, "--short") ||
@@ -734,7 +739,7 @@
 			}
 			if (!strcmp(arg, "--git-dir")) {
 				const char *gitdir = getenv(GIT_DIR_ENVIRONMENT);
-				static char cwd[PATH_MAX];
+				char *cwd;
 				int len;
 				if (gitdir) {
 					puts(gitdir);
@@ -744,10 +749,10 @@
 					puts(".git");
 					continue;
 				}
-				if (!getcwd(cwd, PATH_MAX))
-					die_errno("unable to get current working directory");
+				cwd = xgetcwd();
 				len = strlen(cwd);
 				printf("%s%s.git\n", cwd, len && cwd[len-1] != '/' ? "/" : "");
+				free(cwd);
 				continue;
 			}
 			if (!strcmp(arg, "--resolve-git-dir")) {
@@ -775,6 +780,15 @@
 						: "false");
 				continue;
 			}
+			if (!strcmp(arg, "--shared-index-path")) {
+				if (read_cache() < 0)
+					die(_("Could not read the index"));
+				if (the_index.split_index) {
+					const unsigned char *sha1 = the_index.split_index->base_sha1;
+					puts(git_path("sharedindex.%s", sha1_to_hex(sha1)));
+				}
+				continue;
+			}
 			if (starts_with(arg, "--since=")) {
 				show_datestring("--max-age=", arg+8);
 				continue;
@@ -807,7 +821,7 @@
 			name++;
 			type = REVERSED;
 		}
-		if (!get_sha1(name, sha1)) {
+		if (!get_sha1_with_context(name, flags, sha1, &unused)) {
 			if (verify)
 				revs_count++;
 			else
diff --git a/builtin/rm.c b/builtin/rm.c
index 960634d..d8a9c86 100644
--- a/builtin/rm.c
+++ b/builtin/rm.c
@@ -3,8 +3,8 @@
  *
  * Copyright (C) Linus Torvalds 2006
  */
-#include "cache.h"
 #include "builtin.h"
+#include "lockfile.h"
 #include "dir.h"
 #include "cache-tree.h"
 #include "tree-walk.h"
@@ -65,7 +65,7 @@
 			  Q_("the following submodule (or one of its nested "
 			     "submodules)\n"
 			     "uses a .git directory:",
-			     "the following submodules (or one of its nested "
+			     "the following submodules (or one of their nested "
 			     "submodules)\n"
 			     "use a .git directory:", files->nr),
 			  _("\n(use 'rm -rf' if you really want to remove "
@@ -278,7 +278,7 @@
 
 int cmd_rm(int argc, const char **argv, const char *prefix)
 {
-	int i, newfd;
+	int i;
 	struct pathspec pathspec;
 	char *seen;
 
@@ -293,7 +293,7 @@
 	if (!index_only)
 		setup_work_tree();
 
-	newfd = hold_locked_index(&lock_file, 1);
+	hold_locked_index(&lock_file, 1);
 
 	if (read_cache() < 0)
 		die(_("index file corrupt"));
@@ -427,8 +427,7 @@
 	}
 
 	if (active_cache_changed) {
-		if (write_cache(newfd, active_cache, active_nr) ||
-		    commit_locked_index(&lock_file))
+		if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
 			die(_("Unable to write new index file"));
 	}
 
diff --git a/builtin/send-pack.c b/builtin/send-pack.c
index f420b74..b564a77 100644
--- a/builtin/send-pack.c
+++ b/builtin/send-pack.c
@@ -110,6 +110,7 @@
 	int flags;
 	unsigned int reject_reasons;
 	int progress = -1;
+	int from_stdin = 0;
 	struct push_cas_option cas = {0};
 
 	argv++;
@@ -153,6 +154,10 @@
 				args.verbose = 1;
 				continue;
 			}
+			if (!strcmp(arg, "--signed")) {
+				args.push_cert = 1;
+				continue;
+			}
 			if (!strcmp(arg, "--progress")) {
 				progress = 1;
 				continue;
@@ -169,6 +174,10 @@
 				args.stateless_rpc = 1;
 				continue;
 			}
+			if (!strcmp(arg, "--stdin")) {
+				from_stdin = 1;
+				continue;
+			}
 			if (!strcmp(arg, "--helper-status")) {
 				helper_status = 1;
 				continue;
@@ -201,6 +210,28 @@
 	}
 	if (!dest)
 		usage(send_pack_usage);
+
+	if (from_stdin) {
+		struct argv_array all_refspecs = ARGV_ARRAY_INIT;
+
+		for (i = 0; i < nr_refspecs; i++)
+			argv_array_push(&all_refspecs, refspecs[i]);
+
+		if (args.stateless_rpc) {
+			const char *buf;
+			while ((buf = packet_read_line(0, NULL)))
+				argv_array_push(&all_refspecs, buf);
+		} else {
+			struct strbuf line = STRBUF_INIT;
+			while (strbuf_getline(&line, stdin, '\n') != EOF)
+				argv_array_push(&all_refspecs, line.buf);
+			strbuf_release(&line);
+		}
+
+		refspecs = all_refspecs.argv;
+		nr_refspecs = all_refspecs.argc;
+	}
+
 	/*
 	 * --all and --mirror are incompatible; neither makes sense
 	 * with any refspecs.
diff --git a/builtin/show-branch.c b/builtin/show-branch.c
index d873172..270e39c 100644
--- a/builtin/show-branch.c
+++ b/builtin/show-branch.c
@@ -563,7 +563,7 @@
 			default_arg[default_num++] = "show-branch";
 		} else if (default_alloc <= default_num + 1) {
 			default_alloc = default_alloc * 3 / 2 + 20;
-			default_arg = xrealloc(default_arg, sizeof *default_arg * default_alloc);
+			REALLOC_ARRAY(default_arg, default_alloc);
 		}
 		default_arg[default_num++] = xstrdup(value);
 		default_arg[default_num] = NULL;
@@ -723,11 +723,14 @@
 		char nth_desc[256];
 		char *ref;
 		int base = 0;
+		unsigned int flags = 0;
 
 		if (ac == 0) {
 			static const char *fake_av[2];
 
-			fake_av[0] = resolve_refdup("HEAD", sha1, 1, NULL);
+			fake_av[0] = resolve_refdup("HEAD",
+						    RESOLVE_REF_READING,
+						    sha1, NULL);
 			fake_av[1] = NULL;
 			av = fake_av;
 			ac = 1;
@@ -749,18 +752,18 @@
 				/* Ah, that is a date spec... */
 				unsigned long at;
 				at = approxidate(reflog_base);
-				read_ref_at(ref, at, -1, sha1, NULL,
+				read_ref_at(ref, flags, at, -1, sha1, NULL,
 					    NULL, NULL, &base);
 			}
 		}
 
 		for (i = 0; i < reflog; i++) {
-			char *logmsg, *m;
+			char *logmsg;
 			const char *msg;
 			unsigned long timestamp;
 			int tz;
 
-			if (read_ref_at(ref, 0, base+i, sha1, &logmsg,
+			if (read_ref_at(ref, flags, 0, base+i, sha1, &logmsg,
 					&timestamp, &tz, NULL)) {
 				reflog = i;
 				break;
@@ -770,15 +773,14 @@
 				msg = "(none)";
 			else
 				msg++;
-			m = xmalloc(strlen(msg) + 200);
-			sprintf(m, "(%s) %s",
-				show_date(timestamp, tz, 1),
-				msg);
-			reflog_msg[i] = m;
+			reflog_msg[i] = xstrfmt("(%s) %s",
+						show_date(timestamp, tz, 1),
+						msg);
 			free(logmsg);
 			sprintf(nth_desc, "%s@{%d}", *av, base+i);
 			append_ref(nth_desc, sha1, 1);
 		}
+		free(ref);
 	}
 	else if (all_heads + all_remotes)
 		snarf_refs(all_heads, all_remotes);
@@ -789,7 +791,8 @@
 		}
 	}
 
-	head_p = resolve_ref_unsafe("HEAD", head_sha1, 1, NULL);
+	head_p = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
+				    head_sha1, NULL);
 	if (head_p) {
 		head_len = strlen(head_p);
 		memcpy(head, head_p, head_len + 1);
diff --git a/builtin/symbolic-ref.c b/builtin/symbolic-ref.c
index b6a711d..29fb3f1 100644
--- a/builtin/symbolic-ref.c
+++ b/builtin/symbolic-ref.c
@@ -13,7 +13,7 @@
 {
 	unsigned char sha1[20];
 	int flag;
-	const char *refname = resolve_ref_unsafe(HEAD, sha1, 0, &flag);
+	const char *refname = resolve_ref_unsafe(HEAD, 0, sha1, &flag);
 
 	if (!refname)
 		die("No such ref: %s", HEAD);
diff --git a/builtin/tag.c b/builtin/tag.c
index 6c7c6bd..e633f4e 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -32,6 +32,8 @@
 #define SORT_MASK       0x7fff
 #define REVERSE_SORT    0x8000
 
+static int tag_sort;
+
 struct tag_filter {
 	const char **patterns;
 	int lines;
@@ -80,11 +82,19 @@
 	return 0;
 }
 
-static int contains_recurse(struct commit *candidate,
+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)
 {
-	struct commit_list *p;
-
 	/* was it previously marked as containing a want commit? */
 	if (candidate->object.flags & TMP_MARK)
 		return 1;
@@ -92,26 +102,78 @@
 	if (candidate->object.flags & UNINTERESTING)
 		return 0;
 	/* or are we it? */
-	if (in_commit_list(want, candidate))
+	if (in_commit_list(want, candidate)) {
+		candidate->object.flags |= TMP_MARK;
 		return 1;
+	}
 
 	if (parse_commit(candidate) < 0)
 		return 0;
 
-	/* Otherwise recurse and mark ourselves for future traversals. */
-	for (p = candidate->parents; p; p = p->next) {
-		if (contains_recurse(p->item, want)) {
-			candidate->object.flags |= TMP_MARK;
-			return 1;
-		}
-	}
-	candidate->object.flags |= UNINTERESTING;
-	return 0;
+	return -1;
 }
 
-static int contains(struct commit *candidate, const struct commit_list *want)
+/*
+ * 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)
 {
-	return contains_recurse(candidate, want);
+	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 unsigned char *sha1, int lines)
@@ -278,17 +340,59 @@
 }
 
 static const char tag_template[] =
-	N_("\nWrite a tag message\n"
+	N_("\nWrite a message for tag:\n  %s\n"
 	"Lines starting with '%c' will be ignored.\n");
 
 static const char tag_template_nocleanup[] =
-	N_("\nWrite a tag message\n"
+	N_("\nWrite a message for tag:\n  %s\n"
 	"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)
+{
+	int type = 0, flags = 0;
+
+	if (skip_prefix(arg, "-", &arg))
+		flags |= REVERSE_SORT;
+
+	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;
+		}
+	}
+
+	*sort = (type | flags);
+
+	return 0;
+}
+
 static int git_tag_config(const char *var, const char *value, void *cb)
 {
-	int status = git_gpg_config(var, value, cb);
+	int status;
+
+	if (!strcmp(var, "tag.sort")) {
+		if (!value)
+			return config_error_nonbool(var);
+		parse_sort_string(var, value, &tag_sort);
+		return 0;
+	}
+
+	status = git_gpg_config(var, value, cb);
 	if (status)
 		return status;
 	if (starts_with(var, "column."))
@@ -378,9 +482,9 @@
 			struct strbuf buf = STRBUF_INIT;
 			strbuf_addch(&buf, '\n');
 			if (opt->cleanup_mode == CLEANUP_ALL)
-				strbuf_commented_addf(&buf, _(tag_template), comment_line_char);
+				strbuf_commented_addf(&buf, _(tag_template), tag, comment_line_char);
 			else
-				strbuf_commented_addf(&buf, _(tag_template_nocleanup), comment_line_char);
+				strbuf_commented_addf(&buf, _(tag_template_nocleanup), tag, comment_line_char);
 			write_or_die(fd, buf.buf, buf.len);
 			strbuf_release(&buf);
 		}
@@ -462,24 +566,8 @@
 static int parse_opt_sort(const struct option *opt, const char *arg, int unset)
 {
 	int *sort = opt->value;
-	int flags = 0;
 
-	if (*arg == '-') {
-		flags |= REVERSE_SORT;
-		arg++;
-	}
-	if (starts_with(arg, "version:")) {
-		*sort = VERCMP_SORT;
-		arg += 8;
-	} else if (starts_with(arg, "v:")) {
-		*sort = VERCMP_SORT;
-		arg += 2;
-	} else
-		*sort = STRCMP_SORT;
-	if (strcmp(arg, "refname"))
-		die(_("unsupported sort specification %s"), arg);
-	*sort |= flags;
-	return 0;
+	return parse_sort_string(NULL, arg, sort);
 }
 
 int cmd_tag(int argc, const char **argv, const char *prefix)
@@ -488,14 +576,15 @@
 	struct strbuf ref = STRBUF_INIT;
 	unsigned char object[20], prev[20];
 	const char *object_ref, *tag;
-	struct ref_lock *lock;
 	struct create_tag_options opt;
 	char *cleanup_arg = NULL;
 	int annotate = 0, force = 0, lines = -1;
-	int cmdmode = 0, sort = 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 option options[] = {
 		OPT_CMDMODE('l', "list", &cmdmode, N_("list tag names"), 'l'),
 		{ OPTION_INTEGER, 'n', NULL, &lines, N_("n"),
@@ -518,7 +607,7 @@
 		OPT__FORCE(&force, N_("replace the tag if exists")),
 		OPT_COLUMN(0, "column", &colopts, N_("show tag list in columns")),
 		{
-			OPTION_CALLBACK, 0, "sort", &sort, N_("type"), N_("sort tags"),
+			OPTION_CALLBACK, 0, "sort", &tag_sort, N_("type"), N_("sort tags"),
 			PARSE_OPT_NONEG, parse_opt_sort
 		},
 
@@ -574,9 +663,9 @@
 			copts.padding = 2;
 			run_column_filter(colopts, &copts);
 		}
-		if (lines != -1 && sort)
+		if (lines != -1 && tag_sort)
 			die(_("--sort and -n are incompatible"));
-		ret = list_tags(argv, lines == -1 ? 0 : lines, with_commit, sort);
+		ret = list_tags(argv, lines == -1 ? 0 : lines, with_commit, tag_sort);
 		if (column_active(colopts))
 			stop_column_filter();
 		return ret;
@@ -641,14 +730,17 @@
 	if (annotate)
 		create_tag(object, tag, &buf, &opt, prev, object);
 
-	lock = lock_any_ref_for_update(ref.buf, prev, 0, NULL);
-	if (!lock)
-		die(_("%s: cannot lock the ref"), ref.buf);
-	if (write_ref_sha1(lock, object, NULL) < 0)
-		die(_("%s: cannot update the ref"), ref.buf);
+	transaction = ref_transaction_begin(&err);
+	if (!transaction ||
+	    ref_transaction_update(transaction, ref.buf, object, prev,
+				   0, 1, NULL, &err) ||
+	    ref_transaction_commit(transaction, &err))
+		die("%s", err.buf);
+	ref_transaction_free(transaction);
 	if (force && !is_null_sha1(prev) && hashcmp(prev, object))
 		printf(_("Updated tag '%s' (was %s)\n"), tag, find_unique_abbrev(prev, DEFAULT_ABBREV));
 
+	strbuf_release(&err);
 	strbuf_release(&buf);
 	strbuf_release(&ref);
 	return 0;
diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c
index 99cde45..855d94b 100644
--- a/builtin/unpack-objects.c
+++ b/builtin/unpack-objects.c
@@ -164,10 +164,10 @@
  * Called only from check_object() after it verified this object
  * is Ok.
  */
-static void write_cached_object(struct object *obj)
+static void write_cached_object(struct object *obj, struct obj_buffer *obj_buf)
 {
 	unsigned char sha1[20];
-	struct obj_buffer *obj_buf = lookup_object_buffer(obj);
+
 	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));
 	obj->flags |= FLAG_WRITTEN;
@@ -180,6 +180,8 @@
  */
 static int check_object(struct object *obj, int type, void *data)
 {
+	struct obj_buffer *obj_buf;
+
 	if (!obj)
 		return 1;
 
@@ -198,11 +200,15 @@
 		return 0;
 	}
 
-	if (fsck_object(obj, 1, fsck_error_function))
+	obj_buf = lookup_object_buffer(obj);
+	if (!obj_buf)
+		die("Whoops! Cannot find object '%s'", sha1_to_hex(obj->sha1));
+	if (fsck_object(obj, obj_buf->buffer, obj_buf->size, 1,
+			fsck_error_function))
 		die("Error in object");
 	if (fsck_walk(obj, check_object, NULL))
 		die("Error on reachable objects of %s", sha1_to_hex(obj->sha1));
-	write_cached_object(obj);
+	write_cached_object(obj, obj_buf);
 	return 0;
 }
 
diff --git a/builtin/update-index.c b/builtin/update-index.c
index ebea285..b0e3dc9 100644
--- a/builtin/update-index.c
+++ b/builtin/update-index.c
@@ -4,6 +4,7 @@
  * Copyright (C) Linus Torvalds, 2005
  */
 #include "cache.h"
+#include "lockfile.h"
 #include "quote.h"
 #include "cache-tree.h"
 #include "tree-walk.h"
@@ -13,6 +14,7 @@
 #include "parse-options.h"
 #include "pathspec.h"
 #include "dir.h"
+#include "split-index.h"
 
 /*
  * Default to not allowing changes to the list of files. The
@@ -55,8 +57,9 @@
 			active_cache[pos]->ce_flags |= flag;
 		else
 			active_cache[pos]->ce_flags &= ~flag;
-		cache_tree_invalidate_path(active_cache_tree, path);
-		active_cache_changed = 1;
+		active_cache[pos]->ce_flags |= CE_UPDATE_IN_BASE;
+		cache_tree_invalidate_path(&the_index, path);
+		active_cache_changed |= CE_ENTRY_CHANGED;
 		return 0;
 	}
 	return -1;
@@ -267,8 +270,9 @@
 	default:
 		goto fail;
 	}
-	cache_tree_invalidate_path(active_cache_tree, path);
-	active_cache_changed = 1;
+	cache_tree_invalidate_path(&the_index, path);
+	ce->ce_flags |= CE_UPDATE_IN_BASE;
+	active_cache_changed |= CE_ENTRY_CHANGED;
 	report("chmod %cx '%s'", flip, path);
 	return;
  fail:
@@ -743,6 +747,7 @@
 	char set_executable_bit = 0;
 	struct refresh_params refresh_args = {0, &has_errors};
 	int lock_error = 0;
+	int split_index = -1;
 	struct lock_file *lock_file;
 	struct parse_opt_ctx_t ctx;
 	int parseopt_state = PARSE_OPT_UNKNOWN;
@@ -825,6 +830,8 @@
 			resolve_undo_clear_callback},
 		OPT_INTEGER(0, "index-version", &preferred_index_format,
 			N_("write index in this format")),
+		OPT_BOOL(0, "split-index", &split_index,
+			N_("enable or disable split index")),
 		OPT_END()
 	};
 
@@ -892,7 +899,7 @@
 			    INDEX_FORMAT_LB, INDEX_FORMAT_UB);
 
 		if (the_index.version != preferred_index_format)
-			active_cache_changed = 1;
+			active_cache_changed |= SOMETHING_CHANGED;
 		the_index.version = preferred_index_format;
 	}
 
@@ -918,14 +925,27 @@
 		strbuf_release(&buf);
 	}
 
+	if (split_index > 0) {
+		init_split_index(&the_index);
+		the_index.cache_changed |= SPLIT_INDEX_ORDERED;
+	} else if (!split_index && the_index.split_index) {
+		/*
+		 * can't discard_split_index(&the_index); because that
+		 * will destroy split_index->base->cache[], which may
+		 * be shared with the_index.cache[]. So yeah we're
+		 * leaking a bit here.
+		 */
+		the_index.split_index = NULL;
+		the_index.cache_changed |= SOMETHING_CHANGED;
+	}
+
 	if (active_cache_changed) {
 		if (newfd < 0) {
 			if (refresh_args.flags & REFRESH_QUIET)
 				exit(128);
-			unable_to_lock_index_die(get_index_file(), lock_error);
+			unable_to_lock_die(get_index_file(), lock_error);
 		}
-		if (write_cache(newfd, active_cache, active_nr) ||
-		    commit_locked_index(lock_file))
+		if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
 			die("Unable to write new index file");
 	}
 
diff --git a/builtin/update-ref.c b/builtin/update-ref.c
index 5c208bb..6c9be05 100644
--- a/builtin/update-ref.c
+++ b/builtin/update-ref.c
@@ -12,243 +12,350 @@
 	NULL
 };
 
-static int updates_alloc;
-static int updates_count;
-static const struct ref_update **updates;
-
 static char line_termination = '\n';
 static int update_flags;
+static const char *msg;
 
-static struct ref_update *update_alloc(void)
-{
-	struct ref_update *update;
-
-	/* Allocate and zero-init a struct ref_update */
-	update = xcalloc(1, sizeof(*update));
-	ALLOC_GROW(updates, updates_count + 1, updates_alloc);
-	updates[updates_count++] = update;
-
-	/* Store and reset accumulated options */
-	update->flags = update_flags;
-	update_flags = 0;
-
-	return update;
-}
-
-static void update_store_ref_name(struct ref_update *update,
-				  const char *ref_name)
-{
-	if (check_refname_format(ref_name, REFNAME_ALLOW_ONELEVEL))
-		die("invalid ref format: %s", ref_name);
-	update->ref_name = xstrdup(ref_name);
-}
-
-static void update_store_new_sha1(struct ref_update *update,
-				  const char *newvalue)
-{
-	if (*newvalue && get_sha1(newvalue, update->new_sha1))
-		die("invalid new value for ref %s: %s",
-		    update->ref_name, newvalue);
-}
-
-static void update_store_old_sha1(struct ref_update *update,
-				  const char *oldvalue)
-{
-	if (*oldvalue && get_sha1(oldvalue, update->old_sha1))
-		die("invalid old value for ref %s: %s",
-		    update->ref_name, oldvalue);
-
-	/* We have an old value if non-empty, or if empty without -z */
-	update->have_old = *oldvalue || line_termination;
-}
-
+/*
+ * Parse one whitespace- or NUL-terminated, possibly C-quoted argument
+ * and append the result to arg.  Return a pointer to the terminator.
+ * Die if there is an error in how the argument is C-quoted.  This
+ * function is only used if not -z.
+ */
 static const char *parse_arg(const char *next, struct strbuf *arg)
 {
-	/* Parse SP-terminated, possibly C-quoted argument */
-	if (*next != '"')
+	if (*next == '"') {
+		const char *orig = next;
+
+		if (unquote_c_style(arg, next, &next))
+			die("badly quoted argument: %s", orig);
+		if (*next && !isspace(*next))
+			die("unexpected character after quoted argument: %s", orig);
+	} else {
 		while (*next && !isspace(*next))
 			strbuf_addch(arg, *next++);
-	else if (unquote_c_style(arg, next, &next))
-		die("badly quoted argument: %s", next);
+	}
 
-	/* Return position after the argument */
 	return next;
 }
 
-static const char *parse_first_arg(const char *next, struct strbuf *arg)
+/*
+ * Parse the reference name immediately after "command SP".  If not
+ * -z, then handle C-quoting.  Return a pointer to a newly allocated
+ * string containing the name of the reference, or NULL if there was
+ * an error.  Update *next to point at the character that terminates
+ * the argument.  Die if C-quoting is malformed or the reference name
+ * is invalid.
+ */
+static char *parse_refname(struct strbuf *input, const char **next)
 {
-	/* Parse argument immediately after "command SP" */
-	strbuf_reset(arg);
+	struct strbuf ref = STRBUF_INIT;
+
 	if (line_termination) {
 		/* Without -z, use the next argument */
-		next = parse_arg(next, arg);
+		*next = parse_arg(*next, &ref);
 	} else {
-		/* With -z, use rest of first NUL-terminated line */
-		strbuf_addstr(arg, next);
-		next = next + arg->len;
+		/* With -z, use everything up to the next NUL */
+		strbuf_addstr(&ref, *next);
+		*next += ref.len;
 	}
-	return next;
+
+	if (!ref.len) {
+		strbuf_release(&ref);
+		return NULL;
+	}
+
+	if (check_refname_format(ref.buf, REFNAME_ALLOW_ONELEVEL))
+		die("invalid ref format: %s", ref.buf);
+
+	return strbuf_detach(&ref, NULL);
 }
 
-static const char *parse_next_arg(const char *next, struct strbuf *arg)
+/*
+ * The value being parsed is <oldvalue> (as opposed to <newvalue>; the
+ * difference affects which error messages are generated):
+ */
+#define PARSE_SHA1_OLD 0x01
+
+/*
+ * For backwards compatibility, accept an empty string for update's
+ * <newvalue> in binary mode to be equivalent to specifying zeros.
+ */
+#define PARSE_SHA1_ALLOW_EMPTY 0x02
+
+/*
+ * Parse an argument separator followed by the next argument, if any.
+ * If there is an argument, convert it to a SHA-1, write it to sha1,
+ * set *next to point at the character terminating the argument, and
+ * return 0.  If there is no argument at all (not even the empty
+ * string), return 1 and leave *next unchanged.  If the value is
+ * provided but cannot be converted to a SHA-1, die.  flags can
+ * include PARSE_SHA1_OLD and/or PARSE_SHA1_ALLOW_EMPTY.
+ */
+static int parse_next_sha1(struct strbuf *input, const char **next,
+			   unsigned char *sha1,
+			   const char *command, const char *refname,
+			   int flags)
 {
-	/* Parse next SP-terminated or NUL-terminated argument, if any */
-	strbuf_reset(arg);
+	struct strbuf arg = STRBUF_INIT;
+	int ret = 0;
+
+	if (*next == input->buf + input->len)
+		goto eof;
+
 	if (line_termination) {
 		/* Without -z, consume SP and use next argument */
-		if (!*next)
-			return NULL;
-		if (*next != ' ')
-			die("expected SP but got: %s", next);
-		next = parse_arg(next + 1, arg);
+		if (!**next || **next == line_termination)
+			return 1;
+		if (**next != ' ')
+			die("%s %s: expected SP but got: %s",
+			    command, refname, *next);
+		(*next)++;
+		*next = parse_arg(*next, &arg);
+		if (arg.len) {
+			if (get_sha1(arg.buf, sha1))
+				goto invalid;
+		} else {
+			/* Without -z, an empty value means all zeros: */
+			hashclr(sha1);
+		}
 	} else {
 		/* With -z, read the next NUL-terminated line */
-		if (*next)
-			die("expected NUL but got: %s", next);
-		if (strbuf_getline(arg, stdin, '\0') == EOF)
-			return NULL;
-		next = arg->buf + arg->len;
+		if (**next)
+			die("%s %s: expected NUL but got: %s",
+			    command, refname, *next);
+		(*next)++;
+		if (*next == input->buf + input->len)
+			goto eof;
+		strbuf_addstr(&arg, *next);
+		*next += arg.len;
+
+		if (arg.len) {
+			if (get_sha1(arg.buf, sha1))
+				goto invalid;
+		} else if (flags & PARSE_SHA1_ALLOW_EMPTY) {
+			/* With -z, treat an empty value as all zeros: */
+			warning("%s %s: missing <newvalue>, treating as zero",
+				command, refname);
+			hashclr(sha1);
+		} else {
+			/*
+			 * With -z, an empty non-required value means
+			 * unspecified:
+			 */
+			ret = 1;
+		}
 	}
+
+	strbuf_release(&arg);
+
+	return ret;
+
+ invalid:
+	die(flags & PARSE_SHA1_OLD ?
+	    "%s %s: invalid <oldvalue>: %s" :
+	    "%s %s: invalid <newvalue>: %s",
+	    command, refname, arg.buf);
+
+ eof:
+	die(flags & PARSE_SHA1_OLD ?
+	    "%s %s: unexpected end of input when reading <oldvalue>" :
+	    "%s %s: unexpected end of input when reading <newvalue>",
+	    command, refname);
+}
+
+
+/*
+ * The following five parse_cmd_*() functions parse the corresponding
+ * command.  In each case, next points at the character following the
+ * command name and the following space.  They each return a pointer
+ * to the character terminating the command, and die with an
+ * explanatory message if there are any parsing problems.  All of
+ * these functions handle either text or binary format input,
+ * depending on how line_termination is set.
+ */
+
+static const char *parse_cmd_update(struct ref_transaction *transaction,
+				    struct strbuf *input, const char *next)
+{
+	struct strbuf err = STRBUF_INIT;
+	char *refname;
+	unsigned char new_sha1[20];
+	unsigned char old_sha1[20];
+	int have_old;
+
+	refname = parse_refname(input, &next);
+	if (!refname)
+		die("update: missing <ref>");
+
+	if (parse_next_sha1(input, &next, new_sha1, "update", refname,
+			    PARSE_SHA1_ALLOW_EMPTY))
+		die("update %s: missing <newvalue>", refname);
+
+	have_old = !parse_next_sha1(input, &next, old_sha1, "update", refname,
+				    PARSE_SHA1_OLD);
+
+	if (*next != line_termination)
+		die("update %s: extra input: %s", refname, next);
+
+	if (ref_transaction_update(transaction, refname, new_sha1, old_sha1,
+				   update_flags, have_old, msg, &err))
+		die("%s", err.buf);
+
+	update_flags = 0;
+	free(refname);
+	strbuf_release(&err);
+
 	return next;
 }
 
-static void parse_cmd_update(const char *next)
+static const char *parse_cmd_create(struct ref_transaction *transaction,
+				    struct strbuf *input, const char *next)
 {
-	struct strbuf ref = STRBUF_INIT;
-	struct strbuf newvalue = STRBUF_INIT;
-	struct strbuf oldvalue = STRBUF_INIT;
-	struct ref_update *update;
+	struct strbuf err = STRBUF_INIT;
+	char *refname;
+	unsigned char new_sha1[20];
 
-	update = update_alloc();
+	refname = parse_refname(input, &next);
+	if (!refname)
+		die("create: missing <ref>");
 
-	if ((next = parse_first_arg(next, &ref)) != NULL && ref.buf[0])
-		update_store_ref_name(update, ref.buf);
-	else
-		die("update line missing <ref>");
+	if (parse_next_sha1(input, &next, new_sha1, "create", refname, 0))
+		die("create %s: missing <newvalue>", refname);
 
-	if ((next = parse_next_arg(next, &newvalue)) != NULL)
-		update_store_new_sha1(update, newvalue.buf);
-	else
-		die("update %s missing <newvalue>", ref.buf);
+	if (is_null_sha1(new_sha1))
+		die("create %s: zero <newvalue>", refname);
 
-	if ((next = parse_next_arg(next, &oldvalue)) != NULL)
-		update_store_old_sha1(update, oldvalue.buf);
-	else if(!line_termination)
-		die("update %s missing [<oldvalue>] NUL", ref.buf);
+	if (*next != line_termination)
+		die("create %s: extra input: %s", refname, next);
 
-	if (next && *next)
-		die("update %s has extra input: %s", ref.buf, next);
+	if (ref_transaction_create(transaction, refname, new_sha1,
+				   update_flags, msg, &err))
+		die("%s", err.buf);
+
+	update_flags = 0;
+	free(refname);
+	strbuf_release(&err);
+
+	return next;
 }
 
-static void parse_cmd_create(const char *next)
+static const char *parse_cmd_delete(struct ref_transaction *transaction,
+				    struct strbuf *input, const char *next)
 {
-	struct strbuf ref = STRBUF_INIT;
-	struct strbuf newvalue = STRBUF_INIT;
-	struct ref_update *update;
+	struct strbuf err = STRBUF_INIT;
+	char *refname;
+	unsigned char old_sha1[20];
+	int have_old;
 
-	update = update_alloc();
-	update->have_old = 1;
+	refname = parse_refname(input, &next);
+	if (!refname)
+		die("delete: missing <ref>");
 
-	if ((next = parse_first_arg(next, &ref)) != NULL && ref.buf[0])
-		update_store_ref_name(update, ref.buf);
-	else
-		die("create line missing <ref>");
+	if (parse_next_sha1(input, &next, old_sha1, "delete", refname,
+			    PARSE_SHA1_OLD)) {
+		have_old = 0;
+	} else {
+		if (is_null_sha1(old_sha1))
+			die("delete %s: zero <oldvalue>", refname);
+		have_old = 1;
+	}
 
-	if ((next = parse_next_arg(next, &newvalue)) != NULL)
-		update_store_new_sha1(update, newvalue.buf);
-	else
-		die("create %s missing <newvalue>", ref.buf);
-	if (is_null_sha1(update->new_sha1))
-		die("create %s given zero new value", ref.buf);
+	if (*next != line_termination)
+		die("delete %s: extra input: %s", refname, next);
 
-	if (next && *next)
-		die("create %s has extra input: %s", ref.buf, next);
+	if (ref_transaction_delete(transaction, refname, old_sha1,
+				   update_flags, have_old, msg, &err))
+		die("%s", err.buf);
+
+	update_flags = 0;
+	free(refname);
+	strbuf_release(&err);
+
+	return next;
 }
 
-static void parse_cmd_delete(const char *next)
+static const char *parse_cmd_verify(struct ref_transaction *transaction,
+				    struct strbuf *input, const char *next)
 {
-	struct strbuf ref = STRBUF_INIT;
-	struct strbuf oldvalue = STRBUF_INIT;
-	struct ref_update *update;
+	struct strbuf err = STRBUF_INIT;
+	char *refname;
+	unsigned char new_sha1[20];
+	unsigned char old_sha1[20];
+	int have_old;
 
-	update = update_alloc();
+	refname = parse_refname(input, &next);
+	if (!refname)
+		die("verify: missing <ref>");
 
-	if ((next = parse_first_arg(next, &ref)) != NULL && ref.buf[0])
-		update_store_ref_name(update, ref.buf);
-	else
-		die("delete line missing <ref>");
+	if (parse_next_sha1(input, &next, old_sha1, "verify", refname,
+			    PARSE_SHA1_OLD)) {
+		hashclr(new_sha1);
+		have_old = 0;
+	} else {
+		hashcpy(new_sha1, old_sha1);
+		have_old = 1;
+	}
 
-	if ((next = parse_next_arg(next, &oldvalue)) != NULL)
-		update_store_old_sha1(update, oldvalue.buf);
-	else if(!line_termination)
-		die("delete %s missing [<oldvalue>] NUL", ref.buf);
-	if (update->have_old && is_null_sha1(update->old_sha1))
-		die("delete %s given zero old value", ref.buf);
+	if (*next != line_termination)
+		die("verify %s: extra input: %s", refname, next);
 
-	if (next && *next)
-		die("delete %s has extra input: %s", ref.buf, next);
+	if (ref_transaction_update(transaction, refname, new_sha1, old_sha1,
+				   update_flags, have_old, msg, &err))
+		die("%s", err.buf);
+
+	update_flags = 0;
+	free(refname);
+	strbuf_release(&err);
+
+	return next;
 }
 
-static void parse_cmd_verify(const char *next)
+static const char *parse_cmd_option(struct strbuf *input, const char *next)
 {
-	struct strbuf ref = STRBUF_INIT;
-	struct strbuf value = STRBUF_INIT;
-	struct ref_update *update;
-
-	update = update_alloc();
-
-	if ((next = parse_first_arg(next, &ref)) != NULL && ref.buf[0])
-		update_store_ref_name(update, ref.buf);
-	else
-		die("verify line missing <ref>");
-
-	if ((next = parse_next_arg(next, &value)) != NULL) {
-		update_store_old_sha1(update, value.buf);
-		update_store_new_sha1(update, value.buf);
-	} else if(!line_termination)
-		die("verify %s missing [<oldvalue>] NUL", ref.buf);
-
-	if (next && *next)
-		die("verify %s has extra input: %s", ref.buf, next);
-}
-
-static void parse_cmd_option(const char *next)
-{
-	if (!strcmp(next, "no-deref"))
+	if (!strncmp(next, "no-deref", 8) && next[8] == line_termination)
 		update_flags |= REF_NODEREF;
 	else
 		die("option unknown: %s", next);
+	return next + 8;
 }
 
-static void update_refs_stdin(void)
+static void update_refs_stdin(struct ref_transaction *transaction)
 {
-	struct strbuf cmd = STRBUF_INIT;
+	struct strbuf input = STRBUF_INIT;
+	const char *next;
 
+	if (strbuf_read(&input, 0, 1000) < 0)
+		die_errno("could not read from stdin");
+	next = input.buf;
 	/* Read each line dispatch its command */
-	while (strbuf_getline(&cmd, stdin, line_termination) != EOF)
-		if (!cmd.buf[0])
+	while (next < input.buf + input.len) {
+		if (*next == line_termination)
 			die("empty command in input");
-		else if (isspace(*cmd.buf))
-			die("whitespace before command: %s", cmd.buf);
-		else if (starts_with(cmd.buf, "update "))
-			parse_cmd_update(cmd.buf + 7);
-		else if (starts_with(cmd.buf, "create "))
-			parse_cmd_create(cmd.buf + 7);
-		else if (starts_with(cmd.buf, "delete "))
-			parse_cmd_delete(cmd.buf + 7);
-		else if (starts_with(cmd.buf, "verify "))
-			parse_cmd_verify(cmd.buf + 7);
-		else if (starts_with(cmd.buf, "option "))
-			parse_cmd_option(cmd.buf + 7);
+		else if (isspace(*next))
+			die("whitespace before command: %s", next);
+		else if (starts_with(next, "update "))
+			next = parse_cmd_update(transaction, &input, next + 7);
+		else if (starts_with(next, "create "))
+			next = parse_cmd_create(transaction, &input, next + 7);
+		else if (starts_with(next, "delete "))
+			next = parse_cmd_delete(transaction, &input, next + 7);
+		else if (starts_with(next, "verify "))
+			next = parse_cmd_verify(transaction, &input, next + 7);
+		else if (starts_with(next, "option "))
+			next = parse_cmd_option(&input, next + 7);
 		else
-			die("unknown command: %s", cmd.buf);
+			die("unknown command: %s", next);
 
-	strbuf_release(&cmd);
+		next++;
+	}
+
+	strbuf_release(&input);
 }
 
 int cmd_update_ref(int argc, const char **argv, const char *prefix)
 {
-	const char *refname, *oldval, *msg = NULL;
+	const char *refname, *oldval;
 	unsigned char sha1[20], oldsha1[20];
 	int delete = 0, no_deref = 0, read_stdin = 0, end_null = 0, flags = 0;
 	struct option options[] = {
@@ -268,12 +375,22 @@
 		die("Refusing to perform update with empty message.");
 
 	if (read_stdin) {
+		struct strbuf err = STRBUF_INIT;
+		struct ref_transaction *transaction;
+
+		transaction = ref_transaction_begin(&err);
+		if (!transaction)
+			die("%s", err.buf);
 		if (delete || no_deref || argc > 0)
 			usage_with_options(git_update_ref_usage, options);
 		if (end_null)
 			line_termination = '\0';
-		update_refs_stdin();
-		return update_refs(msg, updates, updates_count, DIE_ON_ERR);
+		update_refs_stdin(transaction);
+		if (ref_transaction_commit(transaction, &err))
+			die("%s", err.buf);
+		ref_transaction_free(transaction);
+		strbuf_release(&err);
+		return 0;
 	}
 
 	if (end_null)
@@ -305,5 +422,5 @@
 		return delete_ref(refname, oldval ? oldsha1 : NULL, flags);
 	else
 		return update_ref(msg, refname, sha1, oldval ? oldsha1 : NULL,
-				  flags, DIE_ON_ERR);
+				  flags, UPDATE_REFS_DIE_ON_ERR);
 }
diff --git a/builtin/verify-commit.c b/builtin/verify-commit.c
new file mode 100644
index 0000000..b0f85042
--- /dev/null
+++ b/builtin/verify-commit.c
@@ -0,0 +1,93 @@
+/*
+ * Builtin "git commit-commit"
+ *
+ * Copyright (c) 2014 Michael J Gruber <git@drmicha.warpmail.net>
+ *
+ * Based on git-verify-tag
+ */
+#include "cache.h"
+#include "builtin.h"
+#include "commit.h"
+#include "run-command.h"
+#include <signal.h>
+#include "parse-options.h"
+#include "gpg-interface.h"
+
+static const char * const verify_commit_usage[] = {
+		N_("git verify-commit [-v|--verbose] <commit>..."),
+		NULL
+};
+
+static int run_gpg_verify(const unsigned char *sha1, const char *buf, unsigned long size, int verbose)
+{
+	struct signature_check signature_check;
+
+	memset(&signature_check, 0, sizeof(signature_check));
+
+	check_commit_signature(lookup_commit(sha1), &signature_check);
+
+	if (verbose && signature_check.payload)
+		fputs(signature_check.payload, stdout);
+
+	if (signature_check.gpg_output)
+		fputs(signature_check.gpg_output, stderr);
+
+	signature_check_clear(&signature_check);
+	return signature_check.result != 'G';
+}
+
+static int verify_commit(const char *name, int verbose)
+{
+	enum object_type type;
+	unsigned char sha1[20];
+	char *buf;
+	unsigned long size;
+	int ret;
+
+	if (get_sha1(name, sha1))
+		return error("commit '%s' not found.", name);
+
+	buf = read_sha1_file(sha1, &type, &size);
+	if (!buf)
+		return error("%s: unable to read file.", name);
+	if (type != OBJ_COMMIT)
+		return error("%s: cannot verify a non-commit object of type %s.",
+				name, typename(type));
+
+	ret = run_gpg_verify(sha1, buf, size, verbose);
+
+	free(buf);
+	return ret;
+}
+
+static int git_verify_commit_config(const char *var, const char *value, void *cb)
+{
+	int status = git_gpg_config(var, value, cb);
+	if (status)
+		return status;
+	return git_default_config(var, value, cb);
+}
+
+int cmd_verify_commit(int argc, const char **argv, const char *prefix)
+{
+	int i = 1, verbose = 0, had_error = 0;
+	const struct option verify_commit_options[] = {
+		OPT__VERBOSE(&verbose, N_("print commit contents")),
+		OPT_END()
+	};
+
+	git_config(git_verify_commit_config, NULL);
+
+	argc = parse_options(argc, argv, prefix, verify_commit_options,
+			     verify_commit_usage, PARSE_OPT_KEEP_ARGV0);
+	if (argc <= i)
+		usage_with_options(verify_commit_usage, verify_commit_options);
+
+	/* sometimes the program was terminated because this signal
+	 * was received in the process of writing the gpg input: */
+	signal(SIGPIPE, SIG_IGN);
+	while (i < argc)
+		if (verify_commit(argv[i++], verbose))
+			had_error = 1;
+	return had_error;
+}
diff --git a/builtin/verify-pack.c b/builtin/verify-pack.c
index 66cd2df..7747537 100644
--- a/builtin/verify-pack.c
+++ b/builtin/verify-pack.c
@@ -8,7 +8,7 @@
 
 static int verify_one_pack(const char *path, unsigned int flags)
 {
-	struct child_process index_pack;
+	struct child_process index_pack = CHILD_PROCESS_INIT;
 	const char *argv[] = {"index-pack", NULL, NULL, NULL };
 	struct strbuf arg = STRBUF_INIT;
 	int verbose = flags & VERIFY_PACK_VERBOSE;
@@ -27,13 +27,11 @@
 	 * normalize these forms to "foo.pack" for "index-pack --verify".
 	 */
 	strbuf_addstr(&arg, path);
-	if (has_extension(arg.buf, ".idx"))
-		strbuf_splice(&arg, arg.len - 3, 3, "pack", 4);
-	else if (!has_extension(arg.buf, ".pack"))
-		strbuf_add(&arg, ".pack", 5);
+	if (strbuf_strip_suffix(&arg, ".idx") ||
+	    !ends_with(arg.buf, ".pack"))
+		strbuf_addstr(&arg, ".pack");
 	argv[2] = arg.buf;
 
-	memset(&index_pack, 0, sizeof(index_pack));
 	index_pack.argv = argv;
 	index_pack.git_cmd = 1;
 
diff --git a/bulk-checkin.c b/bulk-checkin.c
index 98e651c..0c4b8a7 100644
--- a/bulk-checkin.c
+++ b/bulk-checkin.c
@@ -1,6 +1,7 @@
 /*
  * Copyright (c) 2011, Google Inc.
  */
+#include "cache.h"
 #include "bulk-checkin.h"
 #include "csum-file.h"
 #include "pack.h"
diff --git a/bulk-checkin.h b/bulk-checkin.h
index 4f599f8..fbd40fc 100644
--- a/bulk-checkin.h
+++ b/bulk-checkin.h
@@ -4,8 +4,6 @@
 #ifndef BULK_CHECKIN_H
 #define BULK_CHECKIN_H
 
-#include "cache.h"
-
 extern int index_bulk_checkin(unsigned char sha1[],
 			      int fd, size_t size, enum object_type type,
 			      const char *path, unsigned flags);
diff --git a/bundle.c b/bundle.c
index 1222952..2e2dbd5 100644
--- a/bundle.c
+++ b/bundle.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "lockfile.h"
 #include "bundle.h"
 #include "object.h"
 #include "commit.h"
@@ -209,65 +210,80 @@
 {
 	unsigned long size;
 	enum object_type type;
-	char *buf, *line, *lineend;
+	char *buf = NULL, *line, *lineend;
 	unsigned long date;
+	int result = 1;
 
 	if (revs->max_age == -1 && revs->min_age == -1)
-		return 1;
+		goto out;
 
 	buf = read_sha1_file(tag->sha1, &type, &size);
 	if (!buf)
-		return 1;
+		goto out;
 	line = memmem(buf, size, "\ntagger ", 8);
 	if (!line++)
-		return 1;
-	lineend = memchr(line, buf + size - line, '\n');
-	line = memchr(line, lineend ? lineend - line : buf + size - line, '>');
+		goto out;
+	lineend = memchr(line, '\n', buf + size - line);
+	line = memchr(line, '>', lineend ? lineend - line : buf + size - line);
 	if (!line++)
-		return 1;
+		goto out;
 	date = strtoul(line, NULL, 10);
-	free(buf);
-	return (revs->max_age == -1 || revs->max_age < date) &&
+	result = (revs->max_age == -1 || revs->max_age < date) &&
 		(revs->min_age == -1 || revs->min_age > date);
+out:
+	free(buf);
+	return result;
 }
 
-int create_bundle(struct bundle_header *header, const char *path,
-		  int argc, const char **argv)
+static int write_pack_data(int bundle_fd, struct lock_file *lock, struct rev_info *revs)
 {
-	static struct lock_file lock;
-	int bundle_fd = -1;
-	int bundle_to_stdout;
-	struct argv_array argv_boundary = ARGV_ARRAY_INIT;
-	struct argv_array argv_pack = ARGV_ARRAY_INIT;
-	int i, ref_count = 0;
+	struct child_process pack_objects = CHILD_PROCESS_INIT;
+	int i;
+
+	argv_array_pushl(&pack_objects.args,
+			 "pack-objects", "--all-progress-implied",
+			 "--stdout", "--thin", "--delta-base-offset",
+			 NULL);
+	pack_objects.in = -1;
+	pack_objects.out = bundle_fd;
+	pack_objects.git_cmd = 1;
+	if (start_command(&pack_objects))
+		return error(_("Could not spawn pack-objects"));
+
+	/*
+	 * start_command closed bundle_fd if it was > 1
+	 * so set the lock fd to -1 so commit_lock_file()
+	 * won't fail trying to close it.
+	 */
+	lock->fd = -1;
+
+	for (i = 0; i < revs->pending.nr; i++) {
+		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, "\n", 1);
+	}
+	close(pack_objects.in);
+	if (finish_command(&pack_objects))
+		return error(_("pack-objects died"));
+	return 0;
+}
+
+static int compute_and_write_prerequisites(int bundle_fd,
+					   struct rev_info *revs,
+					   int argc, const char **argv)
+{
+	struct child_process rls = CHILD_PROCESS_INIT;
 	struct strbuf buf = STRBUF_INIT;
-	struct rev_info revs;
-	struct child_process rls;
 	FILE *rls_fout;
+	int i;
 
-	bundle_to_stdout = !strcmp(path, "-");
-	if (bundle_to_stdout)
-		bundle_fd = 1;
-	else
-		bundle_fd = hold_lock_file_for_update(&lock, path,
-						      LOCK_DIE_ON_ERROR);
-
-	/* write signature */
-	write_or_die(bundle_fd, bundle_signature, strlen(bundle_signature));
-
-	/* init revs to list objects for pack-objects later */
-	save_commit_buffer = 0;
-	init_revisions(&revs, NULL);
-
-	/* write prerequisites */
-	argv_array_pushl(&argv_boundary,
+	argv_array_pushl(&rls.args,
 			 "rev-list", "--boundary", "--pretty=oneline",
 			 NULL);
 	for (i = 1; i < argc; i++)
-		argv_array_push(&argv_boundary, argv[i]);
-
-	memset(&rls, 0, sizeof(rls));
-	rls.argv = argv_boundary.argv;
+		argv_array_push(&rls.args, argv[i]);
 	rls.out = -1;
 	rls.git_cmd = 1;
 	if (start_command(&rls))
@@ -280,7 +296,7 @@
 			if (!get_sha1_hex(buf.buf + 1, sha1)) {
 				struct object *object = parse_object_or_die(sha1, buf.buf);
 				object->flags |= UNINTERESTING;
-				add_pending_object(&revs, object, buf.buf);
+				add_pending_object(revs, object, buf.buf);
 			}
 		} else if (!get_sha1_hex(buf.buf, sha1)) {
 			struct object *object = parse_object_or_die(sha1, buf.buf);
@@ -291,17 +307,25 @@
 	fclose(rls_fout);
 	if (finish_command(&rls))
 		return error(_("rev-list died"));
+	return 0;
+}
 
-	/* write references */
-	argc = setup_revisions(argc, argv, &revs, NULL);
+/*
+ * Write out bundle refs based on the tips already
+ * parsed into revs.pending. As a side effect, may
+ * manipulate revs.pending to include additional
+ * necessary objects (like tags).
+ *
+ * Returns the number of refs written, or negative
+ * on error.
+ */
+static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
+{
+	int i;
+	int ref_count = 0;
 
-	if (argc > 1)
-		return error(_("unrecognized argument: %s"), argv[1]);
-
-	object_array_remove_duplicates(&revs.pending);
-
-	for (i = 0; i < revs.pending.nr; i++) {
-		struct object_array_entry *e = revs.pending.objects + i;
+	for (i = 0; i < revs->pending.nr; i++) {
+		struct object_array_entry *e = revs->pending.objects + i;
 		unsigned char sha1[20];
 		char *ref;
 		const char *display_ref;
@@ -311,12 +335,12 @@
 			continue;
 		if (dwim_ref(e->name, strlen(e->name), sha1, &ref) != 1)
 			continue;
-		if (read_ref_full(e->name, sha1, 1, &flag))
+		if (read_ref_full(e->name, RESOLVE_REF_READING, sha1, &flag))
 			flag = 0;
 		display_ref = (flag & REF_ISSYMREF) ? e->name : ref;
 
 		if (e->item->type == OBJ_TAG &&
-				!is_tag_in_date_range(e->item, &revs)) {
+				!is_tag_in_date_range(e->item, revs)) {
 			e->item->flags |= UNINTERESTING;
 			continue;
 		}
@@ -362,7 +386,7 @@
 				 */
 				obj = parse_object_or_die(sha1, e->name);
 				obj->flags |= SHOWN;
-				add_pending_object(&revs, obj, e->name);
+				add_pending_object(revs, obj, e->name);
 			}
 			free(ref);
 			continue;
@@ -375,42 +399,56 @@
 		write_or_die(bundle_fd, "\n", 1);
 		free(ref);
 	}
-	if (!ref_count)
-		die(_("Refusing to create empty bundle."));
 
 	/* end header */
 	write_or_die(bundle_fd, "\n", 1);
+	return ref_count;
+}
+
+int create_bundle(struct bundle_header *header, const char *path,
+		  int argc, const char **argv)
+{
+	static struct lock_file lock;
+	int bundle_fd = -1;
+	int bundle_to_stdout;
+	int ref_count = 0;
+	struct rev_info revs;
+
+	bundle_to_stdout = !strcmp(path, "-");
+	if (bundle_to_stdout)
+		bundle_fd = 1;
+	else
+		bundle_fd = hold_lock_file_for_update(&lock, path,
+						      LOCK_DIE_ON_ERROR);
+
+	/* write signature */
+	write_or_die(bundle_fd, bundle_signature, strlen(bundle_signature));
+
+	/* init revs to list objects for pack-objects later */
+	save_commit_buffer = 0;
+	init_revisions(&revs, NULL);
+
+	/* write prerequisites */
+	if (compute_and_write_prerequisites(bundle_fd, &revs, argc, argv))
+		return -1;
+
+	argc = setup_revisions(argc, argv, &revs, NULL);
+
+	if (argc > 1)
+		return error(_("unrecognized argument: %s"), argv[1]);
+
+	object_array_remove_duplicates(&revs.pending);
+
+	ref_count = write_bundle_refs(bundle_fd, &revs);
+	if (!ref_count)
+		die(_("Refusing to create empty bundle."));
+	else if (ref_count < 0)
+		return -1;
 
 	/* write pack */
-	argv_array_pushl(&argv_pack,
-			 "pack-objects", "--all-progress-implied",
-			 "--stdout", "--thin", "--delta-base-offset",
-			 NULL);
-	memset(&rls, 0, sizeof(rls));
-	rls.argv = argv_pack.argv;
-	rls.in = -1;
-	rls.out = bundle_fd;
-	rls.git_cmd = 1;
-	if (start_command(&rls))
-		return error(_("Could not spawn pack-objects"));
+	if (write_pack_data(bundle_fd, &lock, &revs))
+		return -1;
 
-	/*
-	 * start_command closed bundle_fd if it was > 1
-	 * so set the lock fd to -1 so commit_lock_file()
-	 * won't fail trying to close it.
-	 */
-	lock.fd = -1;
-
-	for (i = 0; i < revs.pending.nr; i++) {
-		struct object *object = revs.pending.objects[i].item;
-		if (object->flags & UNINTERESTING)
-			write_or_die(rls.in, "^", 1);
-		write_or_die(rls.in, sha1_to_hex(object->sha1), 40);
-		write_or_die(rls.in, "\n", 1);
-	}
-	close(rls.in);
-	if (finish_command(&rls))
-		return error(_("pack-objects died"));
 	if (!bundle_to_stdout) {
 		if (commit_lock_file(&lock))
 			die_errno(_("cannot create '%s'"), path);
@@ -422,14 +460,13 @@
 {
 	const char *argv_index_pack[] = {"index-pack",
 					 "--fix-thin", "--stdin", NULL, NULL};
-	struct child_process ip;
+	struct child_process ip = CHILD_PROCESS_INIT;
 
 	if (flags & BUNDLE_VERBOSE)
 		argv_index_pack[3] = "-v";
 
 	if (verify_bundle(header, 0))
 		return -1;
-	memset(&ip, 0, sizeof(ip));
 	ip.argv = argv_index_pack;
 	ip.in = bundle_fd;
 	ip.no_stdout = 1;
diff --git a/cache-tree.c b/cache-tree.c
index 7fa524a..32772b9 100644
--- a/cache-tree.c
+++ b/cache-tree.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "lockfile.h"
 #include "tree.h"
 #include "tree-walk.h"
 #include "cache-tree.h"
@@ -98,7 +99,7 @@
 	return find_subtree(it, path, pathlen, 1);
 }
 
-void cache_tree_invalidate_path(struct cache_tree *it, const char *path)
+static int do_invalidate_path(struct cache_tree *it, const char *path)
 {
 	/* a/b/c
 	 * ==> invalidate self
@@ -116,7 +117,7 @@
 #endif
 
 	if (!it)
-		return;
+		return 0;
 	slash = strchrnul(path, '/');
 	namelen = slash - path;
 	it->entry_count = -1;
@@ -137,14 +138,21 @@
 				(it->subtree_nr - pos - 1));
 			it->subtree_nr--;
 		}
-		return;
+		return 1;
 	}
 	down = find_subtree(it, path, namelen, 0);
 	if (down)
-		cache_tree_invalidate_path(down->cache_tree, slash + 1);
+		do_invalidate_path(down->cache_tree, slash + 1);
+	return 1;
 }
 
-static int verify_cache(const struct cache_entry * const *cache,
+void cache_tree_invalidate_path(struct index_state *istate, const char *path)
+{
+	if (do_invalidate_path(istate->cache_tree, path))
+		istate->cache_changed |= CACHE_TREE_CHANGED;
+}
+
+static int verify_cache(struct cache_entry **cache,
 			int entries, int flags)
 {
 	int i, funny;
@@ -229,7 +237,7 @@
 }
 
 static int update_one(struct cache_tree *it,
-		      const struct cache_entry * const *cache,
+		      struct cache_entry **cache,
 		      int entries,
 		      const char *base,
 		      int baselen,
@@ -239,9 +247,12 @@
 	struct strbuf buffer;
 	int missing_ok = flags & WRITE_TREE_MISSING_OK;
 	int dryrun = flags & WRITE_TREE_DRY_RUN;
+	int repair = flags & WRITE_TREE_REPAIR;
 	int to_invalidate = 0;
 	int i;
 
+	assert(!(dryrun && repair));
+
 	*skip_count = 0;
 
 	if (0 <= it->entry_count && has_sha1_file(it->sha1))
@@ -292,6 +303,8 @@
 				    flags);
 		if (subcnt < 0)
 			return subcnt;
+		if (!subcnt)
+			die("index cache-tree records empty sub-tree");
 		i += subcnt;
 		sub->count = subcnt; /* to be used in the next loop */
 		*skip_count += subskip;
@@ -313,6 +326,7 @@
 		int pathlen, entlen;
 		const unsigned char *sha1;
 		unsigned mode;
+		int expected_missing = 0;
 
 		path = ce->name;
 		pathlen = ce_namelen(ce);
@@ -329,8 +343,10 @@
 			i += sub->count;
 			sha1 = sub->cache_tree->sha1;
 			mode = S_IFDIR;
-			if (sub->cache_tree->entry_count < 0)
+			if (sub->cache_tree->entry_count < 0) {
 				to_invalidate = 1;
+				expected_missing = 1;
+			}
 		}
 		else {
 			sha1 = ce->sha1;
@@ -340,6 +356,8 @@
 		}
 		if (mode != S_IFGITLINK && !missing_ok && !has_sha1_file(sha1)) {
 			strbuf_release(&buffer);
+			if (expected_missing)
+				return -1;
 			return error("invalid object %06o %s for '%.*s'",
 				mode, sha1_to_hex(sha1), entlen+baselen, path);
 		}
@@ -374,7 +392,14 @@
 #endif
 	}
 
-	if (dryrun)
+	if (repair) {
+		unsigned char sha1[20];
+		hash_sha1_file(buffer.buf, buffer.len, tree_type, sha1);
+		if (has_sha1_file(sha1))
+			hashcpy(it->sha1, sha1);
+		else
+			to_invalidate = 1;
+	} else if (dryrun)
 		hash_sha1_file(buffer.buf, buffer.len, tree_type, it->sha1);
 	else if (write_sha1_file(buffer.buf, buffer.len, tree_type, it->sha1)) {
 		strbuf_release(&buffer);
@@ -391,18 +416,19 @@
 	return i;
 }
 
-int cache_tree_update(struct cache_tree *it,
-		      const struct cache_entry * const *cache,
-		      int entries,
-		      int flags)
+int cache_tree_update(struct index_state *istate, int flags)
 {
-	int i, skip;
-	i = verify_cache(cache, entries, flags);
+	struct cache_tree *it = istate->cache_tree;
+	struct cache_entry **cache = istate->cache;
+	int entries = istate->cache_nr;
+	int skip, i = verify_cache(cache, entries, flags);
+
 	if (i)
 		return i;
 	i = update_one(it, cache, entries, "", 0, &skip, flags);
 	if (i < 0)
 		return i;
+	istate->cache_changed |= CACHE_TREE_CHANGED;
 	return 0;
 }
 
@@ -590,13 +616,10 @@
 
 	was_valid = cache_tree_fully_valid(active_cache_tree);
 	if (!was_valid) {
-		if (cache_tree_update(active_cache_tree,
-				      (const struct cache_entry * const *)active_cache,
-				      active_nr, flags) < 0)
+		if (cache_tree_update(&the_index, flags) < 0)
 			return WRITE_TREE_UNMERGED_INDEX;
 		if (0 <= newfd) {
-			if (!write_cache(newfd, active_cache, active_nr) &&
-			    !commit_lock_file(lock_file))
+			if (!write_locked_index(&the_index, lock_file, COMMIT_LOCK))
 				newfd = -1;
 		}
 		/* Not being able to write is fine -- we are only interested
@@ -649,11 +672,12 @@
 	it->entry_count = cnt;
 }
 
-void prime_cache_tree(struct cache_tree **it, struct tree *tree)
+void prime_cache_tree(struct index_state *istate, struct tree *tree)
 {
-	cache_tree_free(it);
-	*it = cache_tree();
-	prime_cache_tree_rec(*it, tree);
+	cache_tree_free(&istate->cache_tree);
+	istate->cache_tree = cache_tree();
+	prime_cache_tree_rec(istate->cache_tree, tree);
+	istate->cache_changed |= CACHE_TREE_CHANGED;
 }
 
 /*
@@ -692,7 +716,5 @@
 {
 	if (!the_index.cache_tree)
 		the_index.cache_tree = cache_tree();
-	return cache_tree_update(the_index.cache_tree,
-				 (const struct cache_entry * const *)the_index.cache,
-				 the_index.cache_nr, flags);
+	return cache_tree_update(&the_index, flags);
 }
diff --git a/cache-tree.h b/cache-tree.h
index f1923ad..aa7b3e4 100644
--- a/cache-tree.h
+++ b/cache-tree.h
@@ -23,14 +23,14 @@
 
 struct cache_tree *cache_tree(void);
 void cache_tree_free(struct cache_tree **);
-void cache_tree_invalidate_path(struct cache_tree *, const char *);
+void cache_tree_invalidate_path(struct index_state *, const char *);
 struct cache_tree_sub *cache_tree_sub(struct cache_tree *, const char *);
 
 void cache_tree_write(struct strbuf *, struct cache_tree *root);
 struct cache_tree *cache_tree_read(const char *buffer, unsigned long size);
 
 int cache_tree_fully_valid(struct cache_tree *);
-int cache_tree_update(struct cache_tree *, const struct cache_entry * const *, int, int);
+int cache_tree_update(struct index_state *, int);
 
 int update_main_cache_tree(int);
 
@@ -39,6 +39,7 @@
 #define WRITE_TREE_IGNORE_CACHE_TREE 2
 #define WRITE_TREE_DRY_RUN 4
 #define WRITE_TREE_SILENT 8
+#define WRITE_TREE_REPAIR 16
 
 /* error return codes */
 #define WRITE_TREE_UNREADABLE_INDEX (-1)
@@ -46,7 +47,7 @@
 #define WRITE_TREE_PREFIX_ERROR (-3)
 
 int write_cache_as_tree(unsigned char *sha1, int flags, const char *prefix);
-void prime_cache_tree(struct cache_tree **, struct tree *);
+void prime_cache_tree(struct index_state *, struct tree *);
 
 extern int cache_tree_matches_traversal(struct cache_tree *, struct name_entry *ent, struct traverse_info *info);
 
diff --git a/cache.h b/cache.h
index c708062..99ed096 100644
--- a/cache.h
+++ b/cache.h
@@ -7,6 +7,8 @@
 #include "advice.h"
 #include "gettext.h"
 #include "convert.h"
+#include "trace.h"
+#include "string-list.h"
 
 #include SHA1_HEADER
 #ifndef git_SHA_CTX
@@ -75,6 +77,21 @@
 #define S_ISGITLINK(m)	(((m) & S_IFMT) == S_IFGITLINK)
 
 /*
+ * Some mode bits are also used internally for computations.
+ *
+ * They *must* not overlap with any valid modes, and they *must* not be emitted
+ * to outside world - i.e. appear on disk or network. In other words, it's just
+ * temporary fields, which we internally use, but they have to stay in-house.
+ *
+ * ( such approach is valid, as standard S_IF* fits into 16 bits, and in Git
+ *   codebase mode is `unsigned int` which is assumed to be at least 32 bits )
+ */
+
+/* used internally in tree-diff */
+#define S_DIFFTREE_IFXMIN_NEQ	0x80000000
+
+
+/*
  * Intensive research over the course of many years has shown that
  * port 9418 is totally unused by anything else. Or
  *
@@ -135,6 +152,7 @@
 	unsigned int ce_mode;
 	unsigned int ce_flags;
 	unsigned int ce_namelen;
+	unsigned int index;	/* for link extension */
 	unsigned char sha1[20];
 	char name[FLEX_ARRAY]; /* more */
 };
@@ -145,7 +163,7 @@
 #define CE_STAGESHIFT 12
 
 /*
- * Range 0xFFFF0000 in ce_flags is divided into
+ * Range 0xFFFF0FFF in ce_flags is divided into
  * two parts: in-memory flags and on-disk ones.
  * Flags in CE_EXTENDED_FLAGS will get saved on-disk
  * if you want to save a new flag, add it in
@@ -168,6 +186,9 @@
 /* used to temporarily mark paths matched by pathspecs */
 #define CE_MATCHED           (1 << 26)
 
+#define CE_UPDATE_IN_BASE    (1 << 27)
+#define CE_STRIP_NAME        (1 << 28)
+
 /*
  * Extended on-disk flags
  */
@@ -268,12 +289,22 @@
 
 #define cache_entry_size(len) (offsetof(struct cache_entry,name) + (len) + 1)
 
+#define SOMETHING_CHANGED	(1 << 0) /* unclassified changes go here */
+#define CE_ENTRY_CHANGED	(1 << 1)
+#define CE_ENTRY_REMOVED	(1 << 2)
+#define CE_ENTRY_ADDED		(1 << 3)
+#define RESOLVE_UNDO_CHANGED	(1 << 4)
+#define CACHE_TREE_CHANGED	(1 << 5)
+#define SPLIT_INDEX_ORDERED	(1 << 6)
+
+struct split_index;
 struct index_state {
 	struct cache_entry **cache;
 	unsigned int version;
 	unsigned int cache_nr, cache_alloc, cache_changed;
 	struct string_list *resolve_undo;
 	struct cache_tree *cache_tree;
+	struct split_index *split_index;
 	struct cache_time timestamp;
 	unsigned name_hash_initialized : 1,
 		 initialized : 1;
@@ -302,7 +333,6 @@
 #define read_cache_preload(pathspec) read_index_preload(&the_index, (pathspec))
 #define is_cache_unborn() is_index_unborn(&the_index)
 #define read_cache_unmerged() read_index_unmerged(&the_index)
-#define write_cache(newfd, cache, entries) write_index(&the_index, (newfd))
 #define discard_cache() discard_index(&the_index)
 #define unmerged_cache() unmerged_index(&the_index)
 #define cache_name_pos(name, namelen) index_name_pos(&the_index,(name),(namelen))
@@ -452,17 +482,22 @@
 				alloc = (nr); \
 			else \
 				alloc = alloc_nr(alloc); \
-			x = xrealloc((x), alloc * sizeof(*(x))); \
+			REALLOC_ARRAY(x, alloc); \
 		} \
 	} while (0)
 
 /* Initialize and use the cache information */
+struct lock_file;
 extern int read_index(struct index_state *);
 extern int read_index_preload(struct index_state *, const struct pathspec *pathspec);
+extern int do_read_index(struct index_state *istate, const char *path,
+			 int must_exist); /* for testting only! */
 extern int read_index_from(struct index_state *, const char *path);
 extern int is_index_unborn(struct index_state *);
 extern int read_index_unmerged(struct index_state *);
-extern int write_index(struct index_state *, int newfd);
+#define COMMIT_LOCK		(1 << 0)
+#define CLOSE_LOCK		(1 << 1)
+extern int write_locked_index(struct index_state *, struct lock_file *lock, unsigned flags);
 extern int discard_index(struct index_state *);
 extern int unmerged_index(const struct index_state *);
 extern int verify_path(const char *path);
@@ -474,6 +509,7 @@
 #define ADD_CACHE_SKIP_DFCHECK 4	/* Ok to skip DF conflict checks */
 #define ADD_CACHE_JUST_APPEND 8		/* Append only; tree.c::read_tree() */
 #define ADD_CACHE_NEW_ONLY 16		/* Do not replace existing ones */
+#define ADD_CACHE_KEEP_CACHE_TREE 32	/* Do not invalidate cache-tree */
 extern int add_index_entry(struct index_state *, struct cache_entry *ce, int option);
 extern void rename_index_entry_at(struct index_state *, int pos, const char *new_name);
 extern int remove_index_entry_at(struct index_state *, int pos);
@@ -534,27 +570,11 @@
 #define REFRESH_IN_PORCELAIN	0x0020	/* user friendly output, not "needs update" */
 extern int refresh_index(struct index_state *, unsigned int flags, const struct pathspec *pathspec, char *seen, const char *header_msg);
 
-struct lock_file {
-	struct lock_file *next;
-	int fd;
-	pid_t owner;
-	char on_list;
-	char filename[PATH_MAX];
-};
-#define LOCK_DIE_ON_ERROR 1
-#define LOCK_NODEREF 2
-extern int unable_to_lock_error(const char *path, int err);
-extern NORETURN void unable_to_lock_index_die(const char *path, int err);
-extern int hold_lock_file_for_update(struct lock_file *, const char *path, int);
-extern int hold_lock_file_for_append(struct lock_file *, const char *path, int);
-extern int commit_lock_file(struct lock_file *);
 extern void update_index_if_able(struct index_state *, struct lock_file *);
 
 extern int hold_locked_index(struct lock_file *, int);
-extern int commit_locked_index(struct lock_file *);
 extern void set_alternate_index_output(const char *);
-extern int close_lock_file(struct lock_file *);
-extern void rollback_lock_file(struct lock_file *);
+
 extern int delete_ref(const char *, const unsigned char *sha1, int delopt);
 
 /* Environment bits from configuration mechanism */
@@ -603,6 +623,7 @@
  * that is subject to stripspace.
  */
 extern char comment_line_char;
+extern int auto_comment_line_char;
 
 enum branch_track {
 	BRANCH_TRACK_UNSPECIFIED = -1,
@@ -810,7 +831,6 @@
 int longest_ancestor_length(const char *path, struct string_list *prefixes);
 char *strip_path_suffix(const char *path, const char *suffix);
 int daemon_avoid_alias(const char *path);
-int offset_1st_component(const char *path);
 
 /* object replacement */
 #define LOOKUP_REPLACE_OBJECT 1
@@ -930,8 +950,8 @@
 extern int get_sha1_hex(const char *hex, unsigned char *sha1);
 
 extern char *sha1_to_hex(const unsigned char *sha1);	/* static buffer result! */
-extern int read_ref_full(const char *refname, unsigned char *sha1,
-			 int reading, int *flags);
+extern int read_ref_full(const char *refname, int resolve_flags,
+			 unsigned char *sha1, int *flags);
 extern int read_ref(const char *refname, unsigned char *sha1);
 
 /*
@@ -943,29 +963,49 @@
  * or the input ref.
  *
  * If the reference cannot be resolved to an object, the behavior
- * depends on the "reading" argument:
+ * depends on the RESOLVE_REF_READING flag:
  *
- * - If reading is set, return NULL.
+ * - If RESOLVE_REF_READING is set, return NULL.
  *
- * - If reading is not set, clear sha1 and return the name of the last
- *   reference name in the chain, which will either be a non-symbolic
+ * - If RESOLVE_REF_READING is not set, clear sha1 and return the name of
+ *   the last reference name in the chain, which will either be a non-symbolic
  *   reference or an undefined reference.  If this is a prelude to
  *   "writing" to the ref, the return value is the name of the ref
  *   that will actually be created or changed.
  *
- * If flag is non-NULL, set the value that it points to the
+ * If the RESOLVE_REF_NO_RECURSE flag is passed, only resolves one
+ * level of symbolic reference.  The value stored in sha1 for a symbolic
+ * reference will always be null_sha1 in this case, and the return
+ * value is the reference that the symref refers to directly.
+ *
+ * If flags is non-NULL, set the value that it points to the
  * combination of REF_ISPACKED (if the reference was found among the
- * packed references) and REF_ISSYMREF (if the initial reference was a
- * symbolic reference).
+ * packed references), REF_ISSYMREF (if the initial reference was a
+ * symbolic reference), REF_BAD_NAME (if the reference name is ill
+ * formed --- see RESOLVE_REF_ALLOW_BAD_NAME below), and REF_ISBROKEN
+ * (if the ref is malformed or has a bad name). See refs.h for more detail
+ * on each flag.
  *
  * If ref is not a properly-formatted, normalized reference, return
  * NULL.  If more than MAXDEPTH recursive symbolic lookups are needed,
  * give up and return NULL.
  *
- * errno is sometimes set on errors, but not always.
+ * RESOLVE_REF_ALLOW_BAD_NAME allows resolving refs even when their
+ * name is invalid according to git-check-ref-format(1).  If the name
+ * is bad then the value stored in sha1 will be null_sha1 and the two
+ * flags REF_ISBROKEN and REF_BAD_NAME will be set.
+ *
+ * Even with RESOLVE_REF_ALLOW_BAD_NAME, names that escape the refs/
+ * directory and do not consist of all caps and underscores cannot be
+ * resolved. The function returns NULL for such ref names.
+ * Caps and underscores refers to the special refs, such as HEAD,
+ * FETCH_HEAD and friends, that all live outside of the refs/ directory.
  */
-extern const char *resolve_ref_unsafe(const char *ref, unsigned char *sha1, int reading, int *flag);
-extern char *resolve_refdup(const char *ref, unsigned char *sha1, int reading, int *flag);
+#define RESOLVE_REF_READING 0x01
+#define RESOLVE_REF_NO_RECURSE 0x02
+#define RESOLVE_REF_ALLOW_BAD_NAME 0x04
+extern const char *resolve_ref_unsafe(const char *ref, int resolve_flags, unsigned char *sha1, int *flags);
+extern char *resolve_refdup(const char *ref, int resolve_flags, unsigned char *sha1, int *flags);
 
 extern int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref);
 extern int dwim_log(const char *str, int len, unsigned char *sha1, char **ref);
@@ -984,7 +1024,7 @@
 
 extern int base_name_compare(const char *name1, int len1, int mode1, const char *name2, int len2, int mode2);
 extern int df_name_compare(const char *name1, int len1, int mode1, const char *name2, int len2, int mode2);
-extern int cache_name_compare(const char *name1, int len1, const char *name2, int len2);
+extern int name_compare(const char *name1, size_t len1, const char *name2, size_t len2);
 extern int cache_name_stage_compare(const char *name1, int len1, int stage1, const char *name2, int len2, int stage2);
 
 extern void *read_object_with_reference(const unsigned char *sha1,
@@ -1001,6 +1041,7 @@
 	DATE_SHORT,
 	DATE_LOCAL,
 	DATE_ISO8601,
+	DATE_ISO8601_STRICT,
 	DATE_RFC2822,
 	DATE_RAW
 };
@@ -1008,10 +1049,10 @@
 const char *show_date(unsigned long time, int timezone, enum date_mode mode);
 void show_date_relative(unsigned long time, int tz, const struct timeval *now,
 			struct strbuf *timebuf);
-int parse_date(const char *date, char *buf, int bufsize);
+int parse_date(const char *date, struct strbuf *out);
 int parse_date_basic(const char *date, unsigned long *timestamp, int *offset);
 int parse_expiry_date(const char *date, unsigned long *timestamp);
-void datestamp(char *buf, int bufsize);
+void datestamp(struct strbuf *out);
 #define approxidate(s) approxidate_careful((s), NULL)
 unsigned long approxidate_careful(const char *, int *);
 unsigned long approxidate_relative(const char *date, const struct timeval *now);
@@ -1025,6 +1066,7 @@
 extern const char *git_committer_info(int);
 extern const char *fmt_ident(const char *name, const char *email, const char *date_str, int);
 extern const char *fmt_name(const char *name, const char *email);
+extern const char *ident_default_name(void);
 extern const char *ident_default_email(void);
 extern const char *git_editor(void);
 extern const char *git_pager(int stdout_is_tty);
@@ -1047,6 +1089,13 @@
 extern int split_ident_line(struct ident_split *, const char *, int);
 
 /*
+ * Like show_date, but pull the timestamp and tz parameters from
+ * the ident_split. It will also sanity-check the values and produce
+ * a well-known sentinel date if they appear bogus.
+ */
+const char *show_ident_date(const struct ident_split *id, enum date_mode mode);
+
+/*
  * Compare split idents for equality or strict ordering. Note that we
  * compare only the ident part of the line, ignoring any timestamp.
  *
@@ -1056,6 +1105,7 @@
 extern int ident_cmp(const struct ident_split *, const struct ident_split *);
 
 struct checkout {
+	struct index_state *istate;
 	const char *base_dir;
 	int base_dir_len;
 	unsigned force:1,
@@ -1068,12 +1118,16 @@
 extern int checkout_entry(struct cache_entry *ce, const struct checkout *state, char *topath);
 
 struct cache_def {
-	char path[PATH_MAX + 1];
-	int len;
+	struct strbuf path;
 	int flags;
 	int track_flags;
 	int prefix_len_stat_func;
 };
+#define CACHE_DEF_INIT { STRBUF_INIT, 0, 0, 0 }
+static inline void cache_def_clear(struct cache_def *cache)
+{
+	strbuf_release(&cache->path);
+}
 
 extern int has_symlink_leading_path(const char *name, int len);
 extern int threaded_has_symlink_leading_path(struct cache_def *, const char *, int);
@@ -1091,7 +1145,7 @@
 extern void read_info_alternates(const char * relative_base, int depth);
 extern void add_to_alternates_file(const char *reference);
 typedef int alt_odb_fn(struct alternate_object_database *, void *);
-extern void foreach_alt_odb(alt_odb_fn, void*);
+extern int foreach_alt_odb(alt_odb_fn, void*);
 
 struct pack_window {
 	struct pack_window *next;
@@ -1187,6 +1241,50 @@
 extern unsigned long get_size_from_delta(struct packed_git *, struct pack_window **, off_t);
 extern int unpack_object_header(struct packed_git *, struct pack_window **, off_t *, unsigned long *);
 
+/*
+ * Iterate over the files in the loose-object parts of the object
+ * directory "path", triggering the following callbacks:
+ *
+ *  - loose_object is called for each loose object we find.
+ *
+ *  - loose_cruft is called for any files that do not appear to be
+ *    loose objects. Note that we only look in the loose object
+ *    directories "objects/[0-9a-f]{2}/", so we will not report
+ *    "objects/foobar" as cruft.
+ *
+ *  - loose_subdir is called for each top-level hashed subdirectory
+ *    of the object directory (e.g., "$OBJDIR/f0"). It is called
+ *    after the objects in the directory are processed.
+ *
+ * Any callback that is NULL will be ignored. Callbacks returning non-zero
+ * will end the iteration.
+ */
+typedef int each_loose_object_fn(const unsigned char *sha1,
+				 const char *path,
+				 void *data);
+typedef int each_loose_cruft_fn(const char *basename,
+				const char *path,
+				void *data);
+typedef int each_loose_subdir_fn(int nr,
+				 const char *path,
+				 void *data);
+int for_each_loose_file_in_objdir(const char *path,
+				  each_loose_object_fn obj_cb,
+				  each_loose_cruft_fn cruft_cb,
+				  each_loose_subdir_fn subdir_cb,
+				  void *data);
+
+/*
+ * Iterate over loose and packed objects in both the local
+ * repository and any alternates repositories.
+ */
+typedef int each_packed_object_fn(const unsigned char *sha1,
+				  struct packed_git *pack,
+				  uint32_t pos,
+				  void *data);
+extern int for_each_loose_object(each_loose_object_fn, void *);
+extern int for_each_packed_object(each_packed_object_fn, void *);
+
 struct object_info {
 	/* Request */
 	enum object_type *typep;
@@ -1233,6 +1331,8 @@
 #define CONFIG_INVALID_PATTERN 6
 #define CONFIG_GENERIC_ERROR 7
 
+#define CONFIG_REGEX_NONE ((void *)1)
+
 struct git_config_source {
 	unsigned int use_stdin:1;
 	const char *file;
@@ -1246,7 +1346,7 @@
 			       const char *buf, size_t len, void *data);
 extern void git_config_push_parameter(const char *text);
 extern int git_config_from_parameters(config_fn_t fn, void *data);
-extern int git_config(config_fn_t fn, void *);
+extern void git_config(config_fn_t fn, void *);
 extern int git_config_with_options(config_fn_t fn, void *,
 				   struct git_config_source *config_source,
 				   int respect_includes);
@@ -1270,10 +1370,11 @@
 extern const char *git_etc_gitconfig(void);
 extern int check_repository_format_version(const char *var, const char *value, void *cb);
 extern int git_env_bool(const char *, int);
+extern unsigned long git_env_ulong(const char *, unsigned long);
 extern int git_config_system(void);
 extern int config_error_nonbool(const char *);
-#if defined(__GNUC__) && ! defined(__clang__)
-#define config_error_nonbool(s) (config_error_nonbool(s), -1)
+#if defined(__GNUC__)
+#define config_error_nonbool(s) (config_error_nonbool(s), const_error())
 #endif
 extern const char *get_log_output_encoding(void);
 extern const char *get_commit_output_encoding(void);
@@ -1303,6 +1404,69 @@
 			    const char **subsection, int *subsection_len,
 			    const char **key);
 
+struct config_set_element {
+	struct hashmap_entry ent;
+	char *key;
+	struct string_list value_list;
+};
+
+struct configset_list_item {
+	struct config_set_element *e;
+	int value_index;
+};
+
+/*
+ * the contents of the list are ordered according to their
+ * position in the config files and order of parsing the files.
+ * (i.e. key-value pair at the last position of .git/config will
+ * be at the last item of the list)
+ */
+struct configset_list {
+	struct configset_list_item *items;
+	unsigned int nr, alloc;
+};
+
+struct config_set {
+	struct hashmap config_hash;
+	int hash_initialized;
+	struct configset_list list;
+};
+
+extern void git_configset_init(struct config_set *cs);
+extern int git_configset_add_file(struct config_set *cs, const char *filename);
+extern int git_configset_get_value(struct config_set *cs, const char *key, const char **value);
+extern const struct string_list *git_configset_get_value_multi(struct config_set *cs, const char *key);
+extern void git_configset_clear(struct config_set *cs);
+extern int git_configset_get_string_const(struct config_set *cs, const char *key, const char **dest);
+extern int git_configset_get_string(struct config_set *cs, const char *key, char **dest);
+extern int git_configset_get_int(struct config_set *cs, const char *key, int *dest);
+extern int git_configset_get_ulong(struct config_set *cs, const char *key, unsigned long *dest);
+extern int git_configset_get_bool(struct config_set *cs, const char *key, int *dest);
+extern int git_configset_get_bool_or_int(struct config_set *cs, const char *key, int *is_bool, int *dest);
+extern int git_configset_get_maybe_bool(struct config_set *cs, const char *key, int *dest);
+extern int git_configset_get_pathname(struct config_set *cs, const char *key, const char **dest);
+
+extern int git_config_get_value(const char *key, const char **value);
+extern const struct string_list *git_config_get_value_multi(const char *key);
+extern void git_config_clear(void);
+extern void git_config_iter(config_fn_t fn, void *data);
+extern int git_config_get_string_const(const char *key, const char **dest);
+extern int git_config_get_string(const char *key, char **dest);
+extern int git_config_get_int(const char *key, int *dest);
+extern int git_config_get_ulong(const char *key, unsigned long *dest);
+extern int git_config_get_bool(const char *key, int *dest);
+extern int git_config_get_bool_or_int(const char *key, int *is_bool, int *dest);
+extern int git_config_get_maybe_bool(const char *key, int *dest);
+extern int git_config_get_pathname(const char *key, const char **dest);
+
+struct key_value_info {
+	const char *filename;
+	int linenr;
+};
+
+extern NORETURN void git_die_config(const char *key, const char *err, ...) __attribute__((format(printf, 2, 3)));
+extern NORETURN void git_die_config_linenr(const char *key, const char *filename, int linenr);
+
 extern int committer_ident_sufficiently_given(void);
 extern int author_ident_sufficiently_given(void);
 
@@ -1313,6 +1477,8 @@
 
 /* IO helper functions */
 extern void maybe_flush_or_die(FILE *, const char *);
+__attribute__((format (printf, 2, 3)))
+extern void fprintf_or_die(FILE *, const char *fmt, ...);
 extern int copy_fd(int ifd, int ofd);
 extern int copy_file(const char *dst, const char *src, int mode);
 extern int copy_file_with_time(const char *dst, const char *src, int mode);
@@ -1356,17 +1522,7 @@
 extern void alloc_report(void);
 extern unsigned int alloc_commit_index(void);
 
-/* trace.c */
-__attribute__((format (printf, 1, 2)))
-extern void trace_printf(const char *format, ...);
-__attribute__((format (printf, 2, 3)))
-extern void trace_argv_printf(const char **argv, const char *format, ...);
-extern void trace_repo_setup(const char *prefix);
-extern int trace_want(const char *key);
-__attribute__((format (printf, 2, 3)))
-extern void trace_printf_key(const char *key, const char *fmt, ...);
-extern void trace_strbuf(const char *key, const struct strbuf *buf);
-
+/* pkt-line.c */
 void packet_trace_identity(const char *prog);
 
 /* add */
diff --git a/check_bindir b/check_bindir
index a1c4c3e..623eadc 100755
--- a/check_bindir
+++ b/check_bindir
@@ -2,7 +2,7 @@
 bindir="$1"
 gitexecdir="$2"
 gitcmd="$3"
-if test "$bindir" != "$gitexecdir" -a -x "$gitcmd"
+if test "$bindir" != "$gitexecdir" && test -x "$gitcmd"
 then
 	echo
 	echo "!! You have installed git-* commands to new gitexecdir."
diff --git a/color.c b/color.c
index f672885..7941e93 100644
--- a/color.c
+++ b/color.c
@@ -60,13 +60,12 @@
 	return -1;
 }
 
-void color_parse(const char *value, const char *var, char *dst)
+int color_parse(const char *value, char *dst)
 {
-	color_parse_mem(value, strlen(value), var, dst);
+	return color_parse_mem(value, strlen(value), dst);
 }
 
-void color_parse_mem(const char *value, int value_len, const char *var,
-		char *dst)
+int color_parse_mem(const char *value, int value_len, char *dst)
 {
 	const char *ptr = value;
 	int len = value_len;
@@ -76,7 +75,7 @@
 
 	if (!strncasecmp(value, "reset", len)) {
 		strcpy(dst, GIT_COLOR_RESET);
-		return;
+		return 0;
 	}
 
 	/* [fg [bg]] [attr]... */
@@ -153,9 +152,9 @@
 		*dst++ = 'm';
 	}
 	*dst = 0;
-	return;
+	return 0;
 bad:
-	die("bad color value '%.*s' for variable '%s'", value_len, value, var);
+	return error(_("invalid color value: %.*s"), value_len, value);
 }
 
 int git_config_colorbool(const char *var, const char *value)
diff --git a/color.h b/color.h
index 9a8495b..f5beab1 100644
--- a/color.h
+++ b/color.h
@@ -77,8 +77,8 @@
 
 int git_config_colorbool(const char *var, const char *value);
 int want_color(int var);
-void color_parse(const char *value, const char *var, char *dst);
-void color_parse_mem(const char *value, int len, const char *var, char *dst);
+int color_parse(const char *value, char *dst);
+int color_parse_mem(const char *value, int len, char *dst);
 __attribute__((format (printf, 3, 4)))
 int color_fprintf(FILE *fp, const char *color, const char *fmt, ...);
 __attribute__((format (printf, 3, 4)))
diff --git a/column.c b/column.c
index 8d1ce88..786abe6 100644
--- a/column.c
+++ b/column.c
@@ -81,8 +81,7 @@
  */
 static void shrink_columns(struct column_data *data)
 {
-	data->width = xrealloc(data->width,
-			       sizeof(*data->width) * data->cols);
+	REALLOC_ARRAY(data->width, data->cols);
 	while (data->rows > 1) {
 		int x, total_width, cols, rows;
 		rows = data->rows;
@@ -91,8 +90,7 @@
 		data->rows--;
 		data->cols = DIV_ROUND_UP(data->list->nr, data->rows);
 		if (data->cols != cols)
-			data->width = xrealloc(data->width,
-					       sizeof(*data->width) * data->cols);
+			REALLOC_ARRAY(data->width, data->cols);
 		compute_column_width(data);
 
 		total_width = strlen(data->opts.indent);
@@ -336,8 +334,9 @@
 int git_column_config(const char *var, const char *value,
 		      const char *command, unsigned int *colopts)
 {
-	const char *it = skip_prefix(var, "column.");
-	if (!it)
+	const char *it;
+
+	if (!skip_prefix(var, "column.", &it))
 		return 0;
 
 	if (!strcmp(it, "ui"))
@@ -366,50 +365,33 @@
 }
 
 static int fd_out = -1;
-static struct child_process column_process;
+static struct child_process column_process = CHILD_PROCESS_INIT;
 
 int run_column_filter(int colopts, const struct column_options *opts)
 {
-	const char *av[10];
-	int ret, ac = 0;
-	struct strbuf sb_colopt  = STRBUF_INIT;
-	struct strbuf sb_width   = STRBUF_INIT;
-	struct strbuf sb_padding = STRBUF_INIT;
+	struct argv_array *argv;
 
 	if (fd_out != -1)
 		return -1;
 
-	av[ac++] = "column";
-	strbuf_addf(&sb_colopt, "--raw-mode=%d", colopts);
-	av[ac++] = sb_colopt.buf;
-	if (opts && opts->width) {
-		strbuf_addf(&sb_width, "--width=%d", opts->width);
-		av[ac++] = sb_width.buf;
-	}
-	if (opts && opts->indent) {
-		av[ac++] = "--indent";
-		av[ac++] = opts->indent;
-	}
-	if (opts && opts->padding) {
-		strbuf_addf(&sb_padding, "--padding=%d", opts->padding);
-		av[ac++] = sb_padding.buf;
-	}
-	av[ac] = NULL;
+	child_process_init(&column_process);
+	argv = &column_process.args;
+
+	argv_array_push(argv, "column");
+	argv_array_pushf(argv, "--raw-mode=%d", colopts);
+	if (opts && opts->width)
+		argv_array_pushf(argv, "--width=%d", opts->width);
+	if (opts && opts->indent)
+		argv_array_pushf(argv, "--indent=%s", opts->indent);
+	if (opts && opts->padding)
+		argv_array_pushf(argv, "--padding=%d", opts->padding);
 
 	fflush(stdout);
-	memset(&column_process, 0, sizeof(column_process));
 	column_process.in = -1;
 	column_process.out = dup(1);
 	column_process.git_cmd = 1;
-	column_process.argv = av;
 
-	ret = start_command(&column_process);
-
-	strbuf_release(&sb_colopt);
-	strbuf_release(&sb_width);
-	strbuf_release(&sb_padding);
-
-	if (ret)
+	if (start_command(&column_process))
 		return -2;
 
 	fd_out = dup(1);
diff --git a/combine-diff.c b/combine-diff.c
index fd6d63c..91edce5 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -12,6 +12,16 @@
 #include "sha1-array.h"
 #include "revision.h"
 
+static int compare_paths(const struct combine_diff_path *one,
+			  const struct diff_filespec *two)
+{
+	if (!S_ISDIR(one->mode) && !S_ISDIR(two->mode))
+		return strcmp(one->path, two->path);
+
+	return base_name_compare(one->path, strlen(one->path), one->mode,
+				 two->path, strlen(two->path), two->mode);
+}
+
 static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr, int n, int num_parent)
 {
 	struct diff_queue_struct *q = &diff_queued_diff;
@@ -52,7 +62,7 @@
 	i = 0;
 	while ((p = *tail) != NULL) {
 		cmp = ((i >= q->nr)
-		       ? -1 : strcmp(p->path, q->queue[i]->two->path));
+		       ? -1 : compare_paths(p, q->queue[i]->two));
 
 		if (cmp < 0) {
 			/* p->path not in q->queue[]; drop it */
@@ -1301,6 +1311,81 @@
 	return path->path;
 }
 
+
+/* find set of paths that every parent touches */
+static struct combine_diff_path *find_paths_generic(const unsigned char *sha1,
+	const struct sha1_array *parents, struct diff_options *opt)
+{
+	struct combine_diff_path *paths = NULL;
+	int i, num_parent = parents->nr;
+
+	int output_format = opt->output_format;
+	const char *orderfile = opt->orderfile;
+
+	opt->output_format = DIFF_FORMAT_NO_OUTPUT;
+	/* tell diff_tree to emit paths in sorted (=tree) order */
+	opt->orderfile = NULL;
+
+	/* D(A,P1...Pn) = D(A,P1) ^ ... ^ D(A,Pn)  (wrt paths) */
+	for (i = 0; i < num_parent; i++) {
+		/*
+		 * show stat against the first parent even when doing
+		 * combined diff.
+		 */
+		int stat_opt = (output_format &
+				(DIFF_FORMAT_NUMSTAT|DIFF_FORMAT_DIFFSTAT));
+		if (i == 0 && stat_opt)
+			opt->output_format = stat_opt;
+		else
+			opt->output_format = DIFF_FORMAT_NO_OUTPUT;
+		diff_tree_sha1(parents->sha1[i], sha1, "", opt);
+		diffcore_std(opt);
+		paths = intersect_paths(paths, i, num_parent);
+
+		/* if showing diff, show it in requested order */
+		if (opt->output_format != DIFF_FORMAT_NO_OUTPUT &&
+		    orderfile) {
+			diffcore_order(orderfile);
+		}
+
+		diff_flush(opt);
+	}
+
+	opt->output_format = output_format;
+	opt->orderfile = orderfile;
+	return paths;
+}
+
+
+/*
+ * find set of paths that everybody touches, assuming diff is run without
+ * rename/copy detection, etc, comparing all trees simultaneously (= faster).
+ */
+static struct combine_diff_path *find_paths_multitree(
+	const unsigned char *sha1, const struct sha1_array *parents,
+	struct diff_options *opt)
+{
+	int i, nparent = parents->nr;
+	const unsigned char **parents_sha1;
+	struct combine_diff_path paths_head;
+	struct strbuf base;
+
+	parents_sha1 = xmalloc(nparent * sizeof(parents_sha1[0]));
+	for (i = 0; i < nparent; i++)
+		parents_sha1[i] = parents->sha1[i];
+
+	/* fake list head, so worker can assume it is non-NULL */
+	paths_head.next = NULL;
+
+	strbuf_init(&base, PATH_MAX);
+	diff_tree_paths(&paths_head, sha1, parents_sha1, nparent, &base, opt);
+
+	strbuf_release(&base);
+	free(parents_sha1);
+	return paths_head.next;
+}
+
+
 void diff_tree_combined(const unsigned char *sha1,
 			const struct sha1_array *parents,
 			int dense,
@@ -1308,50 +1393,84 @@
 {
 	struct diff_options *opt = &rev->diffopt;
 	struct diff_options diffopts;
-	struct combine_diff_path *p, *paths = NULL;
+	struct combine_diff_path *p, *paths;
 	int i, num_paths, needsep, show_log_first, num_parent = parents->nr;
+	int need_generic_pathscan;
 
-	diffopts = *opt;
-	copy_pathspec(&diffopts.pathspec, &opt->pathspec);
-	diffopts.output_format = DIFF_FORMAT_NO_OUTPUT;
-	DIFF_OPT_SET(&diffopts, RECURSIVE);
-	DIFF_OPT_CLR(&diffopts, ALLOW_EXTERNAL);
-	/* tell diff_tree to emit paths in sorted (=tree) order */
-	diffopts.orderfile = NULL;
+	/* nothing to do, if no parents */
+	if (!num_parent)
+		return;
 
 	show_log_first = !!rev->loginfo && !rev->no_commit_id;
 	needsep = 0;
-	/* find set of paths that everybody touches */
-	for (i = 0; i < num_parent; i++) {
-		/* show stat against the first parent even
+	if (show_log_first) {
+		show_log(rev);
+
+		if (rev->verbose_header && opt->output_format &&
+		    opt->output_format != DIFF_FORMAT_NO_OUTPUT &&
+		    !commit_format_is_empty(rev->commit_format))
+			printf("%s%c", diff_line_prefix(opt),
+			       opt->line_termination);
+	}
+
+	diffopts = *opt;
+	copy_pathspec(&diffopts.pathspec, &opt->pathspec);
+	DIFF_OPT_SET(&diffopts, RECURSIVE);
+	DIFF_OPT_CLR(&diffopts, ALLOW_EXTERNAL);
+
+	/* find set of paths that everybody touches
+	 *
+	 * NOTE
+	 *
+	 * Diffcore transformations are bound to diff_filespec and logic
+	 * comparing two entries - i.e. they do not apply directly to combine
+	 * diff.
+	 *
+	 * If some of such transformations is requested - we launch generic
+	 * path scanning, which works significantly slower compared to
+	 * simultaneous all-trees-in-one-go scan in find_paths_multitree().
+	 *
+	 * TODO some of the filters could be ported to work on
+	 * combine_diff_paths - i.e. all functionality that skips paths, so in
+	 * theory, we could end up having only multitree path scanning.
+	 *
+	 * NOTE please keep this semantically in sync with diffcore_std()
+	 */
+	need_generic_pathscan = opt->skip_stat_unmatch	||
+			DIFF_OPT_TST(opt, FOLLOW_RENAMES)	||
+			opt->break_opt != -1	||
+			opt->detect_rename	||
+			opt->pickaxe		||
+			opt->filter;
+
+
+	if (need_generic_pathscan) {
+		/*
+		 * NOTE generic case also handles --stat, as it computes
+		 * diff(sha1,parent_i) for all i to do the job, specifically
+		 * for parent0.
+		 */
+		paths = find_paths_generic(sha1, parents, &diffopts);
+	}
+	else {
+		int stat_opt;
+		paths = find_paths_multitree(sha1, parents, &diffopts);
+
+		/*
+		 * show stat against the first parent even
 		 * when doing combined diff.
 		 */
-		int stat_opt = (opt->output_format &
+		stat_opt = (opt->output_format &
 				(DIFF_FORMAT_NUMSTAT|DIFF_FORMAT_DIFFSTAT));
-		if (i == 0 && stat_opt)
+		if (stat_opt) {
 			diffopts.output_format = stat_opt;
-		else
-			diffopts.output_format = DIFF_FORMAT_NO_OUTPUT;
-		diff_tree_sha1(parents->sha1[i], sha1, "", &diffopts);
-		diffcore_std(&diffopts);
-		paths = intersect_paths(paths, i, num_parent);
 
-		if (show_log_first && i == 0) {
-			show_log(rev);
-
-			if (rev->verbose_header && opt->output_format &&
-			    opt->output_format != DIFF_FORMAT_NO_OUTPUT)
-				printf("%s%c", diff_line_prefix(opt),
-				       opt->line_termination);
+			diff_tree_sha1(parents->sha1[0], sha1, "", &diffopts);
+			diffcore_std(&diffopts);
+			if (opt->orderfile)
+				diffcore_order(opt->orderfile);
+			diff_flush(&diffopts);
 		}
-
-		/* if showing diff, show it in requested order */
-		if (diffopts.output_format != DIFF_FORMAT_NO_OUTPUT &&
-		    opt->orderfile) {
-			diffcore_order(opt->orderfile);
-		}
-
-		diff_flush(&diffopts);
 	}
 
 	/* find out number of surviving paths */
diff --git a/command-list.txt b/command-list.txt
index cf36c3d..f1eae08 100644
--- a/command-list.txt
+++ b/command-list.txt
@@ -62,6 +62,7 @@
 git-index-pack                          plumbingmanipulators
 git-init                                mainporcelain common
 git-instaweb                            ancillaryinterrogators
+git-interpret-trailers                  purehelpers
 gitk                                    mainporcelain
 git-log                                 mainporcelain common
 git-ls-files                            plumbinginterrogators
@@ -132,6 +133,7 @@
 git-upload-archive                      synchelpers
 git-upload-pack                         synchelpers
 git-var                                 plumbinginterrogators
+git-verify-commit                       ancillaryinterrogators
 git-verify-pack                         plumbinginterrogators
 git-verify-tag                          ancillaryinterrogators
 gitweb                                  ancillaryinterrogators
diff --git a/commit-slab.h b/commit-slab.h
index 375c9c7..f37ec38 100644
--- a/commit-slab.h
+++ b/commit-slab.h
@@ -90,8 +90,7 @@
 									\
 	if (s->slab_count <= nth_slab) {				\
 		int i;							\
-		s->slab = xrealloc(s->slab,				\
-				   (nth_slab + 1) * sizeof(*s->slab));	\
+		REALLOC_ARRAY(s->slab, nth_slab + 1);			\
 		stat_ ##slabname## realloc++;				\
 		for (i = s->slab_count; i <= nth_slab; i++)		\
 			s->slab[i] = NULL;				\
diff --git a/commit.c b/commit.c
index 65179f9..19cf8f9 100644
--- a/commit.c
+++ b/commit.c
@@ -430,12 +430,7 @@
 	struct commit_list *head = NULL;
 	struct commit_list **pp = &head;
 	while (list) {
-		struct commit_list *new;
-		new = xmalloc(sizeof(struct commit_list));
-		new->item = list->item;
-		new->next = NULL;
-		*pp = new;
-		pp = &new->next;
+		pp = commit_list_append(list->item, pp);
 		list = list->next;
 	}
 	return head;
@@ -589,26 +584,19 @@
 static void record_author_date(struct author_date_slab *author_date,
 			       struct commit *commit)
 {
-	const char *buf, *line_end, *ident_line;
 	const char *buffer = get_commit_buffer(commit, NULL);
 	struct ident_split ident;
+	const char *ident_line;
+	size_t ident_len;
 	char *date_end;
 	unsigned long date;
 
-	for (buf = buffer; buf; buf = line_end + 1) {
-		line_end = strchrnul(buf, '\n');
-		ident_line = skip_prefix(buf, "author ");
-		if (!ident_line) {
-			if (!line_end[0] || line_end[1] == '\n')
-				return; /* end of header */
-			continue;
-		}
-		if (split_ident_line(&ident,
-				     ident_line, line_end - ident_line) ||
-		    !ident.date_begin || !ident.date_end)
-			goto fail_exit; /* malformed "author" line */
-		break;
-	}
+	ident_line = find_commit_header(buffer, "author", &ident_len);
+	if (!ident_line)
+		goto fail_exit; /* no author line */
+	if (split_ident_line(&ident, ident_line, ident_len) ||
+	    !ident.date_begin || !ident.date_end)
+		goto fail_exit; /* malformed "author" line */
 
 	date = strtoul(ident.date_begin, &date_end, 10);
 	if (date_end != ident.date_end)
@@ -770,45 +758,41 @@
 
 static const unsigned all_flags = (PARENT1 | PARENT2 | STALE | RESULT);
 
-static struct commit *interesting(struct commit_list *list)
+static int queue_has_nonstale(struct prio_queue *queue)
 {
-	while (list) {
-		struct commit *commit = list->item;
-		list = list->next;
-		if (commit->object.flags & STALE)
-			continue;
-		return commit;
+	int i;
+	for (i = 0; i < queue->nr; i++) {
+		struct commit *commit = queue->array[i].data;
+		if (!(commit->object.flags & STALE))
+			return 1;
 	}
-	return NULL;
+	return 0;
 }
 
 /* all input commits in one and twos[] must have been parsed! */
 static struct commit_list *paint_down_to_common(struct commit *one, int n, struct commit **twos)
 {
-	struct commit_list *list = NULL;
+	struct prio_queue queue = { compare_commits_by_commit_date };
 	struct commit_list *result = NULL;
 	int i;
 
 	one->object.flags |= PARENT1;
-	commit_list_insert_by_date(one, &list);
-	if (!n)
-		return list;
+	if (!n) {
+		commit_list_append(one, &result);
+		return result;
+	}
+	prio_queue_put(&queue, one);
+
 	for (i = 0; i < n; i++) {
 		twos[i]->object.flags |= PARENT2;
-		commit_list_insert_by_date(twos[i], &list);
+		prio_queue_put(&queue, twos[i]);
 	}
 
-	while (interesting(list)) {
-		struct commit *commit;
+	while (queue_has_nonstale(&queue)) {
+		struct commit *commit = prio_queue_get(&queue);
 		struct commit_list *parents;
-		struct commit_list *next;
 		int flags;
 
-		commit = list->item;
-		next = list->next;
-		free(list);
-		list = next;
-
 		flags = commit->object.flags & (PARENT1 | PARENT2 | STALE);
 		if (flags == (PARENT1 | PARENT2)) {
 			if (!(commit->object.flags & RESULT)) {
@@ -827,11 +811,11 @@
 			if (parse_commit(p))
 				return NULL;
 			p->object.flags |= flags;
-			commit_list_insert_by_date(p, &list);
+			prio_queue_put(&queue, p);
 		}
 	}
 
-	free_commit_list(list);
+	clear_prio_queue(&queue);
 	return result;
 }
 
@@ -976,12 +960,7 @@
 	}
 
 	/* There are more than one */
-	cnt = 0;
-	list = result;
-	while (list) {
-		list = list->next;
-		cnt++;
-	}
+	cnt = commit_list_count(result);
 	rslt = xcalloc(cnt, sizeof(*rslt));
 	for (list = result, i = 0; list; list = list->next)
 		rslt[i++] = list->item;
@@ -1161,6 +1140,40 @@
 	return saw_signature;
 }
 
+int remove_signature(struct strbuf *buf)
+{
+	const char *line = buf->buf;
+	const char *tail = buf->buf + buf->len;
+	int in_signature = 0;
+	const char *sig_start = NULL;
+	const char *sig_end = NULL;
+
+	while (line < tail) {
+		const char *next = memchr(line, '\n', tail - line);
+		next = next ? next + 1 : tail;
+
+		if (in_signature && line[0] == ' ')
+			sig_end = next;
+		else if (starts_with(line, gpg_sig_header) &&
+			 line[gpg_sig_header_len] == ' ') {
+			sig_start = line;
+			sig_end = next;
+			in_signature = 1;
+		} else {
+			if (*line == '\n')
+				/* dump the whole remainder of the buffer */
+				next = tail;
+			in_signature = 0;
+		}
+		line = next;
+	}
+
+	if (sig_start)
+		strbuf_remove(buf, sig_start - buf->buf, sig_end - sig_start);
+
+	return sig_start != NULL;
+}
+
 static void handle_signed_tag(struct commit *parent, struct commit_extra_header ***tail)
 {
 	struct merge_remote_desc *desc;
@@ -1201,44 +1214,7 @@
 	free(buf);
 }
 
-static struct {
-	char result;
-	const char *check;
-} sigcheck_gpg_status[] = {
-	{ 'G', "\n[GNUPG:] GOODSIG " },
-	{ 'B', "\n[GNUPG:] BADSIG " },
-	{ 'U', "\n[GNUPG:] TRUST_NEVER" },
-	{ 'U', "\n[GNUPG:] TRUST_UNDEFINED" },
-};
-
-static void parse_gpg_output(struct signature_check *sigc)
-{
-	const char *buf = sigc->gpg_status;
-	int i;
-
-	/* Iterate over all search strings */
-	for (i = 0; i < ARRAY_SIZE(sigcheck_gpg_status); i++) {
-		const char *found, *next;
-
-		found = skip_prefix(buf, sigcheck_gpg_status[i].check + 1);
-		if (!found) {
-			found = strstr(buf, sigcheck_gpg_status[i].check);
-			if (!found)
-				continue;
-			found += strlen(sigcheck_gpg_status[i].check);
-		}
-		sigc->result = sigcheck_gpg_status[i].result;
-		/* The trust messages are not followed by key/signer information */
-		if (sigc->result != 'U') {
-			sigc->key = xmemdupz(found, 16);
-			found += 17;
-			next = strchrnul(found, '\n');
-			sigc->signer = xmemdupz(found, next - found);
-		}
-	}
-}
-
-void check_commit_signature(const struct commit* commit, struct signature_check *sigc)
+void check_commit_signature(const struct commit *commit, struct signature_check *sigc)
 {
 	struct strbuf payload = STRBUF_INIT;
 	struct strbuf signature = STRBUF_INIT;
@@ -1255,6 +1231,7 @@
 				      &gpg_output, &gpg_status);
 	if (status && !gpg_output.len)
 		goto out;
+	sigc->payload = strbuf_detach(&payload, NULL);
 	sigc->gpg_output = strbuf_detach(&gpg_output, NULL);
 	sigc->gpg_status = strbuf_detach(&gpg_status, NULL);
 	parse_gpg_output(sigc);
@@ -1299,6 +1276,19 @@
 	return extra;
 }
 
+void for_each_mergetag(each_mergetag_fn fn, struct commit *commit, void *data)
+{
+	struct commit_extra_header *extra, *to_free;
+
+	to_free = read_commit_extra_headers(commit, NULL);
+	for (extra = to_free; extra; extra = extra->next) {
+		if (strcmp(extra->key, "mergetag"))
+			continue; /* not a merge tag */
+		fn(commit, extra, data);
+	}
+	free_commit_extra_headers(to_free);
+}
+
 static inline int standard_header_field(const char *field, size_t len)
 {
 	return ((len == 4 && !memcmp(field, "tree ", 5)) ||
@@ -1628,3 +1618,25 @@
 		printf(format, sha1_to_hex(list->item->object.sha1));
 	}
 }
+
+const char *find_commit_header(const char *msg, const char *key, size_t *out_len)
+{
+	int key_len = strlen(key);
+	const char *line = msg;
+
+	while (line) {
+		const char *eol = strchrnul(line, '\n');
+
+		if (line == eol)
+			return NULL;
+
+		if (eol - line > key_len &&
+		    !strncmp(line, key, key_len) &&
+		    line[key_len] == ' ') {
+			*out_len = eol - line - key_len - 1;
+			return line + key_len + 1;
+		}
+		line = *eol ? eol + 1 : NULL;
+	}
+	return NULL;
+}
diff --git a/commit.h b/commit.h
index 2e1492a..bc68ccb 100644
--- a/commit.h
+++ b/commit.h
@@ -26,13 +26,25 @@
 extern const char *commit_type;
 
 /* While we can decorate any object with a name, it's only used for commits.. */
-extern struct decoration name_decoration;
 struct name_decoration {
 	struct name_decoration *next;
 	int type;
-	char name[1];
+	char name[FLEX_ARRAY];
 };
 
+enum decoration_type {
+	DECORATION_NONE = 0,
+	DECORATION_REF_LOCAL,
+	DECORATION_REF_REMOTE,
+	DECORATION_REF_TAG,
+	DECORATION_REF_STASH,
+	DECORATION_REF_HEAD,
+	DECORATION_GRAFTED,
+};
+
+void add_name_decoration(enum decoration_type type, const char *name, struct object *obj);
+const struct name_decoration *get_name_decoration(const struct object *obj);
+
 struct commit *lookup_commit(const unsigned char *sha1);
 struct commit *lookup_commit_reference(const unsigned char *sha1);
 struct commit *lookup_commit_reference_gently(const unsigned char *sha1,
@@ -159,6 +171,7 @@
 extern const char *format_subject(struct strbuf *sb, const char *msg,
 				  const char *line_separator);
 extern void userformat_find_requirements(const char *fmt, struct userformat_want *w);
+extern int commit_format_is_empty(enum cmit_fmt);
 extern void format_commit_message(const struct commit *commit,
 				  const char *format, struct strbuf *sb,
 				  const struct pretty_print_context *context);
@@ -271,6 +284,7 @@
 					   int *ref_status);
 extern int delayed_reachability_test(struct shallow_info *si, int c);
 extern void prune_shallow(int show_only);
+extern struct trace_key trace_shallow;
 
 int is_descendant_of(struct commit *, struct commit_list *);
 int in_merge_bases(struct commit *, struct commit *);
@@ -312,6 +326,22 @@
 
 extern void free_commit_extra_headers(struct commit_extra_header *extra);
 
+/*
+ * Search the commit object contents given by "msg" for the header "key".
+ * Returns a pointer to the start of the header contents, or NULL. The length
+ * of the header, up to the first newline, is returned via out_len.
+ *
+ * Note that some headers (like mergetag) may be multi-line. It is the caller's
+ * responsibility to parse further in this case!
+ */
+extern const char *find_commit_header(const char *msg, const char *key,
+				      size_t *out_len);
+
+typedef void (*each_mergetag_fn)(struct commit *commit, struct commit_extra_header *extra,
+				 void *cb_data);
+
+extern void for_each_mergetag(each_mergetag_fn fn, struct commit *commit, void *data);
+
 struct merge_remote_desc {
 	struct object *obj; /* the named object, could be a tag */
 	const char *name;
@@ -327,6 +357,8 @@
 
 extern int parse_signed_commit(const struct commit *commit,
 			       struct strbuf *message, struct strbuf *signature);
+extern int remove_signature(struct strbuf *buf);
+
 extern void print_commit_list(struct commit_list *list,
 			      const char *format_cur,
 			      const char *format_last);
@@ -338,7 +370,7 @@
  * at all.  This may allocate memory for sig->gpg_output, sig->gpg_status,
  * sig->signer and sig->key.
  */
-extern void check_commit_signature(const struct commit* commit, struct signature_check *sigc);
+extern void check_commit_signature(const struct commit *commit, struct signature_check *sigc);
 
 int compare_commits_by_commit_date(const void *a_, const void *b_, void *unused);
 
diff --git a/compat/bswap.h b/compat/bswap.h
index f6fd9a6..7fed637 100644
--- a/compat/bswap.h
+++ b/compat/bswap.h
@@ -122,6 +122,10 @@
 #  define GIT_BYTE_ORDER GIT_BIG_ENDIAN
 # elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
 #  define GIT_BYTE_ORDER GIT_LITTLE_ENDIAN
+# elif defined(__THW_BIG_ENDIAN__) && !defined(__THW_LITTLE_ENDIAN__)
+#  define GIT_BYTE_ORDER GIT_BIG_ENDIAN
+# elif defined(__THW_LITTLE_ENDIAN__) && !defined(__THW_BIG_ENDIAN__)
+#  define GIT_BYTE_ORDER GIT_LITTLE_ENDIAN
 # else
 #  error "Cannot determine endianness"
 # endif
diff --git a/compat/mingw.c b/compat/mingw.c
index 363a957..c5c37e5 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -1,8 +1,10 @@
 #include "../git-compat-util.h"
 #include "win32.h"
 #include <conio.h>
+#include <wchar.h>
 #include "../strbuf.h"
 #include "../run-command.h"
+#include "../cache.h"
 
 static const int delay[] = { 0, 1, 10, 20, 40 };
 
@@ -198,14 +200,16 @@
 	}
 }
 
-#undef unlink
 int mingw_unlink(const char *pathname)
 {
 	int ret, tries = 0;
+	wchar_t wpathname[MAX_PATH];
+	if (xutftowcs_path(wpathname, pathname) < 0)
+		return -1;
 
 	/* read-only files cannot be removed */
-	chmod(pathname, 0666);
-	while ((ret = unlink(pathname)) == -1 && tries < ARRAY_SIZE(delay)) {
+	_wchmod(wpathname, 0666);
+	while ((ret = _wunlink(wpathname)) == -1 && tries < ARRAY_SIZE(delay)) {
 		if (!is_file_in_use_error(GetLastError()))
 			break;
 		/*
@@ -221,45 +225,45 @@
 	while (ret == -1 && is_file_in_use_error(GetLastError()) &&
 	       ask_yes_no_if_possible("Unlink of file '%s' failed. "
 			"Should I try again?", pathname))
-	       ret = unlink(pathname);
+	       ret = _wunlink(wpathname);
 	return ret;
 }
 
-static int is_dir_empty(const char *path)
+static int is_dir_empty(const wchar_t *wpath)
 {
-	struct strbuf buf = STRBUF_INIT;
-	WIN32_FIND_DATAA findbuf;
+	WIN32_FIND_DATAW findbuf;
 	HANDLE handle;
-
-	strbuf_addf(&buf, "%s\\*", path);
-	handle = FindFirstFileA(buf.buf, &findbuf);
-	if (handle == INVALID_HANDLE_VALUE) {
-		strbuf_release(&buf);
+	wchar_t wbuf[MAX_PATH + 2];
+	wcscpy(wbuf, wpath);
+	wcscat(wbuf, L"\\*");
+	handle = FindFirstFileW(wbuf, &findbuf);
+	if (handle == INVALID_HANDLE_VALUE)
 		return GetLastError() == ERROR_NO_MORE_FILES;
-	}
 
-	while (!strcmp(findbuf.cFileName, ".") ||
-			!strcmp(findbuf.cFileName, ".."))
-		if (!FindNextFile(handle, &findbuf)) {
-			strbuf_release(&buf);
-			return GetLastError() == ERROR_NO_MORE_FILES;
+	while (!wcscmp(findbuf.cFileName, L".") ||
+			!wcscmp(findbuf.cFileName, L".."))
+		if (!FindNextFileW(handle, &findbuf)) {
+			DWORD err = GetLastError();
+			FindClose(handle);
+			return err == ERROR_NO_MORE_FILES;
 		}
 	FindClose(handle);
-	strbuf_release(&buf);
 	return 0;
 }
 
-#undef rmdir
 int mingw_rmdir(const char *pathname)
 {
 	int ret, tries = 0;
+	wchar_t wpathname[MAX_PATH];
+	if (xutftowcs_path(wpathname, pathname) < 0)
+		return -1;
 
-	while ((ret = rmdir(pathname)) == -1 && tries < ARRAY_SIZE(delay)) {
+	while ((ret = _wrmdir(wpathname)) == -1 && tries < ARRAY_SIZE(delay)) {
 		if (!is_file_in_use_error(GetLastError()))
 			errno = err_win_to_posix(GetLastError());
 		if (errno != EACCES)
 			break;
-		if (!is_dir_empty(pathname)) {
+		if (!is_dir_empty(wpathname)) {
 			errno = ENOTEMPTY;
 			break;
 		}
@@ -276,16 +280,26 @@
 	while (ret == -1 && errno == EACCES && is_file_in_use_error(GetLastError()) &&
 	       ask_yes_no_if_possible("Deletion of directory '%s' failed. "
 			"Should I try again?", pathname))
-	       ret = rmdir(pathname);
+	       ret = _wrmdir(wpathname);
 	return ret;
 }
 
-#undef open
+int mingw_mkdir(const char *path, int mode)
+{
+	int ret;
+	wchar_t wpath[MAX_PATH];
+	if (xutftowcs_path(wpath, path) < 0)
+		return -1;
+	ret = _wmkdir(wpath);
+	return ret;
+}
+
 int mingw_open (const char *filename, int oflags, ...)
 {
 	va_list args;
 	unsigned mode;
 	int fd;
+	wchar_t wfilename[MAX_PATH];
 
 	va_start(args, oflags);
 	mode = va_arg(args, int);
@@ -294,10 +308,12 @@
 	if (filename && !strcmp(filename, "/dev/null"))
 		filename = "nul";
 
-	fd = open(filename, oflags, mode);
+	if (xutftowcs_path(wfilename, filename) < 0)
+		return -1;
+	fd = _wopen(wfilename, oflags, mode);
 
 	if (fd < 0 && (oflags & O_CREAT) && errno == EACCES) {
-		DWORD attrs = GetFileAttributes(filename);
+		DWORD attrs = GetFileAttributesW(wfilename);
 		if (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY))
 			errno = EISDIR;
 	}
@@ -332,17 +348,28 @@
 #undef fopen
 FILE *mingw_fopen (const char *filename, const char *otype)
 {
+	FILE *file;
+	wchar_t wfilename[MAX_PATH], wotype[4];
 	if (filename && !strcmp(filename, "/dev/null"))
 		filename = "nul";
-	return fopen(filename, otype);
+	if (xutftowcs_path(wfilename, filename) < 0 ||
+		xutftowcs(wotype, otype, ARRAY_SIZE(wotype)) < 0)
+		return NULL;
+	file = _wfopen(wfilename, wotype);
+	return file;
 }
 
-#undef freopen
 FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream)
 {
+	FILE *file;
+	wchar_t wfilename[MAX_PATH], wotype[4];
 	if (filename && !strcmp(filename, "/dev/null"))
 		filename = "nul";
-	return freopen(filename, otype, stream);
+	if (xutftowcs_path(wfilename, filename) < 0 ||
+		xutftowcs(wotype, otype, ARRAY_SIZE(wotype)) < 0)
+		return NULL;
+	file = _wfreopen(wfilename, wotype, stream);
+	return file;
 }
 
 #undef fflush
@@ -367,6 +394,31 @@
 	return ret;
 }
 
+int mingw_access(const char *filename, int mode)
+{
+	wchar_t wfilename[MAX_PATH];
+	if (xutftowcs_path(wfilename, filename) < 0)
+		return -1;
+	/* X_OK is not supported by the MSVCRT version */
+	return _waccess(wfilename, mode & ~X_OK);
+}
+
+int mingw_chdir(const char *dirname)
+{
+	wchar_t wdirname[MAX_PATH];
+	if (xutftowcs_path(wdirname, dirname) < 0)
+		return -1;
+	return _wchdir(wdirname);
+}
+
+int mingw_chmod(const char *filename, int mode)
+{
+	wchar_t wfilename[MAX_PATH];
+	if (xutftowcs_path(wfilename, filename) < 0)
+		return -1;
+	return _wchmod(wfilename, mode);
+}
+
 /*
  * The unit of FILETIME is 100-nanoseconds since January 1, 1601, UTC.
  * Returns the 100-nanoseconds ("hekto nanoseconds") since the epoch.
@@ -392,10 +444,12 @@
  */
 static int do_lstat(int follow, const char *file_name, struct stat *buf)
 {
-	int err;
 	WIN32_FILE_ATTRIBUTE_DATA fdata;
+	wchar_t wfilename[MAX_PATH];
+	if (xutftowcs_path(wfilename, file_name) < 0)
+		return -1;
 
-	if (!(err = get_file_attr(file_name, &fdata))) {
+	if (GetFileAttributesExW(wfilename, GetFileExInfoStandard, &fdata)) {
 		buf->st_ino = 0;
 		buf->st_gid = 0;
 		buf->st_uid = 0;
@@ -408,8 +462,8 @@
 		buf->st_mtime = filetime_to_time_t(&(fdata.ftLastWriteTime));
 		buf->st_ctime = filetime_to_time_t(&(fdata.ftCreationTime));
 		if (fdata.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
-			WIN32_FIND_DATAA findbuf;
-			HANDLE handle = FindFirstFileA(file_name, &findbuf);
+			WIN32_FIND_DATAW findbuf;
+			HANDLE handle = FindFirstFileW(wfilename, &findbuf);
 			if (handle != INVALID_HANDLE_VALUE) {
 				if ((findbuf.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) &&
 						(findbuf.dwReserved0 == IO_REPARSE_TAG_SYMLINK)) {
@@ -428,7 +482,23 @@
 		}
 		return 0;
 	}
-	errno = err;
+	switch (GetLastError()) {
+	case ERROR_ACCESS_DENIED:
+	case ERROR_SHARING_VIOLATION:
+	case ERROR_LOCK_VIOLATION:
+	case ERROR_SHARING_BUFFER_EXCEEDED:
+		errno = EACCES;
+		break;
+	case ERROR_BUFFER_OVERFLOW:
+		errno = ENAMETOOLONG;
+		break;
+	case ERROR_NOT_ENOUGH_MEMORY:
+		errno = ENOMEM;
+		break;
+	default:
+		errno = ENOENT;
+		break;
+	}
 	return -1;
 }
 
@@ -441,7 +511,7 @@
 static int do_stat_internal(int follow, const char *file_name, struct stat *buf)
 {
 	int namelen;
-	static char alt_name[PATH_MAX];
+	char alt_name[PATH_MAX];
 
 	if (!do_lstat(follow, file_name, buf))
 		return 0;
@@ -516,16 +586,20 @@
 {
 	FILETIME mft, aft;
 	int fh, rc;
+	DWORD attrs;
+	wchar_t wfilename[MAX_PATH];
+	if (xutftowcs_path(wfilename, file_name) < 0)
+		return -1;
 
 	/* must have write permission */
-	DWORD attrs = GetFileAttributes(file_name);
+	attrs = GetFileAttributesW(wfilename);
 	if (attrs != INVALID_FILE_ATTRIBUTES &&
 	    (attrs & FILE_ATTRIBUTE_READONLY)) {
 		/* ignore errors here; open() will report them */
-		SetFileAttributes(file_name, attrs & ~FILE_ATTRIBUTE_READONLY);
+		SetFileAttributesW(wfilename, attrs & ~FILE_ATTRIBUTE_READONLY);
 	}
 
-	if ((fh = open(file_name, O_RDWR | O_BINARY)) < 0) {
+	if ((fh = _wopen(wfilename, O_RDWR | O_BINARY)) < 0) {
 		rc = -1;
 		goto revert_attrs;
 	}
@@ -548,7 +622,7 @@
 	if (attrs != INVALID_FILE_ATTRIBUTES &&
 	    (attrs & FILE_ATTRIBUTE_READONLY)) {
 		/* ignore errors again */
-		SetFileAttributes(file_name, attrs);
+		SetFileAttributesW(wfilename, attrs);
 	}
 	return rc;
 }
@@ -559,6 +633,18 @@
 	return 0;
 }
 
+char *mingw_mktemp(char *template)
+{
+	wchar_t wtemplate[MAX_PATH];
+	if (xutftowcs_path(wtemplate, template) < 0)
+		return NULL;
+	if (!_wmktemp(wtemplate))
+		return NULL;
+	if (xwcstoutf(template, wtemplate, strlen(template) + 1) < 0)
+		return NULL;
+	return template;
+}
+
 int mkstemp(char *template)
 {
 	char *filename = mktemp(template);
@@ -617,17 +703,18 @@
 	return result;
 }
 
-#undef getcwd
 char *mingw_getcwd(char *pointer, int len)
 {
 	int i;
-	char *ret = getcwd(pointer, len);
-	if (!ret)
-		return ret;
+	wchar_t wpointer[MAX_PATH];
+	if (!_wgetcwd(wpointer, ARRAY_SIZE(wpointer)))
+		return NULL;
+	if (xwcstoutf(pointer, wpointer, len) < 0)
+		return NULL;
 	for (i = 0; pointer[i]; i++)
 		if (pointer[i] == '\\')
 			pointer[i] = '/';
-	return ret;
+	return pointer;
 }
 
 /*
@@ -812,11 +899,44 @@
 	return prog;
 }
 
-static int env_compare(const void *a, const void *b)
+static int do_putenv(char **env, const char *name, int size, int free_old);
+
+/* used number of elements of environ array, including terminating NULL */
+static int environ_size = 0;
+/* allocated size of environ array, in bytes */
+static int environ_alloc = 0;
+
+/*
+ * Create environment block suitable for CreateProcess. Merges current
+ * process environment and the supplied environment changes.
+ */
+static wchar_t *make_environment_block(char **deltaenv)
 {
-	char *const *ea = a;
-	char *const *eb = b;
-	return strcasecmp(*ea, *eb);
+	wchar_t *wenvblk = NULL;
+	char **tmpenv;
+	int i = 0, size = environ_size, wenvsz = 0, wenvpos = 0;
+
+	while (deltaenv && deltaenv[i])
+		i++;
+
+	/* copy the environment, leaving space for changes */
+	tmpenv = xmalloc((size + i) * sizeof(char*));
+	memcpy(tmpenv, environ, size * sizeof(char*));
+
+	/* merge supplied environment changes into the temporary environment */
+	for (i = 0; deltaenv && deltaenv[i]; i++)
+		size = do_putenv(tmpenv, deltaenv[i], size, 0);
+
+	/* create environment block from temporary environment */
+	for (i = 0; tmpenv[i]; i++) {
+		size = 2 * strlen(tmpenv[i]) + 2; /* +2 for final \0 */
+		ALLOC_GROW(wenvblk, (wenvpos + size) * sizeof(wchar_t), wenvsz);
+		wenvpos += xutftowcs(&wenvblk[wenvpos], tmpenv[i], size) + 1;
+	}
+	/* add final \0 terminator */
+	wenvblk[wenvpos] = 0;
+	free(tmpenv);
+	return wenvblk;
 }
 
 struct pinfo_t {
@@ -827,14 +947,15 @@
 static struct pinfo_t *pinfo = NULL;
 CRITICAL_SECTION pinfo_cs;
 
-static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
+static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaenv,
 			      const char *dir,
 			      int prepend_cmd, int fhin, int fhout, int fherr)
 {
-	STARTUPINFO si;
+	STARTUPINFOW si;
 	PROCESS_INFORMATION pi;
-	struct strbuf envblk, args;
-	unsigned flags;
+	struct strbuf args;
+	wchar_t wcmd[MAX_PATH], wdir[MAX_PATH], *wargs, *wenvblk = NULL;
+	unsigned flags = CREATE_UNICODE_ENVIRONMENT;
 	BOOL ret;
 
 	/* Determine whether or not we are associated to a console */
@@ -851,7 +972,7 @@
 		 * instead of CREATE_NO_WINDOW to make ssh
 		 * recognize that it has no console.
 		 */
-		flags = DETACHED_PROCESS;
+		flags |= DETACHED_PROCESS;
 	} else {
 		/* There is already a console. If we specified
 		 * DETACHED_PROCESS here, too, Windows would
@@ -859,15 +980,19 @@
 		 * The same is true for CREATE_NO_WINDOW.
 		 * Go figure!
 		 */
-		flags = 0;
 		CloseHandle(cons);
 	}
 	memset(&si, 0, sizeof(si));
 	si.cb = sizeof(si);
 	si.dwFlags = STARTF_USESTDHANDLES;
-	si.hStdInput = (HANDLE) _get_osfhandle(fhin);
-	si.hStdOutput = (HANDLE) _get_osfhandle(fhout);
-	si.hStdError = (HANDLE) _get_osfhandle(fherr);
+	si.hStdInput = winansi_get_osfhandle(fhin);
+	si.hStdOutput = winansi_get_osfhandle(fhout);
+	si.hStdError = winansi_get_osfhandle(fherr);
+
+	if (xutftowcs_path(wcmd, cmd) < 0)
+		return -1;
+	if (dir && xutftowcs_path(wdir, dir) < 0)
+		return -1;
 
 	/* concatenate argv, quoting args as we go */
 	strbuf_init(&args, 0);
@@ -886,33 +1011,18 @@
 			free(quoted);
 	}
 
-	if (env) {
-		int count = 0;
-		char **e, **sorted_env;
+	wargs = xmalloc((2 * args.len + 1) * sizeof(wchar_t));
+	xutftowcs(wargs, args.buf, 2 * args.len + 1);
+	strbuf_release(&args);
 
-		for (e = env; *e; e++)
-			count++;
-
-		/* environment must be sorted */
-		sorted_env = xmalloc(sizeof(*sorted_env) * (count + 1));
-		memcpy(sorted_env, env, sizeof(*sorted_env) * (count + 1));
-		qsort(sorted_env, count, sizeof(*sorted_env), env_compare);
-
-		strbuf_init(&envblk, 0);
-		for (e = sorted_env; *e; e++) {
-			strbuf_addstr(&envblk, *e);
-			strbuf_addch(&envblk, '\0');
-		}
-		free(sorted_env);
-	}
+	wenvblk = make_environment_block(deltaenv);
 
 	memset(&pi, 0, sizeof(pi));
-	ret = CreateProcess(cmd, args.buf, NULL, NULL, TRUE, flags,
-		env ? envblk.buf : NULL, dir, &si, &pi);
+	ret = CreateProcessW(wcmd, wargs, NULL, NULL, TRUE, flags,
+		wenvblk, dir ? wdir : NULL, &si, &pi);
 
-	if (env)
-		strbuf_release(&envblk);
-	strbuf_release(&args);
+	free(wenvblk);
+	free(wargs);
 
 	if (!ret) {
 		errno = ENOENT;
@@ -941,13 +1051,12 @@
 	return (pid_t)pi.dwProcessId;
 }
 
-static pid_t mingw_spawnve(const char *cmd, const char **argv, char **env,
-			   int prepend_cmd)
+static pid_t mingw_spawnv(const char *cmd, const char **argv, int prepend_cmd)
 {
-	return mingw_spawnve_fd(cmd, argv, env, NULL, prepend_cmd, 0, 1, 2);
+	return mingw_spawnve_fd(cmd, argv, NULL, NULL, prepend_cmd, 0, 1, 2);
 }
 
-pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **env,
+pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **deltaenv,
 		     const char *dir,
 		     int fhin, int fhout, int fherr)
 {
@@ -971,14 +1080,14 @@
 				pid = -1;
 			}
 			else {
-				pid = mingw_spawnve_fd(iprog, argv, env, dir, 1,
+				pid = mingw_spawnve_fd(iprog, argv, deltaenv, dir, 1,
 						       fhin, fhout, fherr);
 				free(iprog);
 			}
 			argv[0] = argv0;
 		}
 		else
-			pid = mingw_spawnve_fd(prog, argv, env, dir, 0,
+			pid = mingw_spawnve_fd(prog, argv, deltaenv, dir, 0,
 					       fhin, fhout, fherr);
 		free(prog);
 	}
@@ -986,7 +1095,7 @@
 	return pid;
 }
 
-static int try_shell_exec(const char *cmd, char *const *argv, char **env)
+static int try_shell_exec(const char *cmd, char *const *argv)
 {
 	const char *interpr = parse_interpreter(cmd);
 	char **path;
@@ -1004,7 +1113,7 @@
 		argv2 = xmalloc(sizeof(*argv) * (argc+1));
 		argv2[0] = (char *)cmd;	/* full path to the script file */
 		memcpy(&argv2[1], &argv[1], sizeof(*argv) * argc);
-		pid = mingw_spawnve(prog, argv2, env, 1);
+		pid = mingw_spawnv(prog, argv2, 1);
 		if (pid >= 0) {
 			int status;
 			if (waitpid(pid, &status, 0) < 0)
@@ -1019,19 +1128,20 @@
 	return pid;
 }
 
-static void mingw_execve(const char *cmd, char *const *argv, char *const *env)
+int mingw_execv(const char *cmd, char *const *argv)
 {
 	/* check if git_command is a shell script */
-	if (!try_shell_exec(cmd, argv, (char **)env)) {
+	if (!try_shell_exec(cmd, argv)) {
 		int pid, status;
 
-		pid = mingw_spawnve(cmd, (const char **)argv, (char **)env, 0);
+		pid = mingw_spawnv(cmd, (const char **)argv, 0);
 		if (pid < 0)
-			return;
+			return -1;
 		if (waitpid(pid, &status, 0) < 0)
 			status = 255;
 		exit(status);
 	}
+	return -1;
 }
 
 int mingw_execvp(const char *cmd, char *const *argv)
@@ -1040,7 +1150,7 @@
 	char *prog = path_lookup(cmd, path, 0);
 
 	if (prog) {
-		mingw_execve(prog, argv, environ);
+		mingw_execv(prog, argv);
 		free(prog);
 	} else
 		errno = ENOENT;
@@ -1049,12 +1159,6 @@
 	return -1;
 }
 
-int mingw_execv(const char *cmd, char *const *argv)
-{
-	mingw_execve(cmd, argv, environ);
-	return -1;
-}
-
 int mingw_kill(pid_t pid, int sig)
 {
 	if (pid > 0 && sig == SIGTERM) {
@@ -1080,108 +1184,88 @@
 	return -1;
 }
 
-static char **copy_environ(void)
+/*
+ * Compare environment entries by key (i.e. stopping at '=' or '\0').
+ */
+static int compareenv(const void *v1, const void *v2)
 {
-	char **env;
-	int i = 0;
-	while (environ[i])
-		i++;
-	env = xmalloc((i+1)*sizeof(*env));
-	for (i = 0; environ[i]; i++)
-		env[i] = xstrdup(environ[i]);
-	env[i] = NULL;
-	return env;
-}
+	const char *e1 = *(const char**)v1;
+	const char *e2 = *(const char**)v2;
 
-void free_environ(char **env)
-{
-	int i;
-	for (i = 0; env[i]; i++)
-		free(env[i]);
-	free(env);
-}
-
-static int lookup_env(char **env, const char *name, size_t nmln)
-{
-	int i;
-
-	for (i = 0; env[i]; i++) {
-		if (0 == strncmp(env[i], name, nmln)
-		    && '=' == env[i][nmln])
-			/* matches */
-			return i;
+	for (;;) {
+		int c1 = *e1++;
+		int c2 = *e2++;
+		c1 = (c1 == '=') ? 0 : tolower(c1);
+		c2 = (c2 == '=') ? 0 : tolower(c2);
+		if (c1 > c2)
+			return 1;
+		if (c1 < c2)
+			return -1;
+		if (c1 == 0)
+			return 0;
 	}
-	return -1;
+}
+
+static int bsearchenv(char **env, const char *name, size_t size)
+{
+	unsigned low = 0, high = size;
+	while (low < high) {
+		unsigned mid = low + ((high - low) >> 1);
+		int cmp = compareenv(&env[mid], &name);
+		if (cmp < 0)
+			low = mid + 1;
+		else if (cmp > 0)
+			high = mid;
+		else
+			return mid;
+	}
+	return ~low; /* not found, return 1's complement of insert position */
 }
 
 /*
  * If name contains '=', then sets the variable, otherwise it unsets it
+ * Size includes the terminating NULL. Env must have room for size + 1 entries
+ * (in case of insert). Returns the new size. Optionally frees removed entries.
  */
-static char **env_setenv(char **env, const char *name)
+static int do_putenv(char **env, const char *name, int size, int free_old)
 {
-	char *eq = strchrnul(name, '=');
-	int i = lookup_env(env, name, eq-name);
+	int i = bsearchenv(env, name, size - 1);
 
-	if (i < 0) {
-		if (*eq) {
-			for (i = 0; env[i]; i++)
-				;
-			env = xrealloc(env, (i+2)*sizeof(*env));
-			env[i] = xstrdup(name);
-			env[i+1] = NULL;
-		}
-	}
-	else {
+	/* optionally free removed / replaced entry */
+	if (i >= 0 && free_old)
 		free(env[i]);
-		if (*eq)
-			env[i] = xstrdup(name);
-		else
-			for (; env[i]; i++)
-				env[i] = env[i+1];
+
+	if (strchr(name, '=')) {
+		/* if new value ('key=value') is specified, insert or replace entry */
+		if (i < 0) {
+			i = ~i;
+			memmove(&env[i + 1], &env[i], (size - i) * sizeof(char*));
+			size++;
+		}
+		env[i] = (char*) name;
+	} else if (i >= 0) {
+		/* otherwise ('key') remove existing entry */
+		size--;
+		memmove(&env[i], &env[i + 1], (size - i) * sizeof(char*));
 	}
-	return env;
-}
-
-/*
- * Copies global environ and adjusts variables as specified by vars.
- */
-char **make_augmented_environ(const char *const *vars)
-{
-	char **env = copy_environ();
-
-	while (*vars)
-		env = env_setenv(env, *vars++);
-	return env;
-}
-
-#undef getenv
-
-/*
- * The system's getenv looks up the name in a case-insensitive manner.
- * This version tries a case-sensitive lookup and falls back to
- * case-insensitive if nothing was found.  This is necessary because,
- * as a prominent example, CMD sets 'Path', but not 'PATH'.
- * Warning: not thread-safe.
- */
-static char *getenv_cs(const char *name)
-{
-	size_t len = strlen(name);
-	int i = lookup_env(environ, name, len);
-	if (i >= 0)
-		return environ[i] + len + 1;	/* skip past name and '=' */
-	return getenv(name);
+	return size;
 }
 
 char *mingw_getenv(const char *name)
 {
-	char *result = getenv_cs(name);
-	if (!result && !strcmp(name, "TMPDIR")) {
-		/* on Windows it is TMP and TEMP */
-		result = getenv_cs("TMP");
-		if (!result)
-			result = getenv_cs("TEMP");
-	}
-	return result;
+	char *value;
+	int pos = bsearchenv(environ, name, environ_size - 1);
+	if (pos < 0)
+		return NULL;
+	value = strchr(environ[pos], '=');
+	return value ? &value[1] : NULL;
+}
+
+int mingw_putenv(const char *namevalue)
+{
+	ALLOC_GROW(environ, (environ_size + 1) * sizeof(char*), environ_alloc);
+	environ_size = do_putenv(environ, namevalue, environ_size, 1);
+	return 0;
 }
 
 /*
@@ -1480,33 +1564,36 @@
 {
 	DWORD attrs, gle;
 	int tries = 0;
+	wchar_t wpold[MAX_PATH], wpnew[MAX_PATH];
+	if (xutftowcs_path(wpold, pold) < 0 || xutftowcs_path(wpnew, pnew) < 0)
+		return -1;
 
 	/*
 	 * Try native rename() first to get errno right.
 	 * It is based on MoveFile(), which cannot overwrite existing files.
 	 */
-	if (!rename(pold, pnew))
+	if (!_wrename(wpold, wpnew))
 		return 0;
 	if (errno != EEXIST)
 		return -1;
 repeat:
-	if (MoveFileEx(pold, pnew, MOVEFILE_REPLACE_EXISTING))
+	if (MoveFileExW(wpold, wpnew, MOVEFILE_REPLACE_EXISTING))
 		return 0;
 	/* TODO: translate more errors */
 	gle = GetLastError();
 	if (gle == ERROR_ACCESS_DENIED &&
-	    (attrs = GetFileAttributes(pnew)) != INVALID_FILE_ATTRIBUTES) {
+	    (attrs = GetFileAttributesW(wpnew)) != INVALID_FILE_ATTRIBUTES) {
 		if (attrs & FILE_ATTRIBUTE_DIRECTORY) {
 			errno = EISDIR;
 			return -1;
 		}
 		if ((attrs & FILE_ATTRIBUTE_READONLY) &&
-		    SetFileAttributes(pnew, attrs & ~FILE_ATTRIBUTE_READONLY)) {
-			if (MoveFileEx(pold, pnew, MOVEFILE_REPLACE_EXISTING))
+		    SetFileAttributesW(wpnew, attrs & ~FILE_ATTRIBUTE_READONLY)) {
+			if (MoveFileExW(wpold, wpnew, MOVEFILE_REPLACE_EXISTING))
 				return 0;
 			gle = GetLastError();
 			/* revert file attributes on failure */
-			SetFileAttributes(pnew, attrs);
+			SetFileAttributesW(wpnew, attrs);
 		}
 	}
 	if (tries < ARRAY_SIZE(delay) && gle == ERROR_ACCESS_DENIED) {
@@ -1752,11 +1839,16 @@
 
 int link(const char *oldpath, const char *newpath)
 {
-	typedef BOOL (WINAPI *T)(const char*, const char*, LPSECURITY_ATTRIBUTES);
+	typedef BOOL (WINAPI *T)(LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES);
 	static T create_hard_link = NULL;
+	wchar_t woldpath[MAX_PATH], wnewpath[MAX_PATH];
+	if (xutftowcs_path(woldpath, oldpath) < 0 ||
+		xutftowcs_path(wnewpath, newpath) < 0)
+		return -1;
+
 	if (!create_hard_link) {
 		create_hard_link = (T) GetProcAddress(
-			GetModuleHandle("kernel32.dll"), "CreateHardLinkA");
+			GetModuleHandle("kernel32.dll"), "CreateHardLinkW");
 		if (!create_hard_link)
 			create_hard_link = (T)-1;
 	}
@@ -1764,7 +1856,7 @@
 		errno = ENOSYS;
 		return -1;
 	}
-	if (!create_hard_link(newpath, oldpath, NULL)) {
+	if (!create_hard_link(wnewpath, woldpath, NULL)) {
 		errno = err_win_to_posix(GetLastError());
 		return -1;
 	}
@@ -1822,3 +1914,217 @@
 	errno = EINVAL;
 	return -1;
 }
+
+int mingw_offset_1st_component(const char *path)
+{
+	int offset = 0;
+	if (has_dos_drive_prefix(path))
+		offset = 2;
+
+	/* unc paths */
+	else if (is_dir_sep(path[0]) && is_dir_sep(path[1])) {
+
+		/* skip server name */
+		char *pos = strpbrk(path + 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]);
+}
+
+int xutftowcsn(wchar_t *wcs, const char *utfs, size_t wcslen, int utflen)
+{
+	int upos = 0, wpos = 0;
+	const unsigned char *utf = (const unsigned char*) utfs;
+	if (!utf || !wcs || wcslen < 1) {
+		errno = EINVAL;
+		return -1;
+	}
+	/* reserve space for \0 */
+	wcslen--;
+	if (utflen < 0)
+		utflen = INT_MAX;
+
+	while (upos < utflen) {
+		int c = utf[upos++] & 0xff;
+		if (utflen == INT_MAX && c == 0)
+			break;
+
+		if (wpos >= wcslen) {
+			wcs[wpos] = 0;
+			errno = ERANGE;
+			return -1;
+		}
+
+		if (c < 0x80) {
+			/* ASCII */
+			wcs[wpos++] = c;
+		} else if (c >= 0xc2 && c < 0xe0 && upos < utflen &&
+				(utf[upos] & 0xc0) == 0x80) {
+			/* 2-byte utf-8 */
+			c = ((c & 0x1f) << 6);
+			c |= (utf[upos++] & 0x3f);
+			wcs[wpos++] = c;
+		} else if (c >= 0xe0 && c < 0xf0 && upos + 1 < utflen &&
+				!(c == 0xe0 && utf[upos] < 0xa0) && /* over-long encoding */
+				(utf[upos] & 0xc0) == 0x80 &&
+				(utf[upos + 1] & 0xc0) == 0x80) {
+			/* 3-byte utf-8 */
+			c = ((c & 0x0f) << 12);
+			c |= ((utf[upos++] & 0x3f) << 6);
+			c |= (utf[upos++] & 0x3f);
+			wcs[wpos++] = c;
+		} else if (c >= 0xf0 && c < 0xf5 && upos + 2 < utflen &&
+				wpos + 1 < wcslen &&
+				!(c == 0xf0 && utf[upos] < 0x90) && /* over-long encoding */
+				!(c == 0xf4 && utf[upos] >= 0x90) && /* > \u10ffff */
+				(utf[upos] & 0xc0) == 0x80 &&
+				(utf[upos + 1] & 0xc0) == 0x80 &&
+				(utf[upos + 2] & 0xc0) == 0x80) {
+			/* 4-byte utf-8: convert to \ud8xx \udcxx surrogate pair */
+			c = ((c & 0x07) << 18);
+			c |= ((utf[upos++] & 0x3f) << 12);
+			c |= ((utf[upos++] & 0x3f) << 6);
+			c |= (utf[upos++] & 0x3f);
+			c -= 0x10000;
+			wcs[wpos++] = 0xd800 | (c >> 10);
+			wcs[wpos++] = 0xdc00 | (c & 0x3ff);
+		} else if (c >= 0xa0) {
+			/* invalid utf-8 byte, printable unicode char: convert 1:1 */
+			wcs[wpos++] = c;
+		} else {
+			/* invalid utf-8 byte, non-printable unicode: convert to hex */
+			static const char *hex = "0123456789abcdef";
+			wcs[wpos++] = hex[c >> 4];
+			if (wpos < wcslen)
+				wcs[wpos++] = hex[c & 0x0f];
+		}
+	}
+	wcs[wpos] = 0;
+	return wpos;
+}
+
+int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen)
+{
+	if (!wcs || !utf || utflen < 1) {
+		errno = EINVAL;
+		return -1;
+	}
+	utflen = WideCharToMultiByte(CP_UTF8, 0, wcs, -1, utf, utflen, NULL, NULL);
+	if (utflen)
+		return utflen - 1;
+	errno = ERANGE;
+	return -1;
+}
+
+/*
+ * Disable MSVCRT command line wildcard expansion (__getmainargs called from
+ * mingw startup code, see init.c in mingw runtime).
+ */
+int _CRT_glob = 0;
+
+typedef struct {
+	int newmode;
+} _startupinfo;
+
+extern int __wgetmainargs(int *argc, wchar_t ***argv, wchar_t ***env, int glob,
+		_startupinfo *si);
+
+static NORETURN void die_startup()
+{
+	fputs("fatal: not enough memory for initialization", stderr);
+	exit(128);
+}
+
+static void *malloc_startup(size_t size)
+{
+	void *result = malloc(size);
+	if (!result)
+		die_startup();
+	return result;
+}
+
+static char *wcstoutfdup_startup(char *buffer, const wchar_t *wcs, size_t len)
+{
+	len = xwcstoutf(buffer, wcs, len) + 1;
+	return memcpy(malloc_startup(len), buffer, len);
+}
+
+void mingw_startup()
+{
+	int i, maxlen, argc;
+	char *buffer;
+	wchar_t **wenv, **wargv;
+	_startupinfo si;
+
+	/* get wide char arguments and environment */
+	si.newmode = 0;
+	if (__wgetmainargs(&argc, &wargv, &wenv, _CRT_glob, &si) < 0)
+		die_startup();
+
+	/* determine size of argv and environ conversion buffer */
+	maxlen = wcslen(_wpgmptr);
+	for (i = 1; i < argc; i++)
+		maxlen = max(maxlen, wcslen(wargv[i]));
+	for (i = 0; wenv[i]; i++)
+		maxlen = max(maxlen, wcslen(wenv[i]));
+
+	/*
+	 * nedmalloc can't free CRT memory, allocate resizable environment
+	 * list. Note that xmalloc / xmemdupz etc. call getenv, so we cannot
+	 * use it while initializing the environment itself.
+	 */
+	environ_size = i + 1;
+	environ_alloc = alloc_nr(environ_size * sizeof(char*));
+	environ = malloc_startup(environ_alloc);
+
+	/* allocate buffer (wchar_t encodes to max 3 UTF-8 bytes) */
+	maxlen = 3 * maxlen + 1;
+	buffer = malloc_startup(maxlen);
+
+	/* convert command line arguments and environment to UTF-8 */
+	__argv[0] = wcstoutfdup_startup(buffer, _wpgmptr, maxlen);
+	for (i = 1; i < argc; i++)
+		__argv[i] = wcstoutfdup_startup(buffer, wargv[i], maxlen);
+	for (i = 0; wenv[i]; i++)
+		environ[i] = wcstoutfdup_startup(buffer, wenv[i], maxlen);
+	environ[i] = NULL;
+	free(buffer);
+
+	/* sort environment for O(log n) getenv / putenv */
+	qsort(environ, i, sizeof(char*), compareenv);
+
+	/* fix Windows specific environment settings */
+
+	/* on Windows it is TMP and TEMP */
+	if (!mingw_getenv("TMPDIR")) {
+		const char *tmp = mingw_getenv("TMP");
+		if (!tmp)
+			tmp = mingw_getenv("TEMP");
+		if (tmp)
+			setenv("TMPDIR", tmp, 1);
+	}
+
+	/* simulate TERM to enable auto-color (see color.c) */
+	if (!getenv("TERM"))
+		setenv("TERM", "cygwin", 1);
+
+	/* initialize critical section for waitpid pinfo_t list */
+	InitializeCriticalSection(&pinfo_cs);
+
+	/* set up default file mode and file modes for stdin/out/err */
+	_fmode = _O_BINARY;
+	_setmode(_fileno(stdin), _O_BINARY);
+	_setmode(_fileno(stdout), _O_BINARY);
+	_setmode(_fileno(stderr), _O_BINARY);
+
+	/* initialize Unicode console */
+	winansi_init();
+}
diff --git a/compat/mingw.h b/compat/mingw.h
index e033e72..5e499cf 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -35,6 +35,9 @@
 #ifndef EWOULDBLOCK
 #define EWOULDBLOCK EAGAIN
 #endif
+#ifndef ELOOP
+#define ELOOP EMLINK
+#endif
 #define SHUT_WR SD_SEND
 
 #define SIGHUP 1
@@ -66,7 +69,6 @@
 	sig_handler_t sa_handler;
 	unsigned sa_flags;
 };
-#define sigemptyset(x) (void)0
 #define SA_RESTART 0
 
 struct itimerval {
@@ -113,15 +115,18 @@
 }
 /* bash cannot reliably detect negative return codes as failure */
 #define exit(code) exit((code) & 0xff)
+#define sigemptyset(x) (void)0
+static inline int sigaddset(sigset_t *set, int signum)
+{ return 0; }
+#define SIG_UNBLOCK 0
+static inline int sigprocmask(int how, const sigset_t *set, sigset_t *oldset)
+{ return 0; }
 
 /*
  * simple adaptors
  */
 
-static inline int mingw_mkdir(const char *path, int mode)
-{
-	return mkdir(path);
-}
+int mingw_mkdir(const char *path, int mode);
 #define mkdir mingw_mkdir
 
 #define WNOHANG 1
@@ -192,11 +197,27 @@
 int mingw_fflush(FILE *stream);
 #define fflush mingw_fflush
 
+int mingw_access(const char *filename, int mode);
+#undef access
+#define access mingw_access
+
+int mingw_chdir(const char *dirname);
+#define chdir mingw_chdir
+
+int mingw_chmod(const char *filename, int mode);
+#define chmod mingw_chmod
+
+char *mingw_mktemp(char *template);
+#define mktemp mingw_mktemp
+
 char *mingw_getcwd(char *pointer, int len);
 #define getcwd mingw_getcwd
 
 char *mingw_getenv(const char *name);
 #define getenv mingw_getenv
+int mingw_putenv(const char *namevalue);
+#define putenv mingw_putenv
+#define unsetenv mingw_putenv
 
 int mingw_gethostname(char *host, int namelen);
 #define gethostname mingw_gethostname
@@ -317,12 +338,8 @@
  * ANSI emulation wrappers
  */
 
-int winansi_fputs(const char *str, FILE *stream);
-int winansi_printf(const char *format, ...) __attribute__((format (printf, 1, 2)));
-int winansi_fprintf(FILE *stream, const char *format, ...) __attribute__((format (printf, 2, 3)));
-#define fputs winansi_fputs
-#define printf(...) winansi_printf(__VA_ARGS__)
-#define fprintf(...) winansi_fprintf(__VA_ARGS__)
+void winansi_init(void);
+HANDLE winansi_get_osfhandle(int fd);
 
 /*
  * git specific compatibility
@@ -339,6 +356,8 @@
 	return ret;
 }
 #define find_last_dir_sep mingw_find_last_dir_sep
+int mingw_offset_1st_component(const char *path);
+#define offset_1st_component mingw_offset_1st_component
 #define PATH_SEP ';'
 #define PRIuMAX "I64u"
 #define PRId64 "I64d"
@@ -346,12 +365,112 @@
 void mingw_open_html(const char *path);
 #define open_html mingw_open_html
 
-/*
- * helpers
- */
+void mingw_mark_as_git_dir(const char *dir);
+#define mark_as_git_dir mingw_mark_as_git_dir
 
-char **make_augmented_environ(const char *const *vars);
-void free_environ(char **env);
+/**
+ * Converts UTF-8 encoded string to UTF-16LE.
+ *
+ * To support repositories with legacy-encoded file names, invalid UTF-8 bytes
+ * 0xa0 - 0xff are converted to corresponding printable Unicode chars \u00a0 -
+ * \u00ff, and invalid UTF-8 bytes 0x80 - 0x9f (which would make non-printable
+ * Unicode) are converted to hex-code.
+ *
+ * Lead-bytes not followed by an appropriate number of trail-bytes, over-long
+ * encodings and 4-byte encodings > \u10ffff are detected as invalid UTF-8.
+ *
+ * Maximum space requirement for the target buffer is two wide chars per UTF-8
+ * char (((strlen(utf) * 2) + 1) [* sizeof(wchar_t)]).
+ *
+ * The maximum space is needed only if the entire input string consists of
+ * invalid UTF-8 bytes in range 0x80-0x9f, as per the following table:
+ *
+ *               |                   | UTF-8 | UTF-16 |
+ *   Code point  |  UTF-8 sequence   | bytes | words  | ratio
+ * --------------+-------------------+-------+--------+-------
+ * 000000-00007f | 0-7f              |   1   |   1    |  1
+ * 000080-0007ff | c2-df + 80-bf     |   2   |   1    |  0.5
+ * 000800-00ffff | e0-ef + 2 * 80-bf |   3   |   1    |  0.33
+ * 010000-10ffff | f0-f4 + 3 * 80-bf |   4   |  2 (a) |  0.5
+ * invalid       | 80-9f             |   1   |  2 (b) |  2
+ * invalid       | a0-ff             |   1   |   1    |  1
+ *
+ * (a) encoded as UTF-16 surrogate pair
+ * (b) encoded as two hex digits
+ *
+ * Note that, while the UTF-8 encoding scheme can be extended to 5-byte, 6-byte
+ * or even indefinite-byte sequences, the largest valid code point \u10ffff
+ * encodes as only 4 UTF-8 bytes.
+ *
+ * Parameters:
+ * wcs: wide char target buffer
+ * utf: string to convert
+ * wcslen: size of target buffer (in wchar_t's)
+ * utflen: size of string to convert, or -1 if 0-terminated
+ *
+ * Returns:
+ * length of converted string (_wcslen(wcs)), or -1 on failure
+ *
+ * Errors:
+ * EINVAL: one of the input parameters is invalid (e.g. NULL)
+ * ERANGE: the output buffer is too small
+ */
+int xutftowcsn(wchar_t *wcs, const char *utf, size_t wcslen, int utflen);
+
+/**
+ * Simplified variant of xutftowcsn, assumes input string is \0-terminated.
+ */
+static inline int xutftowcs(wchar_t *wcs, const char *utf, size_t wcslen)
+{
+	return xutftowcsn(wcs, utf, wcslen, -1);
+}
+
+/**
+ * Simplified file system specific variant of xutftowcsn, assumes output
+ * buffer size is MAX_PATH wide chars and input string is \0-terminated,
+ * fails with ENAMETOOLONG if input string is too long.
+ */
+static inline int xutftowcs_path(wchar_t *wcs, const char *utf)
+{
+	int result = xutftowcsn(wcs, utf, MAX_PATH, -1);
+	if (result < 0 && errno == ERANGE)
+		errno = ENAMETOOLONG;
+	return result;
+}
+
+/**
+ * Converts UTF-16LE encoded string to UTF-8.
+ *
+ * Maximum space requirement for the target buffer is three UTF-8 chars per
+ * wide char ((_wcslen(wcs) * 3) + 1).
+ *
+ * The maximum space is needed only if the entire input string consists of
+ * UTF-16 words in range 0x0800-0xd7ff or 0xe000-0xffff (i.e. \u0800-\uffff
+ * modulo surrogate pairs), as per the following table:
+ *
+ *               |                       | UTF-16 | UTF-8 |
+ *   Code point  |  UTF-16 sequence      | words  | bytes | ratio
+ * --------------+-----------------------+--------+-------+-------
+ * 000000-00007f | 0000-007f             |   1    |   1   |  1
+ * 000080-0007ff | 0080-07ff             |   1    |   2   |  2
+ * 000800-00ffff | 0800-d7ff / e000-ffff |   1    |   3   |  3
+ * 010000-10ffff | d800-dbff + dc00-dfff |   2    |   4   |  2
+ *
+ * Note that invalid code points > 10ffff cannot be represented in UTF-16.
+ *
+ * Parameters:
+ * utf: target buffer
+ * wcs: wide string to convert
+ * utflen: size of target buffer
+ *
+ * Returns:
+ * length of converted string, or -1 on failure
+ *
+ * Errors:
+ * EINVAL: one of the input parameters is invalid (e.g. NULL)
+ * ERANGE: the output buffer is too small
+ */
+int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen);
 
 /*
  * A critical section used in the implementation of the spawn
@@ -361,22 +480,16 @@
 extern CRITICAL_SECTION pinfo_cs;
 
 /*
- * A replacement of main() that ensures that argv[0] has a path
- * and that default fmode and std(in|out|err) are in binary mode
+ * A replacement of main() that adds win32 specific initialization.
  */
 
+void mingw_startup();
 #define main(c,v) dummy_decl_mingw_main(); \
 static int mingw_main(c,v); \
 int main(int argc, char **argv) \
 { \
-	extern CRITICAL_SECTION pinfo_cs; \
-	_fmode = _O_BINARY; \
-	_setmode(_fileno(stdin), _O_BINARY); \
-	_setmode(_fileno(stdout), _O_BINARY); \
-	_setmode(_fileno(stderr), _O_BINARY); \
-	argv[0] = xstrdup(_pgmptr); \
-	InitializeCriticalSection(&pinfo_cs); \
-	return mingw_main(argc, argv); \
+	mingw_startup(); \
+	return mingw_main(__argc, (void *)__argv); \
 } \
 static int mingw_main(c,v)
 
diff --git a/compat/poll/poll.c b/compat/poll/poll.c
index 31163f2..a9b41d8 100644
--- a/compat/poll/poll.c
+++ b/compat/poll/poll.c
@@ -605,7 +605,7 @@
 
   if (!rc && timeout == INFTIM)
     {
-      SwitchToThread();
+      SleepEx (1, TRUE);
       goto restart;
     }
 
diff --git a/compat/vcbuild/include/alloca.h b/compat/win32/alloca.h
similarity index 100%
rename from compat/vcbuild/include/alloca.h
rename to compat/win32/alloca.h
diff --git a/compat/win32/dirent.c b/compat/win32/dirent.c
index 7a0debe..52420ec 100644
--- a/compat/win32/dirent.c
+++ b/compat/win32/dirent.c
@@ -1,96 +1,81 @@
-#include "../git-compat-util.h"
-#include "dirent.h"
+#include "../../git-compat-util.h"
 
 struct DIR {
 	struct dirent dd_dir; /* includes d_type */
 	HANDLE dd_handle;     /* FindFirstFile handle */
 	int dd_stat;          /* 0-based index */
-	char dd_name[1];      /* extend struct */
 };
 
+static inline void finddata2dirent(struct dirent *ent, WIN32_FIND_DATAW *fdata)
+{
+	/* convert UTF-16 name to UTF-8 */
+	xwcstoutf(ent->d_name, fdata->cFileName, sizeof(ent->d_name));
+
+	/* Set file type, based on WIN32_FIND_DATA */
+	if (fdata->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+		ent->d_type = DT_DIR;
+	else
+		ent->d_type = DT_REG;
+}
+
 DIR *opendir(const char *name)
 {
-	DWORD attrs = GetFileAttributesA(name);
+	wchar_t pattern[MAX_PATH + 2]; /* + 2 for '/' '*' */
+	WIN32_FIND_DATAW fdata;
+	HANDLE h;
 	int len;
-	DIR *p;
+	DIR *dir;
 
-	/* check for valid path */
-	if (attrs == INVALID_FILE_ATTRIBUTES) {
-		errno = ENOENT;
+	/* convert name to UTF-16 and check length < MAX_PATH */
+	if ((len = xutftowcs_path(pattern, name)) < 0)
+		return NULL;
+
+	/* append optional '/' and wildcard '*' */
+	if (len && !is_dir_sep(pattern[len - 1]))
+		pattern[len++] = '/';
+	pattern[len++] = '*';
+	pattern[len] = 0;
+
+	/* open find handle */
+	h = FindFirstFileW(pattern, &fdata);
+	if (h == INVALID_HANDLE_VALUE) {
+		DWORD err = GetLastError();
+		errno = (err == ERROR_DIRECTORY) ? ENOTDIR : err_win_to_posix(err);
 		return NULL;
 	}
 
-	/* check if it's a directory */
-	if (!(attrs & FILE_ATTRIBUTE_DIRECTORY)) {
-		errno = ENOTDIR;
-		return NULL;
-	}
-
-	/* check that the pattern won't be too long for FindFirstFileA */
-	len = strlen(name);
-	if (is_dir_sep(name[len - 1]))
-		len--;
-	if (len + 2 >= MAX_PATH) {
-		errno = ENAMETOOLONG;
-		return NULL;
-	}
-
-	p = malloc(sizeof(DIR) + len + 2);
-	if (!p)
-		return NULL;
-
-	memset(p, 0, sizeof(DIR) + len + 2);
-	strcpy(p->dd_name, name);
-	p->dd_name[len] = '/';
-	p->dd_name[len+1] = '*';
-
-	p->dd_handle = INVALID_HANDLE_VALUE;
-	return p;
+	/* initialize DIR structure and copy first dir entry */
+	dir = xmalloc(sizeof(DIR));
+	dir->dd_handle = h;
+	dir->dd_stat = 0;
+	finddata2dirent(&dir->dd_dir, &fdata);
+	return dir;
 }
 
 struct dirent *readdir(DIR *dir)
 {
-	WIN32_FIND_DATAA buf;
-	HANDLE handle;
-
-	if (!dir || !dir->dd_handle) {
+	if (!dir) {
 		errno = EBADF; /* No set_errno for mingw */
 		return NULL;
 	}
 
-	if (dir->dd_handle == INVALID_HANDLE_VALUE && dir->dd_stat == 0) {
-		DWORD lasterr;
-		handle = FindFirstFileA(dir->dd_name, &buf);
-		lasterr = GetLastError();
-		dir->dd_handle = handle;
-		if (handle == INVALID_HANDLE_VALUE && (lasterr != ERROR_NO_MORE_FILES)) {
-			errno = err_win_to_posix(lasterr);
+	/* if first entry, dirent has already been set up by opendir */
+	if (dir->dd_stat) {
+		/* get next entry and convert from WIN32_FIND_DATA to dirent */
+		WIN32_FIND_DATAW fdata;
+		if (FindNextFileW(dir->dd_handle, &fdata)) {
+			finddata2dirent(&dir->dd_dir, &fdata);
+		} else {
+			DWORD lasterr = GetLastError();
+			/* POSIX says you shouldn't set errno when readdir can't
+			   find any more files; so, if another error we leave it set. */
+			if (lasterr != ERROR_NO_MORE_FILES)
+				errno = err_win_to_posix(lasterr);
 			return NULL;
 		}
-	} else if (dir->dd_handle == INVALID_HANDLE_VALUE) {
-		return NULL;
-	} else if (!FindNextFileA(dir->dd_handle, &buf)) {
-		DWORD lasterr = GetLastError();
-		FindClose(dir->dd_handle);
-		dir->dd_handle = INVALID_HANDLE_VALUE;
-		/* POSIX says you shouldn't set errno when readdir can't
-		   find any more files; so, if another error we leave it set. */
-		if (lasterr != ERROR_NO_MORE_FILES)
-			errno = err_win_to_posix(lasterr);
-		return NULL;
 	}
 
-	/* We get here if `buf' contains valid data.  */
-	strcpy(dir->dd_dir.d_name, buf.cFileName);
 	++dir->dd_stat;
-
-	/* Set file type, based on WIN32_FIND_DATA */
-	dir->dd_dir.d_type = 0;
-	if (buf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
-		dir->dd_dir.d_type |= DT_DIR;
-	else
-		dir->dd_dir.d_type |= DT_REG;
-
 	return &dir->dd_dir;
 }
 
@@ -101,8 +86,7 @@
 		return -1;
 	}
 
-	if (dir->dd_handle != INVALID_HANDLE_VALUE)
-		FindClose(dir->dd_handle);
+	FindClose(dir->dd_handle);
 	free(dir);
 	return 0;
 }
diff --git a/compat/win32/dirent.h b/compat/win32/dirent.h
index 927a25c..058207e 100644
--- a/compat/win32/dirent.h
+++ b/compat/win32/dirent.h
@@ -9,12 +9,8 @@
 #define DT_LNK     3
 
 struct dirent {
-	long d_ino;                      /* Always zero. */
-	char d_name[FILENAME_MAX];       /* File name. */
-	union {
-		unsigned short d_reclen; /* Always zero. */
-		unsigned char  d_type;   /* Reimplementation adds this */
-	};
+	unsigned char d_type;      /* file type to prevent lstat after readdir */
+	char d_name[MAX_PATH * 3]; /* file name (* 3 for UTF-8 conversion) */
 };
 
 DIR *opendir(const char *dirname);
diff --git a/compat/winansi.c b/compat/winansi.c
index dedce21..efc5bb3 100644
--- a/compat/winansi.c
+++ b/compat/winansi.c
@@ -2,15 +2,10 @@
  * Copyright 2008 Peter Harris <git@peter.is-a-geek.org>
  */
 
+#undef NOGDI
 #include "../git-compat-util.h"
-
-/*
- Functions to be wrapped:
-*/
-#undef printf
-#undef fprintf
-#undef fputs
-/* TODO: write */
+#include <wingdi.h>
+#include <winreg.h>
 
 /*
  ANSI codes used by git: m, K
@@ -23,29 +18,114 @@
 static WORD plain_attr;
 static WORD attr;
 static int negative;
+static int non_ascii_used = 0;
+static HANDLE hthread, hread, hwrite;
+static HANDLE hconsole1, hconsole2;
 
-static void init(void)
+#ifdef __MINGW32__
+typedef struct _CONSOLE_FONT_INFOEX {
+	ULONG cbSize;
+	DWORD nFont;
+	COORD dwFontSize;
+	UINT FontFamily;
+	UINT FontWeight;
+	WCHAR FaceName[LF_FACESIZE];
+} CONSOLE_FONT_INFOEX, *PCONSOLE_FONT_INFOEX;
+#endif
+
+typedef BOOL (WINAPI *PGETCURRENTCONSOLEFONTEX)(HANDLE, BOOL,
+		PCONSOLE_FONT_INFOEX);
+
+static void warn_if_raster_font(void)
 {
-	CONSOLE_SCREEN_BUFFER_INFO sbi;
+	DWORD fontFamily = 0;
+	PGETCURRENTCONSOLEFONTEX pGetCurrentConsoleFontEx;
 
-	static int initialized = 0;
-	if (initialized)
+	/* don't bother if output was ascii only */
+	if (!non_ascii_used)
 		return;
 
-	console = GetStdHandle(STD_OUTPUT_HANDLE);
-	if (console == INVALID_HANDLE_VALUE)
-		console = NULL;
+	/* GetCurrentConsoleFontEx is available since Vista */
+	pGetCurrentConsoleFontEx = (PGETCURRENTCONSOLEFONTEX) GetProcAddress(
+			GetModuleHandle("kernel32.dll"),
+			"GetCurrentConsoleFontEx");
+	if (pGetCurrentConsoleFontEx) {
+		CONSOLE_FONT_INFOEX cfi;
+		cfi.cbSize = sizeof(cfi);
+		if (pGetCurrentConsoleFontEx(console, 0, &cfi))
+			fontFamily = cfi.FontFamily;
+	} else {
+		/* pre-Vista: check default console font in registry */
+		HKEY hkey;
+		if (ERROR_SUCCESS == RegOpenKeyExA(HKEY_CURRENT_USER, "Console",
+				0, KEY_READ, &hkey)) {
+			DWORD size = sizeof(fontFamily);
+			RegQueryValueExA(hkey, "FontFamily", NULL, NULL,
+					(LPVOID) &fontFamily, &size);
+			RegCloseKey(hkey);
+		}
+	}
 
-	if (!console)
-		return;
-
-	GetConsoleScreenBufferInfo(console, &sbi);
-	attr = plain_attr = sbi.wAttributes;
-	negative = 0;
-
-	initialized = 1;
+	if (!(fontFamily & TMPF_TRUETYPE)) {
+		const wchar_t *msg = L"\nWarning: Your console font probably "
+			L"doesn\'t support Unicode. If you experience strange "
+			L"characters in the output, consider switching to a "
+			L"TrueType font such as Consolas!\n";
+		DWORD dummy;
+		WriteConsoleW(console, msg, wcslen(msg), &dummy, NULL);
+	}
 }
 
+static int is_console(int fd)
+{
+	CONSOLE_SCREEN_BUFFER_INFO sbi;
+	HANDLE hcon;
+
+	static int initialized = 0;
+
+	/* get OS handle of the file descriptor */
+	hcon = (HANDLE) _get_osfhandle(fd);
+	if (hcon == INVALID_HANDLE_VALUE)
+		return 0;
+
+	/* check if its a device (i.e. console, printer, serial port) */
+	if (GetFileType(hcon) != FILE_TYPE_CHAR)
+		return 0;
+
+	/* check if its a handle to a console output screen buffer */
+	if (!GetConsoleScreenBufferInfo(hcon, &sbi))
+		return 0;
+
+	/* initialize attributes */
+	if (!initialized) {
+		console = hcon;
+		attr = plain_attr = sbi.wAttributes;
+		negative = 0;
+		initialized = 1;
+	}
+
+	return 1;
+}
+
+#define BUFFER_SIZE 4096
+#define MAX_PARAMS 16
+
+static void write_console(unsigned char *str, size_t len)
+{
+	/* only called from console_thread, so a static buffer will do */
+	static wchar_t wbuf[2 * BUFFER_SIZE + 1];
+	DWORD dummy;
+
+	/* convert utf-8 to utf-16 */
+	int wlen = xutftowcsn(wbuf, (char*) str, ARRAY_SIZE(wbuf), len);
+
+	/* write directly to console */
+	WriteConsoleW(console, wbuf, wlen, &dummy, NULL);
+
+	/* remember if non-ascii characters are printed */
+	if (wlen != len)
+		non_ascii_used = 1;
+}
 
 #define FOREGROUND_ALL (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
 #define BACKGROUND_ALL (BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE)
@@ -90,18 +170,13 @@
 		&dummy);
 }
 
-
-static const char *set_attr(const char *str)
+static void set_attr(char func, const int *params, int paramlen)
 {
-	const char *func;
-	size_t len = strspn(str, "0123456789;");
-	func = str + len;
-
-	switch (*func) {
+	int i;
+	switch (func) {
 	case 'm':
-		do {
-			long val = strtol(str, (char **)&str, 10);
-			switch (val) {
+		for (i = 0; i < paramlen; i++) {
+			switch (params[i]) {
 			case 0: /* reset */
 				attr = plain_attr;
 				negative = 0;
@@ -224,9 +299,7 @@
 				/* Unsupported code */
 				break;
 			}
-			str++;
-		} while (*(str-1) == ';');
-
+		}
 		set_console_attr();
 		break;
 	case 'K':
@@ -236,122 +309,271 @@
 		/* Unsupported code */
 		break;
 	}
-
-	return func + 1;
 }
 
-static int ansi_emulate(const char *str, FILE *stream)
+enum {
+	TEXT = 0, ESCAPE = 033, BRACKET = '['
+};
+
+static DWORD WINAPI console_thread(LPVOID unused)
 {
-	int rv = 0;
-	const char *pos = str;
+	unsigned char buffer[BUFFER_SIZE];
+	DWORD bytes;
+	int start, end = 0, c, parampos = 0, state = TEXT;
+	int params[MAX_PARAMS];
 
-	while (*pos) {
-		pos = strstr(str, "\033[");
-		if (pos) {
-			size_t len = pos - str;
+	while (1) {
+		/* read next chunk of bytes from the pipe */
+		if (!ReadFile(hread, buffer + end, BUFFER_SIZE - end, &bytes,
+				NULL)) {
+			/* exit if pipe has been closed or disconnected */
+			if (GetLastError() == ERROR_PIPE_NOT_CONNECTED ||
+					GetLastError() == ERROR_BROKEN_PIPE)
+				break;
+			/* ignore other errors */
+			continue;
+		}
 
-			if (len) {
-				size_t out_len = fwrite(str, 1, len, stream);
-				rv += out_len;
-				if (out_len < len)
-					return rv;
+		/* scan the bytes and handle ANSI control codes */
+		bytes += end;
+		start = end = 0;
+		while (end < bytes) {
+			c = buffer[end++];
+			switch (state) {
+			case TEXT:
+				if (c == ESCAPE) {
+					/* print text seen so far */
+					if (end - 1 > start)
+						write_console(buffer + start,
+							end - 1 - start);
+
+					/* then start parsing escape sequence */
+					start = end - 1;
+					memset(params, 0, sizeof(params));
+					parampos = 0;
+					state = ESCAPE;
+				}
+				break;
+
+			case ESCAPE:
+				/* continue if "\033[", otherwise bail out */
+				state = (c == BRACKET) ? BRACKET : TEXT;
+				break;
+
+			case BRACKET:
+				/* parse [0-9;]* into array of parameters */
+				if (c >= '0' && c <= '9') {
+					params[parampos] *= 10;
+					params[parampos] += c - '0';
+				} else if (c == ';') {
+					/*
+					 * next parameter, bail out if out of
+					 * bounds
+					 */
+					parampos++;
+					if (parampos >= MAX_PARAMS)
+						state = TEXT;
+				} else {
+					/*
+					 * end of escape sequence, change
+					 * console attributes
+					 */
+					set_attr(c, params, parampos + 1);
+					start = end;
+					state = TEXT;
+				}
+				break;
+			}
+		}
+
+		/* print remaining text unless parsing an escape sequence */
+		if (state == TEXT && end > start) {
+			/* check for incomplete UTF-8 sequences and fix end */
+			if (buffer[end - 1] >= 0x80) {
+				if (buffer[end -1] >= 0xc0)
+					end--;
+				else if (end - 1 > start &&
+						buffer[end - 2] >= 0xe0)
+					end -= 2;
+				else if (end - 2 > start &&
+						buffer[end - 3] >= 0xf0)
+					end -= 3;
 			}
 
-			str = pos + 2;
-			rv += 2;
+			/* print remaining complete UTF-8 sequences */
+			if (end > start)
+				write_console(buffer + start, end - start);
 
-			fflush(stream);
-
-			pos = set_attr(str);
-			rv += pos - str;
-			str = pos;
+			/* move remaining bytes to the front */
+			if (end < bytes)
+				memmove(buffer, buffer + end, bytes - end);
+			end = bytes - end;
 		} else {
-			rv += strlen(str);
-			fputs(str, stream);
-			return rv;
+			/* all data has been consumed, mark buffer empty */
+			end = 0;
 		}
 	}
-	return rv;
+
+	/* check if the console font supports unicode */
+	warn_if_raster_font();
+
+	CloseHandle(hread);
+	return 0;
 }
 
-int winansi_fputs(const char *str, FILE *stream)
+static void winansi_exit(void)
 {
-	int rv;
+	/* flush all streams */
+	_flushall();
 
-	if (!isatty(fileno(stream)))
-		return fputs(str, stream);
+	/* signal console thread to exit */
+	FlushFileBuffers(hwrite);
+	DisconnectNamedPipe(hwrite);
 
-	init();
+	/* wait for console thread to copy remaining data */
+	WaitForSingleObject(hthread, INFINITE);
 
-	if (!console)
-		return fputs(str, stream);
-
-	rv = ansi_emulate(str, stream);
-
-	if (rv >= 0)
-		return 0;
-	else
-		return EOF;
+	/* cleanup handles... */
+	CloseHandle(hwrite);
+	CloseHandle(hthread);
 }
 
-static int winansi_vfprintf(FILE *stream, const char *format, va_list list)
+static void die_lasterr(const char *fmt, ...)
 {
-	int len, rv;
-	char small_buf[256];
-	char *buf = small_buf;
-	va_list cp;
+	va_list params;
+	va_start(params, fmt);
+	errno = err_win_to_posix(GetLastError());
+	die_errno(fmt, params);
+	va_end(params);
+}
 
-	if (!isatty(fileno(stream)))
-		goto abort;
+static HANDLE duplicate_handle(HANDLE hnd)
+{
+	HANDLE hresult, hproc = GetCurrentProcess();
+	if (!DuplicateHandle(hproc, hnd, hproc, &hresult, 0, TRUE,
+			DUPLICATE_SAME_ACCESS))
+		die_lasterr("DuplicateHandle(%li) failed", (long) hnd);
+	return hresult;
+}
 
-	init();
 
-	if (!console)
-		goto abort;
+/*
+ * Make MSVCRT's internal file descriptor control structure accessible
+ * so that we can tweak OS handles and flags directly (we need MSVCRT
+ * to treat our pipe handle as if it were a console).
+ *
+ * We assume that the ioinfo structure (exposed by MSVCRT.dll via
+ * __pioinfo) starts with the OS handle and the flags. The exact size
+ * varies between MSVCRT versions, so we try different sizes until
+ * toggling the FDEV bit of _pioinfo(1)->osflags is reflected in
+ * isatty(1).
+ */
+typedef struct {
+	HANDLE osfhnd;
+	char osflags;
+} ioinfo;
 
-	va_copy(cp, list);
-	len = vsnprintf(small_buf, sizeof(small_buf), format, cp);
-	va_end(cp);
+extern __declspec(dllimport) ioinfo *__pioinfo[];
 
-	if (len > sizeof(small_buf) - 1) {
-		buf = malloc(len + 1);
-		if (!buf)
-			goto abort;
+static size_t sizeof_ioinfo = 0;
 
-		len = vsnprintf(buf, len + 1, format, list);
+#define IOINFO_L2E 5
+#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
+
+#define FDEV  0x40
+
+static inline ioinfo* _pioinfo(int fd)
+{
+	return (ioinfo*)((char*)__pioinfo[fd >> IOINFO_L2E] +
+			(fd & (IOINFO_ARRAY_ELTS - 1)) * sizeof_ioinfo);
+}
+
+static int init_sizeof_ioinfo()
+{
+	int istty, wastty;
+	/* don't init twice */
+	if (sizeof_ioinfo)
+		return sizeof_ioinfo >= 256;
+
+	sizeof_ioinfo = sizeof(ioinfo);
+	wastty = isatty(1);
+	while (sizeof_ioinfo < 256) {
+		/* toggle FDEV flag, check isatty, then toggle back */
+		_pioinfo(1)->osflags ^= FDEV;
+		istty = isatty(1);
+		_pioinfo(1)->osflags ^= FDEV;
+		/* return if we found the correct size */
+		if (istty != wastty)
+			return 0;
+		sizeof_ioinfo += sizeof(void*);
 	}
-
-	rv = ansi_emulate(buf, stream);
-
-	if (buf != small_buf)
-		free(buf);
-	return rv;
-
-abort:
-	rv = vfprintf(stream, format, list);
-	return rv;
+	error("Tweaking file descriptors doesn't work with this MSVCRT.dll");
+	return 1;
 }
 
-int winansi_fprintf(FILE *stream, const char *format, ...)
+static HANDLE swap_osfhnd(int fd, HANDLE new_handle)
 {
-	va_list list;
-	int rv;
+	ioinfo *pioinfo;
+	HANDLE old_handle;
 
-	va_start(list, format);
-	rv = winansi_vfprintf(stream, format, list);
-	va_end(list);
+	/* init ioinfo size if we haven't done so */
+	if (init_sizeof_ioinfo())
+		return INVALID_HANDLE_VALUE;
 
-	return rv;
+	/* get ioinfo pointer and change the handles */
+	pioinfo = _pioinfo(fd);
+	old_handle = pioinfo->osfhnd;
+	pioinfo->osfhnd = new_handle;
+	return old_handle;
 }
 
-int winansi_printf(const char *format, ...)
+void winansi_init(void)
 {
-	va_list list;
-	int rv;
+	int con1, con2;
+	char name[32];
 
-	va_start(list, format);
-	rv = winansi_vfprintf(stdout, format, list);
-	va_end(list);
+	/* check if either stdout or stderr is a console output screen buffer */
+	con1 = is_console(1);
+	con2 = is_console(2);
+	if (!con1 && !con2)
+		return;
 
-	return rv;
+	/* create a named pipe to communicate with the console thread */
+	sprintf(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)
+		die_lasterr("CreateNamedPipe failed");
+
+	hread = CreateFile(name, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
+	if (hread == INVALID_HANDLE_VALUE)
+		die_lasterr("CreateFile for named pipe failed");
+
+	/* start console spool thread on the pipe's read end */
+	hthread = CreateThread(NULL, 0, console_thread, NULL, 0, NULL);
+	if (hthread == INVALID_HANDLE_VALUE)
+		die_lasterr("CreateThread(console_thread) failed");
+
+	/* schedule cleanup routine */
+	if (atexit(winansi_exit))
+		die_errno("atexit(winansi_exit) failed");
+
+	/* redirect stdout / stderr to the pipe */
+	if (con1)
+		hconsole1 = swap_osfhnd(1, duplicate_handle(hwrite));
+	if (con2)
+		hconsole2 = swap_osfhnd(2, duplicate_handle(hwrite));
+}
+
+/*
+ * Returns the real console handle if stdout / stderr is a pipe redirecting
+ * to the console. Allows spawn / exec to pass the console to the next process.
+ */
+HANDLE winansi_get_osfhandle(int fd)
+{
+	HANDLE hnd = (HANDLE) _get_osfhandle(fd);
+	if ((fd == 1 || fd == 2) && isatty(fd)
+	    && GetFileType(hnd) == FILE_TYPE_PIPE)
+		return (fd == 1) ? hconsole1 : hconsole2;
+	return hnd;
 }
diff --git a/config.c b/config.c
index 2634457..15a2983 100644
--- a/config.c
+++ b/config.c
@@ -6,9 +6,12 @@
  *
  */
 #include "cache.h"
+#include "lockfile.h"
 #include "exec_cmd.h"
 #include "strbuf.h"
 #include "quote.h"
+#include "hashmap.h"
+#include "string-list.h"
 
 struct config_source {
 	struct config_source *prev;
@@ -37,6 +40,13 @@
 
 static int zlib_compression_seen;
 
+/*
+ * Default config_set that contains key-value pairs from the usual set of config
+ * config files (i.e repo specific .git/config, user wide ~/.gitconfig, XDG
+ * config file and the global /etc/gitconfig)
+ */
+static struct config_set the_config_set;
+
 static int config_file_fgetc(struct config_source *conf)
 {
 	return fgetc(conf->u.file);
@@ -127,7 +137,6 @@
 int git_config_include(const char *var, const char *value, void *data)
 {
 	struct config_include_data *inc = data;
-	const char *type;
 	int ret;
 
 	/*
@@ -138,21 +147,11 @@
 	if (ret < 0)
 		return ret;
 
-	type = skip_prefix(var, "include.");
-	if (!type)
-		return ret;
-
-	if (!strcmp(type, "path"))
+	if (!strcmp(var, "include.path"))
 		ret = handle_path_include(value, inc);
 	return ret;
 }
 
-static void lowercase(char *p)
-{
-	for (; *p; p++)
-		*p = tolower(*p);
-}
-
 void git_config_push_parameter(const char *text)
 {
 	struct strbuf env = STRBUF_INIT;
@@ -169,19 +168,27 @@
 int git_config_parse_parameter(const char *text,
 			       config_fn_t fn, void *data)
 {
+	const char *value;
 	struct strbuf **pair;
+
 	pair = strbuf_split_str(text, '=', 2);
 	if (!pair[0])
 		return error("bogus config parameter: %s", text);
-	if (pair[0]->len && pair[0]->buf[pair[0]->len - 1] == '=')
+
+	if (pair[0]->len && pair[0]->buf[pair[0]->len - 1] == '=') {
 		strbuf_setlen(pair[0], pair[0]->len - 1);
+		value = pair[1] ? pair[1]->buf : "";
+	} else {
+		value = NULL;
+	}
+
 	strbuf_trim(pair[0]);
 	if (!pair[0]->len) {
 		strbuf_list_free(pair);
 		return error("bogus config parameter: %s", text);
 	}
-	lowercase(pair[0]->buf);
-	if (fn(pair[0]->buf, pair[1] ? pair[1]->buf : NULL, data) < 0) {
+	strbuf_tolower(pair[0]);
+	if (fn(pair[0]->buf, value, data) < 0) {
 		strbuf_list_free(pair);
 		return -1;
 	}
@@ -236,6 +243,7 @@
 		cf->linenr++;
 	if (c == EOF) {
 		cf->eof = 1;
+		cf->linenr++;
 		c = '\n';
 	}
 	return c;
@@ -311,6 +319,7 @@
 {
 	int c;
 	char *value;
+	int ret;
 
 	/* Get the full name */
 	for (;;) {
@@ -333,7 +342,15 @@
 		if (!value)
 			return -1;
 	}
-	return fn(name->buf, value, data);
+	/*
+	 * We already consumed the \n, but we need linenr to point to
+	 * the line we just parsed during the call to fn to get
+	 * accurate line number in error messages.
+	 */
+	cf->linenr--;
+	ret = fn(name->buf, value, data);
+	cf->linenr++;
+	return ret;
 }
 
 static int get_extended_base_var(struct strbuf *name, int c)
@@ -449,9 +466,9 @@
 			break;
 	}
 	if (cf->die_on_error)
-		die("bad config file line %d in %s", cf->linenr, cf->name);
+		die(_("bad config file line %d in %s"), cf->linenr, cf->name);
 	else
-		return error("bad config file line %d in %s", cf->linenr, cf->name);
+		return error(_("bad config file line %d in %s"), cf->linenr, cf->name);
 }
 
 static int parse_unit_factor(const char *end, uintmax_t *val)
@@ -567,9 +584,9 @@
 		value = "";
 
 	if (cf && cf->name)
-		die("bad numeric config value '%s' for '%s' in %s: %s",
+		die(_("bad numeric config value '%s' for '%s' in %s: %s"),
 		    value, name, cf->name, reason);
-	die("bad numeric config value '%s' for '%s': %s", value, name, reason);
+	die(_("bad numeric config value '%s' for '%s': %s"), value, name, reason);
 }
 
 int git_config_int(const char *name, const char *value)
@@ -654,7 +671,7 @@
 		return config_error_nonbool(var);
 	*dest = expand_user_path(value);
 	if (!*dest)
-		die("Failed to expand user dir in: '%s'", value);
+		die(_("failed to expand user dir in: '%s'"), value);
 	return 0;
 }
 
@@ -732,7 +749,7 @@
 		if (level == -1)
 			level = Z_DEFAULT_COMPRESSION;
 		else if (level < 0 || level > Z_BEST_COMPRESSION)
-			die("bad zlib compression level %d", level);
+			die(_("bad zlib compression level %d"), level);
 		zlib_compression_level = level;
 		zlib_compression_seen = 1;
 		return 0;
@@ -743,7 +760,7 @@
 		if (level == -1)
 			level = Z_DEFAULT_COMPRESSION;
 		else if (level < 0 || level > Z_BEST_COMPRESSION)
-			die("bad zlib compression level %d", level);
+			die(_("bad zlib compression level %d"), level);
 		core_compression_level = level;
 		core_compression_seen = 1;
 		if (!zlib_compression_seen)
@@ -824,11 +841,16 @@
 		return git_config_string(&editor_program, var, value);
 
 	if (!strcmp(var, "core.commentchar")) {
-		const char *comment;
-		int ret = git_config_string(&comment, var, value);
-		if (!ret)
-			comment_line_char = comment[0];
-		return ret;
+		if (!value)
+			return config_error_nonbool(var);
+		else if (!strcasecmp(value, "auto"))
+			auto_comment_line_char = 1;
+		else if (value[0] && !value[1]) {
+			comment_line_char = value[0];
+			auto_comment_line_char = 0;
+		} else
+			return error("core.commentChar should only be one character");
+		return 0;
 	}
 
 	if (!strcmp(var, "core.askpass"))
@@ -860,7 +882,7 @@
 		else if (!strcmp(value, "link"))
 			object_creation_mode = OBJECT_CREATION_USES_HARDLINKS;
 		else
-			die("Invalid mode for object creation: %s", value);
+			die(_("invalid mode for object creation: %s"), value);
 		return 0;
 	}
 
@@ -1118,12 +1140,28 @@
 	return system_wide;
 }
 
+/*
+ * Parse environment variable 'k' as a boolean (in various
+ * possible spellings); if missing, use the default value 'def'.
+ */
 int git_env_bool(const char *k, int def)
 {
 	const char *v = getenv(k);
 	return v ? git_config_bool(k, v) : def;
 }
 
+/*
+ * Parse environment variable 'k' as ulong with possibly a unit
+ * suffix; if missing, use the default value 'val'.
+ */
+unsigned long git_env_ulong(const char *k, unsigned long val)
+{
+	const char *v = getenv(k);
+	if (v && !git_parse_ulong(v, &val))
+		die("failed to parse %s", k);
+	return val;
+}
+
 int git_config_system(void)
 {
 	return !git_env_bool("GIT_CONFIG_NOSYSTEM", 0);
@@ -1160,7 +1198,7 @@
 
 	switch (git_config_from_parameters(fn, data)) {
 	case -1: /* error */
-		die("unable to parse command-line config");
+		die(_("unable to parse command-line config"));
 		break;
 	case 0: /* found nothing */
 		break;
@@ -1207,9 +1245,365 @@
 	return ret;
 }
 
-int git_config(config_fn_t fn, void *data)
+static void git_config_raw(config_fn_t fn, void *data)
 {
-	return git_config_with_options(fn, data, NULL, 1);
+	if (git_config_with_options(fn, data, NULL, 1) < 0)
+		/*
+		 * git_config_with_options() normally returns only
+		 * positive values, as most errors are fatal, and
+		 * non-fatal potential errors are guarded by "if"
+		 * statements that are entered only when no error is
+		 * possible.
+		 *
+		 * If we ever encounter a non-fatal error, it means
+		 * something went really wrong and we should stop
+		 * immediately.
+		 */
+		die(_("unknown error occured while reading the configuration files"));
+}
+
+static void configset_iter(struct config_set *cs, config_fn_t fn, void *data)
+{
+	int i, value_index;
+	struct string_list *values;
+	struct config_set_element *entry;
+	struct configset_list *list = &cs->list;
+	struct key_value_info *kv_info;
+
+	for (i = 0; i < list->nr; i++) {
+		entry = list->items[i].e;
+		value_index = list->items[i].value_index;
+		values = &entry->value_list;
+		if (fn(entry->key, values->items[value_index].string, data) < 0) {
+			kv_info = values->items[value_index].util;
+			git_die_config_linenr(entry->key, kv_info->filename, kv_info->linenr);
+		}
+	}
+}
+
+static void git_config_check_init(void);
+
+void git_config(config_fn_t fn, void *data)
+{
+	git_config_check_init();
+	configset_iter(&the_config_set, fn, data);
+}
+
+static struct config_set_element *configset_find_element(struct config_set *cs, const char *key)
+{
+	struct config_set_element k;
+	struct config_set_element *found_entry;
+	char *normalized_key;
+	int ret;
+	/*
+	 * `key` may come from the user, so normalize it before using it
+	 * for querying entries from the hashmap.
+	 */
+	ret = git_config_parse_key(key, &normalized_key, NULL);
+
+	if (ret)
+		return NULL;
+
+	hashmap_entry_init(&k, strhash(normalized_key));
+	k.key = normalized_key;
+	found_entry = hashmap_get(&cs->config_hash, &k, NULL);
+	free(normalized_key);
+	return found_entry;
+}
+
+static int configset_add_value(struct config_set *cs, const char *key, const char *value)
+{
+	struct config_set_element *e;
+	struct string_list_item *si;
+	struct configset_list_item *l_item;
+	struct key_value_info *kv_info = xmalloc(sizeof(*kv_info));
+
+	e = configset_find_element(cs, key);
+	/*
+	 * Since the keys are being fed by git_config*() callback mechanism, they
+	 * are already normalized. So simply add them without any further munging.
+	 */
+	if (!e) {
+		e = xmalloc(sizeof(*e));
+		hashmap_entry_init(e, strhash(key));
+		e->key = xstrdup(key);
+		string_list_init(&e->value_list, 1);
+		hashmap_add(&cs->config_hash, e);
+	}
+	si = string_list_append_nodup(&e->value_list, value ? xstrdup(value) : NULL);
+
+	ALLOC_GROW(cs->list.items, cs->list.nr + 1, cs->list.alloc);
+	l_item = &cs->list.items[cs->list.nr++];
+	l_item->e = e;
+	l_item->value_index = e->value_list.nr - 1;
+
+	if (cf) {
+		kv_info->filename = strintern(cf->name);
+		kv_info->linenr = cf->linenr;
+	} else {
+		/* for values read from `git_config_from_parameters()` */
+		kv_info->filename = NULL;
+		kv_info->linenr = -1;
+	}
+	si->util = kv_info;
+
+	return 0;
+}
+
+static int config_set_element_cmp(const struct config_set_element *e1,
+				 const struct config_set_element *e2, const void *unused)
+{
+	return strcmp(e1->key, e2->key);
+}
+
+void git_configset_init(struct config_set *cs)
+{
+	hashmap_init(&cs->config_hash, (hashmap_cmp_fn)config_set_element_cmp, 0);
+	cs->hash_initialized = 1;
+	cs->list.nr = 0;
+	cs->list.alloc = 0;
+	cs->list.items = NULL;
+}
+
+void git_configset_clear(struct config_set *cs)
+{
+	struct config_set_element *entry;
+	struct hashmap_iter iter;
+	if (!cs->hash_initialized)
+		return;
+
+	hashmap_iter_init(&cs->config_hash, &iter);
+	while ((entry = hashmap_iter_next(&iter))) {
+		free(entry->key);
+		string_list_clear(&entry->value_list, 1);
+	}
+	hashmap_free(&cs->config_hash, 1);
+	cs->hash_initialized = 0;
+	free(cs->list.items);
+	cs->list.nr = 0;
+	cs->list.alloc = 0;
+	cs->list.items = NULL;
+}
+
+static int config_set_callback(const char *key, const char *value, void *cb)
+{
+	struct config_set *cs = cb;
+	configset_add_value(cs, key, value);
+	return 0;
+}
+
+int git_configset_add_file(struct config_set *cs, const char *filename)
+{
+	return git_config_from_file(config_set_callback, filename, cs);
+}
+
+int git_configset_get_value(struct config_set *cs, const char *key, const char **value)
+{
+	const struct string_list *values = NULL;
+	/*
+	 * Follows "last one wins" semantic, i.e., if there are multiple matches for the
+	 * queried key in the files of the configset, the value returned will be the last
+	 * value in the value list for that key.
+	 */
+	values = git_configset_get_value_multi(cs, key);
+
+	if (!values)
+		return 1;
+	assert(values->nr > 0);
+	*value = values->items[values->nr - 1].string;
+	return 0;
+}
+
+const struct string_list *git_configset_get_value_multi(struct config_set *cs, const char *key)
+{
+	struct config_set_element *e = configset_find_element(cs, key);
+	return e ? &e->value_list : NULL;
+}
+
+int git_configset_get_string_const(struct config_set *cs, const char *key, const char **dest)
+{
+	const char *value;
+	if (!git_configset_get_value(cs, key, &value))
+		return git_config_string(dest, key, value);
+	else
+		return 1;
+}
+
+int git_configset_get_string(struct config_set *cs, const char *key, char **dest)
+{
+	return git_configset_get_string_const(cs, key, (const char **)dest);
+}
+
+int git_configset_get_int(struct config_set *cs, const char *key, int *dest)
+{
+	const char *value;
+	if (!git_configset_get_value(cs, key, &value)) {
+		*dest = git_config_int(key, value);
+		return 0;
+	} else
+		return 1;
+}
+
+int git_configset_get_ulong(struct config_set *cs, const char *key, unsigned long *dest)
+{
+	const char *value;
+	if (!git_configset_get_value(cs, key, &value)) {
+		*dest = git_config_ulong(key, value);
+		return 0;
+	} else
+		return 1;
+}
+
+int git_configset_get_bool(struct config_set *cs, const char *key, int *dest)
+{
+	const char *value;
+	if (!git_configset_get_value(cs, key, &value)) {
+		*dest = git_config_bool(key, value);
+		return 0;
+	} else
+		return 1;
+}
+
+int git_configset_get_bool_or_int(struct config_set *cs, const char *key,
+				int *is_bool, int *dest)
+{
+	const char *value;
+	if (!git_configset_get_value(cs, key, &value)) {
+		*dest = git_config_bool_or_int(key, value, is_bool);
+		return 0;
+	} else
+		return 1;
+}
+
+int git_configset_get_maybe_bool(struct config_set *cs, const char *key, int *dest)
+{
+	const char *value;
+	if (!git_configset_get_value(cs, key, &value)) {
+		*dest = git_config_maybe_bool(key, value);
+		if (*dest == -1)
+			return -1;
+		return 0;
+	} else
+		return 1;
+}
+
+int git_configset_get_pathname(struct config_set *cs, const char *key, const char **dest)
+{
+	const char *value;
+	if (!git_configset_get_value(cs, key, &value))
+		return git_config_pathname(dest, key, value);
+	else
+		return 1;
+}
+
+static void git_config_check_init(void)
+{
+	if (the_config_set.hash_initialized)
+		return;
+	git_configset_init(&the_config_set);
+	git_config_raw(config_set_callback, &the_config_set);
+}
+
+void git_config_clear(void)
+{
+	if (!the_config_set.hash_initialized)
+		return;
+	git_configset_clear(&the_config_set);
+}
+
+int git_config_get_value(const char *key, const char **value)
+{
+	git_config_check_init();
+	return git_configset_get_value(&the_config_set, key, value);
+}
+
+const struct string_list *git_config_get_value_multi(const char *key)
+{
+	git_config_check_init();
+	return git_configset_get_value_multi(&the_config_set, key);
+}
+
+int git_config_get_string_const(const char *key, const char **dest)
+{
+	int ret;
+	git_config_check_init();
+	ret = git_configset_get_string_const(&the_config_set, key, dest);
+	if (ret < 0)
+		git_die_config(key, NULL);
+	return ret;
+}
+
+int git_config_get_string(const char *key, char **dest)
+{
+	git_config_check_init();
+	return git_config_get_string_const(key, (const char **)dest);
+}
+
+int git_config_get_int(const char *key, int *dest)
+{
+	git_config_check_init();
+	return git_configset_get_int(&the_config_set, key, dest);
+}
+
+int git_config_get_ulong(const char *key, unsigned long *dest)
+{
+	git_config_check_init();
+	return git_configset_get_ulong(&the_config_set, key, dest);
+}
+
+int git_config_get_bool(const char *key, int *dest)
+{
+	git_config_check_init();
+	return git_configset_get_bool(&the_config_set, key, dest);
+}
+
+int git_config_get_bool_or_int(const char *key, int *is_bool, int *dest)
+{
+	git_config_check_init();
+	return git_configset_get_bool_or_int(&the_config_set, key, is_bool, dest);
+}
+
+int git_config_get_maybe_bool(const char *key, int *dest)
+{
+	git_config_check_init();
+	return git_configset_get_maybe_bool(&the_config_set, key, dest);
+}
+
+int git_config_get_pathname(const char *key, const char **dest)
+{
+	int ret;
+	git_config_check_init();
+	ret = git_configset_get_pathname(&the_config_set, key, dest);
+	if (ret < 0)
+		git_die_config(key, NULL);
+	return ret;
+}
+
+NORETURN
+void git_die_config_linenr(const char *key, const char *filename, int linenr)
+{
+	if (!filename)
+		die(_("unable to parse '%s' from command-line config"), key);
+	else
+		die(_("bad config variable '%s' in file '%s' at line %d"),
+		    key, filename, linenr);
+}
+
+NORETURN __attribute__((format(printf, 2, 3)))
+void git_die_config(const char *key, const char *err, ...)
+{
+	const struct string_list *values;
+	struct key_value_info *kv_info;
+
+	if (err) {
+		va_list params;
+		va_start(params, err);
+		vreportf("error: ", err, params);
+		va_end(params);
+	}
+	values = git_config_get_value_multi(key);
+	kv_info = values->items[values->nr - 1].util;
+	git_die_config_linenr(key, kv_info->filename, kv_info->linenr);
 }
 
 /*
@@ -1230,10 +1624,15 @@
 
 static int matches(const char *key, const char *value)
 {
-	return !strcmp(key, store.key) &&
-		(store.value_regex == NULL ||
-		 (store.do_not_match ^
-		  !regexec(store.value_regex, value, 0, NULL, 0)));
+	if (strcmp(key, store.key))
+		return 0; /* not ours */
+	if (!store.value_regex)
+		return 1; /* always matches */
+	if (store.value_regex == CONFIG_REGEX_NONE)
+		return 0; /* never matches */
+
+	return store.do_not_match ^
+		(value && !regexec(store.value_regex, value, 0, NULL, 0));
 }
 
 static int store_aux(const char *key, const char *value, void *cb)
@@ -1245,7 +1644,7 @@
 	case KEY_SEEN:
 		if (matches(key, value)) {
 			if (store.seen == 1 && store.multi_replace == 0) {
-				warning("%s has multiple values", key);
+				warning(_("%s has multiple values"), key);
 			}
 
 			ALLOC_GROW(store.offset, store.seen + 1,
@@ -1495,6 +1894,8 @@
 /*
  * If value==NULL, unset in (remove from) config,
  * if value_regex!=NULL, disregard key/value pairs where value does not match.
+ * if value_regex==CONFIG_REGEX_NONE, do not match any existing values
+ *     (only add a new one)
  * if multi_replace==0, nothing, or only one matching key/value is replaced,
  *     else all matching key/values (regardless how many) are removed,
  *     before the new pair is written.
@@ -1578,6 +1979,8 @@
 
 		if (value_regex == NULL)
 			store.value_regex = NULL;
+		else if (value_regex == CONFIG_REGEX_NONE)
+			store.value_regex = CONFIG_REGEX_NONE;
 		else {
 			if (value_regex[0] == '!') {
 				store.do_not_match = 1;
@@ -1609,7 +2012,8 @@
 		if (git_config_from_file(store_aux, config_filename, NULL)) {
 			error("invalid config file %s", config_filename);
 			free(store.key);
-			if (store.value_regex != NULL) {
+			if (store.value_regex != NULL &&
+			    store.value_regex != CONFIG_REGEX_NONE) {
 				regfree(store.value_regex);
 				free(store.value_regex);
 			}
@@ -1618,7 +2022,8 @@
 		}
 
 		free(store.key);
-		if (store.value_regex != NULL) {
+		if (store.value_regex != NULL &&
+		    store.value_regex != CONFIG_REGEX_NONE) {
 			regfree(store.value_regex);
 			free(store.value_regex);
 		}
@@ -1636,6 +2041,13 @@
 			MAP_PRIVATE, in_fd, 0);
 		close(in_fd);
 
+		if (chmod(lock->filename.buf, st.st_mode & 07777) < 0) {
+			error("chmod on %s failed: %s",
+				lock->filename.buf, strerror(errno));
+			ret = CONFIG_NO_WRITE;
+			goto out_free;
+		}
+
 		if (store.seen == 0)
 			store.seen = 1;
 
@@ -1688,6 +2100,7 @@
 	if (commit_lock_file(lock) < 0) {
 		error("could not commit config file %s", config_filename);
 		ret = CONFIG_NO_WRITE;
+		lock = NULL;
 		goto out_free;
 	}
 
@@ -1700,6 +2113,9 @@
 	lock = NULL;
 	ret = 0;
 
+	/* Invalidate the config cache */
+	git_config_clear();
+
 out_free:
 	if (lock)
 		rollback_lock_file(lock);
@@ -1707,7 +2123,7 @@
 	return ret;
 
 write_err_out:
-	ret = write_error(lock->filename);
+	ret = write_error(lock->filename.buf);
 	goto out_free;
 
 }
@@ -1784,6 +2200,7 @@
 	int out_fd;
 	char buf[1024];
 	FILE *config_file;
+	struct stat st;
 
 	if (new_name && !section_name_is_ok(new_name)) {
 		ret = error("invalid section name: %s", new_name);
@@ -1805,6 +2222,14 @@
 		goto unlock_and_out;
 	}
 
+	fstat(fileno(config_file), &st);
+
+	if (chmod(lock->filename.buf, st.st_mode & 07777) < 0) {
+		ret = error("chmod on %s failed: %s",
+				lock->filename.buf, strerror(errno));
+		goto out;
+	}
+
 	while (fgets(buf, sizeof(buf), config_file)) {
 		int i;
 		int length;
@@ -1822,7 +2247,7 @@
 				}
 				store.baselen = strlen(new_name);
 				if (!store_write_section(out_fd, new_name)) {
-					ret = write_error(lock->filename);
+					ret = write_error(lock->filename.buf);
 					goto out;
 				}
 				/*
@@ -1848,7 +2273,7 @@
 			continue;
 		length = strlen(output);
 		if (write_in_full(out_fd, output, length) != length) {
-			ret = write_error(lock->filename);
+			ret = write_error(lock->filename.buf);
 			goto out;
 		}
 	}
diff --git a/config.mak.uname b/config.mak.uname
index 7846bd7..a2f380f 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -28,13 +28,16 @@
 	NO_NSEC = YesPlease
 endif
 ifeq ($(uname_S),Linux)
+	HAVE_ALLOCA_H = YesPlease
 	NO_STRLCPY = YesPlease
 	NO_MKSTEMPS = YesPlease
 	HAVE_PATHS_H = YesPlease
 	LIBC_CONTAINS_LIBINTL = YesPlease
 	HAVE_DEV_TTY = YesPlease
+	HAVE_CLOCK_GETTIME = YesPlease
 endif
 ifeq ($(uname_S),GNU/kFreeBSD)
+	HAVE_ALLOCA_H = YesPlease
 	NO_STRLCPY = YesPlease
 	NO_MKSTEMPS = YesPlease
 	HAVE_PATHS_H = YesPlease
@@ -86,8 +89,13 @@
 	NEEDS_CRYPTO_WITH_SSL = YesPlease
 	NEEDS_SSL_WITH_CRYPTO = YesPlease
 	NEEDS_LIBICONV = YesPlease
+	# Note: $(uname_R) gives us the underlying Darwin version.
+	# - MacOS 10.0.* and MacOS 10.1.0 = Darwin 1.*
+	# - MacOS 10.x.* = Darwin (x+4).* for (1 <= x)
+	# i.e. "begins with [15678] and a dot" means "10.4.* or older".
 	ifeq ($(shell expr "$(uname_R)" : '[15678]\.'),2)
 		OLD_ICONV = UnfortunatelyYes
+		NO_APPLE_COMMON_CRYPTO = YesPlease
 	endif
 	ifeq ($(shell expr "$(uname_R)" : '[15]\.'),2)
 		NO_STRLCPY = YesPlease
@@ -103,6 +111,7 @@
 	NEEDS_NSL = YesPlease
 	SHELL_PATH = /bin/bash
 	SANE_TOOL_PATH = /usr/xpg6/bin:/usr/xpg4/bin
+	HAVE_ALLOCA_H = YesPlease
 	NO_STRCASESTR = YesPlease
 	NO_MEMMEM = YesPlease
 	NO_MKDTEMP = YesPlease
@@ -145,7 +154,7 @@
 	endif
 	INSTALL = /usr/ucb/install
 	TAR = gtar
-	BASIC_CFLAGS += -D__EXTENSIONS__ -D__sun__ -DHAVE_ALLOCA_H
+	BASIC_CFLAGS += -D__EXTENSIONS__ -D__sun__
 endif
 ifeq ($(uname_O),Cygwin)
 	ifeq ($(shell expr "$(uname_R)" : '1\.[1-6]\.'),4)
@@ -164,6 +173,7 @@
 	else
 		NO_REGEX = UnfortunatelyYes
 	endif
+	HAVE_ALLOCA_H = YesPlease
 	NEEDS_LIBICONV = YesPlease
 	NO_FAST_WORKING_DIRECTORY = UnfortunatelyYes
 	NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
@@ -238,6 +248,7 @@
 endif
 ifeq ($(uname_S),GNU)
 	# GNU/Hurd
+	HAVE_ALLOCA_H = YesPlease
 	NO_STRLCPY = YesPlease
 	NO_MKSTEMPS = YesPlease
 	HAVE_PATHS_H = YesPlease
@@ -312,6 +323,7 @@
 ifeq ($(uname_S),Windows)
 	GIT_VERSION := $(GIT_VERSION).MSVC
 	pathsep = ;
+	HAVE_ALLOCA_H = YesPlease
 	NO_PREAD = YesPlease
 	NEEDS_CRYPTO_WITH_SSL = YesPlease
 	NO_LIBGEN_H = YesPlease
@@ -320,7 +332,6 @@
 	NO_IPV6 = YesPlease
 	NO_UNIX_SOCKETS = YesPlease
 	NO_SETENV = YesPlease
-	NO_UNSETENV = YesPlease
 	NO_STRCASESTR = YesPlease
 	NO_STRLCPY = YesPlease
 	NO_MEMMEM = YesPlease
@@ -348,6 +359,7 @@
 	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
@@ -356,17 +368,17 @@
 	COMPAT_OBJS = compat/msvc.o compat/winansi.o \
 		compat/win32/pthread.o compat/win32/syslog.o \
 		compat/win32/dirent.o
-	COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -DHAVE_ALLOCA_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
-	BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE -NODEFAULTLIB:MSVCRT.lib
+	COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
+	BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE
 	EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib invalidcontinue.obj
 	PTHREAD_LIBS =
 	lib =
 ifndef DEBUG
-	BASIC_CFLAGS += -GL -Os -MT
+	BASIC_CFLAGS += -GL -Os -MD
 	BASIC_LDFLAGS += -LTCG
 	AR += -LTCG
 else
-	BASIC_CFLAGS += -Zi -MTd
+	BASIC_CFLAGS += -Zi -MDd
 endif
 	X = .exe
 endif
@@ -464,6 +476,7 @@
 endif
 ifneq (,$(findstring MINGW,$(uname_S)))
 	pathsep = ;
+	HAVE_ALLOCA_H = YesPlease
 	NO_PREAD = YesPlease
 	NEEDS_CRYPTO_WITH_SSL = YesPlease
 	NO_LIBGEN_H = YesPlease
@@ -471,7 +484,6 @@
 	NO_SYMLINK_HEAD = YesPlease
 	NO_UNIX_SOCKETS = YesPlease
 	NO_SETENV = YesPlease
-	NO_UNSETENV = YesPlease
 	NO_STRCASESTR = YesPlease
 	NO_STRLCPY = YesPlease
 	NO_MEMMEM = YesPlease
@@ -496,6 +508,7 @@
 	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 b711254..6af9647 100644
--- a/configure.ac
+++ b/configure.ac
@@ -272,6 +272,14 @@
 	GIT_CONF_SUBST([LIBPCREDIR])
     fi)
 #
+# Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header.
+AC_FUNC_ALLOCA
+case $ac_cv_working_alloca_h in
+    yes)    HAVE_ALLOCA_H=YesPlease;;
+    *)      HAVE_ALLOCA_H='';;
+esac
+GIT_CONF_SUBST([HAVE_ALLOCA_H])
+#
 # Define NO_CURL if you do not have curl installed.  git-http-pull and
 # git-http-push are not built, and you cannot use http:// and https://
 # transports.
@@ -738,6 +746,14 @@
 esac
 GIT_CONF_SUBST([SOCKLEN_T])
 
+#
+# Define NO_STRUCT_ITIMERVAL if you don't have struct itimerval.
+AC_CHECK_TYPES([struct itimerval],
+[NO_STRUCT_ITIMERVAL=],
+[NO_STRUCT_ITIMERVAL=UnfortunatelyYes],
+[#include <sys/time.h>])
+GIT_CONF_SUBST([NO_STRUCT_ITIMERVAL])
+#
 # 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=],
@@ -895,6 +911,12 @@
                      [CHARSET_LIB=-lcharset])])
 GIT_CONF_SUBST([CHARSET_LIB])
 #
+# Define NO_SETITIMER if you don't have setitimer.
+GIT_CHECK_FUNC(setitimer,
+[NO_SETITIMER=],
+[NO_SETITIMER=YesPlease])
+GIT_CONF_SUBST([NO_SETITIMER])
+#
 # Define NO_STRCASESTR if you don't have strcasestr.
 GIT_CHECK_FUNC(strcasestr,
 [NO_STRCASESTR=],
diff --git a/connect.c b/connect.c
index ebc3a5b..d47d0ec 100644
--- a/connect.c
+++ b/connect.c
@@ -13,28 +13,24 @@
 static char *server_capabilities;
 static const char *parse_feature_value(const char *, const char *, int *);
 
-static int check_ref(const char *name, int len, unsigned int flags)
+static int check_ref(const char *name, unsigned int flags)
 {
 	if (!flags)
 		return 1;
 
-	if (len < 5 || memcmp(name, "refs/", 5))
+	if (!skip_prefix(name, "refs/", &name))
 		return 0;
 
-	/* Skip the "refs/" part */
-	name += 5;
-	len -= 5;
-
 	/* REF_NORMAL means that we don't want the magic fake tag refs */
 	if ((flags & REF_NORMAL) && check_refname_format(name, 0))
 		return 0;
 
 	/* REF_HEADS means that we want regular branch heads */
-	if ((flags & REF_HEADS) && !memcmp(name, "heads/", 6))
+	if ((flags & REF_HEADS) && starts_with(name, "heads/"))
 		return 1;
 
 	/* REF_TAGS means that we want tags */
-	if ((flags & REF_TAGS) && !memcmp(name, "tags/", 5))
+	if ((flags & REF_TAGS) && starts_with(name, "tags/"))
 		return 1;
 
 	/* All type bits clear means that we are ok with anything */
@@ -43,7 +39,7 @@
 
 int check_ref_type(const struct ref *ref, int flags)
 {
-	return check_ref(ref->name, strlen(ref->name), flags);
+	return check_ref(ref->name, flags);
 }
 
 static void die_initial_contact(int got_at_least_one_head)
@@ -127,6 +123,7 @@
 		char *name;
 		int len, name_len;
 		char *buffer = packet_buffer;
+		const char *arg;
 
 		len = packet_read(in, &src_buf, &src_len,
 				  packet_buffer, sizeof(packet_buffer),
@@ -138,12 +135,12 @@
 		if (!len)
 			break;
 
-		if (len > 4 && starts_with(buffer, "ERR "))
-			die("remote error: %s", buffer + 4);
+		if (len > 4 && skip_prefix(buffer, "ERR ", &arg))
+			die("remote error: %s", arg);
 
-		if (len == 48 && starts_with(buffer, "shallow ")) {
-			if (get_sha1_hex(buffer + 8, old_sha1))
-				die("protocol error: expected shallow sha-1, got '%s'", buffer + 8);
+		if (len == 48 && skip_prefix(buffer, "shallow ", &arg)) {
+			if (get_sha1_hex(arg, old_sha1))
+				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);
@@ -166,7 +163,7 @@
 			continue;
 		}
 
-		if (!check_ref(name, name_len, flags))
+		if (!check_ref(name, flags))
 			continue;
 		ref = alloc_ref(buffer + 41);
 		hashcpy(ref->old_sha1, old_sha1);
@@ -532,22 +529,19 @@
 static struct child_process *git_proxy_connect(int fd[2], char *host)
 {
 	const char *port = STR(DEFAULT_GIT_PORT);
-	const char **argv;
 	struct child_process *proxy;
 
 	get_host_and_port(&host, &port);
 
-	argv = xmalloc(sizeof(*argv) * 4);
-	argv[0] = git_proxy_command;
-	argv[1] = host;
-	argv[2] = port;
-	argv[3] = NULL;
-	proxy = xcalloc(1, sizeof(*proxy));
-	proxy->argv = argv;
+	proxy = xmalloc(sizeof(*proxy));
+	child_process_init(proxy);
+	argv_array_push(&proxy->args, git_proxy_command);
+	argv_array_push(&proxy->args, host);
+	argv_array_push(&proxy->args, port);
 	proxy->in = -1;
 	proxy->out = -1;
 	if (start_command(proxy))
-		die("cannot start proxy %s", argv[0]);
+		die("cannot start proxy %s", git_proxy_command);
 	fd[0] = proxy->out; /* read from proxy stdout */
 	fd[1] = proxy->in;  /* write to proxy stdin */
 	return proxy;
@@ -642,7 +636,7 @@
 	return protocol;
 }
 
-static struct child_process no_fork;
+static struct child_process no_fork = CHILD_PROCESS_INIT;
 
 /*
  * This returns a dummy child_process if the transport protocol does not
@@ -661,7 +655,6 @@
 	char *hostandport, *path;
 	struct child_process *conn = &no_fork;
 	enum protocol protocol;
-	const char **arg;
 	struct strbuf cmd = STRBUF_INIT;
 
 	/* Without this we cannot rely on waitpid() to tell
@@ -698,14 +691,14 @@
 			     target_host, 0);
 		free(target_host);
 	} else {
-		conn = xcalloc(1, sizeof(*conn));
+		conn = xmalloc(sizeof(*conn));
+		child_process_init(conn);
 
 		strbuf_addstr(&cmd, prog);
 		strbuf_addch(&cmd, ' ');
 		sq_quote_buf(&cmd, path);
 
 		conn->in = conn->out = -1;
-		conn->argv = arg = xcalloc(7, sizeof(*arg));
 		if (protocol == PROTO_SSH) {
 			const char *ssh = getenv("GIT_SSH");
 			int putty = ssh && strcasestr(ssh, "plink");
@@ -716,22 +709,21 @@
 
 			if (!ssh) ssh = "ssh";
 
-			*arg++ = ssh;
+			argv_array_push(&conn->args, ssh);
 			if (putty && !strcasestr(ssh, "tortoiseplink"))
-				*arg++ = "-batch";
+				argv_array_push(&conn->args, "-batch");
 			if (port) {
 				/* P is for PuTTY, p is for OpenSSH */
-				*arg++ = putty ? "-P" : "-p";
-				*arg++ = port;
+				argv_array_push(&conn->args, putty ? "-P" : "-p");
+				argv_array_push(&conn->args, port);
 			}
-			*arg++ = ssh_host;
+			argv_array_push(&conn->args, ssh_host);
 		} else {
 			/* remove repo-local variables from the environment */
 			conn->env = local_repo_env;
 			conn->use_shell = 1;
 		}
-		*arg++ = cmd.buf;
-		*arg = NULL;
+		argv_array_push(&conn->args, cmd.buf);
 
 		if (start_command(conn))
 			die("unable to fork");
@@ -757,7 +749,6 @@
 		return 0;
 
 	code = finish_command(conn);
-	free(conn->argv);
 	free(conn);
 	return code;
 }
diff --git a/connected.c b/connected.c
index be0253e..299c560 100644
--- a/connected.c
+++ b/connected.c
@@ -25,12 +25,13 @@
 					   struct transport *transport,
 					   const char *shallow_file)
 {
-	struct child_process rev_list;
+	struct child_process rev_list = CHILD_PROCESS_INIT;
 	const char *argv[9];
 	char commit[41];
 	unsigned char sha1[20];
 	int err = 0, ac = 0;
 	struct packed_git *new_pack = NULL;
+	size_t base_len;
 
 	if (fn(cb_data, sha1))
 		return err;
@@ -38,10 +39,9 @@
 	if (transport && transport->smart_options &&
 	    transport->smart_options->self_contained_and_connected &&
 	    transport->pack_lockfile &&
-	    ends_with(transport->pack_lockfile, ".keep")) {
+	    strip_suffix(transport->pack_lockfile, ".keep", &base_len)) {
 		struct strbuf idx_file = STRBUF_INIT;
-		strbuf_addstr(&idx_file, transport->pack_lockfile);
-		strbuf_setlen(&idx_file, idx_file.len - 5); /* ".keep" */
+		strbuf_add(&idx_file, transport->pack_lockfile, base_len);
 		strbuf_addstr(&idx_file, ".idx");
 		new_pack = add_packed_git(idx_file.buf, idx_file.len, 1);
 		strbuf_release(&idx_file);
@@ -60,7 +60,6 @@
 		argv[ac++] = "--quiet";
 	argv[ac] = NULL;
 
-	memset(&rev_list, 0, sizeof(rev_list));
 	rev_list.argv = argv;
 	rev_list.git_cmd = 1;
 	rev_list.in = -1;
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 019026e..2fece98 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -21,6 +21,12 @@
 #        source ~/.git-completion.sh
 #    3) Consider changing your PS1 to also show the current branch,
 #       see git-prompt.sh for details.
+#
+# If you use complex aliases of form '!f() { ... }; f', you can use the null
+# command ':' as the first command in the function body to declare the desired
+# completion style.  For example '!f() { : git commit ; ... }; f' will
+# tell the completion to use commit completion.  This also works with aliases
+# of form "!sh -c '...'".  For example, "!sh -c ': git commit ; ... '".
 
 case "$COMP_WORDBREAKS" in
 *:*) : great ;;
@@ -275,16 +281,12 @@
 # argument, and using the options specified in the second argument.
 __git_ls_files_helper ()
 {
-	(
-		test -n "${CDPATH+set}" && unset CDPATH
-		cd "$1"
-		if [ "$2" == "--committable" ]; then
-			git diff-index --name-only --relative HEAD
-		else
-			# NOTE: $2 is not quoted in order to support multiple options
-			git ls-files --exclude-standard $2
-		fi
-	) 2>/dev/null
+	if [ "$2" == "--committable" ]; then
+		git -C "$1" diff-index --name-only --relative HEAD
+	else
+		# NOTE: $2 is not quoted in order to support multiple options
+		git -C "$1" ls-files --exclude-standard $2
+	fi 2>/dev/null
 }
 
 
@@ -382,7 +384,8 @@
 		;;
 	*)
 		echo "HEAD"
-		git for-each-ref --format="%(refname:short)" -- "refs/remotes/$dir/" | sed -e "s#^$dir/##"
+		git for-each-ref --format="%(refname:short)" -- \
+			"refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##"
 		;;
 	esac
 }
@@ -516,7 +519,7 @@
 		;;
 	esac
 
-	__gitcomp_file "$(__git_index_files "$1" "$pfx")" "$pfx" "$cur_"
+	__gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
 }
 
 __git_complete_file ()
@@ -781,6 +784,10 @@
 		-*)	: option ;;
 		*=*)	: setting env ;;
 		git)	: git itself ;;
+		\(\))   : skip parens of shell function definition ;;
+		{)	: skip start of shell helper function ;;
+		:)	: skip null command ;;
+		\'*)	: skip opening quote after sh -c ;;
 		*)
 			echo "$word"
 			return
@@ -1165,8 +1172,8 @@
 			--full-index --binary --abbrev --diff-filter=
 			--find-copies-harder
 			--text --ignore-space-at-eol --ignore-space-change
-			--ignore-all-space --exit-code --quiet --ext-diff
-			--no-ext-diff
+			--ignore-all-space --ignore-blank-lines --exit-code
+			--quiet --ext-diff --no-ext-diff
 			--no-prefix --src-prefix= --dst-prefix=
 			--inter-hunk-context=
 			--patience --histogram --minimal
@@ -1197,7 +1204,7 @@
 }
 
 __git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
-			tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
+			tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
 "
 
 _git_difftool ()
@@ -1457,6 +1464,7 @@
 			--abbrev-commit --abbrev=
 			--relative-date --date=
 			--pretty= --format= --oneline
+			--show-signature
 			--cherry-pick
 			--graph
 			--decorate --decorate=
@@ -1611,12 +1619,33 @@
 
 __git_push_recurse_submodules="check on-demand"
 
+__git_complete_force_with_lease ()
+{
+	local cur_=$1
+
+	case "$cur_" in
+	--*=)
+		;;
+	*:*)
+		__gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
+		;;
+	*)
+		__gitcomp_nl "$(__git_refs)" "" "$cur_"
+		;;
+	esac
+}
+
 _git_push ()
 {
 	case "$prev" in
 	--repo)
 		__gitcomp_nl "$(__git_remotes)"
 		return
+		;;
+	--recurse-submodules)
+		__gitcomp "$__git_push_recurse_submodules"
+		return
+		;;
 	esac
 	case "$cur" in
 	--repo=*)
@@ -1627,11 +1656,16 @@
 		__gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
 		return
 		;;
+	--force-with-lease=*)
+		__git_complete_force_with_lease "${cur##--force-with-lease=}"
+		return
+		;;
 	--*)
 		__gitcomp "
 			--all --mirror --tags --dry-run --force --verbose
+			--quiet --prune --delete --follow-tags
 			--receive-pack= --repo= --set-upstream
-			--recurse-submodules=
+			--force-with-lease --force-with-lease= --recurse-submodules=
 		"
 		return
 		;;
@@ -2308,6 +2342,7 @@
 		;;
 	--*)
 		__gitcomp "--pretty= --format= --abbrev-commit --oneline
+			--show-signature
 			$__git_diff_common_options
 			"
 		return
diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh
index 9d684b1..c5473dc 100644
--- a/contrib/completion/git-prompt.sh
+++ b/contrib/completion/git-prompt.sh
@@ -468,7 +468,8 @@
 			fi
 		fi
 		if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &&
-		   [ -r "$g/refs/stash" ]; then
+		   git rev-parse --verify --quiet refs/stash >/dev/null
+		then
 			s="$"
 		fi
 
diff --git a/contrib/contacts/.gitignore b/contrib/contacts/.gitignore
new file mode 100644
index 0000000..f385ee6
--- /dev/null
+++ b/contrib/contacts/.gitignore
@@ -0,0 +1,3 @@
+git-contacts.1
+git-contacts.html
+git-contacts.xml
diff --git a/contrib/contacts/Makefile b/contrib/contacts/Makefile
new file mode 100644
index 0000000..a2990f0
--- /dev/null
+++ b/contrib/contacts/Makefile
@@ -0,0 +1,71 @@
+# The default target of this Makefile is...
+all::
+
+-include ../../config.mak.autogen
+-include ../../config.mak
+
+prefix ?= /usr/local
+gitexecdir ?= $(prefix)/libexec/git-core
+mandir ?= $(prefix)/share/man
+man1dir ?= $(mandir)/man1
+htmldir ?= $(prefix)/share/doc/git-doc
+
+../../GIT-VERSION-FILE: FORCE
+	$(MAKE) -C ../../ GIT-VERSION-FILE
+
+-include ../../GIT-VERSION-FILE
+
+# this should be set to a 'standard' bsd-type install program
+INSTALL  ?= install
+RM       ?= rm -f
+
+ASCIIDOC = asciidoc
+XMLTO    = xmlto
+
+ifndef SHELL_PATH
+	SHELL_PATH = /bin/sh
+endif
+SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
+
+ASCIIDOC_CONF = ../../Documentation/asciidoc.conf
+MANPAGE_XSL   = ../../Documentation/manpage-normal.xsl
+
+GIT_CONTACTS := git-contacts
+
+GIT_CONTACTS_DOC := git-contacts.1
+GIT_CONTACTS_XML := git-contacts.xml
+GIT_CONTACTS_TXT := git-contacts.txt
+GIT_CONTACTS_HTML := git-contacts.html
+
+doc: $(GIT_CONTACTS_DOC) $(GIT_CONTACTS_HTML)
+
+install: $(GIT_CONTACTS)
+	$(INSTALL) -d -m 755 $(DESTDIR)$(gitexecdir)
+	$(INSTALL) -m 755 $(GIT_CONTACTS) $(DESTDIR)$(gitexecdir)
+
+install-doc: install-man install-html
+
+install-man: $(GIT_CONTACTS_DOC)
+	$(INSTALL) -d -m 755 $(DESTDIR)$(man1dir)
+	$(INSTALL) -m 644 $^ $(DESTDIR)$(man1dir)
+
+install-html: $(GIT_CONTACTS_HTML)
+	$(INSTALL) -d -m 755 $(DESTDIR)$(htmldir)
+	$(INSTALL) -m 644 $^ $(DESTDIR)$(htmldir)
+
+$(GIT_CONTACTS_DOC): $(GIT_CONTACTS_XML)
+	$(XMLTO) -m $(MANPAGE_XSL) man $^
+
+$(GIT_CONTACTS_XML): $(GIT_CONTACTS_TXT)
+	$(ASCIIDOC) -b docbook -d manpage -f $(ASCIIDOC_CONF) \
+		-agit_version=$(GIT_VERSION) $^
+
+$(GIT_CONTACTS_HTML): $(GIT_CONTACTS_TXT)
+	$(ASCIIDOC) -b xhtml11 -d manpage -f $(ASCIIDOC_CONF) \
+		-agit_version=$(GIT_VERSION) $^
+
+clean:
+	$(RM) $(GIT_CONTACTS)
+	$(RM) *.xml *.html *.1
+
+.PHONY: FORCE
diff --git a/contrib/convert-grafts-to-replace-refs.sh b/contrib/convert-grafts-to-replace-refs.sh
new file mode 100755
index 0000000..0cbc917
--- /dev/null
+++ b/contrib/convert-grafts-to-replace-refs.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+# You should execute this script in the repository where you
+# want to convert grafts to replace refs.
+
+GRAFTS_FILE="${GIT_DIR:-.git}/info/grafts"
+
+. $(git --exec-path)/git-sh-setup
+
+test -f "$GRAFTS_FILE" || die "Could not find graft file: '$GRAFTS_FILE'"
+
+grep '^[^# ]' "$GRAFTS_FILE" |
+while read definition
+do
+	if test -n "$definition"
+	then
+		echo "Converting: $definition"
+		git replace --graft $definition ||
+			die "Conversion failed for: $definition"
+	fi
+done
+
+mv "$GRAFTS_FILE" "$GRAFTS_FILE.bak" ||
+	die "Could not rename '$GRAFTS_FILE' to '$GRAFTS_FILE.bak'"
+
+echo "Success!"
+echo "All the grafts in '$GRAFTS_FILE' have been converted to replace refs!"
+echo "The grafts file '$GRAFTS_FILE' has been renamed: '$GRAFTS_FILE.bak'"
diff --git a/contrib/convert-objects/git-convert-objects.txt b/contrib/convert-objects/git-convert-objects.txt
index 0565d83..f871880 100644
--- a/contrib/convert-objects/git-convert-objects.txt
+++ b/contrib/convert-objects/git-convert-objects.txt
@@ -26,4 +26,4 @@
 
 GIT
 ---
-Part of the gitlink:git[7] suite
+Part of the linkgit:git[7] suite
diff --git a/contrib/credential/wincred/Makefile b/contrib/credential/wincred/Makefile
index bad45ca..6e992c0 100644
--- a/contrib/credential/wincred/Makefile
+++ b/contrib/credential/wincred/Makefile
@@ -1,14 +1,22 @@
 all: git-credential-wincred.exe
 
-CC = gcc
-RM = rm -f
-CFLAGS = -O2 -Wall
-
 -include ../../../config.mak.autogen
 -include ../../../config.mak
 
+CC ?= gcc
+RM ?= rm -f
+CFLAGS ?= -O2 -Wall
+
+prefix ?= /usr/local
+libexecdir ?= $(prefix)/libexec/git-core
+
+INSTALL ?= install
+
 git-credential-wincred.exe : git-credential-wincred.c
 	$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
 
+install: git-credential-wincred.exe
+	$(INSTALL) -m 755 $^ $(libexecdir)
+
 clean:
 	$(RM) git-credential-wincred.exe
diff --git a/contrib/diff-highlight/diff-highlight b/contrib/diff-highlight/diff-highlight
index c4404d4..69a652e 100755
--- a/contrib/diff-highlight/diff-highlight
+++ b/contrib/diff-highlight/diff-highlight
@@ -14,6 +14,10 @@
 my @added;
 my $in_hunk;
 
+# Some scripts may not realize that SIGPIPE is being ignored when launching the
+# pager--for instance scripts written in Python.
+$SIG{PIPE} = 'DEFAULT';
+
 while (<>) {
 	if (!$in_hunk) {
 		print;
diff --git a/contrib/diffall/README b/contrib/diffall/README
deleted file mode 100644
index 507f17d..0000000
--- a/contrib/diffall/README
+++ /dev/null
@@ -1,31 +0,0 @@
-The git-diffall script provides a directory based diff mechanism
-for git.
-
-To determine what diff viewer is used, the script requires either
-the 'diff.tool' or 'merge.tool' configuration option to be set.
-
-This script is compatible with most common forms used to specify a
-range of revisions to diff:
-
-  1. git diffall: shows diff between working tree and staged changes
-  2. git diffall --cached [<commit>]: shows diff between staged
-     changes and HEAD (or other named commit)
-  3. git diffall <commit>: shows diff between working tree and named
-     commit
-  4. git diffall <commit> <commit>: show diff between two named commits
-  5. git diffall <commit>..<commit>: same as above
-  6. git diffall <commit>...<commit>: show the changes on the branch
-     containing and up to the second, starting at a common ancestor
-     of both <commit>
-
-Note: all forms take an optional path limiter [-- <path>*]
-
-The '--extcmd=<command>' option allows the user to specify a custom
-command for viewing diffs.  When given, configured defaults are
-ignored and the script runs $command $LOCAL $REMOTE.  Additionally,
-$BASE is set in the environment.
-
-This script is based on an example provided by Thomas Rast on the
-Git list [1]:
-
-[1] http://thread.gmane.org/gmane.comp.version-control.git/124807
diff --git a/contrib/diffall/git-diffall b/contrib/diffall/git-diffall
deleted file mode 100755
index 84f2b65..0000000
--- a/contrib/diffall/git-diffall
+++ /dev/null
@@ -1,257 +0,0 @@
-#!/bin/sh
-# Copyright 2010 - 2012, Tim Henigan <tim.henigan@gmail.com>
-#
-# Perform a directory diff between commits in the repository using
-# the external diff or merge tool specified in the user's config.
-
-USAGE='[--cached] [--copy-back] [-x|--extcmd=<command>] <commit>{0,2} [-- <path>*]
-
-    --cached     Compare to the index rather than the working tree.
-
-    --copy-back  Copy files back to the working tree when the diff
-                 tool exits (in case they were modified by the
-                 user).  This option is only valid if the diff
-                 compared with the working tree.
-
-    -x=<command>
-    --extcmd=<command>  Specify a custom command for viewing diffs.
-                 git-diffall ignores the configured defaults and
-                 runs $command $LOCAL $REMOTE when this option is
-                 specified. Additionally, $BASE is set in the
-                 environment.
-'
-
-SUBDIRECTORY_OK=1
-. "$(git --exec-path)/git-sh-setup"
-
-TOOL_MODE=diff
-. "$(git --exec-path)/git-mergetool--lib"
-
-merge_tool="$(get_merge_tool)"
-if test -z "$merge_tool"
-then
-	echo "Error: Either the 'diff.tool' or 'merge.tool' option must be set."
-	usage
-fi
-
-start_dir=$(pwd)
-
-# All the file paths returned by the diff command are relative to the root
-# of the working copy. So if the script is called from a subdirectory, it
-# must switch to the root of working copy before trying to use those paths.
-cdup=$(git rev-parse --show-cdup) &&
-cd "$cdup" || {
-	echo >&2 "Cannot chdir to $cdup, the toplevel of the working tree"
-	exit 1
-}
-
-# set up temp dir
-tmp=$(perl -e 'use File::Temp qw(tempdir);
-	$t=tempdir("/tmp/git-diffall.XXXXX") or exit(1);
-	print $t') || exit 1
-trap 'rm -rf "$tmp"' EXIT
-
-left=
-right=
-paths=
-dashdash_seen=
-compare_staged=
-merge_base=
-left_dir=
-right_dir=
-diff_tool=
-copy_back=
-
-while test $# != 0
-do
-	case "$1" in
-	-h|--h|--he|--hel|--help)
-		usage
-		;;
-	--cached)
-		compare_staged=1
-		;;
-	--copy-back)
-		copy_back=1
-		;;
-	-x|--e|--ex|--ext|--extc|--extcm|--extcmd)
-		if test $# = 1
-		then
-			echo You must specify the tool for use with --extcmd
-			usage
-		else
-			diff_tool=$2
-			shift
-		fi
-		;;
-	--)
-		dashdash_seen=1
-		;;
-	-*)
-		echo Invalid option: "$1"
-		usage
-		;;
-	*)
-		# could be commit, commit range or path limiter
-		case "$1" in
-		*...*)
-			left=${1%...*}
-			right=${1#*...}
-			merge_base=1
-			;;
-		*..*)
-			left=${1%..*}
-			right=${1#*..}
-			;;
-		*)
-			if test -n "$dashdash_seen"
-			then
-				paths="$paths$1 "
-			elif test -z "$left"
-			then
-				left=$1
-			elif test -z "$right"
-			then
-				right=$1
-			else
-				paths="$paths$1 "
-			fi
-			;;
-		esac
-		;;
-	esac
-	shift
-done
-
-# Determine the set of files which changed
-if test -n "$left" && test -n "$right"
-then
-	left_dir="cmt-$(git rev-parse --short $left)"
-	right_dir="cmt-$(git rev-parse --short $right)"
-
-	if test -n "$compare_staged"
-	then
-		usage
-	elif test -n "$merge_base"
-	then
-		git diff --name-only "$left"..."$right" -- $paths >"$tmp/filelist"
-	else
-		git diff --name-only "$left" "$right" -- $paths >"$tmp/filelist"
-	fi
-elif test -n "$left"
-then
-	left_dir="cmt-$(git rev-parse --short $left)"
-
-	if test -n "$compare_staged"
-	then
-		right_dir="staged"
-		git diff --name-only --cached "$left" -- $paths >"$tmp/filelist"
-	else
-		right_dir="working_tree"
-		git diff --name-only "$left" -- $paths >"$tmp/filelist"
-	fi
-else
-	left_dir="HEAD"
-
-	if test -n "$compare_staged"
-	then
-		right_dir="staged"
-		git diff --name-only --cached -- $paths >"$tmp/filelist"
-	else
-		right_dir="working_tree"
-		git diff --name-only -- $paths >"$tmp/filelist"
-	fi
-fi
-
-# Exit immediately if there are no diffs
-if test ! -s "$tmp/filelist"
-then
-	exit 0
-fi
-
-if test -n "$copy_back" && test "$right_dir" != "working_tree"
-then
-	echo "--copy-back is only valid when diff includes the working tree."
-	exit 1
-fi
-
-# Create the named tmp directories that will hold the files to be compared
-mkdir -p "$tmp/$left_dir" "$tmp/$right_dir"
-
-# Populate the tmp/right_dir directory with the files to be compared
-while read name
-do
-	if test -n "$right"
-	then
-		ls_list=$(git ls-tree $right "$name")
-		if test -n "$ls_list"
-		then
-			mkdir -p "$tmp/$right_dir/$(dirname "$name")"
-			git show "$right":"$name" >"$tmp/$right_dir/$name" || true
-		fi
-	elif test -n "$compare_staged"
-	then
-		ls_list=$(git ls-files -- "$name")
-		if test -n "$ls_list"
-		then
-			mkdir -p "$tmp/$right_dir/$(dirname "$name")"
-			git show :"$name" >"$tmp/$right_dir/$name"
-		fi
-	else
-		if test -e "$name"
-		then
-			mkdir -p "$tmp/$right_dir/$(dirname "$name")"
-			cp "$name" "$tmp/$right_dir/$name"
-		fi
-	fi
-done < "$tmp/filelist"
-
-# Populate the tmp/left_dir directory with the files to be compared
-while read name
-do
-	if test -n "$left"
-	then
-		ls_list=$(git ls-tree $left "$name")
-		if test -n "$ls_list"
-		then
-			mkdir -p "$tmp/$left_dir/$(dirname "$name")"
-			git show "$left":"$name" >"$tmp/$left_dir/$name" || true
-		fi
-	else
-		if test -n "$compare_staged"
-		then
-			ls_list=$(git ls-tree HEAD "$name")
-			if test -n "$ls_list"
-			then
-				mkdir -p "$tmp/$left_dir/$(dirname "$name")"
-				git show HEAD:"$name" >"$tmp/$left_dir/$name"
-			fi
-		else
-			mkdir -p "$tmp/$left_dir/$(dirname "$name")"
-			git show :"$name" >"$tmp/$left_dir/$name"
-		fi
-	fi
-done < "$tmp/filelist"
-
-LOCAL="$tmp/$left_dir"
-REMOTE="$tmp/$right_dir"
-
-if test -n "$diff_tool"
-then
-	export BASE
-	eval $diff_tool '"$LOCAL"' '"$REMOTE"'
-else
-	run_merge_tool "$merge_tool" false
-fi
-
-# Copy files back to the working dir, if requested
-if test -n "$copy_back" && test "$right_dir" = "working_tree"
-then
-	cd "$start_dir"
-	git_top_dir=$(git rev-parse --show-toplevel)
-	find "$tmp/$right_dir" -type f |
-	while read file
-	do
-		cp "$file" "$git_top_dir/${file#$tmp/$right_dir/}"
-	done
-fi
diff --git a/contrib/examples/builtin-fetch--tool.c b/contrib/examples/builtin-fetch--tool.c
index 8bc8c75..ee19166 100644
--- a/contrib/examples/builtin-fetch--tool.c
+++ b/contrib/examples/builtin-fetch--tool.c
@@ -31,7 +31,8 @@
 		rla = "(reflog update)";
 	if (snprintf(msg, sizeof(msg), "%s: %s", rla, action) >= sizeof(msg))
 		warning("reflog message too long: %.*s...", 50, msg);
-	return update_ref(msg, refname, sha1, oldval, 0, QUIET_ON_ERR);
+	return update_ref(msg, refname, sha1, oldval, 0,
+			  UPDATE_REFS_QUIET_ON_ERR);
 }
 
 static int update_local_ref(const char *name,
diff --git a/contrib/examples/git-clone.sh b/contrib/examples/git-clone.sh
index b4c9376..08cf246 100755
--- a/contrib/examples/git-clone.sh
+++ b/contrib/examples/git-clone.sh
@@ -516,7 +516,7 @@
 
 	case "$no_checkout" in
 	'')
-		test "z$quiet" = z -a "z$no_progress" = z && v=-v || v=
+		test "z$quiet" = z && test "z$no_progress" = z && v=-v || v=
 		git read-tree -m -u $v HEAD HEAD
 	esac
 fi
diff --git a/contrib/examples/git-commit.sh b/contrib/examples/git-commit.sh
index 5cafe2e..934505b 100755
--- a/contrib/examples/git-commit.sh
+++ b/contrib/examples/git-commit.sh
@@ -51,7 +51,7 @@
 		export GIT_INDEX_FILE
 	fi
 
-	if test "$status_only" = "t" -o "$use_status_color" = "t"; then
+	if test "$status_only" = "t" || test "$use_status_color" = "t"; then
 		color=
 	else
 		color=--nocolor
@@ -296,7 +296,7 @@
 	die "No paths with -i does not make sense." ;;
 esac
 
-if test ! -z "$templatefile" -a -z "$log_given"
+if test ! -z "$templatefile" && test -z "$log_given"
 then
 	if test ! -f "$templatefile"
 	then
diff --git a/contrib/examples/git-merge.sh b/contrib/examples/git-merge.sh
index 7e40f40..52f2aaf 100755
--- a/contrib/examples/git-merge.sh
+++ b/contrib/examples/git-merge.sh
@@ -161,7 +161,7 @@
 			return
 		fi
 	fi
-	if test "$remote" = "FETCH_HEAD" -a -r "$GIT_DIR/FETCH_HEAD"
+	if test "$remote" = "FETCH_HEAD" && test -r "$GIT_DIR/FETCH_HEAD"
 	then
 		sed -e 's/	not-for-merge	/		/' -e 1q \
 			"$GIT_DIR/FETCH_HEAD"
@@ -527,7 +527,7 @@
 		git diff-files --name-only
 		git ls-files --unmerged
 	    } | wc -l`
-	    if test $best_cnt -le 0 -o $cnt -le $best_cnt
+	    if test $best_cnt -le 0 || test $cnt -le $best_cnt
 	    then
 		best_strategy=$strategy
 		best_cnt=$cnt
diff --git a/contrib/examples/git-repack.sh b/contrib/examples/git-repack.sh
index f312405..96e3fed 100755
--- a/contrib/examples/git-repack.sh
+++ b/contrib/examples/git-repack.sh
@@ -76,8 +76,8 @@
 				existing="$existing $e"
 			fi
 		done
-		if test -n "$existing" -a -n "$unpack_unreachable" -a \
-			-n "$remove_redundant"
+		if test -n "$existing" && test -n "$unpack_unreachable" && \
+			test -n "$remove_redundant"
 		then
 			# This may have arbitrary user arguments, so we
 			# have to protect it against whitespace splitting
diff --git a/contrib/examples/git-resolve.sh b/contrib/examples/git-resolve.sh
index 48d0fc9..70fdc27 100755
--- a/contrib/examples/git-resolve.sh
+++ b/contrib/examples/git-resolve.sh
@@ -76,7 +76,7 @@
 			2>/dev/null || continue
 		# Count the paths that are unmerged.
 		cnt=$(GIT_INDEX_FILE=$G git ls-files --unmerged | wc -l)
-		if test $best_cnt -le 0 -o $cnt -le $best_cnt
+		if test $best_cnt -le 0 || test $cnt -le $best_cnt
 		then
 			best=$c
 			best_cnt=$cnt
diff --git a/contrib/examples/git-svnimport.txt b/contrib/examples/git-svnimport.txt
index 3bb871e..3f0a9c3 100644
--- a/contrib/examples/git-svnimport.txt
+++ b/contrib/examples/git-svnimport.txt
@@ -176,4 +176,4 @@
 
 GIT
 ---
-Part of the gitlink:git[7] suite
+Part of the linkgit:git[7] suite
diff --git a/contrib/gitview/gitview.txt b/contrib/gitview/gitview.txt
index 9e12f97..7b5f900 100644
--- a/contrib/gitview/gitview.txt
+++ b/contrib/gitview/gitview.txt
@@ -28,7 +28,7 @@
 
 <args>::
 
-	All the valid option for gitlink:git-rev-list[1].
+	All the valid option for linkgit:git-rev-list[1].
 
 Key Bindings
 ------------
diff --git a/contrib/mw-to-git/git-remote-mediawiki.perl b/contrib/mw-to-git/git-remote-mediawiki.perl
index 3f8d993..8dd74a9 100755
--- a/contrib/mw-to-git/git-remote-mediawiki.perl
+++ b/contrib/mw-to-git/git-remote-mediawiki.perl
@@ -461,7 +461,12 @@
 
 	my $response = $mediawiki->{ua}->get($download_url);
 	if ($response->code == HTTP_CODE_OK) {
-		return $response->decoded_content;
+		# It is tempting to return
+		# $response->decoded_content({charset => "none"}), but
+		# when doing so, utf8::downgrade($content) fails with
+		# "Wide character in subroutine entry".
+		$response->decode();
+		return $response->content();
 	} else {
 		print {*STDERR} "Error downloading mediafile from :\n";
 		print {*STDERR} "URL: ${download_url}\n";
diff --git a/contrib/mw-to-git/t/install-wiki.sh b/contrib/mw-to-git/t/install-wiki.sh
index 70a53f6..c215213 100755
--- a/contrib/mw-to-git/t/install-wiki.sh
+++ b/contrib/mw-to-git/t/install-wiki.sh
@@ -20,6 +20,8 @@
 	echo "		install | -i :	Install a wiki on your computer."
 	echo "		delete | -d : Delete the wiki and all its pages and "
 	echo "			content."
+	echo "		start  | -s : Start the previously configured lighttpd daemon"
+	echo "		stop        : Stop lighttpd daemon."
 }
 
 
@@ -33,6 +35,14 @@
 		wiki_delete
 		exit 0
 		;;
+	"start" | "-s")
+		start_lighttpd
+		exit
+		;;
+	"stop")
+		stop_lighttpd
+		exit
+		;;
 	"--help" | "-h")
 		usage
 		exit 0
diff --git a/contrib/mw-to-git/t/t9363-mw-to-git-export-import.sh b/contrib/mw-to-git/t/t9363-mw-to-git-export-import.sh
index 5a03739..3ff3a09 100755
--- a/contrib/mw-to-git/t/t9363-mw-to-git-export-import.sh
+++ b/contrib/mw-to-git/t/t9363-mw-to-git-export-import.sh
@@ -58,6 +58,25 @@
 	test_cmp mw_dir_clone/Foo.txt mw_dir/Foo.txt
 '
 
+test_expect_success 'git push can upload media (File:) files containing valid UTF-8' '
+	wiki_reset &&
+	git clone mediawiki::'"$WIKI_URL"' mw_dir &&
+	(
+		cd mw_dir &&
+		"$PERL_PATH" -e "print STDOUT \"UTF-8 content: éèàéê€.\";" >Bar.txt &&
+		git add Bar.txt &&
+		git commit -m "add a text file with UTF-8 content" &&
+		git push
+	)
+'
+
+test_expect_success 'git clone works on previously created wiki with media files containing valid UTF-8' '
+	test_when_finished "rm -rf mw_dir mw_dir_clone" &&
+	git clone -c remote.origin.mediaimport=true \
+		mediawiki::'"$WIKI_URL"' mw_dir_clone &&
+	test_cmp mw_dir_clone/Bar.txt mw_dir/Bar.txt
+'
+
 test_expect_success 'git push & pull work with locally renamed media files' '
 	wiki_reset &&
 	git clone mediawiki::'"$WIKI_URL"' mw_dir &&
diff --git a/contrib/mw-to-git/t/t9365-continuing-queries.sh b/contrib/mw-to-git/t/t9365-continuing-queries.sh
index 27e267f..0164547 100755
--- a/contrib/mw-to-git/t/t9365-continuing-queries.sh
+++ b/contrib/mw-to-git/t/t9365-continuing-queries.sh
@@ -9,7 +9,7 @@
 
 test_expect_success 'creating page w/ >500 revisions' '
 	wiki_reset &&
-	for i in `test_seq 501`
+	for i in $(test_seq 501)
 	do
 		echo "creating revision $i" &&
 		wiki_editpage foo "revision $i<br/>" true
diff --git a/contrib/mw-to-git/t/test-gitmw-lib.sh b/contrib/mw-to-git/t/test-gitmw-lib.sh
index 3372b2a..6546294 100755
--- a/contrib/mw-to-git/t/test-gitmw-lib.sh
+++ b/contrib/mw-to-git/t/test-gitmw-lib.sh
@@ -90,7 +90,7 @@
 #
 # Check that <dir> contains exactly <N> files
 test_contains_N_files () {
-	if test `ls -- "$1" | wc -l` -ne "$2"; then
+	if test $(ls -- "$1" | wc -l) -ne "$2"; then
 		echo "directory $1 should contain $2 files"
 		echo "it contains these files:"
 		ls "$1"
@@ -289,7 +289,6 @@
 # Kill daemon lighttpd and removes files and folders associated.
 stop_lighttpd () {
 	test -f "$WEB_TMP/pid" && kill $(cat "$WEB_TMP/pid")
-	rm -rf "$WEB"
 }
 
 # Create the SQLite database of the MediaWiki. If the database file already
@@ -341,10 +340,10 @@
 			"http://download.wikimedia.org/mediawiki/$MW_VERSION_MAJOR/"\
 			"$MW_FILENAME. "\
 			"Please fix your connection and launch the script again."
-		echo "$MW_FILENAME downloaded in `pwd`. "\
+		echo "$MW_FILENAME downloaded in $(pwd). "\
 			"You can delete it later if you want."
 	else
-		echo "Reusing existing $MW_FILENAME downloaded in `pwd`."
+		echo "Reusing existing $MW_FILENAME downloaded in $(pwd)."
 	fi
 	archive_abs_path=$(pwd)/$MW_FILENAME
 	cd "$WIKI_DIR_INST/$WIKI_DIR_NAME/" ||
@@ -415,6 +414,7 @@
 wiki_delete () {
 	if test $LIGHTTPD = "true"; then
 		stop_lighttpd
+		rm -fr "$WEB"
 	else
 		# Delete the wiki's directory.
 		rm -rf "$WIKI_DIR_INST/$WIKI_DIR_NAME" ||
diff --git a/contrib/subtree/.gitignore b/contrib/subtree/.gitignore
index 91360a3..0b9381a 100644
--- a/contrib/subtree/.gitignore
+++ b/contrib/subtree/.gitignore
@@ -1,6 +1,7 @@
 *~
 git-subtree
-git-subtree.xml
 git-subtree.1
+git-subtree.html
+git-subtree.xml
 mainline
 subproj
diff --git a/contrib/subtree/Makefile b/contrib/subtree/Makefile
index 4030a16..3071baf 100644
--- a/contrib/subtree/Makefile
+++ b/contrib/subtree/Makefile
@@ -1,19 +1,34 @@
+# The default target of this Makefile is...
+all::
+
 -include ../../config.mak.autogen
 -include ../../config.mak
 
 prefix ?= /usr/local
+gitexecdir ?= $(prefix)/libexec/git-core
 mandir ?= $(prefix)/share/man
-libexecdir ?= $(prefix)/libexec/git-core
-gitdir ?= $(shell git --exec-path)
 man1dir ?= $(mandir)/man1
+htmldir ?= $(prefix)/share/doc/git-doc
 
-gitver ?= $(word 3,$(shell git --version))
+../../GIT-VERSION-FILE: FORCE
+	$(MAKE) -C ../../ GIT-VERSION-FILE
+
+-include ../../GIT-VERSION-FILE
 
 # this should be set to a 'standard' bsd-type install program
-INSTALL ?= install
+INSTALL  ?= install
+RM       ?= rm -f
 
-ASCIIDOC_CONF      = ../../Documentation/asciidoc.conf
-MANPAGE_NORMAL_XSL =  ../../Documentation/manpage-normal.xsl
+ASCIIDOC = asciidoc
+XMLTO    = xmlto
+
+ifndef SHELL_PATH
+	SHELL_PATH = /bin/sh
+endif
+SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
+
+ASCIIDOC_CONF = ../../Documentation/asciidoc.conf
+MANPAGE_XSL   = ../../Documentation/manpage-normal.xsl
 
 GIT_SUBTREE_SH := git-subtree.sh
 GIT_SUBTREE    := git-subtree
@@ -23,37 +38,44 @@
 GIT_SUBTREE_TXT := git-subtree.txt
 GIT_SUBTREE_HTML := git-subtree.html
 
-all: $(GIT_SUBTREE)
+all:: $(GIT_SUBTREE)
 
 $(GIT_SUBTREE): $(GIT_SUBTREE_SH)
-	cp $< $@ && chmod +x $@
+	sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' $< >$@
+	chmod +x $@
 
 doc: $(GIT_SUBTREE_DOC) $(GIT_SUBTREE_HTML)
 
 install: $(GIT_SUBTREE)
-	$(INSTALL) -d -m 755 $(DESTDIR)$(libexecdir)
-	$(INSTALL) -m 755 $(GIT_SUBTREE) $(DESTDIR)$(libexecdir)
+	$(INSTALL) -d -m 755 $(DESTDIR)$(gitexecdir)
+	$(INSTALL) -m 755 $(GIT_SUBTREE) $(DESTDIR)$(gitexecdir)
 
-install-doc: install-man
+install-doc: install-man install-html
 
 install-man: $(GIT_SUBTREE_DOC)
 	$(INSTALL) -d -m 755 $(DESTDIR)$(man1dir)
 	$(INSTALL) -m 644 $^ $(DESTDIR)$(man1dir)
 
+install-html: $(GIT_SUBTREE_HTML)
+	$(INSTALL) -d -m 755 $(DESTDIR)$(htmldir)
+	$(INSTALL) -m 644 $^ $(DESTDIR)$(htmldir)
+
 $(GIT_SUBTREE_DOC): $(GIT_SUBTREE_XML)
-	xmlto -m $(MANPAGE_NORMAL_XSL)  man $^
+	$(XMLTO) -m $(MANPAGE_XSL) man $^
 
 $(GIT_SUBTREE_XML): $(GIT_SUBTREE_TXT)
-	asciidoc -b docbook -d manpage -f $(ASCIIDOC_CONF) \
-		-agit_version=$(gitver) $^
+	$(ASCIIDOC) -b docbook -d manpage -f $(ASCIIDOC_CONF) \
+		-agit_version=$(GIT_VERSION) $^
 
 $(GIT_SUBTREE_HTML): $(GIT_SUBTREE_TXT)
-	asciidoc -b xhtml11 -d manpage -f $(ASCIIDOC_CONF) \
-		-agit_version=$(gitver) $^
+	$(ASCIIDOC) -b xhtml11 -d manpage -f $(ASCIIDOC_CONF) \
+		-agit_version=$(GIT_VERSION) $^
 
 test:
 	$(MAKE) -C t/ test
 
 clean:
-	rm -f *~ *.xml *.html *.1
-	rm -rf subproj mainline
+	$(RM) $(GIT_SUBTREE)
+	$(RM) *.xml *.html *.1
+
+.PHONY: FORCE
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index db925ca..fa1a583 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
Binary files differ
diff --git a/contrib/subtree/git-subtree.txt b/contrib/subtree/git-subtree.txt
index 02669b1..8272100 100644
--- a/contrib/subtree/git-subtree.txt
+++ b/contrib/subtree/git-subtree.txt
@@ -114,7 +114,7 @@
 	want.
 	
 	Repeated splits of exactly the same history are
-	guaranteed to be identical (ie. to produce the same
+	guaranteed to be identical (i.e. to produce the same
 	commit ids).  Because of this, if you add new commits
 	and then re-split, the new commits will be attached as
 	commits on top of the history you generated last time,
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index 8dc6840..6309d12 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -77,7 +77,7 @@
 
 # Save this hash for testing later.
 
-subdir_hash=`git rev-parse HEAD`
+subdir_hash=$(git rev-parse HEAD)
 
 test_expect_success 'add sub2' '
         create sub2 &&
diff --git a/contrib/svn-fe/Makefile b/contrib/svn-fe/Makefile
index 360d8da..e8651aa 100644
--- a/contrib/svn-fe/Makefile
+++ b/contrib/svn-fe/Makefile
@@ -1,18 +1,58 @@
 all:: svn-fe$X
 
-CC = gcc
+CC = cc
 RM = rm -f
 MV = mv
 
 CFLAGS = -g -O2 -Wall
 LDFLAGS =
-ALL_CFLAGS = $(CFLAGS)
-ALL_LDFLAGS = $(LDFLAGS)
-EXTLIBS =
+EXTLIBS = -lz
+
+include ../../config.mak.uname
+-include ../../config.mak.autogen
+-include ../../config.mak
+
+ifeq ($(uname_S),Darwin)
+	ifndef NO_FINK
+		ifeq ($(shell test -d /sw/lib && echo y),y)
+			CFLAGS += -I/sw/include
+			LDFLAGS += -L/sw/lib
+		endif
+	endif
+	ifndef NO_DARWIN_PORTS
+		ifeq ($(shell test -d /opt/local/lib && echo y),y)
+			CFLAGS += -I/opt/local/include
+			LDFLAGS += -L/opt/local/lib
+		endif
+	endif
+endif
+
+ifndef NO_OPENSSL
+	EXTLIBS += -lssl
+	ifdef NEEDS_CRYPTO_WITH_SSL
+		EXTLIBS += -lcrypto
+	endif
+endif
+
+ifndef NO_PTHREADS
+	CFLAGS += $(PTHREADS_CFLAGS)
+	EXTLIBS += $(PTHREAD_LIBS)
+endif
+
+ifdef HAVE_CLOCK_GETTIME
+	CFLAGS += -DHAVE_CLOCK_GETTIME
+	EXTLIBS += -lrt
+endif
+
+ifdef NEEDS_LIBICONV
+	EXTLIBS += -liconv
+endif
 
 GIT_LIB = ../../libgit.a
 VCSSVN_LIB = ../../vcs-svn/lib.a
-LIBS = $(VCSSVN_LIB) $(GIT_LIB) $(EXTLIBS)
+XDIFF_LIB = ../../xdiff/lib.a
+
+LIBS = $(VCSSVN_LIB) $(GIT_LIB) $(XDIFF_LIB)
 
 QUIET_SUBDIR0 = +$(MAKE) -C # space to separate -C and subdir
 QUIET_SUBDIR1 =
@@ -33,12 +73,11 @@
 endif
 endif
 
-svn-fe$X: svn-fe.o $(VCSSVN_LIB) $(GIT_LIB)
-	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ svn-fe.o \
-		$(ALL_LDFLAGS) $(LIBS)
+svn-fe$X: svn-fe.o $(VCSSVN_LIB) $(XDIFF_LIB) $(GIT_LIB)
+	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(EXTLIBS) -o $@ svn-fe.o $(LIBS)
 
 svn-fe.o: svn-fe.c ../../vcs-svn/svndump.h
-	$(QUIET_CC)$(CC) -I../../vcs-svn -o $*.o -c $(ALL_CFLAGS) $<
+	$(QUIET_CC)$(CC) $(CFLAGS) -I../../vcs-svn -o $*.o -c $<
 
 svn-fe.html: svn-fe.txt
 	$(QUIET_SUBDIR0)../../Documentation $(QUIET_SUBDIR1) \
@@ -54,6 +93,9 @@
 ../../vcs-svn/lib.a: FORCE
 	$(QUIET_SUBDIR0)../.. $(QUIET_SUBDIR1) vcs-svn/lib.a
 
+../../xdiff/lib.a: FORCE
+	$(QUIET_SUBDIR0)../.. $(QUIET_SUBDIR1) xdiff/lib.a
+
 ../../libgit.a: FORCE
 	$(QUIET_SUBDIR0)../.. $(QUIET_SUBDIR1) libgit.a
 
diff --git a/contrib/svn-fe/svnrdump_sim.py b/contrib/svn-fe/svnrdump_sim.py
index 4e78a1c..11ac6f6 100755
--- a/contrib/svn-fe/svnrdump_sim.py
+++ b/contrib/svn-fe/svnrdump_sim.py
@@ -5,53 +5,64 @@
 To simulate incremental imports the environment variable SVNRMAX can be set
 to the highest revision that should be available.
 """
-import sys, os
+import sys
+import os
 
 if sys.hexversion < 0x02040000:
-        # The limiter is the ValueError() calls. This may be too conservative
-        sys.stderr.write("svnrdump-sim.py: requires Python 2.4 or later.\n")
-        sys.exit(1)
+    # The limiter is the ValueError() calls. This may be too conservative
+    sys.stderr.write("svnrdump-sim.py: requires Python 2.4 or later.\n")
+    sys.exit(1)
+
 
 def getrevlimit():
-        var = 'SVNRMAX'
-        if var in os.environ:
-                return os.environ[var]
-        return None
+    var = 'SVNRMAX'
+    if var in os.environ:
+        return os.environ[var]
+    return None
+
 
 def writedump(url, lower, upper):
-        if url.startswith('sim://'):
-                filename = url[6:]
-                if filename[-1] == '/': filename = filename[:-1] #remove terminating slash
-        else:
-                raise ValueError('sim:// url required')
-        f = open(filename, 'r');
-        state = 'header'
-        wroterev = False
-        while(True):
-                l = f.readline()
-                if l == '': break
-                if state == 'header' and l.startswith('Revision-number: '):
-                        state = 'prefix'
-                if state == 'prefix' and l == 'Revision-number: %s\n' % lower:
-                        state = 'selection'
-                if not upper == 'HEAD' and state == 'selection' and l == 'Revision-number: %s\n' % upper:
-                        break;
+    if url.startswith('sim://'):
+        filename = url[6:]
+        if filename[-1] == '/':
+            filename = filename[:-1]  # remove terminating slash
+    else:
+        raise ValueError('sim:// url required')
+    f = open(filename, 'r')
+    state = 'header'
+    wroterev = False
+    while(True):
+        l = f.readline()
+        if l == '':
+            break
+        if state == 'header' and l.startswith('Revision-number: '):
+            state = 'prefix'
+        if state == 'prefix' and l == 'Revision-number: %s\n' % lower:
+            state = 'selection'
+        if not upper == 'HEAD' and state == 'selection' and \
+                l == 'Revision-number: %s\n' % upper:
+            break
 
-                if state == 'header' or state == 'selection':
-                        if state == 'selection': wroterev = True
-                        sys.stdout.write(l)
-        return wroterev
+        if state == 'header' or state == 'selection':
+            if state == 'selection':
+                wroterev = True
+            sys.stdout.write(l)
+    return wroterev
 
 if __name__ == "__main__":
-        if not (len(sys.argv) in (3, 4, 5)):
-                print("usage: %s dump URL -rLOWER:UPPER")
-                sys.exit(1)
-        if not sys.argv[1] == 'dump': raise NotImplementedError('only "dump" is suppported.')
-        url = sys.argv[2]
-        r = ('0', 'HEAD')
-        if len(sys.argv) == 4 and sys.argv[3][0:2] == '-r':
-                r = sys.argv[3][2:].lstrip().split(':')
-        if not getrevlimit() is None: r[1] = getrevlimit()
-        if writedump(url, r[0], r[1]): ret = 0
-        else: ret = 1
-        sys.exit(ret)
+    if not (len(sys.argv) in (3, 4, 5)):
+        print("usage: %s dump URL -rLOWER:UPPER")
+        sys.exit(1)
+    if not sys.argv[1] == 'dump':
+        raise NotImplementedError('only "dump" is suppported.')
+    url = sys.argv[2]
+    r = ('0', 'HEAD')
+    if len(sys.argv) == 4 and sys.argv[3][0:2] == '-r':
+        r = sys.argv[3][2:].lstrip().split(':')
+    if not getrevlimit() is None:
+        r[1] = getrevlimit()
+    if writedump(url, r[0], r[1]):
+        ret = 0
+    else:
+        ret = 1
+    sys.exit(ret)
diff --git a/contrib/thunderbird-patch-inline/appp.sh b/contrib/thunderbird-patch-inline/appp.sh
index 5eb4a51..8dc73ec 100755
--- a/contrib/thunderbird-patch-inline/appp.sh
+++ b/contrib/thunderbird-patch-inline/appp.sh
@@ -10,7 +10,7 @@
 
 SEP="-=-=-=-=-=-=-=-=-=# Don't remove this line #=-=-=-=-=-=-=-=-=-"
 if [ -e "$CONFFILE" ] ; then
-	LAST_DIR=`grep -m 1 "^LAST_DIR=" "${CONFFILE}"|sed -e 's/^LAST_DIR=//'`
+	LAST_DIR=$(grep -m 1 "^LAST_DIR=" "${CONFFILE}"|sed -e 's/^LAST_DIR=//')
 	cd "${LAST_DIR}"
 else
 	cd > /dev/null
@@ -25,11 +25,11 @@
 
 cd - > /dev/null
 
-SUBJECT=`sed -n -e '/^Subject: /p' "${PATCH}"`
-HEADERS=`sed -e '/^'"${SEP}"'$/,$d' $1`
-BODY=`sed -e "1,/${SEP}/d" $1`
-CMT_MSG=`sed -e '1,/^$/d' -e '/^---$/,$d' "${PATCH}"`
-DIFF=`sed -e '1,/^---$/d' "${PATCH}"`
+SUBJECT=$(sed -n -e '/^Subject: /p' "${PATCH}")
+HEADERS=$(sed -e '/^'"${SEP}"'$/,$d' $1)
+BODY=$(sed -e "1,/${SEP}/d" $1)
+CMT_MSG=$(sed -e '1,/^$/d' -e '/^---$/,$d' "${PATCH}")
+DIFF=$(sed -e '1,/^---$/d' "${PATCH}")
 
 CCS=`echo -e "$CMT_MSG\n$HEADERS" | sed -n -e 's/^Cc: \(.*\)$/\1,/gp' \
 	-e 's/^Signed-off-by: \(.*\)/\1,/gp'`
@@ -48,7 +48,7 @@
 fi
 echo "$DIFF" >> $1
 
-LAST_DIR=`dirname "${PATCH}"`
+LAST_DIR=$(dirname "${PATCH}")
 
 grep -v "^LAST_DIR=" "${CONFFILE}" > "${CONFFILE}_"
 echo "LAST_DIR=${LAST_DIR}" >> "${CONFFILE}_"
diff --git a/contrib/vim/README b/contrib/vim/README
deleted file mode 100644
index 8f16d06..0000000
--- a/contrib/vim/README
+++ /dev/null
@@ -1,22 +0,0 @@
-Syntax highlighting for git commit messages, config files, etc. is
-included with the vim distribution as of vim 7.2, and should work
-automatically.
-
-If you have an older version of vim, you can get the latest syntax
-files from the vim project:
-
-  http://ftp.vim.org/pub/vim/runtime/syntax/git.vim
-  http://ftp.vim.org/pub/vim/runtime/syntax/gitcommit.vim
-  http://ftp.vim.org/pub/vim/runtime/syntax/gitconfig.vim
-  http://ftp.vim.org/pub/vim/runtime/syntax/gitrebase.vim
-  http://ftp.vim.org/pub/vim/runtime/syntax/gitsendemail.vim
-
-These files are also available via FTP at the same location.
-
-To install:
-
-  1. Copy these files to vim's syntax directory $HOME/.vim/syntax
-  2. To auto-detect the editing of various git-related filetypes:
-
-	$ curl http://ftp.vim.org/pub/vim/runtime/filetype.vim |
-		sed -ne '/^" Git$/, /^$/ p' >>$HOME/.vim/filetype.vim
diff --git a/convert.c b/convert.c
index ab80b72..9a5612e 100644
--- a/convert.c
+++ b/convert.c
@@ -312,16 +312,17 @@
 struct filter_params {
 	const char *src;
 	unsigned long size;
+	int fd;
 	const char *cmd;
 	const char *path;
 };
 
-static int filter_buffer(int in, int out, void *data)
+static int filter_buffer_or_fd(int in, int out, void *data)
 {
 	/*
 	 * Spawn cmd and feed the buffer contents through its stdin.
 	 */
-	struct child_process child_process;
+	struct child_process child_process = CHILD_PROCESS_INIT;
 	struct filter_params *params = (struct filter_params *)data;
 	int write_err, status;
 	const char *argv[] = { NULL, NULL };
@@ -344,7 +345,6 @@
 
 	argv[0] = cmd.buf;
 
-	memset(&child_process, 0, sizeof(child_process));
 	child_process.argv = argv;
 	child_process.use_shell = 1;
 	child_process.in = -1;
@@ -355,7 +355,12 @@
 
 	sigchain_push(SIGPIPE, SIG_IGN);
 
-	write_err = (write_in_full(child_process.in, params->src, params->size) < 0);
+	if (params->src) {
+		write_err = (write_in_full(child_process.in, params->src, params->size) < 0);
+	} else {
+		write_err = copy_fd(params->fd, child_process.in);
+	}
+
 	if (close(child_process.in))
 		write_err = 1;
 	if (write_err)
@@ -371,7 +376,7 @@
 	return (write_err || status);
 }
 
-static int apply_filter(const char *path, const char *src, size_t len,
+static int apply_filter(const char *path, const char *src, size_t len, int fd,
                         struct strbuf *dst, const char *cmd)
 {
 	/*
@@ -392,11 +397,12 @@
 		return 1;
 
 	memset(&async, 0, sizeof(async));
-	async.proc = filter_buffer;
+	async.proc = filter_buffer_or_fd;
 	async.data = &params;
 	async.out = -1;
 	params.src = src;
 	params.size = len;
+	params.fd = fd;
 	params.cmd = cmd;
 	params.path = path;
 
@@ -747,6 +753,25 @@
 	}
 }
 
+int would_convert_to_git_filter_fd(const char *path)
+{
+	struct conv_attrs ca;
+
+	convert_attrs(&ca, path);
+	if (!ca.drv)
+		return 0;
+
+	/*
+	 * Apply a filter to an fd only if the filter is required to succeed.
+	 * We must die if the filter fails, because the original data before
+	 * filtering is not available.
+	 */
+	if (!ca.drv->required)
+		return 0;
+
+	return apply_filter(path, NULL, 0, -1, NULL, ca.drv->clean);
+}
+
 int convert_to_git(const char *path, const char *src, size_t len,
                    struct strbuf *dst, enum safe_crlf checksafe)
 {
@@ -761,7 +786,7 @@
 		required = ca.drv->required;
 	}
 
-	ret |= apply_filter(path, src, len, dst, filter);
+	ret |= apply_filter(path, src, len, -1, dst, filter);
 	if (!ret && required)
 		die("%s: clean filter '%s' failed", path, ca.drv->name);
 
@@ -778,6 +803,23 @@
 	return ret | ident_to_git(path, src, len, dst, ca.ident);
 }
 
+void convert_to_git_filter_fd(const char *path, int fd, struct strbuf *dst,
+			      enum safe_crlf checksafe)
+{
+	struct conv_attrs ca;
+	convert_attrs(&ca, path);
+
+	assert(ca.drv);
+	assert(ca.drv->clean);
+
+	if (!apply_filter(path, NULL, 0, fd, dst, ca.drv->clean))
+		die("%s: clean filter '%s' failed", path, ca.drv->name);
+
+	ca.crlf_action = input_crlf_action(ca.crlf_action, ca.eol_attr);
+	crlf_to_git(path, dst->buf, dst->len, dst, ca.crlf_action, checksafe);
+	ident_to_git(path, dst->buf, dst->len, dst, ca.ident);
+}
+
 static int convert_to_working_tree_internal(const char *path, const char *src,
 					    size_t len, struct strbuf *dst,
 					    int normalizing)
@@ -811,7 +853,7 @@
 		}
 	}
 
-	ret_filter = apply_filter(path, src, len, dst, filter);
+	ret_filter = apply_filter(path, src, len, -1, dst, filter);
 	if (!ret_filter && required)
 		die("%s: smudge filter %s failed", path, ca.drv->name);
 
@@ -1121,9 +1163,9 @@
 {
 	int i;
 
-	if (!starts_with(str, "$Id: "))
+	if (!skip_prefix(str, "$Id: ", &str))
 		return 0;
-	for (i = 5; str[i]; i++) {
+	for (i = 0; str[i]; i++) {
 		if (isspace(str[i]) && str[i+1] != '$')
 			return 1;
 	}
diff --git a/convert.h b/convert.h
index 0c2143c..d9d853c 100644
--- a/convert.h
+++ b/convert.h
@@ -40,11 +40,15 @@
 				   size_t len, struct strbuf *dst);
 extern int renormalize_buffer(const char *path, const char *src, size_t len,
 			      struct strbuf *dst);
-static inline int would_convert_to_git(const char *path, const char *src,
-				       size_t len, enum safe_crlf checksafe)
+static inline int would_convert_to_git(const char *path)
 {
-	return convert_to_git(path, src, len, NULL, checksafe);
+	return convert_to_git(path, NULL, 0, NULL, 0);
 }
+/* Precondition: would_convert_to_git_filter_fd(path) == true */
+extern void convert_to_git_filter_fd(const char *path, int fd,
+				     struct strbuf *dst,
+				     enum safe_crlf checksafe);
+extern int would_convert_to_git_filter_fd(const char *path);
 
 /*****************************************************************
  *
diff --git a/copy.c b/copy.c
index a7f58fd..f2970ec 100644
--- a/copy.c
+++ b/copy.c
@@ -4,34 +4,17 @@
 {
 	while (1) {
 		char buffer[8192];
-		char *buf = buffer;
 		ssize_t len = xread(ifd, buffer, sizeof(buffer));
 		if (!len)
 			break;
 		if (len < 0) {
-			int read_error = errno;
-			close(ifd);
 			return error("copy-fd: read returned %s",
-				     strerror(read_error));
+				     strerror(errno));
 		}
-		while (len) {
-			int written = xwrite(ofd, buf, len);
-			if (written > 0) {
-				buf += written;
-				len -= written;
-			}
-			else if (!written) {
-				close(ifd);
-				return error("copy-fd: write returned 0");
-			} else {
-				int write_error = errno;
-				close(ifd);
-				return error("copy-fd: write returned %s",
-					     strerror(write_error));
-			}
-		}
+		if (write_in_full(ofd, buffer, len) < 0)
+			return error("copy-fd: write returned %s",
+				     strerror(errno));
 	}
-	close(ifd);
 	return 0;
 }
 
@@ -60,6 +43,7 @@
 		return fdo;
 	}
 	status = copy_fd(fdi, fdo);
+	close(fdi);
 	if (close(fdo) != 0)
 		return error("%s: close error: %s", dst, strerror(errno));
 
diff --git a/credential-cache--daemon.c b/credential-cache--daemon.c
index 390f194..c2f0049 100644
--- a/credential-cache--daemon.c
+++ b/credential-cache--daemon.c
@@ -2,6 +2,7 @@
 #include "credential.h"
 #include "unix-socket.h"
 #include "sigchain.h"
+#include "parse-options.h"
 
 static const char *socket_path;
 
@@ -109,14 +110,12 @@
 	const char *p;
 
 	strbuf_getline(&item, fh, '\n');
-	p = skip_prefix(item.buf, "action=");
-	if (!p)
+	if (!skip_prefix(item.buf, "action=", &p))
 		return error("client sent bogus action line: %s", item.buf);
 	strbuf_addstr(action, p);
 
 	strbuf_getline(&item, fh, '\n');
-	p = skip_prefix(item.buf, "timeout=");
-	if (!p)
+	if (!skip_prefix(item.buf, "timeout=", &p))
 		return error("client sent bogus timeout line: %s", item.buf);
 	*timeout = atoi(p);
 
@@ -203,7 +202,7 @@
 	return 1;
 }
 
-static void serve_cache(const char *socket_path)
+static void serve_cache(const char *socket_path, int debug)
 {
 	int fd;
 
@@ -213,6 +212,10 @@
 
 	printf("ok\n");
 	fclose(stdout);
+	if (!debug) {
+		if (!freopen("/dev/null", "w", stderr))
+			die_errno("unable to point stderr to /dev/null");
+	}
 
 	while (serve_cache_loop(fd))
 		; /* nothing */
@@ -254,16 +257,28 @@
 
 int main(int argc, const char **argv)
 {
-	socket_path = argv[1];
+	static const char *usage[] = {
+		"git-credential-cache--daemon [opts] <socket_path>",
+		NULL
+	};
+	int debug = 0;
+	const struct option options[] = {
+		OPT_BOOL(0, "debug", &debug,
+			 N_("print debugging messages to stderr")),
+		OPT_END()
+	};
+
+	argc = parse_options(argc, argv, NULL, options, usage, 0);
+	socket_path = argv[0];
 
 	if (!socket_path)
-		die("usage: git-credential-cache--daemon <socket_path>");
+		usage_with_options(usage, options);
 	check_socket_directory(socket_path);
 
 	atexit(cleanup_socket);
 	sigchain_push_common(cleanup_socket_on_signal);
 
-	serve_cache(socket_path);
+	serve_cache(socket_path, debug);
 
 	return 0;
 }
diff --git a/credential-cache.c b/credential-cache.c
index 9a03792..8689a15 100644
--- a/credential-cache.c
+++ b/credential-cache.c
@@ -37,12 +37,11 @@
 
 static void spawn_daemon(const char *socket)
 {
-	struct child_process daemon;
+	struct child_process daemon = CHILD_PROCESS_INIT;
 	const char *argv[] = { NULL, NULL, NULL };
 	char buf[128];
 	int r;
 
-	memset(&daemon, 0, sizeof(daemon));
 	argv[0] = "git-credential-cache--daemon";
 	argv[1] = socket;
 	daemon.argv = argv;
diff --git a/credential-store.c b/credential-store.c
index f9146e5..d435514 100644
--- a/credential-store.c
+++ b/credential-store.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "lockfile.h"
 #include "credential.h"
 #include "string-list.h"
 #include "parse-options.h"
diff --git a/credential.c b/credential.c
index e54753c..1886ea5 100644
--- a/credential.c
+++ b/credential.c
@@ -40,8 +40,7 @@
 	struct credential *c = data;
 	const char *key, *dot;
 
-	key = skip_prefix(var, "credential.");
-	if (!key)
+	if (!skip_prefix(var, "credential.", &key))
 		return 0;
 
 	if (!value)
@@ -206,11 +205,10 @@
 				 const char *cmd,
 				 int want_output)
 {
-	struct child_process helper;
+	struct child_process helper = CHILD_PROCESS_INIT;
 	const char *argv[] = { NULL, NULL };
 	FILE *fp;
 
-	memset(&helper, 0, sizeof(helper));
 	argv[0] = cmd;
 	helper.argv = argv;
 	helper.use_shell = 1;
diff --git a/daemon.c b/daemon.c
index eba1255..54a03bd 100644
--- a/daemon.c
+++ b/daemon.c
@@ -39,8 +39,8 @@
 static int export_all_trees;
 
 /* Take all paths relative to this one if non-NULL */
-static char *base_path;
-static char *interpolated_path;
+static const char *base_path;
+static const char *interpolated_path;
 static int base_path_relaxed;
 
 /* Flag indicating client sent extra args. */
@@ -106,12 +106,12 @@
 	exit(1);
 }
 
-static const char *path_ok(char *directory)
+static const char *path_ok(const char *directory)
 {
 	static char rpath[PATH_MAX];
 	static char interp_path[PATH_MAX];
 	const char *path;
-	char *dir;
+	const char *dir;
 
 	dir = directory;
 
@@ -131,7 +131,7 @@
 			 * "~alice/%s/foo".
 			 */
 			int namlen, restlen = strlen(dir);
-			char *slash = strchr(dir, '/');
+			const char *slash = strchr(dir, '/');
 			if (!slash)
 				slash = dir + restlen;
 			namlen = slash - dir;
@@ -230,21 +230,6 @@
 	int overridable;
 };
 
-static struct daemon_service *service_looking_at;
-static int service_enabled;
-
-static int git_daemon_config(const char *var, const char *value, void *cb)
-{
-	if (starts_with(var, "daemon.") &&
-	    !strcmp(var + 7, service_looking_at->config_name)) {
-		service_enabled = git_config_bool(var, value);
-		return 0;
-	}
-
-	/* we are not interested in parsing any other configuration here */
-	return 0;
-}
-
 static int daemon_error(const char *dir, const char *msg)
 {
 	if (!informative_errors)
@@ -253,11 +238,11 @@
 	return -1;
 }
 
-static char *access_hook;
+static const char *access_hook;
 
 static int run_access_hook(struct daemon_service *service, const char *dir, const char *path)
 {
-	struct child_process child;
+	struct child_process child = CHILD_PROCESS_INIT;
 	struct strbuf buf = STRBUF_INIT;
 	const char *argv[8];
 	const char **arg = argv;
@@ -275,7 +260,6 @@
 	*arg = NULL;
 #undef STRARG
 
-	memset(&child, 0, sizeof(child));
 	child.use_shell = 1;
 	child.argv = argv;
 	child.no_stdin = 1;
@@ -318,10 +302,11 @@
 	return -1;
 }
 
-static int run_service(char *dir, struct daemon_service *service)
+static int run_service(const char *dir, struct daemon_service *service)
 {
 	const char *path;
 	int enabled = service->enabled;
+	struct strbuf var = STRBUF_INIT;
 
 	loginfo("Request %s for '%s'", service->name, dir);
 
@@ -352,11 +337,9 @@
 	}
 
 	if (service->overridable) {
-		service_looking_at = service;
-		service_enabled = -1;
-		git_config(git_daemon_config, NULL);
-		if (0 <= service_enabled)
-			enabled = service_enabled;
+		strbuf_addf(&var, "daemon.%s", service->config_name);
+		git_config_get_bool(var.buf, &enabled);
+		strbuf_release(&var);
 	}
 	if (!enabled) {
 		logerror("'%s': service not enabled for '%s'",
@@ -404,9 +387,8 @@
 
 static int run_service_command(const char **argv)
 {
-	struct child_process cld;
+	struct child_process cld = CHILD_PROCESS_INIT;
 
-	memset(&cld, 0, sizeof(cld));
 	cld.argv = argv;
 	cld.git_cmd = 1;
 	cld.err = -1;
@@ -475,14 +457,6 @@
 	die("No such service %s", name);
 }
 
-static char *xstrdup_tolower(const char *str)
-{
-	char *p, *dup = xstrdup(str);
-	for (p = dup; *p; p++)
-		*p = tolower(*p);
-	return dup;
-}
-
 static void parse_host_and_port(char *hostport, char **host,
 	char **port)
 {
@@ -579,20 +553,21 @@
 		static char addrbuf[HOST_NAME_MAX + 1];
 
 		hent = gethostbyname(hostname);
+		if (hent) {
+			ap = hent->h_addr_list;
+			memset(&sa, 0, sizeof sa);
+			sa.sin_family = hent->h_addrtype;
+			sa.sin_port = htons(0);
+			memcpy(&sa.sin_addr, *ap, hent->h_length);
 
-		ap = hent->h_addr_list;
-		memset(&sa, 0, sizeof sa);
-		sa.sin_family = hent->h_addrtype;
-		sa.sin_port = htons(0);
-		memcpy(&sa.sin_addr, *ap, hent->h_length);
+			inet_ntop(hent->h_addrtype, &sa.sin_addr,
+				  addrbuf, sizeof(addrbuf));
 
-		inet_ntop(hent->h_addrtype, &sa.sin_addr,
-			  addrbuf, sizeof(addrbuf));
-
-		free(canon_hostname);
-		canon_hostname = xstrdup(hent->h_name);
-		free(ip_address);
-		ip_address = xstrdup(addrbuf);
+			free(canon_hostname);
+			canon_hostname = xstrdup(hent->h_name);
+			free(ip_address);
+			ip_address = xstrdup(addrbuf);
+		}
 #endif
 	}
 }
@@ -632,15 +607,16 @@
 
 	for (i = 0; i < ARRAY_SIZE(daemon_service); i++) {
 		struct daemon_service *s = &(daemon_service[i]);
-		int namelen = strlen(s->name);
-		if (starts_with(line, "git-") &&
-		    !strncmp(s->name, line + 4, namelen) &&
-		    line[namelen + 4] == ' ') {
+		const char *arg;
+
+		if (skip_prefix(line, "git-", &arg) &&
+		    skip_prefix(arg, s->name, &arg) &&
+		    *arg++ == ' ') {
 			/*
 			 * Note: The directory here is probably context sensitive,
 			 * and might depend on the actual service being performed.
 			 */
-			return run_service(line + namelen + 5, s);
+			return run_service(arg, s);
 		}
 	}
 
@@ -738,7 +714,7 @@
 static char **cld_argv;
 static void handle(int incoming, struct sockaddr *addr, socklen_t addrlen)
 {
-	struct child_process cld = { NULL };
+	struct child_process cld = CHILD_PROCESS_INIT;
 	char addrbuf[300] = "REMOTE_ADDR=", portbuf[300];
 	char *env[] = { addrbuf, portbuf, NULL };
 
@@ -783,7 +759,6 @@
 		logerror("unable to fork");
 	else
 		add_child(&cld, addr, addrlen);
-	close(incoming);
 }
 
 static void child_handler(int signo)
@@ -840,7 +815,6 @@
 static int setup_named_sock(char *listen_addr, int listen_port, struct socketlist *socklist)
 {
 	int socknum = 0;
-	int maxfd = -1;
 	char pbuf[NI_MAXSERV];
 	struct addrinfo hints, *ai0, *ai;
 	int gai;
@@ -908,9 +882,6 @@
 		ALLOC_GROW(socklist->list, socklist->nr + 1, socklist->alloc);
 		socklist->list[socklist->nr++] = sockfd;
 		socknum++;
-
-		if (maxfd < sockfd)
-			maxfd = sockfd;
 	}
 
 	freeaddrinfo(ai0);
@@ -949,7 +920,7 @@
 	}
 
 	if ( bind(sockfd, (struct sockaddr *)&sin, sizeof sin) < 0 ) {
-		logerror("Could not listen to %s: %s",
+		logerror("Could not bind to %s: %s",
 			 ip2str(AF_INET, (struct sockaddr *)&sin, sizeof(sin)),
 			 strerror(errno));
 		close(sockfd);
@@ -1141,16 +1112,17 @@
 
 	for (i = 1; i < argc; i++) {
 		char *arg = argv[i];
+		const char *v;
 
-		if (starts_with(arg, "--listen=")) {
-			string_list_append(&listen_addr, xstrdup_tolower(arg + 9));
+		if (skip_prefix(arg, "--listen=", &v)) {
+			string_list_append(&listen_addr, xstrdup_tolower(v));
 			continue;
 		}
-		if (starts_with(arg, "--port=")) {
+		if (skip_prefix(arg, "--port=", &v)) {
 			char *end;
 			unsigned long n;
-			n = strtoul(arg+7, &end, 0);
-			if (arg[7] && !*end) {
+			n = strtoul(v, &end, 0);
+			if (*v && !*end) {
 				listen_port = n;
 				continue;
 			}
@@ -1176,20 +1148,20 @@
 			export_all_trees = 1;
 			continue;
 		}
-		if (starts_with(arg, "--access-hook=")) {
-			access_hook = arg + 14;
+		if (skip_prefix(arg, "--access-hook=", &v)) {
+			access_hook = v;
 			continue;
 		}
-		if (starts_with(arg, "--timeout=")) {
-			timeout = atoi(arg+10);
+		if (skip_prefix(arg, "--timeout=", &v)) {
+			timeout = atoi(v);
 			continue;
 		}
-		if (starts_with(arg, "--init-timeout=")) {
-			init_timeout = atoi(arg+15);
+		if (skip_prefix(arg, "--init-timeout=", &v)) {
+			init_timeout = atoi(v);
 			continue;
 		}
-		if (starts_with(arg, "--max-connections=")) {
-			max_connections = atoi(arg+18);
+		if (skip_prefix(arg, "--max-connections=", &v)) {
+			max_connections = atoi(v);
 			if (max_connections < 0)
 				max_connections = 0;	        /* unlimited */
 			continue;
@@ -1198,16 +1170,16 @@
 			strict_paths = 1;
 			continue;
 		}
-		if (starts_with(arg, "--base-path=")) {
-			base_path = arg+12;
+		if (skip_prefix(arg, "--base-path=", &v)) {
+			base_path = v;
 			continue;
 		}
 		if (!strcmp(arg, "--base-path-relaxed")) {
 			base_path_relaxed = 1;
 			continue;
 		}
-		if (starts_with(arg, "--interpolated-path=")) {
-			interpolated_path = arg+20;
+		if (skip_prefix(arg, "--interpolated-path=", &v)) {
+			interpolated_path = v;
 			continue;
 		}
 		if (!strcmp(arg, "--reuseaddr")) {
@@ -1218,12 +1190,12 @@
 			user_path = "";
 			continue;
 		}
-		if (starts_with(arg, "--user-path=")) {
-			user_path = arg + 12;
+		if (skip_prefix(arg, "--user-path=", &v)) {
+			user_path = v;
 			continue;
 		}
-		if (starts_with(arg, "--pid-file=")) {
-			pid_file = arg + 11;
+		if (skip_prefix(arg, "--pid-file=", &v)) {
+			pid_file = v;
 			continue;
 		}
 		if (!strcmp(arg, "--detach")) {
@@ -1231,28 +1203,28 @@
 			log_syslog = 1;
 			continue;
 		}
-		if (starts_with(arg, "--user=")) {
-			user_name = arg + 7;
+		if (skip_prefix(arg, "--user=", &v)) {
+			user_name = v;
 			continue;
 		}
-		if (starts_with(arg, "--group=")) {
-			group_name = arg + 8;
+		if (skip_prefix(arg, "--group=", &v)) {
+			group_name = v;
 			continue;
 		}
-		if (starts_with(arg, "--enable=")) {
-			enable_service(arg + 9, 1);
+		if (skip_prefix(arg, "--enable=", &v)) {
+			enable_service(v, 1);
 			continue;
 		}
-		if (starts_with(arg, "--disable=")) {
-			enable_service(arg + 10, 0);
+		if (skip_prefix(arg, "--disable=", &v)) {
+			enable_service(v, 0);
 			continue;
 		}
-		if (starts_with(arg, "--allow-override=")) {
-			make_service_overridable(arg + 17, 1);
+		if (skip_prefix(arg, "--allow-override=", &v)) {
+			make_service_overridable(v, 1);
 			continue;
 		}
-		if (starts_with(arg, "--forbid-override=")) {
-			make_service_overridable(arg + 18, 0);
+		if (skip_prefix(arg, "--forbid-override=", &v)) {
+			make_service_overridable(v, 0);
 			continue;
 		}
 		if (!strcmp(arg, "--informative-errors")) {
diff --git a/date.c b/date.c
index 782de95..59dfe57 100644
--- a/date.c
+++ b/date.c
@@ -200,7 +200,16 @@
 				tm->tm_mday,
 				tm->tm_hour, tm->tm_min, tm->tm_sec,
 				tz);
-	else if (mode == DATE_RFC2822)
+	else if (mode == DATE_ISO8601_STRICT) {
+		char sign = (tz >= 0) ? '+' : '-';
+		tz = abs(tz);
+		strbuf_addf(&timebuf, "%04d-%02d-%02dT%02d:%02d:%02d%c%02d:%02d",
+				tm->tm_year + 1900,
+				tm->tm_mon + 1,
+				tm->tm_mday,
+				tm->tm_hour, tm->tm_min, tm->tm_sec,
+				sign, tz / 100, tz % 100);
+	} else if (mode == DATE_RFC2822)
 		strbuf_addf(&timebuf, "%.3s, %d %.3s %d %02d:%02d:%02d %+05d",
 			weekday_names[tm->tm_wday], tm->tm_mday,
 			month_names[tm->tm_mon], tm->tm_year + 1900,
@@ -605,7 +614,7 @@
 	return end - date;
 }
 
-static int date_string(unsigned long date, int offset, char *buf, int len)
+static void date_string(unsigned long date, int offset, struct strbuf *buf)
 {
 	int sign = '+';
 
@@ -613,7 +622,7 @@
 		offset = -offset;
 		sign = '-';
 	}
-	return snprintf(buf, len, "%lu %c%02d%02d", date, sign, offset / 60, offset % 60);
+	strbuf_addf(buf, "%lu %c%02d%02d", date, sign, offset / 60, offset % 60);
 }
 
 /*
@@ -735,13 +744,14 @@
 	return errors;
 }
 
-int parse_date(const char *date, char *result, int maxlen)
+int parse_date(const char *date, struct strbuf *result)
 {
 	unsigned long timestamp;
 	int offset;
 	if (parse_date_basic(date, &timestamp, &offset))
 		return -1;
-	return date_string(timestamp, offset, result, maxlen);
+	date_string(timestamp, offset, result);
+	return 0;
 }
 
 enum date_mode parse_date_format(const char *format)
@@ -751,6 +761,9 @@
 	else if (!strcmp(format, "iso8601") ||
 		 !strcmp(format, "iso"))
 		return DATE_ISO8601;
+	else if (!strcmp(format, "iso8601-strict") ||
+		 !strcmp(format, "iso-strict"))
+		return DATE_ISO8601_STRICT;
 	else if (!strcmp(format, "rfc2822") ||
 		 !strcmp(format, "rfc"))
 		return DATE_RFC2822;
@@ -766,7 +779,7 @@
 		die("unknown date format %s", format);
 }
 
-void datestamp(char *buf, int bufsize)
+void datestamp(struct strbuf *out)
 {
 	time_t now;
 	int offset;
@@ -776,7 +789,7 @@
 	offset = tm_to_time_t(localtime(&now)) - now;
 	offset /= 60;
 
-	date_string(now, offset, buf, bufsize);
+	date_string(now, offset, out);
 }
 
 /*
diff --git a/decorate.c b/decorate.c
index 7cb5d29..b2aac90 100644
--- a/decorate.c
+++ b/decorate.c
@@ -8,10 +8,7 @@
 
 static unsigned int hash_obj(const struct object *obj, unsigned int n)
 {
-	unsigned int hash;
-
-	memcpy(&hash, obj->sha1, sizeof(unsigned int));
-	return hash % n;
+	return sha1hash(obj->sha1) % n;
 }
 
 static void *insert_decoration(struct decoration *n, const struct object *base, void *decoration)
diff --git a/diff.c b/diff.c
index 3f1f08f..d1bd534 100644
--- a/diff.c
+++ b/diff.c
@@ -52,23 +52,23 @@
 	GIT_COLOR_NORMAL,	/* FUNCINFO */
 };
 
-static int parse_diff_color_slot(const char *var, int ofs)
+static int parse_diff_color_slot(const char *var)
 {
-	if (!strcasecmp(var+ofs, "plain"))
+	if (!strcasecmp(var, "plain"))
 		return DIFF_PLAIN;
-	if (!strcasecmp(var+ofs, "meta"))
+	if (!strcasecmp(var, "meta"))
 		return DIFF_METAINFO;
-	if (!strcasecmp(var+ofs, "frag"))
+	if (!strcasecmp(var, "frag"))
 		return DIFF_FRAGINFO;
-	if (!strcasecmp(var+ofs, "old"))
+	if (!strcasecmp(var, "old"))
 		return DIFF_FILE_OLD;
-	if (!strcasecmp(var+ofs, "new"))
+	if (!strcasecmp(var, "new"))
 		return DIFF_FILE_NEW;
-	if (!strcasecmp(var+ofs, "commit"))
+	if (!strcasecmp(var, "commit"))
 		return DIFF_COMMIT;
-	if (!strcasecmp(var+ofs, "whitespace"))
+	if (!strcasecmp(var, "whitespace"))
 		return DIFF_WHITESPACE;
-	if (!strcasecmp(var+ofs, "func"))
+	if (!strcasecmp(var, "func"))
 		return DIFF_FUNCINFO;
 	return -1;
 }
@@ -231,6 +231,8 @@
 
 int git_diff_basic_config(const char *var, const char *value, void *cb)
 {
+	const char *name;
+
 	if (!strcmp(var, "diff.renamelimit")) {
 		diff_rename_limit_default = git_config_int(var, value);
 		return 0;
@@ -239,14 +241,14 @@
 	if (userdiff_config(var, value) < 0)
 		return -1;
 
-	if (starts_with(var, "diff.color.") || starts_with(var, "color.diff.")) {
-		int slot = parse_diff_color_slot(var, 11);
+	if (skip_prefix(var, "diff.color.", &name) ||
+	    skip_prefix(var, "color.diff.", &name)) {
+		int slot = parse_diff_color_slot(name);
 		if (slot < 0)
 			return 0;
 		if (!value)
 			return config_error_nonbool(var);
-		color_parse(value, var, diff_colors[slot]);
-		return 0;
+		return color_parse(value, diff_colors[slot]);
 	}
 
 	/* like GNU diff's --suppress-blank-empty option  */
@@ -373,7 +375,7 @@
 {
 	if (!DIFF_FILE_VALID(one))
 		return 0;
-	diff_populate_filespec(one, 1);
+	diff_populate_filespec(one, CHECK_SIZE_ONLY);
 	return one->size;
 }
 
@@ -522,9 +524,9 @@
 	ep += 2; /* skip over @@ */
 
 	/* The hunk header in fraginfo color */
-	strbuf_add(&msgbuf, frag, strlen(frag));
+	strbuf_addstr(&msgbuf, frag);
 	strbuf_add(&msgbuf, line, ep - line);
-	strbuf_add(&msgbuf, reset, strlen(reset));
+	strbuf_addstr(&msgbuf, reset);
 
 	/*
 	 * trailing "\r\n"
@@ -538,15 +540,15 @@
 		if (*ep != ' ' && *ep != '\t')
 			break;
 	if (ep != cp) {
-		strbuf_add(&msgbuf, plain, strlen(plain));
+		strbuf_addstr(&msgbuf, plain);
 		strbuf_add(&msgbuf, cp, ep - cp);
-		strbuf_add(&msgbuf, reset, strlen(reset));
+		strbuf_addstr(&msgbuf, reset);
 	}
 
 	if (ep < line + len) {
-		strbuf_add(&msgbuf, func, strlen(func));
+		strbuf_addstr(&msgbuf, func);
 		strbuf_add(&msgbuf, ep, line + len - ep);
-		strbuf_add(&msgbuf, reset, strlen(reset));
+		strbuf_addstr(&msgbuf, reset);
 	}
 
 	strbuf_add(&msgbuf, line + len, org_len - len);
@@ -1907,11 +1909,11 @@
 			diff_free_filespec_data(p->one);
 			diff_free_filespec_data(p->two);
 		} else if (DIFF_FILE_VALID(p->one)) {
-			diff_populate_filespec(p->one, 1);
+			diff_populate_filespec(p->one, CHECK_SIZE_ONLY);
 			copied = added = 0;
 			diff_free_filespec_data(p->one);
 		} else if (DIFF_FILE_VALID(p->two)) {
-			diff_populate_filespec(p->two, 1);
+			diff_populate_filespec(p->two, CHECK_SIZE_ONLY);
 			copied = 0;
 			added = p->two->size;
 			diff_free_filespec_data(p->two);
@@ -2185,8 +2187,8 @@
 			one->is_binary = one->driver->binary;
 		else {
 			if (!one->data && DIFF_FILE_VALID(one))
-				diff_populate_filespec(one, 0);
-			if (one->data)
+				diff_populate_filespec(one, CHECK_BINARY);
+			if (one->is_binary == -1 && one->data)
 				one->is_binary = buffer_is_binary(one->data,
 						one->size);
 			if (one->is_binary == -1)
@@ -2321,6 +2323,19 @@
 	} else if (!DIFF_OPT_TST(o, TEXT) &&
 	    ( (!textconv_one && diff_filespec_is_binary(one)) ||
 	      (!textconv_two && diff_filespec_is_binary(two)) )) {
+		if (!one->data && !two->data &&
+		    S_ISREG(one->mode) && S_ISREG(two->mode) &&
+		    !DIFF_OPT_TST(o, BINARY)) {
+			if (!hashcmp(one->sha1, two->sha1)) {
+				if (must_show_header)
+					fprintf(o->file, "%s", header.buf);
+				goto free_ab_and_return;
+			}
+			fprintf(o->file, "%s", header.buf);
+			fprintf(o->file, "%sBinary files %s and %s differ\n",
+				line_prefix, lbl[0], lbl[1]);
+			goto free_ab_and_return;
+		}
 		if (fill_mmfile(&mf1, one) < 0 || fill_mmfile(&mf2, two) < 0)
 			die("unable to read files to diff");
 		/* Quite common confusing case */
@@ -2341,6 +2356,7 @@
 	} else {
 		/* Crazy xdl interfaces.. */
 		const char *diffopts = getenv("GIT_DIFF_OPTS");
+		const char *v;
 		xpparam_t xpp;
 		xdemitconf_t xecfg;
 		struct emit_callback ecbdata;
@@ -2379,10 +2395,10 @@
 			xdiff_set_find_func(&xecfg, pe->pattern, pe->cflags);
 		if (!diffopts)
 			;
-		else if (starts_with(diffopts, "--unified="))
-			xecfg.ctxlen = strtoul(diffopts + 10, NULL, 10);
-		else if (starts_with(diffopts, "-u"))
-			xecfg.ctxlen = strtoul(diffopts + 2, NULL, 10);
+		else if (skip_prefix(diffopts, "--unified=", &v))
+			xecfg.ctxlen = strtoul(v, NULL, 10);
+		else if (skip_prefix(diffopts, "-u", &v))
+			xecfg.ctxlen = strtoul(v, NULL, 10);
 		if (o->word_diff)
 			init_diff_words_data(&ecbdata, o, one, two);
 		xdi_diff_outf(&mf1, &mf2, fn_out_consume, &ecbdata,
@@ -2664,8 +2680,9 @@
  * grab the data for the blob (or file) for our own in-core comparison.
  * diff_filespec has data and size fields for this purpose.
  */
-int diff_populate_filespec(struct diff_filespec *s, int size_only)
+int diff_populate_filespec(struct diff_filespec *s, unsigned int flags)
 {
+	int size_only = flags & CHECK_SIZE_ONLY;
 	int err = 0;
 	/*
 	 * demote FAIL to WARN to allow inspecting the situation
@@ -2720,6 +2737,11 @@
 		}
 		if (size_only)
 			return 0;
+		if ((flags & CHECK_BINARY) &&
+		    s->size > big_file_threshold && s->is_binary == -1) {
+			s->is_binary = 1;
+			return 0;
+		}
 		fd = open(s->path, O_RDONLY);
 		if (fd < 0)
 			goto err_empty;
@@ -2741,16 +2763,21 @@
 	}
 	else {
 		enum object_type type;
-		if (size_only) {
+		if (size_only || (flags & CHECK_BINARY)) {
 			type = sha1_object_info(s->sha1, &s->size);
 			if (type < 0)
 				die("unable to read %s", sha1_to_hex(s->sha1));
-		} else {
-			s->data = read_sha1_file(s->sha1, &type, &s->size);
-			if (!s->data)
-				die("unable to read %s", sha1_to_hex(s->sha1));
-			s->should_free = 1;
+			if (size_only)
+				return 0;
+			if (s->size > big_file_threshold && s->is_binary == -1) {
+				s->is_binary = 1;
+				return 0;
+			}
 		}
+		s->data = read_sha1_file(s->sha1, &type, &s->size);
+		if (!s->data)
+			die("unable to read %s", sha1_to_hex(s->sha1));
+		s->should_free = 1;
 	}
 	return 0;
 }
@@ -2880,6 +2907,16 @@
 	return temp;
 }
 
+static void add_external_diff_name(struct argv_array *argv,
+				   const char *name,
+				   struct diff_filespec *df)
+{
+	struct diff_tempfile *temp = prepare_temp_file(name, df);
+	argv_array_push(argv, temp->name);
+	argv_array_push(argv, temp->hex);
+	argv_array_push(argv, temp->mode);
+}
+
 /* An external diff command takes:
  *
  * diff-cmd name infile1 infile1-sha1 infile1-mode \
@@ -2896,48 +2933,32 @@
 			      struct diff_options *o)
 {
 	struct argv_array argv = ARGV_ARRAY_INIT;
-	int retval;
+	struct argv_array env = ARGV_ARRAY_INIT;
 	struct diff_queue_struct *q = &diff_queued_diff;
-	const char *env[3] = { NULL };
-	char env_counter[50];
-	char env_total[50];
+
+	argv_array_push(&argv, pgm);
+	argv_array_push(&argv, name);
 
 	if (one && two) {
-		struct diff_tempfile *temp_one, *temp_two;
-		const char *othername = (other ? other : name);
-		temp_one = prepare_temp_file(name, one);
-		temp_two = prepare_temp_file(othername, two);
-		argv_array_push(&argv, pgm);
-		argv_array_push(&argv, name);
-		argv_array_push(&argv, temp_one->name);
-		argv_array_push(&argv, temp_one->hex);
-		argv_array_push(&argv, temp_one->mode);
-		argv_array_push(&argv, temp_two->name);
-		argv_array_push(&argv, temp_two->hex);
-		argv_array_push(&argv, temp_two->mode);
-		if (other) {
+		add_external_diff_name(&argv, name, one);
+		if (!other)
+			add_external_diff_name(&argv, name, two);
+		else {
+			add_external_diff_name(&argv, other, two);
 			argv_array_push(&argv, other);
 			argv_array_push(&argv, xfrm_msg);
 		}
-	} else {
-		argv_array_push(&argv, pgm);
-		argv_array_push(&argv, name);
 	}
-	fflush(NULL);
 
-	env[0] = env_counter;
-	snprintf(env_counter, sizeof(env_counter), "GIT_DIFF_PATH_COUNTER=%d",
-		 ++o->diff_path_counter);
-	env[1] = env_total;
-	snprintf(env_total, sizeof(env_total), "GIT_DIFF_PATH_TOTAL=%d", q->nr);
+	argv_array_pushf(&env, "GIT_DIFF_PATH_COUNTER=%d", ++o->diff_path_counter);
+	argv_array_pushf(&env, "GIT_DIFF_PATH_TOTAL=%d", q->nr);
 
-	retval = run_command_v_opt_cd_env(argv.argv, RUN_USING_SHELL, NULL, env);
+	if (run_command_v_opt_cd_env(argv.argv, RUN_USING_SHELL, NULL, env.argv))
+		die(_("external diff died, stopping at %s"), name);
+
 	remove_tempfile();
 	argv_array_clear(&argv);
-	if (retval) {
-		fprintf(stderr, "external diff died, stopping at %s.\n", name);
-		exit(1);
-	}
+	argv_array_clear(&env);
 }
 
 static int similarity_index(struct diff_filepair *p)
@@ -3205,6 +3226,7 @@
 	options->context = diff_context_default;
 	DIFF_OPT_SET(options, RENAME_EMPTY);
 
+	/* pathchange left =NULL by default */
 	options->change = diff_change;
 	options->add_remove = diff_addremove;
 	options->use_color = diff_use_color_default;
@@ -3396,12 +3418,10 @@
 		   const char **optarg)
 {
 	const char *arg = argv[0];
-	if (arg[0] != '-' || arg[1] != '-')
+	if (!skip_prefix(arg, "--", &arg))
 		return 0;
-	arg += strlen("--");
-	if (!starts_with(arg, opt))
+	if (!skip_prefix(arg, opt, &arg))
 		return 0;
-	arg += strlen(opt);
 	if (*arg == '=') { /* stuck form: --option=value */
 		*optarg = arg + 1;
 		return 1;
@@ -3425,13 +3445,13 @@
 	int count = options->stat_count;
 	int argcount = 1;
 
-	arg += strlen("--stat");
+	if (!skip_prefix(arg, "--stat", &arg))
+		die("BUG: stat option does not begin with --stat: %s", arg);
 	end = (char *)arg;
 
 	switch (*arg) {
 	case '-':
-		if (starts_with(arg, "-width")) {
-			arg += strlen("-width");
+		if (skip_prefix(arg, "-width", &arg)) {
 			if (*arg == '=')
 				width = strtoul(arg + 1, &end, 10);
 			else if (!*arg && !av[1])
@@ -3440,8 +3460,7 @@
 				width = strtoul(av[1], &end, 10);
 				argcount = 2;
 			}
-		} else if (starts_with(arg, "-name-width")) {
-			arg += strlen("-name-width");
+		} else if (skip_prefix(arg, "-name-width", &arg)) {
 			if (*arg == '=')
 				name_width = strtoul(arg + 1, &end, 10);
 			else if (!*arg && !av[1])
@@ -3450,8 +3469,7 @@
 				name_width = strtoul(av[1], &end, 10);
 				argcount = 2;
 			}
-		} else if (starts_with(arg, "-graph-width")) {
-			arg += strlen("-graph-width");
+		} else if (skip_prefix(arg, "-graph-width", &arg)) {
 			if (*arg == '=')
 				graph_width = strtoul(arg + 1, &end, 10);
 			else if (!*arg && !av[1])
@@ -3460,8 +3478,7 @@
 				graph_width = strtoul(av[1], &end, 10);
 				argcount = 2;
 			}
-		} else if (starts_with(arg, "-count")) {
-			arg += strlen("-count");
+		} else if (skip_prefix(arg, "-count", &arg)) {
 			if (*arg == '=')
 				count = strtoul(arg + 1, &end, 10);
 			else if (!*arg && !av[1])
@@ -3614,17 +3631,17 @@
 		options->output_format |= DIFF_FORMAT_SHORTSTAT;
 	else if (!strcmp(arg, "-X") || !strcmp(arg, "--dirstat"))
 		return parse_dirstat_opt(options, "");
-	else if (starts_with(arg, "-X"))
-		return parse_dirstat_opt(options, arg + 2);
-	else if (starts_with(arg, "--dirstat="))
-		return parse_dirstat_opt(options, arg + 10);
+	else if (skip_prefix(arg, "-X", &arg))
+		return parse_dirstat_opt(options, arg);
+	else if (skip_prefix(arg, "--dirstat=", &arg))
+		return parse_dirstat_opt(options, arg);
 	else if (!strcmp(arg, "--cumulative"))
 		return parse_dirstat_opt(options, "cumulative");
 	else if (!strcmp(arg, "--dirstat-by-file"))
 		return parse_dirstat_opt(options, "files");
-	else if (starts_with(arg, "--dirstat-by-file=")) {
+	else if (skip_prefix(arg, "--dirstat-by-file=", &arg)) {
 		parse_dirstat_opt(options, "files");
-		return parse_dirstat_opt(options, arg + 18);
+		return parse_dirstat_opt(options, arg);
 	}
 	else if (!strcmp(arg, "--check"))
 		options->output_format |= DIFF_FORMAT_CHECKDIFF;
@@ -3674,9 +3691,9 @@
 		DIFF_OPT_CLR(options, RENAME_EMPTY);
 	else if (!strcmp(arg, "--relative"))
 		DIFF_OPT_SET(options, RELATIVE_NAME);
-	else if (starts_with(arg, "--relative=")) {
+	else if (skip_prefix(arg, "--relative=", &arg)) {
 		DIFF_OPT_SET(options, RELATIVE_NAME);
-		options->prefix = arg + 11;
+		options->prefix = arg;
 	}
 
 	/* xdiff options */
@@ -3727,8 +3744,8 @@
 		DIFF_OPT_CLR(options, FOLLOW_RENAMES);
 	else if (!strcmp(arg, "--color"))
 		options->use_color = 1;
-	else if (starts_with(arg, "--color=")) {
-		int value = git_config_colorbool(NULL, arg+8);
+	else if (skip_prefix(arg, "--color=", &arg)) {
+		int value = git_config_colorbool(NULL, arg);
 		if (value < 0)
 			return error("option `color' expects \"always\", \"auto\", or \"never\"");
 		options->use_color = value;
@@ -3739,29 +3756,28 @@
 		options->use_color = 1;
 		options->word_diff = DIFF_WORDS_COLOR;
 	}
-	else if (starts_with(arg, "--color-words=")) {
+	else if (skip_prefix(arg, "--color-words=", &arg)) {
 		options->use_color = 1;
 		options->word_diff = DIFF_WORDS_COLOR;
-		options->word_regex = arg + 14;
+		options->word_regex = arg;
 	}
 	else if (!strcmp(arg, "--word-diff")) {
 		if (options->word_diff == DIFF_WORDS_NONE)
 			options->word_diff = DIFF_WORDS_PLAIN;
 	}
-	else if (starts_with(arg, "--word-diff=")) {
-		const char *type = arg + 12;
-		if (!strcmp(type, "plain"))
+	else if (skip_prefix(arg, "--word-diff=", &arg)) {
+		if (!strcmp(arg, "plain"))
 			options->word_diff = DIFF_WORDS_PLAIN;
-		else if (!strcmp(type, "color")) {
+		else if (!strcmp(arg, "color")) {
 			options->use_color = 1;
 			options->word_diff = DIFF_WORDS_COLOR;
 		}
-		else if (!strcmp(type, "porcelain"))
+		else if (!strcmp(arg, "porcelain"))
 			options->word_diff = DIFF_WORDS_PORCELAIN;
-		else if (!strcmp(type, "none"))
+		else if (!strcmp(arg, "none"))
 			options->word_diff = DIFF_WORDS_NONE;
 		else
-			die("bad --word-diff argument: %s", type);
+			die("bad --word-diff argument: %s", arg);
 	}
 	else if ((argcount = parse_long_opt("word-diff-regex", av, &optarg))) {
 		if (options->word_diff == DIFF_WORDS_NONE)
@@ -3784,13 +3800,13 @@
 	else if (!strcmp(arg, "--ignore-submodules")) {
 		DIFF_OPT_SET(options, OVERRIDE_SUBMODULE_CONFIG);
 		handle_ignore_submodules_arg(options, "all");
-	} else if (starts_with(arg, "--ignore-submodules=")) {
+	} else if (skip_prefix(arg, "--ignore-submodules=", &arg)) {
 		DIFF_OPT_SET(options, OVERRIDE_SUBMODULE_CONFIG);
-		handle_ignore_submodules_arg(options, arg + 20);
+		handle_ignore_submodules_arg(options, arg);
 	} else if (!strcmp(arg, "--submodule"))
 		DIFF_OPT_SET(options, SUBMODULE_LOG);
-	else if (starts_with(arg, "--submodule="))
-		return parse_submodule_opt(options, arg + 12);
+	else if (skip_prefix(arg, "--submodule=", &arg))
+		return parse_submodule_opt(options, arg);
 
 	/* misc options */
 	else if (!strcmp(arg, "-z"))
@@ -3825,8 +3841,8 @@
 	}
 	else if (!strcmp(arg, "--abbrev"))
 		options->abbrev = DEFAULT_ABBREV;
-	else if (starts_with(arg, "--abbrev=")) {
-		options->abbrev = strtoul(arg + 9, NULL, 10);
+	else if (skip_prefix(arg, "--abbrev=", &arg)) {
+		options->abbrev = strtoul(arg, NULL, 10);
 		if (options->abbrev < MINIMUM_ABBREV)
 			options->abbrev = MINIMUM_ABBREV;
 		else if (40 < options->abbrev)
@@ -3907,16 +3923,13 @@
 	cmd = *opt++;
 	if (cmd == '-') {
 		/* convert the long-form arguments into short-form versions */
-		if (starts_with(opt, "break-rewrites")) {
-			opt += strlen("break-rewrites");
+		if (skip_prefix(opt, "break-rewrites", &opt)) {
 			if (*opt == 0 || *opt++ == '=')
 				cmd = 'B';
-		} else if (starts_with(opt, "find-copies")) {
-			opt += strlen("find-copies");
+		} else if (skip_prefix(opt, "find-copies", &opt)) {
 			if (*opt == 0 || *opt++ == '=')
 				cmd = 'C';
-		} else if (starts_with(opt, "find-renames")) {
-			opt += strlen("find-renames");
+		} else if (skip_prefix(opt, "find-renames", &opt)) {
 			if (*opt == 0 || *opt++ == '=')
 				cmd = 'M';
 		}
@@ -4698,8 +4711,8 @@
 	    !DIFF_FILE_VALID(p->two) ||
 	    (p->one->sha1_valid && p->two->sha1_valid) ||
 	    (p->one->mode != p->two->mode) ||
-	    diff_populate_filespec(p->one, 1) ||
-	    diff_populate_filespec(p->two, 1) ||
+	    diff_populate_filespec(p->one, CHECK_SIZE_ONLY) ||
+	    diff_populate_filespec(p->two, CHECK_SIZE_ONLY) ||
 	    (p->one->size != p->two->size) ||
 	    !diff_filespec_is_identical(p->one, p->two)) /* (2) */
 		p->skip_stat_unmatch_result = 1;
@@ -4752,6 +4765,7 @@
 
 void diffcore_std(struct diff_options *options)
 {
+	/* NOTE please keep the following in sync with diff_tree_combined() */
 	if (options->skip_stat_unmatch)
 		diffcore_skip_stat_unmatch(options);
 	if (!options->found_follow) {
@@ -4940,7 +4954,7 @@
 	struct diff_tempfile *temp;
 	const char *argv[3];
 	const char **arg = argv;
-	struct child_process child;
+	struct child_process child = CHILD_PROCESS_INIT;
 	struct strbuf buf = STRBUF_INIT;
 	int err = 0;
 
@@ -4949,7 +4963,6 @@
 	*arg++ = temp->name;
 	*arg = NULL;
 
-	memset(&child, 0, sizeof(child));
 	child.use_shell = 1;
 	child.argv = argv;
 	child.out = -1;
diff --git a/diff.h b/diff.h
index a24a767..b4a624d 100644
--- a/diff.h
+++ b/diff.h
@@ -15,6 +15,10 @@
 struct userdiff_driver;
 struct sha1_array;
 struct commit;
+struct combine_diff_path;
+
+typedef int (*pathchange_fn_t)(struct diff_options *options,
+		 struct combine_diff_path *path);
 
 typedef void (*change_fn_t)(struct diff_options *options,
 		 unsigned old_mode, unsigned new_mode,
@@ -157,6 +161,7 @@
 	int close_file;
 
 	struct pathspec pathspec;
+	pathchange_fn_t pathchange;
 	change_fn_t change;
 	add_remove_fn_t add_remove;
 	diff_format_fn_t format_callback;
@@ -189,8 +194,10 @@
 
 extern const char mime_boundary_leader[];
 
-extern int diff_tree(struct tree_desc *t1, struct tree_desc *t2,
-		     const char *base, struct diff_options *opt);
+extern struct combine_diff_path *diff_tree_paths(
+	struct combine_diff_path *p, const unsigned char *sha1,
+	const unsigned char **parent_sha1, int nparent,
+	struct strbuf *base, struct diff_options *opt);
 extern int diff_tree_sha1(const unsigned char *old, const unsigned char *new,
 			  const char *base, struct diff_options *opt);
 extern int diff_root_tree_sha1(const unsigned char *new, const char *base,
diff --git a/diffcore-rename.c b/diffcore-rename.c
index 749a35d..4e132f1 100644
--- a/diffcore-rename.c
+++ b/diffcore-rename.c
@@ -147,9 +147,11 @@
 	 * is a possible size - we really should have a flag to
 	 * say whether the size is valid or not!)
 	 */
-	if (!src->cnt_data && diff_populate_filespec(src, 1))
+	if (!src->cnt_data &&
+	    diff_populate_filespec(src, CHECK_SIZE_ONLY))
 		return 0;
-	if (!dst->cnt_data && diff_populate_filespec(dst, 1))
+	if (!dst->cnt_data &&
+	    diff_populate_filespec(dst, CHECK_SIZE_ONLY))
 		return 0;
 
 	max_size = ((src->size > dst->size) ? src->size : dst->size);
@@ -242,14 +244,12 @@
 
 static unsigned int hash_filespec(struct diff_filespec *filespec)
 {
-	unsigned int hash;
 	if (!filespec->sha1_valid) {
 		if (diff_populate_filespec(filespec, 0))
 			return 0;
 		hash_sha1_file(filespec->data, filespec->size, "blob", filespec->sha1);
 	}
-	memcpy(&hash, filespec->sha1, sizeof(hash));
-	return hash;
+	return sha1hash(filespec->sha1);
 }
 
 static int find_identical_files(struct hashmap *srcs,
@@ -259,15 +259,14 @@
 	int renames = 0;
 
 	struct diff_filespec *target = rename_dst[dst_index].two;
-	struct file_similarity *p, *best, dst;
+	struct file_similarity *p, *best = NULL;
 	int i = 100, best_score = -1;
 
 	/*
 	 * Find the best source match for specified destination.
 	 */
-	best = NULL;
-	hashmap_entry_init(&dst, hash_filespec(target));
-	for (p = hashmap_get(srcs, &dst, NULL); p; p = hashmap_get_next(srcs, p)) {
+	p = hashmap_get_from_hash(srcs, hash_filespec(target), NULL);
+	for (; p; p = hashmap_get_next(srcs, p)) {
 		int score;
 		struct diff_filespec *source = p->filespec;
 
diff --git a/diffcore.h b/diffcore.h
index c876dac..33ea2de 100644
--- a/diffcore.h
+++ b/diffcore.h
@@ -55,7 +55,9 @@
 extern void fill_filespec(struct diff_filespec *, const unsigned char *,
 			  int, unsigned short);
 
-extern int diff_populate_filespec(struct diff_filespec *, int);
+#define CHECK_SIZE_ONLY 1
+#define CHECK_BINARY    2
+extern int diff_populate_filespec(struct diff_filespec *, unsigned int);
 extern void diff_free_filespec_data(struct diff_filespec *);
 extern void diff_free_filespec_blob(struct diff_filespec *);
 extern int diff_filespec_is_binary(struct diff_filespec *);
diff --git a/dir.c b/dir.c
index 797805d..3f7a025 100644
--- a/dir.c
+++ b/dir.c
@@ -557,8 +557,7 @@
 			buf = xrealloc(buf, size+1);
 			buf[size++] = '\n';
 		}
-	}
-	else {
+	} else {
 		size = xsize_t(st.st_size);
 		if (size == 0) {
 			close(fd);
@@ -793,17 +792,19 @@
 
 	group = &dir->exclude_list_group[EXC_DIRS];
 
-	/* Pop the exclude lists from the EXCL_DIRS exclude_list_group
+	/*
+	 * Pop the exclude lists from the EXCL_DIRS exclude_list_group
 	 * which originate from directories not in the prefix of the
-	 * path being checked. */
+	 * path being checked.
+	 */
 	while ((stk = dir->exclude_stack) != NULL) {
 		if (stk->baselen <= baselen &&
-		    !strncmp(dir->basebuf, base, stk->baselen))
+		    !strncmp(dir->basebuf.buf, base, stk->baselen))
 			break;
 		el = &group->el[dir->exclude_stack->exclude_ix];
 		dir->exclude_stack = stk->prev;
 		dir->exclude = NULL;
-		free((char *)el->src); /* see strdup() below */
+		free((char *)el->src); /* see strbuf_detach() below */
 		clear_exclude_list(el);
 		free(stk);
 		group->nr--;
@@ -813,17 +814,25 @@
 	if (dir->exclude)
 		return;
 
+	/*
+	 * Lazy initialization. All call sites currently just
+	 * memset(dir, 0, sizeof(*dir)) before use. Changing all of
+	 * them seems lots of work for little benefit.
+	 */
+	if (!dir->basebuf.buf)
+		strbuf_init(&dir->basebuf, PATH_MAX);
+
 	/* Read from the parent directories and push them down. */
 	current = stk ? stk->baselen : -1;
+	strbuf_setlen(&dir->basebuf, current < 0 ? 0 : current);
 	while (current < baselen) {
-		struct exclude_stack *stk = xcalloc(1, sizeof(*stk));
 		const char *cp;
 
+		stk = xcalloc(1, sizeof(*stk));
 		if (current < 0) {
 			cp = base;
 			current = 0;
-		}
-		else {
+		} else {
 			cp = strchr(base + current + 1, '/');
 			if (!cp)
 				die("oops in prep_exclude");
@@ -833,48 +842,47 @@
 		stk->baselen = cp - base;
 		stk->exclude_ix = group->nr;
 		el = add_exclude_list(dir, EXC_DIRS, NULL);
-		memcpy(dir->basebuf + current, base + current,
-		       stk->baselen - current);
+		strbuf_add(&dir->basebuf, base + current, stk->baselen - current);
+		assert(stk->baselen == dir->basebuf.len);
 
 		/* Abort if the directory is excluded */
 		if (stk->baselen) {
 			int dt = DT_DIR;
-			dir->basebuf[stk->baselen - 1] = 0;
+			dir->basebuf.buf[stk->baselen - 1] = 0;
 			dir->exclude = last_exclude_matching_from_lists(dir,
-				dir->basebuf, stk->baselen - 1,
-				dir->basebuf + current, &dt);
-			dir->basebuf[stk->baselen - 1] = '/';
+				dir->basebuf.buf, stk->baselen - 1,
+				dir->basebuf.buf + current, &dt);
+			dir->basebuf.buf[stk->baselen - 1] = '/';
 			if (dir->exclude &&
 			    dir->exclude->flags & EXC_FLAG_NEGATIVE)
 				dir->exclude = NULL;
 			if (dir->exclude) {
-				dir->basebuf[stk->baselen] = 0;
 				dir->exclude_stack = stk;
 				return;
 			}
 		}
 
-		/* Try to read per-directory file unless path is too long */
-		if (dir->exclude_per_dir &&
-		    stk->baselen + strlen(dir->exclude_per_dir) < PATH_MAX) {
-			strcpy(dir->basebuf + stk->baselen,
-					dir->exclude_per_dir);
+		/* Try to read per-directory file */
+		if (dir->exclude_per_dir) {
 			/*
 			 * dir->basebuf gets reused by the traversal, but we
 			 * need fname to remain unchanged to ensure the src
 			 * member of each struct exclude correctly
 			 * back-references its source file.  Other invocations
 			 * of add_exclude_list provide stable strings, so we
-			 * strdup() and free() here in the caller.
+			 * strbuf_detach() and free() here in the caller.
 			 */
-			el->src = strdup(dir->basebuf);
-			add_excludes_from_file_to_list(dir->basebuf,
-					dir->basebuf, stk->baselen, el, 1);
+			struct strbuf sb = STRBUF_INIT;
+			strbuf_addbuf(&sb, &dir->basebuf);
+			strbuf_addstr(&sb, dir->exclude_per_dir);
+			el->src = strbuf_detach(&sb, NULL);
+			add_excludes_from_file_to_list(el->src, el->src,
+						       stk->baselen, el, 1);
 		}
 		dir->exclude_stack = stk;
 		current = stk->baselen;
 	}
-	dir->basebuf[baselen] = '\0';
+	strbuf_setlen(&dir->basebuf, baselen);
 }
 
 /*
@@ -1354,8 +1362,7 @@
 	const struct dir_entry *e1 = *(const struct dir_entry **)p1;
 	const struct dir_entry *e2 = *(const struct dir_entry **)p2;
 
-	return cache_name_compare(e1->name, e1->len,
-				  e2->name, e2->len);
+	return name_compare(e1->name, e1->len, e2->name, e2->len);
 }
 
 static struct path_simplify *create_simplify(const char **pathspec)
@@ -1500,12 +1507,16 @@
 
 int is_inside_dir(const char *dir)
 {
-	char cwd[PATH_MAX];
+	char *cwd;
+	int rc;
+
 	if (!dir)
 		return 0;
-	if (!getcwd(cwd, sizeof(cwd)))
-		die_errno("can't find the current directory");
-	return dir_inside_of(cwd, dir) >= 0;
+
+	cwd = xgetcwd();
+	rc = (dir_inside_of(cwd, dir) >= 0);
+	free(cwd);
+	return rc;
 }
 
 int is_empty_dir(const char *path)
@@ -1672,4 +1683,5 @@
 		free(stk);
 		stk = prev;
 	}
+	strbuf_release(&dir->basebuf);
 }
diff --git a/dir.h b/dir.h
index 55e5345..6c45e9d 100644
--- a/dir.h
+++ b/dir.h
@@ -15,6 +15,27 @@
 #define EXC_FLAG_MUSTBEDIR 8
 #define EXC_FLAG_NEGATIVE 16
 
+struct exclude {
+	/*
+	 * This allows callers of last_exclude_matching() etc.
+	 * to determine the origin of the matching pattern.
+	 */
+	struct exclude_list *el;
+
+	const char *pattern;
+	int patternlen;
+	int nowildcardlen;
+	const char *base;
+	int baselen;
+	int flags;
+
+	/*
+	 * Counting starts from 1 for line numbers in ignore files,
+	 * and from -1 decrementing for patterns from CLI args.
+	 */
+	int srcpos;
+};
+
 /*
  * Each excludes file will be parsed into a fresh exclude_list which
  * is appended to the relevant exclude_list_group (either EXC_DIRS or
@@ -32,26 +53,7 @@
 	/* origin of list, e.g. path to filename, or descriptive string */
 	const char *src;
 
-	struct exclude {
-		/*
-		 * This allows callers of last_exclude_matching() etc.
-		 * to determine the origin of the matching pattern.
-		 */
-		struct exclude_list *el;
-
-		const char *pattern;
-		int patternlen;
-		int nowildcardlen;
-		const char *base;
-		int baselen;
-		int flags;
-
-		/*
-		 * Counting starts from 1 for line numbers in ignore files,
-		 * and from -1 decrementing for patterns from CLI args.
-		 */
-		int srcpos;
-	} **excludes;
+	struct exclude **excludes;
 };
 
 /*
@@ -117,7 +119,7 @@
 	 */
 	struct exclude_stack *exclude_stack;
 	struct exclude *exclude;
-	char basebuf[PATH_MAX];
+	struct strbuf basebuf;
 };
 
 /*
diff --git a/editor.c b/editor.c
index 0abbd8d..01c644c 100644
--- a/editor.c
+++ b/editor.c
@@ -38,10 +38,9 @@
 
 	if (strcmp(editor, ":")) {
 		const char *args[] = { editor, real_path(path), NULL };
-		struct child_process p;
+		struct child_process p = CHILD_PROCESS_INIT;
 		int ret, sig;
 
-		memset(&p, 0, sizeof(p));
 		p.argv = args;
 		p.env = env;
 		p.use_shell = 1;
diff --git a/entry.c b/entry.c
index 77c6882..1eda8e9 100644
--- a/entry.c
+++ b/entry.c
@@ -210,9 +210,12 @@
 
 finish:
 	if (state->refresh_cache) {
+		assert(state->istate);
 		if (!fstat_done)
 			lstat(ce->name, &st);
 		fill_stat_cache_info(ce, &st);
+		ce->ce_flags |= CE_UPDATE_IN_BASE;
+		state->istate->cache_changed |= CE_ENTRY_CHANGED;
 	}
 	return 0;
 }
diff --git a/environment.c b/environment.c
index 5c4815d..565f652 100644
--- a/environment.c
+++ b/environment.c
@@ -37,7 +37,7 @@
 int fsync_object_files;
 size_t packed_git_window_size = DEFAULT_PACKED_GIT_WINDOW_SIZE;
 size_t packed_git_limit = DEFAULT_PACKED_GIT_LIMIT;
-size_t delta_base_cache_limit = 16 * 1024 * 1024;
+size_t delta_base_cache_limit = 96 * 1024 * 1024;
 unsigned long big_file_threshold = 512 * 1024 * 1024;
 const char *pager_program;
 int pager_use_color = 1;
@@ -69,9 +69,10 @@
  * that is subject to stripspace.
  */
 char comment_line_char = '#';
+int auto_comment_line_char;
 
 /* Parallel index stat data preload? */
-int core_preload_index = 0;
+int core_preload_index = 1;
 
 /* This is set by setup_git_dir_gently() and/or git_default_config() */
 char *git_work_tree_cfg;
@@ -123,6 +124,12 @@
 	return strbuf_detach(&buf, NULL);
 }
 
+static char *git_path_from_env(const char *envvar, const char *path)
+{
+	const char *value = getenv(envvar);
+	return value ? xstrdup(value) : git_pathdup("%s", path);
+}
+
 static void setup_git_env(void)
 {
 	const char *gitfile;
@@ -133,19 +140,9 @@
 		git_dir = DEFAULT_GIT_DIR_ENVIRONMENT;
 	gitfile = read_gitfile(git_dir);
 	git_dir = xstrdup(gitfile ? gitfile : git_dir);
-	git_object_dir = getenv(DB_ENVIRONMENT);
-	if (!git_object_dir) {
-		git_object_dir = xmalloc(strlen(git_dir) + 9);
-		sprintf(git_object_dir, "%s/objects", git_dir);
-	}
-	git_index_file = getenv(INDEX_ENVIRONMENT);
-	if (!git_index_file) {
-		git_index_file = xmalloc(strlen(git_dir) + 7);
-		sprintf(git_index_file, "%s/index", git_dir);
-	}
-	git_graft_file = getenv(GRAFT_ENVIRONMENT);
-	if (!git_graft_file)
-		git_graft_file = git_pathdup("info/grafts");
+	git_object_dir = git_path_from_env(DB_ENVIRONMENT, "objects");
+	git_index_file = git_path_from_env(INDEX_ENVIRONMENT, "index");
+	git_graft_file = git_path_from_env(GRAFT_ENVIRONMENT, "info/grafts");
 	if (getenv(NO_REPLACE_OBJECTS_ENVIRONMENT))
 		check_replace_refs = 0;
 	namespace = expand_namespace(getenv(GIT_NAMESPACE_ENVIRONMENT));
diff --git a/ewah/ewah_io.c b/ewah/ewah_io.c
index f7f700e..1c2d7af 100644
--- a/ewah/ewah_io.c
+++ b/ewah/ewah_io.c
@@ -110,9 +110,9 @@
 	return ewah_serialize_to(self, write_helper, (void *)(intptr_t)fd);
 }
 
-int ewah_read_mmap(struct ewah_bitmap *self, void *map, size_t len)
+int ewah_read_mmap(struct ewah_bitmap *self, const void *map, size_t len)
 {
-	uint8_t *ptr = map;
+	const uint8_t *ptr = map;
 	size_t i;
 
 	self->bit_size = get_be32(ptr);
diff --git a/ewah/ewok.h b/ewah/ewok.h
index 43adeb5..f6ad190 100644
--- a/ewah/ewok.h
+++ b/ewah/ewok.h
@@ -99,8 +99,7 @@
 int ewah_serialize_native(struct ewah_bitmap *self, int fd);
 
 int ewah_deserialize(struct ewah_bitmap *self, int fd);
-int ewah_read_mmap(struct ewah_bitmap *self, void *map, size_t len);
-int ewah_read_mmap_native(struct ewah_bitmap *self, void *map, size_t len);
+int ewah_read_mmap(struct ewah_bitmap *self, const void *map, size_t len);
 
 uint32_t ewah_checksum(struct ewah_bitmap *self);
 
diff --git a/exec_cmd.c b/exec_cmd.c
index 125fa6f..698e752 100644
--- a/exec_cmd.c
+++ b/exec_cmd.c
@@ -86,11 +86,7 @@
 static void add_path(struct strbuf *out, const char *path)
 {
 	if (path && *path) {
-		if (is_absolute_path(path))
-			strbuf_addstr(out, path);
-		else
-			strbuf_addstr(out, absolute_path(path));
-
+		strbuf_add_absolute_path(out, path);
 		strbuf_addch(out, PATH_SEP);
 	}
 }
diff --git a/fast-import.c b/fast-import.c
index fb4738d..d0bd285 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -153,6 +153,7 @@
 
 #include "builtin.h"
 #include "cache.h"
+#include "lockfile.h"
 #include "object.h"
 #include "blob.h"
 #include "tree.h"
@@ -248,6 +249,7 @@
 	uintmax_t last_commit;
 	uintmax_t num_notes;
 	unsigned active : 1;
+	unsigned delete : 1;
 	unsigned pack_id : PACK_ID_BITS;
 	unsigned char sha1[20];
 };
@@ -370,8 +372,8 @@
 static int cat_blob_fd = STDOUT_FILENO;
 
 static void parse_argv(void);
-static void parse_cat_blob(void);
-static void parse_ls(struct branch *b);
+static void parse_cat_blob(const char *p);
+static void parse_ls(const char *p, struct branch *b);
 
 static void write_branch_report(FILE *rpt, struct branch *b)
 {
@@ -877,7 +879,7 @@
 	pack_size = sizeof(hdr);
 	object_count = 0;
 
-	all_packs = xrealloc(all_packs, sizeof(*all_packs) * (pack_id + 1));
+	REALLOC_ARRAY(all_packs, pack_id + 1);
 	all_packs[pack_id] = p;
 }
 
@@ -945,10 +947,12 @@
 
 static void end_packfile(void)
 {
-	struct packed_git *old_p = pack_data, *new_p;
+	if (!pack_data)
+		return;
 
 	clear_delta_base_cache();
 	if (object_count) {
+		struct packed_git *new_p;
 		unsigned char cur_pack_sha1[20];
 		char *idx_name;
 		int i;
@@ -990,10 +994,11 @@
 		pack_id++;
 	}
 	else {
-		close(old_p->pack_fd);
-		unlink_or_warn(old_p->pack_name);
+		close(pack_data->pack_fd);
+		unlink_or_warn(pack_data->pack_name);
 	}
-	free(old_p);
+	free(pack_data);
+	pack_data = NULL;
 
 	/* We can't carry a delta across packfiles. */
 	strbuf_release(&last_blob.data);
@@ -1418,7 +1423,7 @@
 
 static void store_tree(struct tree_entry *root)
 {
-	struct tree_content *t = root->tree;
+	struct tree_content *t;
 	unsigned int i, j, del;
 	struct last_object lo = { STRBUF_INIT, 0, 0, /* no_swap */ 1 };
 	struct object_entry *le = NULL;
@@ -1426,6 +1431,10 @@
 	if (!is_null_sha1(root->versions[1].sha1))
 		return;
 
+	if (!root->tree)
+		load_tree(root);
+	t = root->tree;
+
 	for (i = 0; i < t->entry_count; i++) {
 		if (t->entries[i]->tree)
 			store_tree(t->entries[i]);
@@ -1678,36 +1687,44 @@
 static int update_branch(struct branch *b)
 {
 	static const char *msg = "fast-import";
-	struct ref_lock *lock;
+	struct ref_transaction *transaction;
 	unsigned char old_sha1[20];
+	struct strbuf err = STRBUF_INIT;
 
-	if (is_null_sha1(b->sha1))
-		return 0;
 	if (read_ref(b->name, old_sha1))
 		hashclr(old_sha1);
-	lock = lock_any_ref_for_update(b->name, old_sha1, 0, NULL);
-	if (!lock)
-		return error("Unable to lock %s", b->name);
+	if (is_null_sha1(b->sha1)) {
+		if (b->delete)
+			delete_ref(b->name, old_sha1, 0);
+		return 0;
+	}
 	if (!force_update && !is_null_sha1(old_sha1)) {
 		struct commit *old_cmit, *new_cmit;
 
 		old_cmit = lookup_commit_reference_gently(old_sha1, 0);
 		new_cmit = lookup_commit_reference_gently(b->sha1, 0);
-		if (!old_cmit || !new_cmit) {
-			unlock_ref(lock);
+		if (!old_cmit || !new_cmit)
 			return error("Branch %s is missing commits.", b->name);
-		}
 
 		if (!in_merge_bases(old_cmit, new_cmit)) {
-			unlock_ref(lock);
 			warning("Not updating %s"
 				" (new tip %s does not contain %s)",
 				b->name, sha1_to_hex(b->sha1), sha1_to_hex(old_sha1));
 			return -1;
 		}
 	}
-	if (write_ref_sha1(lock, b->sha1, msg) < 0)
-		return error("Unable to update %s", b->name);
+	transaction = ref_transaction_begin(&err);
+	if (!transaction ||
+	    ref_transaction_update(transaction, b->name, b->sha1, old_sha1,
+				   0, 1, msg, &err) ||
+	    ref_transaction_commit(transaction, &err)) {
+		ref_transaction_free(transaction);
+		error("%s", err.buf);
+		strbuf_release(&err);
+		return -1;
+	}
+	ref_transaction_free(transaction);
+	strbuf_release(&err);
 	return 0;
 }
 
@@ -1726,15 +1743,32 @@
 {
 	static const char *msg = "fast-import";
 	struct tag *t;
-	struct ref_lock *lock;
-	char ref_name[PATH_MAX];
+	struct strbuf ref_name = STRBUF_INIT;
+	struct strbuf err = STRBUF_INIT;
+	struct ref_transaction *transaction;
 
-	for (t = first_tag; t; t = t->next_tag) {
-		sprintf(ref_name, "tags/%s", t->name);
-		lock = lock_ref_sha1(ref_name, NULL);
-		if (!lock || write_ref_sha1(lock, t->sha1, msg) < 0)
-			failure |= error("Unable to update %s", ref_name);
+	transaction = ref_transaction_begin(&err);
+	if (!transaction) {
+		failure |= error("%s", err.buf);
+		goto cleanup;
 	}
+	for (t = first_tag; t; t = t->next_tag) {
+		strbuf_reset(&ref_name);
+		strbuf_addf(&ref_name, "refs/tags/%s", t->name);
+
+		if (ref_transaction_update(transaction, ref_name.buf, t->sha1,
+					   NULL, 0, 0, msg, &err)) {
+			failure |= error("%s", err.buf);
+			goto cleanup;
+		}
+	}
+	if (ref_transaction_commit(transaction, &err))
+		failure |= error("%s", err.buf);
+
+ cleanup:
+	ref_transaction_free(transaction);
+	strbuf_release(&ref_name);
+	strbuf_release(&err);
 }
 
 static void dump_marks_helper(FILE *f,
@@ -1760,20 +1794,18 @@
 static void dump_marks(void)
 {
 	static struct lock_file mark_lock;
-	int mark_fd;
 	FILE *f;
 
 	if (!export_marks_file)
 		return;
 
-	mark_fd = hold_lock_file_for_update(&mark_lock, export_marks_file, 0);
-	if (mark_fd < 0) {
+	if (hold_lock_file_for_update(&mark_lock, export_marks_file, 0) < 0) {
 		failure |= error("Unable to write marks file %s: %s",
 			export_marks_file, strerror(errno));
 		return;
 	}
 
-	f = fdopen(mark_fd, "w");
+	f = fdopen_lock_file(&mark_lock, "w");
 	if (!f) {
 		int saved_errno = errno;
 		rollback_lock_file(&mark_lock);
@@ -1782,27 +1814,10 @@
 		return;
 	}
 
-	/*
-	 * Since the lock file was fdopen()'ed, it should not be close()'ed.
-	 * Assign -1 to the lock file descriptor so that commit_lock_file()
-	 * won't try to close() it.
-	 */
-	mark_lock.fd = -1;
-
 	dump_marks_helper(f, 0, marks);
-	if (ferror(f) || fclose(f)) {
-		int saved_errno = errno;
-		rollback_lock_file(&mark_lock);
-		failure |= error("Unable to write marks file %s: %s",
-			export_marks_file, strerror(saved_errno));
-		return;
-	}
-
 	if (commit_lock_file(&mark_lock)) {
-		int saved_errno = errno;
-		rollback_lock_file(&mark_lock);
 		failure |= error("Unable to commit marks file %s: %s",
-			export_marks_file, strerror(saved_errno));
+			export_marks_file, strerror(errno));
 		return;
 	}
 }
@@ -1857,6 +1872,8 @@
 	}
 
 	for (;;) {
+		const char *p;
+
 		if (unread_command_buf) {
 			unread_command_buf = 0;
 		} else {
@@ -1889,8 +1906,8 @@
 			rc->prev->next = rc;
 			cmd_tail = rc;
 		}
-		if (starts_with(command_buf.buf, "cat-blob ")) {
-			parse_cat_blob();
+		if (skip_prefix(command_buf.buf, "cat-blob ", &p)) {
+			parse_cat_blob(p);
 			continue;
 		}
 		if (command_buf.buf[0] == '#')
@@ -1908,8 +1925,9 @@
 
 static void parse_mark(void)
 {
-	if (starts_with(command_buf.buf, "mark :")) {
-		next_mark = strtoumax(command_buf.buf + 6, NULL, 10);
+	const char *v;
+	if (skip_prefix(command_buf.buf, "mark :", &v)) {
+		next_mark = strtoumax(v, NULL, 10);
 		read_next_command();
 	}
 	else
@@ -1918,14 +1936,15 @@
 
 static int parse_data(struct strbuf *sb, uintmax_t limit, uintmax_t *len_res)
 {
+	const char *data;
 	strbuf_reset(sb);
 
-	if (!starts_with(command_buf.buf, "data "))
+	if (!skip_prefix(command_buf.buf, "data ", &data))
 		die("Expected 'data n' command, found: %s", command_buf.buf);
 
-	if (starts_with(command_buf.buf + 5, "<<")) {
-		char *term = xstrdup(command_buf.buf + 5 + 2);
-		size_t term_len = command_buf.len - 5 - 2;
+	if (skip_prefix(data, "<<", &data)) {
+		char *term = xstrdup(data);
+		size_t term_len = command_buf.len - (data - command_buf.buf);
 
 		strbuf_detach(&command_buf, NULL);
 		for (;;) {
@@ -1940,7 +1959,7 @@
 		free(term);
 	}
 	else {
-		uintmax_t len = strtoumax(command_buf.buf + 5, NULL, 10);
+		uintmax_t len = strtoumax(data, NULL, 10);
 		size_t n = 0, length = (size_t)len;
 
 		if (limit && limit < len) {
@@ -1963,7 +1982,7 @@
 	return 1;
 }
 
-static int validate_raw_date(const char *src, char *result, int maxlen)
+static int validate_raw_date(const char *src, struct strbuf *result)
 {
 	const char *orig_src = src;
 	char *endp;
@@ -1981,11 +2000,10 @@
 		return -1;
 
 	num = strtoul(src + 1, &endp, 10);
-	if (errno || endp == src + 1 || *endp || (endp - orig_src) >= maxlen ||
-	    1400 < num)
+	if (errno || endp == src + 1 || *endp || 1400 < num)
 		return -1;
 
-	strcpy(result, orig_src);
+	strbuf_addstr(result, orig_src);
 	return 0;
 }
 
@@ -1993,7 +2011,7 @@
 {
 	const char *ltgt;
 	size_t name_len;
-	char *ident;
+	struct strbuf ident = STRBUF_INIT;
 
 	/* ensure there is a space delimiter even if there is no name */
 	if (*buf == '<')
@@ -2012,26 +2030,25 @@
 		die("Missing space after > in ident string: %s", buf);
 	ltgt++;
 	name_len = ltgt - buf;
-	ident = xmalloc(name_len + 24);
-	strncpy(ident, buf, name_len);
+	strbuf_add(&ident, buf, name_len);
 
 	switch (whenspec) {
 	case WHENSPEC_RAW:
-		if (validate_raw_date(ltgt, ident + name_len, 24) < 0)
+		if (validate_raw_date(ltgt, &ident) < 0)
 			die("Invalid raw date \"%s\" in ident: %s", ltgt, buf);
 		break;
 	case WHENSPEC_RFC2822:
-		if (parse_date(ltgt, ident + name_len, 24) < 0)
+		if (parse_date(ltgt, &ident) < 0)
 			die("Invalid rfc2822 date \"%s\" in ident: %s", ltgt, buf);
 		break;
 	case WHENSPEC_NOW:
 		if (strcmp("now", ltgt))
 			die("Date in ident must be 'now': %s", buf);
-		datestamp(ident + name_len, 24);
+		datestamp(&ident);
 		break;
 	}
 
-	return ident;
+	return strbuf_detach(&ident, NULL);
 }
 
 static void parse_and_store_blob(
@@ -2261,15 +2278,14 @@
 	char *end;
 
 	mark = parse_mark_ref(*p, &end);
-	if (*end != ' ')
+	if (*end++ != ' ')
 		die("Missing space after mark: %s", command_buf.buf);
 	*p = end;
 	return mark;
 }
 
-static void file_change_m(struct branch *b)
+static void file_change_m(const char *p, struct branch *b)
 {
-	const char *p = command_buf.buf + 2;
 	static struct strbuf uq = STRBUF_INIT;
 	const char *endp;
 	struct object_entry *oe;
@@ -2297,20 +2313,17 @@
 	if (*p == ':') {
 		oe = find_mark(parse_mark_ref_space(&p));
 		hashcpy(sha1, oe->idx.sha1);
-	} else if (starts_with(p, "inline ")) {
+	} else if (skip_prefix(p, "inline ", &p)) {
 		inline_data = 1;
 		oe = NULL; /* not used with inline_data, but makes gcc happy */
-		p += strlen("inline");  /* advance to space */
 	} else {
 		if (get_sha1_hex(p, sha1))
 			die("Invalid dataref: %s", command_buf.buf);
 		oe = find_object(sha1);
 		p += 40;
-		if (*p != ' ')
+		if (*p++ != ' ')
 			die("Missing space after SHA1: %s", command_buf.buf);
 	}
-	assert(*p == ' ');
-	p++;  /* skip space */
 
 	strbuf_reset(&uq);
 	if (!unquote_c_style(&uq, p, &endp)) {
@@ -2320,7 +2333,7 @@
 	}
 
 	/* Git does not track empty, non-toplevel directories. */
-	if (S_ISDIR(mode) && !memcmp(sha1, EMPTY_TREE_SHA1_BIN, 20) && *p) {
+	if (S_ISDIR(mode) && !hashcmp(sha1, EMPTY_TREE_SHA1_BIN) && *p) {
 		tree_content_remove(&b->branch_tree, p, NULL, 0);
 		return;
 	}
@@ -2370,9 +2383,8 @@
 	tree_content_set(&b->branch_tree, p, sha1, mode, NULL);
 }
 
-static void file_change_d(struct branch *b)
+static void file_change_d(const char *p, struct branch *b)
 {
-	const char *p = command_buf.buf + 2;
 	static struct strbuf uq = STRBUF_INIT;
 	const char *endp;
 
@@ -2385,15 +2397,14 @@
 	tree_content_remove(&b->branch_tree, p, NULL, 1);
 }
 
-static void file_change_cr(struct branch *b, int rename)
+static void file_change_cr(const char *s, struct branch *b, int rename)
 {
-	const char *s, *d;
+	const char *d;
 	static struct strbuf s_uq = STRBUF_INIT;
 	static struct strbuf d_uq = STRBUF_INIT;
 	const char *endp;
 	struct tree_entry leaf;
 
-	s = command_buf.buf + 2;
 	strbuf_reset(&s_uq);
 	if (!unquote_c_style(&s_uq, s, &endp)) {
 		if (*endp != ' ')
@@ -2438,9 +2449,8 @@
 		leaf.tree);
 }
 
-static void note_change_n(struct branch *b, unsigned char *old_fanout)
+static void note_change_n(const char *p, struct branch *b, unsigned char *old_fanout)
 {
-	const char *p = command_buf.buf + 2;
 	static struct strbuf uq = STRBUF_INIT;
 	struct object_entry *oe;
 	struct branch *s;
@@ -2470,20 +2480,17 @@
 	if (*p == ':') {
 		oe = find_mark(parse_mark_ref_space(&p));
 		hashcpy(sha1, oe->idx.sha1);
-	} else if (starts_with(p, "inline ")) {
+	} else if (skip_prefix(p, "inline ", &p)) {
 		inline_data = 1;
 		oe = NULL; /* not used with inline_data, but makes gcc happy */
-		p += strlen("inline");  /* advance to space */
 	} else {
 		if (get_sha1_hex(p, sha1))
 			die("Invalid dataref: %s", command_buf.buf);
 		oe = find_object(sha1);
 		p += 40;
-		if (*p != ' ')
+		if (*p++ != ' ')
 			die("Missing space after SHA1: %s", command_buf.buf);
 	}
-	assert(*p == ' ');
-	p++;  /* skip space */
 
 	/* <commit-ish> */
 	s = lookup_branch(p);
@@ -2581,7 +2588,7 @@
 	const char *from;
 	struct branch *s;
 
-	if (!starts_with(command_buf.buf, "from "))
+	if (!skip_prefix(command_buf.buf, "from ", &from))
 		return 0;
 
 	if (b->branch_tree.tree) {
@@ -2589,7 +2596,6 @@
 		b->branch_tree.tree = NULL;
 	}
 
-	from = strchr(command_buf.buf, ' ') + 1;
 	s = lookup_branch(from);
 	if (b == s)
 		die("Can't create a branch from itself: %s", b->name);
@@ -2611,8 +2617,11 @@
 			free(buf);
 		} else
 			parse_from_existing(b);
-	} else if (!get_sha1(from, b->sha1))
+	} else if (!get_sha1(from, b->sha1)) {
 		parse_from_existing(b);
+		if (is_null_sha1(b->sha1))
+			b->delete = 1;
+	}
 	else
 		die("Invalid ref name or SHA1 expression: %s", from);
 
@@ -2627,8 +2636,7 @@
 	struct branch *s;
 
 	*count = 0;
-	while (starts_with(command_buf.buf, "merge ")) {
-		from = strchr(command_buf.buf, ' ') + 1;
+	while (skip_prefix(command_buf.buf, "merge ", &from)) {
 		n = xmalloc(sizeof(*n));
 		s = lookup_branch(from);
 		if (s)
@@ -2659,31 +2667,29 @@
 	return list;
 }
 
-static void parse_new_commit(void)
+static void parse_new_commit(const char *arg)
 {
 	static struct strbuf msg = STRBUF_INIT;
 	struct branch *b;
-	char *sp;
 	char *author = NULL;
 	char *committer = NULL;
 	struct hash_list *merge_list = NULL;
 	unsigned int merge_count;
 	unsigned char prev_fanout, new_fanout;
+	const char *v;
 
-	/* Obtain the branch name from the rest of our command */
-	sp = strchr(command_buf.buf, ' ') + 1;
-	b = lookup_branch(sp);
+	b = lookup_branch(arg);
 	if (!b)
-		b = new_branch(sp);
+		b = new_branch(arg);
 
 	read_next_command();
 	parse_mark();
-	if (starts_with(command_buf.buf, "author ")) {
-		author = parse_ident(command_buf.buf + 7);
+	if (skip_prefix(command_buf.buf, "author ", &v)) {
+		author = parse_ident(v);
 		read_next_command();
 	}
-	if (starts_with(command_buf.buf, "committer ")) {
-		committer = parse_ident(command_buf.buf + 10);
+	if (skip_prefix(command_buf.buf, "committer ", &v)) {
+		committer = parse_ident(v);
 		read_next_command();
 	}
 	if (!committer)
@@ -2703,20 +2709,20 @@
 
 	/* file_change* */
 	while (command_buf.len > 0) {
-		if (starts_with(command_buf.buf, "M "))
-			file_change_m(b);
-		else if (starts_with(command_buf.buf, "D "))
-			file_change_d(b);
-		else if (starts_with(command_buf.buf, "R "))
-			file_change_cr(b, 1);
-		else if (starts_with(command_buf.buf, "C "))
-			file_change_cr(b, 0);
-		else if (starts_with(command_buf.buf, "N "))
-			note_change_n(b, &prev_fanout);
+		if (skip_prefix(command_buf.buf, "M ", &v))
+			file_change_m(v, b);
+		else if (skip_prefix(command_buf.buf, "D ", &v))
+			file_change_d(v, b);
+		else if (skip_prefix(command_buf.buf, "R ", &v))
+			file_change_cr(v, b, 1);
+		else if (skip_prefix(command_buf.buf, "C ", &v))
+			file_change_cr(v, b, 0);
+		else if (skip_prefix(command_buf.buf, "N ", &v))
+			note_change_n(v, b, &prev_fanout);
 		else if (!strcmp("deleteall", command_buf.buf))
 			file_change_deleteall(b);
-		else if (starts_with(command_buf.buf, "ls "))
-			parse_ls(b);
+		else if (skip_prefix(command_buf.buf, "ls ", &v))
+			parse_ls(v, b);
 		else {
 			unread_command_buf = 1;
 			break;
@@ -2759,10 +2765,9 @@
 	b->last_commit = object_count_by_type[OBJ_COMMIT];
 }
 
-static void parse_new_tag(void)
+static void parse_new_tag(const char *arg)
 {
 	static struct strbuf msg = STRBUF_INIT;
-	char *sp;
 	const char *from;
 	char *tagger;
 	struct branch *s;
@@ -2770,12 +2775,11 @@
 	uintmax_t from_mark = 0;
 	unsigned char sha1[20];
 	enum object_type type;
+	const char *v;
 
-	/* Obtain the new tag name from the rest of our command */
-	sp = strchr(command_buf.buf, ' ') + 1;
 	t = pool_alloc(sizeof(struct tag));
 	memset(t, 0, sizeof(struct tag));
-	t->name = pool_strdup(sp);
+	t->name = pool_strdup(arg);
 	if (last_tag)
 		last_tag->next_tag = t;
 	else
@@ -2784,9 +2788,8 @@
 	read_next_command();
 
 	/* from ... */
-	if (!starts_with(command_buf.buf, "from "))
+	if (!skip_prefix(command_buf.buf, "from ", &from))
 		die("Expected from command, got %s", command_buf.buf);
-	from = strchr(command_buf.buf, ' ') + 1;
 	s = lookup_branch(from);
 	if (s) {
 		if (is_null_sha1(s->sha1))
@@ -2812,8 +2815,8 @@
 	read_next_command();
 
 	/* tagger ... */
-	if (starts_with(command_buf.buf, "tagger ")) {
-		tagger = parse_ident(command_buf.buf + 7);
+	if (skip_prefix(command_buf.buf, "tagger ", &v)) {
+		tagger = parse_ident(v);
 		read_next_command();
 	} else
 		tagger = NULL;
@@ -2842,14 +2845,11 @@
 		t->pack_id = pack_id;
 }
 
-static void parse_reset_branch(void)
+static void parse_reset_branch(const char *arg)
 {
 	struct branch *b;
-	char *sp;
 
-	/* Obtain the branch name from the rest of our command */
-	sp = strchr(command_buf.buf, ' ') + 1;
-	b = lookup_branch(sp);
+	b = lookup_branch(arg);
 	if (b) {
 		hashclr(b->sha1);
 		hashclr(b->branch_tree.versions[0].sha1);
@@ -2860,7 +2860,7 @@
 		}
 	}
 	else
-		b = new_branch(sp);
+		b = new_branch(arg);
 	read_next_command();
 	parse_from(b);
 	if (command_buf.len > 0)
@@ -2918,14 +2918,12 @@
 		free(buf);
 }
 
-static void parse_cat_blob(void)
+static void parse_cat_blob(const char *p)
 {
-	const char *p;
 	struct object_entry *oe = oe;
 	unsigned char sha1[20];
 
 	/* cat-blob SP <object> LF */
-	p = command_buf.buf + strlen("cat-blob ");
 	if (*p == ':') {
 		oe = find_mark(parse_mark_ref_eol(p));
 		if (!oe)
@@ -3008,6 +3006,8 @@
 			die("Invalid dataref: %s", command_buf.buf);
 		e = find_object(sha1);
 		*p += 40;
+		if (*(*p)++ != ' ')
+			die("Missing space after tree-ish: %s", command_buf.buf);
 	}
 
 	while (!e || e->type != OBJ_TREE)
@@ -3042,14 +3042,12 @@
 	cat_blob_write(line.buf, line.len);
 }
 
-static void parse_ls(struct branch *b)
+static void parse_ls(const char *p, struct branch *b)
 {
-	const char *p;
 	struct tree_entry *root = NULL;
 	struct tree_entry leaf = {NULL};
 
 	/* ls SP (<tree-ish> SP)? <path> */
-	p = command_buf.buf + strlen("ls ");
 	if (*p == '"') {
 		if (!b)
 			die("Not in a commit: %s", command_buf.buf);
@@ -3061,8 +3059,6 @@
 		if (!is_null_sha1(root->versions[1].sha1))
 			root->versions[1].mode = S_IFDIR;
 		load_tree(root);
-		if (*p++ != ' ')
-			die("Missing space after tree-ish: %s", command_buf.buf);
 	}
 	if (*p == '"') {
 		static struct strbuf uq = STRBUF_INIT;
@@ -3200,9 +3196,9 @@
 
 static int parse_one_option(const char *option)
 {
-	if (starts_with(option, "max-pack-size=")) {
+	if (skip_prefix(option, "max-pack-size=", &option)) {
 		unsigned long v;
-		if (!git_parse_ulong(option + 14, &v))
+		if (!git_parse_ulong(option, &v))
 			return 0;
 		if (v < 8192) {
 			warning("max-pack-size is now in bytes, assuming --max-pack-size=%lum", v);
@@ -3212,17 +3208,17 @@
 			v = 1024 * 1024;
 		}
 		max_packsize = v;
-	} else if (starts_with(option, "big-file-threshold=")) {
+	} else if (skip_prefix(option, "big-file-threshold=", &option)) {
 		unsigned long v;
-		if (!git_parse_ulong(option + 19, &v))
+		if (!git_parse_ulong(option, &v))
 			return 0;
 		big_file_threshold = v;
-	} else if (starts_with(option, "depth=")) {
-		option_depth(option + 6);
-	} else if (starts_with(option, "active-branches=")) {
-		option_active_branches(option + 16);
-	} else if (starts_with(option, "export-pack-edges=")) {
-		option_export_pack_edges(option + 18);
+	} else if (skip_prefix(option, "depth=", &option)) {
+		option_depth(option);
+	} else if (skip_prefix(option, "active-branches=", &option)) {
+		option_active_branches(option);
+	} else if (skip_prefix(option, "export-pack-edges=", &option)) {
+		option_export_pack_edges(option);
 	} else if (starts_with(option, "quiet")) {
 		show_stats = 0;
 	} else if (starts_with(option, "stats")) {
@@ -3236,15 +3232,16 @@
 
 static int parse_one_feature(const char *feature, int from_stream)
 {
-	if (starts_with(feature, "date-format=")) {
-		option_date_format(feature + 12);
-	} else if (starts_with(feature, "import-marks=")) {
-		option_import_marks(feature + 13, from_stream, 0);
-	} else if (starts_with(feature, "import-marks-if-exists=")) {
-		option_import_marks(feature + strlen("import-marks-if-exists="),
-					from_stream, 1);
-	} else if (starts_with(feature, "export-marks=")) {
-		option_export_marks(feature + 13);
+	const char *arg;
+
+	if (skip_prefix(feature, "date-format=", &arg)) {
+		option_date_format(arg);
+	} else if (skip_prefix(feature, "import-marks=", &arg)) {
+		option_import_marks(arg, from_stream, 0);
+	} else if (skip_prefix(feature, "import-marks-if-exists=", &arg)) {
+		option_import_marks(arg, from_stream, 1);
+	} else if (skip_prefix(feature, "export-marks=", &arg)) {
+		option_export_marks(arg);
 	} else if (!strcmp(feature, "cat-blob")) {
 		; /* Don't die - this feature is supported */
 	} else if (!strcmp(feature, "relative-marks")) {
@@ -3264,10 +3261,8 @@
 	return 1;
 }
 
-static void parse_feature(void)
+static void parse_feature(const char *feature)
 {
-	char *feature = command_buf.buf + 8;
-
 	if (seen_data_command)
 		die("Got feature command '%s' after data command", feature);
 
@@ -3277,10 +3272,8 @@
 	die("This version of fast-import does not support feature %s.", feature);
 }
 
-static void parse_option(void)
+static void parse_option(const char *option)
 {
-	char *option = command_buf.buf + 11;
-
 	if (seen_data_command)
 		die("Got option command '%s' after data command", option);
 
@@ -3290,36 +3283,34 @@
 	die("This version of fast-import does not support option: %s", option);
 }
 
-static int git_pack_config(const char *k, const char *v, void *cb)
+static void git_pack_config(void)
 {
-	if (!strcmp(k, "pack.depth")) {
-		max_depth = git_config_int(k, v);
+	int indexversion_value;
+	unsigned long packsizelimit_value;
+
+	if (!git_config_get_ulong("pack.depth", &max_depth)) {
 		if (max_depth > MAX_DEPTH)
 			max_depth = MAX_DEPTH;
-		return 0;
 	}
-	if (!strcmp(k, "pack.compression")) {
-		int level = git_config_int(k, v);
-		if (level == -1)
-			level = Z_DEFAULT_COMPRESSION;
-		else if (level < 0 || level > Z_BEST_COMPRESSION)
-			die("bad pack compression level %d", level);
-		pack_compression_level = level;
+	if (!git_config_get_int("pack.compression", &pack_compression_level)) {
+		if (pack_compression_level == -1)
+			pack_compression_level = Z_DEFAULT_COMPRESSION;
+		else if (pack_compression_level < 0 ||
+			 pack_compression_level > Z_BEST_COMPRESSION)
+			git_die_config("pack.compression",
+					"bad pack compression level %d", pack_compression_level);
 		pack_compression_seen = 1;
-		return 0;
 	}
-	if (!strcmp(k, "pack.indexversion")) {
-		pack_idx_opts.version = git_config_int(k, v);
+	if (!git_config_get_int("pack.indexversion", &indexversion_value)) {
+		pack_idx_opts.version = indexversion_value;
 		if (pack_idx_opts.version > 2)
-			die("bad pack.indexversion=%"PRIu32,
-			    pack_idx_opts.version);
-		return 0;
+			git_die_config("pack.indexversion",
+					"bad pack.indexversion=%"PRIu32, pack_idx_opts.version);
 	}
-	if (!strcmp(k, "pack.packsizelimit")) {
-		max_packsize = git_config_ulong(k, v);
-		return 0;
-	}
-	return git_default_config(k, v, cb);
+	if (!git_config_get_ulong("pack.packsizelimit", &packsizelimit_value))
+		max_packsize = packsizelimit_value;
+
+	git_config(git_default_config, NULL);
 }
 
 static const char fast_import_usage[] =
@@ -3335,18 +3326,21 @@
 		if (*a != '-' || !strcmp(a, "--"))
 			break;
 
-		if (parse_one_option(a + 2))
+		if (!skip_prefix(a, "--", &a))
+			die("unknown option %s", a);
+
+		if (parse_one_option(a))
 			continue;
 
-		if (parse_one_feature(a + 2, 0))
+		if (parse_one_feature(a, 0))
 			continue;
 
-		if (starts_with(a + 2, "cat-blob-fd=")) {
-			option_cat_blob_fd(a + 2 + strlen("cat-blob-fd="));
+		if (skip_prefix(a, "cat-blob-fd=", &a)) {
+			option_cat_blob_fd(a);
 			continue;
 		}
 
-		die("unknown option %s", a);
+		die("unknown option --%s", a);
 	}
 	if (i != global_argc)
 		usage(fast_import_usage);
@@ -3369,7 +3363,7 @@
 
 	setup_git_directory();
 	reset_pack_idx_option(&pack_idx_opts);
-	git_config(git_pack_config, NULL);
+	git_pack_config();
 	if (!pack_compression_seen && core_compression_seen)
 		pack_compression_level = core_compression_level;
 
@@ -3393,26 +3387,27 @@
 	set_die_routine(die_nicely);
 	set_checkpoint_signal();
 	while (read_next_command() != EOF) {
+		const char *v;
 		if (!strcmp("blob", command_buf.buf))
 			parse_new_blob();
-		else if (starts_with(command_buf.buf, "ls "))
-			parse_ls(NULL);
-		else if (starts_with(command_buf.buf, "commit "))
-			parse_new_commit();
-		else if (starts_with(command_buf.buf, "tag "))
-			parse_new_tag();
-		else if (starts_with(command_buf.buf, "reset "))
-			parse_reset_branch();
+		else if (skip_prefix(command_buf.buf, "ls ", &v))
+			parse_ls(v, NULL);
+		else if (skip_prefix(command_buf.buf, "commit ", &v))
+			parse_new_commit(v);
+		else if (skip_prefix(command_buf.buf, "tag ", &v))
+			parse_new_tag(v);
+		else if (skip_prefix(command_buf.buf, "reset ", &v))
+			parse_reset_branch(v);
 		else if (!strcmp("checkpoint", command_buf.buf))
 			parse_checkpoint();
 		else if (!strcmp("done", command_buf.buf))
 			break;
 		else if (starts_with(command_buf.buf, "progress "))
 			parse_progress();
-		else if (starts_with(command_buf.buf, "feature "))
-			parse_feature();
-		else if (starts_with(command_buf.buf, "option git "))
-			parse_option();
+		else if (skip_prefix(command_buf.buf, "feature ", &v))
+			parse_feature(v);
+		else if (skip_prefix(command_buf.buf, "option git ", &v))
+			parse_option(v);
 		else if (starts_with(command_buf.buf, "option "))
 			/* ignore non-git options*/;
 		else
diff --git a/fetch-pack.c b/fetch-pack.c
index eeee2bb..655ee64 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "lockfile.h"
 #include "refs.h"
 #include "pkt-line.h"
 #include "commit.h"
@@ -189,20 +190,23 @@
 {
 	int len;
 	char *line = packet_read_line(fd, &len);
+	const char *arg;
 
 	if (!len)
 		die("git fetch-pack: expected ACK/NAK, got EOF");
 	if (!strcmp(line, "NAK"))
 		return NAK;
-	if (starts_with(line, "ACK ")) {
-		if (!get_sha1_hex(line+4, result_sha1)) {
-			if (len < 45)
+	if (skip_prefix(line, "ACK ", &arg)) {
+		if (!get_sha1_hex(arg, result_sha1)) {
+			arg += 40;
+			len -= arg - line;
+			if (len < 1)
 				return ACK;
-			if (strstr(line+45, "continue"))
+			if (strstr(arg, "continue"))
 				return ACK_continue;
-			if (strstr(line+45, "common"))
+			if (strstr(arg, "common"))
 				return ACK_common;
-			if (strstr(line+45, "ready"))
+			if (strstr(arg, "ready"))
 				return ACK_ready;
 			return ACK;
 		}
@@ -319,18 +323,19 @@
 
 	if (args->depth > 0) {
 		char *line;
+		const char *arg;
 		unsigned char sha1[20];
 
 		send_request(args, fd[1], &req_buf);
 		while ((line = packet_read_line(fd[0], NULL))) {
-			if (starts_with(line, "shallow ")) {
-				if (get_sha1_hex(line + 8, sha1))
+			if (skip_prefix(line, "shallow ", &arg)) {
+				if (get_sha1_hex(arg, sha1))
 					die("invalid shallow line: %s", line);
 				register_shallow(sha1);
 				continue;
 			}
-			if (starts_with(line, "unshallow ")) {
-				if (get_sha1_hex(line + 10, sha1))
+			if (skip_prefix(line, "unshallow ", &arg)) {
+				if (get_sha1_hex(arg, sha1))
 					die("invalid unshallow line: %s", line);
 				if (!lookup_object(sha1))
 					die("object not found: %s", line);
@@ -507,7 +512,7 @@
 		int keep = 0;
 		next = ref->next;
 
-		if (!memcmp(ref->name, "refs/", 5) &&
+		if (starts_with(ref->name, "refs/") &&
 		    check_refname_format(ref->name, 0))
 			; /* trash */
 		else {
@@ -662,7 +667,7 @@
 	char hdr_arg[256];
 	const char **av, *cmd_name;
 	int do_keep = args->keep_pack;
-	struct child_process cmd;
+	struct child_process cmd = CHILD_PROCESS_INIT;
 	int ret;
 
 	memset(&demux, 0, sizeof(demux));
@@ -681,7 +686,6 @@
 	else
 		demux.out = xd[0];
 
-	memset(&cmd, 0, sizeof(cmd));
 	cmd.argv = argv;
 	av = argv;
 	*hdr_arg = 0;
@@ -865,34 +869,15 @@
 	return ref;
 }
 
-static int fetch_pack_config(const char *var, const char *value, void *cb)
+static void fetch_pack_config(void)
 {
-	if (strcmp(var, "fetch.unpacklimit") == 0) {
-		fetch_unpack_limit = git_config_int(var, value);
-		return 0;
-	}
+	git_config_get_int("fetch.unpacklimit", &fetch_unpack_limit);
+	git_config_get_int("transfer.unpacklimit", &transfer_unpack_limit);
+	git_config_get_bool("repack.usedeltabaseoffset", &prefer_ofs_delta);
+	git_config_get_bool("fetch.fsckobjects", &fetch_fsck_objects);
+	git_config_get_bool("transfer.fsckobjects", &transfer_fsck_objects);
 
-	if (strcmp(var, "transfer.unpacklimit") == 0) {
-		transfer_unpack_limit = git_config_int(var, value);
-		return 0;
-	}
-
-	if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
-		prefer_ofs_delta = git_config_bool(var, value);
-		return 0;
-	}
-
-	if (!strcmp(var, "fetch.fsckobjects")) {
-		fetch_fsck_objects = git_config_bool(var, value);
-		return 0;
-	}
-
-	if (!strcmp(var, "transfer.fsckobjects")) {
-		transfer_fsck_objects = git_config_bool(var, value);
-		return 0;
-	}
-
-	return git_default_config(var, value, cb);
+	git_config(git_default_config, NULL);
 }
 
 static void fetch_pack_setup(void)
@@ -900,7 +885,7 @@
 	static int did_setup;
 	if (did_setup)
 		return;
-	git_config(fetch_pack_config, NULL);
+	fetch_pack_config();
 	if (0 <= transfer_unpack_limit)
 		unpack_limit = transfer_unpack_limit;
 	else if (0 <= fetch_unpack_limit)
diff --git a/fsck.c b/fsck.c
index a7233c8..2fffa43 100644
--- a/fsck.c
+++ b/fsck.c
@@ -6,6 +6,7 @@
 #include "commit.h"
 #include "tag.h"
 #include "fsck.h"
+#include "refs.h"
 
 static int fsck_walk_tree(struct tree *tree, fsck_walk_func walk, void *data)
 {
@@ -237,6 +238,26 @@
 	return retval;
 }
 
+static int require_end_of_header(const void *data, unsigned long size,
+	struct object *obj, fsck_error error_func)
+{
+	const char *buffer = (const char *)data;
+	unsigned long i;
+
+	for (i = 0; i < size; i++) {
+		switch (buffer[i]) {
+		case '\0':
+			return error_func(obj, FSCK_ERROR,
+				"unterminated header: NUL at offset %d", i);
+		case '\n':
+			if (i + 1 < size && buffer[i + 1] == '\n')
+				return 0;
+		}
+	}
+
+	return error_func(obj, FSCK_ERROR, "unterminated header");
+}
+
 static int fsck_ident(const char **ident, struct object *obj, fsck_error error_func)
 {
 	char *end;
@@ -277,56 +298,44 @@
 }
 
 static int fsck_commit_buffer(struct commit *commit, const char *buffer,
-			      fsck_error error_func)
+	unsigned long size, fsck_error error_func)
 {
-	const char *tmp;
 	unsigned char tree_sha1[20], sha1[20];
 	struct commit_graft *graft;
-	int parents = 0;
+	unsigned parent_count, parent_line_count = 0;
 	int err;
 
-	buffer = skip_prefix(buffer, "tree ");
-	if (!buffer)
+	if (require_end_of_header(buffer, size, &commit->object, error_func))
+		return -1;
+
+	if (!skip_prefix(buffer, "tree ", &buffer))
 		return error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'tree' line");
 	if (get_sha1_hex(buffer, tree_sha1) || buffer[40] != '\n')
 		return error_func(&commit->object, FSCK_ERROR, "invalid 'tree' line format - bad sha1");
 	buffer += 41;
-	while ((tmp = skip_prefix(buffer, "parent "))) {
-		buffer = tmp;
+	while (skip_prefix(buffer, "parent ", &buffer)) {
 		if (get_sha1_hex(buffer, sha1) || buffer[40] != '\n')
 			return error_func(&commit->object, FSCK_ERROR, "invalid 'parent' line format - bad sha1");
 		buffer += 41;
-		parents++;
+		parent_line_count++;
 	}
 	graft = lookup_commit_graft(commit->object.sha1);
+	parent_count = commit_list_count(commit->parents);
 	if (graft) {
-		struct commit_list *p = commit->parents;
-		parents = 0;
-		while (p) {
-			p = p->next;
-			parents++;
-		}
-		if (graft->nr_parent == -1 && !parents)
+		if (graft->nr_parent == -1 && !parent_count)
 			; /* shallow commit */
-		else if (graft->nr_parent != parents)
+		else if (graft->nr_parent != parent_count)
 			return error_func(&commit->object, FSCK_ERROR, "graft objects missing");
 	} else {
-		struct commit_list *p = commit->parents;
-		while (p && parents) {
-			p = p->next;
-			parents--;
-		}
-		if (p || parents)
+		if (parent_count != parent_line_count)
 			return error_func(&commit->object, FSCK_ERROR, "parent objects missing");
 	}
-	buffer = skip_prefix(buffer, "author ");
-	if (!buffer)
+	if (!skip_prefix(buffer, "author ", &buffer))
 		return error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'author' line");
 	err = fsck_ident(&buffer, &commit->object, error_func);
 	if (err)
 		return err;
-	buffer = skip_prefix(buffer, "committer ");
-	if (!buffer)
+	if (!skip_prefix(buffer, "committer ", &buffer))
 		return error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'committer' line");
 	err = fsck_ident(&buffer, &commit->object, error_func);
 	if (err)
@@ -337,24 +346,111 @@
 	return 0;
 }
 
-static int fsck_commit(struct commit *commit, fsck_error error_func)
+static int fsck_commit(struct commit *commit, const char *data,
+	unsigned long size, fsck_error error_func)
 {
-	const char *buffer = get_commit_buffer(commit, NULL);
-	int ret = fsck_commit_buffer(commit, buffer, error_func);
-	unuse_commit_buffer(commit, buffer);
+	const char *buffer = data ?  data : get_commit_buffer(commit, &size);
+	int ret = fsck_commit_buffer(commit, buffer, size, error_func);
+	if (!data)
+		unuse_commit_buffer(commit, buffer);
 	return ret;
 }
 
-static int fsck_tag(struct tag *tag, fsck_error error_func)
+static int fsck_tag_buffer(struct tag *tag, const char *data,
+	unsigned long size, fsck_error error_func)
+{
+	unsigned char sha1[20];
+	int ret = 0;
+	const char *buffer;
+	char *to_free = NULL, *eol;
+	struct strbuf sb = STRBUF_INIT;
+
+	if (data)
+		buffer = data;
+	else {
+		enum object_type type;
+
+		buffer = to_free =
+			read_sha1_file(tag->object.sha1, &type, &size);
+		if (!buffer)
+			return error_func(&tag->object, FSCK_ERROR,
+				"cannot read tag object");
+
+		if (type != OBJ_TAG) {
+			ret = error_func(&tag->object, FSCK_ERROR,
+				"expected tag got %s",
+			    typename(type));
+			goto done;
+		}
+	}
+
+	if (require_end_of_header(buffer, size, &tag->object, error_func))
+		goto done;
+
+	if (!skip_prefix(buffer, "object ", &buffer)) {
+		ret = error_func(&tag->object, FSCK_ERROR, "invalid format - expected 'object' line");
+		goto done;
+	}
+	if (get_sha1_hex(buffer, sha1) || buffer[40] != '\n') {
+		ret = error_func(&tag->object, FSCK_ERROR, "invalid 'object' line format - bad sha1");
+		goto done;
+	}
+	buffer += 41;
+
+	if (!skip_prefix(buffer, "type ", &buffer)) {
+		ret = error_func(&tag->object, FSCK_ERROR, "invalid format - expected 'type' line");
+		goto done;
+	}
+	eol = strchr(buffer, '\n');
+	if (!eol) {
+		ret = error_func(&tag->object, FSCK_ERROR, "invalid format - unexpected end after 'type' line");
+		goto done;
+	}
+	if (type_from_string_gently(buffer, eol - buffer, 1) < 0)
+		ret = error_func(&tag->object, FSCK_ERROR, "invalid 'type' value");
+	if (ret)
+		goto done;
+	buffer = eol + 1;
+
+	if (!skip_prefix(buffer, "tag ", &buffer)) {
+		ret = error_func(&tag->object, FSCK_ERROR, "invalid format - expected 'tag' line");
+		goto done;
+	}
+	eol = strchr(buffer, '\n');
+	if (!eol) {
+		ret = error_func(&tag->object, FSCK_ERROR, "invalid format - unexpected end after 'type' line");
+		goto done;
+	}
+	strbuf_addf(&sb, "refs/tags/%.*s", (int)(eol - buffer), buffer);
+	if (check_refname_format(sb.buf, 0))
+		error_func(&tag->object, FSCK_WARN, "invalid 'tag' name: %s", buffer);
+	buffer = eol + 1;
+
+	if (!skip_prefix(buffer, "tagger ", &buffer))
+		/* early tags do not contain 'tagger' lines; warn only */
+		error_func(&tag->object, FSCK_WARN, "invalid format - expected 'tagger' line");
+	else
+		ret = fsck_ident(&buffer, &tag->object, error_func);
+
+done:
+	strbuf_release(&sb);
+	free(to_free);
+	return ret;
+}
+
+static int fsck_tag(struct tag *tag, const char *data,
+	unsigned long size, fsck_error error_func)
 {
 	struct object *tagged = tag->tagged;
 
 	if (!tagged)
 		return error_func(&tag->object, FSCK_ERROR, "could not load tagged object");
-	return 0;
+
+	return fsck_tag_buffer(tag, data, size, error_func);
 }
 
-int fsck_object(struct object *obj, int strict, fsck_error error_func)
+int fsck_object(struct object *obj, void *data, unsigned long size,
+	int strict, fsck_error error_func)
 {
 	if (!obj)
 		return error_func(obj, FSCK_ERROR, "no valid object to fsck");
@@ -364,9 +460,11 @@
 	if (obj->type == OBJ_TREE)
 		return fsck_tree((struct tree *) obj, strict, error_func);
 	if (obj->type == OBJ_COMMIT)
-		return fsck_commit((struct commit *) obj, error_func);
+		return fsck_commit((struct commit *) obj, (const char *) data,
+			size, error_func);
 	if (obj->type == OBJ_TAG)
-		return fsck_tag((struct tag *) obj, error_func);
+		return fsck_tag((struct tag *) obj, (const char *) data,
+			size, error_func);
 
 	return error_func(obj, FSCK_ERROR, "unknown type '%d' (internal fsck error)",
 			  obj->type);
diff --git a/fsck.h b/fsck.h
index 1e4f527..d1e6387 100644
--- a/fsck.h
+++ b/fsck.h
@@ -28,6 +28,8 @@
  *    0		everything OK
  */
 int fsck_walk(struct object *obj, fsck_walk_func walk, void *data);
-int fsck_object(struct object *obj, int strict, fsck_error error_func);
+/* If NULL is passed for data, we assume the object is local and read it. */
+int fsck_object(struct object *obj, void *data, unsigned long size,
+	int strict, fsck_error error_func);
 
 #endif
diff --git a/git-bisect.sh b/git-bisect.sh
index af4d04c..6cda2b5 100755
--- a/git-bisect.sh
+++ b/git-bisect.sh
@@ -286,11 +286,11 @@
 
 		if test -s "$GIT_DIR/BISECT_START"
 		then
-			gettextln "You need to give me at least one good and one bad revisions.
+			gettextln "You need to give me at least one good and one bad revision.
 (You can use \"git bisect bad\" and \"git bisect good\" for that.)" >&2
 		else
 			gettextln "You need to start by \"git bisect start\".
-You then need to give me at least one good and one bad revisions.
+You then need to give me at least one good and one bad revision.
 (You can use \"git bisect bad\" and \"git bisect good\" for that.)" >&2
 		fi
 		exit 1 ;;
@@ -408,7 +408,7 @@
 	bisect_reset
 	while read git bisect command rev
 	do
-		test "$git $bisect" = "git bisect" -o "$git" = "git-bisect" || continue
+		test "$git $bisect" = "git bisect" || test "$git" = "git-bisect" || continue
 		if test "$git" = "git-bisect"
 		then
 			rev="$command"
diff --git a/git-compat-util.h b/git-compat-util.h
index e6a4159..400e921 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -82,6 +82,7 @@
 #define _ALL_SOURCE 1
 #define _GNU_SOURCE 1
 #define _BSD_SOURCE 1
+#define _DEFAULT_SOURCE 1
 #define _NETBSD_SOURCE 1
 #define _SGI_SOURCE 1
 
@@ -191,7 +192,7 @@
 struct itimerval {
 	struct timeval it_interval;
 	struct timeval it_value;
-}
+};
 #endif
 
 #ifdef NO_SETITIMER
@@ -264,15 +265,35 @@
 #endif
 
 #ifndef has_dos_drive_prefix
-#define has_dos_drive_prefix(path) 0
+static inline int git_has_dos_drive_prefix(const char *path)
+{
+	return 0;
+}
+#define has_dos_drive_prefix git_has_dos_drive_prefix
 #endif
 
 #ifndef is_dir_sep
-#define is_dir_sep(c) ((c) == '/')
+static inline int git_is_dir_sep(int c)
+{
+	return c == '/';
+}
+#define is_dir_sep git_is_dir_sep
+#endif
+
+#ifndef offset_1st_component
+static inline int git_offset_1st_component(const char *path)
+{
+	return is_dir_sep(path[0]);
+}
+#define offset_1st_component git_offset_1st_component
 #endif
 
 #ifndef find_last_dir_sep
-#define find_last_dir_sep(path) strrchr(path, '/')
+static inline char *git_find_last_dir_sep(const char *path)
+{
+	return strrchr(path, '/');
+}
+#define find_last_dir_sep git_find_last_dir_sep
 #endif
 
 #if defined(__HP_cc) && (__HP_cc >= 61000)
@@ -287,10 +308,12 @@
 #else
 #define NORETURN
 #define NORETURN_PTR
+#ifndef __GNUC__
 #ifndef __attribute__
 #define __attribute__(x)
 #endif
 #endif
+#endif
 
 /* The sentinel attribute is valid from gcc version 4.0 */
 #if defined(__GNUC__) && (__GNUC__ >= 4)
@@ -303,6 +326,8 @@
 
 #include "wildmatch.h"
 
+struct strbuf;
+
 /* General helper functions */
 extern void vreportf(const char *prefix, const char *err, va_list params);
 extern void vwritef(int fd, const char *prefix, const char *err, va_list params);
@@ -330,8 +355,12 @@
  * trying to help gcc, anyway, it's OK; other compilers will fall back to
  * using the function as usual.
  */
-#if defined(__GNUC__) && ! defined(__clang__)
-#define error(...) (error(__VA_ARGS__), -1)
+#if defined(__GNUC__)
+static inline int const_error(void)
+{
+	return -1;
+}
+#define error(...) (error(__VA_ARGS__), const_error())
 #endif
 
 extern void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params));
@@ -339,15 +368,66 @@
 extern void set_die_is_recursing_routine(int (*routine)(void));
 
 extern int starts_with(const char *str, const char *prefix);
-extern int ends_with(const char *str, const char *suffix);
 
-static inline const char *skip_prefix(const char *str, const char *prefix)
+/*
+ * If the string "str" begins with the string found in "prefix", return 1.
+ * The "out" parameter is set to "str + strlen(prefix)" (i.e., to the point in
+ * the string right after the prefix).
+ *
+ * Otherwise, return 0 and leave "out" untouched.
+ *
+ * Examples:
+ *
+ *   [extract branch name, fail if not a branch]
+ *   if (!skip_prefix(ref, "refs/heads/", &branch)
+ *	return -1;
+ *
+ *   [skip prefix if present, otherwise use whole string]
+ *   skip_prefix(name, "refs/heads/", &name);
+ */
+static inline int skip_prefix(const char *str, const char *prefix,
+			      const char **out)
 {
 	do {
-		if (!*prefix)
-			return str;
+		if (!*prefix) {
+			*out = str;
+			return 1;
+		}
 	} while (*str++ == *prefix++);
-	return NULL;
+	return 0;
+}
+
+/*
+ * If buf ends with suffix, return 1 and subtract the length of the suffix
+ * from *len. Otherwise, return 0 and leave *len untouched.
+ */
+static inline int strip_suffix_mem(const char *buf, size_t *len,
+				   const char *suffix)
+{
+	size_t suflen = strlen(suffix);
+	if (*len < suflen || memcmp(buf + (*len - suflen), suffix, suflen))
+		return 0;
+	*len -= suflen;
+	return 1;
+}
+
+/*
+ * If str ends with suffix, return 1 and set *len to the size of the string
+ * without the suffix. Otherwise, return 0 and set *len to the size of the
+ * string.
+ *
+ * Note that we do _not_ NUL-terminate str to the new length.
+ */
+static inline int strip_suffix(const char *str, const char *suffix, size_t *len)
+{
+	*len = strlen(str);
+	return strip_suffix_mem(str, len, suffix);
+}
+
+static inline int ends_with(const char *str, const char *suffix)
+{
+	size_t len;
+	return strip_suffix(str, suffix, &len);
 }
 
 #if defined(NO_MMAP) || defined(USE_WIN32_MMAP)
@@ -516,14 +596,28 @@
 const char *inet_ntop(int af, const void *src, char *dst, size_t size);
 #endif
 
+#ifdef NO_PTHREADS
+#define atexit git_atexit
+extern int git_atexit(void (*handler)(void));
+#endif
+
 extern void release_pack_memory(size_t);
 
 typedef void (*try_to_free_t)(size_t);
 extern try_to_free_t set_try_to_free_routine(try_to_free_t);
 
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+# define xalloca(size)      (alloca(size))
+# define xalloca_free(p)    do {} while (0)
+#else
+# define xalloca(size)      (xmalloc(size))
+# define xalloca_free(p)    (free(p))
+#endif
 extern char *xstrdup(const char *str);
 extern void *xmalloc(size_t size);
 extern void *xmallocz(size_t size);
+extern void *xmallocz_gently(size_t size);
 extern void *xmemdupz(const void *data, size_t len);
 extern char *xstrndup(const char *str, size_t len);
 extern void *xrealloc(void *ptr, size_t size);
@@ -538,6 +632,9 @@
 extern int xmkstemp_mode(char *template, int mode);
 extern int odb_mkstemp(char *template, size_t limit, const char *pattern);
 extern int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1);
+extern char *xgetcwd(void);
+
+#define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), (alloc) * sizeof(*(x)))
 
 static inline size_t xsize_t(off_t len)
 {
@@ -546,13 +643,6 @@
 	return (size_t)len;
 }
 
-static inline int has_extension(const char *filename, const char *ext)
-{
-	size_t len = strlen(filename);
-	size_t extlen = strlen(ext);
-	return len > extlen && !memcmp(filename + len - extlen, ext, extlen);
-}
-
 /* in ctype.c, for kwset users */
 extern const char tolower_trans_tbl[256];
 
@@ -594,7 +684,7 @@
 #define iscntrl(x) (sane_istest(x,GIT_CNTRL))
 #define ispunct(x) sane_istest(x, GIT_PUNCT | GIT_REGEX_SPECIAL | \
 		GIT_GLOB_SPECIAL | GIT_PATHSPEC_MAGIC)
-#define isxdigit(x) (hexval_table[x] != -1)
+#define isxdigit(x) (hexval_table[(unsigned char)(x)] != -1)
 #define tolower(x) sane_case((unsigned char)(x), 0x20)
 #define toupper(x) sane_case((unsigned char)(x), 0)
 #define is_pathspec_magic(x) sane_istest(x,GIT_PATHSPEC_MAGIC)
@@ -688,13 +778,27 @@
 #endif
 #endif
 
+#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__C99_MACRO_WITH_VA_ARGS)
+#define HAVE_VARIADIC_MACROS 1
+#endif
+
 /*
  * Preserves errno, prints a message, but gives no warning for ENOENT.
- * Always returns the return value of unlink(2).
+ * Returns 0 on success, which includes trying to unlink an object that does
+ * not exist.
  */
 int unlink_or_warn(const char *path);
+ /*
+  * Tries to unlink file.  Returns 0 if unlink succeeded
+  * or the file already didn't exist.  Returns -1 and
+  * appends a message to err suitable for
+  * 'error("%s", err->buf)' on error.
+  */
+int unlink_or_msg(const char *file, struct strbuf *err);
 /*
- * Likewise for rmdir(2).
+ * Preserves errno, prints a message, but gives no warning for ENOENT.
+ * Returns 0 on success, which includes trying to remove a directory that does
+ * not exist.
  */
 int rmdir_or_warn(const char *path);
 /*
diff --git a/git-difftool--helper.sh b/git-difftool--helper.sh
index 7ef36b9..d4fb6df 100755
--- a/git-difftool--helper.sh
+++ b/git-difftool--helper.sh
@@ -49,7 +49,8 @@
 		else
 			printf "Launch '%s' [Y/n]: " "$merge_tool"
 		fi
-		if read ans && test "$ans" = n
+		read ans || return
+		if test "$ans" = n
 		then
 			return
 		fi
@@ -84,6 +85,12 @@
 	while test $# -gt 6
 	do
 		launch_merge_tool "$1" "$2" "$5"
+		status=$?
+		if test "$status" != 0 &&
+			test "$GIT_DIFFTOOL_TRUST_EXIT_CODE" = true
+		then
+			exit $status
+		fi
 		shift 7
 	done
 fi
diff --git a/git-difftool.perl b/git-difftool.perl
index 18ca61e..7df7c8a 100755
--- a/git-difftool.perl
+++ b/git-difftool.perl
@@ -47,13 +47,9 @@
 
 sub print_tool_help
 {
-	my $cmd = 'TOOL_MODE=diff';
-	$cmd .= ' && . "$(git --exec-path)/git-mergetool--lib"';
-	$cmd .= ' && show_tool_help';
-
 	# See the comment at the bottom of file_diff() for the reason behind
 	# using system() followed by exit() instead of exec().
-	my $rc = system('sh', '-c', $cmd);
+	my $rc = system(qw(git mergetool --tool-help=diff));
 	exit($rc | ($rc >> 8));
 }
 
@@ -346,6 +342,7 @@
 		symlinks => $^O ne 'cygwin' &&
 				$^O ne 'MSWin32' && $^O ne 'msys',
 		tool_help => undef,
+		trust_exit_code => undef,
 	);
 	GetOptions('g|gui!' => \$opts{gui},
 		'd|dir-diff' => \$opts{dirdiff},
@@ -356,6 +353,8 @@
 		'no-symlinks' => sub { $opts{symlinks} = 0; },
 		't|tool:s' => \$opts{difftool_cmd},
 		'tool-help' => \$opts{tool_help},
+		'trust-exit-code' => \$opts{trust_exit_code},
+		'no-trust-exit-code' => sub { $opts{trust_exit_code} = 0; },
 		'x|extcmd:s' => \$opts{extcmd});
 
 	if (defined($opts{help})) {
@@ -387,6 +386,15 @@
 		}
 	}
 
+	if (!defined $opts{trust_exit_code}) {
+		$opts{trust_exit_code} = Git::config_bool('difftool.trustExitCode');
+	}
+	if ($opts{trust_exit_code}) {
+		$ENV{GIT_DIFFTOOL_TRUST_EXIT_CODE} = 'true';
+	} else {
+		$ENV{GIT_DIFFTOOL_TRUST_EXIT_CODE} = 'false';
+	}
+
 	# In directory diff mode, 'git-difftool--helper' is called once
 	# to compare the a/b directories.  In file diff mode, 'git diff'
 	# will invoke a separate instance of 'git-difftool--helper' for
diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh
index 6a8907e..b186329 100755
--- a/git-gui/git-gui.sh
+++ b/git-gui/git-gui.sh
@@ -1558,7 +1558,11 @@
 
 	set rescan_active 2
 	ui_status [mc "Scanning for modified files ..."]
-	set fd_di [git_read diff-index --cached -z [PARENT]]
+	if {[git-version >= "1.7.2"]} {
+		set fd_di [git_read diff-index --cached --ignore-submodules=dirty -z [PARENT]]
+	} else {
+		set fd_di [git_read diff-index --cached -z [PARENT]]
+	}
 	set fd_df [git_read diff-files -z]
 
 	fconfigure $fd_di -blocking 0 -translation binary -encoding binary
diff --git a/git-gui/lib/diff.tcl b/git-gui/lib/diff.tcl
index 30d9a79..b0a5180 100644
--- a/git-gui/lib/diff.tcl
+++ b/git-gui/lib/diff.tcl
@@ -287,6 +287,9 @@
 	if {$w eq $ui_index} {
 		lappend cmd diff-index
 		lappend cmd --cached
+		if {[git-version >= "1.7.2"]} {
+			lappend cmd --ignore-submodules=dirty
+		}
 	} elseif {$w eq $ui_workdir} {
 		if {[string first {U} $m] >= 0} {
 			lappend cmd diff
diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh
index c45a020..a40d3df 100644
--- a/git-mergetool--lib.sh
+++ b/git-mergetool--lib.sh
@@ -250,7 +250,7 @@
 			tools="opendiff kdiff3 tkdiff xxdiff meld $tools"
 		fi
 		tools="$tools gvimdiff diffuse diffmerge ecmerge"
-		tools="$tools p4merge araxis bc3 codecompare"
+		tools="$tools p4merge araxis bc codecompare"
 	fi
 	case "${VISUAL:-$EDITOR}" in
 	*vim*)
diff --git a/git-mergetool.sh b/git-mergetool.sh
index 332528f..ff050e5 100755
--- a/git-mergetool.sh
+++ b/git-mergetool.sh
@@ -10,11 +10,11 @@
 
 USAGE='[--tool=tool] [--tool-help] [-y|--no-prompt|--prompt] [file to merge] ...'
 SUBDIRECTORY_OK=Yes
+NONGIT_OK=Yes
 OPTIONS_SPEC=
 TOOL_MODE=merge
 . git-sh-setup
 . git-mergetool--lib
-require_work_tree
 
 # Returns true if the mode reflects a symlink
 is_symlink () {
@@ -37,6 +37,19 @@
 	test -n "$base_mode"
 }
 
+mergetool_tmpdir_init () {
+	if test "$(git config --bool mergetool.writeToTemp)" != true
+	then
+		MERGETOOL_TMPDIR=.
+		return 0
+	fi
+	if MERGETOOL_TMPDIR=$(mktemp -d -t "git-mergetool-XXXXXX" 2>/dev/null)
+	then
+		return 0
+	fi
+	die "error: mktemp is needed when 'mergetool.writeToTemp' is true"
+}
+
 cleanup_temp_files () {
 	if test "$1" = --save-backup
 	then
@@ -46,6 +59,10 @@
 	else
 		rm -f -- "$LOCAL" "$REMOTE" "$BASE" "$BACKUP"
 	fi
+	if test "$MERGETOOL_TMPDIR" != "."
+	then
+		rmdir "$MERGETOOL_TMPDIR"
+	fi
 }
 
 describe_file () {
@@ -205,7 +222,7 @@
 		"$(git checkout-index --temp --stage="$1" "$2" 2>/dev/null)" \
 		: '\([^	]*\)	')
 
-	if test $? -eq 0 -a -n "$tmpfile"
+	if test $? -eq 0 && test -n "$tmpfile"
 	then
 		mv -- "$(git rev-parse --show-cdup)$tmpfile" "$3"
 	else
@@ -228,11 +245,27 @@
 		return 1
 	fi
 
-	ext="$$$(expr "$MERGED" : '.*\(\.[^/]*\)$')"
-	BACKUP="./$MERGED.BACKUP.$ext"
-	LOCAL="./$MERGED.LOCAL.$ext"
-	REMOTE="./$MERGED.REMOTE.$ext"
-	BASE="./$MERGED.BASE.$ext"
+	if BASE=$(expr "$MERGED" : '\(.*\)\.[^/]*$')
+	then
+		ext=$(expr "$MERGED" : '.*\(\.[^/]*\)$')
+	else
+		BASE=$MERGED
+		ext=
+	fi
+
+	mergetool_tmpdir_init
+
+	if test "$MERGETOOL_TMPDIR" != "."
+	then
+		# If we're using a temporary directory then write to the
+		# top-level of that directory.
+		BASE=${BASE##*/}
+	fi
+
+	BACKUP="$MERGETOOL_TMPDIR/${BASE}_BACKUP_$$$ext"
+	LOCAL="$MERGETOOL_TMPDIR/${BASE}_LOCAL_$$$ext"
+	REMOTE="$MERGETOOL_TMPDIR/${BASE}_REMOTE_$$$ext"
+	BASE="$MERGETOOL_TMPDIR/${BASE}_BASE_$$$ext"
 
 	base_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==1) print $1;}')
 	local_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $1;}')
@@ -256,7 +289,7 @@
 	checkout_staged_file 2 "$MERGED" "$LOCAL"
 	checkout_staged_file 3 "$MERGED" "$REMOTE"
 
-	if test -z "$local_mode" -o -z "$remote_mode"
+	if test -z "$local_mode" || test -z "$remote_mode"
 	then
 		echo "Deleted merge conflict for '$MERGED':"
 		describe_file "$local_mode" "local" "$LOCAL"
@@ -277,7 +310,7 @@
 	echo "Normal merge conflict for '$MERGED':"
 	describe_file "$local_mode" "local" "$LOCAL"
 	describe_file "$remote_mode" "remote" "$REMOTE"
-	if "$prompt" = true
+	if test "$guessed_merge_tool" = true || test "$prompt" = true
 	then
 		printf "Hit return to start merge resolution tool (%s): " "$merge_tool"
 		read ans || return 1
@@ -315,11 +348,16 @@
 	return 0
 }
 
-prompt=$(git config --bool mergetool.prompt || echo true)
+prompt=$(git config --bool mergetool.prompt)
+guessed_merge_tool=false
 
 while test $# != 0
 do
 	case "$1" in
+	--tool-help=*)
+		TOOL_MODE=${1#--tool-help=}
+		show_tool_help
+		;;
 	--tool-help)
 		show_tool_help
 		;;
@@ -371,9 +409,19 @@
 	done
 }
 
+git_dir_init
+require_work_tree
+
 if test -z "$merge_tool"
 then
-	merge_tool=$(get_merge_tool "$merge_tool") || exit
+	# Check if a merge tool has been configured
+	merge_tool=$(get_configured_merge_tool)
+	# Try to guess an appropriate merge tool if no tool has been set.
+	if test -z "$merge_tool"
+	then
+		merge_tool=$(guess_merge_tool) || exit
+		guessed_merge_tool=true
+	fi
 fi
 merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)"
 merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)"
diff --git a/git-p4.py b/git-p4.py
index 773cafc..ff132b2 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -1238,6 +1238,28 @@
             if response == 'n':
                 return False
 
+    def get_diff_description(self, editedFiles, filesToAdd):
+        # diff
+        if os.environ.has_key("P4DIFF"):
+            del(os.environ["P4DIFF"])
+        diff = ""
+        for editedFile in editedFiles:
+            diff += p4_read_pipe(['diff', '-du',
+                                  wildcard_encode(editedFile)])
+
+        # new file diff
+        newdiff = ""
+        for newFile in filesToAdd:
+            newdiff += "==== new file ====\n"
+            newdiff += "--- /dev/null\n"
+            newdiff += "+++ %s\n" % newFile
+            f = open(newFile, "r")
+            for line in f.readlines():
+                newdiff += "+" + line
+            f.close()
+
+        return (diff + newdiff).replace('\r\n', '\n')
+
     def applyCommit(self, id):
         """Apply one commit, return True if it succeeded."""
 
@@ -1398,34 +1420,15 @@
             submitTemplate += "######## Variable git-p4.skipUserNameCheck hides this message.\n"
 
         separatorLine = "######## everything below this line is just the diff #######\n"
+        if not self.prepare_p4_only:
+            submitTemplate += separatorLine
+            submitTemplate += self.get_diff_description(editedFiles, filesToAdd)
 
-        # diff
-        if os.environ.has_key("P4DIFF"):
-            del(os.environ["P4DIFF"])
-        diff = ""
-        for editedFile in editedFiles:
-            diff += p4_read_pipe(['diff', '-du',
-                                  wildcard_encode(editedFile)])
-
-        # new file diff
-        newdiff = ""
-        for newFile in filesToAdd:
-            newdiff += "==== new file ====\n"
-            newdiff += "--- /dev/null\n"
-            newdiff += "+++ %s\n" % newFile
-            f = open(newFile, "r")
-            for line in f.readlines():
-                newdiff += "+" + line
-            f.close()
-
-        # change description file: submitTemplate, separatorLine, diff, newdiff
         (handle, fileName) = tempfile.mkstemp()
-        tmpFile = os.fdopen(handle, "w+")
+        tmpFile = os.fdopen(handle, "w+b")
         if self.isWindows:
             submitTemplate = submitTemplate.replace("\n", "\r\n")
-            separatorLine = separatorLine.replace("\n", "\r\n")
-            newdiff = newdiff.replace("\n", "\r\n")
-        tmpFile.write(submitTemplate + separatorLine + diff + newdiff)
+        tmpFile.write(submitTemplate)
         tmpFile.close()
 
         if self.prepare_p4_only:
@@ -1472,9 +1475,9 @@
             tmpFile = open(fileName, "rb")
             message = tmpFile.read()
             tmpFile.close()
-            submitTemplate = message[:message.index(separatorLine)]
             if self.isWindows:
-                submitTemplate = submitTemplate.replace("\r\n", "\n")
+                message = message.replace("\r\n", "\n")
+            submitTemplate = message[:message.index(separatorLine)]
             p4_write_pipe(['submit', '-i'], submitTemplate)
 
             if self.preserveUser:
diff --git a/git-pull.sh b/git-pull.sh
index 7358fac..4d4fc77 100755
--- a/git-pull.sh
+++ b/git-pull.sh
@@ -20,7 +20,7 @@
     if [ $(git config --bool --get advice.resolveConflict || echo true) = "true" ]; then
 	die "$(gettext "Pull is not possible because you have unmerged files.
 Please, fix them up in the work tree, and then use 'git add/rm <file>'
-as appropriate to mark resolution, or use 'git commit -a'.")"
+as appropriate to mark resolution and make a commit.")"
     else
 	die "$(gettext "Pull is not possible because you have unmerged files.")"
     fi
@@ -106,7 +106,7 @@
 	-s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy)
 		case "$#,$1" in
 		*,*=*)
-			strategy=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;;
+			strategy=$(expr "z$1" : 'z-[^=]*=\(.*\)') ;;
 		1,*)
 			usage ;;
 		*)
diff --git a/git-rebase--am.sh b/git-rebase--am.sh
index ca20e1e..f923732 100644
--- a/git-rebase--am.sh
+++ b/git-rebase--am.sh
@@ -29,7 +29,13 @@
 	;;
 esac
 
-test -n "$rebase_root" && root_flag=--root
+if test -z "$rebase_root"
+	# this is now equivalent to ! -z "$upstream"
+then
+	revisions=$upstream...$orig_head
+else
+	revisions=$onto...$orig_head
+fi
 
 ret=0
 if test -n "$keep_empty"
@@ -38,14 +44,17 @@
 	# empty commits and even if it didn't the format doesn't really lend
 	# itself well to recording empty patches.  fortunately, cherry-pick
 	# makes this easy
-	git cherry-pick ${gpg_sign_opt:+"$gpg_sign_opt"} --allow-empty "$revisions"
+	git cherry-pick ${gpg_sign_opt:+"$gpg_sign_opt"} --allow-empty \
+		--right-only "$revisions" \
+		${restrict_revision+^$restrict_revision}
 	ret=$?
 else
 	rm -f "$GIT_DIR/rebased-patches"
 
-	git format-patch -k --stdout --full-index --ignore-if-in-upstream \
+	git format-patch -k --stdout --full-index --cherry-pick --right-only \
 		--src-prefix=a/ --dst-prefix=b/ --no-renames --no-cover-letter \
-		$root_flag "$revisions" >"$GIT_DIR/rebased-patches"
+		"$revisions" ${restrict_revision+^$restrict_revision} \
+		>"$GIT_DIR/rebased-patches"
 	ret=$?
 
 	if test 0 != $ret
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index f267d8b..b64dd28 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -963,7 +963,7 @@
 fi
 git rev-list $merges_option --pretty=oneline --abbrev-commit \
 	--abbrev=7 --reverse --left-right --topo-order \
-	$revisions | \
+	$revisions ${restrict_revision+^$restrict_revision} | \
 	sed -n "s/^>//p" |
 while read -r shortsha1 rest
 do
@@ -1013,7 +1013,7 @@
 	git rev-list $revisions |
 	while read rev
 	do
-		if test -f "$rewritten"/$rev -a "$(sane_grep "$rev" "$state_dir"/not-cherry-picks)" = ""
+		if test -f "$rewritten"/$rev && test "$(sane_grep "$rev" "$state_dir"/not-cherry-picks)" = ""
 		then
 			# Use -f2 because if rev-list is telling us this commit is
 			# not worthwhile, we don't want to track its multiple heads,
diff --git a/git-rebase--merge.sh b/git-rebase--merge.sh
index 66c64d7..d3fb67d 100644
--- a/git-rebase--merge.sh
+++ b/git-rebase--merge.sh
@@ -24,7 +24,7 @@
 		die "$resolvemsg"
 	fi
 
-	cmt=`cat "$state_dir/current"`
+	cmt=$(cat "$state_dir/current")
 	if ! git diff-index --quiet --ignore-submodules HEAD --
 	then
 		if ! git commit ${gpg_sign_opt:+"$gpg_sign_opt"} --no-verify -C "$cmt"
@@ -144,7 +144,7 @@
 write_basic_state
 
 msgnum=0
-for cmt in `git rev-list --reverse --no-merges "$revisions"`
+for cmt in $(git rev-list --reverse --no-merges "$revisions")
 do
 	msgnum=$(($msgnum + 1))
 	echo "$cmt" > "$state_dir/cmt.$msgnum"
diff --git a/git-rebase.sh b/git-rebase.sh
index 47ca3b9..55da9db 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -59,6 +59,7 @@
 To check out the original branch and stop rebasing, run "git rebase --abort".')
 "
 unset onto
+unset restrict_revision
 cmd=
 strategy=
 strategy_opts=
@@ -466,8 +467,8 @@
 else
 	if test -z "$onto"
 	then
-		empty_tree=`git hash-object -t tree /dev/null`
-		onto=`git commit-tree $empty_tree </dev/null`
+		empty_tree=$(git hash-object -t tree /dev/null)
+		onto=$(git commit-tree $empty_tree </dev/null)
 		squash_onto="$onto"
 	fi
 	unset upstream_name
@@ -525,10 +526,10 @@
 	;;
 0)
 	# Do not need to switch branches, we are already on it.
-	if branch_name=`git symbolic-ref -q HEAD`
+	if branch_name=$(git symbolic-ref -q HEAD)
 	then
 		head_name=$branch_name
-		branch_name=`expr "z$branch_name" : 'zrefs/heads/\(.*\)'`
+		branch_name=$(expr "z$branch_name" : 'zrefs/heads/\(.*\)')
 	else
 		head_name="detached HEAD"
 		branch_name=HEAD ;# detached
@@ -546,7 +547,7 @@
 			"${switch_to:-HEAD}")
 	if test -n "$new_upstream"
 	then
-		upstream=$new_upstream
+		restrict_revision=$new_upstream
 	fi
 fi
 
@@ -572,7 +573,7 @@
 # and if this is not an interactive rebase.
 mb=$(git merge-base "$onto" "$orig_head")
 if test "$type" != interactive && test "$upstream" = "$onto" &&
-	test "$mb" = "$onto" &&
+	test "$mb" = "$onto" && test -z "$restrict_revision" &&
 	# linear history?
 	! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null
 then
@@ -626,7 +627,7 @@
 then
 	revisions="$onto..$orig_head"
 else
-	revisions="$upstream..$orig_head"
+	revisions="${restrict_revision-$upstream}..$orig_head"
 fi
 
 run_specific_rebase
diff --git a/git-send-email.perl b/git-send-email.perl
index fdb0029..9949db0 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -80,6 +80,8 @@
     --to-cmd                <str>  * Email To: via `<str> \$patch_path`
     --cc-cmd                <str>  * Email Cc: via `<str> \$patch_path`
     --suppress-cc           <str>  * author, self, sob, cc, cccmd, body, bodycc, all.
+    --[no-]cc-cover                * Email Cc: addresses in the cover letter.
+    --[no-]to-cover                * Email To: addresses in the cover letter.
     --[no-]signed-off-by-cc        * Send to Signed-off-by: addresses. Default on.
     --[no-]suppress-from           * Send to self. Default off.
     --[no-]chain-reply-to          * Chain In-Reply-To: fields. Default off.
@@ -195,6 +197,7 @@
 
 # Variables with corresponding config settings
 my ($thread, $chain_reply_to, $suppress_from, $signed_off_by_cc);
+my ($cover_cc, $cover_to);
 my ($to_cmd, $cc_cmd);
 my ($smtp_server, $smtp_server_port, @smtp_server_options);
 my ($smtp_authuser, $smtp_encryption, $smtp_ssl_cert_path);
@@ -211,6 +214,8 @@
     "chainreplyto" => [\$chain_reply_to, 0],
     "suppressfrom" => [\$suppress_from, undef],
     "signedoffbycc" => [\$signed_off_by_cc, undef],
+    "cccover" => [\$cover_cc, undef],
+    "tocover" => [\$cover_to, undef],
     "signedoffcc" => [\$signed_off_by_cc, undef],      # Deprecated
     "validate" => [\$validate, 1],
     "multiedit" => [\$multiedit, undef],
@@ -302,6 +307,8 @@
 		    "suppress-from!" => \$suppress_from,
 		    "suppress-cc=s" => \@suppress_cc,
 		    "signed-off-cc|signed-off-by-cc!" => \$signed_off_by_cc,
+		    "cc-cover|cc-cover!" => \$cover_cc,
+		    "to-cover|to-cover!" => \$cover_to,
 		    "confirm=s" => \$confirm,
 		    "dry-run" => \$dry_run,
 		    "envelope-sender=s" => \$envelope_sender,
@@ -1113,6 +1120,18 @@
 	}
 }
 
+sub file_name_is_absolute {
+	my ($path) = @_;
+
+	# msys does not grok DOS drive-prefixes
+	if ($^O eq 'msys') {
+		return ($path =~ m#^/# || $path =~ m#^[a-zA-Z]\:#)
+	}
+
+	require File::Spec::Functions;
+	return File::Spec::Functions::file_name_is_absolute($path);
+}
+
 # Returns 1 if the message was sent, and 0 otherwise.
 # In actuality, the whole program dies when there
 # is an error sending a message.
@@ -1197,7 +1216,7 @@
 
 	if ($dry_run) {
 		# We don't want to send the email.
-	} elsif ($smtp_server =~ m#^/#) {
+	} elsif (file_name_is_absolute($smtp_server)) {
 		my $pid = open my $sm, '|-';
 		defined $pid or die $!;
 		if (!$pid) {
@@ -1271,7 +1290,7 @@
 		printf (($dry_run ? "Dry-" : "")."Sent %s\n", $subject);
 	} else {
 		print (($dry_run ? "Dry-" : "")."OK. Log says:\n");
-		if ($smtp_server !~ m#^/#) {
+		if (!file_name_is_absolute($smtp_server)) {
 			print "Server: $smtp_server\n";
 			print "MAIL FROM:<$raw_from>\n";
 			foreach my $entry (@recipients) {
@@ -1469,6 +1488,15 @@
 	@to = (@initial_to, @to);
 	@cc = (@initial_cc, @cc);
 
+	if ($message_num == 1) {
+		if (defined $cover_cc and $cover_cc) {
+			@initial_cc = @cc;
+		}
+		if (defined $cover_to and $cover_to) {
+			@initial_to = @to;
+		}
+	}
+
 	my $message_was_sent = send_message();
 
 	# set up for the next message
diff --git a/git-sh-setup.sh b/git-sh-setup.sh
index 5f28b32..d968760 100644
--- a/git-sh-setup.sh
+++ b/git-sh-setup.sh
@@ -160,7 +160,7 @@
 	else
 		GIT_PAGER=cat
 	fi
-	: ${LESS=-FRSX}
+	: ${LESS=-FRX}
 	: ${LV=-c}
 	export LESS LV
 
@@ -330,8 +330,7 @@
 
 # Make sure we are in a valid repository of a vintage we understand,
 # if we require to be in a git repository.
-if test -z "$NONGIT_OK"
-then
+git_dir_init () {
 	GIT_DIR=$(git rev-parse --git-dir) || exit
 	if [ -z "$SUBDIRECTORY_OK" ]
 	then
@@ -346,6 +345,11 @@
 		exit 1
 	}
 	: ${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"}
+}
+
+if test -z "$NONGIT_OK"
+then
+	git_dir_init
 fi
 
 peel_committish () {
diff --git a/git-stash.sh b/git-stash.sh
index 4621d81..d4cf818 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -13,7 +13,7 @@
 
 SUBDIRECTORY_OK=Yes
 OPTIONS_SPEC=
-START_DIR=`pwd`
+START_DIR=$(pwd)
 . git-sh-setup
 . git-sh-i18n
 require_work_tree
@@ -50,7 +50,7 @@
 	then
 		die "$(gettext "git stash clear with parameters is unimplemented")"
 	fi
-	if current=$(git rev-parse --verify $ref_stash 2>/dev/null)
+	if current=$(git rev-parse --verify --quiet $ref_stash)
 	then
 		git update-ref -d $ref_stash $current
 	fi
@@ -292,12 +292,12 @@
 }
 
 have_stash () {
-	git rev-parse --verify $ref_stash >/dev/null 2>&1
+	git rev-parse --verify --quiet $ref_stash >/dev/null
 }
 
 list_stash () {
 	have_stash || return 0
-	git log --format="%gd: %gs" -g "$@" $ref_stash --
+	git log --format="%gd: %gs" -g --first-parent -m "$@" $ref_stash --
 }
 
 show_stash () {
@@ -392,12 +392,12 @@
 		;;
 	esac
 
-	REV=$(git rev-parse --quiet --symbolic --verify "$1" 2>/dev/null) || {
+	REV=$(git rev-parse --symbolic --verify --quiet "$1") || {
 		reference="$1"
-		die "$(eval_gettext "\$reference is not valid reference")"
+		die "$(eval_gettext "\$reference is not a valid reference")"
 	}
 
-	i_commit=$(git rev-parse --quiet --verify "$REV^2" 2>/dev/null) &&
+	i_commit=$(git rev-parse --verify --quiet "$REV^2") &&
 	set -- $(git rev-parse "$REV" "$REV^1" "$REV:" "$REV^1:" "$REV^2:" 2>/dev/null) &&
 	s=$1 &&
 	w_commit=$1 &&
@@ -409,7 +409,7 @@
 	test "$ref_stash" = "$(git rev-parse --symbolic-full-name "${REV%@*}")" &&
 	IS_STASH_REF=t
 
-	u_commit=$(git rev-parse --quiet --verify "$REV^3" 2>/dev/null) &&
+	u_commit=$(git rev-parse --verify --quiet "$REV^3") &&
 	u_tree=$(git rev-parse "$REV^3:" 2>/dev/null)
 }
 
@@ -531,7 +531,8 @@
 		die "$(eval_gettext "\${REV}: Could not drop stash entry")"
 
 	# clear_stash if we just dropped the last stash entry
-	git rev-parse --verify "$ref_stash@{0}" >/dev/null 2>&1 || clear_stash
+	git rev-parse --verify --quiet "$ref_stash@{0}" >/dev/null ||
+	clear_stash
 }
 
 apply_to_branch () {
diff --git a/git-submodule.sh b/git-submodule.sh
index b55d83a..9245abf 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -235,7 +235,7 @@
 		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'")"
-	echo "$name"
+	printf '%s\n' "$name"
 }
 
 #
@@ -291,9 +291,6 @@
 	# resolve any symlinks that might be present in $PWD
 	a=$(cd_to_toplevel && cd "$gitdir" && pwd)/
 	b=$(cd_to_toplevel && cd "$sm_path" && pwd)/
-	# normalize Windows-style absolute paths to POSIX-style absolute paths
-	case $a in [a-zA-Z]:/*) a=/${a%%:*}${a#*:} ;; esac
-	case $b in [a-zA-Z]:/*) b=/${b%%:*}${b#*:} ;; esac
 	# 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")"
@@ -308,10 +305,10 @@
 	b=${b%/}
 
 	# Turn each leading "*/" component into "../"
-	rel=$(echo $b | sed -e 's|[^/][^/]*|..|g')
-	echo "gitdir: $rel/$a" >"$sm_path/.git"
+	rel=$(printf '%s\n' "$b" | sed -e 's|[^/][^/]*|..|g')
+	printf '%s\n' "gitdir: $rel/$a" >"$sm_path/.git"
 
-	rel=$(echo $a | sed -e 's|[^/][^/]*|..|g')
+	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")
 }
 
@@ -392,11 +389,11 @@
 	sm_path=$2
 
 	if test -z "$sm_path"; then
-		sm_path=$(echo "$repo" |
+		sm_path=$(printf '%s\n' "$repo" |
 			sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*[/:]||g')
 	fi
 
-	if test -z "$repo" -o -z "$sm_path"; then
+	if test -z "$repo" || test -z "$sm_path"; then
 		usage
 	fi
 
@@ -453,7 +450,7 @@
 	# perhaps the path exists and is already a git repo, else clone it
 	if test -e "$sm_path"
 	then
-		if test -d "$sm_path"/.git -o -f "$sm_path"/.git
+		if test -d "$sm_path"/.git || test -f "$sm_path"/.git
 		then
 			eval_gettextln "Adding existing repo at '\$sm_path' to the index"
 		else
@@ -835,7 +832,7 @@
 			continue
 		fi
 
-		if ! test -d "$sm_path"/.git -o -f "$sm_path"/.git
+		if ! test -d "$sm_path"/.git && ! test -f "$sm_path"/.git
 		then
 			module_clone "$sm_path" "$name" "$url" "$reference" "$depth" || exit
 			cloned_modules="$cloned_modules;$name"
@@ -860,11 +857,11 @@
 			die "$(eval_gettext "Unable to find current ${remote_name}/${branch} revision in submodule path '\$sm_path'")"
 		fi
 
-		if test "$subsha1" != "$sha1" -o -n "$force"
+		if test "$subsha1" != "$sha1" || test -n "$force"
 		then
 			subforce=$force
 			# If we don't already have a -f flag and the submodule has never been checked out
-			if test -z "$subsha1" -a -z "$force"
+			if test -z "$subsha1" && test -z "$force"
 			then
 				subforce="-f"
 			fi
@@ -1034,7 +1031,7 @@
 	then
 		head=$rev
 		test $# = 0 || shift
-	elif test -z "$1" -o "$1" = "HEAD"
+	elif test -z "$1" || test "$1" = "HEAD"
 	then
 		# before the first commit: compare with an empty tree
 		head=$(git hash-object -w -t tree --stdin </dev/null)
@@ -1059,17 +1056,21 @@
 		while read mod_src mod_dst sha1_src sha1_dst status sm_path
 		do
 			# Always show modules deleted or type-changed (blob<->module)
-			test $status = D -o $status = T && echo "$sm_path" && continue
+			if test "$status" = D || test "$status" = T
+			then
+				printf '%s\n' "$sm_path"
+				continue
+			fi
 			# Respect the ignore setting for --for-status.
 			if test -n "$for_status"
 			then
 				name=$(module_name "$sm_path")
 				ignore_config=$(get_submodule_config "$name" ignore none)
-				test $status != A -a $ignore_config = all && continue
+				test $status != A && test $ignore_config = all && continue
 			fi
 			# Also show added or modified modules which are checked out
 			GIT_DIR="$sm_path/.git" git-rev-parse --git-dir >/dev/null 2>&1 &&
-			echo "$sm_path"
+			printf '%s\n' "$sm_path"
 		done
 	)
 
@@ -1125,7 +1126,7 @@
 		*)
 			errmsg=
 			total_commits=$(
-			if test $mod_src = 160000 -a $mod_dst = 160000
+			if test $mod_src = 160000 && test $mod_dst = 160000
 			then
 				range="$sha1_src...$sha1_dst"
 			elif test $mod_src = 160000
@@ -1162,7 +1163,7 @@
 			# i.e. deleted or changed to blob
 			test $mod_dst = 160000 && echo "$errmsg"
 		else
-			if test $mod_src = 160000 -a $mod_dst = 160000
+			if test $mod_src = 160000 && test $mod_dst = 160000
 			then
 				limit=
 				test $summary_limit -gt 0 && limit="-$summary_limit"
@@ -1233,7 +1234,11 @@
 			say "U$sha1 $displaypath"
 			continue
 		fi
-		if test -z "$url" || ! test -d "$sm_path"/.git -o -f "$sm_path"/.git
+		if test -z "$url" ||
+		{
+			! test -d "$sm_path"/.git &&
+			! test -f "$sm_path"/.git
+		}
 		then
 			say "-$sha1 $displaypath"
 			continue;
@@ -1306,7 +1311,7 @@
 		./*|../*)
 			# rewrite foo/bar as ../.. to find path from
 			# submodule work tree to superproject work tree
-			up_path="$(echo "$sm_path" | sed "s/[^/][^/]*/../g")" &&
+			up_path="$(printf '%s\n' "$sm_path" | sed "s/[^/][^/]*/../g")" &&
 			# guarantee a trailing /
 			up_path=${up_path%/}/ &&
 			# path from submodule work tree to submodule origin repo
@@ -1402,7 +1407,7 @@
 fi
 
 # "--cached" is accepted only by "status" and "summary"
-if test -n "$cached" && test "$command" != status -a "$command" != summary
+if test -n "$cached" && test "$command" != status && test "$command" != summary
 then
 	usage
 fi
diff --git a/git-svn.perl b/git-svn.perl
index 0a32372..b6e2186 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -260,8 +260,8 @@
 			} ],
 	'find-rev' => [ \&cmd_find_rev,
 	                "Translate between SVN revision numbers and tree-ish",
-			{ 'before' => \$_before,
-			  'after' => \$_after } ],
+			{ 'B|before' => \$_before,
+			  'A|after' => \$_after } ],
 	'rebase' => [ \&cmd_rebase, "Fetch and rebase your working directory",
 			{ 'merge|m|M' => \$_merge,
 			  'verbose|v' => \$_verbose,
@@ -306,13 +306,16 @@
 }
 package main;
 
-my $term = eval {
-	$ENV{"GIT_SVN_NOTTY"}
-		? new Term::ReadLine 'git-svn', \*STDIN, \*STDOUT
-		: new Term::ReadLine 'git-svn';
-};
-if ($@) {
-	$term = new FakeTerm "$@: going non-interactive";
+my $term;
+sub term_init {
+	$term = eval {
+		$ENV{"GIT_SVN_NOTTY"}
+			? new Term::ReadLine 'git-svn', \*STDIN, \*STDOUT
+			: new Term::ReadLine 'git-svn';
+	};
+	if ($@) {
+		$term = new FakeTerm "$@: going non-interactive";
+	}
 }
 
 my $cmd;
@@ -424,6 +427,7 @@
 	my $default = $arg{default};
 	my $resp;
 	my $i = 0;
+	term_init() unless $term;
 
 	if ( !( defined($term->IN)
             && defined( fileno($term->IN) )
@@ -1161,7 +1165,9 @@
 	::_req_svn();
 
 	my $ctx = SVN::Client->new(
-		auth    => Git::SVN::Ra::_auth_providers(),
+		config => SVN::Core::config_get_config(
+			$Git::SVN::Ra::config_dir
+		),
 		log_msg => sub {
 			${ $_[0] } = defined $_message
 				? $_message
@@ -1475,10 +1481,37 @@
 	}
 }
 
-
 sub cmd_info {
-	my $path = canonicalize_path(defined($_[0]) ? $_[0] : ".");
-	my $fullpath = canonicalize_path($cmd_dir_prefix . $path);
+	my $path_arg = defined($_[0]) ? $_[0] : '.';
+	my $path = $path_arg;
+	if (File::Spec->file_name_is_absolute($path)) {
+		$path = canonicalize_path($path);
+
+		my $toplevel = eval {
+			my @cmd = qw/rev-parse --show-toplevel/;
+			command_oneline(\@cmd, STDERR => 0);
+		};
+
+		# remove $toplevel from the absolute path:
+		my ($vol, $dirs, $file) = File::Spec->splitpath($path);
+		my (undef, $tdirs, $tfile) = File::Spec->splitpath($toplevel);
+		my @dirs = File::Spec->splitdir($dirs);
+		my @tdirs = File::Spec->splitdir($tdirs);
+		pop @dirs if $dirs[-1] eq '';
+		pop @tdirs if $tdirs[-1] eq '';
+		push @dirs, $file;
+		push @tdirs, $tfile;
+		while (@tdirs && @dirs && $tdirs[0] eq $dirs[0]) {
+			shift @dirs;
+			shift @tdirs;
+		}
+		$dirs = File::Spec->catdir(@dirs);
+		$path = File::Spec->catpath($vol, $dirs);
+
+		$path = canonicalize_path($path);
+	} else {
+		$path = canonicalize_path($cmd_dir_prefix . $path);
+	}
 	if (exists $_[1]) {
 		die "Too many arguments specified\n";
 	}
@@ -1499,14 +1532,14 @@
 	# canonicalize_path() will return "" to make libsvn 1.5.x happy,
 	$path = "." if $path eq "";
 
-	my $full_url = canonicalize_url( add_path_to_url( $url, $fullpath ) );
+	my $full_url = canonicalize_url( add_path_to_url( $url, $path ) );
 
 	if ($_url) {
 		print "$full_url\n";
 		return;
 	}
 
-	my $result = "Path: $path\n";
+	my $result = "Path: $path_arg\n";
 	$result .= "Name: " . basename($path) . "\n" if $file_type ne "dir";
 	$result .= "URL: $full_url\n";
 
@@ -1537,7 +1570,7 @@
 	}
 
 	my ($lc_author, $lc_rev, $lc_date_utc);
-	my @args = Git::SVN::Log::git_svn_log_cmd($rev, $rev, "--", $fullpath);
+	my @args = Git::SVN::Log::git_svn_log_cmd($rev, $rev, "--", $path);
 	my $log = command_output_pipe(@args);
 	my $esc_color = qr/(?:\033\[(?:(?:\d+;)*\d*)?m)*/;
 	while (<$log>) {
diff --git a/git-web--browse.sh b/git-web--browse.sh
index ebdfba6..ae15253 100755
--- a/git-web--browse.sh
+++ b/git-web--browse.sh
@@ -59,7 +59,7 @@
 	-b|--browser*|-t|--tool*)
 		case "$#,$1" in
 		*,*=*)
-			browser=`expr "z$1" : 'z-[^=]*=\(.*\)'`
+			browser=$(expr "z$1" : 'z-[^=]*=\(.*\)')
 			;;
 		1,*)
 			usage ;;
@@ -71,7 +71,7 @@
 	-c|--config*)
 		case "$#,$1" in
 		*,*=*)
-			conf=`expr "z$1" : 'z-[^=]*=\(.*\)'`
+			conf=$(expr "z$1" : 'z-[^=]*=\(.*\)')
 			;;
 		1,*)
 			usage ;;
@@ -100,7 +100,7 @@
 	for opt in "$conf" "web.browser"
 	do
 		test -z "$opt" && continue
-		browser="`git config $opt`"
+		browser="$(git config $opt)"
 		test -z "$browser" || break
 	done
 	if test -n "$browser" && ! valid_tool "$browser"; then
diff --git a/git.c b/git.c
index 9efd1a3..18fbf79 100644
--- a/git.c
+++ b/git.c
@@ -14,12 +14,49 @@
 	"           <command> [<args>]";
 
 const char git_more_info_string[] =
-	N_("'git help -a' and 'git help -g' lists available subcommands and some\n"
+	N_("'git help -a' and 'git help -g' list available subcommands and some\n"
 	   "concept guides. See 'git help <command>' or 'git help <concept>'\n"
 	   "to read about a specific subcommand or concept.");
 
 static struct startup_info git_startup_info;
 static int use_pager = -1;
+static char *orig_cwd;
+static const char *env_names[] = {
+	GIT_DIR_ENVIRONMENT,
+	GIT_WORK_TREE_ENVIRONMENT,
+	GIT_IMPLICIT_WORK_TREE_ENVIRONMENT,
+	GIT_PREFIX_ENVIRONMENT
+};
+static char *orig_env[4];
+static int saved_environment;
+
+static void save_env(void)
+{
+	int i;
+	if (saved_environment)
+		return;
+	saved_environment = 1;
+	orig_cwd = xgetcwd();
+	for (i = 0; i < ARRAY_SIZE(env_names); i++) {
+		orig_env[i] = getenv(env_names[i]);
+		if (orig_env[i])
+			orig_env[i] = xstrdup(orig_env[i]);
+	}
+}
+
+static void restore_env(void)
+{
+	int i;
+	if (orig_cwd && chdir(orig_cwd))
+		die_errno("could not move to %s", orig_cwd);
+	free(orig_cwd);
+	for (i = 0; i < ARRAY_SIZE(env_names); i++) {
+		if (orig_env[i])
+			setenv(env_names[i], orig_env[i], 1);
+		else
+			unsetenv(env_names[i]);
+	}
+}
 
 static void commit_pager_choice(void) {
 	switch (use_pager) {
@@ -54,8 +91,7 @@
 		/*
 		 * Check remaining flags.
 		 */
-		if (starts_with(cmd, "--exec-path")) {
-			cmd += 11;
+		if (skip_prefix(cmd, "--exec-path", &cmd)) {
 			if (*cmd == '=')
 				git_set_argv_exec_path(cmd + 1);
 			else {
@@ -92,8 +128,8 @@
 				*envchanged = 1;
 			(*argv)++;
 			(*argc)--;
-		} else if (starts_with(cmd, "--git-dir=")) {
-			setenv(GIT_DIR_ENVIRONMENT, cmd + 10, 1);
+		} else if (skip_prefix(cmd, "--git-dir=", &cmd)) {
+			setenv(GIT_DIR_ENVIRONMENT, cmd, 1);
 			if (envchanged)
 				*envchanged = 1;
 		} else if (!strcmp(cmd, "--namespace")) {
@@ -106,8 +142,8 @@
 				*envchanged = 1;
 			(*argv)++;
 			(*argc)--;
-		} else if (starts_with(cmd, "--namespace=")) {
-			setenv(GIT_NAMESPACE_ENVIRONMENT, cmd + 12, 1);
+		} else if (skip_prefix(cmd, "--namespace=", &cmd)) {
+			setenv(GIT_NAMESPACE_ENVIRONMENT, cmd, 1);
 			if (envchanged)
 				*envchanged = 1;
 		} else if (!strcmp(cmd, "--work-tree")) {
@@ -120,14 +156,15 @@
 				*envchanged = 1;
 			(*argv)++;
 			(*argc)--;
-		} else if (starts_with(cmd, "--work-tree=")) {
-			setenv(GIT_WORK_TREE_ENVIRONMENT, cmd + 12, 1);
+		} else if (skip_prefix(cmd, "--work-tree=", &cmd)) {
+			setenv(GIT_WORK_TREE_ENVIRONMENT, cmd, 1);
 			if (envchanged)
 				*envchanged = 1;
 		} else if (!strcmp(cmd, "--bare")) {
-			static char git_dir[PATH_MAX+1];
+			char *cwd = xgetcwd();
 			is_bare_repository_cfg = 1;
-			setenv(GIT_DIR_ENVIRONMENT, getcwd(git_dir, sizeof(git_dir)), 0);
+			setenv(GIT_DIR_ENVIRONMENT, cwd, 0);
+			free(cwd);
 			setenv(GIT_IMPLICIT_WORK_TREE_ENVIRONMENT, "0", 1);
 			if (envchanged)
 				*envchanged = 1;
@@ -245,8 +282,7 @@
 				  "trace: alias expansion: %s =>",
 				  alias_command);
 
-		new_argv = xrealloc(new_argv, sizeof(char *) *
-				    (count + *argcp));
+		REALLOC_ARRAY(new_argv, count + *argcp);
 		/* insert after command name */
 		memcpy(new_argv + count, *argv + 1, sizeof(char *) * *argcp);
 
@@ -272,6 +308,7 @@
  * RUN_SETUP for reading from the configuration file.
  */
 #define NEED_WORK_TREE		(1<<3)
+#define NO_SETUP		(1<<4)
 
 struct cmd_struct {
 	const char *cmd;
@@ -290,7 +327,7 @@
 	if (!help) {
 		if (p->option & RUN_SETUP)
 			prefix = setup_git_directory();
-		if (p->option & RUN_SETUP_GENTLY) {
+		else if (p->option & RUN_SETUP_GENTLY) {
 			int nongit_ok;
 			prefix = setup_git_directory_gently(&nongit_ok);
 		}
@@ -352,7 +389,7 @@
 	{ "cherry", cmd_cherry, RUN_SETUP },
 	{ "cherry-pick", cmd_cherry_pick, RUN_SETUP | NEED_WORK_TREE },
 	{ "clean", cmd_clean, RUN_SETUP | NEED_WORK_TREE },
-	{ "clone", cmd_clone },
+	{ "clone", cmd_clone, NO_SETUP },
 	{ "column", cmd_column, RUN_SETUP_GENTLY },
 	{ "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE },
 	{ "commit-tree", cmd_commit_tree, RUN_SETUP },
@@ -378,8 +415,9 @@
 	{ "hash-object", cmd_hash_object },
 	{ "help", cmd_help },
 	{ "index-pack", cmd_index_pack, RUN_SETUP_GENTLY },
-	{ "init", cmd_init_db },
-	{ "init-db", cmd_init_db },
+	{ "init", cmd_init_db, NO_SETUP },
+	{ "init-db", cmd_init_db, NO_SETUP },
+	{ "interpret-trailers", cmd_interpret_trailers, RUN_SETUP },
 	{ "log", cmd_log, RUN_SETUP },
 	{ "ls-files", cmd_ls_files, RUN_SETUP },
 	{ "ls-remote", cmd_ls_remote, RUN_SETUP_GENTLY },
@@ -441,6 +479,7 @@
 	{ "upload-archive", cmd_upload_archive },
 	{ "upload-archive--writer", cmd_upload_archive_writer },
 	{ "var", cmd_var, RUN_SETUP_GENTLY },
+	{ "verify-commit", cmd_verify_commit, RUN_SETUP },
 	{ "verify-pack", cmd_verify_pack },
 	{ "verify-tag", cmd_verify_tag, RUN_SETUP },
 	{ "version", cmd_version },
@@ -484,6 +523,10 @@
 		struct cmd_struct *p = commands+i;
 		if (strcmp(p->cmd, cmd))
 			continue;
+		if (saved_environment && (p->option & NO_SETUP)) {
+			restore_env();
+			break;
+		}
 		exit(run_builtin(p, argc, argv));
 	}
 }
@@ -539,7 +582,10 @@
 		 * of overriding "git log" with "git show" by having
 		 * alias.log = show
 		 */
-		if (done_alias || !handle_alias(argcp, argv))
+		if (done_alias)
+			break;
+		save_env();
+		if (!handle_alias(argcp, argv))
 			break;
 		done_alias = 1;
 	}
@@ -547,6 +593,26 @@
 	return done_alias;
 }
 
+/*
+ * Many parts of Git have subprograms communicate via pipe, expect the
+ * upstream of a pipe to die with SIGPIPE when the downstream of a
+ * pipe does not need to read all that is written.  Some third-party
+ * programs that ignore or block SIGPIPE for their own reason forget
+ * to restore SIGPIPE handling to the default before spawning Git and
+ * break this carefully orchestrated machinery.
+ *
+ * Restore the way SIGPIPE is handled to default, which is what we
+ * expect.
+ */
+static void restore_sigpipe_to_default(void)
+{
+	sigset_t unblock;
+
+	sigemptyset(&unblock);
+	sigaddset(&unblock, SIGPIPE);
+	sigprocmask(SIG_UNBLOCK, &unblock, NULL);
+	signal(SIGPIPE, SIG_DFL);
+}
 
 int main(int argc, char **av)
 {
@@ -566,8 +632,12 @@
 	 */
 	sanitize_stdfds();
 
+	restore_sigpipe_to_default();
+
 	git_setup_gettext();
 
+	trace_command_performance(argv);
+
 	/*
 	 * "git-xxxx" is the same as "git xxxx", but we obviously:
 	 *
@@ -578,8 +648,7 @@
 	 * So we just directly call the builtin handler, and die if
 	 * that one cannot handle it.
 	 */
-	if (starts_with(cmd, "git-")) {
-		cmd += 4;
+	if (skip_prefix(cmd, "git-", &cmd)) {
 		argv[0] = cmd;
 		handle_builtin(argc, argv);
 		die("cannot handle %s as a builtin", cmd);
@@ -590,8 +659,8 @@
 	argc--;
 	handle_options(&argv, &argc, NULL);
 	if (argc > 0) {
-		if (starts_with(argv[0], "--"))
-			argv[0] += 2;
+		/* translate --help and --version into commands */
+		skip_prefix(argv[0], "--", &argv[0]);
 	} else {
 		/* The user didn't specify a command; give them help */
 		commit_pager_choice();
diff --git a/gitk-git/gitk b/gitk-git/gitk
index 90764e8..78358a7 100755
--- a/gitk-git/gitk
+++ b/gitk-git/gitk
@@ -294,6 +294,8 @@
 
     if {$revs eq {}} {
 	set revs HEAD
+    } elseif {[lsearch -exact $revs --all] >= 0} {
+	lappend revs HEAD
     }
     if {[catch {set ids [eval exec git rev-parse $revs]} err]} {
 	# we get stdout followed by stderr in $err
@@ -445,7 +447,7 @@
 	set pid [pid $fd]
 
 	if {$::tcl_platform(platform) eq {windows}} {
-	    exec kill -f $pid
+	    exec taskkill /pid $pid
 	} else {
 	    exec kill $pid
 	}
@@ -2585,6 +2587,7 @@
     bind $fstring <Key-Return> {dofind 1 1}
     bind $sha1entry <Key-Return> {gotocommit; break}
     bind $sha1entry <<PasteSelection>> clearsha1
+    bind $sha1entry <<Paste>> clearsha1
     bind $cflist <1> {sel_flist %W %x %y; break}
     bind $cflist <B1-Motion> {sel_flist %W %x %y; break}
     bind $cflist <ButtonRelease-1> {treeclick %W %x %y}
@@ -2593,6 +2596,9 @@
     bind $ctext $ctxbut {pop_diff_menu %W %X %Y %x %y}
     bind $ctext <Button-1> {focus %W}
     bind $ctext <<Selection>> rehighlight_search_results
+    for {set i 1} {$i < 10} {incr i} {
+	bind . <$M1B-Key-$i> [list go_to_parent $i]
+    }
 
     set maincursor [. cget -cursor]
     set textcursor [$ctext cget -cursor]
@@ -2771,23 +2777,11 @@
 }
 
 proc savestuff {w} {
-    global canv canv2 canv3 mainfont textfont uifont tabstop
-    global stuffsaved findmergefiles maxgraphpct
-    global maxwidth showneartags showlocalchanges
     global viewname viewfiles viewargs viewargscmd viewperm nextviewnum
-    global cmitmode wrapcomment datetimeformat limitdiffs
-    global colors uicolor bgcolor fgcolor diffcolors diffcontext selectbgcolor
-    global uifgcolor uifgdisabledcolor
-    global headbgcolor headfgcolor headoutlinecolor remotebgcolor
-    global tagbgcolor tagfgcolor tagoutlinecolor
-    global reflinecolor filesepbgcolor filesepfgcolor
-    global mergecolors foundbgcolor currentsearchhitbgcolor
-    global linehoverbgcolor linehoverfgcolor linehoveroutlinecolor circlecolors
-    global mainheadcirclecolor workingfilescirclecolor indexcirclecolor
-    global linkfgcolor circleoutlinecolor
-    global autoselect autosellen extdifftool perfile_attrs markbgcolor use_ttk
-    global hideremotes want_ttk maxrefs
+    global use_ttk
+    global stuffsaved
     global config_file config_file_tmp
+    global config_variables
 
     if {$stuffsaved} return
     if {![winfo viewable .]} return
@@ -2799,58 +2793,10 @@
 	if {$::tcl_platform(platform) eq {windows}} {
 	    file attributes $config_file_tmp -hidden true
 	}
-	puts $f [list set mainfont $mainfont]
-	puts $f [list set textfont $textfont]
-	puts $f [list set uifont $uifont]
-	puts $f [list set tabstop $tabstop]
-	puts $f [list set findmergefiles $findmergefiles]
-	puts $f [list set maxgraphpct $maxgraphpct]
-	puts $f [list set maxwidth $maxwidth]
-	puts $f [list set cmitmode $cmitmode]
-	puts $f [list set wrapcomment $wrapcomment]
-	puts $f [list set autoselect $autoselect]
-	puts $f [list set autosellen $autosellen]
-	puts $f [list set showneartags $showneartags]
-	puts $f [list set maxrefs $maxrefs]
-	puts $f [list set hideremotes $hideremotes]
-	puts $f [list set showlocalchanges $showlocalchanges]
-	puts $f [list set datetimeformat $datetimeformat]
-	puts $f [list set limitdiffs $limitdiffs]
-	puts $f [list set uicolor $uicolor]
-	puts $f [list set want_ttk $want_ttk]
-	puts $f [list set bgcolor $bgcolor]
-	puts $f [list set fgcolor $fgcolor]
-	puts $f [list set uifgcolor $uifgcolor]
-	puts $f [list set uifgdisabledcolor $uifgdisabledcolor]
-	puts $f [list set colors $colors]
-	puts $f [list set diffcolors $diffcolors]
-	puts $f [list set mergecolors $mergecolors]
-	puts $f [list set markbgcolor $markbgcolor]
-	puts $f [list set diffcontext $diffcontext]
-	puts $f [list set selectbgcolor $selectbgcolor]
-	puts $f [list set foundbgcolor $foundbgcolor]
-	puts $f [list set currentsearchhitbgcolor $currentsearchhitbgcolor]
-	puts $f [list set extdifftool $extdifftool]
-	puts $f [list set perfile_attrs $perfile_attrs]
-	puts $f [list set headbgcolor $headbgcolor]
-	puts $f [list set headfgcolor $headfgcolor]
-	puts $f [list set headoutlinecolor $headoutlinecolor]
-	puts $f [list set remotebgcolor $remotebgcolor]
-	puts $f [list set tagbgcolor $tagbgcolor]
-	puts $f [list set tagfgcolor $tagfgcolor]
-	puts $f [list set tagoutlinecolor $tagoutlinecolor]
-	puts $f [list set reflinecolor $reflinecolor]
-	puts $f [list set filesepbgcolor $filesepbgcolor]
-	puts $f [list set filesepfgcolor $filesepfgcolor]
-	puts $f [list set linehoverbgcolor $linehoverbgcolor]
-	puts $f [list set linehoverfgcolor $linehoverfgcolor]
-	puts $f [list set linehoveroutlinecolor $linehoveroutlinecolor]
-	puts $f [list set mainheadcirclecolor $mainheadcirclecolor]
-	puts $f [list set workingfilescirclecolor $workingfilescirclecolor]
-	puts $f [list set indexcirclecolor $indexcirclecolor]
-	puts $f [list set circlecolors $circlecolors]
-	puts $f [list set linkfgcolor $linkfgcolor]
-	puts $f [list set circleoutlinecolor $circleoutlinecolor]
+	foreach var_name $config_variables {
+	    upvar #0 $var_name var
+	    puts $f [list set $var_name $var]
+	}
 
 	puts $f "set geometry(main) [wm geometry .]"
 	puts $f "set geometry(state) [wm state .]"
@@ -3015,6 +2961,7 @@
 [mc "<Down>, n, j	Move down one commit"]
 [mc "<Left>, z, h	Go back in history list"]
 [mc "<Right>, x, l	Go forward in history list"]
+[mc "<%s-n>	Go to n-th parent of current commit in history list" $M1T]
 [mc "<PageUp>	Move up one page in commit list"]
 [mc "<PageDown>	Move down one page in commit list"]
 [mc "<%s-Home>	Scroll to top of commit list" $M1T]
@@ -3492,10 +3439,20 @@
 }
 
 proc gitknewtmpdir {} {
-    global diffnum gitktmpdir gitdir
+    global diffnum gitktmpdir gitdir env
 
     if {![info exists gitktmpdir]} {
-	set gitktmpdir [file join $gitdir [format ".gitk-tmp.%s" [pid]]]
+	if {[info exists env(GITK_TMPDIR)]} {
+	    set tmpdir $env(GITK_TMPDIR)
+	} elseif {[info exists env(TMPDIR)]} {
+	    set tmpdir $env(TMPDIR)
+	} else {
+	    set tmpdir $gitdir
+	}
+	set gitktmpformat [file join $tmpdir ".gitk-tmp.XXXXXX"]
+	if {[catch {set gitktmpdir [exec mktemp -d $gitktmpformat]}]} {
+	    set gitktmpdir [file join $gitdir [format ".gitk-tmp.%s" [pid]]]
+	}
 	if {[catch {file mkdir $gitktmpdir} err]} {
 	    error_popup "[mc "Error creating temporary directory %s:" $gitktmpdir] $err"
 	    unset gitktmpdir
@@ -3870,7 +3827,7 @@
 	    set id $nullid2
 	}
 	if {[commitinview $id $curview]} {
-	    selectline [rowofcommit $id] 1 [list $fname $lnum]
+	    selectline [rowofcommit $id] 1 [list $fname $lnum] 1
 	} else {
 	    error_popup [mc "That line comes from commit %s, \
 			     which is not in this view" [shortids $id]]
@@ -5205,11 +5162,15 @@
 # spawn off a process to do git diff-index --cached HEAD
 proc dodiffindex {} {
     global lserial showlocalchanges vfilelimit curview
-    global hasworktree
+    global hasworktree git_version
 
     if {!$showlocalchanges || !$hasworktree} return
     incr lserial
-    set cmd "|git diff-index --cached HEAD"
+    if {[package vcompare $git_version "1.7.2"] >= 0} {
+	set cmd "|git diff-index --cached --ignore-submodules=dirty HEAD"
+    } else {
+	set cmd "|git diff-index --cached HEAD"
+    }
     if {$vfilelimit($curview) ne {}} {
 	set cmd [concat $cmd -- $vfilelimit($curview)]
     }
@@ -7020,7 +6981,7 @@
 # add a list of tag or branch names at position pos
 # returns the number of names inserted
 proc appendrefs {pos ids var} {
-    global ctext linknum curview $var maxrefs mainheadid
+    global ctext linknum curview $var maxrefs visiblerefs mainheadid
 
     if {[catch {$ctext index $pos}]} {
 	return 0
@@ -7041,14 +7002,14 @@
     if {[llength $tags] > $maxrefs} {
 	# If we are displaying heads, and there are too many,
 	# see if there are some important heads to display.
-	# Currently this means "master" and the current head.
+	# Currently that are the current head and heads listed in $visiblerefs option
 	set itags {}
 	if {$var eq "idheads"} {
 	    set utags {}
 	    foreach ti $tags {
 		set hname [lindex $ti 0]
 		set id [lindex $ti 1]
-		if {($hname eq "master" || $id eq $mainheadid) &&
+		if {([lsearch -exact $visiblerefs $hname] != -1 || $id eq $mainheadid) &&
 		    [llength $itags] < $maxrefs} {
 		    lappend itags $ti
 		} else {
@@ -7161,7 +7122,7 @@
     $canv raise $t
 }
 
-proc selectline {l isnew {desired_loc {}}} {
+proc selectline {l isnew {desired_loc {}} {switch_to_patch 0}} {
     global canv ctext commitinfo selectedline
     global canvy0 linespc parents children curview
     global currentid sha1entry
@@ -7187,6 +7148,10 @@
 	setcanvscroll
     }
 
+    if {$cmitmode ne "patch" && $switch_to_patch} {
+        set cmitmode "patch"
+    }
+
     set y [expr {$canvy0 + $l * $linespc}]
     set ymax [lindex [$canv cget -scrollregion] 3]
     set ytop [expr {$y - $linespc - 1}]
@@ -7477,6 +7442,14 @@
     }
 }
 
+proc go_to_parent {i} {
+    global parents curview targetid
+    set ps $parents($curview,$targetid)
+    if {[llength $ps] >= $i} {
+	selbyid [lindex $ps [expr $i - 1]]
+    }
+}
+
 proc gettree {id} {
     global treefilelist treeidlist diffids diffmergeid treepending
     global nullid nullid2
@@ -7705,7 +7678,7 @@
 }
 
 proc diffcmd {ids flags} {
-    global log_showroot nullid nullid2
+    global log_showroot nullid nullid2 git_version
 
     set i [lsearch -exact $ids $nullid]
     set j [lsearch -exact $ids $nullid2]
@@ -7726,6 +7699,9 @@
 	    }
 	}
     } elseif {$j >= 0} {
+	if {[package vcompare $git_version "1.7.2"] >= 0} {
+	    set flags "$flags --ignore-submodules=dirty"
+	}
 	set cmd [concat | git diff-index --cached $flags]
 	if {[llength $ids] > 1} {
 	    # comparing index with specific revision
@@ -11575,7 +11551,29 @@
 proc formatdate {d} {
     global datetimeformat
     if {$d ne {}} {
-	set d [clock format [lindex $d 0] -format $datetimeformat]
+	# If $datetimeformat includes a timezone, display in the
+	# timezone of the argument.  Otherwise, display in local time.
+	if {[string match {*%[zZ]*} $datetimeformat]} {
+	    if {[catch {set d [clock format [lindex $d 0] -timezone [lindex $d 1] -format $datetimeformat]}]} {
+		# Tcl < 8.5 does not support -timezone.  Emulate it by
+		# setting TZ (e.g. TZ=<-0430>+04:30).
+		global env
+		if {[info exists env(TZ)]} {
+		    set savedTZ $env(TZ)
+		}
+		set zone [lindex $d 1]
+		set sign [string map {+ - - +} [string index $zone 0]]
+		set env(TZ) <$zone>$sign[string range $zone 1 2]:[string range $zone 3 4]
+		set d [clock format [lindex $d 0] -format $datetimeformat]
+		if {[info exists savedTZ]} {
+		    set env(TZ) $savedTZ
+		} else {
+		    unset env(TZ)
+		}
+	    }
+	} else {
+	    set d [clock format [lindex $d 0] -format $datetimeformat]
+	}
     }
     return $d
 }
@@ -12001,6 +11999,7 @@
 set showneartags 1
 set hideremotes 0
 set maxrefs 20
+set visiblerefs {"master"}
 set maxlinelen 200
 set showlocalchanges 1
 set limitdiffs 1
@@ -12111,6 +12110,19 @@
     source $config_file
 }
 
+set config_variables {
+    mainfont textfont uifont tabstop findmergefiles maxgraphpct maxwidth
+    cmitmode wrapcomment autoselect autosellen showneartags maxrefs visiblerefs
+    hideremotes showlocalchanges datetimeformat limitdiffs uicolor want_ttk
+    bgcolor fgcolor uifgcolor uifgdisabledcolor colors diffcolors mergecolors
+    markbgcolor diffcontext selectbgcolor foundbgcolor currentsearchhitbgcolor
+    extdifftool perfile_attrs headbgcolor headfgcolor headoutlinecolor
+    remotebgcolor tagbgcolor tagfgcolor tagoutlinecolor reflinecolor
+    filesepbgcolor filesepfgcolor linehoverbgcolor linehoverfgcolor
+    linehoveroutlinecolor mainheadcirclecolor workingfilescirclecolor
+    indexcirclecolor circlecolors linkfgcolor circleoutlinecolor
+}
+
 parsefont mainfont $mainfont
 eval font create mainfont [fontflags mainfont]
 eval font create mainfontbold [fontflags mainfont 1]
diff --git a/gitk-git/po/bg.po b/gitk-git/po/bg.po
index 782397e..f86a161 100644
--- a/gitk-git/po/bg.po
+++ b/gitk-git/po/bg.po
@@ -8,8 +8,8 @@
 msgstr ""
 "Project-Id-Version: gitk master\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-01-26 15:47-0800\n"
-"PO-Revision-Date: 2014-01-08 08:03+0200\n"
+"POT-Creation-Date: 2014-08-03 11:17+0300\n"
+"PO-Revision-Date: 2014-07-28 07:32+0300\n"
 "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
 "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
 "Language: bg\n"
@@ -22,11 +22,11 @@
 msgid "Couldn't get list of unmerged files:"
 msgstr "Списъкът с неслети файлове не може да бъде получен:"
 
-#: gitk:212 gitk:2353
+#: gitk:212 gitk:2379
 msgid "Color words"
 msgstr "Оцветяване на думите"
 
-#: gitk:217 gitk:2353 gitk:8103 gitk:8136
+#: gitk:217 gitk:2379 gitk:8155 gitk:8188
 msgid "Markup words"
 msgstr "Отбелязване на думите"
 
@@ -40,13 +40,16 @@
 
 #: gitk:391
 msgid "No files selected: --merge specified but no files are unmerged."
-msgstr "Не са избрани файлове — указана е опцията „--merge“, но няма неслети файлове."
+msgstr ""
+"Не са избрани файлове — указана е опцията „--merge“, но няма неслети файлове."
 
 #: gitk:394
 msgid ""
 "No files selected: --merge specified but no unmerged files are within file "
 "limit."
-msgstr "Не са избрани файлове — указана е опцията „--merge“, но няма неслети файлове в ограниченията."
+msgstr ""
+"Не са избрани файлове — указана е опцията „--merge“, но няма неслети файлове "
+"в ограниченията."
 
 #: gitk:416 gitk:564
 msgid "Error executing git log:"
@@ -56,11 +59,11 @@
 msgid "Reading"
 msgstr "Прочитане"
 
-#: gitk:494 gitk:4429
+#: gitk:494 gitk:4470
 msgid "Reading commits..."
 msgstr "Прочитане на подаванията…"
 
-#: gitk:497 gitk:1635 gitk:4432
+#: gitk:497 gitk:1635 gitk:4473
 msgid "No commits selected"
 msgstr "Не са избрани подавания"
 
@@ -76,12 +79,12 @@
 msgid "mc"
 msgstr "mc"
 
-#: gitk:1930 gitk:4222 gitk:9552 gitk:11122 gitk:11401
+#: gitk:1930 gitk:4263 gitk:9604 gitk:11174 gitk:11453
 msgid "OK"
 msgstr "Добре"
 
-#: gitk:1932 gitk:4224 gitk:9079 gitk:9158 gitk:9274 gitk:9323 gitk:9554
-#: gitk:11123 gitk:11402
+#: gitk:1932 gitk:4265 gitk:9131 gitk:9210 gitk:9326 gitk:9375 gitk:9606
+#: gitk:11175 gitk:11454
 msgid "Cancel"
 msgstr "Отказ"
 
@@ -103,7 +106,7 @@
 
 #: gitk:2072
 msgid "Start git gui"
-msgstr "Стартиране на git gui"
+msgstr "Стартиране на „git gui“"
 
 #: gitk:2074
 msgid "Quit"
@@ -137,11 +140,11 @@
 msgid "All files"
 msgstr "Всички файлове"
 
-#: gitk:2081 gitk:3975
+#: gitk:2081 gitk:4016
 msgid "View"
 msgstr "Изглед"
 
-#: gitk:2091 gitk:2101 gitk:2945
+#: gitk:2091 gitk:2101 gitk:2976
 msgid "About gitk"
 msgstr "Относно gitk"
 
@@ -153,7 +156,7 @@
 msgid "Help"
 msgstr "Помощ"
 
-#: gitk:2183 gitk:8535
+#: gitk:2183 gitk:8587
 msgid "SHA1 ID:"
 msgstr "SHA1:"
 
@@ -165,708 +168,706 @@
 msgid "Find"
 msgstr "Търсене"
 
-#: gitk:2266
-msgid "next"
-msgstr "следващо"
-
-#: gitk:2267
-msgid "prev"
-msgstr "предишно"
-
-#: gitk:2268
+#: gitk:2293
 msgid "commit"
 msgstr "подаване"
 
-#: gitk:2271 gitk:2273 gitk:4590 gitk:4613 gitk:4637 gitk:6653 gitk:6725
-#: gitk:6810
+#: gitk:2297 gitk:2299 gitk:4631 gitk:4654 gitk:4678 gitk:6698 gitk:6770
+#: gitk:6855
 msgid "containing:"
 msgstr "съдържащо:"
 
-#: gitk:2274 gitk:3457 gitk:3462 gitk:4666
+#: gitk:2300 gitk:3488 gitk:3493 gitk:4707
 msgid "touching paths:"
 msgstr "засягащо пътищата:"
 
-#: gitk:2275 gitk:4680
+#: gitk:2301 gitk:4721
 msgid "adding/removing string:"
 msgstr "добавящо/премахващо низ"
 
-#: gitk:2276 gitk:4682
+#: gitk:2302 gitk:4723
 msgid "changing lines matching:"
 msgstr "променящо редове напасващи:"
 
-#: gitk:2285 gitk:2287 gitk:4669
+#: gitk:2311 gitk:2313 gitk:4710
 msgid "Exact"
 msgstr "Точно"
 
-#: gitk:2287 gitk:4757 gitk:6621
+#: gitk:2313 gitk:4798 gitk:6666
 msgid "IgnCase"
 msgstr "Без регистър"
 
-#: gitk:2287 gitk:4639 gitk:4755 gitk:6617
+#: gitk:2313 gitk:4680 gitk:4796 gitk:6662
 msgid "Regexp"
-msgstr "Рег. изр."
+msgstr "Рег. израз"
 
-#: gitk:2289 gitk:2290 gitk:4777 gitk:4807 gitk:4814 gitk:6746 gitk:6814
+#: gitk:2315 gitk:2316 gitk:4818 gitk:4848 gitk:4855 gitk:6791 gitk:6859
 msgid "All fields"
 msgstr "Всички полета"
 
-#: gitk:2290 gitk:4774 gitk:4807 gitk:6684
+#: gitk:2316 gitk:4815 gitk:4848 gitk:6729
 msgid "Headline"
 msgstr "Първи ред"
 
-#: gitk:2291 gitk:4774 gitk:6684 gitk:6814 gitk:7283
+#: gitk:2317 gitk:4815 gitk:6729 gitk:6859 gitk:7332
 msgid "Comments"
 msgstr "Коментари"
 
-#: gitk:2291 gitk:4774 gitk:4779 gitk:4814 gitk:6684 gitk:7218 gitk:8713
-#: gitk:8728
+#: gitk:2317 gitk:4815 gitk:4820 gitk:4855 gitk:6729 gitk:7267 gitk:8765
+#: gitk:8780
 msgid "Author"
 msgstr "Автор"
 
-#: gitk:2291 gitk:4774 gitk:6684 gitk:7220
+#: gitk:2317 gitk:4815 gitk:6729 gitk:7269
 msgid "Committer"
 msgstr "Подаващ"
 
-#: gitk:2322
+#: gitk:2348
 msgid "Search"
 msgstr "Търсене"
 
-#: gitk:2330
+#: gitk:2356
 msgid "Diff"
 msgstr "Разлики"
 
-#: gitk:2332
+#: gitk:2358
 msgid "Old version"
 msgstr "Стара версия"
 
-#: gitk:2334
+#: gitk:2360
 msgid "New version"
 msgstr "Нова версия"
 
-#: gitk:2336
+#: gitk:2362
 msgid "Lines of context"
 msgstr "Контекст в редове"
 
-#: gitk:2346
+#: gitk:2372
 msgid "Ignore space change"
 msgstr "Празните знаци без значение"
 
-#: gitk:2350 gitk:2352 gitk:7842 gitk:8089
+#: gitk:2376 gitk:2378 gitk:7894 gitk:8141
 msgid "Line diff"
 msgstr "Поредови разлики"
 
-#: gitk:2417
+#: gitk:2443
 msgid "Patch"
 msgstr "Кръпка"
 
-#: gitk:2419
+#: gitk:2445
 msgid "Tree"
 msgstr "Дърво"
 
-#: gitk:2577 gitk:2597
+#: gitk:2604 gitk:2624
 msgid "Diff this -> selected"
 msgstr "Разлики между това и избраното"
 
-#: gitk:2578 gitk:2598
+#: gitk:2605 gitk:2625
 msgid "Diff selected -> this"
 msgstr "Разлики между избраното и това"
 
-#: gitk:2579 gitk:2599
+#: gitk:2606 gitk:2626
 msgid "Make patch"
 msgstr "Създаване на кръпка"
 
-#: gitk:2580 gitk:9137
+#: gitk:2607 gitk:9189
 msgid "Create tag"
 msgstr "Създаване на етикет"
 
-#: gitk:2581 gitk:9254
+#: gitk:2608 gitk:9306
 msgid "Write commit to file"
 msgstr "Запазване на подаването във файл"
 
-#: gitk:2582 gitk:9311
+#: gitk:2609 gitk:9363
 msgid "Create new branch"
 msgstr "Създаване на нов клон"
 
-#: gitk:2583
+#: gitk:2610
 msgid "Cherry-pick this commit"
 msgstr "Отбиране на това подаване"
 
-#: gitk:2584
+#: gitk:2611
 msgid "Reset HEAD branch to here"
 msgstr "Привеждане на върха на клона към текущото подаване"
 
-#: gitk:2585
+#: gitk:2612
 msgid "Mark this commit"
 msgstr "Отбелязване на това подаване"
 
-#: gitk:2586
+#: gitk:2613
 msgid "Return to mark"
 msgstr "Връщане към отбелязаното подаване"
 
-#: gitk:2587
+#: gitk:2614
 msgid "Find descendant of this and mark"
 msgstr "Откриване и отбелязване на наследниците"
 
-#: gitk:2588
+#: gitk:2615
 msgid "Compare with marked commit"
 msgstr "Сравнение с отбелязаното подаване"
 
-#: gitk:2589 gitk:2600
+#: gitk:2616 gitk:2627
 msgid "Diff this -> marked commit"
 msgstr "Разлики между това и отбелязаното"
 
-#: gitk:2590 gitk:2601
+#: gitk:2617 gitk:2628
 msgid "Diff marked commit -> this"
 msgstr "Разлики между отбелязаното и това"
 
-#: gitk:2591
+#: gitk:2618
 msgid "Revert this commit"
 msgstr "Отмяна на това подаване"
 
-#: gitk:2607
+#: gitk:2634
 msgid "Check out this branch"
 msgstr "Изтегляне на този клон"
 
-#: gitk:2608
+#: gitk:2635
 msgid "Remove this branch"
 msgstr "Изтриване на този клон"
 
-#: gitk:2615
+#: gitk:2642
 msgid "Highlight this too"
 msgstr "Отбелязване и на това"
 
-#: gitk:2616
+#: gitk:2643
 msgid "Highlight this only"
 msgstr "Отбелязване само на това"
 
-#: gitk:2617
+#: gitk:2644
 msgid "External diff"
 msgstr "Външна програма за разлики"
 
-#: gitk:2618
+#: gitk:2645
 msgid "Blame parent commit"
 msgstr "Анотиране на родителското подаване"
 
-#: gitk:2625
+#: gitk:2652
 msgid "Show origin of this line"
 msgstr "Показване на произхода на този ред"
 
-#: gitk:2626
+#: gitk:2653
 msgid "Run git gui blame on this line"
 msgstr "Изпълнение на „git gui blame“ върху този ред"
 
-#: gitk:2947
+#: gitk:2978
 msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
 "\n"
-"Copyright © 2005-2011 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"
-"Авторски права: © 2005-2011 Paul Mackerras\n"
+"Авторски права: © 2005-2014 Paul Mackerras\n"
 "\n"
 "Използвайте и разпространявайте при условията на ОПЛ на ГНУ"
 
-#: gitk:2955 gitk:3020 gitk:9738
+#: gitk:2986 gitk:3051 gitk:9790
 msgid "Close"
 msgstr "Затваряне"
 
-#: gitk:2976
+#: gitk:3007
 msgid "Gitk key bindings"
 msgstr "Клавишни комбинации"
 
-#: gitk:2979
+#: gitk:3010
 msgid "Gitk key bindings:"
 msgstr "Клавишни комбинации:"
 
-#: gitk:2981
+#: gitk:3012
 #, tcl-format
 msgid "<%s-Q>\t\tQuit"
 msgstr "<%s-Q>\t\tСпиране на програмата"
 
-#: gitk:2982
+#: gitk:3013
 #, tcl-format
 msgid "<%s-W>\t\tClose window"
 msgstr "<%s-W>\t\tЗатваряне на прозореца"
 
-#: gitk:2983
+#: gitk:3014
 msgid "<Home>\t\tMove to first commit"
 msgstr "<Home>\t\tКъм първото подаване"
 
-#: gitk:2984
+#: gitk:3015
 msgid "<End>\t\tMove to last commit"
 msgstr "<End>\t\tКъм последното подаване"
 
-#: gitk:2985
+#: gitk:3016
 msgid "<Up>, p, k\tMove up one commit"
 msgstr "<Up>, p, k\tЕдно подаване нагоре"
 
-#: gitk:2986
+#: gitk:3017
 msgid "<Down>, n, j\tMove down one commit"
 msgstr "<Down>, n, j\tЕдно подаване надолу"
 
-#: gitk:2987
+#: gitk:3018
 msgid "<Left>, z, h\tGo back in history list"
 msgstr "<Left>, z, h\tНазад в историята"
 
-#: gitk:2988
+#: gitk:3019
 msgid "<Right>, x, l\tGo forward in history list"
 msgstr "<Right>, x, l\tНапред в историята"
 
-#: gitk:2989
+#: gitk:3020
 msgid "<PageUp>\tMove up one page in commit list"
-msgstr "<PageUp>\tЕдна страница нагоре в списъка с подаванията"
+msgstr "<PageUp>\tСтраница нагоре в списъка с подаванията"
 
-#: gitk:2990
+#: gitk:3021
 msgid "<PageDown>\tMove down one page in commit list"
-msgstr "<PageDown>\tЕдна страница надолу в списъка с подаванията"
+msgstr "<PageDown>\tСтраница надолу в списъка с подаванията"
 
-#: gitk:2991
+#: gitk:3022
 #, tcl-format
 msgid "<%s-Home>\tScroll to top of commit list"
 msgstr "<%s-Home>\tКъм началото на списъка с подаванията"
 
-#: gitk:2992
+#: gitk:3023
 #, tcl-format
 msgid "<%s-End>\tScroll to bottom of commit list"
 msgstr "<%s-End>\tКъм края на списъка с подаванията"
 
-#: gitk:2993
+#: gitk:3024
 #, tcl-format
 msgid "<%s-Up>\tScroll commit list up one line"
-msgstr "<%s-Up>\tПридвижване на списъка с подавания с един ред нагоре"
+msgstr "<%s-Up>\tРед нагоре в списъка с подавания"
 
-#: gitk:2994
+#: gitk:3025
 #, tcl-format
 msgid "<%s-Down>\tScroll commit list down one line"
-msgstr "<%s-Down>\tПридвижване на списъка с подавания с един ред надолу"
+msgstr "<%s-Down>\tРед надолу в списъка с подавания"
 
-#: gitk:2995
+#: gitk:3026
 #, tcl-format
 msgid "<%s-PageUp>\tScroll commit list up one page"
-msgstr "<%s-PageUp>\tПридвижване на списъка с подавания с една страница нагоре"
+msgstr "<%s-PageUp>\tСтраница нагоре в списъка с подавания"
 
-#: gitk:2996
+#: gitk:3027
 #, tcl-format
 msgid "<%s-PageDown>\tScroll commit list down one page"
-msgstr "<%s-PageDown>\tПридвижване на списъка с подавания с една страница надолу"
+msgstr "<%s-PageDown>\tСтраница надолу в списъка с подавания"
 
-#: gitk:2997
+#: gitk:3028
 msgid "<Shift-Up>\tFind backwards (upwards, later commits)"
 msgstr "<Shift-Up>\tТърсене назад (визуално нагоре, исторически — последващи)"
 
-#: gitk:2998
+#: gitk:3029
 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)"
-msgstr "<Shift-Down>\tТърсене напред (визуално надолу, исторически — предхождащи)"
+msgstr ""
+"<Shift-Down>\tТърсене напред (визуално надолу, исторически — предхождащи)"
 
-#: gitk:2999
+#: gitk:3030
 msgid "<Delete>, b\tScroll diff view up one page"
-msgstr "<Delete>, b\tПридвижване на изгледа за разлики една страница нагоре"
+msgstr "<Delete>, b\tСтраница нагоре в изгледа за разлики"
 
-#: gitk:3000
+#: gitk:3031
 msgid "<Backspace>\tScroll diff view up one page"
-msgstr "<Backspace>\tПридвижване на изгледа за разлики една страница нагоре"
+msgstr "<Backspace>\tСтраница надолу в изгледа за разлики"
 
-#: gitk:3001
+#: gitk:3032
 msgid "<Space>\t\tScroll diff view down one page"
-msgstr "<Space>\t\tПридвижване на изгледа за разлики една страница надолу"
+msgstr "<Space>\t\tСтраница надолу в изгледа за разлики"
 
-#: gitk:3002
+#: gitk:3033
 msgid "u\t\tScroll diff view up 18 lines"
-msgstr "u\t\tПридвижване на изгледа за разлики 18 реда нагоре"
+msgstr "u\t\t18 реда нагоре в изгледа за разлики"
 
-#: gitk:3003
+#: gitk:3034
 msgid "d\t\tScroll diff view down 18 lines"
-msgstr "d\t\tПридвижване на изгледа за разлики 18 реда надолу"
+msgstr "d\t\t18 реда надолу в изгледа за разлики"
 
-#: gitk:3004
+#: gitk:3035
 #, tcl-format
 msgid "<%s-F>\t\tFind"
 msgstr "<%s-F>\t\tТърсене"
 
-#: gitk:3005
+#: gitk:3036
 #, tcl-format
 msgid "<%s-G>\t\tMove to next find hit"
 msgstr "<%s-G>\t\tКъм следващата поява"
 
-#: gitk:3006
+#: gitk:3037
 msgid "<Return>\tMove to next find hit"
 msgstr "<Return>\tКъм следващата поява"
 
-#: gitk:3007
+#: gitk:3038
 msgid "/\t\tFocus the search box"
 msgstr "/\t\tФокус върху полето за търсене"
 
-#: gitk:3008
+#: gitk:3039
 msgid "?\t\tMove to previous find hit"
 msgstr "?\t\tКъм предишната поява"
 
-#: gitk:3009
+#: gitk:3040
 msgid "f\t\tScroll diff view to next file"
-msgstr "f\t\tПридвижване на изгледа за разлики към следващия ред"
+msgstr "f\t\tСледващ файл в изгледа за разлики"
 
-#: gitk:3010
+#: gitk:3041
 #, tcl-format
 msgid "<%s-S>\t\tSearch for next hit in diff view"
 msgstr "<%s-S>\t\tТърсене на следващата поява в изгледа за разлики"
 
-#: gitk:3011
+#: gitk:3042
 #, tcl-format
 msgid "<%s-R>\t\tSearch for previous hit in diff view"
 msgstr "<%s-R>\t\tТърсене на предишната поява в изгледа за разлики"
 
-#: gitk:3012
+#: gitk:3043
 #, tcl-format
 msgid "<%s-KP+>\tIncrease font size"
 msgstr "<%s-KP+>\tПо-голям размер на шрифта"
 
-#: gitk:3013
+#: gitk:3044
 #, tcl-format
 msgid "<%s-plus>\tIncrease font size"
 msgstr "<%s-plus>\tПо-голям размер на шрифта"
 
-#: gitk:3014
+#: gitk:3045
 #, tcl-format
 msgid "<%s-KP->\tDecrease font size"
 msgstr "<%s-KP->\tПо-малък размер на шрифта"
 
-#: gitk:3015
+#: gitk:3046
 #, tcl-format
 msgid "<%s-minus>\tDecrease font size"
 msgstr "<%s-minus>\tПо-малък размер на шрифта"
 
-#: gitk:3016
+#: gitk:3047
 msgid "<F5>\t\tUpdate"
 msgstr "<F5>\t\tОбновяване"
 
-#: gitk:3471 gitk:3480
+#: gitk:3512 gitk:3521
 #, tcl-format
 msgid "Error creating temporary directory %s:"
 msgstr "Грешка при създаването на временната директория „%s“:"
 
-#: gitk:3493
+#: gitk:3534
 #, tcl-format
 msgid "Error getting \"%s\" from %s:"
 msgstr "Грешка при получаването на „%s“ от %s:"
 
-#: gitk:3556
+#: gitk:3597
 msgid "command failed:"
 msgstr "неуспешно изпълнение на команда:"
 
-#: gitk:3705
+#: gitk:3746
 msgid "No such commit"
 msgstr "Такова подаване няма"
 
-#: gitk:3719
+#: gitk:3760
 msgid "git gui blame: command failed:"
-msgstr "git gui blame: неуспешно изпълнение на команда:"
+msgstr "„git gui blame“: неуспешно изпълнение на команда:"
 
-#: gitk:3750
+#: gitk:3791
 #, tcl-format
 msgid "Couldn't read merge head: %s"
 msgstr "Върхът за сливане не може да бъде прочетен: %s"
 
-#: gitk:3758
+#: gitk:3799
 #, tcl-format
 msgid "Error reading index: %s"
 msgstr "Грешка при прочитане на индекса: %s"
 
-#: gitk:3783
+#: gitk:3824
 #, tcl-format
 msgid "Couldn't start git blame: %s"
 msgstr "Командата „git blame“ не може да бъде стартирана: %s"
 
-#: gitk:3786 gitk:6652
+#: gitk:3827 gitk:6697
 msgid "Searching"
 msgstr "Търсене"
 
-#: gitk:3818
+#: gitk:3859
 #, tcl-format
 msgid "Error running git blame: %s"
 msgstr "Грешка при изпълнението на „git blame“: %s"
 
-#: gitk:3846
+#: gitk:3887
 #, tcl-format
 msgid "That line comes from commit %s,  which is not in this view"
 msgstr "Този ред идва от подаването %s,  което не е в изгледа"
 
-#: gitk:3860
+#: gitk:3901
 msgid "External diff viewer failed:"
 msgstr "Неуспешно изпълнение на външната програма за разлики:"
 
-#: gitk:3978
+#: gitk:4019
 msgid "Gitk view definition"
 msgstr "Дефиниция на изглед в Gitk"
 
-#: gitk:3982
+#: gitk:4023
 msgid "Remember this view"
 msgstr "Запазване на този изглед"
 
-#: gitk:3983
+#: gitk:4024
 msgid "References (space separated list):"
 msgstr "Указатели (списък с разделител интервал):"
 
-#: gitk:3984
+#: gitk:4025
 msgid "Branches & tags:"
 msgstr "Клони и етикети:"
 
-#: gitk:3985
+#: gitk:4026
 msgid "All refs"
 msgstr "Всички указатели"
 
-#: gitk:3986
+#: gitk:4027
 msgid "All (local) branches"
 msgstr "Всички (локални) клони"
 
-#: gitk:3987
+#: gitk:4028
 msgid "All tags"
 msgstr "Всички етикети"
 
-#: gitk:3988
+#: gitk:4029
 msgid "All remote-tracking branches"
 msgstr "Всички следящи клони"
 
-#: gitk:3989
+#: gitk:4030
 msgid "Commit Info (regular expressions):"
 msgstr "Информация за подаване (рег. изр.):"
 
-#: gitk:3990
+#: gitk:4031
 msgid "Author:"
 msgstr "Автор:"
 
-#: gitk:3991
+#: gitk:4032
 msgid "Committer:"
 msgstr "Подал:"
 
-#: gitk:3992
+#: gitk:4033
 msgid "Commit Message:"
 msgstr "Съобщение при подаване:"
 
-#: gitk:3993
+#: gitk:4034
 msgid "Matches all Commit Info criteria"
 msgstr "Съвпадение по коя да е информация за подаването"
 
-#: gitk:3994
+#: gitk:4035
 msgid "Changes to Files:"
 msgstr "Промени по файловете:"
 
-#: gitk:3995
+#: gitk:4036
 msgid "Fixed String"
 msgstr "Дословен низ"
 
-#: gitk:3996
+#: gitk:4037
 msgid "Regular Expression"
 msgstr "Регулярен израз"
 
-#: gitk:3997
+#: gitk:4038
 msgid "Search string:"
 msgstr "Низ за търсене:"
 
-#: gitk:3998
+#: gitk:4039
 msgid ""
 "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
 "15:27:38\"):"
-msgstr "Дата на подаване („2 weeks ago“ (преди 2 седмици), „2009-03-17 15:27:38“, „March 17, 2009 15:27:38“):"
+msgstr ""
+"Дата на подаване („2 weeks ago“ (преди 2 седмици), „2009-03-17 15:27:38“, "
+"„March 17, 2009 15:27:38“):"
 
-#: gitk:3999
+#: gitk:4040
 msgid "Since:"
 msgstr "От:"
 
-#: gitk:4000
+#: gitk:4041
 msgid "Until:"
 msgstr "До:"
 
-#: gitk:4001
+#: gitk:4042
 msgid "Limit and/or skip a number of revisions (positive integer):"
-msgstr "Ограничаване и/или прескачане на определен брой версии (неотрицателно цяло число):"
+msgstr ""
+"Ограничаване и/или прескачане на определен брой версии (неотрицателно цяло "
+"число):"
 
-#: gitk:4002
+#: gitk:4043
 msgid "Number to show:"
 msgstr "Брой показани:"
 
-#: gitk:4003
+#: gitk:4044
 msgid "Number to skip:"
 msgstr "Брой прескочени:"
 
-#: gitk:4004
+#: gitk:4045
 msgid "Miscellaneous options:"
 msgstr "Разни:"
 
-#: gitk:4005
+#: gitk:4046
 msgid "Strictly sort by date"
 msgstr "Подреждане по дата"
 
-#: gitk:4006
+#: gitk:4047
 msgid "Mark branch sides"
 msgstr "Отбелязване на страните по клона"
 
-#: gitk:4007
+#: gitk:4048
 msgid "Limit to first parent"
-msgstr "Само първият родител"
+msgstr "Само първия родител"
 
-#: gitk:4008
+#: gitk:4049
 msgid "Simple history"
 msgstr "Опростена история"
 
-#: gitk:4009
+#: gitk:4050
 msgid "Additional arguments to git log:"
 msgstr "Допълнителни аргументи към „git log“:"
 
-#: gitk:4010
+#: gitk:4051
 msgid "Enter files and directories to include, one per line:"
 msgstr "Въведете файловете и директориите за включване, по елемент на ред"
 
-#: gitk:4011
+#: gitk:4052
 msgid "Command to generate more commits to include:"
-msgstr "Команда за генерирането на допълнителни подавания, които да бъдат включени:"
+msgstr ""
+"Команда за генерирането на допълнителни подавания, които да бъдат включени:"
 
-#: gitk:4135
+#: gitk:4176
 msgid "Gitk: edit view"
 msgstr "Gitk: редактиране на изглед"
 
-#: gitk:4143
+#: gitk:4184
 msgid "-- criteria for selecting revisions"
 msgstr "— критерии за избор на версии"
 
-#: gitk:4148
+#: gitk:4189
 msgid "View Name"
 msgstr "Име на изглед"
 
-#: gitk:4223
+#: gitk:4264
 msgid "Apply (F5)"
 msgstr "Прилагане (F5)"
 
-#: gitk:4261
+#: gitk:4302
 msgid "Error in commit selection arguments:"
 msgstr "Грешка в аргументите за избор на подавания:"
 
-#: gitk:4314 gitk:4366 gitk:4827 gitk:4841 gitk:6107 gitk:12184 gitk:12185
+#: gitk:4355 gitk:4407 gitk:4868 gitk:4882 gitk:6152 gitk:12281 gitk:12282
 msgid "None"
 msgstr "Няма"
 
-#: gitk:4924 gitk:4929
+#: gitk:4965 gitk:4970
 msgid "Descendant"
 msgstr "Наследник"
 
-#: gitk:4925
+#: gitk:4966
 msgid "Not descendant"
 msgstr "Не е наследник"
 
-#: gitk:4932 gitk:4937
+#: gitk:4973 gitk:4978
 msgid "Ancestor"
 msgstr "Предшественик"
 
-#: gitk:4933
+#: gitk:4974
 msgid "Not ancestor"
 msgstr "Не е предшественик"
 
-#: gitk:5223
+#: gitk:5268
 msgid "Local changes checked in to index but not committed"
 msgstr "Локални промени добавени към индекса, но неподадени"
 
-#: gitk:5259
+#: gitk:5304
 msgid "Local uncommitted changes, not checked in to index"
 msgstr "Локални промени извън индекса"
 
-#: gitk:7032
+#: gitk:7077
 msgid "and many more"
 msgstr "и още много"
 
-#: gitk:7035
+#: gitk:7080
 msgid "many"
 msgstr "много"
 
-#: gitk:7222
+#: gitk:7271
 msgid "Tags:"
 msgstr "Етикети:"
 
-#: gitk:7239 gitk:7245 gitk:8708
+#: gitk:7288 gitk:7294 gitk:8760
 msgid "Parent"
 msgstr "Родител"
 
-#: gitk:7250
+#: gitk:7299
 msgid "Child"
 msgstr "Дете"
 
-#: gitk:7259
+#: gitk:7308
 msgid "Branch"
 msgstr "Клон"
 
-#: gitk:7262
+#: gitk:7311
 msgid "Follows"
 msgstr "Следва"
 
-#: gitk:7265
+#: gitk:7314
 msgid "Precedes"
 msgstr "Предшества"
 
-#: gitk:7849
+#: gitk:7901
 #, tcl-format
 msgid "Error getting diffs: %s"
 msgstr "Грешка при получаването на разликите: %s"
 
-#: gitk:8533
+#: gitk:8585
 msgid "Goto:"
 msgstr "Към ред:"
 
-#: gitk:8554
+#: gitk:8606
 #, tcl-format
 msgid "Short SHA1 id %s is ambiguous"
-msgstr "Съкратената SHA1 %s не е еднозначна"
+msgstr "Съкратената сума по SHA1 %s не е еднозначна"
 
-#: gitk:8561
+#: gitk:8613
 #, tcl-format
 msgid "Revision %s is not known"
 msgstr "Непозната версия %s"
 
-#: gitk:8571
+#: gitk:8623
 #, tcl-format
 msgid "SHA1 id %s is not known"
-msgstr "Непозната SHA1 %s"
+msgstr "Непозната сума по SHA1 %s"
 
-#: gitk:8573
+#: gitk:8625
 #, tcl-format
 msgid "Revision %s is not in the current view"
 msgstr "Версия %s не е в текущия изглед"
 
-#: gitk:8715 gitk:8730
+#: gitk:8767 gitk:8782
 msgid "Date"
 msgstr "Дата"
 
-#: gitk:8718
+#: gitk:8770
 msgid "Children"
 msgstr "Деца"
 
-#: gitk:8781
+#: gitk:8833
 #, tcl-format
 msgid "Reset %s branch to here"
 msgstr "Зануляване на клона „%s“ към текущото подаване"
 
-#: gitk:8783
+#: gitk:8835
 msgid "Detached head: can't reset"
 msgstr "Несвързан връх: невъзможно зануляване"
 
-#: gitk:8888 gitk:8894
+#: gitk:8940 gitk:8946
 msgid "Skipping merge commit "
 msgstr "Пропускане на подаването на сливането"
 
-#: gitk:8903 gitk:8908
+#: gitk:8955 gitk:8960
 msgid "Error getting patch ID for "
 msgstr "Грешка при получаването на идентификатора на "
 
-#: gitk:8904 gitk:8909
+#: gitk:8956 gitk:8961
 msgid " - stopping\n"
 msgstr " — спиране\n"
 
-#: gitk:8914 gitk:8917 gitk:8925 gitk:8939 gitk:8948
+#: gitk:8966 gitk:8969 gitk:8977 gitk:8991 gitk:9000
 msgid "Commit "
 msgstr "Подаване"
 
-#: gitk:8918
+#: gitk:8970
 msgid ""
 " is the same patch as\n"
 "       "
@@ -874,7 +875,7 @@
 " е същата кръпка като\n"
 "       "
 
-#: gitk:8926
+#: gitk:8978
 msgid ""
 " differs from\n"
 "       "
@@ -882,135 +883,138 @@
 " се различава от\n"
 "       "
 
-#: gitk:8928
+#: gitk:8980
 msgid ""
 "Diff of commits:\n"
 "\n"
-msgstr "Разлика между подаванията:\n\n"
+msgstr ""
+"Разлика между подаванията:\n"
+"\n"
 
-#: gitk:8940 gitk:8949
+#: gitk:8992 gitk:9001
 #, tcl-format
 msgid " has %s children - stopping\n"
 msgstr " има %s деца — спиране\n"
 
-#: gitk:8968
+#: gitk:9020
 #, tcl-format
 msgid "Error writing commit to file: %s"
 msgstr "Грешка при запазването на подаването във файл: %s"
 
-#: gitk:8974
+#: gitk:9026
 #, tcl-format
 msgid "Error diffing commits: %s"
 msgstr "Грешка при изчисляването на разликите между подаванията: %s"
 
-#: gitk:9020
+#: gitk:9072
 msgid "Top"
 msgstr "Най-горе"
 
-#: gitk:9021
+#: gitk:9073
 msgid "From"
 msgstr "От"
 
-#: gitk:9026
+#: gitk:9078
 msgid "To"
 msgstr "До"
 
-#: gitk:9050
+#: gitk:9102
 msgid "Generate patch"
 msgstr "Генериране на кръпка"
 
-#: gitk:9052
+#: gitk:9104
 msgid "From:"
 msgstr "От:"
 
-#: gitk:9061
+#: gitk:9113
 msgid "To:"
 msgstr "До:"
 
-#: gitk:9070
+#: gitk:9122
 msgid "Reverse"
 msgstr "Обръщане"
 
-#: gitk:9072 gitk:9268
+#: gitk:9124 gitk:9320
 msgid "Output file:"
 msgstr "Запазване във файла:"
 
-#: gitk:9078
+#: gitk:9130
 msgid "Generate"
 msgstr "Генериране"
 
-#: gitk:9116
+#: gitk:9168
 msgid "Error creating patch:"
 msgstr "Грешка при създаването на кръпка:"
 
-#: gitk:9139 gitk:9256 gitk:9313
+#: gitk:9191 gitk:9308 gitk:9365
 msgid "ID:"
 msgstr "Идентификатор:"
 
-#: gitk:9148
+#: gitk:9200
 msgid "Tag name:"
 msgstr "Име на етикет:"
 
-#: gitk:9151
+#: gitk:9203
 msgid "Tag message is optional"
 msgstr "Съобщението за етикет е незадължително"
 
-#: gitk:9153
+#: gitk:9205
 msgid "Tag message:"
 msgstr "Съобщение за етикет:"
 
-#: gitk:9157 gitk:9322
+#: gitk:9209 gitk:9374
 msgid "Create"
 msgstr "Създаване"
 
-#: gitk:9175
+#: gitk:9227
 msgid "No tag name specified"
 msgstr "Липсва име на етикет"
 
-#: gitk:9179
+#: gitk:9231
 #, tcl-format
 msgid "Tag \"%s\" already exists"
 msgstr "Етикетът „%s“ вече съществува"
 
-#: gitk:9189
+#: gitk:9241
 msgid "Error creating tag:"
 msgstr "Грешка при създаването на етикет:"
 
-#: gitk:9265
+#: gitk:9317
 msgid "Command:"
 msgstr "Команда:"
 
-#: gitk:9273
+#: gitk:9325
 msgid "Write"
-msgstr "Pdmdpldke"
+msgstr "Запазване"
 
-#: gitk:9291
+#: gitk:9343
 msgid "Error writing commit:"
 msgstr "Грешка при запазването на подаването:"
 
-#: gitk:9318
+#: gitk:9370
 msgid "Name:"
 msgstr "Име:"
 
-#: gitk:9341
+#: gitk:9393
 msgid "Please specify a name for the new branch"
 msgstr "Укажете име за новия клон"
 
-#: gitk:9346
+#: gitk:9398
 #, tcl-format
 msgid "Branch '%s' already exists. Overwrite?"
 msgstr "Клонът „%s“ вече съществува. Да бъде ли презаписан?"
 
-#: gitk:9413
+#: gitk:9465
 #, tcl-format
 msgid "Commit %s is already included in branch %s -- really re-apply it?"
-msgstr "Подаването „%s“ вече е включено в клона „%s“ — да бъде ли приложено отново?"
+msgstr ""
+"Подаването „%s“ вече е включено в клона „%s“ — да бъде ли приложено отново?"
 
-#: gitk:9418
+#: gitk:9470
 msgid "Cherry-picking"
 msgstr "Отбиране"
 
-#: gitk:9427
+#: gitk:9479
 #, tcl-format
 msgid ""
 "Cherry-pick failed because of local changes to file '%s'.\n"
@@ -1019,7 +1023,7 @@
 "Неуспешно отбиране, защото във файла „%s“ има локални промени.\n"
 "Подайте, занулете или ги скатайте и пробвайте отново."
 
-#: gitk:9433
+#: gitk:9485
 msgid ""
 "Cherry-pick failed because of merge conflict.\n"
 "Do you wish to run git citool to resolve it?"
@@ -1027,20 +1031,20 @@
 "Неуспешно отбиране поради конфликти при сливане.\n"
 "Искате ли да ги коригирате чрез „git citool“?"
 
-#: gitk:9449 gitk:9507
+#: gitk:9501 gitk:9559
 msgid "No changes committed"
 msgstr "Не са подадени промени"
 
-#: gitk:9476
+#: gitk:9528
 #, tcl-format
 msgid "Commit %s is not included in branch %s -- really revert it?"
 msgstr "Подаването „%s“ не е включено в клона „%s“. Да бъде ли отменено?"
 
-#: gitk:9481
+#: gitk:9533
 msgid "Reverting"
 msgstr "Отмяна"
 
-#: gitk:9489
+#: gitk:9541
 #, tcl-format
 msgid ""
 "Revert failed because of local changes to the following files:%s Please "
@@ -1049,7 +1053,7 @@
 "Неуспешна отмяна, защото във файла „%s“ има локални промени.\n"
 "Подайте, занулете или ги скатайте и пробвайте отново.<"
 
-#: gitk:9493
+#: gitk:9545
 msgid ""
 "Revert failed because of merge conflict.\n"
 " Do you wish to run git citool to resolve it?"
@@ -1057,28 +1061,28 @@
 "Неуспешно отмяна поради конфликти при сливане.\n"
 "Искате ли да ги коригирате чрез „git citool“?"
 
-#: gitk:9536
+#: gitk:9588
 msgid "Confirm reset"
 msgstr "Потвърждаване на зануляването"
 
-#: gitk:9538
+#: gitk:9590
 #, tcl-format
 msgid "Reset branch %s to %s?"
-msgstr "Да се занули ли клона „%s“ към „%s“?"
+msgstr "Да се занули ли клонът „%s“ към „%s“?"
 
-#: gitk:9540
+#: gitk:9592
 msgid "Reset type:"
 msgstr "Вид зануляване:"
 
-#: gitk:9543
+#: gitk:9595
 msgid "Soft: Leave working tree and index untouched"
 msgstr "Слабо: работното дърво и индекса остават същите"
 
-#: gitk:9546
+#: gitk:9598
 msgid "Mixed: Leave working tree untouched, reset index"
 msgstr "Смесено: работното дърво остава същото, индексът се занулява"
 
-#: gitk:9549
+#: gitk:9601
 msgid ""
 "Hard: Reset working tree and index\n"
 "(discard ALL local changes)"
@@ -1086,249 +1090,251 @@
 "Силно: зануляване и на работното дърво, и на индекса\n"
 "(*ВСИЧКИ* локални промени ще бъдат безвъзвратно загубени)"
 
-#: gitk:9566
+#: gitk:9618
 msgid "Resetting"
 msgstr "Зануляване"
 
-#: gitk:9626
+#: gitk:9678
 msgid "Checking out"
 msgstr "Изтегляне"
 
-#: gitk:9679
+#: gitk:9731
 msgid "Cannot delete the currently checked-out branch"
 msgstr "Текущо изтегленият клон не може да бъде изтрит"
 
-#: gitk:9685
+#: gitk:9737
 #, tcl-format
 msgid ""
 "The commits on branch %s aren't on any other branch.\n"
 "Really delete branch %s?"
 msgstr ""
 "Подаванията на клона „%s“ не са на никой друг клон.\n"
-"Наистина ли да се изтрие клона „%s“?"
+"Наистина ли да се изтрие клонът „%s“?"
 
-#: gitk:9716
+#: gitk:9768
 #, tcl-format
 msgid "Tags and heads: %s"
 msgstr "Етикети и върхове: %s"
 
-#: gitk:9731
+#: gitk:9783
 msgid "Filter"
 msgstr "Филтриране"
 
-#: gitk:10027
+#: gitk:10079
 msgid ""
 "Error reading commit topology information; branch and preceding/following "
 "tag information will be incomplete."
-msgstr "Грешка при прочитането на топологията на подаванията. Информацията за клона и предшестващите/следващите етикети ще е непълна."
+msgstr ""
+"Грешка при прочитането на топологията на подаванията. Информацията за клона "
+"и предшестващите/следващите етикети ще е непълна."
 
-#: gitk:11004
+#: gitk:11056
 msgid "Tag"
 msgstr "Етикет"
 
-#: gitk:11008
+#: gitk:11060
 msgid "Id"
 msgstr "Идентификатор"
 
-#: gitk:11091
+#: gitk:11143
 msgid "Gitk font chooser"
 msgstr "Избор на шрифт за Gitk"
 
-#: gitk:11108
+#: gitk:11160
 msgid "B"
 msgstr "Ч"
 
-#: gitk:11111
+#: gitk:11163
 msgid "I"
 msgstr "К"
 
-#: gitk:11229
+#: gitk:11281
 msgid "Commit list display options"
 msgstr "Настройки на списъка с подавания"
 
-#: gitk:11232
+#: gitk:11284
 msgid "Maximum graph width (lines)"
 msgstr "Максимална широчина на графа (в редове)"
 
-#: gitk:11235
+#: gitk:11287
 #, tcl-format
 msgid "Maximum graph width (% of pane)"
 msgstr "Максимална широчина на графа (% от панела)"
 
-#: gitk:11238
+#: gitk:11290
 msgid "Show local changes"
 msgstr "Показване на локалните промени"
 
-#: gitk:11241
+#: gitk:11293
 msgid "Auto-select SHA1 (length)"
 msgstr "Автоматично избиране на SHA1 (дължина)"
 
-#: gitk:11245
+#: gitk:11297
 msgid "Hide remote refs"
 msgstr "Скриване на отдалечените указатели"
 
-#: gitk:11249
+#: gitk:11301
 msgid "Diff display options"
 msgstr "Настройки на показването на разликите"
 
-#: gitk:11251
+#: gitk:11303
 msgid "Tab spacing"
 msgstr "Широчина на табулатора"
 
-#: gitk:11254
+#: gitk:11306
 msgid "Display nearby tags/heads"
 msgstr "Извеждане на близките етикети и върхове"
 
-#: gitk:11257
+#: gitk:11309
 msgid "Maximum # tags/heads to show"
 msgstr "Максимален брой етикети/върхове за показване"
 
-#: gitk:11260
+#: gitk:11312
 msgid "Limit diffs to listed paths"
 msgstr "Разлика само в избраните пътища"
 
-#: gitk:11263
+#: gitk:11315
 msgid "Support per-file encodings"
 msgstr "Поддръжка на различни кодирания за всеки файл"
 
-#: gitk:11269 gitk:11416
+#: gitk:11321 gitk:11468
 msgid "External diff tool"
 msgstr "Външен инструмент за разлики"
 
-#: gitk:11270
+#: gitk:11322
 msgid "Choose..."
 msgstr "Избор…"
 
-#: gitk:11275
+#: gitk:11327
 msgid "General options"
 msgstr "Общи настройки"
 
-#: gitk:11278
+#: gitk:11330
 msgid "Use themed widgets"
 msgstr "Използване на тема за графичните обекти"
 
-#: gitk:11280
+#: gitk:11332
 msgid "(change requires restart)"
 msgstr "(промяната изисква рестартиране на Gitk)"
 
-#: gitk:11282
+#: gitk:11334
 msgid "(currently unavailable)"
 msgstr "(в момента недостъпно)"
 
-#: gitk:11293
+#: gitk:11345
 msgid "Colors: press to choose"
 msgstr "Цветове: избира се с натискане"
 
-#: gitk:11296
+#: gitk:11348
 msgid "Interface"
 msgstr "Интерфейс"
 
-#: gitk:11297
+#: gitk:11349
 msgid "interface"
 msgstr "интерфейс"
 
-#: gitk:11300
+#: gitk:11352
 msgid "Background"
 msgstr "Фон"
 
-#: gitk:11301 gitk:11331
+#: gitk:11353 gitk:11383
 msgid "background"
-msgstr "Фон"
+msgstr "фон"
 
-#: gitk:11304
+#: gitk:11356
 msgid "Foreground"
 msgstr "Знаци"
 
-#: gitk:11305
+#: gitk:11357
 msgid "foreground"
 msgstr "знаци"
 
-#: gitk:11308
+#: gitk:11360
 msgid "Diff: old lines"
 msgstr "Разлика: стари редове"
 
-#: gitk:11309
+#: gitk:11361
 msgid "diff old lines"
 msgstr "разлика, стари редове"
 
-#: gitk:11313
+#: gitk:11365
 msgid "Diff: new lines"
 msgstr "Разлика: нови редове"
 
-#: gitk:11314
+#: gitk:11366
 msgid "diff new lines"
 msgstr "разлика, нови редове"
 
-#: gitk:11318
+#: gitk:11370
 msgid "Diff: hunk header"
 msgstr "Разлика: начало на парче"
 
-#: gitk:11320
+#: gitk:11372
 msgid "diff hunk header"
 msgstr "разлика, начало на парче"
 
-#: gitk:11324
+#: gitk:11376
 msgid "Marked line bg"
 msgstr "Фон на отбелязан ред"
 
-#: gitk:11326
+#: gitk:11378
 msgid "marked line background"
-msgstr "Фон на отбелязан ред"
+msgstr "фон на отбелязан ред"
 
-#: gitk:11330
+#: gitk:11382
 msgid "Select bg"
 msgstr "Избор на фон"
 
-#: gitk:11339
+#: gitk:11391
 msgid "Fonts: press to choose"
 msgstr "Шрифтове: избира се с натискане"
 
-#: gitk:11341
+#: gitk:11393
 msgid "Main font"
 msgstr "Основен шрифт"
 
-#: gitk:11342
+#: gitk:11394
 msgid "Diff display font"
 msgstr "Шрифт за разликите"
 
-#: gitk:11343
+#: gitk:11395
 msgid "User interface font"
 msgstr "Шрифт на интерфейса"
 
-#: gitk:11365
+#: gitk:11417
 msgid "Gitk preferences"
 msgstr "Настройки на Gitk"
 
-#: gitk:11374
+#: gitk:11426
 msgid "General"
 msgstr "Общи"
 
-#: gitk:11375
+#: gitk:11427
 msgid "Colors"
 msgstr "Цветове"
 
-#: gitk:11376
+#: gitk:11428
 msgid "Fonts"
 msgstr "Шрифтове"
 
-#: gitk:11426
+#: gitk:11478
 #, tcl-format
 msgid "Gitk: choose color for %s"
-msgstr "Gitk: избор на цвят на %s"
+msgstr "Gitk: избор на цвят на „%s“"
 
-#: gitk:12080
+#: gitk:12177
 msgid "Cannot find a git repository here."
 msgstr "Тук липсва хранилище на Git."
 
-#: gitk:12127
+#: gitk:12224
 #, tcl-format
 msgid "Ambiguous argument '%s': both revision and filename"
 msgstr "Нееднозначен аргумент „%s“: има и такава версия, и такъв файл"
 
-#: gitk:12139
+#: gitk:12236
 msgid "Bad arguments to gitk:"
 msgstr "Неправилни аргументи на gitk:"
 
-#: gitk:12242
+#: gitk:12339
 msgid "Command line"
 msgstr "Команден ред"
diff --git a/gitk-git/po/vi.po b/gitk-git/po/vi.po
new file mode 100644
index 0000000..4dfe125
--- /dev/null
+++ b/gitk-git/po/vi.po
@@ -0,0 +1,1351 @@
+# 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.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gitk @@GIT_VERSION@@\n"
+"Report-Msgid-Bugs-To: Paul Mackerras <paulus@samba.org>\n"
+"POT-Creation-Date: 2013-12-14 09:24+0700\n"
+"PO-Revision-Date: 2013-12-14 14:40+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"
+"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"
+
+#: gitk:140
+msgid "Couldn't get list of unmerged files:"
+msgstr "Không thể lấy danh sách các tập-tin chưa được hòa trộn:"
+
+#: gitk:212 gitk:2353
+msgid "Color words"
+msgstr "Tô màu chữ"
+
+#: gitk:217 gitk:2353 gitk:8103 gitk:8136
+msgid "Markup words"
+msgstr "Đánh dấu chữ"
+
+#: gitk:322
+msgid "Error parsing revisions:"
+msgstr "Gặp lỗi khi phân tích điểm xét duyệt:"
+
+#: gitk:378
+msgid "Error executing --argscmd command:"
+msgstr "Gặp lỗi khi thực hiện lệnh --argscmd:"
+
+#: gitk:391
+msgid "No files selected: --merge specified but no files are unmerged."
+msgstr ""
+"Chưa chọn tập tin: --merge đã chỉ định nhưng không có tập tin chưa hòa trộn."
+
+#: gitk:394
+msgid ""
+"No files selected: --merge specified but no unmerged files are within file "
+"limit."
+msgstr ""
+"Chưa chọn tập tin: --merge đã chỉ định nhưng không có tập tin chưa hòa trộn "
+"trong giới hạn tập tin."
+
+#: gitk:416 gitk:564
+msgid "Error executing git log:"
+msgstr "Gặp lỗi khi thực hiện lệnh git log:"
+
+#: gitk:434 gitk:580
+msgid "Reading"
+msgstr "Đang đọc"
+
+#: gitk:494 gitk:4429
+msgid "Reading commits..."
+msgstr "Đang đọc các lần chuyển giao..."
+
+#: gitk:497 gitk:1635 gitk:4432
+msgid "No commits selected"
+msgstr "Chưa chọn các lần chuyển giao"
+
+#: gitk:1509
+msgid "Can't parse git log output:"
+msgstr "Không thể phân tích kết xuất từ lệnh git log:"
+
+#: gitk:1738
+msgid "No commit information available"
+msgstr "Không có thông tin về lần chuyển giao nào"
+
+#: gitk:1895
+msgid "mc"
+msgstr "mc"
+
+#: gitk:1930 gitk:4222 gitk:9552 gitk:11122 gitk:11401
+msgid "OK"
+msgstr "Đồng ý"
+
+#: gitk:1932 gitk:4224 gitk:9079 gitk:9158 gitk:9274 gitk:9323 gitk:9554
+#: gitk:11123 gitk:11402
+msgid "Cancel"
+msgstr "Thôi"
+
+#: gitk:2067
+msgid "Update"
+msgstr "Cập nhật"
+
+#: gitk:2068
+msgid "Reload"
+msgstr "Tải lại"
+
+#: gitk:2069
+msgid "Reread references"
+msgstr "Đọc lại tham chiếu"
+
+#: gitk:2070
+msgid "List references"
+msgstr "Liệt kê các tham chiếu"
+
+#: gitk:2072
+msgid "Start git gui"
+msgstr "Khởi chạy git gui"
+
+#: gitk:2074
+msgid "Quit"
+msgstr "Thoát"
+
+#: gitk:2066
+msgid "File"
+msgstr "Chính"
+
+#: gitk:2078
+msgid "Preferences"
+msgstr "Cá nhân hóa"
+
+#: gitk:2077
+msgid "Edit"
+msgstr "Chỉnh sửa"
+
+#: gitk:2082
+msgid "New view..."
+msgstr "Thêm trình bày mới..."
+
+#: gitk:2083
+msgid "Edit view..."
+msgstr "Sửa cách trình bày..."
+
+#: gitk:2084
+msgid "Delete view"
+msgstr "Xóa cách trình bày"
+
+#: gitk:2086
+msgid "All files"
+msgstr "Mọi tập tin"
+
+#: gitk:2081 gitk:3975
+msgid "View"
+msgstr "Trình bày"
+
+#: gitk:2091 gitk:2101 gitk:2945
+msgid "About gitk"
+msgstr "Giới thiệu về gitk"
+
+#: gitk:2092 gitk:2106
+msgid "Key bindings"
+msgstr "Tổ hợp phím"
+
+#: gitk:2090 gitk:2105
+msgid "Help"
+msgstr "Trợ giúp"
+
+#: gitk:2183 gitk:8535
+msgid "SHA1 ID:"
+msgstr "SHA1 ID:"
+
+#: gitk:2227
+msgid "Row"
+msgstr "Hàng"
+
+#: gitk:2265
+msgid "Find"
+msgstr "Tìm"
+
+#: gitk:2266
+msgid "next"
+msgstr "tiếp"
+
+#: gitk:2267
+msgid "prev"
+msgstr "trước"
+
+#: gitk:2268
+msgid "commit"
+msgstr "lần chuyển giao"
+
+#: gitk:2271 gitk:2273 gitk:4590 gitk:4613 gitk:4637 gitk:6653 gitk:6725
+#: gitk:6810
+msgid "containing:"
+msgstr "có chứa:"
+
+#: gitk:2274 gitk:3457 gitk:3462 gitk:4666
+msgid "touching paths:"
+msgstr "đang chạm đường dẫn:"
+
+#: gitk:2275 gitk:4680
+msgid "adding/removing string:"
+msgstr "thêm/gỡ bỏ chuỗi:"
+
+#: gitk:2276 gitk:4682
+msgid "changing lines matching:"
+msgstr "những dòng thay đổi khớp mẫu:"
+
+#: gitk:2285 gitk:2287 gitk:4669
+msgid "Exact"
+msgstr "Chính xác"
+
+#: gitk:2287 gitk:4757 gitk:6621
+msgid "IgnCase"
+msgstr "BquaHt"
+
+#: gitk:2287 gitk:4639 gitk:4755 gitk:6617
+msgid "Regexp"
+msgstr "BTCQ"
+
+#: gitk:2289 gitk:2290 gitk:4777 gitk:4807 gitk:4814 gitk:6746 gitk:6814
+msgid "All fields"
+msgstr "Mọi trường"
+
+#: gitk:2290 gitk:4774 gitk:4807 gitk:6684
+msgid "Headline"
+msgstr "Nội dung chính"
+
+#: gitk:2291 gitk:4774 gitk:6684 gitk:6814 gitk:7283
+msgid "Comments"
+msgstr "Ghi chú"
+
+#: gitk:2291 gitk:4774 gitk:4779 gitk:4814 gitk:6684 gitk:7218 gitk:8713
+#: gitk:8728
+msgid "Author"
+msgstr "Tác giả"
+
+#: gitk:2291 gitk:4774 gitk:6684 gitk:7220
+msgid "Committer"
+msgstr "Người chuyển giao"
+
+#: gitk:2322
+msgid "Search"
+msgstr "Tìm kiếm"
+
+#: gitk:2330
+msgid "Diff"
+msgstr "So sánh"
+
+#: gitk:2332
+msgid "Old version"
+msgstr "Phiên bản cũ"
+
+#: gitk:2334
+msgid "New version"
+msgstr "Phiên bản mới"
+
+#: gitk:2336
+msgid "Lines of context"
+msgstr "Các dòng của nội dung"
+
+#: gitk:2346
+msgid "Ignore space change"
+msgstr "Không xét đến thay đổi do khoảng trắng"
+
+#: gitk:2350 gitk:2352 gitk:7842 gitk:8089
+msgid "Line diff"
+msgstr "Khác biệt theo dòng"
+
+#: gitk:2417
+msgid "Patch"
+msgstr "Vá"
+
+#: gitk:2419
+msgid "Tree"
+msgstr "Cây"
+
+#: gitk:2577 gitk:2597
+msgid "Diff this -> selected"
+msgstr "So sánh cái này -> cái đã chọn"
+
+#: gitk:2578 gitk:2598
+msgid "Diff selected -> this"
+msgstr "So sánh cái đã chọn -> cái này"
+
+#: gitk:2579 gitk:2599
+msgid "Make patch"
+msgstr "Tạo miếng vá"
+
+#: gitk:2580 gitk:9137
+msgid "Create tag"
+msgstr "Tạo thẻ"
+
+#: gitk:2581 gitk:9254
+msgid "Write commit to file"
+msgstr "Ghi lần chuyển giao ra tập tin"
+
+#: gitk:2582 gitk:9311
+msgid "Create new branch"
+msgstr "Tạo nhánh mới"
+
+#: gitk:2583
+msgid "Cherry-pick this commit"
+msgstr "Cherry-pick lần chuyển giao này"
+
+#: gitk:2584
+msgid "Reset HEAD branch to here"
+msgstr "Đặt lại HEAD của nhánh vào đây"
+
+#: gitk:2585
+msgid "Mark this commit"
+msgstr "Đánh dấu lần chuyển giao này"
+
+#: gitk:2586
+msgid "Return to mark"
+msgstr "Quay lại vị trí dấu"
+
+#: gitk:2587
+msgid "Find descendant of this and mark"
+msgstr "Tìm con cháu của cái này và cái đã đánh dấu"
+
+#: gitk:2588
+msgid "Compare with marked commit"
+msgstr "So sánh với lần chuyển giao đã đánh dấu"
+
+#: gitk:2589 gitk:2600
+msgid "Diff this -> marked commit"
+msgstr "So sánh cái này -> lần chuyển giao đã đánh dấu"
+
+#: gitk:2590 gitk:2601
+msgid "Diff marked commit -> this"
+msgstr "So sánh lần chuyển giao đã đánh dấu -> cái này"
+
+#: gitk:2591
+msgid "Revert this commit"
+msgstr "Hoàn lại lần chuyển giao này"
+
+#: gitk:2607
+msgid "Check out this branch"
+msgstr "Checkout nhánh này"
+
+#: gitk:2608
+msgid "Remove this branch"
+msgstr "Gỡ bỏ nhánh này"
+
+#: gitk:2615
+msgid "Highlight this too"
+msgstr "Cũng tô sáng nó"
+
+#: gitk:2616
+msgid "Highlight this only"
+msgstr "Chỉ tô sáng cái này"
+
+#: gitk:2617
+msgid "External diff"
+msgstr "diff từ bên ngoài"
+
+#: gitk:2618
+msgid "Blame parent commit"
+msgstr "Xem công trạng lần chuyển giao cha mẹ"
+
+#: gitk:2625
+msgid "Show origin of this line"
+msgstr "Hiển thị nguyên gốc của dòng này"
+
+#: gitk:2626
+msgid "Run git gui blame on this line"
+msgstr "Chạy lệnh git gui blame cho dòng này"
+
+#: gitk:2947
+msgid ""
+"\n"
+"Gitk - a commit viewer for git\n"
+"\n"
+"Copyright © 2005-2011 Paul Mackerras\n"
+"\n"
+"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"
+"\n"
+"Bản quyền © 2005-2011 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"
+
+#: gitk:2955 gitk:3020 gitk:9738
+msgid "Close"
+msgstr "Đóng"
+
+#: gitk:2976
+msgid "Gitk key bindings"
+msgstr "Tổ hợp phím gitk"
+
+#: gitk:2979
+msgid "Gitk key bindings:"
+msgstr "Tổ hợp phím gitk:"
+
+#: gitk:2981
+#, tcl-format
+msgid "<%s-Q>\t\tQuit"
+msgstr "<%s-Q>\t\tThoát"
+
+#: gitk:2982
+#, tcl-format
+msgid "<%s-W>\t\tClose window"
+msgstr "<%s-W>\t\tĐóng cửa sổ"
+
+#: gitk:2983
+msgid "<Home>\t\tMove to first commit"
+msgstr "<Home>\t\tChuyển đến lần chuyển giao đầu tiên"
+
+#: gitk:2984
+msgid "<End>\t\tMove to last commit"
+msgstr "<End>\t\tChuyển đến lần chuyển giao cuối"
+
+#: gitk:2985
+msgid "<Up>, p, k\tMove up one commit"
+msgstr "<Up>, p, k\tDi chuyển lên một lần chuyển giao"
+
+#: gitk:2986
+msgid "<Down>, n, j\tMove down one commit"
+msgstr "<Down>, n, j\tDi chuyển xuống một lần chuyển giao"
+
+#: gitk:2987
+msgid "<Left>, z, h\tGo back in history list"
+msgstr "<Left>, z, h\tQuay trở lại danh sách lịch sử"
+
+#: gitk:2988
+msgid "<Right>, x, l\tGo forward in history list"
+msgstr "<Right>, x, l\tDi chuyển tiếp trong danh sách lịch sử"
+
+#: gitk:2989
+msgid "<PageUp>\tMove up one page in commit list"
+msgstr "<PageUp>\tDi chuyển lên một trang trong danh sách lần chuyển giao"
+
+#: gitk:2990
+msgid "<PageDown>\tMove down one page in commit list"
+msgstr "<PageDown>\tDi chuyển xuống một trang trong danh sách lần chuyển giao"
+
+#: gitk:2991
+#, tcl-format
+msgid "<%s-Home>\tScroll to top of commit list"
+msgstr "<%s-Home>\tCuộn lên trên cùng của danh sách lần chuyển giao"
+
+#: gitk:2992
+#, tcl-format
+msgid "<%s-End>\tScroll to bottom of commit list"
+msgstr "<%s-End>\tCuộn xuống dưới cùng của danh sách lần chuyển giao"
+
+#: gitk:2993
+#, tcl-format
+msgid "<%s-Up>\tScroll commit list up one line"
+msgstr "<%s-Up>\tCuộn danh sách lần chuyển giao lên một dòng"
+
+#: gitk:2994
+#, tcl-format
+msgid "<%s-Down>\tScroll commit list down one line"
+msgstr "<%s-Down>\tCuộn danh sách lần chuyển giao xuống một dòng"
+
+#: gitk:2995
+#, tcl-format
+msgid "<%s-PageUp>\tScroll commit list up one page"
+msgstr "<%s-PageUp>\tCuộn danh sách lần chuyển giao lên một trang"
+
+#: gitk:2996
+#, tcl-format
+msgid "<%s-PageDown>\tScroll commit list down one page"
+msgstr "<%s-PageDown>\tCuộn danh sách lần chuyển giao xuống một trang"
+
+#: gitk:2997
+msgid "<Shift-Up>\tFind backwards (upwards, later commits)"
+msgstr "<Shift-Up>\tTìm về phía sau (hướng lên trên, lần chuyển giao sau này)"
+
+#: gitk:2998
+msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)"
+msgstr ""
+"<Shift-Down>\tTìm về phía trước (hướng xuống dưới, lần chuyển giao trước đây)"
+
+#: gitk:2999
+msgid "<Delete>, b\tScroll diff view up one page"
+msgstr "<Delete>, b\tCuộn phần trình bày diff lên một trang"
+
+#: gitk:3000
+msgid "<Backspace>\tScroll diff view up one page"
+msgstr "<Backspace>\tCuộn phần trình bày diff lên một trang"
+
+#: gitk:3001
+msgid "<Space>\t\tScroll diff view down one page"
+msgstr "<Space>\t\tCuộn phần trình bày diff xuống một trang"
+
+#: gitk:3002
+msgid "u\t\tScroll diff view up 18 lines"
+msgstr "u\t\tCuộn phần trình bày diff lên 18 dòng"
+
+#: gitk:3003
+msgid "d\t\tScroll diff view down 18 lines"
+msgstr "d\t\tCuộn phần trình bày diff xuống 18 dòng"
+
+#: gitk:3004
+#, tcl-format
+msgid "<%s-F>\t\tFind"
+msgstr "<%s-F>\t\tTìm kiếm"
+
+#: gitk:3005
+#, tcl-format
+msgid "<%s-G>\t\tMove to next find hit"
+msgstr "<%s-G>\t\tDi chuyển đến chỗ gặp kế tiếp"
+
+#: gitk:3006
+msgid "<Return>\tMove to next find hit"
+msgstr "<Return>\t\tDi chuyển đến chỗ gặp kế tiếp"
+
+#: gitk:3007
+msgid "/\t\tFocus the search box"
+msgstr "/\t\tĐưa con trỏ chuột vào ô tìm kiếm"
+
+#: gitk:3008
+msgid "?\t\tMove to previous find hit"
+msgstr "?\t\tDi chuyển đến chỗ gặp kế trước"
+
+#: gitk:3009
+msgid "f\t\tScroll diff view to next file"
+msgstr "f\t\tCuộn phần trình bày diff sang tập-tin kế"
+
+#: gitk:3010
+#, tcl-format
+msgid "<%s-S>\t\tSearch for next hit in diff view"
+msgstr "<%s-S>\t\tTìm đến chỗ khác biệt kế tiếp"
+
+#: gitk:3011
+#, tcl-format
+msgid "<%s-R>\t\tSearch for previous hit in diff view"
+msgstr "<%s-R>\t\tTìm đến chỗ khác biệt kế trước"
+
+#: gitk:3012
+#, tcl-format
+msgid "<%s-KP+>\tIncrease font size"
+msgstr "<%s-KP+>\tTăng cỡ chữ"
+
+#: gitk:3013
+#, tcl-format
+msgid "<%s-plus>\tIncrease font size"
+msgstr "<%s-plus>\tTăng cỡ chữ"
+
+#: gitk:3014
+#, tcl-format
+msgid "<%s-KP->\tDecrease font size"
+msgstr "<%s-KP->\tGiảm cỡ chữ"
+
+#: gitk:3015
+#, tcl-format
+msgid "<%s-minus>\tDecrease font size"
+msgstr "<%s-minus>\tGiảm cỡ chữ"
+
+#: gitk:3016
+msgid "<F5>\t\tUpdate"
+msgstr "<F5>\t\tCập nhật"
+
+#: gitk:3471 gitk:3480
+#, tcl-format
+msgid "Error creating temporary directory %s:"
+msgstr "Gặp lỗi khi tạo thư mục tạm %s:"
+
+#: gitk:3493
+#, tcl-format
+msgid "Error getting \"%s\" from %s:"
+msgstr "Lỗi chào hỏi \"%s\" từ %s:"
+
+#: gitk:3556
+msgid "command failed:"
+msgstr "lệnh gặp lỗi:"
+
+#: gitk:3705
+msgid "No such commit"
+msgstr "Không có lần chuyển giao như vậy"
+
+#: gitk:3719
+msgid "git gui blame: command failed:"
+msgstr "git gui blame: lệnh gặp lỗi:"
+
+#: gitk:3750
+#, tcl-format
+msgid "Couldn't read merge head: %s"
+msgstr "Không thể độc đầu của hòa trộn: %s"
+
+# tcl-format
+#: gitk:3758
+#, tcl-format
+msgid "Error reading index: %s"
+msgstr "Gặp lỗi khi đọc chỉ mục: %s"
+
+#: gitk:3783
+#, tcl-format
+msgid "Couldn't start git blame: %s"
+msgstr "Không thể khởi chạy git blame: %s"
+
+#: gitk:3786 gitk:6652
+msgid "Searching"
+msgstr "Đang tìm kiếm"
+
+#: gitk:3818
+#, tcl-format
+msgid "Error running git blame: %s"
+msgstr "Gặp lỗi khi chạy git blame: %s"
+
+#: gitk:3846
+#, tcl-format
+msgid "That line comes from commit %s,  which is not in this view"
+msgstr "Dòng đến từ lần chuyển giao %s, cái mà không trong trình bày này"
+
+#: gitk:3860
+msgid "External diff viewer failed:"
+msgstr "Bộ trình bày diff từ bên ngoài gặp lỗi:"
+
+#: gitk:3978
+msgid "Gitk view definition"
+msgstr "Định nghĩa cách trình bày gitk"
+
+#: gitk:3982
+msgid "Remember this view"
+msgstr "Nhớ cách trình bày này"
+
+#: gitk:3983
+msgid "References (space separated list):"
+msgstr "Tham chiếu (danh sách ngăn cách bằng dấu cách):"
+
+#: gitk:3984
+msgid "Branches & tags:"
+msgstr "Nhánh & thẻ:"
+
+#: gitk:3985
+msgid "All refs"
+msgstr "Mọi tham chiếu"
+
+#: gitk:3986
+msgid "All (local) branches"
+msgstr "Mọi nhánh (nội bộ)"
+
+#: gitk:3987
+msgid "All tags"
+msgstr "Mọi thẻ"
+
+#: gitk:3988
+msgid "All remote-tracking branches"
+msgstr "Mọi nhánh remote-tracking"
+
+#: gitk:3989
+msgid "Commit Info (regular expressions):"
+msgstr "Thông tin chuyển giao (biểu thức chính quy):"
+
+#: gitk:3990
+msgid "Author:"
+msgstr "Tác giả:"
+
+#: gitk:3991
+msgid "Committer:"
+msgstr "Người chuyển giao:"
+
+#: gitk:3992
+msgid "Commit Message:"
+msgstr "Chú thích của lần chuyển giao:"
+
+#: gitk:3993
+msgid "Matches all Commit Info criteria"
+msgstr "Khớp mọi điều kiện Thông tin Chuyển giao"
+
+#: gitk:3994
+msgid "Changes to Files:"
+msgstr "Đổi thành Tập tin:"
+
+#: gitk:3995
+msgid "Fixed String"
+msgstr "Chuỗi cố định"
+
+#: gitk:3996
+msgid "Regular Expression"
+msgstr "Biểu thức chính quy"
+
+#: gitk:3997
+msgid "Search string:"
+msgstr "Chuỗi tìm kiếm:"
+
+#: gitk:3998
+msgid ""
+"Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
+"15:27:38\"):"
+msgstr ""
+"Ngày chuyển giao (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
+"15:27:38\"):"
+
+#: gitk:3999
+msgid "Since:"
+msgstr "Kể từ:"
+
+#: gitk:4000
+msgid "Until:"
+msgstr "Đến:"
+
+#: gitk:4001
+msgid "Limit and/or skip a number of revisions (positive integer):"
+msgstr "Giới hạn và/hoặc bỏ số của điểm xét (số nguyên âm):"
+
+#: gitk:4002
+msgid "Number to show:"
+msgstr "Số lượng hiển thị:"
+
+#: gitk:4003
+msgid "Number to skip:"
+msgstr "Số lượng sẽ bỏ qua:"
+
+#: gitk:4004
+msgid "Miscellaneous options:"
+msgstr "Tuỳ chọn hỗn hợp:"
+
+#: gitk:4005
+msgid "Strictly sort by date"
+msgstr "Sắp xếp chặt chẽ theo ngày"
+
+#: gitk:4006
+msgid "Mark branch sides"
+msgstr "Đánh dấu các cạnh nhánh"
+
+#: gitk:4007
+msgid "Limit to first parent"
+msgstr "Giới hạn thành cha mẹ đầu tiên"
+
+#: gitk:4008
+msgid "Simple history"
+msgstr "Lịch sử dạng đơn giản"
+
+#: gitk:4009
+msgid "Additional arguments to git log:"
+msgstr "Đối số bổ xung cho lệnh git log:"
+
+#: gitk:4010
+msgid "Enter files and directories to include, one per line:"
+msgstr "Nhập vào các tập tin và thư mục bao gồm, mỗi dòng một cái:"
+
+#: gitk:4011
+msgid "Command to generate more commits to include:"
+msgstr "Lệnh tạo ra nhiều lần chuyển giao hơn bao gồm:"
+
+#: gitk:4135
+msgid "Gitk: edit view"
+msgstr "Gitk: sửa cách trình bày"
+
+#: gitk:4143
+msgid "-- criteria for selecting revisions"
+msgstr "-- tiêu chuẩn chọn điểm xét duyệt"
+
+#: gitk:4148
+msgid "View Name"
+msgstr "Tên cách trình bày"
+
+#: gitk:4223
+msgid "Apply (F5)"
+msgstr "Áp dụng (F5)"
+
+#: gitk:4261
+msgid "Error in commit selection arguments:"
+msgstr "Lỗi trong các đối số chọn chuyển giao:"
+
+#: gitk:4314 gitk:4366 gitk:4827 gitk:4841 gitk:6107 gitk:12184 gitk:12185
+msgid "None"
+msgstr "Không"
+
+#: gitk:4924 gitk:4929
+msgid "Descendant"
+msgstr "Con cháu"
+
+#: gitk:4925
+msgid "Not descendant"
+msgstr "Không có con cháu"
+
+#: gitk:4932 gitk:4937
+msgid "Ancestor"
+msgstr "Tổ tiên chung"
+
+#: gitk:4933
+msgid "Not ancestor"
+msgstr "Không có chung tổ tiên"
+
+#: gitk:5223
+msgid "Local changes checked in to index but not committed"
+msgstr ""
+"Có thay đổi nội bộ đã được đưa vào bảng mục lục, nhưng chưa được chuyển giao"
+
+#: gitk:5259
+msgid "Local uncommitted changes, not checked in to index"
+msgstr "Có thay đổi nội bộ, nhưng chưa được đưa vào bảng mục lục"
+
+#: gitk:7032
+msgid "and many more"
+msgstr "và nhiều nữa"
+
+#: gitk:7035
+msgid "many"
+msgstr "nhiều"
+
+#: gitk:7222
+msgid "Tags:"
+msgstr "Thẻ:"
+
+#: gitk:7239 gitk:7245 gitk:8708
+msgid "Parent"
+msgstr "Cha"
+
+#: gitk:7250
+msgid "Child"
+msgstr "Con"
+
+#: gitk:7259
+msgid "Branch"
+msgstr "Nhánh"
+
+#: gitk:7262
+msgid "Follows"
+msgstr "Đứng sau"
+
+#: gitk:7265
+msgid "Precedes"
+msgstr "Đứng trước"
+
+# tcl-format
+#: gitk:7849
+#, tcl-format
+msgid "Error getting diffs: %s"
+msgstr "Lỗi lấy diff: %s"
+
+#: gitk:8533
+msgid "Goto:"
+msgstr "Nhảy tới:"
+
+#: gitk:8554
+#, tcl-format
+msgid "Short SHA1 id %s is ambiguous"
+msgstr "Định danh SHA1 dạng ngắn %s là chưa đủ rõ ràng"
+
+#: gitk:8561
+#, tcl-format
+msgid "Revision %s is not known"
+msgstr "Không hiểu điểm xét duyệt %s"
+
+#: gitk:8571
+#, tcl-format
+msgid "SHA1 id %s is not known"
+msgstr "Không hiểu định danh SHA1 %s"
+
+#: gitk:8573
+#, tcl-format
+msgid "Revision %s is not in the current view"
+msgstr "Điểm %s không ở trong phần hiển thị hiện tại"
+
+#: gitk:8715 gitk:8730
+msgid "Date"
+msgstr "Ngày"
+
+#: gitk:8718
+msgid "Children"
+msgstr "Con cháu"
+
+#: gitk:8781
+#, tcl-format
+msgid "Reset %s branch to here"
+msgstr "Đặt lại nhánh %s tại đây"
+
+#: gitk:8783
+msgid "Detached head: can't reset"
+msgstr "Head đã bị tách rời: không thể đặt lại"
+
+#: gitk:8888 gitk:8894
+msgid "Skipping merge commit "
+msgstr "Bỏ qua lần chuyển giao hòa trộn "
+
+#: gitk:8903 gitk:8908
+msgid "Error getting patch ID for "
+msgstr "Gặp lỗi khi lấy ID miếng vá cho "
+
+#: gitk:8904 gitk:8909
+msgid " - stopping\n"
+msgstr " - dừng\n"
+
+#: gitk:8914 gitk:8917 gitk:8925 gitk:8939 gitk:8948
+msgid "Commit "
+msgstr "Commit "
+
+#: gitk:8918
+msgid ""
+" is the same patch as\n"
+"       "
+msgstr ""
+" là cùng một miếng vá với\n"
+"       "
+
+#: gitk:8926
+msgid ""
+" differs from\n"
+"       "
+msgstr ""
+" khác biệt từ\n"
+"       "
+
+#: gitk:8928
+msgid ""
+"Diff of commits:\n"
+"\n"
+msgstr ""
+"Khác biệt của lần chuyển giao (commit):\n"
+"\n"
+
+#: gitk:8940 gitk:8949
+#, tcl-format
+msgid " has %s children - stopping\n"
+msgstr " có %s con - dừng\n"
+
+#: gitk:8968
+#, tcl-format
+msgid "Error writing commit to file: %s"
+msgstr "Gặp lỗi trong quá trình ghi lần chuyển giao vào tập tin: %s"
+
+#: gitk:8974
+#, tcl-format
+msgid "Error diffing commits: %s"
+msgstr "Gặp lỗi khi so sánh sự khác biệt giữa các lần chuyển giao: %s"
+
+#: gitk:9020
+msgid "Top"
+msgstr "Đỉnh"
+
+#: gitk:9021
+msgid "From"
+msgstr "Từ"
+
+#: gitk:9026
+msgid "To"
+msgstr "Đến"
+
+#: gitk:9050
+msgid "Generate patch"
+msgstr "Tạo miếng vá"
+
+#: gitk:9052
+msgid "From:"
+msgstr "Từ:"
+
+#: gitk:9061
+msgid "To:"
+msgstr "Đến:"
+
+#: gitk:9070
+msgid "Reverse"
+msgstr "Đảo ngược"
+
+#: gitk:9072 gitk:9268
+msgid "Output file:"
+msgstr "Tập tin kết xuất:"
+
+#: gitk:9078
+msgid "Generate"
+msgstr "Tạo"
+
+#: gitk:9116
+msgid "Error creating patch:"
+msgstr "Gặp lỗi khi tạo miếng vá:"
+
+#: gitk:9139 gitk:9256 gitk:9313
+msgid "ID:"
+msgstr "ID:"
+
+#: gitk:9148
+msgid "Tag name:"
+msgstr "Tên thẻ:"
+
+#: gitk:9151
+msgid "Tag message is optional"
+msgstr "Ghi chú thẻ chỉ là tùy chọn"
+
+#: gitk:9153
+msgid "Tag message:"
+msgstr "Ghi chú cho thẻ:"
+
+#: gitk:9157 gitk:9322
+msgid "Create"
+msgstr "Tạo"
+
+#: gitk:9175
+msgid "No tag name specified"
+msgstr "Chưa chỉ ra tên của thẻ"
+
+#: gitk:9179
+#, tcl-format
+msgid "Tag \"%s\" already exists"
+msgstr "Thẻ “%s” đã có sẵn rồi"
+
+#: gitk:9189
+msgid "Error creating tag:"
+msgstr "Gặp lỗi khi tạo thẻ:"
+
+#: gitk:9265
+msgid "Command:"
+msgstr "Lệnh:"
+
+#: gitk:9273
+msgid "Write"
+msgstr "Ghi"
+
+#: gitk:9291
+msgid "Error writing commit:"
+msgstr "Gặp lỗi trong quá trình ghi chuyển giao:"
+
+#: gitk:9318
+msgid "Name:"
+msgstr "Tên:"
+
+#: gitk:9341
+msgid "Please specify a name for the new branch"
+msgstr "Vui lòng chỉ định tên cho nhánh mới"
+
+#: gitk:9346
+#, tcl-format
+msgid "Branch '%s' already exists. Overwrite?"
+msgstr "Nhánh “%s” đã có từ trước rồi. Ghi đè?"
+
+#: gitk:9413
+#, tcl-format
+msgid "Commit %s is already included in branch %s -- really re-apply it?"
+msgstr ""
+"Lần chuyển giao %s đã sẵn được bao gồm trong nhánh %s -- bạn có thực sự muốn "
+"áp dụng lại nó không?"
+
+#: gitk:9418
+msgid "Cherry-picking"
+msgstr "Đang cherry-pick"
+
+#: gitk:9427
+#, tcl-format
+msgid ""
+"Cherry-pick failed because of local changes to file '%s'.\n"
+"Please commit, reset or stash your changes and try again."
+msgstr ""
+"Cherry-pick gặp lỗi bởi vì các thay đổi nội bộ tập tin “%s”.\n"
+"Xin hãy chuyển giao, reset hay stash các thay đổi của bạn sau đó thử lại."
+
+#: gitk:9433
+msgid ""
+"Cherry-pick failed because of merge conflict.\n"
+"Do you wish to run git citool to resolve it?"
+msgstr ""
+"Cherry-pick gặp lỗi bởi vì xung đột trong hòa trộn.\n"
+"Bạn có muốn chạy lệnh “git citool” để giải quyết vấn đề này không?"
+
+#: gitk:9449 gitk:9507
+msgid "No changes committed"
+msgstr "Không có thay đổi nào cần chuyển giao"
+
+#: gitk:9476
+#, tcl-format
+msgid "Commit %s is not included in branch %s -- really revert it?"
+msgstr ""
+"Lần chuyển giao %s không được bao gồm trong nhánh %s -- bạn có thực sự muốn "
+"“revert” nó không?"
+
+#: gitk:9481
+msgid "Reverting"
+msgstr "Đang hoàn tác"
+
+#: gitk:9489
+#, 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 ""
+"Revert gặp lỗi bởi vì tập tin sau đã được thay đổi nội bộ:%s\n"
+"Xin hãy chạy lệnh “commit”, “reset” hoặc “stash” rồi thử lại."
+
+#: gitk:9493
+msgid ""
+"Revert failed because of merge conflict.\n"
+" Do you wish to run git citool to resolve it?"
+msgstr ""
+"Revert gặp lỗi bởi vì xung đột hòa trộn.\n"
+" Bạn có muốn chạy lệnh “git citool” để phân giải nó không?"
+
+#: gitk:9536
+msgid "Confirm reset"
+msgstr "Xác nhật đặt lại"
+
+#: gitk:9538
+#, tcl-format
+msgid "Reset branch %s to %s?"
+msgstr "Đặt lại nhánh “%s” thành “%s”?"
+
+#: gitk:9540
+msgid "Reset type:"
+msgstr "Kiểu đặt lại:"
+
+#: gitk:9543
+msgid "Soft: Leave working tree and index untouched"
+msgstr "Mềm: Không động đến thư mục làm việc và bảng mục lục"
+
+#: gitk:9546
+msgid "Mixed: Leave working tree untouched, reset index"
+msgstr ""
+"Pha trộn: Không động chạm đến thư mục làm việc nhưng đặt lại bảng mục lục"
+
+#: gitk:9549
+msgid ""
+"Hard: Reset working tree and index\n"
+"(discard ALL local changes)"
+msgstr ""
+"Hard: Đặt lại cây làm việc và mục lục\n"
+"(hủy bỏ MỌI thay đổi nội bộ)"
+
+#: gitk:9566
+msgid "Resetting"
+msgstr "Đang đặt lại"
+
+#: gitk:9626
+msgid "Checking out"
+msgstr "Đang checkout"
+
+#: gitk:9679
+msgid "Cannot delete the currently checked-out branch"
+msgstr "Không thể xóa nhánh hiện tại đang được lấy ra"
+
+#: gitk:9685
+#, tcl-format
+msgid ""
+"The commits on branch %s aren't on any other branch.\n"
+"Really delete branch %s?"
+msgstr ""
+"Các lần chuyển giao trên nhánh %s không ở trên nhánh khác.\n"
+"Thực sự muốn xóa nhánh %s?"
+
+#: gitk:9716
+#, tcl-format
+msgid "Tags and heads: %s"
+msgstr "Thẻ và Đầu: %s"
+
+#: gitk:9731
+msgid "Filter"
+msgstr "Bộ lọc"
+
+#: gitk:10027
+msgid ""
+"Error reading commit topology information; branch and preceding/following "
+"tag information will be incomplete."
+msgstr ""
+"Gặp lỗi khi đọc thông tin hình học lần chuyển giao; thông tin nhánh và thẻ "
+"trước/sau sẽ không hoàn thiện."
+
+#: gitk:11004
+msgid "Tag"
+msgstr "Thẻ"
+
+#: gitk:11008
+msgid "Id"
+msgstr "Id"
+
+#: gitk:11091
+msgid "Gitk font chooser"
+msgstr "Hộp thoại chọn phông Gitk"
+
+#: gitk:11108
+msgid "B"
+msgstr "B"
+
+#: gitk:11111
+msgid "I"
+msgstr "I"
+
+#: gitk:11229
+msgid "Commit list display options"
+msgstr "Các tùy chọn về hiển thị danh sách lần chuyển giao"
+
+#: gitk:11232
+msgid "Maximum graph width (lines)"
+msgstr "Độ rộng biểu đồ tối đa (dòng)"
+
+#: gitk:11235
+#, tcl-format
+msgid "Maximum graph width (% of pane)"
+msgstr "Độ rộng biểu đồ tối đa (% của bảng)"
+
+#: gitk:11238
+msgid "Show local changes"
+msgstr "Hiển thị các thay đổi nội bộ"
+
+#: gitk:11241
+msgid "Auto-select SHA1 (length)"
+msgstr "Tự chọn SHA1 (độ dài)"
+
+#: gitk:11245
+msgid "Hide remote refs"
+msgstr "Ẩn tham chiếu đến máy chủ"
+
+#: gitk:11249
+msgid "Diff display options"
+msgstr "Các tùy chọn trình bày các khác biệt"
+
+#: gitk:11251
+msgid "Tab spacing"
+msgstr "Khoảng cách tab"
+
+#: gitk:11254
+msgid "Display nearby tags/heads"
+msgstr "Hiển thị các thẻ/đầu xung quanh"
+
+#: gitk:11257
+msgid "Maximum # tags/heads to show"
+msgstr "Số lượng thẻ/đầu tối đa sẽ hiển thị"
+
+#: gitk:11260
+msgid "Limit diffs to listed paths"
+msgstr "Giới hạn các khác biệt cho đường dẫn đã liệt kê"
+
+#: gitk:11263
+msgid "Support per-file encodings"
+msgstr "Hỗ trợ mã hóa mỗi-dòng"
+
+#: gitk:11269 gitk:11416
+msgid "External diff tool"
+msgstr "Công cụ so sánh từ bên ngoài"
+
+#: gitk:11270
+msgid "Choose..."
+msgstr "Chọn..."
+
+#: gitk:11275
+msgid "General options"
+msgstr "Các tùy chọn chung"
+
+#: gitk:11278
+msgid "Use themed widgets"
+msgstr "Dùng các widget chủ đề"
+
+#: gitk:11280
+msgid "(change requires restart)"
+msgstr "(để thay đổi cần khởi động lại)"
+
+#: gitk:11282
+msgid "(currently unavailable)"
+msgstr "(hiện tại không sẵn sàng)"
+
+#: gitk:11293
+msgid "Colors: press to choose"
+msgstr "Màu sắc: bấm vào nút phía dưới để chọn màu"
+
+#: gitk:11296
+msgid "Interface"
+msgstr "Giao diện"
+
+#: gitk:11297
+msgid "interface"
+msgstr "giao diện"
+
+#: gitk:11300
+msgid "Background"
+msgstr "Nền"
+
+#: gitk:11301 gitk:11331
+msgid "background"
+msgstr "nền"
+
+#: gitk:11304
+msgid "Foreground"
+msgstr "Tiền cảnh"
+
+#: gitk:11305
+msgid "foreground"
+msgstr "tiền cảnh"
+
+#: gitk:11308
+msgid "Diff: old lines"
+msgstr "So sánh: dòng cũ"
+
+#: gitk:11309
+msgid "diff old lines"
+msgstr "diff dòng cũ"
+
+#: gitk:11313
+msgid "Diff: new lines"
+msgstr "So sánh: dòng mới"
+
+#: gitk:11314
+msgid "diff new lines"
+msgstr "màu dòng mới"
+
+#: gitk:11318
+msgid "Diff: hunk header"
+msgstr "So sánh: phần đầu của đoạn"
+
+#: gitk:11320
+msgid "diff hunk header"
+msgstr "màu của phần đầu của đoạn khi so sánh"
+
+#: gitk:11324
+msgid "Marked line bg"
+msgstr "Nền dòng đánh dấu"
+
+#: gitk:11326
+msgid "marked line background"
+msgstr "nền dòng được đánh dấu"
+
+#: gitk:11330
+msgid "Select bg"
+msgstr "Màu nền"
+
+#: gitk:11339
+msgid "Fonts: press to choose"
+msgstr "Phông chữ: bấm vào các nút ở dưới để chọn"
+
+#: gitk:11341
+msgid "Main font"
+msgstr "Phông chữ chính"
+
+#: gitk:11342
+msgid "Diff display font"
+msgstr "Phông chữ dùng khi so sánh"
+
+#: gitk:11343
+msgid "User interface font"
+msgstr "Phông chữ giao diện"
+
+#: gitk:11365
+msgid "Gitk preferences"
+msgstr "Cá nhân hóa các cài đặt cho Gitk"
+
+#: gitk:11374
+msgid "General"
+msgstr "Chung"
+
+#: gitk:11375
+msgid "Colors"
+msgstr "Màu sắc"
+
+#: gitk:11376
+msgid "Fonts"
+msgstr "Phông chữ"
+
+#: gitk:11426
+#, tcl-format
+msgid "Gitk: choose color for %s"
+msgstr "Gitk: chọn màu cho %s"
+
+#: gitk:12080
+msgid "Cannot find a git repository here."
+msgstr "Không thể tìm thấy kho git ở đây."
+
+#: gitk:12127
+#, tcl-format
+msgid "Ambiguous argument '%s': both revision and filename"
+msgstr "Đối số “%s” chưa rõ ràng: vừa là điểm xét duyệt vừa là tên tập tin"
+
+#: gitk:12139
+msgid "Bad arguments to gitk:"
+msgstr "Đối số không hợp lệ cho gitk:"
+
+#: gitk:12242
+msgid "Command line"
+msgstr "Dòng lệnh"
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index a9f57d6..ccf7516 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -4100,7 +4100,7 @@
 	if ($use_pathinfo) {
 		$action .= "/".esc_url($project);
 	}
-	print $cgi->startform(-method => "get", -action => $action) .
+	print $cgi->start_form(-method => "get", -action => $action) .
 	      "<div class=\"search\">\n" .
 	      (!$use_pathinfo &&
 	      $cgi->input({-name=>"p", -value=>$project, -type=>"hidden"}) . "\n") .
@@ -5510,7 +5510,7 @@
 	}
 
 	print "<div class=\"projsearch\">\n";
-	print $cgi->startform(-method => 'get', -action => $my_uri) .
+	print $cgi->start_form(-method => 'get', -action => $my_uri) .
 	      $cgi->hidden(-name => 'a', -value => 'project_list')  . "\n";
 	print $cgi->hidden(-name => 'pf', -value => $project_filter). "\n"
 		if (defined $project_filter);
diff --git a/gpg-interface.c b/gpg-interface.c
index 8b0e874..68b0c81 100644
--- a/gpg-interface.c
+++ b/gpg-interface.c
@@ -7,6 +7,77 @@
 static char *configured_signing_key;
 static const char *gpg_program = "gpg";
 
+#define PGP_SIGNATURE "-----BEGIN PGP SIGNATURE-----"
+#define PGP_MESSAGE "-----BEGIN PGP MESSAGE-----"
+
+void signature_check_clear(struct signature_check *sigc)
+{
+	free(sigc->payload);
+	free(sigc->gpg_output);
+	free(sigc->gpg_status);
+	free(sigc->signer);
+	free(sigc->key);
+	sigc->payload = NULL;
+	sigc->gpg_output = NULL;
+	sigc->gpg_status = NULL;
+	sigc->signer = NULL;
+	sigc->key = NULL;
+}
+
+static struct {
+	char result;
+	const char *check;
+} sigcheck_gpg_status[] = {
+	{ 'G', "\n[GNUPG:] GOODSIG " },
+	{ 'B', "\n[GNUPG:] BADSIG " },
+	{ 'U', "\n[GNUPG:] TRUST_NEVER" },
+	{ 'U', "\n[GNUPG:] TRUST_UNDEFINED" },
+};
+
+void parse_gpg_output(struct signature_check *sigc)
+{
+	const char *buf = sigc->gpg_status;
+	int i;
+
+	/* Iterate over all search strings */
+	for (i = 0; i < ARRAY_SIZE(sigcheck_gpg_status); i++) {
+		const char *found, *next;
+
+		if (!skip_prefix(buf, sigcheck_gpg_status[i].check + 1, &found)) {
+			found = strstr(buf, sigcheck_gpg_status[i].check);
+			if (!found)
+				continue;
+			found += strlen(sigcheck_gpg_status[i].check);
+		}
+		sigc->result = sigcheck_gpg_status[i].result;
+		/* The trust messages are not followed by key/signer information */
+		if (sigc->result != 'U') {
+			sigc->key = xmemdupz(found, 16);
+			found += 17;
+			next = strchrnul(found, '\n');
+			sigc->signer = xmemdupz(found, next - found);
+		}
+	}
+}
+
+/*
+ * Look at GPG signed content (e.g. a signed tag object), whose
+ * payload is followed by a detached signature on it.  Return the
+ * offset where the embedded detached signature begins, or the end of
+ * the data when there is no such signature.
+ */
+size_t parse_signature(const char *buf, unsigned long size)
+{
+	char *eol;
+	size_t len = 0;
+	while (len < size && !starts_with(buf + len, PGP_SIGNATURE) &&
+			!starts_with(buf + len, PGP_MESSAGE)) {
+		eol = memchr(buf + len, '\n', size - len);
+		len += eol ? eol - (buf + len) + 1 : size - len;
+	}
+	return len;
+}
+
 void set_signing_key(const char *key)
 {
 	free(configured_signing_key);
@@ -41,12 +112,11 @@
  */
 int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key)
 {
-	struct child_process gpg;
+	struct child_process gpg = CHILD_PROCESS_INIT;
 	const char *args[4];
 	ssize_t len;
 	size_t i, j, bottom;
 
-	memset(&gpg, 0, sizeof(gpg));
 	gpg.argv = args;
 	gpg.in = -1;
 	gpg.out = -1;
@@ -102,7 +172,7 @@
 			 const char *signature, size_t signature_size,
 			 struct strbuf *gpg_output, struct strbuf *gpg_status)
 {
-	struct child_process gpg;
+	struct child_process gpg = CHILD_PROCESS_INIT;
 	const char *args_gpg[] = {NULL, "--status-fd=1", "--verify", "FILE", "-", NULL};
 	char path[PATH_MAX];
 	int fd, ret;
@@ -119,7 +189,6 @@
 			     path, strerror(errno));
 	close(fd);
 
-	memset(&gpg, 0, sizeof(gpg));
 	gpg.argv = args_gpg;
 	gpg.in = -1;
 	gpg.out = -1;
diff --git a/gpg-interface.h b/gpg-interface.h
index a85cb5b..87a4f2e 100644
--- a/gpg-interface.h
+++ b/gpg-interface.h
@@ -2,17 +2,26 @@
 #define GPG_INTERFACE_H
 
 struct signature_check {
+	char *payload;
 	char *gpg_output;
 	char *gpg_status;
-	char result; /* 0 (not checked),
-		      * N (checked but no further result),
-		      * U (untrusted good),
-		      * G (good)
-		      * B (bad) */
+
+	/*
+	 * possible "result":
+	 * 0 (not checked)
+	 * N (checked but no further result)
+	 * U (untrusted good)
+	 * G (good)
+	 * B (bad)
+	 */
+	char result;
 	char *signer;
 	char *key;
 };
 
+extern void signature_check_clear(struct signature_check *sigc);
+extern size_t parse_signature(const char *buf, unsigned long size);
+extern void parse_gpg_output(struct signature_check *);
 extern int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key);
 extern int verify_signed_buffer(const char *payload, size_t payload_size, const char *signature, size_t signature_size, struct strbuf *gpg_output, struct strbuf *gpg_status);
 extern int git_gpg_config(const char *, const char *, void *);
diff --git a/graph.c b/graph.c
index 6404331..c25a09a 100644
--- a/graph.c
+++ b/graph.c
@@ -267,16 +267,10 @@
 		graph->column_capacity *= 2;
 	} while (graph->column_capacity < num_columns);
 
-	graph->columns = xrealloc(graph->columns,
-				  sizeof(struct column) *
-				  graph->column_capacity);
-	graph->new_columns = xrealloc(graph->new_columns,
-				      sizeof(struct column) *
-				      graph->column_capacity);
-	graph->mapping = xrealloc(graph->mapping,
-				  sizeof(int) * 2 * graph->column_capacity);
-	graph->new_mapping = xrealloc(graph->new_mapping,
-				      sizeof(int) * 2 * graph->column_capacity);
+	REALLOC_ARRAY(graph->columns, graph->column_capacity);
+	REALLOC_ARRAY(graph->new_columns, graph->column_capacity);
+	REALLOC_ARRAY(graph->mapping, graph->column_capacity * 2);
+	REALLOC_ARRAY(graph->new_mapping, graph->column_capacity * 2);
 }
 
 /*
@@ -1145,7 +1139,7 @@
 
 static void graph_padding_line(struct git_graph *graph, struct strbuf *sb)
 {
-	int i, j;
+	int i;
 
 	if (graph->state != GRAPH_COMMIT) {
 		graph_next_line(graph, sb);
@@ -1161,21 +1155,11 @@
 	 */
 	for (i = 0; i < graph->num_columns; i++) {
 		struct column *col = &graph->columns[i];
-		struct commit *col_commit = col->commit;
-		if (col_commit == graph->commit) {
-			strbuf_write_column(sb, col, '|');
-
-			if (graph->num_parents < 3)
-				strbuf_addch(sb, ' ');
-			else {
-				int num_spaces = ((graph->num_parents - 2) * 2);
-				for (j = 0; j < num_spaces; j++)
-					strbuf_addch(sb, ' ');
-			}
-		} else {
-			strbuf_write_column(sb, col, '|');
+		strbuf_write_column(sb, col, '|');
+		if (col->commit == graph->commit && graph->num_parents > 2)
+			strbuf_addchars(sb, ' ', (graph->num_parents - 2) * 2);
+		else
 			strbuf_addch(sb, ' ');
-		}
 	}
 
 	graph_pad_horizontally(graph, sb, graph->num_columns);
diff --git a/grep.c b/grep.c
index 4aef0a6..6e085f8 100644
--- a/grep.c
+++ b/grep.c
@@ -35,7 +35,8 @@
 	strcpy(opt->color_filename, "");
 	strcpy(opt->color_function, "");
 	strcpy(opt->color_lineno, "");
-	strcpy(opt->color_match, GIT_COLOR_BOLD_RED);
+	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);
 	opt->color = -1;
@@ -86,6 +87,11 @@
 		return 0;
 	}
 
+	if (!strcmp(var, "grep.fullname")) {
+		opt->relative = !git_config_bool(var, value);
+		return 0;
+	}
+
 	if (!strcmp(var, "color.grep"))
 		opt->color = git_config_colorbool(var, value);
 	else if (!strcmp(var, "color.grep.context"))
@@ -96,17 +102,27 @@
 		color = opt->color_function;
 	else if (!strcmp(var, "color.grep.linenumber"))
 		color = opt->color_lineno;
-	else if (!strcmp(var, "color.grep.match"))
-		color = opt->color_match;
+	else if (!strcmp(var, "color.grep.matchcontext"))
+		color = opt->color_match_context;
+	else if (!strcmp(var, "color.grep.matchselected"))
+		color = opt->color_match_selected;
 	else if (!strcmp(var, "color.grep.selected"))
 		color = opt->color_selected;
 	else if (!strcmp(var, "color.grep.separator"))
 		color = opt->color_sep;
+	else if (!strcmp(var, "color.grep.match")) {
+		int rc = 0;
+		if (!value)
+			return config_error_nonbool(var);
+		rc |= color_parse(value, opt->color_match_context);
+		rc |= color_parse(value, opt->color_match_selected);
+		return rc;
+	}
 
 	if (color) {
 		if (!value)
 			return config_error_nonbool(var);
-		color_parse(value, var, color);
+		return color_parse(value, color);
 	}
 	return 0;
 }
@@ -139,7 +155,8 @@
 	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, def->color_match);
+	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);
 }
@@ -1079,7 +1096,7 @@
 		      const char *name, unsigned lno, char sign)
 {
 	int rest = eol - bol;
-	char *line_color = NULL;
+	const char *match_color, *line_color = NULL;
 
 	if (opt->file_break && opt->last_shown == 0) {
 		if (opt->show_hunk_mark)
@@ -1118,6 +1135,10 @@
 		int eflags = 0;
 
 		if (sign == ':')
+			match_color = opt->color_match_selected;
+		else
+			match_color = opt->color_match_context;
+		if (sign == ':')
 			line_color = opt->color_selected;
 		else if (sign == '-')
 			line_color = opt->color_context;
@@ -1130,8 +1151,7 @@
 
 			output_color(opt, bol, match.rm_so, line_color);
 			output_color(opt, bol + match.rm_so,
-				     match.rm_eo - match.rm_so,
-				     opt->color_match);
+				     match.rm_eo - match.rm_so, match_color);
 			bol += match.rm_eo;
 			rest -= match.rm_eo;
 			eflags = REG_NOTBOL;
diff --git a/grep.h b/grep.h
index eaaced1..95f197a 100644
--- a/grep.h
+++ b/grep.h
@@ -124,7 +124,8 @@
 	char color_filename[COLOR_MAXLEN];
 	char color_function[COLOR_MAXLEN];
 	char color_lineno[COLOR_MAXLEN];
-	char color_match[COLOR_MAXLEN];
+	char color_match_context[COLOR_MAXLEN];
+	char color_match_selected[COLOR_MAXLEN];
 	char color_selected[COLOR_MAXLEN];
 	char color_sep[COLOR_MAXLEN];
 	int regflags;
diff --git a/hashmap.c b/hashmap.c
index d1b8056..f693839 100644
--- a/hashmap.c
+++ b/hashmap.c
@@ -226,3 +226,41 @@
 		current = iter->map->table[iter->tablepos++];
 	}
 }
+
+struct pool_entry {
+	struct hashmap_entry ent;
+	size_t len;
+	unsigned char data[FLEX_ARRAY];
+};
+
+static int pool_entry_cmp(const struct pool_entry *e1,
+			  const struct pool_entry *e2,
+			  const unsigned char *keydata)
+{
+	return e1->data != keydata &&
+	       (e1->len != e2->len || memcmp(e1->data, keydata, e1->len));
+}
+
+const void *memintern(const void *data, size_t len)
+{
+	static struct hashmap map;
+	struct pool_entry key, *e;
+
+	/* initialize string pool hashmap */
+	if (!map.tablesize)
+		hashmap_init(&map, (hashmap_cmp_fn) pool_entry_cmp, 0);
+
+	/* lookup interned string in pool */
+	hashmap_entry_init(&key, memhash(data, len));
+	key.len = len;
+	e = hashmap_get(&map, &key, data);
+	if (!e) {
+		/* not found: create it */
+		e = xmallocz(sizeof(struct pool_entry) + 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/hashmap.h b/hashmap.h
index a816ad4..ab7958a 100644
--- a/hashmap.h
+++ b/hashmap.h
@@ -13,6 +13,17 @@
 extern unsigned int memhash(const void *buf, size_t len);
 extern unsigned int memihash(const void *buf, size_t len);
 
+static inline unsigned int sha1hash(const unsigned char *sha1)
+{
+	/*
+	 * Equivalent to 'return *(unsigned int *)sha1;', but safe on
+	 * platforms that don't support unaligned reads.
+	 */
+	unsigned int hash;
+	memcpy(&hash, sha1, sizeof(hash));
+	return hash;
+}
+
 /* data structures */
 
 struct hashmap_entry {
@@ -57,6 +68,14 @@
 extern void *hashmap_remove(struct hashmap *map, const void *key,
 		const void *keydata);
 
+static inline void *hashmap_get_from_hash(const struct hashmap *map,
+		unsigned int hash, const void *keydata)
+{
+	struct hashmap_entry key;
+	hashmap_entry_init(&key, hash);
+	return hashmap_get(map, &key, keydata);
+}
+
 /* hashmap_iter functions */
 
 extern void hashmap_iter_init(struct hashmap *map, struct hashmap_iter *iter);
@@ -68,4 +87,12 @@
 	return hashmap_iter_next(iter);
 }
 
+/* string interning */
+
+extern const void *memintern(const void *data, size_t len);
+static inline const char *strintern(const char *string)
+{
+	return memintern(string, strlen(string));
+}
+
 #endif
diff --git a/help.c b/help.c
index b266b09..2072a87 100644
--- a/help.c
+++ b/help.c
@@ -129,7 +129,6 @@
 					 const char *path,
 					 const char *prefix)
 {
-	int prefix_len;
 	DIR *dir = opendir(path);
 	struct dirent *de;
 	struct strbuf buf = STRBUF_INIT;
@@ -139,15 +138,15 @@
 		return;
 	if (!prefix)
 		prefix = "git-";
-	prefix_len = strlen(prefix);
 
 	strbuf_addf(&buf, "%s/", path);
 	len = buf.len;
 
 	while ((de = readdir(dir)) != NULL) {
-		int entlen;
+		const char *ent;
+		size_t entlen;
 
-		if (!starts_with(de->d_name, prefix))
+		if (!skip_prefix(de->d_name, prefix, &ent))
 			continue;
 
 		strbuf_setlen(&buf, len);
@@ -155,11 +154,10 @@
 		if (!is_executable(buf.buf))
 			continue;
 
-		entlen = strlen(de->d_name) - prefix_len;
-		if (has_extension(de->d_name, ".exe"))
-			entlen -= 4;
+		entlen = strlen(ent);
+		strip_suffix(ent, ".exe", &entlen);
 
-		add_cmdname(cmds, de->d_name + prefix_len, entlen);
+		add_cmdname(cmds, ent, entlen);
 	}
 	closedir(dir);
 	strbuf_release(&buf);
@@ -251,11 +249,13 @@
 
 static int git_unknown_cmd_config(const char *var, const char *value, void *cb)
 {
+	const char *p;
+
 	if (!strcmp(var, "help.autocorrect"))
 		autocorrect = git_config_int(var,value);
 	/* Also use aliases for command lookup */
-	if (starts_with(var, "alias."))
-		add_cmdname(&aliases, var + 6, strlen(var + 6));
+	if (skip_prefix(var, "alias.", &p))
+		add_cmdname(&aliases, p, strlen(p));
 
 	return git_default_config(var, value, cb);
 }
@@ -305,7 +305,7 @@
 	add_cmd_list(&main_cmds, &aliases);
 	add_cmd_list(&main_cmds, &other_cmds);
 	qsort(main_cmds.names, main_cmds.cnt,
-	      sizeof(main_cmds.names), cmdname_compare);
+	      sizeof(*main_cmds.names), cmdname_compare);
 	uniq(&main_cmds);
 
 	/* This abuses cmdname->len for levenshtein distance */
@@ -412,11 +412,12 @@
 {
 	struct similar_ref_cb *cb = (struct similar_ref_cb *)(cb_data);
 	char *branch = strrchr(refname, '/') + 1;
+	const char *remote;
+
 	/* A remote branch of the same name is deemed similar */
-	if (starts_with(refname, "refs/remotes/") &&
+	if (skip_prefix(refname, "refs/remotes/", &remote) &&
 	    !strcmp(branch, cb->base_ref))
-		string_list_append(cb->similar_refs,
-				   refname + strlen("refs/remotes/"));
+		string_list_append(cb->similar_refs, remote);
 	return 0;
 }
 
diff --git a/http-backend.c b/http-backend.c
index f6b7a5b..b6c0484 100644
--- a/http-backend.c
+++ b/http-backend.c
@@ -219,40 +219,36 @@
 	send_local_file("application/x-git-packed-objects-toc", name);
 }
 
-static int http_config(const char *var, const char *value, void *cb)
+static void http_config(void)
 {
-	if (!strcmp(var, "http.getanyfile")) {
-		getanyfile = git_config_bool(var, value);
-		return 0;
+	int i, value = 0;
+	struct strbuf var = STRBUF_INIT;
+
+	git_config_get_bool("http.getanyfile", &getanyfile);
+
+	for (i = 0; i < ARRAY_SIZE(rpc_service); i++) {
+		struct rpc_service *svc = &rpc_service[i];
+		strbuf_addf(&var, "http.%s", svc->config_name);
+		if (!git_config_get_bool(var.buf, &value))
+			svc->enabled = value;
+		strbuf_reset(&var);
 	}
 
-	if (starts_with(var, "http.")) {
-		int i;
-
-		for (i = 0; i < ARRAY_SIZE(rpc_service); i++) {
-			struct rpc_service *svc = &rpc_service[i];
-			if (!strcmp(var + 5, svc->config_name)) {
-				svc->enabled = git_config_bool(var, value);
-				return 0;
-			}
-		}
-	}
-
-	/* we are not interested in parsing any other configuration here */
-	return 0;
+	strbuf_release(&var);
 }
 
 static struct rpc_service *select_service(const char *name)
 {
+	const char *svc_name;
 	struct rpc_service *svc = NULL;
 	int i;
 
-	if (!starts_with(name, "git-"))
+	if (!skip_prefix(name, "git-", &svc_name))
 		forbidden("Unsupported service: '%s'", name);
 
 	for (i = 0; i < ARRAY_SIZE(rpc_service); i++) {
 		struct rpc_service *s = &rpc_service[i];
-		if (!strcmp(s->name, name + 4)) {
+		if (!strcmp(s->name, svc_name)) {
 			svc = s;
 			break;
 		}
@@ -318,9 +314,8 @@
 	const char *encoding = getenv("HTTP_CONTENT_ENCODING");
 	const char *user = getenv("REMOTE_USER");
 	const char *host = getenv("REMOTE_ADDR");
-	struct argv_array env = ARGV_ARRAY_INIT;
 	int gzipped_request = 0;
-	struct child_process cld;
+	struct child_process cld = CHILD_PROCESS_INIT;
 
 	if (encoding && !strcmp(encoding, "gzip"))
 		gzipped_request = 1;
@@ -333,14 +328,12 @@
 		host = "(none)";
 
 	if (!getenv("GIT_COMMITTER_NAME"))
-		argv_array_pushf(&env, "GIT_COMMITTER_NAME=%s", user);
+		argv_array_pushf(&cld.env_array, "GIT_COMMITTER_NAME=%s", user);
 	if (!getenv("GIT_COMMITTER_EMAIL"))
-		argv_array_pushf(&env, "GIT_COMMITTER_EMAIL=%s@http.%s",
-				 user, host);
+		argv_array_pushf(&cld.env_array,
+				 "GIT_COMMITTER_EMAIL=%s@http.%s", user, host);
 
-	memset(&cld, 0, sizeof(cld));
 	cld.argv = argv;
-	cld.env = env.argv;
 	if (gzipped_request)
 		cld.in = -1;
 	cld.git_cmd = 1;
@@ -355,7 +348,6 @@
 
 	if (finish_command(&cld))
 		exit(1);
-	argv_array_clear(&env);
 }
 
 static int show_text_ref(const char *name, const unsigned char *sha1,
@@ -417,7 +409,9 @@
 
 	if (flag & REF_ISSYMREF) {
 		unsigned char unused[20];
-		const char *target = resolve_ref_unsafe(refname, unused, 1, NULL);
+		const char *target = resolve_ref_unsafe(refname,
+							RESOLVE_REF_READING,
+							unused, NULL);
 		const char *target_nons = strip_namespace(target);
 
 		strbuf_addf(buf, "ref: %s\n", target_nons);
@@ -624,7 +618,7 @@
 	    access("git-daemon-export-ok", F_OK) )
 		not_found("Repository not exported: '%s'", dir);
 
-	git_config(http_config, NULL);
+	http_config();
 	cmd->imp(cmd_arg);
 	return 0;
 }
diff --git a/http-push.c b/http-push.c
index bc94a3f..952f8ed 100644
--- a/http-push.c
+++ b/http-push.c
@@ -719,14 +719,10 @@
 	return ret;
 }
 
-static void one_remote_object(const char *hex)
+static void one_remote_object(const unsigned char *sha1)
 {
-	unsigned char sha1[20];
 	struct object *obj;
 
-	if (get_sha1_hex(hex, sha1) != 0)
-		return;
-
 	obj = lookup_object(sha1);
 	if (!obj)
 		obj = parse_object(sha1);
@@ -767,15 +763,13 @@
 
 	if (tag_closed && ctx->cdata) {
 		if (!strcmp(ctx->name, DAV_ACTIVELOCK_OWNER)) {
-			lock->owner = xmalloc(strlen(ctx->cdata) + 1);
-			strcpy(lock->owner, ctx->cdata);
+			lock->owner = xstrdup(ctx->cdata);
 		} else if (!strcmp(ctx->name, DAV_ACTIVELOCK_TIMEOUT)) {
-			if (starts_with(ctx->cdata, "Second-"))
-				lock->timeout =
-					strtol(ctx->cdata + 7, NULL, 10);
+			const char *arg;
+			if (skip_prefix(ctx->cdata, "Second-", &arg))
+				lock->timeout = strtol(arg, NULL, 10);
 		} else if (!strcmp(ctx->name, DAV_ACTIVELOCK_TOKEN)) {
-			lock->token = xmalloc(strlen(ctx->cdata) + 1);
-			strcpy(lock->token, ctx->cdata);
+			lock->token = xstrdup(ctx->cdata);
 
 			git_SHA1_Init(&sha_ctx);
 			git_SHA1_Update(&sha_ctx, lock->token, strlen(lock->token));
@@ -856,8 +850,7 @@
 	struct xml_ctx ctx;
 	char *escaped;
 
-	url = xmalloc(strlen(repo->url) + strlen(path) + 1);
-	sprintf(url, "%s%s", repo->url, path);
+	url = xstrfmt("%s%s", repo->url, path);
 
 	/* Make sure leading directories exist for the remote ref */
 	ep = strchr(url + strlen(repo->url) + 1, '/');
@@ -1020,26 +1013,38 @@
 		      void (*userFunc)(struct remote_ls_ctx *ls),
 		      void *userData);
 
+/* extract hex from sharded "xx/x{40}" filename */
+static int get_sha1_hex_from_objpath(const char *path, unsigned char *sha1)
+{
+	char hex[40];
+
+	if (strlen(path) != 41)
+		return -1;
+
+	memcpy(hex, path, 2);
+	path += 2;
+	path++; /* skip '/' */
+	memcpy(hex, path, 38);
+
+	return get_sha1_hex(hex, sha1);
+}
+
 static void process_ls_object(struct remote_ls_ctx *ls)
 {
 	unsigned int *parent = (unsigned int *)ls->userData;
-	char *path = ls->dentry_name;
-	char *obj_hex;
+	const char *path = ls->dentry_name;
+	unsigned char sha1[20];
 
 	if (!strcmp(ls->path, ls->dentry_name) && (ls->flags & IS_DIR)) {
 		remote_dir_exists[*parent] = 1;
 		return;
 	}
 
-	if (strlen(path) != 49)
+	if (!skip_prefix(path, "objects/", &path) ||
+	    get_sha1_hex_from_objpath(path, sha1))
 		return;
-	path += 8;
-	obj_hex = xmalloc(strlen(path));
-	/* NB: path is not null-terminated, can not use strlcpy here */
-	memcpy(obj_hex, path, 2);
-	strcpy(obj_hex + 2, path + 3);
-	one_remote_object(obj_hex);
-	free(obj_hex);
+
+	one_remote_object(sha1);
 }
 
 static void process_ls_ref(struct remote_ls_ctx *ls)
@@ -1117,7 +1122,7 @@
 		      void (*userFunc)(struct remote_ls_ctx *ls),
 		      void *userData)
 {
-	char *url = xmalloc(strlen(repo->url) + strlen(path) + 1);
+	char *url = xstrfmt("%s%s", repo->url, path);
 	struct active_request_slot *slot;
 	struct slot_results results;
 	struct strbuf in_buffer = STRBUF_INIT;
@@ -1133,8 +1138,6 @@
 	ls.userData = userData;
 	ls.userFunc = userFunc;
 
-	sprintf(url, "%s%s", repo->url, path);
-
 	strbuf_addf(&out_buffer.buf, PROPFIND_ALL_REQUEST);
 
 	dav_headers = curl_slist_append(dav_headers, "Depth: 1");
@@ -1536,10 +1539,9 @@
 
 static int remote_exists(const char *path)
 {
-	char *url = xmalloc(strlen(repo->url) + strlen(path) + 1);
+	char *url = xstrfmt("%s%s", repo->url, path);
 	int ret;
 
-	sprintf(url, "%s%s", repo->url, path);
 
 	switch (http_get_strbuf(url, NULL, NULL)) {
 	case HTTP_OK:
@@ -1559,11 +1561,9 @@
 
 static void fetch_symref(const char *path, char **symref, unsigned char *sha1)
 {
-	char *url;
+	char *url = xstrfmt("%s%s", repo->url, path);
 	struct strbuf buffer = STRBUF_INIT;
-
-	url = xmalloc(strlen(repo->url) + strlen(path) + 1);
-	sprintf(url, "%s%s", repo->url, path);
+	const char *name;
 
 	if (http_get_strbuf(url, &buffer, NULL) != HTTP_OK)
 		die("Couldn't get %s for remote symref\n%s", url,
@@ -1578,8 +1578,8 @@
 		return;
 
 	/* If it's a symref, set the refname; otherwise try for a sha1 */
-	if (starts_with((char *)buffer.buf, "ref: ")) {
-		*symref = xmemdupz((char *)buffer.buf + 5, buffer.len - 6);
+	if (skip_prefix(buffer.buf, "ref: ", &name)) {
+		*symref = xmemdupz(name, buffer.len - (name - buffer.buf));
 	} else {
 		get_sha1_hex(buffer.buf, sha1);
 	}
@@ -1673,8 +1673,7 @@
 	fprintf(stderr, "Removing remote branch '%s'\n", remote_ref->name);
 	if (dry_run)
 		return 0;
-	url = xmalloc(strlen(repo->url) + strlen(remote_ref->name) + 1);
-	sprintf(url, "%s%s", repo->url, remote_ref->name);
+	url = xstrfmt("%s%s", repo->url, remote_ref->name);
 	slot = get_active_slot();
 	slot->results = &results;
 	curl_setup_http_get(slot->curl, url, DAV_DELETE);
diff --git a/http-walker.c b/http-walker.c
index 1516c5e..88da546 100644
--- a/http-walker.c
+++ b/http-walker.c
@@ -230,7 +230,6 @@
 			int okay = 0;
 			int serverlen = 0;
 			struct alt_base *newalt;
-			char *target = NULL;
 			if (data[i] == '/') {
 				/*
 				 * This counts
@@ -287,17 +286,15 @@
 			}
 			/* skip "objects\n" at end */
 			if (okay) {
-				target = xmalloc(serverlen + posn - i - 6);
-				memcpy(target, base, serverlen);
-				memcpy(target + serverlen, data + i,
-				       posn - i - 7);
-				target[serverlen + posn - i - 7] = 0;
+				struct strbuf target = STRBUF_INIT;
+				strbuf_add(&target, base, serverlen);
+				strbuf_add(&target, data + i, posn - i - 7);
 				if (walker->get_verbosely)
-					fprintf(stderr,
-						"Also look at %s\n", target);
+					fprintf(stderr, "Also look at %s\n",
+						target.buf);
 				newalt = xmalloc(sizeof(*newalt));
 				newalt->next = NULL;
-				newalt->base = target;
+				newalt->base = strbuf_detach(&target, NULL);
 				newalt->got_indices = 0;
 				newalt->packs = NULL;
 
@@ -341,8 +338,7 @@
 	if (walker->get_verbosely)
 		fprintf(stderr, "Getting alternates list for %s\n", base);
 
-	url = xmalloc(strlen(base) + 31);
-	sprintf(url, "%s/objects/info/http-alternates", base);
+	url = xstrfmt("%s/objects/info/http-alternates", base);
 
 	/*
 	 * Use a callback to process the result, since another request
@@ -566,8 +562,7 @@
 	struct walker *walker = xmalloc(sizeof(struct walker));
 
 	data->alt = xmalloc(sizeof(*data->alt));
-	data->alt->base = xmalloc(strlen(url) + 1);
-	strcpy(data->alt->base, url);
+	data->alt->base = xstrdup(url);
 	for (s = data->alt->base + strlen(data->alt->base) - 1; *s == '/'; --s)
 		*s = 0;
 
diff --git a/http.c b/http.c
index 94e1afd..040f362 100644
--- a/http.c
+++ b/http.c
@@ -1,3 +1,4 @@
+#include "git-compat-util.h"
 #include "http.h"
 #include "pack.h"
 #include "sideband.h"
@@ -300,6 +301,9 @@
 {
 	CURL *result = curl_easy_init();
 
+	if (!result)
+		die("curl_easy_init failed");
+
 	if (!curl_ssl_verify) {
 		curl_easy_setopt(result, CURLOPT_SSL_VERIFYPEER, 0);
 		curl_easy_setopt(result, CURLOPT_SSL_VERIFYHOST, 0);
@@ -399,7 +403,8 @@
 	git_config(urlmatch_config_entry, &config);
 	free(normalized_url);
 
-	curl_global_init(CURL_GLOBAL_ALL);
+	if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK)
+		die("curl_global_init failed");
 
 	http_proactive_auth = proactive_auth;
 
@@ -417,10 +422,8 @@
 	}
 
 	curlm = curl_multi_init();
-	if (curlm == NULL) {
-		fprintf(stderr, "Error creating curl multi handle.\n");
-		exit(1);
-	}
+	if (!curlm)
+		die("curl_multi_init failed");
 #endif
 
 	if (getenv("GIT_SSL_NO_VERIFY"))
@@ -906,6 +909,83 @@
 	return ret;
 }
 
+/*
+ * Check for and extract a content-type parameter. "raw"
+ * should be positioned at the start of the potential
+ * parameter, with any whitespace already removed.
+ *
+ * "name" is the name of the parameter. The value is appended
+ * to "out".
+ */
+static int extract_param(const char *raw, const char *name,
+			 struct strbuf *out)
+{
+	size_t len = strlen(name);
+
+	if (strncasecmp(raw, name, len))
+		return -1;
+	raw += len;
+
+	if (*raw != '=')
+		return -1;
+	raw++;
+
+	while (*raw && !isspace(*raw) && *raw != ';')
+		strbuf_addch(out, *raw++);
+	return 0;
+}
+
+/*
+ * Extract a normalized version of the content type, with any
+ * spaces suppressed, all letters lowercased, and no trailing ";"
+ * or parameters.
+ *
+ * Note that we will silently remove even invalid whitespace. For
+ * example, "text / plain" is specifically forbidden by RFC 2616,
+ * but "text/plain" is the only reasonable output, and this keeps
+ * our code simple.
+ *
+ * If the "charset" argument is not NULL, store the value of any
+ * charset parameter there.
+ *
+ * Example:
+ *   "TEXT/PLAIN; charset=utf-8" -> "text/plain", "utf-8"
+ *   "text / plain" -> "text/plain"
+ */
+static void extract_content_type(struct strbuf *raw, struct strbuf *type,
+				 struct strbuf *charset)
+{
+	const char *p;
+
+	strbuf_reset(type);
+	strbuf_grow(type, raw->len);
+	for (p = raw->buf; *p; p++) {
+		if (isspace(*p))
+			continue;
+		if (*p == ';') {
+			p++;
+			break;
+		}
+		strbuf_addch(type, tolower(*p));
+	}
+
+	if (!charset)
+		return;
+
+	strbuf_reset(charset);
+	while (*p) {
+		while (isspace(*p) || *p == ';')
+			p++;
+		if (!extract_param(p, "charset", charset))
+			return;
+		while (*p && !isspace(*p))
+			p++;
+	}
+
+	if (!charset->len && starts_with(type->buf, "text/"))
+		strbuf_addstr(charset, "ISO-8859-1");
+}
+
 /* http_request() targets */
 #define HTTP_REQUEST_STRBUF	0
 #define HTTP_REQUEST_FILE	1
@@ -957,9 +1037,13 @@
 
 	ret = run_one_slot(slot, &results);
 
-	if (options && options->content_type)
-		curlinfo_strbuf(slot->curl, CURLINFO_CONTENT_TYPE,
-				options->content_type);
+	if (options && options->content_type) {
+		struct strbuf raw = STRBUF_INIT;
+		curlinfo_strbuf(slot->curl, CURLINFO_CONTENT_TYPE, &raw);
+		extract_content_type(&raw, options->content_type,
+				     options->charset);
+		strbuf_release(&raw);
+	}
 
 	if (options && options->effective_url)
 		curlinfo_strbuf(slot->curl, CURLINFO_EFFECTIVE_URL,
@@ -1006,11 +1090,10 @@
 	if (!strcmp(asked, got->buf))
 		return 0;
 
-	if (!starts_with(asked, base->buf))
+	if (!skip_prefix(asked, base->buf, &tail))
 		die("BUG: update_url_from_redirect: %s is not a superset of %s",
 		    asked, base->buf);
 
-	tail = asked + base->len;
 	tail_len = strlen(tail);
 
 	if (got->len < tail_len ||
@@ -1252,7 +1335,7 @@
 	struct packed_git **lst;
 	struct packed_git *p = preq->target;
 	char *tmp_idx;
-	struct child_process ip;
+	struct child_process ip = CHILD_PROCESS_INIT;
 	const char *ip_argv[8];
 
 	close_pack_index(p);
@@ -1275,7 +1358,6 @@
 	ip_argv[3] = preq->tmpfile;
 	ip_argv[4] = NULL;
 
-	memset(&ip, 0, sizeof(ip));
 	ip.argv = ip_argv;
 	ip.git_cmd = 1;
 	ip.no_stdin = 1;
diff --git a/http.h b/http.h
index e64084f..473179b 100644
--- a/http.h
+++ b/http.h
@@ -144,6 +144,13 @@
 	struct strbuf *content_type;
 
 	/*
+	 * If non-NULL, and content_type above is non-NULL, returns
+	 * the charset parameter from the content-type. If none is
+	 * present, returns an empty string.
+	 */
+	struct strbuf *charset;
+
+	/*
 	 * If non-NULL, returns the URL we ended up at, including any
 	 * redirects we followed.
 	 */
diff --git a/ident.c b/ident.c
index 1d9b6e7..5ff1aad 100644
--- a/ident.c
+++ b/ident.c
@@ -9,7 +9,7 @@
 
 static struct strbuf git_default_name = STRBUF_INIT;
 static struct strbuf git_default_email = STRBUF_INIT;
-static char git_default_date[50];
+static struct strbuf git_default_date = STRBUF_INIT;
 
 #define IDENT_NAME_GIVEN 01
 #define IDENT_MAIL_GIVEN 02
@@ -102,7 +102,7 @@
 	add_domainname(email);
 }
 
-static const char *ident_default_name(void)
+const char *ident_default_name(void)
 {
 	if (!git_default_name.len) {
 		copy_gecos(xgetpwuid_self(), &git_default_name);
@@ -129,9 +129,9 @@
 
 static const char *ident_default_date(void)
 {
-	if (!git_default_date[0])
-		datestamp(git_default_date, sizeof(git_default_date));
-	return git_default_date;
+	if (!git_default_date.len)
+		datestamp(&git_default_date);
+	return git_default_date.buf;
 }
 
 static int crud(unsigned char c)
@@ -292,7 +292,6 @@
 		      const char *date_str, int flag)
 {
 	static struct strbuf ident = STRBUF_INIT;
-	char date[50];
 	int strict = (flag & IDENT_STRICT);
 	int want_date = !(flag & IDENT_NO_DATE);
 	int want_name = !(flag & IDENT_NO_NAME);
@@ -320,15 +319,6 @@
 		die("unable to auto-detect email address (got '%s')", email);
 	}
 
-	if (want_date) {
-		if (date_str && date_str[0]) {
-			if (parse_date(date_str, date, sizeof(date)) < 0)
-				die("invalid date format: %s", date_str);
-		}
-		else
-			strcpy(date, ident_default_date());
-	}
-
 	strbuf_reset(&ident);
 	if (want_name) {
 		strbuf_addstr_without_crud(&ident, name);
@@ -339,8 +329,14 @@
 			strbuf_addch(&ident, '>');
 	if (want_date) {
 		strbuf_addch(&ident, ' ');
-		strbuf_addstr_without_crud(&ident, date);
+		if (date_str && date_str[0]) {
+			if (parse_date(date_str, &ident) < 0)
+				die("invalid date format: %s", date_str);
+		}
+		else
+			strbuf_addstr(&ident, ident_default_date());
 	}
+
 	return ident.buf;
 }
 
diff --git a/imap-send.c b/imap-send.c
index 45230e1..70bcc7a 100644
--- a/imap-send.c
+++ b/imap-send.c
@@ -23,9 +23,9 @@
  */
 
 #include "cache.h"
+#include "credential.h"
 #include "exec_cmd.h"
 #include "run-command.h"
-#include "prompt.h"
 #ifdef NO_OPENSSL
 typedef void *SSL;
 #endif
@@ -69,6 +69,7 @@
 	char *tunnel;
 	char *host;
 	int port;
+	char *folder;
 	char *user;
 	char *pass;
 	int use_ssl;
@@ -82,6 +83,7 @@
 	NULL,	/* tunnel */
 	NULL,	/* host */
 	0,	/* port */
+	NULL,	/* folder */
 	NULL,	/* user */
 	NULL,	/* pass */
 	0,   	/* use_ssl */
@@ -128,7 +130,6 @@
 	char *data;
 	int dlen;
 	int uid;
-	unsigned create:1, trycreate:1;
 };
 
 struct imap_cmd {
@@ -493,9 +494,9 @@
 	return ret;
 }
 
-static struct imap_cmd *v_issue_imap_cmd(struct imap_store *ctx,
-					 struct imap_cmd_cb *cb,
-					 const char *fmt, va_list ap)
+static struct imap_cmd *issue_imap_cmd(struct imap_store *ctx,
+				       struct imap_cmd_cb *cb,
+				       const char *fmt, va_list ap)
 {
 	struct imap *imap = ctx->imap;
 	struct imap_cmd *cmd;
@@ -524,7 +525,7 @@
 	if (Verbose) {
 		if (imap->num_in_progress)
 			printf("(%d in progress) ", imap->num_in_progress);
-		if (memcmp(cmd->cmd, "LOGIN", 5))
+		if (!starts_with(cmd->cmd, "LOGIN"))
 			printf(">>> %s", buf);
 		else
 			printf(">>> %d LOGIN <user> <pass>\n", cmd->tag);
@@ -559,20 +560,6 @@
 }
 
 __attribute__((format (printf, 3, 4)))
-static struct imap_cmd *issue_imap_cmd(struct imap_store *ctx,
-				       struct imap_cmd_cb *cb,
-				       const char *fmt, ...)
-{
-	struct imap_cmd *ret;
-	va_list ap;
-
-	va_start(ap, fmt);
-	ret = v_issue_imap_cmd(ctx, cb, fmt, ap);
-	va_end(ap);
-	return ret;
-}
-
-__attribute__((format (printf, 3, 4)))
 static int imap_exec(struct imap_store *ctx, struct imap_cmd_cb *cb,
 		     const char *fmt, ...)
 {
@@ -580,7 +567,7 @@
 	struct imap_cmd *cmdp;
 
 	va_start(ap, fmt);
-	cmdp = v_issue_imap_cmd(ctx, cb, fmt, ap);
+	cmdp = issue_imap_cmd(ctx, cb, fmt, ap);
 	va_end(ap);
 	if (!cmdp)
 		return RESP_BAD;
@@ -596,7 +583,7 @@
 	struct imap_cmd *cmdp;
 
 	va_start(ap, fmt);
-	cmdp = v_issue_imap_cmd(ctx, cb, fmt, ap);
+	cmdp = issue_imap_cmd(ctx, cb, fmt, ap);
 	va_end(ap);
 	if (!cmdp)
 		return DRV_STORE_BAD;
@@ -714,8 +701,8 @@
 static int get_cmd_result(struct imap_store *ctx, struct imap_cmd *tcmd)
 {
 	struct imap *imap = ctx->imap;
-	struct imap_cmd *cmdp, **pcmdp, *ncmdp;
-	char *cmd, *arg, *arg1, *p;
+	struct imap_cmd *cmdp, **pcmdp;
+	char *cmd, *arg, *arg1;
 	int n, resp, resp2, tag;
 
 	for (;;) {
@@ -801,39 +788,17 @@
 			if (!strcmp("OK", arg))
 				resp = DRV_OK;
 			else {
-				if (!strcmp("NO", arg)) {
-					if (cmdp->cb.create && cmd && (cmdp->cb.trycreate || !memcmp(cmd, "[TRYCREATE]", 11))) { /* SELECT, APPEND or UID COPY */
-						p = strchr(cmdp->cmd, '"');
-						if (!issue_imap_cmd(ctx, NULL, "CREATE \"%.*s\"", (int)(strchr(p + 1, '"') - p + 1), p)) {
-							resp = RESP_BAD;
-							goto normal;
-						}
-						/* not waiting here violates the spec, but a server that does not
-						   grok this nonetheless violates it too. */
-						cmdp->cb.create = 0;
-						if (!(ncmdp = issue_imap_cmd(ctx, &cmdp->cb, "%s", cmdp->cmd))) {
-							resp = RESP_BAD;
-							goto normal;
-						}
-						free(cmdp->cmd);
-						free(cmdp);
-						if (!tcmd)
-							return 0;	/* ignored */
-						if (cmdp == tcmd)
-							tcmd = ncmdp;
-						continue;
-					}
+				if (!strcmp("NO", arg))
 					resp = RESP_NO;
-				} else /*if (!strcmp("BAD", arg))*/
+				else /*if (!strcmp("BAD", arg))*/
 					resp = RESP_BAD;
 				fprintf(stderr, "IMAP command '%s' returned response (%s) - %s\n",
-					 memcmp(cmdp->cmd, "LOGIN", 5) ?
+					!starts_with(cmdp->cmd, "LOGIN") ?
 							cmdp->cmd : "LOGIN <user> <pass>",
 							arg, cmd ? cmd : "");
 			}
 			if ((resp2 = parse_response_code(ctx, &cmdp->cb, cmd)) > resp)
 				resp = resp2;
-		normal:
 			if (cmdp->cb.done)
 				cmdp->cb.done(ctx, cmdp, resp);
 			free(cmdp->cb.data);
@@ -944,8 +909,9 @@
 	return 0;
 }
 
-static struct imap_store *imap_open_store(struct imap_server_conf *srvc)
+static struct imap_store *imap_open_store(struct imap_server_conf *srvc, char *folder)
 {
+	struct credential cred = CREDENTIAL_INIT;
 	struct imap_store *ctx;
 	struct imap *imap;
 	char *arg, *rsp;
@@ -953,24 +919,23 @@
 
 	ctx = xcalloc(1, sizeof(*ctx));
 
-	ctx->imap = imap = xcalloc(sizeof(*imap), 1);
+	ctx->imap = imap = xcalloc(1, sizeof(*imap));
 	imap->buf.sock.fd[0] = imap->buf.sock.fd[1] = -1;
 	imap->in_progress_append = &imap->in_progress;
 
 	/* open connection to IMAP server */
 
 	if (srvc->tunnel) {
-		const char *argv[] = { srvc->tunnel, NULL };
-		struct child_process tunnel = {NULL};
+		struct child_process tunnel = CHILD_PROCESS_INIT;
 
 		imap_info("Starting tunnel '%s'... ", srvc->tunnel);
 
-		tunnel.argv = argv;
+		argv_array_push(&tunnel.args, srvc->tunnel);
 		tunnel.use_shell = 1;
 		tunnel.in = -1;
 		tunnel.out = -1;
 		if (start_command(&tunnel))
-			die("cannot start proxy %s", argv[0]);
+			die("cannot start proxy %s", srvc->tunnel);
 
 		imap->buf.sock.fd[0] = tunnel.out;
 		imap->buf.sock.fd[1] = tunnel.in;
@@ -1096,25 +1061,23 @@
 		}
 #endif
 		imap_info("Logging in...\n");
-		if (!srvc->user) {
-			fprintf(stderr, "Skipping server %s, no user\n", srvc->host);
-			goto bail;
+		if (!srvc->user || !srvc->pass) {
+			cred.protocol = xstrdup(srvc->use_ssl ? "imaps" : "imap");
+			cred.host = xstrdup(srvc->host);
+
+			if (srvc->user)
+				cred.username = xstrdup(srvc->user);
+			if (srvc->pass)
+				cred.password = xstrdup(srvc->pass);
+
+			credential_fill(&cred);
+
+			if (!srvc->user)
+				srvc->user = xstrdup(cred.username);
+			if (!srvc->pass)
+				srvc->pass = xstrdup(cred.password);
 		}
-		if (!srvc->pass) {
-			struct strbuf prompt = STRBUF_INIT;
-			strbuf_addf(&prompt, "Password (%s@%s): ", srvc->user, srvc->host);
-			arg = git_getpass(prompt.buf);
-			strbuf_release(&prompt);
-			if (!*arg) {
-				fprintf(stderr, "Skipping account %s@%s, no password\n", srvc->user, srvc->host);
-				goto bail;
-			}
-			/*
-			 * getpass() returns a pointer to a static buffer.  make a copy
-			 * for long term storage.
-			 */
-			srvc->pass = xstrdup(arg);
-		}
+
 		if (CAP(NOLOGIN)) {
 			fprintf(stderr, "Skipping account %s@%s, server forbids LOGIN\n", srvc->user, srvc->host);
 			goto bail;
@@ -1153,10 +1116,38 @@
 		}
 	} /* !preauth */
 
+	if (cred.username)
+		credential_approve(&cred);
+	credential_clear(&cred);
+
+	/* check the target mailbox exists */
+	ctx->name = folder;
+	switch (imap_exec(ctx, NULL, "EXAMINE \"%s\"", ctx->name)) {
+	case RESP_OK:
+		/* ok */
+		break;
+	case RESP_BAD:
+		fprintf(stderr, "IMAP error: could not check mailbox\n");
+		goto out;
+	case RESP_NO:
+		if (imap_exec(ctx, NULL, "CREATE \"%s\"", ctx->name) == RESP_OK) {
+			imap_info("Created missing mailbox\n");
+		} else {
+			fprintf(stderr, "IMAP error: could not create missing mailbox\n");
+			goto out;
+		}
+		break;
+	}
+
 	ctx->prefix = "";
 	return ctx;
 
 bail:
+	if (cred.username)
+		credential_reject(&cred);
+	credential_clear(&cred);
+
+ out:
 	imap_close_store(ctx);
 	return NULL;
 }
@@ -1212,7 +1203,6 @@
 
 	box = ctx->name;
 	prefix = !strcmp(box, "INBOX") ? "" : ctx->prefix;
-	cb.create = 0;
 	ret = imap_exec_m(ctx, &cb, "APPEND \"%s%s\" ", prefix, box);
 	imap->caps = imap->rcaps;
 	if (ret != DRV_OK)
@@ -1317,49 +1307,35 @@
 	return 1;
 }
 
-static char *imap_folder;
-
-static int git_imap_config(const char *key, const char *val, void *cb)
+static void git_imap_config(void)
 {
-	char imap_key[] = "imap.";
+	const char *val = NULL;
 
-	if (strncmp(key, imap_key, sizeof imap_key - 1))
-		return 0;
+	git_config_get_bool("imap.sslverify", &server.ssl_verify);
+	git_config_get_bool("imap.preformattedhtml", &server.use_html);
+	git_config_get_string("imap.folder", &server.folder);
 
-	key += sizeof imap_key - 1;
-
-	/* check booleans first, and barf on others */
-	if (!strcmp("sslverify", key))
-		server.ssl_verify = git_config_bool(key, val);
-	else if (!strcmp("preformattedhtml", key))
-		server.use_html = git_config_bool(key, val);
-	else if (!val)
-		return config_error_nonbool(key);
-
-	if (!strcmp("folder", key)) {
-		imap_folder = xstrdup(val);
-	} else if (!strcmp("host", key)) {
-		if (starts_with(val, "imap:"))
-			val += 5;
-		else if (starts_with(val, "imaps:")) {
-			val += 6;
-			server.use_ssl = 1;
+	if (!git_config_get_value("imap.host", &val)) {
+		if (!val) {
+			git_die_config("imap.host", "Missing value for 'imap.host'");
+		} else {
+			if (starts_with(val, "imap:"))
+				val += 5;
+			else if (starts_with(val, "imaps:")) {
+				val += 6;
+				server.use_ssl = 1;
+			}
+			if (starts_with(val, "//"))
+				val += 2;
+			server.host = xstrdup(val);
 		}
-		if (starts_with(val, "//"))
-			val += 2;
-		server.host = xstrdup(val);
-	} else if (!strcmp("user", key))
-		server.user = xstrdup(val);
-	else if (!strcmp("pass", key))
-		server.pass = xstrdup(val);
-	else if (!strcmp("port", key))
-		server.port = git_config_int(key, val);
-	else if (!strcmp("tunnel", key))
-		server.tunnel = xstrdup(val);
-	else if (!strcmp("authmethod", key))
-		server.auth_method = xstrdup(val);
+	}
 
-	return 0;
+	git_config_get_string("imap.user", &server.user);
+	git_config_get_string("imap.pass", &server.pass);
+	git_config_get_int("imap.port", &server.port);
+	git_config_get_string("imap.tunnel", &server.tunnel);
+	git_config_get_string("imap.authmethod", &server.auth_method);
 }
 
 int main(int argc, char **argv)
@@ -1380,12 +1356,12 @@
 		usage(imap_send_usage);
 
 	setup_git_directory_gently(&nongit_ok);
-	git_config(git_imap_config, NULL);
+	git_imap_config();
 
 	if (!server.port)
 		server.port = server.use_ssl ? 993 : 143;
 
-	if (!imap_folder) {
+	if (!server.folder) {
 		fprintf(stderr, "no imap store specified\n");
 		return 1;
 	}
@@ -1415,14 +1391,13 @@
 	}
 
 	/* write it to the imap server */
-	ctx = imap_open_store(&server);
+	ctx = imap_open_store(&server, server.folder);
 	if (!ctx) {
 		fprintf(stderr, "failed to open store\n");
 		return 1;
 	}
 
 	fprintf(stderr, "sending %d message%s\n", total, (total != 1) ? "s" : "");
-	ctx->name = imap_folder;
 	while (1) {
 		unsigned percent = n * 100 / total;
 
diff --git a/khash.h b/khash.h
index 57ff603..376475a 100644
--- a/khash.h
+++ b/khash.h
@@ -121,13 +121,9 @@
 				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 */		\
-					khkey_t *new_keys = (khkey_t*)xrealloc((void *)h->keys, new_n_buckets * sizeof(khkey_t)); \
-					if (!new_keys) return -1;							\
-					h->keys = new_keys;									\
+					REALLOC_ARRAY(h->keys, new_n_buckets); \
 					if (kh_is_map) {									\
-						khval_t *new_vals = (khval_t*)xrealloc((void *)h->vals, new_n_buckets * sizeof(khval_t)); \
-						if (!new_vals) return -1;						\
-						h->vals = new_vals;								\
+						REALLOC_ARRAY(h->vals, new_n_buckets); \
 					}													\
 				} /* otherwise shrink */								\
 			}															\
@@ -160,8 +156,8 @@
 				}														\
 			}															\
 			if (h->n_buckets > new_n_buckets) { /* shrink the hash table */ \
-				h->keys = (khkey_t*)xrealloc((void *)h->keys, new_n_buckets * sizeof(khkey_t)); \
-				if (kh_is_map) h->vals = (khval_t*)xrealloc((void *)h->vals, new_n_buckets * sizeof(khval_t)); \
+				REALLOC_ARRAY(h->keys, new_n_buckets); \
+				if (kh_is_map) REALLOC_ARRAY(h->vals, new_n_buckets); \
 			}															\
 			free(h->flags); /* free the working space */				\
 			h->flags = new_flags;										\
@@ -320,19 +316,12 @@
 		code;												\
 	} }
 
-static inline khint_t __kh_oid_hash(const unsigned char *oid)
-{
-	khint_t hash;
-	memcpy(&hash, oid, sizeof(hash));
-	return hash;
-}
-
 #define __kh_oid_cmp(a, b) (hashcmp(a, b) == 0)
 
-KHASH_INIT(sha1, const unsigned char *, void *, 1, __kh_oid_hash, __kh_oid_cmp)
+KHASH_INIT(sha1, const unsigned char *, void *, 1, sha1hash, __kh_oid_cmp)
 typedef kh_sha1_t khash_sha1;
 
-KHASH_INIT(sha1_pos, const unsigned char *, int, 1, __kh_oid_hash, __kh_oid_cmp)
+KHASH_INIT(sha1_pos, const unsigned char *, int, 1, sha1hash, __kh_oid_cmp)
 typedef kh_sha1_pos_t khash_sha1_pos;
 
 #endif /* __AC_KHASH_H */
diff --git a/line-log.c b/line-log.c
index 1500101..b7864ad 100644
--- a/line-log.c
+++ b/line-log.c
@@ -533,7 +533,7 @@
 	}
 
 	/* shrink the array to fit the elements */
-	ends = xrealloc(ends, cur * sizeof(*ends));
+	REALLOC_ARRAY(ends, cur);
 	*lines = cur-1;
 	*line_ends = ends;
 }
@@ -766,17 +766,6 @@
 	}
 }
 
-static int count_parents(struct commit *commit)
-{
-	struct commit_list *parents = commit->parents;
-	int count = 0;
-	while (parents) {
-		count++;
-		parents = parents->next;
-	}
-	return count;
-}
-
 static void move_diff_queue(struct diff_queue_struct *dst,
 			    struct diff_queue_struct *src)
 {
@@ -1150,7 +1139,10 @@
 	struct commit **parents;
 	struct commit_list *p;
 	int i;
-	int nparents = count_parents(commit);
+	int nparents = commit_list_count(commit->parents);
+
+	if (nparents > 1 && rev->first_parent_only)
+		nparents = 1;
 
 	diffqueues = xmalloc(nparents * sizeof(*diffqueues));
 	cand = xmalloc(nparents * sizeof(*cand));
@@ -1174,9 +1166,7 @@
 			 */
 			add_line_range(rev, parents[i], cand[i]);
 			clear_commit_line_range(rev, commit);
-			commit->parents = xmalloc(sizeof(struct commit_list));
-			commit->parents->item = parents[i];
-			commit->parents->next = NULL;
+			commit_list_append(parents[i], &commit->parents);
 			free(parents);
 			free(cand);
 			free_diffqueues(nparents, diffqueues);
diff --git a/list-objects.c b/list-objects.c
index 3595ee7..2910bec 100644
--- a/list-objects.c
+++ b/list-objects.c
@@ -208,6 +208,7 @@
 		struct object_array_entry *pending = revs->pending.objects + i;
 		struct object *obj = pending->item;
 		const char *name = pending->name;
+		const char *path = pending->path;
 		if (obj->flags & (UNINTERESTING | SEEN))
 			continue;
 		if (obj->type == OBJ_TAG) {
@@ -215,24 +216,21 @@
 			show_object(obj, NULL, name, data);
 			continue;
 		}
+		if (!path)
+			path = "";
 		if (obj->type == OBJ_TREE) {
 			process_tree(revs, (struct tree *)obj, show_object,
-				     NULL, &base, name, data);
+				     NULL, &base, path, data);
 			continue;
 		}
 		if (obj->type == OBJ_BLOB) {
 			process_blob(revs, (struct blob *)obj, show_object,
-				     NULL, name, data);
+				     NULL, path, data);
 			continue;
 		}
 		die("unknown pending object %s (%s)",
 		    sha1_to_hex(obj->sha1), name);
 	}
-	if (revs->pending.nr) {
-		free(revs->pending.objects);
-		revs->pending.nr = 0;
-		revs->pending.alloc = 0;
-		revs->pending.objects = NULL;
-	}
+	object_array_clear(&revs->pending);
 	strbuf_release(&base);
 }
diff --git a/ll-merge.c b/ll-merge.c
index fb61ea6..8ea03e5 100644
--- a/ll-merge.c
+++ b/ll-merge.c
@@ -225,11 +225,8 @@
 	const char *key, *name;
 	int namelen;
 
-	if (!strcmp(var, "merge.default")) {
-		if (value)
-			default_ll_merge = xstrdup(value);
-		return 0;
-	}
+	if (!strcmp(var, "merge.default"))
+		return git_config_string(&default_ll_merge, var, value);
 
 	/*
 	 * We are not interested in anything but "merge.<name>.variable";
@@ -254,12 +251,8 @@
 		ll_user_merge_tail = &(fn->next);
 	}
 
-	if (!strcmp("name", key)) {
-		if (!value)
-			return error("%s: lacks value", var);
-		fn->description = xstrdup(value);
-		return 0;
-	}
+	if (!strcmp("name", key))
+		return git_config_string(&fn->description, var, value);
 
 	if (!strcmp("driver", key)) {
 		if (!value)
@@ -285,12 +278,8 @@
 		return 0;
 	}
 
-	if (!strcmp("recursive", key)) {
-		if (!value)
-			return error("%s: lacks value", var);
-		fn->recursive = xstrdup(value);
-		return 0;
-	}
+	if (!strcmp("recursive", key))
+		return git_config_string(&fn->recursive, var, value);
 
 	return 0;
 }
diff --git a/lockfile.c b/lockfile.c
index 8fbcb6a..4f16ee7 100644
--- a/lockfile.c
+++ b/lockfile.c
@@ -2,60 +2,61 @@
  * Copyright (c) 2005, Junio C Hamano
  */
 #include "cache.h"
+#include "lockfile.h"
 #include "sigchain.h"
 
-static struct lock_file *lock_file_list;
-static const char *alternate_index_output;
+static struct lock_file *volatile lock_file_list;
 
-static void remove_lock_file(void)
+static void remove_lock_files(int skip_fclose)
 {
 	pid_t me = getpid();
 
 	while (lock_file_list) {
-		if (lock_file_list->owner == me &&
-		    lock_file_list->filename[0]) {
-			if (lock_file_list->fd >= 0)
-				close(lock_file_list->fd);
-			unlink_or_warn(lock_file_list->filename);
+		if (lock_file_list->owner == me) {
+			/* fclose() is not safe to call in a signal handler */
+			if (skip_fclose)
+				lock_file_list->fp = NULL;
+			rollback_lock_file(lock_file_list);
 		}
 		lock_file_list = lock_file_list->next;
 	}
 }
 
-static void remove_lock_file_on_signal(int signo)
+static void remove_lock_files_on_exit(void)
 {
-	remove_lock_file();
+	remove_lock_files(0);
+}
+
+static void remove_lock_files_on_signal(int signo)
+{
+	remove_lock_files(1);
 	sigchain_pop(signo);
 	raise(signo);
 }
 
 /*
- * p = absolute or relative path name
+ * path = absolute or relative path name
  *
- * Return a pointer into p showing the beginning of the last path name
- * element.  If p is empty or the root directory ("/"), just return p.
+ * Remove the last path name element from path (leaving the preceding
+ * "/", if any).  If path is empty or the root directory ("/"), set
+ * path to the empty string.
  */
-static char *last_path_elm(char *p)
+static void trim_last_path_component(struct strbuf *path)
 {
-	/* r starts pointing to null at the end of the string */
-	char *r = strchr(p, '\0');
-
-	if (r == p)
-		return p; /* just return empty string */
-
-	r--; /* back up to last non-null character */
+	int i = path->len;
 
 	/* back up past trailing slashes, if any */
-	while (r > p && *r == '/')
-		r--;
+	while (i && path->buf[i - 1] == '/')
+		i--;
 
 	/*
-	 * then go backwards until I hit a slash, or the beginning of
-	 * the string
+	 * then go backwards until a slash, or the beginning of the
+	 * string
 	 */
-	while (r > p && *(r-1) != '/')
-		r--;
-	return r;
+	while (i && path->buf[i - 1] != '/')
+		i--;
+
+	strbuf_setlen(path, i);
 }
 
 
@@ -63,134 +64,118 @@
 #define MAXDEPTH 5
 
 /*
- * p = path that may be a symlink
- * s = full size of p
+ * path contains a path that might be a symlink.
  *
- * If p is a symlink, attempt to overwrite p with a path to the real
- * file or directory (which may or may not exist), following a chain of
- * symlinks if necessary.  Otherwise, leave p unmodified.
+ * If path is a symlink, attempt to overwrite it with a path to the
+ * real file or directory (which may or may not exist), following a
+ * chain of symlinks if necessary.  Otherwise, leave path unmodified.
  *
- * This is a best-effort routine.  If an error occurs, p will either be
- * left unmodified or will name a different symlink in a symlink chain
- * that started with p's initial contents.
- *
- * Always returns p.
+ * This is a best-effort routine.  If an error occurs, path will
+ * either be left unmodified or will name a different symlink in a
+ * symlink chain that started with the original path.
  */
-
-static char *resolve_symlink(char *p, size_t s)
+static void resolve_symlink(struct strbuf *path)
 {
 	int depth = MAXDEPTH;
+	static struct strbuf link = STRBUF_INIT;
 
 	while (depth--) {
-		char link[PATH_MAX];
-		int link_len = readlink(p, link, sizeof(link));
-		if (link_len < 0) {
-			/* not a symlink anymore */
-			return p;
-		}
-		else if (link_len < sizeof(link))
-			/* readlink() never null-terminates */
-			link[link_len] = '\0';
-		else {
-			warning("%s: symlink too long", p);
-			return p;
-		}
+		if (strbuf_readlink(&link, path->buf, path->len) < 0)
+			break;
 
-		if (is_absolute_path(link)) {
+		if (is_absolute_path(link.buf))
 			/* absolute path simply replaces p */
-			if (link_len < s)
-				strcpy(p, link);
-			else {
-				warning("%s: symlink too long", p);
-				return p;
-			}
-		} else {
+			strbuf_reset(path);
+		else
 			/*
-			 * link is a relative path, so I must replace the
+			 * link is a relative path, so replace the
 			 * last element of p with it.
 			 */
-			char *r = (char *)last_path_elm(p);
-			if (r - p + link_len < s)
-				strcpy(r, link);
-			else {
-				warning("%s: symlink too long", p);
-				return p;
-			}
-		}
+			trim_last_path_component(path);
+
+		strbuf_addbuf(path, &link);
 	}
-	return p;
+	strbuf_reset(&link);
 }
 
-
+/* Make sure errno contains a meaningful value on error */
 static int lock_file(struct lock_file *lk, const char *path, int flags)
 {
-	/*
-	 * subtract 5 from size to make sure there's room for adding
-	 * ".lock" for the lock file name
-	 */
-	static const size_t max_path_len = sizeof(lk->filename) - 5;
+	size_t pathlen = strlen(path);
 
-	if (strlen(path) >= max_path_len)
-		return -1;
-	strcpy(lk->filename, path);
-	if (!(flags & LOCK_NODEREF))
-		resolve_symlink(lk->filename, max_path_len);
-	strcat(lk->filename, ".lock");
-	lk->fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666);
-	if (0 <= lk->fd) {
-		if (!lock_file_list) {
-			sigchain_push_common(remove_lock_file_on_signal);
-			atexit(remove_lock_file);
-		}
-		lk->owner = getpid();
-		if (!lk->on_list) {
-			lk->next = lock_file_list;
-			lock_file_list = lk;
-			lk->on_list = 1;
-		}
-		if (adjust_shared_perm(lk->filename))
-			return error("cannot fix permission bits on %s",
-				     lk->filename);
+	if (!lock_file_list) {
+		/* One-time initialization */
+		sigchain_push_common(remove_lock_files_on_signal);
+		atexit(remove_lock_files_on_exit);
 	}
-	else
-		lk->filename[0] = 0;
+
+	if (lk->active)
+		die("BUG: cannot lock_file(\"%s\") using active struct lock_file",
+		    path);
+	if (!lk->on_list) {
+		/* Initialize *lk and add it to lock_file_list: */
+		lk->fd = -1;
+		lk->fp = NULL;
+		lk->active = 0;
+		lk->owner = 0;
+		strbuf_init(&lk->filename, pathlen + LOCK_SUFFIX_LEN);
+		lk->next = lock_file_list;
+		lock_file_list = lk;
+		lk->on_list = 1;
+	} else if (lk->filename.len) {
+		/* This shouldn't happen, but better safe than sorry. */
+		die("BUG: lock_file(\"%s\") called with improperly-reset lock_file object",
+		    path);
+	}
+
+	strbuf_add(&lk->filename, path, pathlen);
+	if (!(flags & LOCK_NO_DEREF))
+		resolve_symlink(&lk->filename);
+	strbuf_addstr(&lk->filename, LOCK_SUFFIX);
+	lk->fd = open(lk->filename.buf, O_RDWR | O_CREAT | O_EXCL, 0666);
+	if (lk->fd < 0) {
+		strbuf_reset(&lk->filename);
+		return -1;
+	}
+	lk->owner = getpid();
+	lk->active = 1;
+	if (adjust_shared_perm(lk->filename.buf)) {
+		int save_errno = errno;
+		error("cannot fix permission bits on %s", lk->filename.buf);
+		rollback_lock_file(lk);
+		errno = save_errno;
+		return -1;
+	}
 	return lk->fd;
 }
 
-static char *unable_to_lock_message(const char *path, int err)
+void unable_to_lock_message(const char *path, int err, struct strbuf *buf)
 {
-	struct strbuf buf = STRBUF_INIT;
-
 	if (err == EEXIST) {
-		strbuf_addf(&buf, "Unable to create '%s.lock': %s.\n\n"
+		strbuf_addf(buf, "Unable to create '%s.lock': %s.\n\n"
 		    "If no other git process is currently running, this probably means a\n"
 		    "git process crashed in this repository earlier. Make sure no other git\n"
 		    "process is running and remove the file manually to continue.",
 			    absolute_path(path), strerror(err));
 	} else
-		strbuf_addf(&buf, "Unable to create '%s.lock': %s",
+		strbuf_addf(buf, "Unable to create '%s.lock': %s",
 			    absolute_path(path), strerror(err));
-	return strbuf_detach(&buf, NULL);
 }
 
-int unable_to_lock_error(const char *path, int err)
+NORETURN void unable_to_lock_die(const char *path, int err)
 {
-	char *msg = unable_to_lock_message(path, err);
-	error("%s", msg);
-	free(msg);
-	return -1;
+	struct strbuf buf = STRBUF_INIT;
+
+	unable_to_lock_message(path, err, &buf);
+	die("%s", buf.buf);
 }
 
-NORETURN void unable_to_lock_index_die(const char *path, int err)
-{
-	die("%s", unable_to_lock_message(path, err));
-}
-
+/* This should return a meaningful errno on failure */
 int hold_lock_file_for_update(struct lock_file *lk, const char *path, int flags)
 {
 	int fd = lock_file(lk, path, flags);
 	if (fd < 0 && (flags & LOCK_DIE_ON_ERROR))
-		unable_to_lock_index_die(path, errno);
+		unable_to_lock_die(path, errno);
 	return fd;
 }
 
@@ -201,82 +186,147 @@
 	fd = lock_file(lk, path, flags);
 	if (fd < 0) {
 		if (flags & LOCK_DIE_ON_ERROR)
-			unable_to_lock_index_die(path, errno);
+			unable_to_lock_die(path, errno);
 		return fd;
 	}
 
 	orig_fd = open(path, O_RDONLY);
 	if (orig_fd < 0) {
 		if (errno != ENOENT) {
+			int save_errno = errno;
+
 			if (flags & LOCK_DIE_ON_ERROR)
 				die("cannot open '%s' for copying", path);
-			close(fd);
-			return error("cannot open '%s' for copying", path);
+			rollback_lock_file(lk);
+			error("cannot open '%s' for copying", path);
+			errno = save_errno;
+			return -1;
 		}
 	} else if (copy_fd(orig_fd, fd)) {
+		int save_errno = errno;
+
 		if (flags & LOCK_DIE_ON_ERROR)
 			exit(128);
-		close(fd);
+		close(orig_fd);
+		rollback_lock_file(lk);
+		errno = save_errno;
 		return -1;
+	} else {
+		close(orig_fd);
 	}
 	return fd;
 }
 
+FILE *fdopen_lock_file(struct lock_file *lk, const char *mode)
+{
+	if (!lk->active)
+		die("BUG: fdopen_lock_file() called for unlocked object");
+	if (lk->fp)
+		die("BUG: fdopen_lock_file() called twice for file '%s'", lk->filename.buf);
+
+	lk->fp = fdopen(lk->fd, mode);
+	return lk->fp;
+}
+
+char *get_locked_file_path(struct lock_file *lk)
+{
+	if (!lk->active)
+		die("BUG: get_locked_file_path() called for unlocked object");
+	if (lk->filename.len <= LOCK_SUFFIX_LEN)
+		die("BUG: get_locked_file_path() called for malformed lock object");
+	return xmemdupz(lk->filename.buf, lk->filename.len - LOCK_SUFFIX_LEN);
+}
+
 int close_lock_file(struct lock_file *lk)
 {
 	int fd = lk->fd;
+	FILE *fp = lk->fp;
+	int err;
+
+	if (fd < 0)
+		return 0;
+
 	lk->fd = -1;
-	return close(fd);
+	if (fp) {
+		lk->fp = NULL;
+
+		/*
+		 * Note: no short-circuiting here; we want to fclose()
+		 * in any case!
+		 */
+		err = ferror(fp) | fclose(fp);
+	} else {
+		err = close(fd);
+	}
+
+	if (err) {
+		int save_errno = errno;
+		rollback_lock_file(lk);
+		errno = save_errno;
+		return -1;
+	}
+
+	return 0;
+}
+
+int reopen_lock_file(struct lock_file *lk)
+{
+	if (0 <= lk->fd)
+		die(_("BUG: reopen a lockfile that is still open"));
+	if (!lk->active)
+		die(_("BUG: reopen a lockfile that has been committed"));
+	lk->fd = open(lk->filename.buf, O_WRONLY);
+	return lk->fd;
+}
+
+int commit_lock_file_to(struct lock_file *lk, const char *path)
+{
+	if (!lk->active)
+		die("BUG: attempt to commit unlocked object to \"%s\"", path);
+
+	if (close_lock_file(lk))
+		return -1;
+
+	if (rename(lk->filename.buf, path)) {
+		int save_errno = errno;
+		rollback_lock_file(lk);
+		errno = save_errno;
+		return -1;
+	}
+
+	lk->active = 0;
+	strbuf_reset(&lk->filename);
+	return 0;
 }
 
 int commit_lock_file(struct lock_file *lk)
 {
-	char result_file[PATH_MAX];
-	size_t i;
-	if (lk->fd >= 0 && close_lock_file(lk))
-		return -1;
-	strcpy(result_file, lk->filename);
-	i = strlen(result_file) - 5; /* .lock */
-	result_file[i] = 0;
-	if (rename(lk->filename, result_file))
-		return -1;
-	lk->filename[0] = 0;
-	return 0;
-}
+	static struct strbuf result_file = STRBUF_INIT;
+	int err;
 
-int hold_locked_index(struct lock_file *lk, int die_on_error)
-{
-	return hold_lock_file_for_update(lk, get_index_file(),
-					 die_on_error
-					 ? LOCK_DIE_ON_ERROR
-					 : 0);
-}
+	if (!lk->active)
+		die("BUG: attempt to commit unlocked object");
 
-void set_alternate_index_output(const char *name)
-{
-	alternate_index_output = name;
-}
+	if (lk->filename.len <= LOCK_SUFFIX_LEN ||
+	    strcmp(lk->filename.buf + lk->filename.len - LOCK_SUFFIX_LEN, LOCK_SUFFIX))
+		die("BUG: lockfile filename corrupt");
 
-int commit_locked_index(struct lock_file *lk)
-{
-	if (alternate_index_output) {
-		if (lk->fd >= 0 && close_lock_file(lk))
-			return -1;
-		if (rename(lk->filename, alternate_index_output))
-			return -1;
-		lk->filename[0] = 0;
-		return 0;
-	}
-	else
-		return commit_lock_file(lk);
+	/* remove ".lock": */
+	strbuf_add(&result_file, lk->filename.buf,
+		   lk->filename.len - LOCK_SUFFIX_LEN);
+	err = commit_lock_file_to(lk, result_file.buf);
+	strbuf_reset(&result_file);
+	return err;
 }
 
 void rollback_lock_file(struct lock_file *lk)
 {
-	if (lk->filename[0]) {
-		if (lk->fd >= 0)
-			close(lk->fd);
-		unlink_or_warn(lk->filename);
+	if (!lk->active)
+		return;
+
+	if (!close_lock_file(lk)) {
+		unlink_or_warn(lk->filename.buf);
+		lk->active = 0;
+		strbuf_reset(&lk->filename);
 	}
-	lk->filename[0] = 0;
 }
diff --git a/lockfile.h b/lockfile.h
new file mode 100644
index 0000000..cd2ec95
--- /dev/null
+++ b/lockfile.h
@@ -0,0 +1,87 @@
+#ifndef LOCKFILE_H
+#define LOCKFILE_H
+
+/*
+ * File write-locks as used by Git.
+ *
+ * For an overview of how to use the lockfile API, please see
+ *
+ *     Documentation/technical/api-lockfile.txt
+ *
+ * This module keeps track of all locked files in lock_file_list for
+ * use at cleanup. This list and the lock_file objects that comprise
+ * it must be kept in self-consistent states at all time, because the
+ * program can be interrupted any time by a signal, in which case the
+ * signal handler will walk through the list attempting to clean up
+ * any open lock files.
+ *
+ * A lockfile is owned by the process that created it. The lock_file
+ * object has an "owner" field that records its owner. This field is
+ * used to prevent a forked process from closing a lockfile created by
+ * its parent.
+ *
+ * The possible states of a lock_file object are as follows:
+ *
+ * - Uninitialized.  In this state the object's on_list field must be
+ *   zero but the rest of its contents need not be initialized.  As
+ *   soon as the object is used in any way, it is irrevocably
+ *   registered in the lock_file_list, and on_list is set.
+ *
+ * - Locked, lockfile open (after hold_lock_file_for_update(),
+ *   hold_lock_file_for_append(), or reopen_lock_file()). In this
+ *   state:
+ *   - the lockfile exists
+ *   - active is set
+ *   - filename holds the filename of the lockfile
+ *   - fd holds a file descriptor open for writing to the lockfile
+ *   - fp holds a pointer to an open FILE object if and only if
+ *     fdopen_lock_file() has been called on the object
+ *   - owner holds the PID of the process that locked the file
+ *
+ * - Locked, lockfile closed (after successful close_lock_file()).
+ *   Same as the previous state, except that the lockfile is closed
+ *   and fd is -1.
+ *
+ * - Unlocked (after commit_lock_file(), commit_lock_file_to(),
+ *   rollback_lock_file(), a failed attempt to lock, or a failed
+ *   close_lock_file()).  In this state:
+ *   - active is unset
+ *   - filename is empty (usually, though there are transitory
+ *     states in which this condition doesn't hold). Client code should
+ *     *not* rely on the filename being empty in this state.
+ *   - fd is -1
+ *   - the object is left registered in the lock_file_list, and
+ *     on_list is set.
+ */
+
+struct lock_file {
+	struct lock_file *volatile next;
+	volatile sig_atomic_t active;
+	volatile int fd;
+	FILE *volatile fp;
+	volatile pid_t owner;
+	char on_list;
+	struct strbuf filename;
+};
+
+/* String appended to a filename to derive the lockfile name: */
+#define LOCK_SUFFIX ".lock"
+#define LOCK_SUFFIX_LEN 5
+
+#define LOCK_DIE_ON_ERROR 1
+#define LOCK_NO_DEREF 2
+
+extern void unable_to_lock_message(const char *path, int err,
+				   struct strbuf *buf);
+extern NORETURN void unable_to_lock_die(const char *path, int err);
+extern int hold_lock_file_for_update(struct lock_file *, const char *path, int);
+extern int hold_lock_file_for_append(struct lock_file *, const char *path, int);
+extern FILE *fdopen_lock_file(struct lock_file *, const char *mode);
+extern char *get_locked_file_path(struct lock_file *);
+extern int commit_lock_file_to(struct lock_file *, const char *path);
+extern int commit_lock_file(struct lock_file *);
+extern int reopen_lock_file(struct lock_file *);
+extern int close_lock_file(struct lock_file *);
+extern void rollback_lock_file(struct lock_file *);
+
+#endif /* LOCKFILE_H */
diff --git a/log-tree.c b/log-tree.c
index f87b7e8..7f0890e 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -12,17 +12,7 @@
 #include "sequencer.h"
 #include "line-log.h"
 
-struct decoration name_decoration = { "object names" };
-
-enum decoration_type {
-	DECORATION_NONE = 0,
-	DECORATION_REF_LOCAL,
-	DECORATION_REF_REMOTE,
-	DECORATION_REF_TAG,
-	DECORATION_REF_STASH,
-	DECORATION_REF_HEAD,
-	DECORATION_GRAFTED,
-};
+static struct decoration name_decoration = { "object names" };
 
 static char decoration_colors[][COLOR_MAXLEN] = {
 	GIT_COLOR_RESET,
@@ -66,15 +56,14 @@
 	return -1;
 }
 
-int parse_decorate_color_config(const char *var, const int ofs, const char *value)
+int parse_decorate_color_config(const char *var, const char *slot_name, const char *value)
 {
-	int slot = parse_decorate_color_slot(var + ofs);
+	int slot = parse_decorate_color_slot(slot_name);
 	if (slot < 0)
 		return 0;
 	if (!value)
 		return config_error_nonbool(var);
-	color_parse(value, var, decoration_colors[slot]);
-	return 0;
+	return color_parse(value, decoration_colors[slot]);
 }
 
 /*
@@ -84,15 +73,20 @@
 #define decorate_get_color_opt(o, ix) \
 	decorate_get_color((o)->use_color, ix)
 
-static void add_name_decoration(enum decoration_type type, const char *name, struct object *obj)
+void add_name_decoration(enum decoration_type type, const char *name, struct object *obj)
 {
 	int nlen = strlen(name);
-	struct name_decoration *res = xmalloc(sizeof(struct name_decoration) + nlen);
+	struct name_decoration *res = xmalloc(sizeof(*res) + nlen + 1);
 	memcpy(res->name, name, nlen + 1);
 	res->type = type;
 	res->next = add_decoration(&name_decoration, obj, res);
 }
 
+const struct name_decoration *get_name_decoration(const struct object *obj)
+{
+	return lookup_decoration(&name_decoration, obj);
+}
+
 static int add_ref_decoration(const char *refname, const unsigned char *sha1, int flags, void *cb_data)
 {
 	struct object *obj;
@@ -179,24 +173,25 @@
 }
 
 /*
- * The caller makes sure there is no funny color before
- * calling. format_decorations makes sure the same after return.
+ * The caller makes sure there is no funny color before calling.
+ * format_decorations_extended makes sure the same after return.
  */
-void format_decorations(struct strbuf *sb,
+void format_decorations_extended(struct strbuf *sb,
 			const struct commit *commit,
-			int use_color)
+			int use_color,
+			const char *prefix,
+			const char *separator,
+			const char *suffix)
 {
-	const char *prefix;
-	struct name_decoration *decoration;
+	const struct name_decoration *decoration;
 	const char *color_commit =
 		diff_get_color(use_color, DIFF_COMMIT);
 	const char *color_reset =
 		decorate_get_color(use_color, DECORATION_NONE);
 
-	decoration = lookup_decoration(&name_decoration, &commit->object);
+	decoration = get_name_decoration(&commit->object);
 	if (!decoration)
 		return;
-	prefix = " (";
 	while (decoration) {
 		strbuf_addstr(sb, color_commit);
 		strbuf_addstr(sb, prefix);
@@ -205,11 +200,11 @@
 			strbuf_addstr(sb, "tag: ");
 		strbuf_addstr(sb, decoration->name);
 		strbuf_addstr(sb, color_reset);
-		prefix = ", ";
+		prefix = separator;
 		decoration = decoration->next;
 	}
 	strbuf_addstr(sb, color_commit);
-	strbuf_addch(sb, ')');
+	strbuf_addstr(sb, suffix);
 	strbuf_addstr(sb, color_reset);
 }
 
@@ -414,10 +409,11 @@
 		&& !commit->parents->next->next);
 }
 
-static void show_one_mergetag(struct rev_info *opt,
+static void show_one_mergetag(struct commit *commit,
 			      struct commit_extra_header *extra,
-			      struct commit *commit)
+			      void *data)
 {
+	struct rev_info *opt = (struct rev_info *)data;
 	unsigned char sha1[20];
 	struct tag *tag;
 	struct strbuf verify_message;
@@ -465,15 +461,7 @@
 
 static void show_mergetag(struct rev_info *opt, struct commit *commit)
 {
-	struct commit_extra_header *extra, *to_free;
-
-	to_free = read_commit_extra_headers(commit, NULL);
-	for (extra = to_free; extra; extra = extra->next) {
-		if (strcmp(extra->key, "mergetag"))
-			continue; /* not a merge tag */
-		show_one_mergetag(opt, extra, commit);
-	}
-	free_commit_extra_headers(to_free);
+	for_each_mergetag(show_one_mergetag, commit, opt);
 }
 
 void show_log(struct rev_info *opt)
@@ -656,7 +644,7 @@
 		graph_show_commit_msg(opt->graph, &msgbuf);
 	else
 		fwrite(msgbuf.buf, sizeof(char), msgbuf.len, stdout);
-	if (opt->use_terminator) {
+	if (opt->use_terminator && !commit_format_is_empty(opt->commit_format)) {
 		if (!opt->missing_newline)
 			graph_show_padding(opt->graph);
 		putchar(opt->diffopt.line_termination);
@@ -683,7 +671,8 @@
 		show_log(opt);
 		if ((opt->diffopt.output_format & ~DIFF_FORMAT_NO_OUTPUT) &&
 		    opt->verbose_header &&
-		    opt->commit_format != CMIT_FMT_ONELINE) {
+		    opt->commit_format != CMIT_FMT_ONELINE &&
+		    !commit_format_is_empty(opt->commit_format)) {
 			/*
 			 * When showing a verbose header (i.e. log message),
 			 * and not in --pretty=oneline format, we would want
diff --git a/log-tree.h b/log-tree.h
index d6ecd4d..c8116e6 100644
--- a/log-tree.h
+++ b/log-tree.h
@@ -7,13 +7,19 @@
 	struct commit *commit, *parent;
 };
 
-int parse_decorate_color_config(const char *var, const int ofs, const char *value);
+int parse_decorate_color_config(const char *var, const char *slot_name, const char *value);
 void init_log_tree_opt(struct rev_info *);
 int log_tree_diff_flush(struct rev_info *);
 int log_tree_commit(struct rev_info *, struct commit *);
 int log_tree_opt_parse(struct rev_info *, const char **, int);
 void show_log(struct rev_info *opt);
-void format_decorations(struct strbuf *sb, const struct commit *commit, int use_color);
+void format_decorations_extended(struct strbuf *sb, const struct commit *commit,
+			     int use_color,
+			     const char *prefix,
+			     const char *separator,
+			     const char *suffix);
+#define format_decorations(strbuf, commit, color) \
+			     format_decorations_extended((strbuf), (commit), (color), " (", ", ", ")")
 void show_decorations(struct rev_info *opt, struct commit *commit);
 void log_write_email_headers(struct rev_info *opt, struct commit *commit,
 			     const char **subject_p,
diff --git a/match-trees.c b/match-trees.c
index e80b4af..1ce0954 100644
--- a/match-trees.c
+++ b/match-trees.c
@@ -140,17 +140,12 @@
 			goto next;
 		score = score_trees(elem, hash2);
 		if (*best_score < score) {
-			char *newpath;
-			newpath = xmalloc(strlen(base) + strlen(path) + 1);
-			sprintf(newpath, "%s%s", base, path);
 			free(*best_match);
-			*best_match = newpath;
+			*best_match = xstrfmt("%s%s", base, path);
 			*best_score = score;
 		}
 		if (recurse_limit) {
-			char *newbase;
-			newbase = xmalloc(strlen(base) + strlen(path) + 2);
-			sprintf(newbase, "%s%s/", base, path);
+			char *newbase = xstrfmt("%s%s/", base, path);
 			match_trees(elem, hash2, best_score, best_match,
 				    newbase, recurse_limit - 1);
 			free(newbase);
diff --git a/merge-recursive.c b/merge-recursive.c
index d38a3b2..fdb7d0f 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -3,8 +3,9 @@
  * Fredrik Kuivinen.
  * The thieves were Alex Riesen and Johannes Schindelin, in June/July 2006
  */
-#include "advice.h"
 #include "cache.h"
+#include "advice.h"
+#include "lockfile.h"
 #include "cache-tree.h"
 #include "commit.h"
 #include "blob.h"
@@ -163,15 +164,13 @@
 	if (!show(o, v))
 		return;
 
-	strbuf_grow(&o->obuf, o->call_depth * 2 + 2);
-	memset(o->obuf.buf + o->obuf.len, ' ', o->call_depth * 2);
-	strbuf_setlen(&o->obuf, o->obuf.len + o->call_depth * 2);
+	strbuf_addchars(&o->obuf, ' ', o->call_depth * 2);
 
 	va_start(ap, fmt);
 	strbuf_vaddf(&o->obuf, fmt, ap);
 	va_end(ap);
 
-	strbuf_add(&o->obuf, "\n", 1);
+	strbuf_addch(&o->obuf, '\n');
 	if (!o->buffer_output)
 		flush_output(o);
 }
@@ -267,9 +266,7 @@
 		active_cache_tree = cache_tree();
 
 	if (!cache_tree_fully_valid(active_cache_tree) &&
-	    cache_tree_update(active_cache_tree,
-			      (const struct cache_entry * const *)active_cache,
-			      active_nr, 0) < 0)
+	    cache_tree_update(&the_index, 0) < 0)
 		die(_("error building trees"));
 
 	result = lookup_tree(active_cache_tree->sha1);
@@ -603,25 +600,36 @@
 	return 0;
 }
 
+/* add a string to a strbuf, but converting "/" to "_" */
+static void add_flattened_path(struct strbuf *out, const char *s)
+{
+	size_t i = out->len;
+	strbuf_addstr(out, s);
+	for (; i < out->len; i++)
+		if (out->buf[i] == '/')
+			out->buf[i] = '_';
+}
+
 static char *unique_path(struct merge_options *o, const char *path, const char *branch)
 {
-	char *newpath = xmalloc(strlen(path) + 1 + strlen(branch) + 8 + 1);
+	struct strbuf newpath = STRBUF_INIT;
 	int suffix = 0;
 	struct stat st;
-	char *p = newpath + strlen(path);
-	strcpy(newpath, path);
-	*(p++) = '~';
-	strcpy(p, branch);
-	for (; *p; ++p)
-		if ('/' == *p)
-			*p = '_';
-	while (string_list_has_string(&o->current_file_set, newpath) ||
-	       string_list_has_string(&o->current_directory_set, newpath) ||
-	       lstat(newpath, &st) == 0)
-		sprintf(p, "_%d", suffix++);
+	size_t base_len;
 
-	string_list_insert(&o->current_file_set, newpath);
-	return newpath;
+	strbuf_addf(&newpath, "%s~", path);
+	add_flattened_path(&newpath, branch);
+
+	base_len = newpath.len;
+	while (string_list_has_string(&o->current_file_set, newpath.buf) ||
+	       string_list_has_string(&o->current_directory_set, newpath.buf) ||
+	       lstat(newpath.buf, &st) == 0) {
+		strbuf_setlen(&newpath, base_len);
+		strbuf_addf(&newpath, "_%d", suffix++);
+	}
+
+	string_list_insert(&o->current_file_set, newpath.buf);
+	return strbuf_detach(&newpath, NULL);
 }
 
 static int dir_in_way(const char *path, int check_working_copy)
@@ -971,14 +979,10 @@
 	char *side2 = NULL;
 	struct merge_file_info mfi;
 
-	if (filename1) {
-		side1 = xmalloc(strlen(branch1) + strlen(filename1) + 2);
-		sprintf(side1, "%s:%s", branch1, filename1);
-	}
-	if (filename2) {
-		side2 = xmalloc(strlen(branch2) + strlen(filename2) + 2);
-		sprintf(side2, "%s:%s", branch2, filename2);
-	}
+	if (filename1)
+		side1 = xstrfmt("%s:%s", branch1, filename1);
+	if (filename2)
+		side2 = xstrfmt("%s:%s", branch2, filename2);
 
 	mfi = merge_file_1(o, one, a, b,
 			   side1 ? side1 : branch1, side2 ? side2 : branch2);
@@ -1552,7 +1556,7 @@
 	 * unchanged since their sha1s have already been compared.
 	 */
 	if (renormalize_buffer(path, o.buf, o.len, &o) |
-	    renormalize_buffer(path, a.buf, o.len, &a))
+	    renormalize_buffer(path, a.buf, a.len, &a))
 		ret = (o.len == a.len && !memcmp(o.buf, a.buf, o.len));
 
 error_return:
@@ -1683,10 +1687,6 @@
 static int process_entry(struct merge_options *o,
 			 const char *path, struct stage_data *entry)
 {
-	/*
-	printf("processing entry, clean cache: %s\n", index_only ? "yes": "no");
-	print_index_entry("\tpath: ", entry);
-	*/
 	int clean_merge = 1;
 	int normalize = o->renormalize;
 	unsigned o_mode = entry->stages[1].mode;
@@ -1994,7 +1994,7 @@
 			    const unsigned char **base_list,
 			    struct commit **result)
 {
-	int clean, index_fd;
+	int clean;
 	struct lock_file *lock = xcalloc(1, sizeof(struct lock_file));
 	struct commit *head_commit = get_ref(head, o->branch1);
 	struct commit *next_commit = get_ref(merge, o->branch2);
@@ -2011,33 +2011,22 @@
 		}
 	}
 
-	index_fd = hold_locked_index(lock, 1);
+	hold_locked_index(lock, 1);
 	clean = merge_recursive(o, head_commit, next_commit, ca,
 			result);
 	if (active_cache_changed &&
-			(write_cache(index_fd, active_cache, active_nr) ||
-			 commit_locked_index(lock)))
+	    write_locked_index(&the_index, lock, COMMIT_LOCK))
 		return error(_("Unable to write index."));
 
 	return clean ? 0 : 1;
 }
 
-static int merge_recursive_config(const char *var, const char *value, void *cb)
+static void merge_recursive_config(struct merge_options *o)
 {
-	struct merge_options *o = cb;
-	if (!strcmp(var, "merge.verbosity")) {
-		o->verbosity = git_config_int(var, value);
-		return 0;
-	}
-	if (!strcmp(var, "diff.renamelimit")) {
-		o->diff_rename_limit = git_config_int(var, value);
-		return 0;
-	}
-	if (!strcmp(var, "merge.renamelimit")) {
-		o->merge_rename_limit = git_config_int(var, value);
-		return 0;
-	}
-	return git_xmerge_config(var, value, cb);
+	git_config_get_int("merge.verbosity", &o->verbosity);
+	git_config_get_int("diff.renamelimit", &o->diff_rename_limit);
+	git_config_get_int("merge.renamelimit", &o->merge_rename_limit);
+	git_config(git_xmerge_config, NULL);
 }
 
 void init_merge_options(struct merge_options *o)
@@ -2048,23 +2037,22 @@
 	o->diff_rename_limit = -1;
 	o->merge_rename_limit = -1;
 	o->renormalize = 0;
-	git_config(merge_recursive_config, o);
+	merge_recursive_config(o);
 	if (getenv("GIT_MERGE_VERBOSITY"))
 		o->verbosity =
 			strtol(getenv("GIT_MERGE_VERBOSITY"), NULL, 10);
 	if (o->verbosity >= 5)
 		o->buffer_output = 0;
 	strbuf_init(&o->obuf, 0);
-	memset(&o->current_file_set, 0, sizeof(struct string_list));
-	o->current_file_set.strdup_strings = 1;
-	memset(&o->current_directory_set, 0, sizeof(struct string_list));
-	o->current_directory_set.strdup_strings = 1;
-	memset(&o->df_conflict_file_set, 0, sizeof(struct string_list));
-	o->df_conflict_file_set.strdup_strings = 1;
+	string_list_init(&o->current_file_set, 1);
+	string_list_init(&o->current_directory_set, 1);
+	string_list_init(&o->df_conflict_file_set, 1);
 }
 
 int parse_merge_opt(struct merge_options *o, const char *s)
 {
+	const char *arg;
+
 	if (!s || !*s)
 		return -1;
 	if (!strcmp(s, "ours"))
@@ -2073,14 +2061,14 @@
 		o->recursive_variant = MERGE_RECURSIVE_THEIRS;
 	else if (!strcmp(s, "subtree"))
 		o->subtree_shift = "";
-	else if (starts_with(s, "subtree="))
-		o->subtree_shift = s + strlen("subtree=");
+	else if (skip_prefix(s, "subtree=", &arg))
+		o->subtree_shift = arg;
 	else if (!strcmp(s, "patience"))
 		o->xdl_opts = DIFF_WITH_ALG(o, PATIENCE_DIFF);
 	else if (!strcmp(s, "histogram"))
 		o->xdl_opts = DIFF_WITH_ALG(o, HISTOGRAM_DIFF);
-	else if (starts_with(s, "diff-algorithm=")) {
-		long value = parse_algorithm_value(s + strlen("diff-algorithm="));
+	else if (skip_prefix(s, "diff-algorithm=", &arg)) {
+		long value = parse_algorithm_value(arg);
 		if (value < 0)
 			return -1;
 		/* clear out previous settings */
@@ -2098,9 +2086,8 @@
 		o->renormalize = 1;
 	else if (!strcmp(s, "no-renormalize"))
 		o->renormalize = 0;
-	else if (starts_with(s, "rename-threshold=")) {
-		const char *score = s + strlen("rename-threshold=");
-		if ((o->rename_score = parse_rename_score(&score)) == -1 || *score != 0)
+	else if (skip_prefix(s, "rename-threshold=", &arg)) {
+		if ((o->rename_score = parse_rename_score(&arg)) == -1 || *arg != 0)
 			return -1;
 	}
 	else
diff --git a/merge.c b/merge.c
index 70f1000..fcff632 100644
--- a/merge.c
+++ b/merge.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "lockfile.h"
 #include "commit.h"
 #include "run-command.h"
 #include "resolve-undo.h"
@@ -18,39 +19,23 @@
 		      const char **xopts, struct commit_list *common,
 		      const char *head_arg, struct commit_list *remotes)
 {
-	const char **args;
-	int i = 0, x = 0, ret;
+	struct argv_array args = ARGV_ARRAY_INIT;
+	int i, ret;
 	struct commit_list *j;
-	struct strbuf buf = STRBUF_INIT;
 
-	args = xmalloc((4 + xopts_nr + commit_list_count(common) +
-			commit_list_count(remotes)) * sizeof(char *));
-	strbuf_addf(&buf, "merge-%s", strategy);
-	args[i++] = buf.buf;
-	for (x = 0; x < xopts_nr; x++) {
-		char *s = xmalloc(strlen(xopts[x])+2+1);
-		strcpy(s, "--");
-		strcpy(s+2, xopts[x]);
-		args[i++] = s;
-	}
+	argv_array_pushf(&args, "merge-%s", strategy);
+	for (i = 0; i < xopts_nr; i++)
+		argv_array_pushf(&args, "--%s", xopts[i]);
 	for (j = common; j; j = j->next)
-		args[i++] = xstrdup(merge_argument(j->item));
-	args[i++] = "--";
-	args[i++] = head_arg;
+		argv_array_push(&args, merge_argument(j->item));
+	argv_array_push(&args, "--");
+	argv_array_push(&args, head_arg);
 	for (j = remotes; j; j = j->next)
-		args[i++] = xstrdup(merge_argument(j->item));
-	args[i] = NULL;
-	ret = run_command_v_opt(args, RUN_GIT_CMD);
-	strbuf_release(&buf);
-	i = 1;
-	for (x = 0; x < xopts_nr; x++)
-		free((void *)args[i++]);
-	for (j = common; j; j = j->next)
-		free((void *)args[i++]);
-	i += 2;
-	for (j = remotes; j; j = j->next)
-		free((void *)args[i++]);
-	free(args);
+		argv_array_push(&args, merge_argument(j->item));
+
+	ret = run_command_v_opt(args.argv, RUN_GIT_CMD);
+	argv_array_clear(&args);
+
 	discard_cache();
 	if (read_cache() < 0)
 		die(_("failed to read the cache"));
@@ -66,13 +51,13 @@
 	struct tree *trees[MAX_UNPACK_TREES];
 	struct unpack_trees_options opts;
 	struct tree_desc t[MAX_UNPACK_TREES];
-	int i, fd, nr_trees = 0;
+	int i, nr_trees = 0;
 	struct dir_struct dir;
 	struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
 
 	refresh_cache(REFRESH_QUIET);
 
-	fd = hold_locked_index(lock_file, 1);
+	hold_locked_index(lock_file, 1);
 
 	memset(&trees, 0, sizeof(trees));
 	memset(&opts, 0, sizeof(opts));
@@ -105,8 +90,7 @@
 	}
 	if (unpack_trees(nr_trees, t, &opts))
 		return -1;
-	if (write_cache(fd, active_cache, active_nr) ||
-		commit_locked_index(lock_file))
+	if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
 		die(_("unable to write new index file"));
 	return 0;
 }
diff --git a/mergetools/bc b/mergetools/bc
new file mode 100644
index 0000000..b6319d2
--- /dev/null
+++ b/mergetools/bc
@@ -0,0 +1,25 @@
+diff_cmd () {
+	"$merge_tool_path" "$LOCAL" "$REMOTE"
+}
+
+merge_cmd () {
+	touch "$BACKUP"
+	if $base_present
+	then
+		"$merge_tool_path" "$LOCAL" "$REMOTE" "$BASE" \
+			-mergeoutput="$MERGED"
+	else
+		"$merge_tool_path" "$LOCAL" "$REMOTE" \
+			-mergeoutput="$MERGED"
+	fi
+	check_unchanged
+}
+
+translate_merge_tool_path() {
+	if type bcomp >/dev/null 2>/dev/null
+	then
+		echo bcomp
+	else
+		echo bcompare
+	fi
+}
diff --git a/mergetools/bc3 b/mergetools/bc3
index b6319d2..5d8dd48 100644
--- a/mergetools/bc3
+++ b/mergetools/bc3
@@ -1,25 +1 @@
-diff_cmd () {
-	"$merge_tool_path" "$LOCAL" "$REMOTE"
-}
-
-merge_cmd () {
-	touch "$BACKUP"
-	if $base_present
-	then
-		"$merge_tool_path" "$LOCAL" "$REMOTE" "$BASE" \
-			-mergeoutput="$MERGED"
-	else
-		"$merge_tool_path" "$LOCAL" "$REMOTE" \
-			-mergeoutput="$MERGED"
-	fi
-	check_unchanged
-}
-
-translate_merge_tool_path() {
-	if type bcomp >/dev/null 2>/dev/null
-	then
-		echo bcomp
-	else
-		echo bcompare
-	fi
-}
+. "$MERGE_TOOLS_DIR/bc"
diff --git a/mergetools/gvimdiff3 b/mergetools/gvimdiff3
new file mode 100644
index 0000000..04a5bb0
--- /dev/null
+++ b/mergetools/gvimdiff3
@@ -0,0 +1 @@
+. "$MERGE_TOOLS_DIR/vimdiff"
diff --git a/mergetools/meld b/mergetools/meld
index cb672a5..83ebdfb 100644
--- a/mergetools/meld
+++ b/mergetools/meld
@@ -18,13 +18,18 @@
 	check_unchanged
 }
 
-# Check whether 'meld --output <file>' is supported
+# Check whether we should use 'meld --output <file>'
 check_meld_for_output_version () {
 	meld_path="$(git config mergetool.meld.path)"
 	meld_path="${meld_path:-meld}"
 
-	if "$meld_path" --help 2>&1 | grep -e --output >/dev/null
+	if meld_has_output_option=$(git config --bool mergetool.meld.hasOutput)
 	then
+		: use configured value
+	elif "$meld_path" --help 2>&1 |
+		grep -e '--output=' -e '\[OPTION\.\.\.\]' >/dev/null
+	then
+		: old ones mention --output and new ones just say OPTION...
 		meld_has_output_option=true
 	else
 		meld_has_output_option=false
diff --git a/mergetools/vimdiff b/mergetools/vimdiff
index 39d0327..1ddfbfc 100644
--- a/mergetools/vimdiff
+++ b/mergetools/vimdiff
@@ -20,16 +20,26 @@
 		"$merge_tool_path" -f -d -c 'wincmd l' \
 			"$LOCAL" "$MERGED" "$REMOTE"
 		;;
+	gvimdiff3|vimdiff3)
+		if $base_present
+		then
+			"$merge_tool_path" -f -d -c 'hid | hid | hid' \
+				"$LOCAL" "$REMOTE" "$BASE" "$MERGED"
+		else
+			"$merge_tool_path" -f -d -c 'hid | hid' \
+				"$LOCAL" "$REMOTE" "$MERGED"
+		fi
+		;;
 	esac
 	check_unchanged
 }
 
 translate_merge_tool_path() {
 	case "$1" in
-	gvimdiff|gvimdiff2)
+	gvimdiff|gvimdiff2|gvimdiff3)
 		echo gvim
 		;;
-	vimdiff|vimdiff2)
+	vimdiff|vimdiff2|vimdiff3)
 		echo vim
 		;;
 	esac
diff --git a/mergetools/vimdiff3 b/mergetools/vimdiff3
new file mode 100644
index 0000000..04a5bb0
--- /dev/null
+++ b/mergetools/vimdiff3
@@ -0,0 +1 @@
+. "$MERGE_TOOLS_DIR/vimdiff"
diff --git a/name-hash.c b/name-hash.c
index 97444d0..702cd05 100644
--- a/name-hash.c
+++ b/name-hash.c
@@ -179,7 +179,7 @@
 	 * Always do exact compare, even if we want a case-ignoring comparison;
 	 * we do the quick exact one first, because it will be the common case.
 	 */
-	if (len == namelen && !cache_name_compare(name, namelen, ce->name, len))
+	if (len == namelen && !memcmp(name, ce->name, len))
 		return 1;
 
 	if (!icase)
@@ -213,12 +213,11 @@
 struct cache_entry *index_file_exists(struct index_state *istate, const char *name, int namelen, int icase)
 {
 	struct cache_entry *ce;
-	struct hashmap_entry key;
 
 	lazy_init_name_hash(istate);
 
-	hashmap_entry_init(&key, memihash(name, namelen));
-	ce = hashmap_get(&istate->name_hash, &key, NULL);
+	ce = hashmap_get_from_hash(&istate->name_hash,
+				   memihash(name, namelen), NULL);
 	while (ce) {
 		if (same_name(ce, name, namelen, icase))
 			return ce;
diff --git a/notes-cache.c b/notes-cache.c
index 25b20aa..c4e9bb7 100644
--- a/notes-cache.c
+++ b/notes-cache.c
@@ -60,7 +60,7 @@
 			commit_sha1, NULL, NULL) < 0)
 		return -1;
 	if (update_ref("update notes cache", c->tree.ref, commit_sha1, NULL,
-		       0, QUIET_ON_ERR) < 0)
+		       0, UPDATE_REFS_QUIET_ON_ERR) < 0)
 		return -1;
 
 	return 0;
diff --git a/notes-merge.c b/notes-merge.c
index fd5fae2..7eb9d7a 100644
--- a/notes-merge.c
+++ b/notes-merge.c
@@ -549,7 +549,7 @@
 	       o->local_ref, o->remote_ref);
 
 	/* Dereference o->local_ref into local_sha1 */
-	if (read_ref_full(o->local_ref, local_sha1, 0, NULL))
+	if (read_ref_full(o->local_ref, 0, local_sha1, NULL))
 		die("Failed to resolve local notes ref '%s'", o->local_ref);
 	else if (!check_refname_format(o->local_ref, 0) &&
 		is_null_sha1(local_sha1))
diff --git a/notes-utils.c b/notes-utils.c
index f6891f7..b64dc1b 100644
--- a/notes-utils.c
+++ b/notes-utils.c
@@ -49,7 +49,8 @@
 
 	create_notes_commit(t, NULL, buf.buf, buf.len, commit_sha1);
 	strbuf_insert(&buf, 0, "notes: ", 7); /* commit message starts at index 7 */
-	update_ref(buf.buf, t->ref, commit_sha1, NULL, 0, DIE_ON_ERR);
+	update_ref(buf.buf, t->ref, commit_sha1, NULL, 0,
+		   UPDATE_REFS_DIE_ON_ERR);
 
 	strbuf_release(&buf);
 }
diff --git a/object.c b/object.c
index 69fbbbf..23d6c96 100644
--- a/object.c
+++ b/object.c
@@ -33,13 +33,20 @@
 	return object_type_strings[type];
 }
 
-int type_from_string(const char *str)
+int type_from_string_gently(const char *str, ssize_t len, int gentle)
 {
 	int i;
 
+	if (len < 0)
+		len = strlen(str);
+
 	for (i = 1; i < ARRAY_SIZE(object_type_strings); i++)
-		if (!strcmp(str, object_type_strings[i]))
+		if (!strncmp(str, object_type_strings[i], len))
 			return i;
+
+	if (gentle)
+		return -1;
+
 	die("invalid object type \"%s\"", str);
 }
 
@@ -50,18 +57,7 @@
  */
 static unsigned int hash_obj(const unsigned char *sha1, unsigned int n)
 {
-	unsigned int hash;
-
-	/*
-	 * Since the sha1 is essentially random, we just take the
-	 * required number of bits directly from the first
-	 * sizeof(unsigned int) bytes of sha1.  First we have to copy
-	 * the bytes into a properly aligned integer.  If we cared
-	 * about getting consistent results across architectures, we
-	 * would have to call ntohl() here, too.
-	 */
-	memcpy(&hash, sha1, sizeof(unsigned int));
-	return hash & (n - 1);
+	return sha1hash(sha1) & (n - 1);
 }
 
 /*
@@ -311,10 +307,9 @@
  */
 static char object_array_slopbuf[1];
 
-static void add_object_array_with_mode_context(struct object *obj, const char *name,
-					       struct object_array *array,
-					       unsigned mode,
-					       struct object_context *context)
+void add_object_array_with_path(struct object *obj, const char *name,
+				struct object_array *array,
+				unsigned mode, const char *path)
 {
 	unsigned nr = array->nr;
 	unsigned alloc = array->alloc;
@@ -323,7 +318,7 @@
 
 	if (nr >= alloc) {
 		alloc = (alloc + 32) * 2;
-		objects = xrealloc(objects, alloc * sizeof(*objects));
+		REALLOC_ARRAY(objects, alloc);
 		array->alloc = alloc;
 		array->objects = objects;
 	}
@@ -337,26 +332,27 @@
 	else
 		entry->name = xstrdup(name);
 	entry->mode = mode;
-	entry->context = context;
+	if (path)
+		entry->path = xstrdup(path);
+	else
+		entry->path = NULL;
 	array->nr = ++nr;
 }
 
 void add_object_array(struct object *obj, const char *name, struct object_array *array)
 {
-	add_object_array_with_mode(obj, name, array, S_IFINVALID);
+	add_object_array_with_path(obj, name, array, S_IFINVALID, NULL);
 }
 
-void add_object_array_with_mode(struct object *obj, const char *name, struct object_array *array, unsigned mode)
+/*
+ * Free all memory associated with an entry; the result is
+ * in an unspecified state and should not be examined.
+ */
+static void object_array_release_entry(struct object_array_entry *ent)
 {
-	add_object_array_with_mode_context(obj, name, array, mode, NULL);
-}
-
-void add_object_array_with_context(struct object *obj, const char *name, struct object_array *array, struct object_context *context)
-{
-	if (context)
-		add_object_array_with_mode_context(obj, name, array, context->mode, context);
-	else
-		add_object_array_with_mode_context(obj, name, array, S_IFINVALID, context);
+	if (ent->name != object_array_slopbuf)
+		free(ent->name);
+	free(ent->path);
 }
 
 void object_array_filter(struct object_array *array,
@@ -371,13 +367,22 @@
 				objects[dst] = objects[src];
 			dst++;
 		} else {
-			if (objects[src].name != object_array_slopbuf)
-				free(objects[src].name);
+			object_array_release_entry(&objects[src]);
 		}
 	}
 	array->nr = dst;
 }
 
+void object_array_clear(struct object_array *array)
+{
+	int i;
+	for (i = 0; i < array->nr; i++)
+		object_array_release_entry(&array->objects[i]);
+	free(array->objects);
+	array->objects = NULL;
+	array->nr = array->alloc = 0;
+}
+
 /*
  * Return true iff array already contains an entry with name.
  */
@@ -404,8 +409,7 @@
 				objects[array->nr] = objects[src];
 			array->nr++;
 		} else {
-			if (objects[src].name != object_array_slopbuf)
-				free(objects[src].name);
+			object_array_release_entry(&objects[src]);
 		}
 	}
 }
diff --git a/object.h b/object.h
index 5e8d8ee..6416247 100644
--- a/object.h
+++ b/object.h
@@ -18,8 +18,8 @@
 		 * empty string.
 		 */
 		char *name;
+		char *path;
 		unsigned mode;
-		struct object_context *context;
 	} *objects;
 };
 
@@ -53,7 +53,8 @@
 };
 
 extern const char *typename(unsigned int type);
-extern int type_from_string(const char *str);
+extern int type_from_string_gently(const char *str, ssize_t, int gentle);
+#define type_from_string(str) type_from_string_gently(str, -1, 0)
 
 /*
  * Return the current number of buckets in the object hashmap.
@@ -113,8 +114,7 @@
 
 /* Object array handling .. */
 void add_object_array(struct object *obj, const char *name, struct object_array *array);
-void add_object_array_with_mode(struct object *obj, const char *name, struct object_array *array, unsigned mode);
-void add_object_array_with_context(struct object *obj, const char *name, struct object_array *array, struct object_context *context);
+void add_object_array_with_path(struct object *obj, const char *name, struct object_array *array, unsigned mode, const char *path);
 
 typedef int (*object_array_each_func_t)(struct object_array_entry *, void *);
 
@@ -132,6 +132,12 @@
  */
 void object_array_remove_duplicates(struct object_array *array);
 
+/*
+ * Remove any objects from the array, freeing all used memory; afterwards
+ * the array is ready to store more objects with add_object_array().
+ */
+void object_array_clear(struct object_array *array);
+
 void clear_object_flags(unsigned flags);
 
 #endif /* OBJECT_H */
diff --git a/pack-bitmap-write.c b/pack-bitmap-write.c
index 5f1791a..8029ae3 100644
--- a/pack-bitmap-write.c
+++ b/pack-bitmap-write.c
@@ -111,8 +111,7 @@
 {
 	if (writer.selected_nr >= writer.selected_alloc) {
 		writer.selected_alloc = (writer.selected_alloc + 32) * 2;
-		writer.selected = xrealloc(writer.selected,
-					   writer.selected_alloc * sizeof(struct bitmapped_commit));
+		REALLOC_ARRAY(writer.selected, writer.selected_alloc);
 	}
 
 	writer.selected[writer.selected_nr].commit = commit;
diff --git a/pack-bitmap.c b/pack-bitmap.c
index 91e4101..a1f3c0d 100644
--- a/pack-bitmap.c
+++ b/pack-bitmap.c
@@ -400,10 +400,8 @@
 	if (hash_ret > 0) {
 		if (eindex->count >= eindex->alloc) {
 			eindex->alloc = (eindex->alloc + 16) * 3 / 2;
-			eindex->objects = xrealloc(eindex->objects,
-				eindex->alloc * sizeof(struct object *));
-			eindex->hashes = xrealloc(eindex->hashes,
-				eindex->alloc * sizeof(uint32_t));
+			REALLOC_ARRAY(eindex->objects, eindex->alloc);
+			REALLOC_ARRAY(eindex->hashes, eindex->alloc);
 		}
 
 		bitmap_pos = eindex->count;
diff --git a/pack-objects.c b/pack-objects.c
index 4f36c32..6398a8a 100644
--- a/pack-objects.c
+++ b/pack-objects.c
@@ -7,10 +7,9 @@
 					 const unsigned char *sha1,
 					 int *found)
 {
-	uint32_t i, hash, mask = (pdata->index_size - 1);
+	uint32_t i, mask = (pdata->index_size - 1);
 
-	memcpy(&hash, sha1, sizeof(uint32_t));
-	i = hash & mask;
+	i = sha1hash(sha1) & mask;
 
 	while (pdata->index[i] > 0) {
 		uint32_t pos = pdata->index[i] - 1;
@@ -93,8 +92,7 @@
 
 	if (pdata->nr_objects >= pdata->nr_alloc) {
 		pdata->nr_alloc = (pdata->nr_alloc  + 1024) * 3 / 2;
-		pdata->objects = xrealloc(pdata->objects,
-					  pdata->nr_alloc * sizeof(*new_entry));
+		REALLOC_ARRAY(pdata->objects, pdata->nr_alloc);
 	}
 
 	new_entry = pdata->objects + pdata->nr_objects++;
diff --git a/pack-write.c b/pack-write.c
index 9ccf804..33293ce 100644
--- a/pack-write.c
+++ b/pack-write.c
@@ -288,13 +288,12 @@
 	 * case, we need it to remove the corresponding .keep file
 	 * later on.  If we don't get that then tough luck with it.
 	 */
-	if (read_in_full(ip_out, packname, 46) == 46 && packname[45] == '\n' &&
-	    memcmp(packname, "keep\t", 5) == 0) {
-		char path[PATH_MAX];
+	if (read_in_full(ip_out, packname, 46) == 46 && packname[45] == '\n') {
+		const char *name;
 		packname[45] = 0;
-		snprintf(path, sizeof(path), "%s/pack/pack-%s.keep",
-			 get_object_directory(), packname + 5);
-		return xstrdup(path);
+		if (skip_prefix(packname, "keep\t", &name))
+			return xstrfmt("%s/pack/pack-%s.keep",
+				       get_object_directory(), name);
 	}
 	return NULL;
 }
diff --git a/pager.c b/pager.c
index 53670a6..f6e8c33 100644
--- a/pager.c
+++ b/pager.c
@@ -6,19 +6,13 @@
 #define DEFAULT_PAGER "less"
 #endif
 
-struct pager_config {
-	const char *cmd;
-	int want;
-	char *value;
-};
-
 /*
  * This is split up from the rest of git so that we can do
  * something different on Windows.
  */
 
 static const char *pager_argv[] = { NULL, NULL };
-static struct child_process pager_process;
+static struct child_process pager_process = CHILD_PROCESS_INIT;
 
 static void wait_for_pager(void)
 {
@@ -80,17 +74,10 @@
 	pager_process.use_shell = 1;
 	pager_process.argv = pager_argv;
 	pager_process.in = -1;
-	if (!getenv("LESS") || !getenv("LV")) {
-		static const char *env[3];
-		int i = 0;
-
-		if (!getenv("LESS"))
-			env[i++] = "LESS=FRSX";
-		if (!getenv("LV"))
-			env[i++] = "LV=-c";
-		env[i] = NULL;
-		pager_process.env = env;
-	}
+	if (!getenv("LESS"))
+		argv_array_push(&pager_process.env_array, "LESS=FRX");
+	if (!getenv("LV"))
+		argv_array_push(&pager_process.env_array, "LV=-c");
 	if (start_command(&pager_process))
 		return;
 
@@ -155,30 +142,22 @@
 	return width;
 }
 
-static int pager_command_config(const char *var, const char *value, void *data)
-{
-	struct pager_config *c = data;
-	if (starts_with(var, "pager.") && !strcmp(var + 6, c->cmd)) {
-		int b = git_config_maybe_bool(var, value);
-		if (b >= 0)
-			c->want = b;
-		else {
-			c->want = 1;
-			c->value = xstrdup(value);
-		}
-	}
-	return 0;
-}
-
 /* returns 0 for "no pager", 1 for "use pager", and -1 for "not specified" */
 int check_pager_config(const char *cmd)
 {
-	struct pager_config c;
-	c.cmd = cmd;
-	c.want = -1;
-	c.value = NULL;
-	git_config(pager_command_config, &c);
-	if (c.value)
-		pager_program = c.value;
-	return c.want;
+	int want = -1;
+	struct strbuf key = STRBUF_INIT;
+	const char *value = NULL;
+	strbuf_addf(&key, "pager.%s", cmd);
+	if (!git_config_get_value(key.buf, &value)) {
+		int b = git_config_maybe_bool(key.buf, value);
+		if (b >= 0)
+			want = b;
+		else {
+			want = 1;
+			pager_program = xstrdup(value);
+		}
+	}
+	strbuf_release(&key);
+	return want;
 }
diff --git a/parse-options.c b/parse-options.c
index b536896..80106c0 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -14,8 +14,12 @@
 
 int optbug(const struct option *opt, const char *reason)
 {
-	if (opt->long_name)
+	if (opt->long_name) {
+		if (opt->short_name)
+			return error("BUG: switch '%c' (--%s) %s",
+				     opt->short_name, opt->long_name, reason);
 		return error("BUG: option '%s' %s", opt->long_name, reason);
+	}
 	return error("BUG: switch '%c' %s", opt->short_name, reason);
 }
 
@@ -231,7 +235,8 @@
 			continue;
 
 again:
-		rest = skip_prefix(arg, long_name);
+		if (!skip_prefix(arg, long_name, &rest))
+			rest = NULL;
 		if (options->type == OPTION_ARGUMENT) {
 			if (!rest)
 				continue;
@@ -280,12 +285,13 @@
 				continue;
 			}
 			flags |= OPT_UNSET;
-			rest = skip_prefix(arg + 3, long_name);
-			/* abbreviated and negated? */
-			if (!rest && starts_with(long_name, arg + 3))
-				goto is_abbreviated;
-			if (!rest)
-				continue;
+			if (!skip_prefix(arg + 3, long_name, &rest)) {
+				/* abbreviated and negated? */
+				if (starts_with(long_name, arg + 3))
+					goto is_abbreviated;
+				else
+					continue;
+			}
 		}
 		if (*rest) {
 			if (*rest != '=')
@@ -345,12 +351,20 @@
 static void parse_options_check(const struct option *opts)
 {
 	int err = 0;
+	char short_opts[128];
 
+	memset(short_opts, '\0', sizeof(short_opts));
 	for (; opts->type != OPTION_END; opts++) {
 		if ((opts->flags & PARSE_OPT_LASTARG_DEFAULT) &&
 		    (opts->flags & PARSE_OPT_OPTARG))
 			err |= optbug(opts, "uses incompatible flags "
 					"LASTARG_DEFAULT and OPTARG");
+		if (opts->short_name) {
+			if (0x7F <= opts->short_name)
+				err |= optbug(opts, "invalid short name");
+			else if (short_opts[opts->short_name]++)
+				err |= optbug(opts, "short name already used");
+		}
 		if (opts->flags & PARSE_OPT_NODASH &&
 		    ((opts->flags & PARSE_OPT_OPTARG) ||
 		     !(opts->flags & PARSE_OPT_NOARG) ||
diff --git a/parse-options.h b/parse-options.h
index 3189676..7940bc7 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -176,8 +176,8 @@
 
 extern int optbug(const struct option *opt, const char *reason);
 extern int opterror(const struct option *opt, const char *reason, int flags);
-#if defined(__GNUC__) && ! defined(__clang__)
-#define opterror(o,r,f) (opterror((o),(r),(f)), -1)
+#if defined(__GNUC__)
+#define opterror(o,r,f) (opterror((o),(r),(f)), const_error())
 #endif
 
 /*----- incremental advanced APIs -----*/
diff --git a/path.c b/path.c
index c36f003..f68df0c 100644
--- a/path.c
+++ b/path.c
@@ -148,10 +148,12 @@
 			*global = mkpathdup("%s/.gitconfig", home);
 	}
 
-	if (!xdg_home)
-		*xdg = NULL;
-	else
-		*xdg = mkpathdup("%s/git/%s", xdg_home, file);
+	if (xdg) {
+		if (!xdg_home)
+			*xdg = NULL;
+		else
+			*xdg = mkpathdup("%s/git/%s", xdg_home, file);
+	}
 
 	free(to_free);
 }
@@ -275,16 +277,16 @@
 			const char *home = getenv("HOME");
 			if (!home)
 				goto return_null;
-			strbuf_add(&user_path, home, strlen(home));
+			strbuf_addstr(&user_path, home);
 		} else {
 			struct passwd *pw = getpw_str(username, username_len);
 			if (!pw)
 				goto return_null;
-			strbuf_add(&user_path, pw->pw_dir, strlen(pw->pw_dir));
+			strbuf_addstr(&user_path, pw->pw_dir);
 		}
 		to_copy = first_slash;
 	}
-	strbuf_add(&user_path, to_copy, strlen(to_copy));
+	strbuf_addstr(&user_path, to_copy);
 	return strbuf_detach(&user_path, NULL);
 return_null:
 	strbuf_release(&user_path);
@@ -821,10 +823,3 @@
 		}
 	}
 }
-
-int offset_1st_component(const char *path)
-{
-	if (has_dos_drive_prefix(path))
-		return 2 + is_dir_sep(path[2]);
-	return is_dir_sep(path[0]);
-}
diff --git a/pathspec.c b/pathspec.c
index 0be5edb..9304ee3 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -338,7 +338,7 @@
 		if (!(magic & m->bit))
 			continue;
 		if (sb.len)
-			strbuf_addstr(&sb, " ");
+			strbuf_addch(&sb, ' ');
 		if (short_magic & m->bit)
 			strbuf_addf(&sb, "'%c'", m->mnemonic);
 		else
diff --git a/perl/Git.pm b/perl/Git.pm
index 204fdc6..b5905ee 100644
--- a/perl/Git.pm
+++ b/perl/Git.pm
@@ -1294,8 +1294,11 @@
 			$tmpdir = $self->repo_path();
 		}
 
+		my $n = $name;
+		$n =~ s/\W/_/g; # no strange chars
+
 		($$temp_fd, $fname) = File::Temp::tempfile(
-			'Git_XXXXXX', UNLINK => 1, DIR => $tmpdir,
+			"Git_${n}_XXXXXX", UNLINK => 1, DIR => $tmpdir,
 			) or throw Error::Simple("couldn't open new temp file");
 
 		$$temp_fd->autoflush;
diff --git a/perl/Git/SVN.pm b/perl/Git/SVN.pm
index a59564f..d9a52a5 100644
--- a/perl/Git/SVN.pm
+++ b/perl/Git/SVN.pm
@@ -1178,7 +1178,7 @@
 			  or die "SVN connection failed somewhere...\n";
 		}
 		print STDERR "Successfully followed parent\n" unless $::_q > 1;
-		return $self->make_log_entry($rev, [$parent], $ed);
+		return $self->make_log_entry($rev, [$parent], $ed, $r0, $branch_from);
 	}
 	return undef;
 }
@@ -1210,7 +1210,7 @@
 	unless ($self->ra->gs_do_update($last_rev, $rev, $self, $ed)) {
 		die "SVN connection failed somewhere...\n";
 	}
-	$self->make_log_entry($rev, \@parents, $ed);
+	$self->make_log_entry($rev, \@parents, $ed, $last_rev, $self->path);
 }
 
 sub mkemptydirs {
@@ -1321,7 +1321,7 @@
 sub parse_svn_date {
 	my $date = shift || return '+0000 1970-01-01 00:00:00';
 	my ($Y,$m,$d,$H,$M,$S) = ($date =~ /^(\d{4})\-(\d\d)\-(\d\d)T
-	                                    (\d\d)\:(\d\d)\:(\d\d)\.\d*Z$/x) or
+	                                    (\d\d?)\:(\d\d)\:(\d\d)\.\d*Z$/x) or
 	                                 croak "Unable to parse date: $date\n";
 	my $parsed_date;    # Set next.
 
@@ -1433,7 +1433,7 @@
 }
 
 sub find_extra_svk_parents {
-	my ($self, $ed, $tickets, $parents) = @_;
+	my ($self, $tickets, $parents) = @_;
 	# aha!  svk:merge property changed...
 	my @tickets = split "\n", $tickets;
 	my @known_parents;
@@ -1478,9 +1478,9 @@
 sub lookup_svn_merge {
 	my $uuid = shift;
 	my $url = shift;
-	my $merge = shift;
+	my $source = shift;
+	my $revs = shift;
 
-	my ($source, $revs) = split ":", $merge;
 	my $path = $source;
 	$path =~ s{^/}{};
 	my $gs = Git::SVN->find_by_url($url.$source, $url, $path);
@@ -1537,7 +1537,7 @@
 	@rv;
 }
 
-sub check_cherry_pick {
+sub check_cherry_pick2 {
 	my $base = shift;
 	my $tip = shift;
 	my $parents = shift;
@@ -1552,7 +1552,8 @@
 			delete $commits{$commit};
 		}
 	}
-	return (keys %commits);
+	my @k = (keys %commits);
+	return (scalar @k, $k[0]);
 }
 
 sub has_no_changes {
@@ -1597,9 +1598,8 @@
 		mkpath([$cache_path]) unless -d $cache_path;
 
 		my %lookup_svn_merge_cache;
-		my %check_cherry_pick_cache;
+		my %check_cherry_pick2_cache;
 		my %has_no_changes_cache;
-		my %_rev_list_cache;
 
 		tie_for_persistent_memoization(\%lookup_svn_merge_cache,
 		    "$cache_path/lookup_svn_merge");
@@ -1608,11 +1608,11 @@
 			LIST_CACHE => ['HASH' => \%lookup_svn_merge_cache],
 		;
 
-		tie_for_persistent_memoization(\%check_cherry_pick_cache,
-		    "$cache_path/check_cherry_pick");
-		memoize 'check_cherry_pick',
+		tie_for_persistent_memoization(\%check_cherry_pick2_cache,
+		    "$cache_path/check_cherry_pick2");
+		memoize 'check_cherry_pick2',
 			SCALAR_CACHE => 'FAULT',
-			LIST_CACHE => ['HASH' => \%check_cherry_pick_cache],
+			LIST_CACHE => ['HASH' => \%check_cherry_pick2_cache],
 		;
 
 		tie_for_persistent_memoization(\%has_no_changes_cache,
@@ -1621,14 +1621,6 @@
 			SCALAR_CACHE => ['HASH' => \%has_no_changes_cache],
 			LIST_CACHE => 'FAULT',
 		;
-
-		tie_for_persistent_memoization(\%_rev_list_cache,
-		    "$cache_path/_rev_list");
-		memoize '_rev_list',
-			SCALAR_CACHE => 'FAULT',
-			LIST_CACHE => ['HASH' => \%_rev_list_cache],
-		;
-
 	}
 
 	sub unmemoize_svn_mergeinfo_functions {
@@ -1636,9 +1628,8 @@
 		$memoized = 0;
 
 		Memoize::unmemoize 'lookup_svn_merge';
-		Memoize::unmemoize 'check_cherry_pick';
+		Memoize::unmemoize 'check_cherry_pick2';
 		Memoize::unmemoize 'has_no_changes';
-		Memoize::unmemoize '_rev_list';
 	}
 
 	sub clear_memoized_mergeinfo_caches {
@@ -1648,7 +1639,8 @@
 		return unless -d $cache_path;
 
 		for my $cache_file (("$cache_path/lookup_svn_merge",
-				     "$cache_path/check_cherry_pick",
+				     "$cache_path/check_cherry_pick", # old
+				     "$cache_path/check_cherry_pick2",
 				     "$cache_path/has_no_changes")) {
 			for my $suffix (qw(yaml db)) {
 				my $file = "$cache_file.$suffix";
@@ -1702,11 +1694,49 @@
 	return @excluded;
 }
 
+# Compute what's new in svn:mergeinfo.
+sub mergeinfo_changes {
+	my ($self, $old_path, $old_rev, $path, $rev, $mergeinfo_prop) = @_;
+	my %minfo = map {split ":", $_ } split "\n", $mergeinfo_prop;
+	my $old_minfo = {};
+
+	my $ra = $self->ra;
+	# Give up if $old_path isn't in the repo.
+	# This is probably a merge on a subtree.
+	if ($ra->check_path($old_path, $old_rev) != $SVN::Node::dir) {
+		warn "W: ignoring svn:mergeinfo on $old_path, ",
+			"directory didn't exist in r$old_rev\n";
+		return {};
+	}
+	my (undef, undef, $props) = $ra->get_dir($old_path, $old_rev);
+	if (defined $props->{"svn:mergeinfo"}) {
+		my %omi = map {split ":", $_ } split "\n",
+			$props->{"svn:mergeinfo"};
+		$old_minfo = \%omi;
+	}
+
+	my %changes = ();
+	foreach my $p (keys %minfo) {
+		my $a = $old_minfo->{$p} || "";
+		my $b = $minfo{$p};
+		# Omit merged branches whose ranges lists are unchanged.
+		next if $a eq $b;
+		# Remove any common range list prefix.
+		($a ^ $b) =~ /^[\0]*/;
+		my $common_prefix = rindex $b, ",", $+[0] - 1;
+		$changes{$p} = substr $b, $common_prefix + 1;
+	}
+	print STDERR "Checking svn:mergeinfo changes since r$old_rev: ",
+		scalar(keys %minfo), " sources, ",
+		scalar(keys %changes), " changed\n";
+
+	return \%changes;
+}
 
 # note: this function should only be called if the various dirprops
 # have actually changed
 sub find_extra_svn_parents {
-	my ($self, $ed, $mergeinfo, $parents) = @_;
+	my ($self, $mergeinfo, $parents) = @_;
 	# aha!  svk:merge property changed...
 
 	memoize_svn_mergeinfo_functions();
@@ -1715,14 +1745,15 @@
 	# history.  Then, we figure out which git revisions are in
 	# that tip, but not this revision.  If all of those revisions
 	# are now marked as merge, we can add the tip as a parent.
-	my @merges = split "\n", $mergeinfo;
+	my @merges = sort keys %$mergeinfo;
 	my @merge_tips;
 	my $url = $self->url;
 	my $uuid = $self->ra_uuid;
 	my @all_ranges;
 	for my $merge ( @merges ) {
 		my ($tip_commit, @ranges) =
-			lookup_svn_merge( $uuid, $url, $merge );
+			lookup_svn_merge( $uuid, $url,
+					  $merge, $mergeinfo->{$merge} );
 		unless (!$tip_commit or
 				grep { $_ eq $tip_commit } @$parents ) {
 			push @merge_tips, $tip_commit;
@@ -1738,8 +1769,9 @@
 	# check merge tips for new parents
 	my @new_parents;
 	for my $merge_tip ( @merge_tips ) {
-		my $spec = shift @merges;
+		my $merge = shift @merges;
 		next unless $merge_tip and $excluded{$merge_tip};
+		my $spec = "$merge:$mergeinfo->{$merge}";
 
 		# check out 'new' tips
 		my $merge_base;
@@ -1759,19 +1791,17 @@
 		}
 
 		# double check that there are no missing non-merge commits
-		my (@incomplete) = check_cherry_pick(
+		my ($ninc, $ifirst) = check_cherry_pick2(
 			$merge_base, $merge_tip,
 			$parents,
 			@all_ranges,
 		       );
 
-		if ( @incomplete ) {
-			warn "W:svn cherry-pick ignored ($spec) - missing "
-				.@incomplete." commit(s) (eg $incomplete[0])\n";
+		if ($ninc) {
+			warn "W: svn cherry-pick ignored ($spec) - missing " .
+				"$ninc commit(s) (eg $ifirst)\n";
 		} else {
-			warn
-				"Found merge parent (svn:mergeinfo prop): ",
-					$merge_tip, "\n";
+			warn "Found merge parent ($spec): ", $merge_tip, "\n";
 			push @new_parents, $merge_tip;
 		}
 	}
@@ -1797,23 +1827,20 @@
 }
 
 sub make_log_entry {
-	my ($self, $rev, $parents, $ed) = @_;
+	my ($self, $rev, $parents, $ed, $parent_rev, $parent_path) = @_;
 	my $untracked = $self->get_untracked($ed);
 
 	my @parents = @$parents;
-	my $ps = $ed->{path_strip} || "";
-	for my $path ( grep { m/$ps/ } %{$ed->{dir_prop}} ) {
-		my $props = $ed->{dir_prop}{$path};
-		if ( $props->{"svk:merge"} ) {
-			$self->find_extra_svk_parents
-				($ed, $props->{"svk:merge"}, \@parents);
-		}
-		if ( $props->{"svn:mergeinfo"} ) {
-			$self->find_extra_svn_parents
-				($ed,
-				 $props->{"svn:mergeinfo"},
-				 \@parents);
-		}
+	my $props = $ed->{dir_prop}{$self->path};
+	if ( $props->{"svk:merge"} ) {
+		$self->find_extra_svk_parents($props->{"svk:merge"}, \@parents);
+	}
+	if ( $props->{"svn:mergeinfo"} ) {
+		my $mi_changes = $self->mergeinfo_changes
+			($parent_path, $parent_rev,
+			 $self->path, $rev,
+			 $props->{"svn:mergeinfo"});
+		$self->find_extra_svn_parents($mi_changes, \@parents);
 	}
 
 	open my $un, '>>', "$self->{dir}/unhandled.log" or croak $!;
diff --git a/perl/Git/SVN/Log.pm b/perl/Git/SVN/Log.pm
index 34f2869..6641053 100644
--- a/perl/Git/SVN/Log.pm
+++ b/perl/Git/SVN/Log.pm
@@ -116,7 +116,7 @@
 		return;
 	}
 	open STDIN, '<&', $rfd or fatal "Can't redirect stdin: $!";
-	$ENV{LESS} ||= 'FRSX';
+	$ENV{LESS} ||= 'FRX';
 	$ENV{LV} ||= '-c';
 	exec $pager or fatal "Can't run pager: $! ($pager)";
 }
diff --git a/perl/Git/SVN/Ra.pm b/perl/Git/SVN/Ra.pm
index a7b0119..622535e 100644
--- a/perl/Git/SVN/Ra.pm
+++ b/perl/Git/SVN/Ra.pm
@@ -2,6 +2,7 @@
 use vars qw/@ISA $config_dir $_ignore_refs_regex $_log_window_size/;
 use strict;
 use warnings;
+use Memoize;
 use SVN::Client;
 use Git::SVN::Utils qw(
 	canonicalize_url
@@ -76,6 +77,40 @@
 	\@rv;
 }
 
+sub prepare_config_once {
+	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';
+	# The usage of $SVN::_Core::SVN_CONFIG_* variables
+	# produces warnings that variables are used only once.
+	# I had not found the better way to shut them up, so
+	# the warnings of type 'once' are disabled in this block.
+	if (SVN::_Core::svn_config_get_bool($conf_t,
+	    $SVN::_Core::SVN_CONFIG_SECTION_AUTH,
+	    $SVN::_Core::SVN_CONFIG_OPTION_STORE_PASSWORDS,
+	    1) == 0) {
+		SVN::_Core::svn_auth_set_parameter($baton,
+		    $SVN::_Core::SVN_AUTH_PARAM_DONT_STORE_PASSWORDS,
+		    bless (\$dont_store_passwords, "_p_void"));
+	}
+	if (SVN::_Core::svn_config_get_bool($conf_t,
+	    $SVN::_Core::SVN_CONFIG_SECTION_AUTH,
+	    $SVN::_Core::SVN_CONFIG_OPTION_STORE_AUTH_CREDS,
+	    1) == 0) {
+		$Git::SVN::Prompt::_no_auth_cache = 1;
+	}
+
+	return ($config, $baton, $callbacks);
+} # no warnings 'once'
+
+INIT {
+	Memoize::memoize '_auth_providers';
+	Memoize::memoize 'prepare_config_once';
+}
 
 sub new {
 	my ($class, $url) = @_;
@@ -84,34 +119,8 @@
 
 	::_req_svn();
 
-	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);
 	$RA = undef;
-	my $dont_store_passwords = 1;
-	my $conf_t = ${$config}{'config'};
-	{
-		no warnings 'once';
-		# The usage of $SVN::_Core::SVN_CONFIG_* variables
-		# produces warnings that variables are used only once.
-		# I had not found the better way to shut them up, so
-		# the warnings of type 'once' are disabled in this block.
-		if (SVN::_Core::svn_config_get_bool($conf_t,
-		    $SVN::_Core::SVN_CONFIG_SECTION_AUTH,
-		    $SVN::_Core::SVN_CONFIG_OPTION_STORE_PASSWORDS,
-		    1) == 0) {
-			SVN::_Core::svn_auth_set_parameter($baton,
-			    $SVN::_Core::SVN_AUTH_PARAM_DONT_STORE_PASSWORDS,
-			    bless (\$dont_store_passwords, "_p_void"));
-		}
-		if (SVN::_Core::svn_config_get_bool($conf_t,
-		    $SVN::_Core::SVN_CONFIG_SECTION_AUTH,
-		    $SVN::_Core::SVN_CONFIG_OPTION_STORE_AUTH_CREDS,
-		    1) == 0) {
-			$Git::SVN::Prompt::_no_auth_cache = 1;
-		}
-	} # no warnings 'once'
-
+	my ($config, $baton, $callbacks) = prepare_config_once();
 	my $self = SVN::Ra->new(url => $url, auth => $baton,
 	                      config => $config,
 			      pool => SVN::Pool->new,
@@ -166,7 +175,17 @@
 		}
 	}
 	my $pool = SVN::Pool->new;
-	my ($d, undef, $props) = $self->SUPER::get_dir($dir, $r, $pool);
+	my ($d, undef, $props);
+
+	if (::compare_svn_version('1.4.0') >= 0) {
+		# n.b. in addition to being potentially more efficient,
+		# this works around what appears to be a bug in some
+		# SVN 1.8 versions
+		my $kind = 1; # SVN_DIRENT_KIND
+		($d, undef, $props) = $self->get_dir2($dir, $r, $kind, $pool);
+	} else {
+		($d, undef, $props) = $self->SUPER::get_dir($dir, $r, $pool);
+	}
 	my %dirents = map { $_ => { kind => $d->{$_}->kind } } keys %$d;
 	$pool->clear;
 	if ($r != $cache->{r}) {
@@ -177,10 +196,6 @@
 	wantarray ? (\%dirents, $r, $props) : \%dirents;
 }
 
-sub DESTROY {
-	# do not call the real DESTROY since we store ourselves in $RA
-}
-
 # get_log(paths, start, end, limit,
 #         discover_changed_paths, strict_node_history, receiver)
 sub get_log {
@@ -376,10 +391,19 @@
 sub gs_fetch_loop_common {
 	my ($self, $base, $head, $gsv, $globs) = @_;
 	return if ($base > $head);
+	my $gpool = SVN::Pool->new_default;
+	my $ra_url = $self->url;
+	my $reload_ra = sub {
+		$_[0] = undef;
+		$self = undef;
+		$RA = undef;
+		$gpool->clear;
+		$self = Git::SVN::Ra->new($ra_url);
+		$ra_invalid = undef;
+	};
 	my $inc = $_log_window_size;
 	my ($min, $max) = ($base, $head < $base + $inc ? $head : $base + $inc);
 	my $longest_path = longest_common_path($gsv, $globs);
-	my $ra_url = $self->url;
 	my $find_trailing_edge;
 	while (1) {
 		my %revs;
@@ -426,7 +450,7 @@
 
 		my %exists = map { $_->path => $_ } @$gsv;
 		foreach my $r (sort {$a <=> $b} keys %revs) {
-			my ($paths, $logged) = @{$revs{$r}};
+			my ($paths, $logged) = @{delete $revs{$r}};
 
 			foreach my $gs ($self->match_globs(\%exists, $paths,
 			                                   $globs, $r)) {
@@ -449,13 +473,7 @@
 				        "$g->{t}-maxRev";
 				Git::SVN::tmp_config($k, $r);
 			}
-			if ($ra_invalid) {
-				$_[0] = undef;
-				$self = undef;
-				$RA = undef;
-				$self = Git::SVN::Ra->new($ra_url);
-				$ra_invalid = undef;
-			}
+			$reload_ra->() if $ra_invalid;
 		}
 		# pre-fill the .rev_db since it'll eventually get filled in
 		# with '0' x40 if something new gets committed
@@ -472,6 +490,8 @@
 		$min = $max + 1;
 		$max += $inc;
 		$max = $head if ($max > $head);
+
+		$reload_ra->();
 	}
 	Git::SVN::gc();
 }
diff --git a/pkt-line.c b/pkt-line.c
index bc63b3b..8bc89b1 100644
--- a/pkt-line.c
+++ b/pkt-line.c
@@ -3,7 +3,7 @@
 
 char packet_buffer[LARGE_PACKET_MAX];
 static const char *packet_trace_prefix = "git";
-static const char trace_key[] = "GIT_TRACE_PACKET";
+static struct trace_key trace_packet = TRACE_KEY_INIT(PACKET);
 
 void packet_trace_identity(const char *prog)
 {
@@ -15,7 +15,7 @@
 	int i;
 	struct strbuf out;
 
-	if (!trace_want(trace_key))
+	if (!trace_want(&trace_packet))
 		return;
 
 	/* +32 is just a guess for header + quoting */
@@ -27,7 +27,7 @@
 	if ((len >= 4 && starts_with(buf, "PACK")) ||
 	    (len >= 5 && starts_with(buf+1, "PACK"))) {
 		strbuf_addstr(&out, "PACK ...");
-		unsetenv(trace_key);
+		trace_disable(&trace_packet);
 	}
 	else {
 		/* XXX we should really handle printable utf8 */
@@ -43,7 +43,7 @@
 	}
 
 	strbuf_addch(&out, '\n');
-	trace_strbuf(trace_key, &out);
+	trace_strbuf(&trace_packet, &out);
 	strbuf_release(&out);
 }
 
diff --git a/po/TEAMS b/po/TEAMS
index f75a174..a33a38e 100644
--- a/po/TEAMS
+++ b/po/TEAMS
@@ -5,12 +5,19 @@
 Repository:	https://github.com/git-l10n/git-po
 Leader:		Alexander Shopov <ash@kambanaria.org>
 
+Language:	ca (Catalan)
+Repository:	https://github.com/alexhenrie/git-po
+Leader:		Alex Henrie <alexhenrie24@gmail.com>
+
 Language:	de (German)
 Repository:	https://github.com/ralfth/git-po-de
 Leader:		Ralf Thielow <ralf.thielow@googlemail.com>
 Members:	Thomas Rast <tr@thomasrast.ch>
 		Jan Krüger <jk@jk.gs>
 		Christian Stimming <stimming@tuhh.de>
+		Phillip Szelat <phillip.szelat@gmail.com>
+		Matthias Rüster <matthias.ruester@gmail.com>
+		Magnus Görlitz <magnus.goerlitz@googlemail.com>
 
 Language:	fr (French)
 Repository:	https://github.com/jnavila/git
diff --git a/po/bg.po b/po/bg.po
index e862e10..f802d28 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -18,7 +18,7 @@
 # root commit начално подаване
 # fixup вкарвам подаване в предното без следа
 # remote-tracking branch следящ клон
-# git bundle архив на git
+# git bundle пратка на git
 # bisect двоично търсене
 # am прилагам поредица от кръпки
 # working directory/tree — винаги работно дърво, git следи цялото дърво, а не директории
@@ -39,16 +39,42 @@
 # sequence последователност/поредица
 # whitespace symbol знаци за интервали
 # shortlog съкратения журнал
+# backing store мястото за съхранение
+# reject отхвърлено парче
+# topic branch тематичен клон
+# empty head връх без история
+# tree-ish указател към дърво
+# three-way merge тройно сливане
+# dirty нечист, мръсен (файл, индекс)
+# fallback  резервен вариант
+# pathspec magic опция за магически пътища
+# bitmap index индекс на база битови маски
+# mark маркер
+# plumbing команди от системно ниво
+# porcelain команди от потребителско ниво
+# pack [noun] пакетен файл - fixme in glossary
+# mainline базово подаване - при cherry-pick на merge - към коя версия да се изчислява разликата
+# token лексема
+# trailer епилог/завършек на съобщение
 # ----
 # FAILED to parse неуспешен анализ на... -> неразпозната стойност на
-#
+# blob обект BLOB
 # ========================
-# „“…—
+# „“…— ●≫ѝ→
+#
+# stressed a
+# форма̀та
+# delta - разлика или делта
+# consistency between stdout - standard output/ stdin - standard input/ stderr - standard error
+# mergetag етикет при сливане
+#
 # ========================
 # RECHECK
 # ------------------------
+# FIXME
 # HEAD as a reference vs head of a branch
-#
+# git update-index -h извежда само един ред, а не цялата помощ за опциите
+# git fetch --al работи подобно на --all
 # ========================
 # GENERATE STATS
 # ------------------------
@@ -67,7 +93,7 @@
 # ========================
 # STRINGS statistics
 # ------------------------
-# 1307t,0f,921u
+# 2228t
 #
 # ========================
 # MOST IMPORTANT name asc ordering
@@ -75,40 +101,37 @@
 # add, blame, branch, checkout, clone, commit, common-cmds, config, diff, fetch, fsck, gc, git-rebase, git-stash, grep, log, mv, parse-options, push, reflog, remote, reset, revert, rm, wt-status
 #
 # ========================
-# IMPORTANT strings desc, name asc ordering
+# IMPORTANT strings, name asc ordering
 # ------------------------
-# 111 apply            54 git-submodule  30 git-am      13 check-ignore  10 merge-file 
-#  97 merge            39 init-db        30 describe    12 pathspec      10 merge-base 
-#  64 tag              35 archive        29 git-bisect  12 name-rev      10 ls-tree    
-#  55 merge-recursive  32 clean          14 show-ref    11 date          10 hash-object
+# apply, archive, check-ignore, clean, date, describe, git-am, git-bisect, git-submodule, hash-object, init-db, ls-tree, merge, merge-base, merge-file, merge-recursive, name-rev, pathspec, show-ref, tag
 #
 # ========================
 # WHOLE STATISTICS strings desc, name asc ordering
 # ------------------------
-# 144 [remote]           47 [push]          26 [revert]         12 checkout-index    6 [prune]          2 [verify-tag]
-# 137 [commit]           46 pack-objects    24 [mv]             11 date              6 [gpg-interface]  2 [update-server-info]
-# 114 [branch]           41 [help]          23 repack           11 column            6 [check-attr]     2 [run-command]
-# 111 apply              39 init-db         21 [rm]             10 urlmatch          5 [write-tree]     2 [rerere]
-# 101 notes              36 [add]           21 [common-cmds]    10 shortlog          5 [sha1_name]      2 [read-cache]
-# 100 [wt-status]        35 [reset]         19 [show-branch]    10 merge-file        5 [rev-parse]      2 [obstack]
-#  97 merge              35 archive         19 read-tree        10 merge-base        4 [wrapper]        2 [advice]
-#  78 [checkout]         34 [config]        19 bundle           10 ls-tree           4 [prune-packed]   1 [unpack-trees]
-#  77 [log]              32 clean           16 [parse-options]  10 hash-object       4 [notes-utils]    1 [unpack-objects]
-#  69 [clone]            30 git-am          15 [fsck]           10 for-each-ref      4 [mktree]         1 [progress]
-#  68 index-pack         30 describe        14 show-ref         10 cat-file          4 [check-mailmap]  1 [precompose_utf8]
+# 144 [remote]           47 [push]          26 [revert]         12 [checkout-index]  6 [prune]          2 [verify-tag]
+# 137 [commit]           46 [pack-objects]  24 [mv]             11 [date]            6 [gpg-interface]  2 [update-server-info]
+# 114 [branch]           41 [help]          23 [repack]         11 [column]          6 [check-attr]     2 [run-command]
+# 111 [apply]            39 [init-db]       21 [rm]             10 [urlmatch]        5 [write-tree]     2 [rerere]
+# 101 [notes]            36 [add]           21 [common-cmds]    10 [shortlog]        5 [sha1_name]      2 [read-cache]
+# 100 [wt-status]        35 [reset]         19 [show-branch]    10 [merge-file]      5 [rev-parse]      2 [obstack]
+#  97 [merge]            35 [archive]       19 [read-tree]      10 [merge-base]      4 [wrapper]        2 [advice]
+#  78 [checkout]         34 [config]        19 [bundle]         10 [ls-tree]         4 [prune-packed]   1 [unpack-trees]
+#  77 [log]              32 [clean]         16 [parse-options]  10 [hash-object]     4 [notes-utils]    1 [unpack-objects]
+#  69 [clone]            30 [git-am]        15 [fsck]           10 [for-each-ref]    4 [mktree]         1 [progress]
+#  68 [index-pack]       30 [describe]      14 [show-ref]       10 [cat-file]        4 [check-mailmap]  1 [precompose_utf8]
 #  68 [fetch]            29 [git-stash]     14 [gc]              9 [update-ref]      3 [verify-pack]    1 [object]
-#  64 tag                29 git-bisect      14 fast-export       9 [submodule]       3 [reflog]         1 [git]
-#  64 [grep]             28 update-index    13 [diff]            8 [replace]         3 [pack-refs]      1 [diffcore-rename]
-#  56 sequencer          28 [blame]         13 check-ignore      8 [git-pull]        3 [count-objects]  1 [diffcore-order]
-#  55 merge-recursive    27 ls-files        12 pathspec          8 [fmt-merge-msg]   3 [connected]      1 [attr]
-#  54 git-submodule      27 [git-rebase]    12 name-rev          7 [symbolic-ref]    3 [bisect--helper]
+#  64 [tag]              29 [git-bisect]    14 [fast-export]     9 [submodule]       3 [reflog]         1 [git]
+#  64 [grep]             28 [update-index]  13 [diff]            8 [replace]         3 [pack-refs]      1 [diffcore-rename]
+#  56 [sequencer]        28 [blame]         13 [check-ignore]    8 [git-pull]        3 [count-objects]  1 [diffcore-order]
+#  55 [merge-recursive]  27 [ls-files]      12 [pathspec]        8 [fmt-merge-msg]   3 [connected]      1 [attr]
+#  54 [git-submodule]    27 [git-rebase]    12 [name-rev]        7 [symbolic-ref]    3 [bisect--helper]
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: git master\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-04-19 12:50+0800\n"
-"PO-Revision-Date: 2014-05-11 17:06+0300\n"
+"POT-Creation-Date: 2014-11-02 18:01+0200\n"
+"PO-Revision-Date: 2014-11-02 18:52+0200\n"
 "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
 "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
 "Language: bg\n"
@@ -122,109 +145,108 @@
 msgid "hint: %.*s\n"
 msgstr "Подсказка: %.*s\n"
 
-#: advice.c:85
+# TRANSFER
+#: advice.c:88
 msgid ""
-"Fix them up in the work tree,\n"
-"and then use 'git add/rm <file>' as\n"
-"appropriate to mark resolution and make a commit,\n"
-"or use 'git commit -a'."
+"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 ""
-"Редактирайте ги в работното дърво,\n"
-"и тогава ползвайте „git add/rm <file>“,\n"
-"за да отбележите коригирането им и ги\n"
-"подадете или просто ползвайте „git commit -a“."
-
-#: archive.c:10
-msgid "git archive [options] <tree-ish> [<path>...]"
-msgstr ""
+"Редактирайте ги в работното дърво, и тогава ползвайте „git add/rm ФАЙЛ“\n"
+"за да отбележите коригирането им. След това извършете подаването."
 
 #: archive.c:11
-msgid "git archive --list"
-msgstr ""
+msgid "git archive [options] <tree-ish> [<path>...]"
+msgstr "git archive [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО [ПЪТ…]"
 
 #: archive.c:12
+msgid "git archive --list"
+msgstr "git archive --list"
+
+#: archive.c:13
 msgid ""
 "git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]"
 msgstr ""
+"git archive --remote ХРАНИЛИЩЕ [--exec КОМАНДА] [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО "
+"[ПЪТ…]"
 
-#: archive.c:13
+#: archive.c:14
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr ""
+msgstr "git archive --remote ХРАНИЛИЩЕ [--exec КОМАНДА] --list"
 
-#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
+#: archive.c:334 builtin/add.c:137 builtin/add.c:427 builtin/rm.c:328
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "пътят „%s“ не съвпада с никой файл"
 
-#: archive.c:328
+#: archive.c:419
 msgid "fmt"
-msgstr ""
+msgstr "ФОРМАТ"
 
-#: archive.c:328
+#: archive.c:419
 msgid "archive format"
-msgstr ""
+msgstr "ФОРМАТ на архива"
 
-#: archive.c:329 builtin/log.c:1193
+#: archive.c:420 builtin/log.c:1204
 msgid "prefix"
 msgstr "префикс"
 
-#: archive.c:330
+#: archive.c:421
 msgid "prepend prefix to each pathname in the archive"
-msgstr ""
+msgstr "добавяне на този префикс към всеки път в архива"
 
-#: archive.c:331 builtin/archive.c:88 builtin/blame.c:2258
-#: builtin/blame.c:2259 builtin/config.c:57 builtin/fast-export.c:680
-#: builtin/fast-export.c:682 builtin/grep.c:714 builtin/hash-object.c:77
-#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:412
-#: builtin/notes.c:569 builtin/read-tree.c:108 parse-options.h:151
+#: archive.c:422 builtin/archive.c:88 builtin/blame.c:2517
+#: builtin/blame.c:2518 builtin/config.c:57 builtin/fast-export.c:986
+#: builtin/fast-export.c:988 builtin/grep.c:712 builtin/hash-object.c:101
+#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:411
+#: builtin/notes.c:568 builtin/read-tree.c:109 parse-options.h:151
 msgid "file"
 msgstr "файл"
 
-#: archive.c:332 builtin/archive.c:89
+#: archive.c:423 builtin/archive.c:89
 msgid "write the archive to this file"
-msgstr ""
+msgstr "запазване на архива в този файл"
 
-#: archive.c:334
+#: archive.c:425
 msgid "read .gitattributes in working directory"
-msgstr ""
+msgstr "изчитане на „.gitattributes“ в работната директория"
 
-#: archive.c:335
+#: archive.c:426
 msgid "report archived files on stderr"
-msgstr ""
+msgstr "извеждане на архивираните файлове на стандартната грешка"
 
-#: archive.c:336
+#: archive.c:427
 msgid "store only"
-msgstr ""
+msgstr "само съхранение без компресиране"
 
-#: archive.c:337
+#: archive.c:428
 msgid "compress faster"
-msgstr ""
+msgstr "бързо компресиране"
 
-#: archive.c:345
+#: archive.c:436
 msgid "compress better"
-msgstr ""
+msgstr "добро компресиране"
 
-#: archive.c:348
+#: archive.c:439
 msgid "list supported archive formats"
-msgstr ""
+msgstr "извеждане на списъка с поддържаните формати"
 
-#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:441 builtin/archive.c:90 builtin/clone.c:85
 msgid "repo"
 msgstr "хранилище"
 
-#: archive.c:351 builtin/archive.c:91
+#: archive.c:442 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
-msgstr ""
+msgstr "изтегляне на архива от отдалеченото ХРАНИЛИЩЕ"
 
-#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
+#: archive.c:443 builtin/archive.c:92 builtin/notes.c:490
 msgid "command"
-msgstr ""
+msgstr "команда"
 
-#: archive.c:353 builtin/archive.c:93
+#: archive.c:444 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
-msgstr ""
+msgstr "път към отдалечената команда „git-upload-archive“"
 
-#: attr.c:259
+#: attr.c:258
 msgid ""
 "Negative patterns are ignored in git attributes\n"
 "Use '\\!' for literal leading exclamation."
@@ -286,31 +308,31 @@
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr "Няма следене: двусмислена информация за указателя „%s“"
 
-#: branch.c:178
+#: branch.c:162
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "„%s“ не е позволено име за клон."
 
-#: branch.c:183
+#: branch.c:167
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "Вече съществува клон с име „%s“."
 
-#: branch.c:191
+#: branch.c:175
 msgid "Cannot force update the current branch."
 msgstr "Текущият клон не може да бъде принудително обновен."
 
-#: branch.c:211
+#: branch.c:195
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr "Зададените настройки за следенето са грешни — началото „%s“ не е клон."
 
-#: branch.c:213
+#: branch.c:197
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "заявеният отдалечен клон „%s“ не съществува"
 
-#: branch.c:215
+#: branch.c:199
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -329,113 +351,115 @@
 "може да използвате „git push -u“, за да настроите към кой клон да се "
 "изтласква."
 
-#: branch.c:260
+#: branch.c:243
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "Неправилно име на обект: „%s“"
 
-#: branch.c:280
+#: branch.c:263
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "Двусмислено име на обект: „%s“"
 
-#: branch.c:285
+#: branch.c:268
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "Неправилно място за начало на клон: „%s“"
 
-#: branch.c:291
-msgid "Failed to lock ref for update"
-msgstr "Указателят не може да бъде заключен, за да бъде обновен"
-
-#: branch.c:309
-msgid "Failed to write ref"
-msgstr "Указателят не може да бъде записан"
-
-#: bundle.c:33
+#: bundle.c:34
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
-msgstr "Файлът „%s“ не изглежда да е архив на git версия 2"
+msgstr "Файлът „%s“ не изглежда да е пратка на git версия 2"
 
-#: bundle.c:60
+#: bundle.c:61
 #, c-format
 msgid "unrecognized header: %s%s (%d)"
-msgstr ""
+msgstr "непозната заглавна част: %s%s (%d)"
 
-#: bundle.c:86 builtin/commit.c:706
+#: bundle.c:87 builtin/commit.c:788
 #, c-format
 msgid "could not open '%s'"
 msgstr "„%s“ не може да се отвори"
 
-#: bundle.c:138
+#: bundle.c:139
 msgid "Repository lacks these prerequisite commits:"
-msgstr ""
+msgstr "В хранилището липсват следните необходими подавания:"
 
-#: bundle.c:162 sequencer.c:669 sequencer.c:1123 builtin/log.c:332
-#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357
+#: bundle.c:163 sequencer.c:641 sequencer.c:1096 builtin/blame.c:2706
+#: builtin/branch.c:652 builtin/commit.c:1085 builtin/log.c:330
+#: builtin/log.c:823 builtin/log.c:1432 builtin/log.c:1669 builtin/merge.c:357
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "неуспешно настройване на обхождането на версиите"
 
-#: bundle.c:184
+#: bundle.c:185
 #, c-format
 msgid "The bundle contains this ref:"
 msgid_plural "The bundle contains these %d refs:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Пратката съдържа следния указател:"
+msgstr[1] "Пратката съдържа следните %d указатели:"
 
-#: bundle.c:191
+#: bundle.c:192
 msgid "The bundle records a complete history."
-msgstr ""
+msgstr "Пратката съдържа пълна история."
 
-#: bundle.c:193
+#: bundle.c:194
 #, c-format
 msgid "The bundle requires this ref:"
 msgid_plural "The bundle requires these %d refs:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Пратката изисква следния указател:"
+msgstr[1] "Пратката изисква следните %d указатели:"
 
-#: bundle.c:293
+# FIXME better message
+#: bundle.c:292
 msgid "rev-list died"
-msgstr ""
+msgstr "Командата „git rev-list“ не завърши успешно"
 
-#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:298 builtin/log.c:153 builtin/log.c:1342 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "непознат аргумент: %s"
 
-#: bundle.c:334
+#: bundle.c:333
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr ""
+"указателят „%s“ не е бил включен поради опциите зададени на „git rev-list“"
 
-#: bundle.c:379
+#: bundle.c:378
 msgid "Refusing to create empty bundle."
-msgstr ""
+msgstr "Създаването на празна пратка е невъзможно."
 
-#: bundle.c:395
+#: bundle.c:393
 msgid "Could not spawn pack-objects"
-msgstr ""
+msgstr "Командата „git pack-objects“ не може да бъде стартирана"
 
-#: bundle.c:413
+# FIXME better message
+#: bundle.c:411
 msgid "pack-objects died"
-msgstr ""
+msgstr "Командата „git pack-objects“ не завърши успешно"
 
-#: bundle.c:416
+#: bundle.c:414
 #, c-format
 msgid "cannot create '%s'"
-msgstr ""
+msgstr "Файлът „%s“ не може да бъде създаден"
 
-#: bundle.c:438
+# FIXME better message
+#: bundle.c:435
 msgid "index-pack died"
-msgstr ""
+msgstr "Командата „git index-pack“ не завърши успешно"
 
-#: commit.c:54
+#: color.c:157
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr "неправилна стойност за цвят: %.*s"
+
+#: commit.c:40
 #, c-format
 msgid "could not parse %s"
 msgstr "„%s“ не може да се анализира"
 
-#: commit.c:56
+#: commit.c:42
 #, c-format
 msgid "%s %s is not a commit!"
 msgstr "%s %s не е подаване!"
@@ -444,115 +468,169 @@
 msgid "memory exhausted"
 msgstr "паметта свърши"
 
-#: connected.c:70
+#: config.c:469 config.c:471
+#, c-format
+msgid "bad config file line %d in %s"
+msgstr "неправилен ред %d в „%s“"
+
+#: config.c:587
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr ""
+"неправилна числова стойност „%s“ за настройката „%s“ в раздела „%s“: %s"
+
+#: config.c:589
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "неправилна числова стойност „%s“ за настройката „%s“: %s"
+
+#: config.c:674
+#, c-format
+msgid "failed to expand user dir in: '%s'"
+msgstr "домашната папка на потребителя не може да бъде открита: „%s“"
+
+#: config.c:752 config.c:763
+#, c-format
+msgid "bad zlib compression level %d"
+msgstr "неправилно ниво на компресиране: %d"
+
+#: config.c:885
+#, c-format
+msgid "invalid mode for object creation: %s"
+msgstr "неправилен режим за създаването на обекти: %s"
+
+#: config.c:1201
+msgid "unable to parse command-line config"
+msgstr "неправилни настройки от командния ред"
+
+#: config.c:1262
+msgid "unknown error occured while reading the configuration files"
+msgstr "неочаквана грешка при изчитането на конфигурационните файлове"
+
+#: config.c:1586
+#, c-format
+msgid "unable to parse '%s' from command-line config"
+msgstr "неразпозната стойност „%s“ от командния ред"
+
+#: config.c:1588
+#, c-format
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "неправилна настройка „%s“ във файла „%s“ на ред №%d"
+
+#: config.c:1647
+#, 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:90
+#: connected.c:89
 #, c-format
 msgid "failed write to rev-list: %s"
-msgstr "неуспешен запис в списъка с версиите: %s"
+msgstr "неуспешен запис на списъка с версиите: %s"
 
-#: connected.c:98
+#: connected.c:97
 #, c-format
 msgid "failed to close rev-list's stdin: %s"
 msgstr "стандартният вход на списъка с версиите не може да бъде затворен: %s"
 
 #: date.c:95
 msgid "in the future"
-msgstr ""
+msgstr "в бъдещето"
 
 #: date.c:101
 #, c-format
 msgid "%lu second ago"
 msgid_plural "%lu seconds ago"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "преди %lu секунда"
+msgstr[1] "преди %lu секунди"
 
 #: date.c:108
 #, c-format
 msgid "%lu minute ago"
 msgid_plural "%lu minutes ago"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "преди %lu минута"
+msgstr[1] "преди %lu минути"
 
 #: date.c:115
 #, c-format
 msgid "%lu hour ago"
 msgid_plural "%lu hours ago"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "преди %lu час"
+msgstr[1] "преди %lu часа"
 
 #: date.c:122
 #, c-format
 msgid "%lu day ago"
 msgid_plural "%lu days ago"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "преди %lu ден"
+msgstr[1] "преди %lu дена"
 
 #: date.c:128
 #, c-format
 msgid "%lu week ago"
 msgid_plural "%lu weeks ago"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "преди %lu седмица"
+msgstr[1] "преди %lu седмици"
 
 #: date.c:135
 #, c-format
 msgid "%lu month ago"
 msgid_plural "%lu months ago"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "преди %lu месец"
+msgstr[1] "преди %lu месеца"
 
 #: date.c:146
 #, c-format
 msgid "%lu year"
 msgid_plural "%lu years"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%lu година"
+msgstr[1] "%lu години"
 
 #. TRANSLATORS: "%s" is "<n> years"
 #: date.c:149
 #, c-format
 msgid "%s, %lu month ago"
 msgid_plural "%s, %lu months ago"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "преди %s и %lu месец"
+msgstr[1] "преди %s и %lu месеца"
 
 #: date.c:154 date.c:159
 #, c-format
 msgid "%lu year ago"
 msgid_plural "%lu years ago"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "преди %lu година"
+msgstr[1] "преди %lu години"
 
 #: diffcore-order.c:24
 #, c-format
 msgid "failed to read orderfile '%s'"
 msgstr "файлът с подредбата на съответствията „%s“ не може да бъде прочетен"
 
-#: diffcore-rename.c:517
+#: diffcore-rename.c:516
 msgid "Performing inexact rename detection"
 msgstr "Търсене на преименувания на обекти съчетани с промени"
 
-#: diff.c:113
+#: diff.c:114
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr ""
 "  Неуспешно разпознаване на „%s“ като процент-праг за статистиката по "
 "директории\n"
 
-#: diff.c:118
+#: diff.c:119
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Непознат параметър „%s“ за статистиката по директории'\n"
 
-#: diff.c:213
+#: diff.c:214
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "Непозната стойност „%s“ за настройката „diff.submodule“"
 
-#: diff.c:263
+#: diff.c:266
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -561,7 +639,17 @@
 "Грешки в настройката „diff.dirstat“:\n"
 "%s"
 
-#: diff.c:3495
+#: diff.c:2957
+#, c-format
+msgid "external diff died, stopping at %s"
+msgstr ""
+"външната програма за разлики завърши неуспешно. Спиране на работата при „%s“"
+
+#: diff.c:3352
+msgid "--follow requires exactly one pathspec"
+msgstr "Опцията „--follow“ изисква точно един път"
+
+#: diff.c:3515
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -570,58 +658,58 @@
 "Неразпознат параметър към опцията „--dirstat/-X“:\n"
 "%s"
 
-#: diff.c:3509
+#: diff.c:3529
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Неразпознат параметър към опцията „--submodule“: „%s“"
 
-#: gpg-interface.c:59 gpg-interface.c:131
+#: gpg-interface.c:129 gpg-interface.c:200
 msgid "could not run gpg."
 msgstr "Програмата „gpg“ не може да бъде стартирана."
 
-#: gpg-interface.c:71
+#: gpg-interface.c:141
 msgid "gpg did not accept the data"
 msgstr "Програмата „gpg“ не прие подадените данни."
 
-#: gpg-interface.c:82
+#: gpg-interface.c:152
 msgid "gpg failed to sign the data"
 msgstr "Програмата „gpg“ не подписа данните."
 
-#: gpg-interface.c:115
+#: gpg-interface.c:185
 #, c-format
 msgid "could not create temporary file '%s': %s"
 msgstr "Програмата „gpg“ не успя да създаде временния файл „%s“: %s"
 
-#: gpg-interface.c:118
+#: gpg-interface.c:188
 #, c-format
 msgid "failed writing detached signature to '%s': %s"
 msgstr "Програмата „gpg“ не успя да запише самостоятелния подпис към „%s“: %s"
 
-#: grep.c:1698
+#: grep.c:1718
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "„%s“: файлът сочен от „%s“ не може да бъде прочетен"
 
-#: grep.c:1715
+#: grep.c:1735
 #, c-format
 msgid "'%s': %s"
 msgstr "„%s“: „%s“"
 
-#: grep.c:1726
+#: grep.c:1746
 #, c-format
 msgid "'%s': short read %s"
 msgstr "„%s“: изчитането на „%s“ върна по-малко байтове от заявените"
 
-#: help.c:209
+#: help.c:207
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "налични команди на git от „%s“"
 
-#: help.c:216
+#: help.c:214
 msgid "git commands available from elsewhere on your $PATH"
-msgstr "команди на git от други директории от пътя „$PATH“"
+msgstr "команди на git от други директории от „$PATH“"
 
-#: help.c:232
+#: help.c:230
 msgid "The most commonly used git commands are:"
 msgstr "Най-често употребяваните команди на git са:"
 
@@ -660,7 +748,7 @@
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git: „%s“ не е команда на git. Вижте изхода от „git --help“."
 
-#: help.c:384 help.c:443
+#: help.c:384 help.c:444
 msgid ""
 "\n"
 "Did you mean this?"
@@ -674,275 +762,301 @@
 "\n"
 "Команди с подобно име са:"
 
-#: help.c:439
+#: help.c:440
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %s — %s"
 
-#: merge.c:56
-msgid "failed to read the cache"
-msgstr ""
+#: lockfile.c:275
+msgid "BUG: reopen a lockfile that is still open"
+msgstr "ГРЕШКА В GIT: преотваряне на файл-ключалка"
 
-#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
-#: builtin/clone.c:661
+#: lockfile.c:277
+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:356 builtin/checkout.c:562
+#: builtin/clone.c:659
 msgid "unable to write new index file"
 msgstr "неуспешно записване на новия индекс"
 
-#: merge-recursive.c:190
+#: merge-recursive.c:189
 #, c-format
 msgid "(bad commit)\n"
-msgstr ""
+msgstr "(лошо подаване)\n"
 
-#: merge-recursive.c:208
+#: merge-recursive.c:209
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
-msgstr ""
+msgstr "неуспешно изпълнение на „addinfo_cache“ за пътя „%s“"
 
-#: merge-recursive.c:271
+#: merge-recursive.c:270
 msgid "error building trees"
-msgstr ""
+msgstr "грешка при изграждане на дърветата"
 
-#: merge-recursive.c:675
+#: merge-recursive.c:691
 #, c-format
 msgid "failed to create path '%s'%s"
-msgstr ""
+msgstr "грешка при създаването на пътя „%s“%s"
 
-#: merge-recursive.c:686
+#: merge-recursive.c:702
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
-msgstr ""
+msgstr "Изтриване на „%s“, за да се освободи място за поддиректория\n"
 
-#: merge-recursive.c:700 merge-recursive.c:721
+# FIXME better message
+#: merge-recursive.c:716 merge-recursive.c:737
 msgid ": perhaps a D/F conflict?"
-msgstr ""
+msgstr ": възможно е да има конфликт директория/файл."
 
-#: merge-recursive.c:711
+#: merge-recursive.c:727
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr ""
+"преустановяване на действието, за да не се изтрие неследеният файл „%s“"
 
-#: merge-recursive.c:751
+#: merge-recursive.c:767
 #, c-format
 msgid "cannot read object %s '%s'"
-msgstr ""
+msgstr "обектът „%s“ (%s) не може да бъде прочетен"
 
-#: merge-recursive.c:753
+#: merge-recursive.c:769
 #, c-format
 msgid "blob expected for %s '%s'"
-msgstr ""
+msgstr "обектът „%s“ (%s) се очакваше да е BLOB, а не е"
 
-#: merge-recursive.c:776 builtin/clone.c:317
+#: merge-recursive.c:792 builtin/clone.c:318
 #, c-format
 msgid "failed to open '%s'"
 msgstr "директорията „%s“ не може да бъде отворена"
 
-#: merge-recursive.c:784
+#: merge-recursive.c:800
 #, c-format
 msgid "failed to symlink '%s'"
-msgstr ""
+msgstr "неуспешно създаване на символната връзка „%s“"
 
-#: merge-recursive.c:787
+#: merge-recursive.c:803
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr ""
+"не е ясно какво да се прави с обекта „%2$s“ (%3$s) с права за достъп „%1$06o“"
 
-#: merge-recursive.c:925
+#: merge-recursive.c:941
 msgid "Failed to execute internal merge"
-msgstr ""
-
-#: merge-recursive.c:929
-#, c-format
-msgid "Unable to add %s to database"
-msgstr ""
+msgstr "Неуспешно вътрешно сливане"
 
 #: merge-recursive.c:945
-msgid "unsupported object type in the tree"
-msgstr ""
+#, c-format
+msgid "Unable to add %s to database"
+msgstr "„%s“ не може да се добави в базата с данни"
 
-#: merge-recursive.c:1024 merge-recursive.c:1038
+#: merge-recursive.c:961
+msgid "unsupported object type in the tree"
+msgstr "в дървото има неподдържан вид обект"
+
+#: merge-recursive.c:1036 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."
 msgstr ""
+"КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s. Версия %s на „%s“ "
+"е оставена в дървото."
 
-#: merge-recursive.c:1030 merge-recursive.c:1043
+#: merge-recursive.c:1042 merge-recursive.c:1055
 #, 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:1084
+#: merge-recursive.c:1096
 msgid "rename"
-msgstr ""
+msgstr "преименуване"
 
-#: merge-recursive.c:1084
+#: merge-recursive.c:1096
 msgid "renamed"
 msgstr "преименуван"
 
-#: merge-recursive.c:1140
+#: merge-recursive.c:1152
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
-msgstr ""
+msgstr "„%s“ е директория в „%s“, затова се добавя като „%s“"
 
-#: merge-recursive.c:1162
+#: merge-recursive.c:1174
 #, 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:1167
+#: merge-recursive.c:1179
 msgid " (left unresolved)"
-msgstr ""
+msgstr " (некоригиран конфликт)"
 
-#: merge-recursive.c:1221
+#: merge-recursive.c:1233
 #, 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:1251
+#: merge-recursive.c:1263
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
-msgstr ""
+msgstr "Преименуване на „%s“ на „%s“, а „%s“ на „%s“"
 
-#: merge-recursive.c:1450
+#: merge-recursive.c:1462
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
+"КОНФЛИКТ (преименуване/добавяне): „%s“ е преименуван на „%s“ в клон „%s“, а "
+"„%s“ е добавен в „%s“"
 
-#: merge-recursive.c:1460
+#: merge-recursive.c:1472
 #, c-format
 msgid "Adding merged %s"
-msgstr ""
+msgstr "Добавяне на слетия „%s“"
 
-#: merge-recursive.c:1465 merge-recursive.c:1663
+#: merge-recursive.c:1477 merge-recursive.c:1675
 #, c-format
 msgid "Adding as %s instead"
-msgstr ""
+msgstr "Добавяне като „%s“"
 
-#: merge-recursive.c:1516
+#: merge-recursive.c:1528
 #, c-format
 msgid "cannot read object %s"
-msgstr ""
+msgstr "обектът „%s“ не може да се прочете"
 
-#: merge-recursive.c:1519
+#: merge-recursive.c:1531
 #, c-format
 msgid "object %s is not a blob"
-msgstr ""
+msgstr "обектът „%s“ не е BLOB"
 
-#: merge-recursive.c:1567
+#: merge-recursive.c:1579
 msgid "modify"
-msgstr ""
+msgstr "промяна"
 
-#: merge-recursive.c:1567
+#: merge-recursive.c:1579
 msgid "modified"
 msgstr "променен"
 
-#: merge-recursive.c:1577
+#: merge-recursive.c:1589
 msgid "content"
-msgstr ""
+msgstr "съдържание"
 
-#: merge-recursive.c:1584
+#: merge-recursive.c:1596
 msgid "add/add"
-msgstr ""
+msgstr "добавяне/добавяне"
 
-#: merge-recursive.c:1618
+#: merge-recursive.c:1630
 #, c-format
 msgid "Skipped %s (merged same as existing)"
-msgstr ""
+msgstr "Прескачане на „%s“ (слетият резултат е идентичен със сегашния)"
 
-#: merge-recursive.c:1632
+#: merge-recursive.c:1644
 #, c-format
 msgid "Auto-merging %s"
-msgstr ""
+msgstr "Автоматично сливане на „%s“"
 
-#: merge-recursive.c:1636 git-submodule.sh:1149
+#: merge-recursive.c:1648 git-submodule.sh:1150
 msgid "submodule"
 msgstr "ПОДМОДУЛ"
 
-#: merge-recursive.c:1637
+#: merge-recursive.c:1649
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr ""
+msgstr "КОНФЛИКТ (%s): Конфликт при сливане на „%s“"
 
-#: merge-recursive.c:1727
+#: merge-recursive.c:1735
 #, c-format
 msgid "Removing %s"
 msgstr "Изтриване на „%s“"
 
-#: merge-recursive.c:1752
+#: merge-recursive.c:1760
 msgid "file/directory"
-msgstr ""
+msgstr "файл/директория"
 
-#: merge-recursive.c:1758
+#: merge-recursive.c:1766
 msgid "directory/file"
-msgstr ""
+msgstr "директория/файл"
 
-#: merge-recursive.c:1763
+#: merge-recursive.c:1771
 #, 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:1773
+#: merge-recursive.c:1781
 #, c-format
 msgid "Adding %s"
-msgstr ""
+msgstr "Добавяне на „%s“"
 
-#: merge-recursive.c:1790
+#: merge-recursive.c:1798
 msgid "Fatal merge failure, shouldn't happen."
-msgstr ""
+msgstr "Фатална грешка при сливане, а такава не трябва да възниква!"
 
-#: merge-recursive.c:1809
+#: merge-recursive.c:1817
 msgid "Already up-to-date!"
-msgstr ""
+msgstr "Вече е обновено!"
 
-#: merge-recursive.c:1818
+#: merge-recursive.c:1826
 #, c-format
 msgid "merging of trees %s and %s failed"
-msgstr ""
+msgstr "неуспешно сливане на дърветата „%s“ и „%s“"
 
-#: merge-recursive.c:1848
+# FIXME message
+#: merge-recursive.c:1856
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr ""
+"Пътят „%s“ не е обработен, това е грешка в Git, докладвайте я на "
+"разработчиците, като пратите е-писмо на адрес: „git@vger.kernel.org“."
 
-#: merge-recursive.c:1893
+#: merge-recursive.c:1901
 msgid "Merging:"
-msgstr ""
+msgstr "Сливане:"
 
-#: merge-recursive.c:1906
+#: merge-recursive.c:1914
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "открит е %u общ предшественик:"
+msgstr[1] "открити са %u общи предшественици:"
 
-#: merge-recursive.c:1943
+#: merge-recursive.c:1951
 msgid "merge returned no commit"
-msgstr ""
+msgstr "сливането не върна подаване"
 
-#: merge-recursive.c:2000
+#: merge-recursive.c:2008
 #, c-format
 msgid "Could not parse object '%s'"
-msgstr ""
+msgstr "Неуспешен анализ на обекта „%s“"
 
-#: merge-recursive.c:2012 builtin/merge.c:668
+#: merge-recursive.c:2019 builtin/merge.c:666
 msgid "Unable to write index."
-msgstr ""
+msgstr "Индексът не може да бъде прочетен"
 
-#: notes-utils.c:40
+#: notes-utils.c:41
 msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr ""
 "Неинициализирано или нереферирано дърво за бележки не може да бъде подадено"
 
-#: notes-utils.c:81
+#: notes-utils.c:83
 #, c-format
 msgid "Bad notes.rewriteMode value: '%s'"
-msgstr "Лоша стойност за „notes.rewriteMode“: „%s“"
+msgstr "Неправилна стойност за „notes.rewriteMode“: „%s“"
 
-#: notes-utils.c:91
+#: notes-utils.c:93
 #, c-format
 msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
 msgstr ""
@@ -950,106 +1064,114 @@
 
 #. TRANSLATORS: The first %s is the name of the
 #. environment variable, the second %s is its value
-#: notes-utils.c:118
+#: notes-utils.c:120
 #, c-format
 msgid "Bad %s value: '%s'"
 msgstr "Зададена е лоша стойност на променливата „%s“: „%s“"
 
-#: object.c:229
+#: object.c:241
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "обектът „%s“ не може да бъде анализиран"
 
-#: parse-options.c:532
+#: parse-options.c:546
 msgid "..."
 msgstr "…"
 
-#: parse-options.c:550
+#: parse-options.c:564
 #, c-format
 msgid "usage: %s"
 msgstr "употреба: %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:554
+#: parse-options.c:568
 #, c-format
 msgid "   or: %s"
 msgstr "     или: %s"
 
-#: parse-options.c:557
+#: parse-options.c:571
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:591
+#: parse-options.c:605
 msgid "-NUM"
 msgstr "-ЧИСЛО"
 
 #: pathspec.c:133
 msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr ""
+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 ""
+msgstr "неправилен параметър за опцията за магически пътища „prefix“"
 
 #: pathspec.c:183
 #, c-format
 msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr ""
+msgstr "Неправилна стойност за опцията за магически пътища „%.*s“ в „%s“"
 
 #: pathspec.c:187
 #, c-format
 msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr ""
+msgstr "Знакът „)“ липсва в опцията за магически пътища в „%s“"
 
 #: pathspec.c:205
 #, c-format
 msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr ""
+msgstr "Магическите пътища „%c“ са без реализация за „%s“"
 
 #: pathspec.c:230
 #, c-format
 msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr ""
+msgstr "%s: опциите „literal“ и „glob“ са несъвместими"
 
 #: pathspec.c:241
 #, c-format
 msgid "%s: '%s' is outside repository"
-msgstr ""
+msgstr "%s: „%s“ е извън хранилището"
 
 #: pathspec.c:291
 #, c-format
 msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr ""
+msgstr "Пътят „%s“ е в подмодула „%.*s“"
 
 #: pathspec.c:353
 #, c-format
 msgid "%s: pathspec magic not supported by this command: %s"
-msgstr ""
+msgstr "%s: магическите пътища не се поддържат от командата „%s“"
 
-#: pathspec.c:433
+#: pathspec.c:432
 #, c-format
 msgid "pathspec '%s' is beyond a symbolic link"
-msgstr ""
+msgstr "пътят „%s“ е след символна връзка"
 
-#: pathspec.c:442
+#: pathspec.c:441
 msgid ""
 "There is nothing to exclude from by :(exclude) patterns.\n"
 "Perhaps you forgot to add either ':/' or '.' ?"
 msgstr ""
+"Нищо не се изключва от шаблоните за изключване.\n"
+"Това често се случва, ако сте забравили да добавите „:/“ или „.“."
 
-#: progress.c:224
+#: pretty.c:968
+msgid "unable to parse --pretty format"
+msgstr "аргументът към опцията „--pretty“ не може да се анализира"
+
+#: progress.c:225
 msgid "done"
 msgstr "действието завърши"
 
-#: read-cache.c:1238
+#: read-cache.c:1261
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -1058,7 +1180,7 @@
 "Зададена е неправилна стойност на настройката „index.version“.\n"
 "Ще се ползва версия %i"
 
-#: read-cache.c:1248
+#: read-cache.c:1271
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -1068,51 +1190,51 @@
 "„GIT_INDEX_VERSION“.\n"
 "Ще се ползва версия %i"
 
-#: remote.c:758
+#: remote.c:782
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "Невъзможно е да се доставят едновременно и „%s“, и „%s“ към „%s“"
 
-#: remote.c:762
+#: remote.c:786
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "„%s“ обикновено следи „%s“, а не „%s“"
 
-#: remote.c:766
+#: remote.c:790
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "„%s“ следи както „%s“, така и „%s“"
 
-#: remote.c:774
+#: remote.c:798
 msgid "Internal error"
 msgstr "Вътрешна грешка"
 
-#: remote.c:1948
+#: remote.c:1968
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "Този клон следи „%s“, но следеният клон е изтрит.\n"
 
-#: remote.c:1952
+#: remote.c:1972
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (за да коригирате това, използвайте „git branch --unset-upstream“)\n"
 
-#: remote.c:1955
+#: remote.c:1975
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "Клонът е актуализиран както „%s“.\n"
+msgstr "Клонът е актуализиран към „%s“.\n"
 
-#: remote.c:1959
+#: remote.c:1979
 #, 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:1965
+#: remote.c:1985
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (публикувайте локалните си промени чрез „git push“)\n"
 
-#: remote.c:1968
+#: remote.c:1988
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1122,11 +1244,11 @@
 msgstr[1] ""
 "Клонът ви е с %2$d подавания след „%1$s“ и може да бъде тривиално слят.\n"
 
-#: remote.c:1976
+#: remote.c:1996
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (обновете локалния си клон чрез „git pull“)\n"
 
-#: remote.c:1979
+#: remote.c:1999
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1141,262 +1263,285 @@
 "Текущият клон се е отделил от „%s“,\n"
 "двата имат съответно по %d и %d несъвпадащи подавания.\n"
 
-#: remote.c:1989
+#: remote.c:2009
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr "  (слейте отдалечения клон в локалния чрез „git pull“)\n"
 
-#: run-command.c:80
+#: run-command.c:87
 msgid "open /dev/null failed"
 msgstr "неуспешно отваряне на „/dev/null“"
 
-#: run-command.c:82
+#: run-command.c:89
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "неуспешно изпълнение на dup2(%d,%d)"
 
-#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
-#: builtin/merge.c:1009 builtin/merge.c:1019
+#: send-pack.c:265
+msgid "failed to sign the push certificate"
+msgstr "сертификатът за изтласкване не може да бъде подписан"
+
+#: send-pack.c:322
+msgid "the receiving end does not support --signed push"
+msgstr "отсрещната страна не поддържа изтласкване с опцията „--signed“"
+
+#: sequencer.c:172 builtin/merge.c:781 builtin/merge.c:892
+#: builtin/merge.c:1002 builtin/merge.c:1012
 #, c-format
 msgid "Could not open '%s' for writing"
-msgstr ""
+msgstr "„%s“ не може да бъде отворен за запис"
 
-#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
-#: builtin/merge.c:1011 builtin/merge.c:1024
+#: sequencer.c:174 builtin/merge.c:343 builtin/merge.c:784
+#: builtin/merge.c:1004 builtin/merge.c:1017
 #, c-format
 msgid "Could not write to '%s'"
-msgstr ""
+msgstr "„%s“ не може да бъде записан"
 
-#: sequencer.c:229
+# FIXME git add <path…> for consistence
+#: sequencer.c:195
 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:232
+#: sequencer.c:198
 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:245 sequencer.c:879 sequencer.c:962
+# FIXME - must be the same as Could not write to '%s' above
+#: sequencer.c:211 sequencer.c:852 sequencer.c:935
 #, c-format
 msgid "Could not write to %s"
-msgstr ""
+msgstr "„%s“ не може да бъде записан"
 
-#: sequencer.c:248
+# FIXME wrap up as ffinishing the work on, in fact, full stop at end for consistency with below
+#: sequencer.c:214
 #, c-format
 msgid "Error wrapping up %s"
-msgstr ""
+msgstr "Обработката на „%s“ не завърши успешно."
 
-#: sequencer.c:263
+#: sequencer.c:229
 msgid "Your local changes would be overwritten by cherry-pick."
-msgstr ""
+msgstr "Локалните ви промени ще бъдат презаписани при отбирането на подавания."
 
-#: sequencer.c:265
+#: sequencer.c:231
 msgid "Your local changes would be overwritten by revert."
-msgstr ""
+msgstr "Локалните ви промени ще бъдат презаписани при отмяната на подавания."
 
-#: sequencer.c:268
+#: sequencer.c:234
 msgid "Commit your changes or stash them to proceed."
-msgstr ""
+msgstr "Подайте или скатайте промените, за да продължите"
 
 #. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:325
+#: sequencer.c:304
 #, c-format
 msgid "%s: Unable to write new index file"
 msgstr "%s: новият индекс не може да бъде запазен"
 
-#: sequencer.c:356
+#: sequencer.c:335
 msgid "Could not resolve HEAD commit\n"
-msgstr ""
+msgstr "Подаването сочено от указателя „HEAD“ не може да бъде открито\n"
 
-#: sequencer.c:378
+#: sequencer.c:355
 msgid "Unable to update cache tree\n"
-msgstr ""
+msgstr "Дървото на кеша не може да бъде обновено\n"
 
-#: sequencer.c:430
+#: sequencer.c:402
 #, c-format
 msgid "Could not parse commit %s\n"
-msgstr ""
+msgstr "Подаването „%s“ не може да бъде анализирано\n"
 
-#: sequencer.c:435
+#: sequencer.c:407
 #, c-format
 msgid "Could not parse parent commit %s\n"
-msgstr ""
+msgstr "Родителското подаване „%s“ не може да бъде анализирано\n"
 
-#: sequencer.c:501
+#: sequencer.c:473
 msgid "Your index file is unmerged."
 msgstr "Индексът не е слят."
 
-#: sequencer.c:520
+#: sequencer.c:492
 #, c-format
 msgid "Commit %s is a merge but no -m option was given."
-msgstr ""
+msgstr "Подаването „%s“ е сливане, но не е дадена опцията „-m“"
 
-#: sequencer.c:528
+#: sequencer.c:500
 #, c-format
 msgid "Commit %s does not have parent %d"
-msgstr ""
+msgstr "Подаването „%s“ няма родител %d"
 
-#: sequencer.c:532
+#: sequencer.c:504
 #, c-format
 msgid "Mainline was specified but commit %s is not a merge."
-msgstr ""
+msgstr "Указано е базово подаване, но подаването „%s“ не е сливане."
 
 #. TRANSLATORS: The first %s will be "revert" or
 #. "cherry-pick", the second %s a SHA1
-#: sequencer.c:545
+#: sequencer.c:517
 #, c-format
 msgid "%s: cannot parse parent commit %s"
-msgstr ""
+msgstr "%s: неразпозната стойност за родителското подаване „%s“"
 
-#: sequencer.c:549
+#: sequencer.c:521
 #, c-format
 msgid "Cannot get commit message for %s"
-msgstr ""
+msgstr "Неуспешно извличане на съобщението за подаване на „%s“"
 
-#: sequencer.c:635
+#: sequencer.c:607
 #, c-format
 msgid "could not revert %s... %s"
-msgstr ""
+msgstr "подаването „%s“… не може да бъде отменено: „%s“"
 
-#: sequencer.c:636
+#: sequencer.c:608
 #, c-format
 msgid "could not apply %s... %s"
-msgstr ""
+msgstr "подаването „%s“… не може да бъде приложено: „%s“"
 
-#: sequencer.c:672
+#: sequencer.c:644
 msgid "empty commit set passed"
-msgstr ""
+msgstr "зададено е празно множество от подавания"
 
-#: sequencer.c:680
+#: sequencer.c:652
 #, c-format
 msgid "git %s: failed to read the index"
-msgstr ""
+msgstr "git %s: неуспешно изчитане на индекса"
 
-#: sequencer.c:685
+#: sequencer.c:656
 #, c-format
 msgid "git %s: failed to refresh the index"
-msgstr ""
+msgstr "git %s: неуспешно обновяване на индекса"
 
-#: sequencer.c:743
+#: sequencer.c:716
 #, c-format
 msgid "Cannot %s during a %s"
-msgstr ""
+msgstr "По време на „%1$s“ не може да се извърши „%2$s“"
 
-#: sequencer.c:765
+#: sequencer.c:738
 #, c-format
 msgid "Could not parse line %d."
-msgstr ""
+msgstr "%d-ят ред не може да се анализира."
 
-#: sequencer.c:770
+#: sequencer.c:743
 msgid "No commits parsed."
-msgstr ""
+msgstr "Никое от подаванията не може да се разпознае."
 
-#: sequencer.c:783
+# FIXME Could not open %s. - full stop for consistence with next message
+#: sequencer.c:756
 #, c-format
 msgid "Could not open %s"
-msgstr ""
+msgstr "„%s“ не може да се прочете."
 
-#: sequencer.c:787
+#: sequencer.c:760
 #, c-format
 msgid "Could not read %s."
-msgstr ""
+msgstr "„%s“ не може да се отвори."
 
-#: sequencer.c:794
+#: sequencer.c:767
 #, c-format
 msgid "Unusable instruction sheet: %s"
-msgstr ""
+msgstr "Файлът с описание на предстоящите действия — „%s“ не може да се ползва"
 
-#: sequencer.c:824
+#: sequencer.c:797
 #, c-format
 msgid "Invalid key: %s"
-msgstr ""
+msgstr "Неправилен ключ: „%s“"
 
-#: sequencer.c:827
+#: sequencer.c:800
 #, c-format
 msgid "Invalid value for %s: %s"
-msgstr ""
+msgstr "Неправилна стойност за „%s“: „%s“"
 
-#: sequencer.c:839
+#: sequencer.c:812
 #, c-format
 msgid "Malformed options sheet: %s"
-msgstr ""
+msgstr "Неправилно съдържание на файла с опции: „%s“"
 
-#: sequencer.c:860
+#: sequencer.c:833
 msgid "a cherry-pick or revert is already in progress"
 msgstr ""
+"в момента вече се извършва отбиране на подавания или пребазиране на клона"
 
-#: sequencer.c:861
+#: sequencer.c:834
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr ""
+msgstr "използвайте „git cherry-pick (--continue | --quit | --abort)“"
 
-#: sequencer.c:865
+#: sequencer.c:838
 #, c-format
 msgid "Could not create sequencer directory %s"
-msgstr ""
+msgstr "Директорията за секвенсора „%s“ не може да бъде създадена"
 
-#: sequencer.c:881 sequencer.c:966
+#: sequencer.c:854 sequencer.c:939
 #, c-format
 msgid "Error wrapping up %s."
-msgstr ""
+msgstr "Обработката на „%s“ не завърши успешно."
 
-#: sequencer.c:900 sequencer.c:1036
+#: sequencer.c:873 sequencer.c:1009
 msgid "no cherry-pick or revert in progress"
 msgstr ""
+"в момента не се извършва отбиране на подавания или пребазиране на клона"
 
-#: sequencer.c:902
+#: sequencer.c:875
 msgid "cannot resolve HEAD"
-msgstr ""
+msgstr "Подаването сочено от указателя „HEAD“ не може да бъде открито"
 
-#: sequencer.c:904
+#: sequencer.c:877
 msgid "cannot abort from a branch yet to be born"
 msgstr ""
+"действието не може да бъде преустановено, когато сте на клон, който тепърва "
+"предстои да бъде създаден"
 
-#: sequencer.c:926 builtin/apply.c:4061
+#: sequencer.c:899 builtin/apply.c:4128
 #, c-format
 msgid "cannot open %s: %s"
-msgstr ""
+msgstr "файлът „%s“ не може да бъде отворен: %s"
 
-#: sequencer.c:929
+#: sequencer.c:902
 #, c-format
 msgid "cannot read %s: %s"
-msgstr ""
+msgstr "файлът „%s“ не може да бъде прочетен: %s"
 
-#: sequencer.c:930
+#: sequencer.c:903
 msgid "unexpected end of file"
-msgstr ""
+msgstr "неочакван край на файл"
 
-#: sequencer.c:936
+#: sequencer.c:909
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr ""
+"запазеният преди започването на отбирането файл за указателя „HEAD“ — „%s“ е "
+"повреден"
 
-#: sequencer.c:959
+#: sequencer.c:932
 #, c-format
 msgid "Could not format %s."
-msgstr ""
+msgstr "Файлът „%s“ не може да се форматира по подходящия начин."
 
-#: sequencer.c:1104
+#: sequencer.c:1077
 #, c-format
 msgid "%s: can't cherry-pick a %s"
-msgstr ""
+msgstr "%s: не може да се отбере „%s“"
 
-#: sequencer.c:1107
+#: sequencer.c:1080
 #, c-format
 msgid "%s: bad revision"
-msgstr ""
+msgstr "%s: неправилна версия"
 
-#: sequencer.c:1141
+#: sequencer.c:1114
 msgid "Can't revert as initial commit"
-msgstr ""
+msgstr "Първоначалното подаване не може да бъде отменено"
 
-#: sequencer.c:1142
+#: sequencer.c:1115
 msgid "Can't cherry-pick into empty head"
-msgstr ""
+msgstr "При празен връх не могат да се отбират подавания"
 
-#: sha1_name.c:439
+#: sha1_name.c:440
 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"
@@ -1408,34 +1553,33 @@
 "examine these refs and maybe delete them. Turn this message off by\n"
 "running \"git config advice.objectNameWarning false\""
 msgstr ""
-"При нормална работа git никога не създава указатели, които завършват с 40\n"
-"шестнасетични знаци, защото те ще бъдат прескачани, когато указвате \n"
-"шестнайсетични знаци. Една възможност е такива указатели да са създадени\n"
-"по погрешка. Например:\n"
+"При нормална работа Git никога не създава указатели, които завършват с 40\n"
+"шестнадесетични знака, защото стандартно те ще бъдат прескачани.\n"
+"Възможно е такива указатели да са създадени случайно. Например:\n"
 "\n"
 "  git checkout -b $BRANCH $(git rev-parse…)\n"
 "\n"
 "където стойността на променливата на средата BRANCH е празна, при което се\n"
 "създава подобен указател. Прегледайте тези указатели и ги изтрийте. Можете "
 "да\n"
-"спрете това съобщение като изпълнете „git config advice.objectNameWarning "
-"false“"
+"спрете това съобщение като изпълните командата:\n"
+"„git config advice.objectNameWarning false“"
 
-#: sha1_name.c:1072
+#: sha1_name.c:1068
 msgid "HEAD does not point to a branch"
 msgstr "Указателят „HEAD“ не сочи към клон"
 
-#: sha1_name.c:1075
+#: sha1_name.c:1071
 #, c-format
 msgid "No such branch: '%s'"
 msgstr "Не съществува клон на име „%s“"
 
-#: sha1_name.c:1077
+#: sha1_name.c:1073
 #, c-format
 msgid "No upstream configured for branch '%s'"
 msgstr "Не е зададен клон-източник за клона „%s“"
 
-#: sha1_name.c:1081
+#: sha1_name.c:1077
 #, c-format
 msgid "Upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "Клонът-източник „%s“ не е съхранен като следящ клон"
@@ -1463,70 +1607,99 @@
 
 #: submodule.c:120
 msgid "staging updated .gitmodules failed"
-msgstr "неуспешно добавяне в индекса на променения файл „.gitmodules“"
+msgstr "неуспешно добавяне на променения файл „.gitmodules“ в индекса"
 
-#: submodule.c:1121 builtin/init-db.c:363
+#: submodule.c:1111 builtin/init-db.c:363
 #, c-format
 msgid "Could not create git link %s"
 msgstr "Връзката в Git „%s“ не може да бъде създадена"
 
-#: submodule.c:1132
+#: submodule.c:1122
 #, c-format
 msgid "Could not set core.worktree in %s"
-msgstr "В „%s“ не може да се зададе настройката „core.worktree“"
+msgstr "Настройката „core.worktree“ не може да се зададе в „%s“"
 
-#: unpack-trees.c:206
+#: trailer.c:500 trailer.c:504 trailer.c:508 trailer.c:562 trailer.c:566
+#: trailer.c:570
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "неправилна стойност „%s“ за настройката „%s“"
+
+#: trailer.c:552 trailer.c:557 builtin/remote.c:288
+#, c-format
+msgid "more than one %s"
+msgstr "стойността „%s“ се повтаря в настройките"
+
+#: trailer.c:587
+#, c-format
+msgid "empty trailer token in trailer '%s'"
+msgstr "празна завършваща лексема в епилога „%s“"
+
+#: trailer.c:706
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "входният файл „%s“ не може да бъде прочетен"
+
+#: trailer.c:709
+msgid "could not read from stdin"
+msgstr "от стандартния вход не може да се чете"
+
+#: unpack-trees.c:202
 msgid "Checking out files"
 msgstr "Изтегляне на файлове"
 
 #: urlmatch.c:120
 msgid "invalid URL scheme name or missing '://' suffix"
-msgstr ""
+msgstr "неправилна схема за адрес или суфиксът „://“ липсва"
 
 #: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
 #, c-format
 msgid "invalid %XX escape sequence"
-msgstr ""
+msgstr "неправилна екранираща последователност „%XX“"
 
 #: urlmatch.c:172
 msgid "missing host and scheme is not 'file:'"
-msgstr ""
+msgstr "не е указана машина, а схемата не е „file:“"
 
 #: urlmatch.c:189
 msgid "a 'file:' URL may not have a port number"
-msgstr ""
+msgstr "при схема „file:“ не можете да указвате номер на порт"
 
 #: urlmatch.c:199
 msgid "invalid characters in host name"
-msgstr ""
+msgstr "неправилни знаци в името на машина"
 
 #: urlmatch.c:244 urlmatch.c:255
 msgid "invalid port number"
-msgstr ""
+msgstr "неправилен номер на порт"
 
 #: urlmatch.c:322
 msgid "invalid '..' path segment"
-msgstr ""
+msgstr "неправилна част от пътя „..“"
 
-#: wrapper.c:422
+#: wrapper.c:509
 #, c-format
 msgid "unable to access '%s': %s"
 msgstr "няма достъп до „%s“: %s"
 
-#: wrapper.c:443
+#: wrapper.c:530
 #, c-format
 msgid "unable to access '%s'"
 msgstr "няма достъп до „%s“"
 
-#: wrapper.c:454
+#: wrapper.c:541
 #, c-format
 msgid "unable to look up current user in the passwd file: %s"
 msgstr "текущият потребител не може да бъде открит във файла „/etc/passwd“: %s"
 
-#: wrapper.c:455
+#: wrapper.c:542
 msgid "no such user"
 msgstr "такъв потребител не съществува"
 
+#: wrapper.c:550
+msgid "unable to get current working directory"
+msgstr "текущата работна директория е недостъпна"
+
 #: wt-status.c:150
 msgid "Unmerged paths:"
 msgstr "Неслети пътища:"
@@ -1612,7 +1785,7 @@
 
 #: wt-status.c:260
 msgid "deleted by us:"
-msgstr "изтрити от нас:"
+msgstr "изтрити от вас:"
 
 #: wt-status.c:262
 msgid "both added:"
@@ -1676,15 +1849,15 @@
 msgid "bug: unhandled diff status %c"
 msgstr "грешка: състоянието на промяната „%c“ не може да бъде обработено"
 
-#: wt-status.c:765
+#: wt-status.c:761
 msgid "Submodules changed but not updated:"
 msgstr "Подмодулите са променени, но не са обновени:"
 
-#: wt-status.c:767
+#: wt-status.c:763
 msgid "Submodule changes to be committed:"
 msgstr "Промени в подмодулите за подаване:"
 
-#: wt-status.c:846
+#: wt-status.c:842
 msgid ""
 "Do not touch the line above.\n"
 "Everything below will be removed."
@@ -1692,193 +1865,193 @@
 "Не променяйте горния ред.\n"
 "Всичко отдолу ще бъде изтрито."
 
-#: wt-status.c:937
+#: wt-status.c:933
 msgid "You have unmerged paths."
 msgstr "Някои пътища не са слети."
 
-#: wt-status.c:940
+#: wt-status.c:936
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr "  (коригирайте конфликтите и изпълнете „git commit“)"
 
-#: wt-status.c:943
+#: wt-status.c:939
 msgid "All conflicts fixed but you are still merging."
 msgstr "Всички конфликти са решени, но продължавате сливането."
 
-#: wt-status.c:946
+#: wt-status.c:942
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr "  (използвайте „git commit“, за да завършите сливането)"
 
-#: wt-status.c:956
+#: wt-status.c:952
 msgid "You are in the middle of an am session."
 msgstr "В момента прилагате поредица от кръпки чрез „git am“."
 
-#: wt-status.c:959
+#: wt-status.c:955
 msgid "The current patch is empty."
 msgstr "Текущата кръпка е празна."
 
-#: wt-status.c:963
+#: wt-status.c:959
 msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr "  (коригирайте конфликтите и изпълнете „git am --continue“)"
 
-#: wt-status.c:965
+#: wt-status.c:961
 msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr "  (използвайте „git am --skip“, за да пропуснете тази кръпка)"
 
-#: wt-status.c:967
+#: wt-status.c:963
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr ""
 "  (използвайте „git am --abort“, за да възстановите първоначалния клон)"
 
-#: wt-status.c:1027 wt-status.c:1044
+#: wt-status.c:1023 wt-status.c:1040
 #, c-format
 msgid "You are currently rebasing branch '%s' on '%s'."
 msgstr "В момента пребазирате клона „%s“ върху „%s“."
 
-#: wt-status.c:1032 wt-status.c:1049
+#: wt-status.c:1028 wt-status.c:1045
 msgid "You are currently rebasing."
 msgstr "В момента пребазирате."
 
-#: wt-status.c:1035
+#: wt-status.c:1031
 msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr "  (коригирайте конфликтите и използвайте „git rebase --continue“)"
 
-#: wt-status.c:1037
+#: wt-status.c:1033
 msgid "  (use \"git rebase --skip\" to skip this patch)"
 msgstr "  (използвайте „git rebase --skip“, за да пропуснете тази кръпка)"
 
-#: wt-status.c:1039
+#: wt-status.c:1035
 msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr ""
 "  (използвайте „git rebase --abort“, за да възстановите първоначалния клон)"
 
-#: wt-status.c:1052
+#: wt-status.c:1048
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr "  (всички конфликти са коригирани: изпълнете „git rebase --continue“)"
 
-#: wt-status.c:1056
+#: wt-status.c:1052
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
 msgstr "В момента разделяте подаване докато пребазирате клона „%s“ върху „%s“."
 
-#: wt-status.c:1061
+#: wt-status.c:1057
 msgid "You are currently splitting a commit during a rebase."
 msgstr "В момента разделяте подаване докато пребазирате."
 
-#: wt-status.c:1064
+#: wt-status.c:1060
 msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr ""
 "  (След като работното ви дърво стане чисто, използвайте „git rebase --"
 "continue“)"
 
-#: wt-status.c:1068
+#: wt-status.c:1064
 #, c-format
 msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr ""
 "В момента редактирате подаване докато пребазирате клона „%s“ върху „%s“."
 
-#: wt-status.c:1073
+#: wt-status.c:1069
 msgid "You are currently editing a commit during a rebase."
 msgstr "В момента редактирате подаване докато пребазирате."
 
-#: wt-status.c:1076
+#: wt-status.c:1072
 msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr ""
 "  (използвайте „git commit --amend“, за да редактирате текущото подаване)"
 
-#: wt-status.c:1078
+#: wt-status.c:1074
 msgid ""
 "  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr ""
 "  (използвайте „git rebase --continue“, след като завършите промените си)"
 
-#: wt-status.c:1088
+#: wt-status.c:1084
 #, c-format
 msgid "You are currently cherry-picking commit %s."
 msgstr "В момента отбирате подаването „%s“."
 
-#: wt-status.c:1093
+#: wt-status.c:1089
 msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
 msgstr "  (коригирайте конфликтите и изпълнете „git cherry-pick --continue“)"
 
-#: wt-status.c:1096
+#: wt-status.c:1092
 msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr ""
 "  (всички конфликти са коригирани, изпълнете „git cherry-pick --continue“)"
 
-#: wt-status.c:1098
+#: wt-status.c:1094
 msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr ""
 "  (използвайте „git cherry-pick --abort“, за да отмените всички действия с "
 "отбиране)"
 
-#: wt-status.c:1107
+#: wt-status.c:1103
 #, c-format
 msgid "You are currently reverting commit %s."
 msgstr "В момента отменяте подаване „%s“."
 
-#: wt-status.c:1112
+#: wt-status.c:1108
 msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr "  (коригирайте конфликтите и изпълнете „git revert --continue“)"
 
-#: wt-status.c:1115
+#: wt-status.c:1111
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr "  (всички конфликти са коригирани, изпълнете „git revert --continue“)"
 
-#: wt-status.c:1117
+#: wt-status.c:1113
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr ""
 "  (използвайте „git revert --abort“, за да преустановите отмяната на "
 "подаване)"
 
-#: wt-status.c:1128
+#: wt-status.c:1124
 #, c-format
 msgid "You are currently bisecting, started from branch '%s'."
 msgstr "В момента търсите двоично, като сте стартирали от клон „%s“."
 
-#: wt-status.c:1132
+#: wt-status.c:1128
 msgid "You are currently bisecting."
 msgstr "В момента търсите двоично."
 
-#: wt-status.c:1135
+#: wt-status.c:1131
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr ""
 "  (използвайте „git bisect reset“, за да се върнете към първоначалното "
 "състояние и клон)"
 
-#: wt-status.c:1310
+#: wt-status.c:1306
 msgid "On branch "
 msgstr "На клон "
 
-#: wt-status.c:1317
+#: wt-status.c:1313
 msgid "rebase in progress; onto "
 msgstr "извършвате пребазиране върху "
 
-#: wt-status.c:1324
+#: wt-status.c:1320
 msgid "HEAD detached at "
-msgstr "Указателят „HEAD“ не е свързан и е на подаване "
+msgstr "Указателят „HEAD“ не е свързан и е при подаване "
 
-#: wt-status.c:1326
+#: wt-status.c:1322
 msgid "HEAD detached from "
 msgstr "Указателят „HEAD“ не е свързан и е отделѐн от "
 
-#: wt-status.c:1329
+#: wt-status.c:1325
 msgid "Not currently on any branch."
-msgstr "Извън всички клони"
+msgstr "Извън всички клони."
 
-#: wt-status.c:1346
+#: wt-status.c:1342
 msgid "Initial commit"
 msgstr "Първоначално подаване"
 
-#: wt-status.c:1360
+#: wt-status.c:1356
 msgid "Untracked files"
 msgstr "Неследени файлове"
 
-#: wt-status.c:1362
+#: wt-status.c:1358
 msgid "Ignored files"
 msgstr "Игнорирани файлове"
 
-#: wt-status.c:1366
+#: wt-status.c:1362
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1887,35 +2060,35 @@
 msgstr ""
 "Бяха необходими %.2f секунди за изброяването на неследените файлове.\n"
 "Добавянето на опцията „-uno“ към командата „git status“, ще ускори\n"
-"нещата, но не трябва да забравяте ръчно да добавяте новите файлове.\n"
+"изпълнението, но не трябва да забравяте ръчно да добавяте новите файлове.\n"
 "За повече подробности погледнете „git status help“."
 
-#: wt-status.c:1372
+#: wt-status.c:1368
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr "Неследените файлове не са изведени%s"
 
-#: wt-status.c:1374
+#: wt-status.c:1370
 msgid " (use -u option to show untracked files)"
 msgstr " (използвайте опцията „-u“, за да изведете неследените файлове)"
 
-#: wt-status.c:1380
+#: wt-status.c:1376
 msgid "No changes"
 msgstr "Няма промени"
 
-#: wt-status.c:1385
+#: wt-status.c:1381
 #, 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:1388
+#: wt-status.c:1384
 #, c-format
 msgid "no changes added to commit\n"
 msgstr "към индекса за подаване не са добавени промени\n"
 
-#: wt-status.c:1391
+#: wt-status.c:1387
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
@@ -1924,97 +2097,92 @@
 "към индекса за подаване не са добавени промени, но има нови файлове "
 "(използвайте „git add“, за да започне тяхното следене)\n"
 
-#: wt-status.c:1394
+#: wt-status.c:1390
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
 msgstr "към индекса за подаване не са добавени промени, но има нови файлове\n"
 
-#: wt-status.c:1397
+#: wt-status.c:1393
 #, c-format
 msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
 "липсват каквито и да е промени (създайте или копирайте файлове и използвайте "
 "„git add“, за да започне тяхното следене)\n"
 
-#: wt-status.c:1400 wt-status.c:1405
+#: wt-status.c:1396 wt-status.c:1401
 #, c-format
 msgid "nothing to commit\n"
 msgstr "липсват каквито и да е промени\n"
 
-#: wt-status.c:1403
+#: wt-status.c:1399
 #, c-format
 msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
 "липсват каквито и да е промени (използвайте опцията „-u“, за да се изведат и "
 "неследените файлове)\n"
 
-#: wt-status.c:1407
+#: wt-status.c:1403
 #, c-format
 msgid "nothing to commit, working directory clean\n"
 msgstr "липсват каквито и да е промени, работното дърво е чисто\n"
 
-#: wt-status.c:1516
+#: wt-status.c:1512
 msgid "HEAD (no branch)"
 msgstr "HEAD (извън клон)"
 
-#: wt-status.c:1522
+#: wt-status.c:1518
 msgid "Initial commit on "
-msgstr "Първоначално подаване на "
+msgstr "Първоначално подаване на клон"
 
-#: wt-status.c:1554
+#: wt-status.c:1550
 msgid "gone"
 msgstr "изтрит"
 
-#: wt-status.c:1556 wt-status.c:1564
+#: wt-status.c:1552 wt-status.c:1560
 msgid "behind "
 msgstr "назад с "
 
-#: compat/precompose_utf8.c:55 builtin/clone.c:356
-#, c-format
-msgid "failed to unlink '%s'"
-msgstr "неуспешно изтриване на „%s“"
-
-#: builtin/add.c:21
+#: builtin/add.c:22
 msgid "git add [options] [--] <pathspec>..."
-msgstr "git add [ОПЦИИ] [--] ПЪТ…"
+msgstr "git add [ОПЦИЯ…] [--] ПЪТ…"
 
-#: builtin/add.c:64
+#: builtin/add.c:65
 #, c-format
 msgid "unexpected diff status %c"
 msgstr "неочакван изходен код при генериране на разлика: %c"
 
-#: builtin/add.c:69 builtin/commit.c:261
+#: builtin/add.c:70 builtin/commit.c:275
 msgid "updating files failed"
 msgstr "неуспешно обновяване на файловете"
 
-#: builtin/add.c:79
+#: builtin/add.c:80
 #, c-format
 msgid "remove '%s'\n"
 msgstr "изтриване на „%s“\n"
 
-#: builtin/add.c:133
+#: builtin/add.c:134
 msgid "Unstaged changes after refreshing the index:"
 msgstr "Промени, които и след обновяването на индекса не са добавени към него:"
 
-#: builtin/add.c:193
+#: builtin/add.c:194 builtin/rev-parse.c:785
 msgid "Could not read the index"
 msgstr "Индексът не може да бъде прочетен"
 
-#: builtin/add.c:204
+#: builtin/add.c:205
 #, c-format
 msgid "Could not open '%s' for writing."
 msgstr "Файлът „%s“ не може да бъде отворен за запис."
 
-#: builtin/add.c:208
+#: builtin/add.c:209
 msgid "Could not write patch"
 msgstr "Кръпката не може да бъде записана"
 
-#: builtin/add.c:213
+#: builtin/add.c:214
 #, c-format
 msgid "Could not stat '%s'"
 msgstr "Не може да се получи информация чрез „stat“ за файла „%s“"
 
-#: builtin/add.c:215
+#: builtin/add.c:216
 msgid "Empty patch. Aborted."
 msgstr "Празна кръпка, преустановяване на действието."
 
@@ -2028,15 +2196,15 @@
 msgstr ""
 "Следните пътища ще бъдат игнорирани според някой от файловете „.gitignore“:\n"
 
-#: builtin/add.c:248 builtin/clean.c:876 builtin/fetch.c:93 builtin/mv.c:70
-#: builtin/prune-packed.c:77 builtin/push.c:489 builtin/remote.c:1344
+#: builtin/add.c:248 builtin/clean.c:875 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/prune-packed.c:55 builtin/push.c:499 builtin/remote.c:1375
 #: builtin/rm.c:269
 msgid "dry run"
 msgstr "пробно изпълнeние"
 
-#: builtin/add.c:249 builtin/apply.c:4410 builtin/check-ignore.c:19
-#: builtin/commit.c:1256 builtin/count-objects.c:95 builtin/fsck.c:612
-#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113
+#: builtin/add.c:249 builtin/apply.c:4415 builtin/check-ignore.c:19
+#: builtin/commit.c:1362 builtin/count-objects.c:63 builtin/fsck.c:608
+#: builtin/log.c:1617 builtin/mv.c:109 builtin/read-tree.c:114
 msgid "be verbose"
 msgstr "повече подробности"
 
@@ -2044,7 +2212,7 @@
 msgid "interactive picking"
 msgstr "интерактивно отбиране на промени"
 
-#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:286
 msgid "select hunks interactively"
 msgstr "интерактивен избор на парчета код"
 
@@ -2092,7 +2260,7 @@
 #: builtin/add.c:286
 #, c-format
 msgid "Use -f if you really want to add them.\n"
-msgstr "Използвайте опцията „-f“, ако наистина искате да ги добавите.\n"
+msgstr "Използвайте опцията „-f“, за да ги добавите наистина.\n"
 
 #: builtin/add.c:287
 msgid "no files added"
@@ -2102,93 +2270,101 @@
 msgid "adding files failed"
 msgstr "неуспешно добавяне на файлове"
 
-#: builtin/add.c:330
+#: builtin/add.c:329
 msgid "-A and -u are mutually incompatible"
 msgstr "опциите „-A“ и „-u“ са несъвместими"
 
-#: builtin/add.c:337
+#: builtin/add.c:336
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr "Опцията „--ignore-missing“ е съвместима само с „--dry-run“"
 
-#: builtin/add.c:358
+#: builtin/add.c:357
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Нищо не е зададено и нищо не е добавено.\n"
 
-#: builtin/add.c:359
+#: builtin/add.c:358
 #, 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:920
-#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:234 builtin/rm.c:299
+#: builtin/add.c:363 builtin/check-ignore.c:172 builtin/clean.c:919
+#: builtin/commit.c:333 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:299
 msgid "index file corrupt"
 msgstr "файлът с индекса е повреден"
 
-#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
+#: builtin/add.c:446 builtin/apply.c:4510 builtin/mv.c:279 builtin/rm.c:431
 msgid "Unable to write new index file"
 msgstr "Новият индекс не може да бъде записан"
 
-#: builtin/apply.c:57
+#: builtin/apply.c:58
 msgid "git apply [options] [<patch>...]"
-msgstr ""
+msgstr "git apply [ОПЦИЯ…] [КРЪПКА…]"
 
-#: builtin/apply.c:110
+#: builtin/apply.c:111
 #, c-format
 msgid "unrecognized whitespace option '%s'"
-msgstr ""
+msgstr "непозната опция за знаците за интервали „%s“"
 
-#: builtin/apply.c:125
+#: builtin/apply.c:126
 #, c-format
 msgid "unrecognized whitespace ignore option '%s'"
-msgstr ""
+msgstr "непозната опция за игнориране на знаците за интервали „%s“"
 
-#: builtin/apply.c:823
+#: builtin/apply.c:826
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
-msgstr ""
+msgstr "Регулярният израз за времето „%s“ не може за бъде компилиран"
 
-#: builtin/apply.c:832
+#: builtin/apply.c:835
 #, c-format
 msgid "regexec returned %d for input: %s"
-msgstr ""
+msgstr "Регулярният израз върна %d при подадена последователност „%s“ на входа"
 
-#: builtin/apply.c:913
+#: builtin/apply.c:916
 #, c-format
 msgid "unable to find filename in patch at line %d"
-msgstr ""
+msgstr "Липсва име на файл на ред %d от кръпката"
 
-#: builtin/apply.c:945
+#: builtin/apply.c:948
 #, 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:949
+#: builtin/apply.c:952
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr ""
+"git apply: лош изход от командата „git-diff“ — на ред %d бе получено "
+"неправилно име на нов файл"
 
-#: builtin/apply.c:950
+#: builtin/apply.c:953
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr ""
+"git apply: лош изход от командата „git-diff“ — на ред %d бе получено "
+"неправилно име на стар файл"
 
-#: builtin/apply.c:957
+#: builtin/apply.c:960
 #, 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:1422
+#: builtin/apply.c:1423
 #, c-format
 msgid "recount: unexpected line: %.*s"
-msgstr ""
+msgstr "при повторното преброяване бе получен неочакван ред: „%.*s“"
 
-#: builtin/apply.c:1479
+#: builtin/apply.c:1480
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
-msgstr ""
+msgstr "част от кръпка без заглавна част на ред %d: %.*s"
 
-#: builtin/apply.c:1496
+#: builtin/apply.c:1497
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -2197,437 +2373,455 @@
 "git diff header lacks filename information when removing %d leading pathname "
 "components (line %d)"
 msgstr[0] ""
+"След съкращаването на %d-та част от компонентите на пътя, в заглавната част "
+"на „git diff“ липсва информация за име на файл (ред: %d)"
 msgstr[1] ""
+"След съкращаването на първите %d части от компонентите на пътя, в заглавната "
+"част на „git diff“ липсва информация за име на файл (ред: %d)"
 
-#: builtin/apply.c:1656
+#: builtin/apply.c:1657
 msgid "new file depends on old contents"
-msgstr ""
+msgstr "новият файл зависи от старото съдържание на файла"
 
-#: builtin/apply.c:1658
+#: builtin/apply.c:1659
 msgid "deleted file still has contents"
-msgstr ""
+msgstr "изтритият файл не е празен"
 
-#: builtin/apply.c:1684
+#: builtin/apply.c:1685
 #, c-format
 msgid "corrupt patch at line %d"
-msgstr ""
+msgstr "грешка в кръпката на ред %d"
 
-#: builtin/apply.c:1720
+#: builtin/apply.c:1721
 #, c-format
 msgid "new file %s depends on old contents"
-msgstr ""
+msgstr "новият файл „%s“ зависи от старото съдържание на файла"
 
-#: builtin/apply.c:1722
+#: builtin/apply.c:1723
 #, c-format
 msgid "deleted file %s still has contents"
-msgstr ""
+msgstr "изтритият файл „%s“ не е празен"
 
 # FIXME - double **??
-#: builtin/apply.c:1725
+#: builtin/apply.c:1726
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr "●● предупреждение: файлът „%s“ вече е празен, но не е изтрит"
 
-#: builtin/apply.c:1871
+#: builtin/apply.c:1872
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
-msgstr ""
+msgstr "грешка в двоичната кръпка на ред %d: %.*s"
 
-#: builtin/apply.c:1900
+#: builtin/apply.c:1901
 #, c-format
 msgid "unrecognized binary patch at line %d"
-msgstr ""
+msgstr "неразпозната двоичната кръпка на ред %d"
 
-#: builtin/apply.c:1986
+#: builtin/apply.c:2052
 #, c-format
 msgid "patch with only garbage at line %d"
-msgstr ""
+msgstr "кръпката е с изцяло повредени данни на ред %d"
 
-#: builtin/apply.c:2076
+#: builtin/apply.c:2142
 #, c-format
 msgid "unable to read symlink %s"
-msgstr ""
+msgstr "символната връзка „%s“ не може да бъде прочетена"
 
-#: builtin/apply.c:2080
+#: builtin/apply.c:2146
 #, c-format
 msgid "unable to open or read %s"
-msgstr ""
+msgstr "файлът „%s“ не може да бъде отворен или прочетен"
 
-#: builtin/apply.c:2688
+#: builtin/apply.c:2754
 #, c-format
 msgid "invalid start of line: '%c'"
-msgstr ""
+msgstr "неправилно начало на ред: „%c“"
 
-#: builtin/apply.c:2806
+#: builtin/apply.c:2872
 #, 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:2818
+#: builtin/apply.c:2884
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr ""
+"Контекстът е намален на (%ld/%ld) за прилагането на парчето код на ред %d"
 
-#: builtin/apply.c:2824
+#: builtin/apply.c:2890
 #, c-format
 msgid ""
 "while searching for:\n"
 "%.*s"
 msgstr ""
+"при търсене за:\n"
+"%.*s"
 
-#: builtin/apply.c:2843
+#: builtin/apply.c:2909
 #, c-format
 msgid "missing binary patch data for '%s'"
-msgstr ""
+msgstr "липсват данните за двоичната кръпка за „%s“"
 
-#: builtin/apply.c:2946
+#: builtin/apply.c:3010
 #, c-format
 msgid "binary patch does not apply to '%s'"
-msgstr ""
+msgstr "двоичната кръпка не може да бъде приложена върху „%s“"
 
-#: builtin/apply.c:2952
+#: builtin/apply.c:3016
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr ""
+"двоичната кръпка за „%s“ води до неправилни резултати (очакваше се SHA1: "
+"„%s“, а бе получено: „%s“)"
 
-#: builtin/apply.c:2973
+#: builtin/apply.c:3037
 #, c-format
 msgid "patch failed: %s:%ld"
-msgstr ""
+msgstr "неуспешно прилагане на кръпка: „%s:%ld“"
 
-#: builtin/apply.c:3095
+#: builtin/apply.c:3161
 #, c-format
 msgid "cannot checkout %s"
-msgstr ""
+msgstr "„%s“ не може да се изтегли"
 
-#: builtin/apply.c:3140 builtin/apply.c:3149 builtin/apply.c:3194
+#: builtin/apply.c:3206 builtin/apply.c:3215 builtin/apply.c:3260
 #, c-format
 msgid "read of %s failed"
-msgstr ""
+msgstr "неуспешно прочитане на „%s“"
 
-#: builtin/apply.c:3174 builtin/apply.c:3396
+#: builtin/apply.c:3240 builtin/apply.c:3462
 #, c-format
 msgid "path %s has been renamed/deleted"
-msgstr ""
+msgstr "обектът с път „%s“ е преименуван или изтрит"
 
-#: builtin/apply.c:3255 builtin/apply.c:3410
+#: builtin/apply.c:3321 builtin/apply.c:3476
 #, c-format
 msgid "%s: does not exist in index"
-msgstr ""
+msgstr "„%s“ не съществува в индекса"
 
-#: builtin/apply.c:3259 builtin/apply.c:3402 builtin/apply.c:3424
+#: builtin/apply.c:3325 builtin/apply.c:3468 builtin/apply.c:3490
 #, c-format
 msgid "%s: %s"
-msgstr ""
+msgstr "„%s“: %s"
 
-#: builtin/apply.c:3264 builtin/apply.c:3418
+#: builtin/apply.c:3330 builtin/apply.c:3484
 #, c-format
 msgid "%s: does not match index"
-msgstr ""
+msgstr "„%s“ не съответства на индекса"
 
-#: builtin/apply.c:3366
+#: builtin/apply.c:3432
 msgid "removal patch leaves file contents"
-msgstr ""
+msgstr "изтриващата кръпка оставя файла непразен"
 
-#: builtin/apply.c:3435
+#: builtin/apply.c:3501
 #, c-format
 msgid "%s: wrong type"
-msgstr ""
+msgstr "„%s“: неправилен вид"
 
-#: builtin/apply.c:3437
+#: builtin/apply.c:3503
 #, c-format
 msgid "%s has type %o, expected %o"
-msgstr ""
+msgstr "„%s“ е от вид „%o“, а се очакваше „%o“"
 
-#: builtin/apply.c:3538
+#: builtin/apply.c:3604
 #, c-format
 msgid "%s: already exists in index"
-msgstr ""
+msgstr "„%s“: вече съществува в индекса"
 
-#: builtin/apply.c:3541
+#: builtin/apply.c:3607
 #, c-format
 msgid "%s: already exists in working directory"
-msgstr ""
+msgstr "„%s“: вече съществува в работната директория"
 
-#: builtin/apply.c:3561
+#: builtin/apply.c:3627
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr ""
+msgstr "новите права за достъп (%o) на „%s“ не съвпадат със старите (%o)"
 
-#: builtin/apply.c:3566
+#: builtin/apply.c:3632
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr ""
+"новите права за достъп (%o) на „%s“ не съвпадат със старите (%o) на „%s“"
 
-#: builtin/apply.c:3574
+#: builtin/apply.c:3640
 #, c-format
 msgid "%s: patch does not apply"
-msgstr ""
+msgstr "Кръпката „%s“ не може да бъде приложена"
 
-#: builtin/apply.c:3587
+#: builtin/apply.c:3653
 #, c-format
 msgid "Checking patch %s..."
-msgstr ""
+msgstr "Проверяване на кръпката „%s“…"
 
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
+#: builtin/apply.c:3746 builtin/checkout.c:213 builtin/reset.c:135
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "неуспешно създаване на запис в кеша чрез „make_cache_entry“ за „%s“"
 
-#: builtin/apply.c:3823
+#: builtin/apply.c:3889
 #, c-format
 msgid "unable to remove %s from index"
-msgstr ""
+msgstr "„%s“ не може да се извади от индекса"
 
-#: builtin/apply.c:3851
+#: builtin/apply.c:3918
 #, c-format
 msgid "corrupt patch for submodule %s"
-msgstr ""
+msgstr "повредена кръпка за модула „%s“"
 
-#: builtin/apply.c:3855
+#: builtin/apply.c:3922
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr ""
+"не може да се получи информация чрез „stat“ за новосъздадения файл „%s“"
 
-#: builtin/apply.c:3860
+#: builtin/apply.c:3927
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr ""
+"не може да се за създаде мястото за съхранение на новосъздадения файл „%s“"
 
-#: builtin/apply.c:3863 builtin/apply.c:3971
+#: builtin/apply.c:3930 builtin/apply.c:4038
 #, c-format
 msgid "unable to add cache entry for %s"
-msgstr ""
+msgstr "не може да се добави запис в кеша за „%s“"
 
-#: builtin/apply.c:3896
+#: builtin/apply.c:3963
 #, c-format
 msgid "closing file '%s'"
-msgstr ""
+msgstr "затваряне на файла „%s“"
 
-#: builtin/apply.c:3945
+#: builtin/apply.c:4012
 #, c-format
 msgid "unable to write file '%s' mode %o"
-msgstr ""
+msgstr "файлът „%s“ не може да се запише с режим на достъп „%o“"
 
-#: builtin/apply.c:4032
+#: builtin/apply.c:4099
 #, c-format
 msgid "Applied patch %s cleanly."
-msgstr ""
+msgstr "Кръпката „%s“ бе приложена чисто."
 
-#: builtin/apply.c:4040
+#: builtin/apply.c:4107
 msgid "internal error"
-msgstr ""
+msgstr "вътрешна грешка"
 
-#: builtin/apply.c:4043
+#: builtin/apply.c:4110
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Прилагане на кръпката „%%s“ с %d отхвърлено парче…"
+msgstr[1] "Прилагане на кръпката „%%s“ с %d отхвърлени парчета…"
 
-#: builtin/apply.c:4053
+#: builtin/apply.c:4120
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
-msgstr ""
+msgstr "съкращаване на името на файла с отхвърлените парчета на „ %.*s.rej“"
 
-#: builtin/apply.c:4074
+#: builtin/apply.c:4141
 #, c-format
 msgid "Hunk #%d applied cleanly."
-msgstr ""
+msgstr "%d-то парче бе успешно приложено."
 
-#: builtin/apply.c:4077
+#: builtin/apply.c:4144
 #, c-format
 msgid "Rejected hunk #%d."
-msgstr ""
+msgstr "%d-то парче бе отхвърлено."
 
-#: builtin/apply.c:4227
+#: builtin/apply.c:4234
 msgid "unrecognized input"
-msgstr ""
+msgstr "непознат вход"
 
-#: builtin/apply.c:4238
+#: builtin/apply.c:4245
 msgid "unable to read index file"
 msgstr "индексът не може да бъде записан"
 
-#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90
-#: builtin/fetch.c:78
+#: builtin/apply.c:4362 builtin/apply.c:4365 builtin/clone.c:91
+#: builtin/fetch.c:93
 msgid "path"
 msgstr "път"
 
-#: builtin/apply.c:4358
-msgid "don't apply changes matching the given path"
-msgstr ""
-
-#: builtin/apply.c:4361
-msgid "apply changes matching the given path"
-msgstr ""
-
 #: builtin/apply.c:4363
+msgid "don't apply changes matching the given path"
+msgstr "без прилагане на промените напасващи на дадения път"
+
+#: builtin/apply.c:4366
+msgid "apply changes matching the given path"
+msgstr "прилагане на промените напасващи на дадения път"
+
+#: builtin/apply.c:4368
 msgid "num"
-msgstr ""
-
-#: builtin/apply.c:4364
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr ""
-
-#: builtin/apply.c:4367
-msgid "ignore additions made by the patch"
-msgstr ""
+msgstr "БРОЙ"
 
 #: builtin/apply.c:4369
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "премахване на този БРОЙ водещи елементи от пътищата в разликата"
+
+#: builtin/apply.c:4372
+msgid "ignore additions made by the patch"
+msgstr "игнориране на редовете добавени от тази кръпка"
+
+#: builtin/apply.c:4374
 msgid "instead of applying the patch, output diffstat for the input"
-msgstr ""
+msgstr "извеждане на статистика на промените без прилагане на кръпката"
 
-#: builtin/apply.c:4373
+#: builtin/apply.c:4378
 msgid "show number of added and deleted lines in decimal notation"
-msgstr ""
+msgstr "извеждане на броя на добавените и изтритите редове"
 
-#: builtin/apply.c:4375
+#: builtin/apply.c:4380
 msgid "instead of applying the patch, output a summary for the input"
-msgstr ""
+msgstr "извеждане на статистика на входните данни без прилагане на кръпката"
 
-#: builtin/apply.c:4377
+#: builtin/apply.c:4382
 msgid "instead of applying the patch, see if the patch is applicable"
-msgstr ""
+msgstr "проверка дали кръпката може да се приложи, без действително прилагане"
 
-#: builtin/apply.c:4379
+#: builtin/apply.c:4384
 msgid "make sure the patch is applicable to the current index"
-msgstr ""
+msgstr "проверка дали кръпката може да бъде приложена към текущия индекс"
 
-#: builtin/apply.c:4381
+#: builtin/apply.c:4386
 msgid "apply a patch without touching the working tree"
-msgstr ""
+msgstr "прилагане на кръпката без промяна на работното дърво"
 
-#: builtin/apply.c:4383
+#: builtin/apply.c:4388
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr ""
+"кръпката да бъде приложена. Опцията се комбинира с „--check“/„--stat“/„--"
+"summary“"
 
-#: builtin/apply.c:4385
+#: builtin/apply.c:4390
 msgid "attempt three-way merge if a patch does not apply"
-msgstr ""
+msgstr "пробване с тройно сливане, ако кръпката не може да се приложи директно"
 
-#: builtin/apply.c:4387
+#: builtin/apply.c:4392
 msgid "build a temporary index based on embedded index information"
 msgstr ""
+"създаване на временен индекс на база на включената информация за индекса"
 
-#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
+#: builtin/apply.c:4394 builtin/checkout-index.c:198 builtin/ls-files.c:455
 msgid "paths are separated with NUL character"
 msgstr "разделяне на пътищата с нулевия знак „NUL“"
 
-#: builtin/apply.c:4392
+#: builtin/apply.c:4397
 msgid "ensure at least <n> lines of context match"
 msgstr "да се осигури контекст от поне такъв БРОЙ съвпадащи редове"
 
-#: builtin/apply.c:4393
+#: builtin/apply.c:4398
 msgid "action"
-msgstr ""
+msgstr "действие"
 
-#: builtin/apply.c:4394
+#: builtin/apply.c:4399
 msgid "detect new or modified lines that have whitespace errors"
-msgstr ""
+msgstr "засичане на нови или променени редове с грешки в знаците за интервали"
 
-#: builtin/apply.c:4397 builtin/apply.c:4400
+#: builtin/apply.c:4402 builtin/apply.c:4405
 msgid "ignore changes in whitespace when finding context"
 msgstr ""
+"игнориране на промените в знаците за интервали при откриване на контекста"
 
-#: builtin/apply.c:4403
+#: builtin/apply.c:4408
 msgid "apply the patch in reverse"
-msgstr ""
+msgstr "прилагане на кръпката в обратна посока"
 
-#: builtin/apply.c:4405
+#: builtin/apply.c:4410
 msgid "don't expect at least one line of context"
-msgstr ""
-
-#: builtin/apply.c:4407
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr ""
-
-#: builtin/apply.c:4409
-msgid "allow overlapping hunks"
-msgstr ""
+msgstr "без изискване на дори и един ред контекст"
 
 #: builtin/apply.c:4412
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr ""
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "оставяне на отхвърлените парчета във файлове с разширение „.rej“"
 
-#: builtin/apply.c:4415
-msgid "do not trust the line counts in the hunk headers"
-msgstr ""
+#: builtin/apply.c:4414
+msgid "allow overlapping hunks"
+msgstr "позволяване на застъпващи се парчета"
 
 #: builtin/apply.c:4417
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "пренебрегване на неправилно липсващ знак за нов ред в края на файл"
+
+#: builtin/apply.c:4420
+msgid "do not trust the line counts in the hunk headers"
+msgstr "без доверяване на номерата на редовете в заглавните части на парчетата"
+
+#: builtin/apply.c:4422
 msgid "root"
-msgstr ""
+msgstr "НАЧАЛНА_ДИРЕКТОРИЯ"
 
-#: builtin/apply.c:4418
+#: builtin/apply.c:4423
 msgid "prepend <root> to all filenames"
-msgstr ""
+msgstr "добавяне на тази НАЧАЛНА_ДИРЕКТОРИЯ към имената на всички файлове"
 
-#: builtin/apply.c:4440
+#: builtin/apply.c:4445
 msgid "--3way outside a repository"
-msgstr ""
+msgstr "като „--3way“, но извън хранилище"
 
-#: builtin/apply.c:4448
+#: builtin/apply.c:4453
 msgid "--index outside a repository"
-msgstr ""
+msgstr "като „--index“, но извън хранилище"
 
-#: builtin/apply.c:4451
+#: builtin/apply.c:4456
 msgid "--cached outside a repository"
-msgstr ""
+msgstr "като „--cached“, но извън хранилище"
 
-#: builtin/apply.c:4467
+#: builtin/apply.c:4472
 #, c-format
 msgid "can't open patch '%s'"
-msgstr ""
+msgstr "кръпката „%s“ не може да бъде отворена"
 
-#: builtin/apply.c:4481
+#: builtin/apply.c:4486
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "пренебрегната е %d грешка в знаците за интервали"
+msgstr[1] "пренебрегнати са %d грешки в знаците за интервали"
 
-#: builtin/apply.c:4487 builtin/apply.c:4497
+#: builtin/apply.c:4492 builtin/apply.c:4502
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d ред добавя грешки в знаците за интервали."
+msgstr[1] "%d реда добавят грешки в знаците за интервали."
 
 #: builtin/archive.c:17
 #, c-format
 msgid "could not create archive file '%s'"
-msgstr ""
+msgstr "архивният файл „%s“ не може да бъде създаден"
 
 #: builtin/archive.c:20
 msgid "could not redirect output"
-msgstr ""
+msgstr "изходът не може да бъде пренасочен"
 
 #: builtin/archive.c:37
 msgid "git archive: Remote with no URL"
-msgstr ""
+msgstr "git archive: Липсва адрес за отдалеченото хранилище"
 
 #: builtin/archive.c:58
 msgid "git archive: expected ACK/NAK, got EOF"
-msgstr ""
+msgstr "git archive: очакваше се „ACK“/„NAK“, а бе получен „EOF“"
 
 #: builtin/archive.c:61
 #, c-format
 msgid "git archive: NACK %s"
-msgstr ""
+msgstr "git archive: получен е „NACK“ — %s"
 
 #: builtin/archive.c:63
 #, c-format
 msgid "remote error: %s"
-msgstr ""
+msgstr "отдалечена грешка: %s"
 
 #: builtin/archive.c:64
 msgid "git archive: protocol error"
-msgstr ""
+msgstr "git archive: протоколна грешка"
 
 #: builtin/archive.c:68
 msgid "git archive: expected a flush"
-msgstr ""
+msgstr "git archive: очакваше се изчистване на буферите чрез „flush“"
 
 #: builtin/bisect--helper.c:7
 msgid "git bisect--helper --next-all [--no-checkout]"
@@ -2642,141 +2836,152 @@
 msgstr ""
 "обновяване на указателя „BISECT_HEAD“ вместо да се използва текущото подаване"
 
-#: builtin/blame.c:27
+#: builtin/blame.c:30
 msgid "git blame [options] [rev-opts] [rev] [--] file"
-msgstr "git blame [ОПЦИИ] [ОПЦИИ_ЗА_ВЕРСИЯТА] [ВЕРСИЯ] [--] ФАЙЛ"
+msgstr "git blame [ОПЦИЯ…] [ОПЦИИ_ЗА_ВЕРСИЯТА] [ВЕРСИЯ] [--] ФАЙЛ"
 
-#: builtin/blame.c:32
+#: builtin/blame.c:35
 msgid "[rev-opts] are documented in git-rev-list(1)"
 msgstr "ОПЦИИте_ЗА_ВЕРСИЯТА са документирани в ръководството git-rev-list(1)"
 
-#: builtin/blame.c:2242
+#: builtin/blame.c:2501
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Извеждане на анотациите с намирането им, последователно"
 
 # FIXME SHA-1 -> SHA1
-#: builtin/blame.c:2243
+#: builtin/blame.c:2502
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr ""
 "Извеждане на празни суми по SHA1 за граничните подавания (стандартно опцията "
 "е изключена)"
 
-#: builtin/blame.c:2244
+#: builtin/blame.c:2503
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr ""
 "Началните подавания да не се считат за гранични (стандартно опцията е "
 "изключена)"
 
-#: builtin/blame.c:2245
+#: builtin/blame.c:2504
 msgid "Show work cost statistics"
 msgstr "Извеждане на статистика за извършените действия"
 
-#: builtin/blame.c:2246
+#: builtin/blame.c:2505
 msgid "Show output score for blame entries"
 msgstr "Извеждане на допълнителна информация за определянето на анотациите"
 
-#: builtin/blame.c:2247
+#: builtin/blame.c:2506
 msgid "Show original filename (Default: auto)"
 msgstr ""
 "Извеждане на първоначалното име на файл (стандартно това е автоматично)"
 
-#: builtin/blame.c:2248
+#: builtin/blame.c:2507
 msgid "Show original linenumber (Default: off)"
 msgstr ""
 "Извеждане на първоначалният номер на ред (стандартно опцията е изключена)"
 
-#: builtin/blame.c:2249
+#: builtin/blame.c:2508
 msgid "Show in a format designed for machine consumption"
 msgstr "Извеждане във формат за по-нататъшна обработка"
 
-#: builtin/blame.c:2250
+#: builtin/blame.c:2509
 msgid "Show porcelain format with per-line commit information"
 msgstr ""
-"Извеждане във формат за по-нататъшна обработка с информация на всеки ред"
+"Извеждане във формат за команди от потребителско ниво с информация на всеки "
+"ред"
 
-#: builtin/blame.c:2251
+#: builtin/blame.c:2510
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr ""
 "Използване на същия формат като „git-annotate“ (стандартно опцията е "
 "изключена)"
 
-#: builtin/blame.c:2252
+#: builtin/blame.c:2511
 msgid "Show raw timestamp (Default: off)"
 msgstr "Извеждане на неформатирани времена (стандартно опцията е изключена)"
 
-#: builtin/blame.c:2253
+#: builtin/blame.c:2512
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Извеждане на пълните суми по SHA1 (стандартно опцията е изключена)"
 
-#: builtin/blame.c:2254
+#: builtin/blame.c:2513
 msgid "Suppress author name and timestamp (Default: off)"
-msgstr "Без име на автор и време на промяна(стандартно опцията е изключена)"
+msgstr "Без име на автор и време на промяна (стандартно опцията е изключена)"
 
-#: builtin/blame.c:2255
+#: builtin/blame.c:2514
 msgid "Show author email instead of name (Default: off)"
 msgstr ""
 "Извеждане на е-пощата на автора, а не името му (стандартно опцията е "
 "изключена)"
 
-#: builtin/blame.c:2256
+#: builtin/blame.c:2515
 msgid "Ignore whitespace differences"
 msgstr "Без разлики в знаците за интервали"
 
-#: builtin/blame.c:2257
+#: builtin/blame.c:2516
 msgid "Spend extra cycles to find better match"
 msgstr "Допълнителни изчисления за по-добри резултати"
 
-#: builtin/blame.c:2258
+#: builtin/blame.c:2517
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Изчитане на версиите от ФАЙЛ, а не чрез изпълнение на „git-rev-list“"
 
-#: builtin/blame.c:2259
+#: builtin/blame.c:2518
 msgid "Use <file>'s contents as the final image"
 msgstr "Използване на съдържанието на ФАЙЛа като крайно положение"
 
-#: builtin/blame.c:2260 builtin/blame.c:2261
+#: builtin/blame.c:2519 builtin/blame.c:2520
 msgid "score"
 msgstr "напасване на редовете"
 
-#: builtin/blame.c:2260
+#: builtin/blame.c:2519
 msgid "Find line copies within and across files"
 msgstr ""
 "Търсене на копирани редове както в рамките на един файл, така и от един файл "
 "към друг"
 
-#: builtin/blame.c:2261
+#: builtin/blame.c:2520
 msgid "Find line movements within and across files"
 msgstr ""
 "Търсене на преместени редове както в рамките на един файл, така и от един "
 "файл към друг"
 
-#: builtin/blame.c:2262
+#: builtin/blame.c:2521
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2262
+#: builtin/blame.c:2521
 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:2602
+msgid "4 years, 11 months ago"
+msgstr "преди 4 години и 11 месеца"
+
 #: builtin/branch.c:24
 msgid "git branch [options] [-r | -a] [--merged | --no-merged]"
-msgstr "git branch [ОПЦИИ] [-r | -a] [--merged | --no-merged]"
+msgstr "git branch [ОПЦИЯ…] [-r | -a] [--merged | --no-merged]"
 
 #: builtin/branch.c:25
 msgid "git branch [options] [-l] [-f] <branchname> [<start-point>]"
-msgstr "git branch [ОПЦИИ] [-l] [-f] ИМЕ_НА_КЛОН [НАЧАЛО]"
+msgstr "git branch [ОПЦИЯ…] [-l] [-f] ИМЕ_НА_КЛОН [НАЧАЛО]"
 
 #: builtin/branch.c:26
 msgid "git branch [options] [-r] (-d | -D) <branchname>..."
-msgstr "git branch [ОПЦИИ] [-r] (-d | -D) ИМЕ_НА_КЛОН…"
+msgstr "git branch [ОПЦИЯ…] [-r] (-d | -D) ИМЕ_НА_КЛОН…"
 
 #: builtin/branch.c:27
 msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>"
-msgstr "git branch [ОПЦИИ] (-m | -M) [СТАР_КЛОН] НОВ_КЛОН"
+msgstr "git branch [ОПЦИЯ…] (-m | -M) [СТАР_КЛОН] НОВ_КЛОН"
 
-#: builtin/branch.c:150
+#: builtin/branch.c:152
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -2785,7 +2990,7 @@
 "изтриване на клона „%s“, който е слят към „%s“,\n"
 "         но още не е слят към върха „HEAD“."
 
-#: builtin/branch.c:154
+#: builtin/branch.c:156
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -2794,12 +2999,12 @@
 "отказване на изтриване на клона „%s“, който не е слят към\n"
 "         „%s“, но е слят към върха „HEAD“."
 
-#: builtin/branch.c:168
+#: builtin/branch.c:170
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Обектът-подаване за „%s“ не може да бъде открит"
 
-#: builtin/branch.c:172
+#: builtin/branch.c:174
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -2808,305 +3013,305 @@
 "Клонът „%s“ не е слят напълно. Ако сте сигурни, че искате\n"
 "да го изтриете, изпълнете „git branch -D %s“."
 
-#: builtin/branch.c:185
+#: builtin/branch.c:187
 msgid "Update of config-file failed"
 msgstr "Неуспешно обновяване на конфигурационния файл"
 
-#: builtin/branch.c:213
+#: builtin/branch.c:215
 msgid "cannot use -a with -d"
 msgstr "Опцията „-a“ е несъвместима с опцията „-d“"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:221
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Обектът-подаване, сочен от указателя „HEAD“, не може да бъде открит"
 
-#: builtin/branch.c:227
+#: builtin/branch.c:229
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
 msgstr "Не можете да изтриете клона „%s“, защото в момента е текущ."
 
-#: builtin/branch.c:240
+#: builtin/branch.c:245
 #, c-format
 msgid "remote branch '%s' not found."
 msgstr "отдалеченият клон „%s“ не може да бъде открит."
 
-#: builtin/branch.c:241
+#: builtin/branch.c:246
 #, c-format
 msgid "branch '%s' not found."
 msgstr "клонът „%s“ не може да бъде открит."
 
-#: builtin/branch.c:255
+#: builtin/branch.c:260
 #, c-format
 msgid "Error deleting remote branch '%s'"
 msgstr "Грешка при изтриването на отдалечения клон „%s“"
 
-#: builtin/branch.c:256
+#: builtin/branch.c:261
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Грешка при изтриването на клона „%s“"
 
-#: builtin/branch.c:263
+#: builtin/branch.c:268
 #, c-format
 msgid "Deleted remote branch %s (was %s).\n"
 msgstr "Изтрит отдалечен клон „%s“ (той сочеше към „%s“).\n"
 
-#: builtin/branch.c:264
+#: builtin/branch.c:269
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Изтрит клон „%s“ (той сочеше към „%s“).\n"
 
-#: builtin/branch.c:366
+#: builtin/branch.c:370
 #, c-format
 msgid "branch '%s' does not point at a commit"
 msgstr "клонът „%s“ не сочи към подаване"
 
-#: builtin/branch.c:454
+#: builtin/branch.c:459
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: изтрит]"
 
-#: builtin/branch.c:459
+#: builtin/branch.c:464
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:464
+#: builtin/branch.c:469
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: назад с %d]"
 
-#: builtin/branch.c:466
+#: builtin/branch.c:471
 #, c-format
 msgid "[behind %d]"
 msgstr "[назад с %d]"
 
-#: builtin/branch.c:470
+#: builtin/branch.c:475
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: напред с %d]"
 
-#: builtin/branch.c:472
+#: builtin/branch.c:477
 #, c-format
 msgid "[ahead %d]"
 msgstr "[напред с %d]"
 
-#: builtin/branch.c:475
+#: builtin/branch.c:480
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: напред с %d, назад с %d]"
 
-#: builtin/branch.c:478
+#: builtin/branch.c:483
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[напред с %d, назад с %d]"
 
 # FIXME ** how many??
-#: builtin/branch.c:502
+#: builtin/branch.c:496
 msgid " **** invalid ref ****"
 msgstr " ●●●● неправилен указател ●●●●"
 
-#: builtin/branch.c:594
+#: builtin/branch.c:587
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(извън клон, пребазиране на „%s“)"
 
-#: builtin/branch.c:597
+#: builtin/branch.c:590
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(извън клон, двоично търсене от „%s“)"
 
-#: builtin/branch.c:600
+#: builtin/branch.c:593
 #, c-format
 msgid "(detached from %s)"
 msgstr "(състояние, несвързано към „%s“)"
 
-#: builtin/branch.c:603
+#: builtin/branch.c:596
 msgid "(no branch)"
 msgstr "(извън клон)"
 
-#: builtin/branch.c:649
+#: builtin/branch.c:643
 #, c-format
 msgid "object '%s' does not point to a commit"
 msgstr "обектът „%s“ не сочи към подаване"
 
-#: builtin/branch.c:681
+#: builtin/branch.c:691
 msgid "some refs could not be read"
 msgstr "някои указатели не могат да бъдат прочетени"
 
-#: builtin/branch.c:694
+#: builtin/branch.c:704
 msgid "cannot rename the current branch while not on any."
 msgstr ""
 "не можете да преименувате текущия клон, защото сте извън който и да е клон"
 
-#: builtin/branch.c:704
+#: builtin/branch.c:714
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Неправилно име на клон: „%s“"
 
-#: builtin/branch.c:719
+#: builtin/branch.c:729
 msgid "Branch rename failed"
 msgstr "Неуспешно преименуване на клон"
 
-#: builtin/branch.c:723
+#: builtin/branch.c:733
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "На клона с неправилно име „%s“ е дадено служебно име"
 
-#: builtin/branch.c:727
+#: builtin/branch.c:737
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
-msgstr "Клонът е преименуван на „%s“, но указателят „HEAD“ не е преименуван"
+msgstr "Клонът е преименуван на „%s“, но указателят „HEAD“ не е обновен"
 
-#: builtin/branch.c:734
+#: builtin/branch.c:744
 msgid "Branch is renamed, but update of config-file failed"
-msgstr "Клонът е преименуван, но конфигурационният файл не бе обновен"
+msgstr "Клонът е преименуван, но конфигурационният файл не е обновен"
 
-#: builtin/branch.c:749
+#: builtin/branch.c:759
 #, c-format
 msgid "malformed object name %s"
 msgstr "неправилно име на обект „%s“"
 
-#: builtin/branch.c:773
+#: builtin/branch.c:783
 #, c-format
 msgid "could not write branch description template: %s"
 msgstr "шаблонът за описание на клон не бе записан: „%s“"
 
-#: builtin/branch.c:803
+#: builtin/branch.c:813
 msgid "Generic options"
 msgstr "Общи настройки"
 
-#: builtin/branch.c:805
+#: builtin/branch.c:815
 msgid "show hash and subject, give twice for upstream branch"
 msgstr ""
 "извеждане на хеша и темата. Повтарянето на опцията прибавя отдалечените клони"
 
-#: builtin/branch.c:806
+#: builtin/branch.c:816
 msgid "suppress informational messages"
 msgstr "без информационни съобщения"
 
-#: builtin/branch.c:807
+#: builtin/branch.c:817
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "задаване на режима на следене (виж git-pull(1))"
 
-#: builtin/branch.c:809
+#: builtin/branch.c:819
 msgid "change upstream info"
 msgstr "смяна на следения клон"
 
-#: builtin/branch.c:813
+#: builtin/branch.c:823
 msgid "use colored output"
 msgstr "цветен изход"
 
-#: builtin/branch.c:814
+#: builtin/branch.c:824
 msgid "act on remote-tracking branches"
 msgstr "действие върху следящите клони"
 
-#: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844
-#: builtin/branch.c:850 builtin/commit.c:1494 builtin/commit.c:1495
-#: builtin/commit.c:1496 builtin/commit.c:1497 builtin/tag.c:527
-#: builtin/tag.c:533
+#: builtin/branch.c:827 builtin/branch.c:833 builtin/branch.c:854
+#: builtin/branch.c:860 builtin/commit.c:1622 builtin/commit.c:1623
+#: builtin/commit.c:1624 builtin/commit.c:1625 builtin/tag.c:616
+#: builtin/tag.c:622
 msgid "commit"
 msgstr "подаване"
 
-#: builtin/branch.c:818 builtin/branch.c:824
+#: builtin/branch.c:828 builtin/branch.c:834
 msgid "print only branches that contain the commit"
 msgstr "извеждане само на клоните, които съдържат това подаване"
 
-#: builtin/branch.c:830
+#: builtin/branch.c:840
 msgid "Specific git-branch actions:"
 msgstr "Специални действия на „git-branch“:"
 
-#: builtin/branch.c:831
+#: builtin/branch.c:841
 msgid "list both remote-tracking and local branches"
 msgstr "извеждане както на следящите, така и на локалните клони"
 
-#: builtin/branch.c:833
+#: builtin/branch.c:843
 msgid "delete fully merged branch"
 msgstr "изтриване на клони, които са напълно слети"
 
-#: builtin/branch.c:834
+#: builtin/branch.c:844
 msgid "delete branch (even if not merged)"
 msgstr "изтриване и на клони, които не са напълно слети"
 
-#: builtin/branch.c:835
+#: builtin/branch.c:845
 msgid "move/rename a branch and its reflog"
 msgstr ""
 "преместване/преименуване на клон и принадлежащият му журнал на указателите"
 
-#: builtin/branch.c:836
+#: builtin/branch.c:846
 msgid "move/rename a branch, even if target exists"
 msgstr "преместване/преименуване на клон, дори ако има вече клон с такова име"
 
-#: builtin/branch.c:837
+#: builtin/branch.c:847
 msgid "list branch names"
 msgstr "извеждане на имената на клоните"
 
-#: builtin/branch.c:838
+#: builtin/branch.c:848
 msgid "create the branch's reflog"
 msgstr "създаване на журнала на указателите на клона"
 
-#: builtin/branch.c:840
+#: builtin/branch.c:850
 msgid "edit the description for the branch"
 msgstr "редактиране на описанието на клона"
 
-#: builtin/branch.c:841
+#: builtin/branch.c:851
 msgid "force creation (when already exists)"
 msgstr "принудително създаване, дори ако съществува клон с такова име"
 
-#: builtin/branch.c:844
+#: builtin/branch.c:854
 msgid "print only not merged branches"
 msgstr "извеждане само на неслетите клони"
 
-#: builtin/branch.c:850
+#: builtin/branch.c:860
 msgid "print only merged branches"
 msgstr "извеждане само на слетите клони"
 
-#: builtin/branch.c:854
+#: builtin/branch.c:864
 msgid "list branches in columns"
 msgstr "извеждане по колони"
 
-#: builtin/branch.c:867
+#: builtin/branch.c:877
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Не може да се открие към какво сочи указателят „HEAD“"
 
-#: builtin/branch.c:872 builtin/clone.c:635
+#: builtin/branch.c:881 builtin/clone.c:634
 msgid "HEAD not found below refs/heads!"
 msgstr "В директорията „refs/heads“ липсва файл „HEAD“"
 
-#: builtin/branch.c:896
+#: builtin/branch.c:903
 msgid "--column and --verbose are incompatible"
 msgstr "Опциите „--column“ и „--verbose“ са несъвместими"
 
-#: builtin/branch.c:902 builtin/branch.c:941
+#: builtin/branch.c:909 builtin/branch.c:948
 msgid "branch name required"
 msgstr "Необходимо е име на клон"
 
-#: builtin/branch.c:917
+#: builtin/branch.c:924
 msgid "Cannot give description to detached HEAD"
 msgstr "Не може да зададете описание на „HEAD“ извън клон"
 
-#: builtin/branch.c:922
+#: builtin/branch.c:929
 msgid "cannot edit description of more than one branch"
 msgstr "Не може да редактирате описанието на повече от един клон едновременно"
 
-#: builtin/branch.c:929
+#: builtin/branch.c:936
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "В клона „%s“ все още няма подавания."
 
-#: builtin/branch.c:932
+#: builtin/branch.c:939
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Липсва клон на име „%s“."
 
-#: builtin/branch.c:947
+#: builtin/branch.c:954
 msgid "too many branches for a rename operation"
 msgstr "Прекалено много клони за преименуване"
 
-#: builtin/branch.c:952
+#: builtin/branch.c:959
 msgid "too many branches to set new upstream"
 msgstr "Прекалено много клони за задаване на следене"
 
-#: builtin/branch.c:956
+#: builtin/branch.c:963
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -3114,39 +3319,39 @@
 "Следеното от „HEAD“ не може да се зададе да е „%s“, защото то не сочи към "
 "никой клон."
 
-#: builtin/branch.c:959 builtin/branch.c:981 builtin/branch.c:1002
+#: builtin/branch.c:966 builtin/branch.c:988 builtin/branch.c:1009
 #, c-format
 msgid "no such branch '%s'"
 msgstr "Няма клон на име „%s“."
 
-#: builtin/branch.c:963
+#: builtin/branch.c:970
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "Не съществува клон на име „%s“."
 
-#: builtin/branch.c:975
+#: builtin/branch.c:982
 msgid "too many branches to unset upstream"
 msgstr "Прекалено много клони за махане на следене"
 
-#: builtin/branch.c:979
+#: builtin/branch.c:986
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 "Следеното от „HEAD“ не може да махне, защото то не сочи към никой клон."
 
-#: builtin/branch.c:985
+#: builtin/branch.c:992
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "Няма информация клонът „%s“ да следи някой друг"
 
-#: builtin/branch.c:999
+#: builtin/branch.c:1006
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "Няма никакъв смисъл ръчно да създавате „HEAD“."
 
-#: builtin/branch.c:1005
+#: builtin/branch.c:1012
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr "Опциите „-a“ и „-r“ на „git branch“ са несъвместими с име на клон"
 
-#: builtin/branch.c:1008
+#: builtin/branch.c:1015
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -3155,7 +3360,7 @@
 "Опцията „--set-upstream“ вече е остаряла и предстои да бъде махната. "
 "Използвайте „--track“ или „--set-upstream-to“\n"
 
-#: builtin/branch.c:1025
+#: builtin/branch.c:1032
 #, c-format
 msgid ""
 "\n"
@@ -3166,12 +3371,12 @@
 "За да накарате „%s“ да следи „%s“, изпълнете следната команда:\n"
 "\n"
 
-#: builtin/branch.c:1026
+#: builtin/branch.c:1033
 #, c-format
 msgid "    git branch -d %s\n"
 msgstr "    git branch -d %s\n"
 
-#: builtin/branch.c:1027
+#: builtin/branch.c:1034
 #, c-format
 msgid "    git branch --set-upstream-to %s\n"
 msgstr "    git branch --set-upstream-to %s\n"
@@ -3179,55 +3384,60 @@
 #: builtin/bundle.c:47
 #, c-format
 msgid "%s is okay\n"
-msgstr ""
+msgstr "Пратката „%s“ е наред\n"
 
 #: builtin/bundle.c:56
 msgid "Need a repository to create a bundle."
-msgstr ""
+msgstr "За създаването на пратка е необходимо хранилище."
 
 #: builtin/bundle.c:60
 msgid "Need a repository to unbundle."
-msgstr ""
-
-#: builtin/cat-file.c:331
-msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
-msgstr ""
+msgstr "За приемането на пратка е необходимо хранилище."
 
 #: builtin/cat-file.c:332
-msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
-msgstr ""
+msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
+msgstr "git cat-file (-t|-s|-e|-p|ВИД|--textconv) ОБЕКТ"
 
-#: builtin/cat-file.c:369
-msgid "<type> can be one of: blob, tree, commit, tag"
-msgstr ""
+#: builtin/cat-file.c:333
+msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
+msgstr "git cat-file (--batch|--batch-check) < СПИСЪК_С_ОБЕКТИ"
 
 #: builtin/cat-file.c:370
-msgid "show object type"
+msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr ""
+"ВИДът може да е: „blob“ (обект BLOB), „tree“ (дърво), „commit“ (подаване), "
+"„tag“ (етикет)"
 
 #: builtin/cat-file.c:371
-msgid "show object size"
-msgstr ""
+msgid "show object type"
+msgstr "извеждане на вида на обект"
 
-#: builtin/cat-file.c:373
-msgid "exit with zero when there's no error"
-msgstr ""
+#: builtin/cat-file.c:372
+msgid "show object size"
+msgstr "извеждане на размера на обект"
 
 #: builtin/cat-file.c:374
-msgid "pretty-print object's content"
-msgstr ""
+msgid "exit with zero when there's no error"
+msgstr "изход с 0, когато няма грешка"
 
-#: builtin/cat-file.c:376
+#: builtin/cat-file.c:375
+msgid "pretty-print object's content"
+msgstr "форматирано извеждане на съдържанието на обекта"
+
+#: builtin/cat-file.c:377
 msgid "for blob objects, run textconv on object's content"
 msgstr ""
+"да се стартира програмата зададена в настройката „textconv“ за преобразуване "
+"на съдържанието на обекта"
 
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:379
 msgid "show info and content of objects fed from the standard input"
 msgstr ""
+"извеждане на информация и съдържание на обектите подадени на стандартния вход"
 
-#: builtin/cat-file.c:381
+#: builtin/cat-file.c:382
 msgid "show info about objects fed from the standard input"
-msgstr ""
+msgstr "извеждане на информация за обектите подадени на стандартния вход"
 
 #: builtin/check-attr.c:11
 msgid "git check-attr [-a | --all | attr...] [--] pathname..."
@@ -3245,7 +3455,7 @@
 msgid "use .gitattributes only from the index"
 msgstr "използване на файла „.gitattributes“ само от индекса"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:75
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "изчитане на имената на файловете от стандартния вход"
 
@@ -3253,45 +3463,48 @@
 msgid "terminate input and output records by a NUL character"
 msgstr "разделяне на входните и изходните записи с нулевия знак „NUL“"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:274
 msgid "suppress progress reporting"
 msgstr "без показване на напредъка"
 
 #: builtin/check-ignore.c:26
 msgid "show non-matching input paths"
-msgstr ""
+msgstr "извеждане на несъвпадащите пътища"
 
 #: builtin/check-ignore.c:28
 msgid "ignore index when checking"
-msgstr ""
+msgstr "прескачане на индекса при проверката"
 
 #: builtin/check-ignore.c:154
 msgid "cannot specify pathnames with --stdin"
-msgstr ""
+msgstr "опцията „--stdin“ е несъвместима с имена на пътища"
 
+# FIXME options
 #: builtin/check-ignore.c:157
 msgid "-z only makes sense with --stdin"
-msgstr ""
+msgstr "опцията „-z“ изисква „--stdin“"
 
 #: builtin/check-ignore.c:159
 msgid "no path specified"
-msgstr ""
+msgstr "не е зададен път"
 
 #: builtin/check-ignore.c:163
 msgid "--quiet is only valid with a single pathname"
-msgstr ""
+msgstr "опцията „--quiet“ изисква да е подаден точно един път"
 
+# FIXME options
 #: builtin/check-ignore.c:165
 msgid "cannot have both --quiet and --verbose"
-msgstr ""
+msgstr "опциите „--quiet“ и „--verbose“ са несъвместими"
 
+# FIXME options
 #: builtin/check-ignore.c:168
 msgid "--non-matching is only valid with --verbose"
-msgstr ""
+msgstr "опцията „--non-matching“ изисква „--verbose“"
 
 #: builtin/check-mailmap.c:8
 msgid "git check-mailmap [options] <contact>..."
-msgstr "git check-mailmap [ОПЦИИ] КОНТАКТ…"
+msgstr "git check-mailmap [ОПЦИЯ…] КОНТАКТ…"
 
 #: builtin/check-mailmap.c:13
 msgid "also read contacts from stdin"
@@ -3308,55 +3521,55 @@
 
 #: builtin/checkout-index.c:126
 msgid "git checkout-index [options] [--] [<file>...]"
-msgstr ""
-
-#: builtin/checkout-index.c:187
-msgid "check out all files in the index"
-msgstr ""
+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 ""
+msgstr "презаписване на файловете, дори и да съществуват"
 
-#: builtin/checkout-index.c:190
+#: builtin/checkout-index.c:191
 msgid "no warning for existing files and files not in index"
-msgstr ""
+msgstr "без предупреждения при липсващи файлове и файлове не в индекса"
 
-#: builtin/checkout-index.c:192
+#: builtin/checkout-index.c:193
 msgid "don't checkout new files"
-msgstr ""
+msgstr "без изтегляне на нови файлове"
 
-#: builtin/checkout-index.c:194
+#: builtin/checkout-index.c:195
 msgid "update stat information in the index file"
 msgstr "обновяване на информацията получена чрез „stat“ за файловете в индекса"
 
-#: builtin/checkout-index.c:200
+#: builtin/checkout-index.c:201
 msgid "read list of paths from the standard input"
-msgstr ""
+msgstr "изчитане на пътищата от стандартния вход"
 
-#: builtin/checkout-index.c:202
+#: builtin/checkout-index.c:203
 msgid "write the content to temporary files"
-msgstr ""
+msgstr "записване на съдържанието във временни файлове"
 
-#: builtin/checkout-index.c:203 builtin/column.c:30
+#: builtin/checkout-index.c:204 builtin/column.c:30
 msgid "string"
-msgstr ""
+msgstr "НИЗ"
 
-#: builtin/checkout-index.c:204
+#: builtin/checkout-index.c:205
 msgid "when creating files, prepend <string>"
-msgstr ""
+msgstr "при създаването на нови файлове да се добавя префикса НИЗ"
 
-#: builtin/checkout-index.c:207
+#: builtin/checkout-index.c:208
 msgid "copy out the files from named stage"
-msgstr ""
+msgstr "копиране на файловете от това състояние на сливане"
 
 #: builtin/checkout.c:25
 msgid "git checkout [options] <branch>"
-msgstr "git checkout [ОПЦИИ] КЛОН"
+msgstr "git checkout [ОПЦИЯ…] КЛОН"
 
 #: builtin/checkout.c:26
 msgid "git checkout [options] [<branch>] -- <file>..."
-msgstr "git checkout [ОПЦИИ] [КЛОН] -- ФАЙЛ…"
+msgstr "git checkout [ОПЦИЯ…] [КЛОН] -- ФАЙЛ…"
 
 #: builtin/checkout.c:114 builtin/checkout.c:147
 #, c-format
@@ -3390,67 +3603,67 @@
 msgid "Unable to add merge result for '%s'"
 msgstr "Резултатът за „%s“ не може да бъде слян"
 
-#: builtin/checkout.c:232 builtin/checkout.c:235 builtin/checkout.c:238
-#: builtin/checkout.c:241
+#: builtin/checkout.c:231 builtin/checkout.c:234 builtin/checkout.c:237
+#: builtin/checkout.c:240
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "Опцията „%s“ е несъвместима с обновяването на пътища"
 
-#: builtin/checkout.c:244 builtin/checkout.c:247
+#: builtin/checkout.c:243 builtin/checkout.c:246
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "Опцията „%s“ е несъвместима с „%s“"
 
-#: builtin/checkout.c:250
+#: builtin/checkout.c:249
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
 "Невъзможно е едновременно да обновявате пътища и да се прехвърлите към клона "
 "„%s“."
 
-#: builtin/checkout.c:261 builtin/checkout.c:450
+#: builtin/checkout.c:260 builtin/checkout.c:449
 msgid "corrupt index file"
 msgstr "повреден файл на индекса"
 
-#: builtin/checkout.c:321 builtin/checkout.c:328
+#: builtin/checkout.c:320 builtin/checkout.c:327
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "пътят „%s“ не е слят"
 
-#: builtin/checkout.c:472
+#: builtin/checkout.c:471
 msgid "you need to resolve your current index first"
 msgstr "първо трябва да коригирате индекса си"
 
-#: builtin/checkout.c:593
+#: builtin/checkout.c:597
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr "Журналът на указателите за „%s“ не може да бъде създаден\n"
 
-#: builtin/checkout.c:631
+#: builtin/checkout.c:635
 msgid "HEAD is now at"
 msgstr "Указателят „HEAD“ в момента сочи към"
 
-#: builtin/checkout.c:638
+#: builtin/checkout.c:642
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Зануляване на клона „%s“\n"
 
-#: builtin/checkout.c:641
+#: builtin/checkout.c:645
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Вече сте на „%s“\n"
 
-#: builtin/checkout.c:645
+#: builtin/checkout.c:649
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Преминаване към клона „%s“ и зануляване на промените\n"
 
-#: builtin/checkout.c:647 builtin/checkout.c:1032
+#: builtin/checkout.c:651 builtin/checkout.c:1032
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Преминахте към новия клон „%s“\n"
 
-#: builtin/checkout.c:649
+#: builtin/checkout.c:653
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Преминахте към клона „%s“\n"
@@ -3491,9 +3704,8 @@
 " git branch new_branch_name %s\n"
 "\n"
 msgstr ""
-"Ако все пак искате да ги запазите, сега вероятно е най-подходящият момент "
-"да\n"
-"създадете нов клон с тях чрез командата:\n"
+"Ако все пак искате да запазите тези промени, сега е най-подходящият\n"
+"момент да създадете нов клон за тях чрез командата:\n"
 "\n"
 " git branch ИМЕ_НА_НОВИЯ_КЛОН %s\n"
 "\n"
@@ -3547,7 +3759,7 @@
 "За да преминете към клон, подайте указател, който сочи към подаване. „%s“ не "
 "е такъв"
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:89
 #: builtin/remote.c:159 builtin/remote.c:161
 msgid "branch"
 msgstr "клон"
@@ -3596,11 +3808,11 @@
 msgid "perform a 3-way merge with the new branch"
 msgstr "извършване на тройно сливане с новия клон"
 
-#: builtin/checkout.c:1105 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:226
 msgid "update ignored files (default)"
 msgstr "обновяване на игнорираните файлове (стандартно)"
 
-#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
+#: builtin/checkout.c:1106 builtin/log.c:1239 parse-options.h:245
 msgid "style"
 msgstr "стил"
 
@@ -3626,15 +3838,15 @@
 msgid "--track needs a branch name"
 msgstr "опцията „--track“ изисква име на клон"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1157
 msgid "Missing branch name; try -b"
 msgstr "Липсва име на клон, използвайте опцията „-b“"
 
-#: builtin/checkout.c:1196
+#: builtin/checkout.c:1194
 msgid "invalid path specification"
 msgstr "указан е неправилен път"
 
-#: builtin/checkout.c:1203
+#: builtin/checkout.c:1201
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3643,49 +3855,48 @@
 "Не можете едновременно да обновявате пътища и да преминете към клона „%s“.\n"
 "Дали не искате да изтеглите „%s“, който не сочи към подаване?"
 
-#: builtin/checkout.c:1208
+#: builtin/checkout.c:1206
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: опцията „--detach“ не приема аргумент-път „%s“"
 
-#: builtin/checkout.c:1212
+#: builtin/checkout.c:1210
 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"
-"с изтегляне от индекса."
+"git checkout: опциите „--ours“/„--theirs“, „--force“ и „--merge“\n"
+"са несъвместими с изтегляне от индекса."
 
 #: builtin/clean.c:26
 msgid ""
 "git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
-msgstr ""
+msgstr "git clean [-d] [-f] [-i] [-n] [-q] [-e ШАБЛОН] [-x | -X] [--] ПЪТ…"
 
 #: builtin/clean.c:30
 #, c-format
 msgid "Removing %s\n"
-msgstr ""
+msgstr "Изтриване на „%s“\n"
 
 #: builtin/clean.c:31
 #, c-format
 msgid "Would remove %s\n"
-msgstr ""
+msgstr "Файлът „%s“ ще бъде изтрит\n"
 
 #: builtin/clean.c:32
 #, c-format
 msgid "Skipping repository %s\n"
-msgstr ""
+msgstr "Прескачане на хранилището „%s“\n"
 
 #: builtin/clean.c:33
 #, c-format
 msgid "Would skip repository %s\n"
-msgstr ""
+msgstr "Хранилището „%s“ ще бъде прескочено\n"
 
 #: builtin/clean.c:34
 #, c-format
 msgid "failed to remove %s"
-msgstr ""
+msgstr "файлът „%s“ не може да бъде изтрит"
 
 #: builtin/clean.c:295
 msgid ""
@@ -3694,6 +3905,10 @@
 "foo        - select item based on unique prefix\n"
 "           - (empty) select nothing"
 msgstr ""
+"Подсказка:\n"
+"1          — избор на обект според реда\n"
+"ПРЕФИКС    — избор на единствен обект по този уникален префикс\n"
+"           — (празно) нищо да не се избира"
 
 #: builtin/clean.c:299
 msgid ""
@@ -3706,36 +3921,47 @@
 "*          - choose all items\n"
 "           - (empty) finish selecting"
 msgstr ""
+"Подсказка:\n"
+"1          — избор на един обект\n"
+"3-5        — интервал за избор на обекти\n"
+"2-3,6-9    — множество интервали за избор на обекти\n"
+"ПРЕФИКС    — избор на единствен обект по този уникален префикс\n"
+"-…         — отмяна на избора на обекти\n"
+"*          — избиране на всички обекти\n"
+"           — (празно) завършване на избирането"
 
+# FIXME WTF does this mean
 #: builtin/clean.c:517
 #, c-format
 msgid "Huh (%s)?"
-msgstr ""
+msgstr "Неправилен избор (%s). Изберете отново."
 
-#: builtin/clean.c:660
+# FIXME - should we use >> or sth else
+#: builtin/clean.c:659
 #, c-format
 msgid "Input ignore patterns>> "
-msgstr ""
+msgstr "Шаблони за игнорирани елементи≫ "
 
-#: builtin/clean.c:697
+#: builtin/clean.c:696
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
-msgstr ""
+msgstr "ПРЕДУПРЕЖДЕНИЕ: Никой обект не напасва на „%s“"
 
-#: builtin/clean.c:718
+#: builtin/clean.c:717
 msgid "Select items to delete"
-msgstr ""
+msgstr "Избиране на обекти за изтриване"
 
-#: builtin/clean.c:758
+#: builtin/clean.c:757
 #, c-format
 msgid "remove %s? "
-msgstr ""
+msgstr "Да се изтрие ли „%s“? "
 
-#: builtin/clean.c:783
+# FIXME improve message
+#: builtin/clean.c:782
 msgid "Bye."
-msgstr ""
+msgstr "Изход."
 
-#: builtin/clean.c:791
+#: builtin/clean.c:790
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -3745,216 +3971,235 @@
 "help                - this screen\n"
 "?                   - help for prompt selection"
 msgstr ""
+"clean               — начало на изчистването\n"
+"filter by pattern   — шаблон за обекти, които да не се трият\n"
+"select by numbers   — номера на обекти, които да се трият\n"
+"ask each            — потвърждаване на всяко изтриване (подобно на „rm -i“)\n"
+"quit                — край на изчистването\n"
+"help                — този край\n"
+"?                   — подсказка за шаблоните"
 
 # FIXME how many ***
-#: builtin/clean.c:818
+#: builtin/clean.c:817
 msgid "*** Commands ***"
 msgstr "●●● Команди ●●●"
 
-#: builtin/clean.c:819
+# FIXME improve message
+#: builtin/clean.c:818
 msgid "What now"
-msgstr ""
+msgstr "Избор на следващо действие"
 
-#: builtin/clean.c:827
+#: builtin/clean.c:826
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Следният обект ще бъде изтрит:"
+msgstr[1] "Следните обекти ще бъдат изтрити:"
 
-#: builtin/clean.c:844
+#: builtin/clean.c:843
 msgid "No more files to clean, exiting."
-msgstr ""
+msgstr "Файловете за изчистване свършиха. Изход от програмата."
 
-#: builtin/clean.c:875
+#: builtin/clean.c:874
 msgid "do not print names of files removed"
-msgstr ""
+msgstr "без извеждане на имената на файловете, които ще бъдат изтрити"
+
+#: builtin/clean.c:876
+msgid "force"
+msgstr "принудително изтриване"
 
 #: builtin/clean.c:877
-msgid "force"
-msgstr ""
-
-#: builtin/clean.c:878
 msgid "interactive cleaning"
-msgstr ""
+msgstr "интерактивно изтриване"
 
-#: builtin/clean.c:880
+#: builtin/clean.c:879
 msgid "remove whole directories"
-msgstr ""
+msgstr "изтриване на цели директории"
 
-#: builtin/clean.c:881 builtin/describe.c:415 builtin/grep.c:716
-#: builtin/ls-files.c:486 builtin/name-rev.c:314 builtin/show-ref.c:185
+#: builtin/clean.c:880 builtin/describe.c:407 builtin/grep.c:714
+#: builtin/ls-files.c:486 builtin/name-rev.c:311 builtin/show-ref.c:185
 msgid "pattern"
 msgstr "шаблон"
 
-#: builtin/clean.c:882
+#: builtin/clean.c:881
 msgid "add <pattern> to ignore rules"
-msgstr ""
+msgstr "добавяне на ШАБЛОН от файлове, които да не се трият"
 
-#: builtin/clean.c:883
+#: builtin/clean.c:882
 msgid "remove ignored files, too"
-msgstr ""
+msgstr "изтриване и на игнорираните файлове"
 
-#: builtin/clean.c:885
+#: builtin/clean.c:884
 msgid "remove only ignored files"
-msgstr ""
+msgstr "изтриване само на игнорирани файлове"
 
-#: builtin/clean.c:903
+#: builtin/clean.c:902
 msgid "-x and -X cannot be used together"
-msgstr ""
+msgstr "опциите „-x“ и „-X“ са несъвместими"
 
-#: builtin/clean.c:907
+#: builtin/clean.c:906
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
 msgstr ""
+"Настройката „clean.requireForce“ е зададена като истина, което изисква някоя "
+"от опциите „-i“, „-n“ или „-f“. Няма да се извърши изчистване"
 
-#: builtin/clean.c:910
+#: builtin/clean.c:909
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
 msgstr ""
+"Настройката „clean.requireForce“ не е зададена, но стандартно е истина, "
+"което изисква някоя от опциите „-i“, „-n“ или „-f“. Няма да се извърши "
+"изчистване"
 
-#: builtin/clone.c:36
+#: builtin/clone.c:37
 msgid "git clone [options] [--] <repo> [<dir>]"
-msgstr "git clone [ОПЦИИ] [--] ХРАНИЛИЩЕ [ДИРЕКТОРИЯ]"
+msgstr "git clone [ОПЦИЯ…] [--] ХРАНИЛИЩЕ [ДИРЕКТОРИЯ]"
 
-#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:504
+#: builtin/clone.c:65 builtin/fetch.c:112 builtin/merge.c:223
+#: builtin/push.c:514
 msgid "force progress reporting"
 msgstr "извеждане на напредъка"
 
-#: builtin/clone.c:66
+#: builtin/clone.c:67
 msgid "don't create a checkout"
 msgstr "без създаване на работно дърво"
 
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
+#: builtin/clone.c:68 builtin/clone.c:70 builtin/init-db.c:488
 msgid "create a bare repository"
 msgstr "създаване на голо хранилище"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:72
 msgid "create a mirror repository (implies bare)"
-msgstr "създаване на хранилище-огледало (това включва хранилището да е голо)"
+msgstr ""
+"създаване на хранилище-огледало (включва опцията „--bare“ за голо хранилище)"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:74
 msgid "to clone from a local repository"
 msgstr "клониране от локално хранилище"
 
-#: builtin/clone.c:75
+#: builtin/clone.c:76
 msgid "don't use local hardlinks, always copy"
 msgstr "без твърди връзки, файловете винаги да се копират"
 
-#: builtin/clone.c:77
+#: builtin/clone.c:78
 msgid "setup as shared repository"
 msgstr "настройване за споделено хранилище"
 
-#: builtin/clone.c:79 builtin/clone.c:81
+#: builtin/clone.c:80 builtin/clone.c:82
 msgid "initialize submodules in the clone"
 msgstr "инициализиране на подмодулите при това клониране"
 
-#: builtin/clone.c:82 builtin/init-db.c:483
+#: builtin/clone.c:83 builtin/init-db.c:485
 msgid "template-directory"
 msgstr "директория с шаблони"
 
-#: builtin/clone.c:83 builtin/init-db.c:484
+#: builtin/clone.c:84 builtin/init-db.c:486
 msgid "directory from which templates will be used"
 msgstr "директория, която съдържа шаблоните, които да се ползват"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:86
 msgid "reference repository"
 msgstr "еталонно хранилище"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44
 msgid "name"
 msgstr "ИМЕ"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:88
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "използване на това ИМЕ вместо „origin“ при проследяване на клони"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:90
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "изтегляне на този КЛОН, а не соченият от отдалечения указател „HEAD“"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:92
 msgid "path to git-upload-pack on the remote"
 msgstr "път към командата „git-upload-pack“ на отдалеченото хранилище"
 
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
+#: builtin/clone.c:93 builtin/fetch.c:113 builtin/grep.c:659
 msgid "depth"
 msgstr "ДЪЛБОЧИНА"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:94
 msgid "create a shallow clone of that depth"
 msgstr "плитко клониране до тази ДЪЛБОЧИНА"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:96
 msgid "clone only one branch, HEAD or --branch"
 msgstr ""
 "клониране само на един клон — или сочения от отдалечения „HEAD“, или изрично "
 "зададения с „--branch“"
 
-#: builtin/clone.c:96 builtin/init-db.c:492
+#: builtin/clone.c:97 builtin/init-db.c:494
 msgid "gitdir"
 msgstr "СЛУЖЕБНА_ДИРЕКТОРИЯ"
 
-#: builtin/clone.c:97 builtin/init-db.c:493
+#: builtin/clone.c:98 builtin/init-db.c:495
 msgid "separate git dir from working tree"
 msgstr "отделна СЛУЖЕБНА_ДИРЕКТОРИЯ за git извън работното дърво"
 
-#: builtin/clone.c:98
+#: builtin/clone.c:99
 msgid "key=value"
 msgstr "КЛЮЧ=СТОЙНОСТ"
 
-#: builtin/clone.c:99
+#: builtin/clone.c:100
 msgid "set config inside the new repository"
 msgstr "задаване на настройките на новото хранилище"
 
-#: builtin/clone.c:252
+#: builtin/clone.c:253
 #, c-format
 msgid "reference repository '%s' is not a local repository."
 msgstr "еталонното хранилище „%s“ не е локално"
 
-#: builtin/clone.c:256
+#: builtin/clone.c:257
 #, c-format
 msgid "reference repository '%s' is shallow"
 msgstr "еталонното хранилище „%s“ е плитко"
 
-#: builtin/clone.c:259
+#: builtin/clone.c:260
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr "еталонното хранилище „%s“ е с присаждане"
 
-#: builtin/clone.c:321
+#: builtin/clone.c:322
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr "директорията „%s“ не може да бъде създадена"
 
-#: builtin/clone.c:323 builtin/diff.c:83
+#: builtin/clone.c:324 builtin/diff.c:84
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "не може да бъде получена информация чрез „stat“ за „%s“"
 
-#: builtin/clone.c:325
+#: builtin/clone.c:326
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "„%s“ съществува и не е директория"
 
-#: builtin/clone.c:339
+#: builtin/clone.c:340
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "не може да бъде получена информация чрез „stat“ за „%s“\n"
 
-#: builtin/clone.c:361
+#: builtin/clone.c:357
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "неуспешно изтриване на „%s“"
+
+#: builtin/clone.c:362
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "връзката „%s“ не може да бъде създадена"
 
-#: builtin/clone.c:365
+#: builtin/clone.c:366
 #, c-format
 msgid "failed to copy file to '%s'"
-msgstr "файлът не можа да бъде копиран като „%s“"
+msgstr "файлът не може да бъде копиран като „%s“"
 
-#: builtin/clone.c:388 builtin/clone.c:565
+#: builtin/clone.c:389 builtin/clone.c:563
 #, c-format
 msgid "done.\n"
 msgstr "действието завърши.\n"
@@ -3970,29 +4215,30 @@
 "клон в момента са изтеглени с командата „git status“. Можете да\n"
 "завършите изтеглянето на клона с командата „git checkout -f HEAD“.\n"
 
-#: builtin/clone.c:480
+#: builtin/clone.c:478
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr ""
-"Клонът „%s“ от отдалеченото хранилище което клонирате,\n"
-"който следва да бъде изтеглен, не съществува."
+"Клонът „%s“ от отдалеченото хранилище, което клонирате,\n"
+"и който следва да бъде изтеглен, не съществува."
 
-#: builtin/clone.c:560
+# FIXME translator note that the space at end is necesssary
+#: builtin/clone.c:558
 #, c-format
 msgid "Checking connectivity... "
-msgstr "Проверка на връзката…"
+msgstr "Проверка на връзката… "
 
-#: builtin/clone.c:563
+#: builtin/clone.c:561
 msgid "remote did not send all necessary objects"
 msgstr "отдалеченото хранилище не изпрати всички необходими обекти."
 
-#: builtin/clone.c:626
+#: builtin/clone.c:625
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 "указателят „HEAD“ от отдалеченото хранилище сочи към нещо,\n"
 "което не съществува. Не може да се изтегли определен клон.\n"
 
-#: builtin/clone.c:657
+#: builtin/clone.c:656
 msgid "unable to checkout working tree"
 msgstr "работното дърво не може да бъде подготвено"
 
@@ -4018,110 +4264,138 @@
 msgid "repository '%s' does not exist"
 msgstr "не съществува хранилище „%s“"
 
-#: builtin/clone.c:802
+#: builtin/clone.c:802 builtin/fetch.c:1155
+#, c-format
+msgid "depth %s is not a positive number"
+msgstr "дълбочината трябва да е положително цяло число, а не „%s“"
+
+#: builtin/clone.c:812
+#, c-format
+msgid "destination path '%s' already exists and is not an empty directory."
+msgstr "целевият път „%s“ съществува и не е празна директория."
+
+#: builtin/clone.c:822
+#, c-format
+msgid "working tree '%s' already exists."
+msgstr "в „%s“ вече съществува работно дърво."
+
+#: builtin/clone.c:835 builtin/clone.c:847
+#, c-format
+msgid "could not create leading directories of '%s'"
+msgstr "родителските директории на „%s“ не могат да бъдат създадени"
+
+#: builtin/clone.c:838
+#, c-format
+msgid "could not create work tree dir '%s'."
+msgstr "работното дърво в „%s“ не може да бъде създадено."
+
+#: builtin/clone.c:857
+#, c-format
+msgid "Cloning into bare repository '%s'...\n"
+msgstr "Клониране и създаване на голо хранилище в „%s“…\n"
+
+#: builtin/clone.c:859
+#, c-format
+msgid "Cloning into '%s'...\n"
+msgstr "Клониране и създаване на хранилище в „%s“…\n"
+
+#: builtin/clone.c:895
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr ""
 "При локално клониране опцията „--depth“ се игнорира. Ползвайте схемата "
 "„file://“."
 
-#: builtin/clone.c:805
+#: builtin/clone.c:898
 msgid "source repository is shallow, ignoring --local"
 msgstr "клонираното хранилище е плитко, затова опцията „--local“ се игнорира"
 
-#: builtin/clone.c:810
+#: builtin/clone.c:903
 msgid "--local is ignored"
 msgstr "опцията „--local“ се игнорира"
 
-#: builtin/clone.c:814 builtin/fetch.c:1119
-#, c-format
-msgid "depth %s is not a positive number"
-msgstr "дълбочината трябва да е положително цяло число, а не „%s“"
-
-#: builtin/clone.c:824
-#, c-format
-msgid "destination path '%s' already exists and is not an empty directory."
-msgstr "целевият път „%s“ съществува и не е празна директория."
-
-#: builtin/clone.c:834
-#, c-format
-msgid "working tree '%s' already exists."
-msgstr "в „%s“ вече съществува работно дърво."
-
-#: builtin/clone.c:847 builtin/clone.c:859
-#, c-format
-msgid "could not create leading directories of '%s'"
-msgstr "родителските директории на „%s“ не могат да бъдат създадени"
-
-#: builtin/clone.c:850
-#, c-format
-msgid "could not create work tree dir '%s'."
-msgstr "работното дърво в „%s“ не може да бъде създадено."
-
-#: builtin/clone.c:869
-#, c-format
-msgid "Cloning into bare repository '%s'...\n"
-msgstr "Клониране и създаване на голо хранилище в „%s“…\n"
-
-#: builtin/clone.c:871
-#, c-format
-msgid "Cloning into '%s'...\n"
-msgstr "Клониране и създаване на хранилище в „%s“…\n"
-
-#: builtin/clone.c:906
+#: builtin/clone.c:907
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Не се поддържа клониране на връзки от вида „%s“ "
 
-#: builtin/clone.c:957 builtin/clone.c:965
+#: builtin/clone.c:958 builtin/clone.c:966
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Отдалеченият клон „%s“ липсва в клонираното хранилище „%s“"
 
-#: builtin/clone.c:968
+#: builtin/clone.c:969
 msgid "You appear to have cloned an empty repository."
 msgstr "Изглежда клонирахте празно хранилище."
 
 #: builtin/column.c:9
 msgid "git column [options]"
-msgstr ""
+msgstr "git column [ОПЦИЯ…]"
 
 #: builtin/column.c:26
 msgid "lookup config vars"
-msgstr ""
+msgstr "извеждане на настройките"
 
 #: builtin/column.c:27 builtin/column.c:28
 msgid "layout to use"
-msgstr ""
+msgstr "как да се подреди резултата"
 
 #: builtin/column.c:29
 msgid "Maximum width"
-msgstr ""
+msgstr "Максимална широчина"
 
 #: builtin/column.c:30
 msgid "Padding space on left border"
-msgstr ""
+msgstr "Поле в знаци отляво"
 
 #: builtin/column.c:31
 msgid "Padding space on right border"
-msgstr ""
+msgstr "Поле в знаци отдясно"
 
 #: builtin/column.c:32
 msgid "Padding space between columns"
-msgstr ""
+msgstr "Поле в знаци между колоните"
 
 #: builtin/column.c:51
 msgid "--command must be the first argument"
-msgstr ""
+msgstr "опцията „--command“ трябва да е първият аргумент"
 
-#: builtin/commit.c:36
+#: builtin/commit.c:37
 msgid "git commit [options] [--] <pathspec>..."
-msgstr "git commit [ОПЦИИ] [--] ПЪТ…"
+msgstr "git commit [ОПЦИЯ…] [--] ПЪТ…"
 
-#: builtin/commit.c:41
+#: builtin/commit.c:42
 msgid "git status [options] [--] <pathspec>..."
-msgstr "git status [ОПЦИИ] [--] ПЪТ…"
+msgstr "git status [ОПЦИЯ…] [--] ПЪТ…"
 
-#: builtin/commit.c:46
+#: builtin/commit.c:47
+msgid ""
+"Your name and email address were configured automatically based\n"
+"on your username and hostname. Please check that they are accurate.\n"
+"You can suppress this message by setting them explicitly. Run the\n"
+"following command and follow the instructions in your editor to edit\n"
+"your configuration file:\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"After doing this, you may fix the identity used for this commit with:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+msgstr ""
+"Името и адресът за е-поща са настроени автоматично на базата на името на\n"
+"потребителя и името на машината. Проверете дали са верни. Можете да спрете\n"
+"това съобщение като изрично зададете стойностите. Изпълнете следната "
+"команда\n"
+"и следвайте инструкциите в текстовия ви редактор, за да редактирате\n"
+"конфигурационния файл:\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"След като направите това, можете да коригирате информацията за автора на\n"
+"текущото подаване чрез:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+
+#: builtin/commit.c:60
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4146,7 +4420,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:58
+#: builtin/commit.c:72
 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"
@@ -4158,7 +4432,7 @@
 "с опцията „--allow-empty“, или да го изтриете от историята с командата:\n"
 "„git reset HEAD^“.\n"
 
-#: builtin/commit.c:63
+#: builtin/commit.c:77
 msgid ""
 "The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
 "If you wish to commit it anyway, use:\n"
@@ -4173,11 +4447,11 @@
 "    git commit --allow-empty\n"
 "\n"
 
-#: builtin/commit.c:70
+#: builtin/commit.c:84
 msgid "Otherwise, please use 'git reset'\n"
 msgstr "В противен случай използвайте командата „git reset“\n"
 
-#: builtin/commit.c:73
+#: builtin/commit.c:87
 msgid ""
 "If you wish to skip this commit, use:\n"
 "\n"
@@ -4193,94 +4467,120 @@
 "Чрез командата „git cherry-pick --continue“ ще продължите отбирането на\n"
 "останалите подавания.\n"
 
-#: builtin/commit.c:288
+#: builtin/commit.c:302
 msgid "failed to unpack HEAD tree object"
-msgstr "неуспешно изваждана на върховото дърво (HEAD tree object) от пакет"
+msgstr "върховото дърво (HEAD tree object) не може да бъде извадено от пакет"
 
-#: builtin/commit.c:330
+#: builtin/commit.c:342
 msgid "unable to create temporary index"
-msgstr "неуспешно създаване на временен индекс"
+msgstr "временният индекс не може да бъде създаден"
 
-#: builtin/commit.c:336
+#: builtin/commit.c:348
 msgid "interactive add failed"
 msgstr "неуспешно интерактивно добавяне"
 
-#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
-msgid "unable to write new_index file"
-msgstr "неуспешен запис на новия индекс"
+#: builtin/commit.c:359
+msgid "unable to write index file"
+msgstr "индексът не може да бъде записан"
 
-#: builtin/commit.c:421
+#: builtin/commit.c:361
+msgid "unable to update temporary index"
+msgstr "временният индекс не може да бъде обновен"
+
+#: builtin/commit.c:363
+msgid "Failed to update main cache tree"
+msgstr "Дървото на основния кеш не може да бъде обновено"
+
+#: builtin/commit.c:387 builtin/commit.c:412 builtin/commit.c:461
+msgid "unable to write new_index file"
+msgstr "новият индекс не може да бъде записан"
+
+#: builtin/commit.c:443
 msgid "cannot do a partial commit during a merge."
 msgstr "по време на сливане не може да се извърши частично подаване."
 
-#: builtin/commit.c:423
+#: builtin/commit.c:445
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "по време на отбиране не може да се извърши частично подаване."
 
-#: builtin/commit.c:433
+#: builtin/commit.c:454
 msgid "cannot read the index"
 msgstr "индексът не може да бъде прочетен"
 
-#: builtin/commit.c:453
+#: builtin/commit.c:473
 msgid "unable to write temporary index file"
 msgstr "временният индекс не може да бъде записан"
 
-#: builtin/commit.c:544 builtin/commit.c:550
+#: builtin/commit.c:592
 #, c-format
-msgid "invalid commit: %s"
-msgstr "неправилно подаване: %s"
+msgid "commit '%s' lacks author header"
+msgstr "заглавната част за автор в подаването „%s“ липсва"
 
-#: builtin/commit.c:572
+#: builtin/commit.c:594
+#, c-format
+msgid "commit '%s' has malformed author line"
+msgstr "заглавната част за автор в подаването „%s“ е неправилна"
+
+#: builtin/commit.c:613
 msgid "malformed --author parameter"
 msgstr "неправилен параметър към опцията „--author“"
 
-#: builtin/commit.c:592
+#: builtin/commit.c:621
+#, c-format
+msgid "invalid date format: %s"
+msgstr "неправилен формат на дата: %s"
+
+#: builtin/commit.c:642
 #, c-format
 msgid "Malformed ident string: '%s'"
 msgstr "Неправилен низ за идентичност: „%s“"
 
-#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
+#: builtin/commit.c:675
+msgid ""
+"unable to select a comment character that is not used\n"
+"in the current commit message"
+msgstr ""
+"не може да се избере знак за коментар — в текущото съобщение за подаване са "
+"използвани всички подобни знаци"
+
+#: builtin/commit.c:712 builtin/commit.c:745 builtin/commit.c:1120
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "следното подаване не може да бъде открито: %s"
 
-#: builtin/commit.c:641 builtin/shortlog.c:273
+#: builtin/commit.c:724 builtin/shortlog.c:273
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(изчитане на съобщението за подаване от стандартния вход)\n"
 
-#: builtin/commit.c:643
+#: builtin/commit.c:726
 msgid "could not read log from standard input"
 msgstr "съобщението за подаване не бе прочетено стандартния вход"
 
-#: builtin/commit.c:647
+#: builtin/commit.c:730
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "файлът със съобщението за подаване „%s“ не може да бъде прочетен"
 
-#: builtin/commit.c:654
-msgid "commit has empty message"
-msgstr "подаване с празно съобщение"
-
-#: builtin/commit.c:670
+#: builtin/commit.c:752
 msgid "could not read MERGE_MSG"
 msgstr "съобщението за сливане MERGE_MSG не може да бъде прочетено"
 
-#: builtin/commit.c:674
+#: builtin/commit.c:756
 msgid "could not read SQUASH_MSG"
 msgstr "съобщението за смачкване SQUASH_MSG не може да бъде прочетено"
 
-#: builtin/commit.c:678
+#: builtin/commit.c:760
 #, c-format
 msgid "could not read '%s'"
 msgstr "файлът „%s“ не може да бъде прочетен"
 
-#: builtin/commit.c:749
+#: builtin/commit.c:831
 msgid "could not write commit template"
 msgstr "шаблонът за подаване не може да бъде запазен"
 
 # FIXME
-#: builtin/commit.c:764
+#: builtin/commit.c:849
 #, c-format
 msgid ""
 "\n"
@@ -4296,7 +4596,7 @@
 "и опитайте отново.\n"
 
 # FIXME
-#: builtin/commit.c:769
+#: builtin/commit.c:854
 #, c-format
 msgid ""
 "\n"
@@ -4312,16 +4612,16 @@
 "  %s\n"
 "и опитайте отново.\n"
 
-#: builtin/commit.c:782
+#: builtin/commit.c:867
 #, 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"
+"с „%c“, ще бъдат пропуснати, а празно съобщение преустановява подаването.\n"
 
-#: builtin/commit.c:789
+#: builtin/commit.c:874
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4329,154 +4629,161 @@
 "An empty message aborts the commit.\n"
 msgstr ""
 "Въведете съобщението за подаване на промените. Редовете, които започват\n"
-"с „%c“ НЯМА да бъдат филтрирани, може да ги изтриете вие. Празно \n"
-"съобщение отменя подаването.\n"
+"с „%c“, също ще бъдат включени — може да ги изтриете вие. Празно \n"
+"съобщение преустановява подаването.\n"
 
-#: builtin/commit.c:802
+#: builtin/commit.c:888
 #, c-format
-msgid "%sAuthor:    %s"
-msgstr "%sАвтор:    %s"
+msgid "%sAuthor:    %.*s <%.*s>"
+msgstr "%sАвтор:   %.*s <%.*s>"
 
-#: builtin/commit.c:809
+#: builtin/commit.c:896
 #, c-format
-msgid "%sCommitter: %s"
-msgstr "%sПодаващ: %s"
+msgid "%sDate:      %s"
+msgstr "%sДата:    %s"
 
-#: builtin/commit.c:829
+#: builtin/commit.c:903
+#, c-format
+msgid "%sCommitter: %.*s <%.*s>"
+msgstr "%sПодаващ: %.*s <%.*s>"
+
+#: builtin/commit.c:921
 msgid "Cannot read index"
 msgstr "Индексът не може да бъде прочетен"
 
-#: builtin/commit.c:872
+#: builtin/commit.c:978
 msgid "Error building trees"
 msgstr "Грешка при изграждане на дърветата"
 
-#: builtin/commit.c:887 builtin/tag.c:391
+#: builtin/commit.c:993 builtin/tag.c:495
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Подайте съобщението с някоя от опциите „-m“ или „-F“.\n"
 
-#: builtin/commit.c:989
+#: builtin/commit.c:1095
 #, c-format
 msgid "No existing author found with '%s'"
 msgstr "Не е открит автор с име „%s“."
 
-#: builtin/commit.c:1004 builtin/commit.c:1244
+#: builtin/commit.c:1110 builtin/commit.c:1350
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Неправилна стойност за неследените файлове: „%s“"
 
-#: builtin/commit.c:1041
+#: builtin/commit.c:1147
 msgid "--long and -z are incompatible"
 msgstr "Опциите „--long“ и „-z“ са несъвместими."
 
-#: builtin/commit.c:1071
+#: builtin/commit.c:1177
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "Опциите „--reset-author“ и „--author“ са несъвместими."
 
-#: builtin/commit.c:1080
+#: builtin/commit.c:1186
 msgid "You have nothing to amend."
 msgstr "Няма какво да бъде поправено."
 
-#: builtin/commit.c:1083
+#: builtin/commit.c:1189
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "В момента се извършва сливане, не можете да поправяте."
 
-#: builtin/commit.c:1085
+#: builtin/commit.c:1191
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "В момента се извършва отбиране на подаване, не можете да поправяте."
 
-#: builtin/commit.c:1088
+#: builtin/commit.c:1194
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Опциите „--squash“ и „--fixup“ са несъвместими."
 
-#: builtin/commit.c:1098
+#: builtin/commit.c:1204
 msgid "Only one of -c/-C/-F/--fixup can be used."
-msgstr ""
-"Можете да използвате само една от опциите „-c“, „-C“, „-F“ и „--fixup“."
+msgstr "Опциите „-c“, „-C“, „-F“ и „--fixup““ са несъвместими."
 
-#: builtin/commit.c:1100
+#: builtin/commit.c:1206
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "Опцията „-m“ е несъвместима с „-c“, „-C“, „-F“ и „--fixup“."
 
-#: builtin/commit.c:1108
+#: builtin/commit.c:1214
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr ""
 "Опцията „--reset-author“ може да се използва само заедно с „-C“, „-c“ или\n"
 "„--amend“."
 
-#: builtin/commit.c:1125
+#: builtin/commit.c:1231
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 "Опциите „--include“, „--only“, „--all“, „--interactive“ и „--patch“ са\n"
 "несъвместими."
 
-#: builtin/commit.c:1127
+#: builtin/commit.c:1233
 msgid "No paths with --include/--only does not make sense."
 msgstr "Опциите „--include“ и „--only“ изискват аргументи."
 
 # FIXME bad message
-#: builtin/commit.c:1129
+#: builtin/commit.c:1235
 msgid "Clever... amending the last one with dirty index."
 msgstr ""
-"Поправяте последното подаване докато индекса има проблеми. Това е лоша идея."
+"Чудесно сте се сетили как да поправите съобщението на последното подаване "
+"при\n"
+"променен индекс. Споделете и с друг потребител трика с „git commit --amend -"
+"o“."
 
-#: builtin/commit.c:1131
+#: builtin/commit.c:1237
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr ""
 "Зададени са изрични пътища без опциите „-i“ или „-o“. Приема се, че все едно "
 "сте\n"
 "ползвали опцията „--only“ с ПЪТища…"
 
-#: builtin/commit.c:1143 builtin/tag.c:639
+#: builtin/commit.c:1249 builtin/tag.c:728
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Несъществуващ режим на изчистване „%s“"
 
-#: builtin/commit.c:1148
+#: builtin/commit.c:1254
 msgid "Paths with -a does not make sense."
-msgstr "Използването на пътища е несъвместимо със задаването на опцията „-a“."
+msgstr "Опцията „-a“ е несъвместима със задаването на пътища."
 
-#: builtin/commit.c:1258 builtin/commit.c:1516
+#: builtin/commit.c:1364 builtin/commit.c:1644
 msgid "show status concisely"
 msgstr "кратка информация за състоянието"
 
-#: builtin/commit.c:1260 builtin/commit.c:1518
+#: builtin/commit.c:1366 builtin/commit.c:1646
 msgid "show branch information"
 msgstr "информация за клоните"
 
-#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
+#: builtin/commit.c:1368 builtin/commit.c:1648 builtin/push.c:500
 msgid "machine-readable output"
 msgstr "формат на изхода за четене от програма"
 
-#: builtin/commit.c:1265 builtin/commit.c:1522
+#: builtin/commit.c:1371 builtin/commit.c:1650
 msgid "show status in long format (default)"
 msgstr "подробна информация за състоянието (стандартно)"
 
-#: builtin/commit.c:1268 builtin/commit.c:1525
+#: builtin/commit.c:1374 builtin/commit.c:1653
 msgid "terminate entries with NUL"
 msgstr "разделяне на елементите с нулевия знак „NUL“"
 
-#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:514
+#: builtin/commit.c:1376 builtin/commit.c:1656 builtin/fast-export.c:980
+#: builtin/fast-export.c:983 builtin/tag.c:603
 msgid "mode"
 msgstr "режим"
 
-#: builtin/commit.c:1271 builtin/commit.c:1528
+#: builtin/commit.c:1377 builtin/commit.c:1656
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 "извеждане на неследените файлове. Възможните режими са „all“ (подробна\n"
 "информация), „normal“ (кратка информация), „no“ (без неследените файлове).\n"
 "Стандартният режим е: „all“."
 
-#: builtin/commit.c:1274
+#: builtin/commit.c:1380
 msgid "show ignored files"
 msgstr "извеждане на игнорираните файлове"
 
-#: builtin/commit.c:1275 parse-options.h:153
+#: builtin/commit.c:1381 parse-options.h:153
 msgid "when"
 msgstr "кога"
 
-#: builtin/commit.c:1276
+#: builtin/commit.c:1382
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -4485,233 +4792,225 @@
 "една от\n"
 "„all“ (всички), „dirty“ (тези с неподадени промени), „untracked“ (неследени)"
 
-#: builtin/commit.c:1278
+#: builtin/commit.c:1384
 msgid "list untracked files in columns"
 msgstr "извеждане на неследените файлове в колони"
 
-#: builtin/commit.c:1347
+#: builtin/commit.c:1471
 msgid "couldn't look up newly created commit"
 msgstr "току що създаденото подаване не може да бъде открито"
 
-#: builtin/commit.c:1349
+#: builtin/commit.c:1473
 msgid "could not parse newly created commit"
 msgstr "току що създаденото подаване не може да бъде анализирано"
 
-#: builtin/commit.c:1390
+#: builtin/commit.c:1518
 msgid "detached HEAD"
-msgstr "несвързан връх HEAD"
+msgstr "несвързан връх „HEAD“"
 
-#: builtin/commit.c:1392
+#: builtin/commit.c:1521
 msgid " (root-commit)"
 msgstr " (начално подаване)"
 
-#: builtin/commit.c:1486
+#: builtin/commit.c:1614
 msgid "suppress summary after successful commit"
 msgstr "без информация след успешно подаване"
 
-#: builtin/commit.c:1487
+#: builtin/commit.c:1615
 msgid "show diff in commit message template"
 msgstr "добавяне на разликата към шаблона за съобщението при подаване"
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1617
 msgid "Commit message options"
 msgstr "Опции за съобщението при подаване"
 
-#: builtin/commit.c:1490 builtin/tag.c:512
+#: builtin/commit.c:1618 builtin/tag.c:601
 msgid "read message from file"
-msgstr "взимане та съобщението от файл"
+msgstr "взимане на съобщението от файл"
 
-#: builtin/commit.c:1491
+#: builtin/commit.c:1619
 msgid "author"
 msgstr "автор"
 
-#: builtin/commit.c:1491
+#: builtin/commit.c:1619
 msgid "override author for commit"
 msgstr "задаване на автор за подаването"
 
-#: builtin/commit.c:1492 builtin/gc.c:272
+#: builtin/commit.c:1620 builtin/gc.c:275
 msgid "date"
 msgstr "дата"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1620
 msgid "override date for commit"
 msgstr "задаване на дата за подаването"
 
-#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
-#: builtin/notes.c:566 builtin/tag.c:510
+#: builtin/commit.c:1621 builtin/merge.c:217 builtin/notes.c:408
+#: builtin/notes.c:565 builtin/tag.c:599
 msgid "message"
 msgstr "съобщение"
 
-#: builtin/commit.c:1493
+#: builtin/commit.c:1621
 msgid "commit message"
 msgstr "съобщение при подаване"
 
-#: builtin/commit.c:1494
+#: builtin/commit.c:1622
 msgid "reuse and edit message from specified commit"
 msgstr "преизползване и редактиране на съобщението от указаното подаване"
 
-#: builtin/commit.c:1495
+#: builtin/commit.c:1623
 msgid "reuse message from specified commit"
 msgstr "преизползване на съобщението от указаното подаване"
 
-#: builtin/commit.c:1496
+#: builtin/commit.c:1624
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "използване на автоматичното съобщение при смачкване за вкарване на "
 "указаното\n"
 "подаване в предното без следа"
 
-#: builtin/commit.c:1497
+#: builtin/commit.c:1625
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "използване на автоматичното съобщение при смачкване за смачкване на "
 "указаното\n"
 "подаване в предното"
 
-#: builtin/commit.c:1498
+#: builtin/commit.c:1626
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr ""
 "смяна на автора да съвпада с подаващия (използва се с „-C“/„-c“/„--amend“)"
 
-#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1627 builtin/log.c:1191 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "добавяне на поле за подпис — „Signed-off-by:“"
 
-#: builtin/commit.c:1500
+#: builtin/commit.c:1628
 msgid "use specified template file"
 msgstr "използване на указания шаблонен файл"
 
-#: builtin/commit.c:1501
+#: builtin/commit.c:1629
 msgid "force edit of commit"
 msgstr "редактиране на подаване"
 
-#: builtin/commit.c:1502
+#: builtin/commit.c:1630
 msgid "default"
 msgstr "стандартно"
 
-#: builtin/commit.c:1502 builtin/tag.c:515
+#: builtin/commit.c:1630 builtin/tag.c:604
 msgid "how to strip spaces and #comments from message"
 msgstr "кои празни знаци и #коментари да се махат от съобщенията"
 
-#: builtin/commit.c:1503
+#: builtin/commit.c:1631
 msgid "include status in commit message template"
 msgstr "вмъкване на състоянието в шаблона за съобщението при подаване"
 
-#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
-#: builtin/tag.c:516
+#: builtin/commit.c:1632 builtin/merge.c:224 builtin/revert.c:92
+#: builtin/tag.c:605
 msgid "key-id"
 msgstr "ИДЕНТИФИКАТОР_НА_КЛЮЧ"
 
-#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
+#: builtin/commit.c:1633 builtin/merge.c:225 builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "подписване на подаването с GPG"
 
-#: builtin/commit.c:1508
+#: builtin/commit.c:1636
 msgid "Commit contents options"
 msgstr "Опции за избор на файлове при подаване"
 
-#: builtin/commit.c:1509
+#: builtin/commit.c:1637
 msgid "commit all changed files"
 msgstr "подаване на всички променени файлове"
 
-#: builtin/commit.c:1510
+#: builtin/commit.c:1638
 msgid "add specified files to index for commit"
 msgstr "добавяне на указаните файлове към индекса за подаване"
 
-#: builtin/commit.c:1511
+#: builtin/commit.c:1639
 msgid "interactively add files"
 msgstr "интерактивно добавяне на файлове"
 
-#: builtin/commit.c:1512
+#: builtin/commit.c:1640
 msgid "interactively add changes"
 msgstr "интерактивно добавяне на промени"
 
-#: builtin/commit.c:1513
+#: builtin/commit.c:1641
 msgid "commit only specified files"
 msgstr "подаване само на указаните файлове"
 
-#: builtin/commit.c:1514
+#: builtin/commit.c:1642
 msgid "bypass pre-commit hook"
 msgstr "без изпълнение на куката преди подаване (pre-commit)"
 
-#: builtin/commit.c:1515
+#: builtin/commit.c:1643
 msgid "show what would be committed"
 msgstr "отпечатване на това, което би било подадено"
 
-#: builtin/commit.c:1526
+#: builtin/commit.c:1654
 msgid "amend previous commit"
 msgstr "поправяне на предишното подаване"
 
-#: builtin/commit.c:1527
+#: builtin/commit.c:1655
 msgid "bypass post-rewrite hook"
 msgstr "без изпълнение на куката след презаписване (post-rewrite)"
 
-#: builtin/commit.c:1532
+#: builtin/commit.c:1660
 msgid "ok to record an empty change"
 msgstr "позволяване на празни подавания"
 
-#: builtin/commit.c:1534
+#: builtin/commit.c:1662
 msgid "ok to record a change with an empty message"
 msgstr "позволяване на подавания с празни съобщения"
 
-#: builtin/commit.c:1562
+#: builtin/commit.c:1691
 msgid "could not parse HEAD commit"
 msgstr "върховото подаване „HEAD“ не може да бъде прочетено"
 
-#: builtin/commit.c:1601 builtin/merge.c:518
+#: builtin/commit.c:1730 builtin/merge.c:518
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "файлът не може да бъде прочетен: „%s“"
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1737
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Повреден файл за върха за сливането „MERGE_HEAD“ (%s)"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1744
 msgid "could not read MERGE_MODE"
 msgstr "режимът на сливане „MERGE_MODE“ не може да бъде прочетен"
 
-#: builtin/commit.c:1634
+#: builtin/commit.c:1763
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "съобщението за подаване не може да бъде прочетено: %s"
 
-#: builtin/commit.c:1645
+#: builtin/commit.c:1774
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Неизвършване на подаване поради нередактирано съобщение.\n"
 
-#: builtin/commit.c:1650
+#: builtin/commit.c:1779
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Неизвършване на подаване поради празно съобщение.\n"
 
-#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
+#: builtin/commit.c:1794 builtin/merge.c:850 builtin/merge.c:875
 msgid "failed to write commit object"
 msgstr "обектът за подаването не може да бъде записан"
 
-#: builtin/commit.c:1686
-msgid "cannot lock HEAD ref"
-msgstr "указателят към върха „HEAD“ не може да бъде заключен"
-
-#: builtin/commit.c:1690
-msgid "cannot update HEAD ref"
-msgstr "указателят към върха „HEAD“ не може да бъде обновен"
-
-#: builtin/commit.c:1701
+#: builtin/commit.c:1827
 msgid ""
 "Repository has been updated, but unable to write\n"
-"new_index file. Check that disk is not full or quota is\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"
+"не е записан. Проверете дали дискът не е препълнен или не сте\n"
 "превишили дисковата си квота. След това изпълнете „git reset HEAD“."
 
 #: builtin/config.c:8
 msgid "git config [options]"
-msgstr "git config [ОПЦИИ]"
+msgstr "git config [ОПЦИЯ…]"
 
 #: builtin/config.c:53
 msgid "Config file location"
@@ -4804,12 +5103,11 @@
 
 #: builtin/config.c:72
 msgid "find the color configured: [default]"
-msgstr "извеждане на зададения цвят на настройката: [стандартно]"
+msgstr "извеждане на зададения цвят: [стандартно]"
 
 #: builtin/config.c:73
 msgid "find the color setting: [stdout-is-tty]"
-msgstr ""
-"извеждане на зададения цвят на настройката: [стандартният изход е терминал]"
+msgstr "извеждане на зададения цвят: [стандартният изход е терминал]"
 
 #: builtin/config.c:74
 msgid "Type"
@@ -4844,477 +5142,529 @@
 msgid "respect include directives on lookup"
 msgstr "при търсене да се уважат и директивите за включване"
 
-#: builtin/count-objects.c:82
+#: builtin/config.c:315
+msgid "unable to parse default color value"
+msgstr "неразпозната стойност на стандартния цвят"
+
+#: builtin/config.c:455
+#, c-format
+msgid ""
+"# This is Git's per-user configuration file.\n"
+"[core]\n"
+"# Please adapt and uncomment the following lines:\n"
+"#\tuser = %s\n"
+"#\temail = %s\n"
+msgstr ""
+"# Това е потребителският ви конфигурационен файл за Git.\n"
+"[core]\n"
+"# Проверете и разкоментирайте следните два реда:\n"
+"#\tuser = %s\n"
+"#\temail = %s\n"
+
+#: builtin/config.c:590
+#, c-format
+msgid "cannot create configuration file %s"
+msgstr "конфигурационният файл „%s“ не може да бъде създаден"
+
+#: builtin/count-objects.c:55
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:97
+#: builtin/count-objects.c:65
 msgid "print sizes in human readable format"
 msgstr "извеждане на размерите на обектите във формат лесно четим от хора"
 
 # FIXME ... instead of *???
-#: builtin/describe.c:16
-msgid "git describe [options] <commit-ish>*"
-msgstr "git describe [ОПЦИИ] указател към подаване…"
-
 #: builtin/describe.c:17
-msgid "git describe [options] --dirty"
-msgstr ""
+msgid "git describe [options] <commit-ish>*"
+msgstr "git describe [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ПОДАВАНЕ…"
 
-#: builtin/describe.c:225
+#: 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 ""
+msgstr "не съществува анотиран етикет „%s“"
 
-#: builtin/describe.c:229
+#: builtin/describe.c:221
 #, c-format
 msgid "annotated tag %s has no embedded name"
-msgstr ""
+msgstr "в анотирания етикет „%s“ липсва вградено име"
 
-#: builtin/describe.c:231
+#: builtin/describe.c:223
 #, c-format
 msgid "tag '%s' is really '%s' here"
-msgstr ""
+msgstr "етикетът „%s“ тук е всъщност „%s“"
 
-#: builtin/describe.c:258
+#: builtin/describe.c:250 builtin/log.c:452
 #, c-format
 msgid "Not a valid object name %s"
-msgstr ""
+msgstr "Неправилно име на обект „%s“"
 
-#: builtin/describe.c:261
+#: builtin/describe.c:253
 #, c-format
 msgid "%s is not a valid '%s' object"
-msgstr ""
+msgstr "„%s“ е неправилен обект „%s“"
 
-#: builtin/describe.c:278
+#: builtin/describe.c:270
 #, c-format
 msgid "no tag exactly matches '%s'"
-msgstr ""
+msgstr "никой етикет не напасва точно „%s“"
 
-#: builtin/describe.c:280
+#: builtin/describe.c:272
 #, c-format
 msgid "searching to describe %s\n"
-msgstr ""
+msgstr "търсене за описание на „%s“\n"
 
-#: builtin/describe.c:327
+#: builtin/describe.c:319
 #, c-format
 msgid "finished search at %s\n"
-msgstr ""
+msgstr "търсенето приключи при „%s“\n"
 
-#: builtin/describe.c:354
+#: 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:358
+#: 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:379
+# FIXME - plural
+#: builtin/describe.c:371
 #, c-format
 msgid "traversed %lu commits\n"
-msgstr ""
+msgstr "претърсени са %lu подавания\n"
 
-#: builtin/describe.c:382
+#: 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:404
+#: builtin/describe.c:396
 msgid "find the tag that comes after the commit"
-msgstr ""
+msgstr "откриване на етикета, който следва подаване"
 
-#: builtin/describe.c:405
+#: 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 "use any ref"
-msgstr ""
-
-#: builtin/describe.c:407
-msgid "use any tag, even unannotated"
-msgstr ""
-
-#: builtin/describe.c:408
-msgid "always use long format"
-msgstr ""
-
-#: builtin/describe.c:409
-msgid "only follow first parent"
-msgstr ""
-
-#: builtin/describe.c:412
-msgid "only output exact matches"
-msgstr ""
-
-#: builtin/describe.c:414
 msgid "consider <n> most recent tags (default: 10)"
 msgstr "да се търси само в този БРОЙ последни етикети (стандартно: 10)"
 
-#: builtin/describe.c:416
+#: builtin/describe.c:408
 msgid "only consider tags matching <pattern>"
-msgstr ""
+msgstr "да се търси само измежду етикетите напасващи този ШАБЛОН"
 
-#: builtin/describe.c:418 builtin/name-rev.c:321
+#: builtin/describe.c:410 builtin/name-rev.c:318
 msgid "show abbreviated commit object as fallback"
-msgstr ""
+msgstr "извеждане на съкратено име на обект като резервен вариант"
 
-#: builtin/describe.c:419
+#: builtin/describe.c:411
 msgid "mark"
-msgstr ""
+msgstr "МАРКЕР"
 
-#: builtin/describe.c:420
+#: builtin/describe.c:412
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
-msgstr ""
+msgstr "добавяне на такъв МАРКЕР на работното дърво (стандартно е „-dirty“)"
 
-#: builtin/describe.c:438
+#: builtin/describe.c:430
 msgid "--long is incompatible with --abbrev=0"
-msgstr ""
+msgstr "Опциите „--long“ и „--abbrev=0“ са несъвместими"
 
-#: builtin/describe.c:464
+#: builtin/describe.c:456
 msgid "No names found, cannot describe anything."
-msgstr ""
+msgstr "Не са открити имена — нищо не може да бъде описано."
 
-#: builtin/describe.c:484
+#: builtin/describe.c:476
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "опцията „--dirty“ е несъвместима с указател към подаване"
 
-#: builtin/diff.c:85
+#: builtin/diff.c:86
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "„%s“: не е нито обикновен файл, нито символна връзка"
 
-#: builtin/diff.c:236
+#: builtin/diff.c:237
 #, c-format
 msgid "invalid option: %s"
 msgstr "неправилна опция: %s"
 
-#: builtin/diff.c:357
+#: builtin/diff.c:358
 msgid "Not a git repository"
 msgstr "Не е хранилище на Git"
 
-#: builtin/diff.c:400
+#: builtin/diff.c:401
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "зададен е неправилен обект „%s“."
 
-#: builtin/diff.c:409
+#: builtin/diff.c:410
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "зададени са повече от 2 обекта: „%s“"
 
-#: builtin/diff.c:416
+#: builtin/diff.c:417
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "зададен е неподдържан обект „%s“."
 
-#: builtin/fast-export.c:22
+#: builtin/fast-export.c:24
 msgid "git fast-export [rev-list-opts]"
-msgstr ""
+msgstr "git fast-export [ОПЦИИ_ЗА_СПИСЪКА_С_ВЕРСИИ]"
 
-#: builtin/fast-export.c:673
+#: builtin/fast-export.c:979
 msgid "show progress after <n> objects"
-msgstr "съобщение за напредъка на всеки такъв БРОЙ обекта"
+msgstr "Съобщение за напредъка на всеки такъв БРОЙ обекта"
 
-#: builtin/fast-export.c:675
+#: builtin/fast-export.c:981
 msgid "select handling of signed tags"
-msgstr ""
+msgstr "Как да се обработват подписаните етикети"
 
-#: builtin/fast-export.c:678
+#: builtin/fast-export.c:984
 msgid "select handling of tags that tag filtered objects"
-msgstr ""
+msgstr "Как да се обработват етикетите на филтрираните обекти"
 
-#: builtin/fast-export.c:681
+#: builtin/fast-export.c:987
 msgid "Dump marks to this file"
-msgstr ""
+msgstr "Запазване на маркерите в този файл"
 
-#: builtin/fast-export.c:683
+#: builtin/fast-export.c:989
 msgid "Import marks from this file"
-msgstr ""
+msgstr "Внасяне на маркерите от този файл"
 
-#: builtin/fast-export.c:685
+#: builtin/fast-export.c:991
 msgid "Fake a tagger when tags lack one"
-msgstr ""
+msgstr "Да се използва изкуствено име на човек при липса на задаващ етикета"
 
-#: builtin/fast-export.c:687
+#: builtin/fast-export.c:993
 msgid "Output full tree for each commit"
-msgstr ""
+msgstr "Извеждане на цялото дърво за всяко подаване"
 
-#: builtin/fast-export.c:689
+#: builtin/fast-export.c:995
 msgid "Use the done feature to terminate the stream"
-msgstr ""
+msgstr "Използване на маркер за завършване на потока"
 
-#: builtin/fast-export.c:690
+#: builtin/fast-export.c:996
 msgid "Skip output of blob data"
-msgstr ""
+msgstr "Без извеждане на съдържанието на обектите BLOB"
+
+#: builtin/fast-export.c:997
+msgid "refspec"
+msgstr "указател на версия"
+
+#: builtin/fast-export.c:998
+msgid "Apply refspec to exported refs"
+msgstr "Прилагане на указателя на версия към изнесените указатели"
+
+#: builtin/fast-export.c:999
+msgid "anonymize output"
+msgstr "анонимизиране на извежданата информация"
 
 #: builtin/fetch.c:20
 msgid "git fetch [<options>] [<repository> [<refspec>...]]"
-msgstr "git fetch [ОПЦИИ] [ХРАНИЛИЩЕ [УКАЗАТЕЛ…]]"
+msgstr "git fetch [ОПЦИЯ…] [ХРАНИЛИЩЕ [УКАЗАТЕЛ…]]"
 
 #: builtin/fetch.c:21
 msgid "git fetch [<options>] <group>"
-msgstr "git fetch [ОПЦИИ] ГРУПА"
+msgstr "git fetch [ОПЦИЯ…] ГРУПА"
 
 #: builtin/fetch.c:22
 msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
-msgstr "git fetch --multiple [ОПЦИИ] [(ХРАНИЛИЩЕ | ГРУПА)…]"
+msgstr "git fetch --multiple [ОПЦИЯ…] [(ХРАНИЛИЩЕ | ГРУПА)…]"
 
 #: builtin/fetch.c:23
 msgid "git fetch --all [<options>]"
-msgstr "git fetch --all [ОПЦИИ]"
+msgstr "git fetch --all [ОПЦИЯ…]"
 
-#: builtin/fetch.c:75
+#: builtin/fetch.c:90
 msgid "fetch from all remotes"
 msgstr "доставяне от всички отдалечени хранилища"
 
-#: builtin/fetch.c:77
+#: builtin/fetch.c:92
 msgid "append to .git/FETCH_HEAD instead of overwriting"
-msgstr "добавяне към вместо замяна на „.git/FETCH_HEAD“"
+msgstr "добавяне към „.git/FETCH_HEAD“ вместо замяна"
 
-#: builtin/fetch.c:79
+#: builtin/fetch.c:94
 msgid "path to upload pack on remote end"
 msgstr "отдалечен път, където да се качи пакетът"
 
-#: builtin/fetch.c:80
+#: builtin/fetch.c:95
 msgid "force overwrite of local branch"
 msgstr "принудително презаписване на локалния клон"
 
-#: builtin/fetch.c:82
+#: builtin/fetch.c:97
 msgid "fetch from multiple remotes"
 msgstr "доставяне от множество отдалечени хранилища"
 
-#: builtin/fetch.c:84
+#: builtin/fetch.c:99
 msgid "fetch all tags and associated objects"
 msgstr "доставяне на всички етикети и принадлежащи обекти"
 
-#: builtin/fetch.c:86
+#: builtin/fetch.c:101
 msgid "do not fetch all tags (--no-tags)"
 msgstr "без доставянето на всички етикети „--no-tags“"
 
-#: builtin/fetch.c:88
+#: builtin/fetch.c:103
 msgid "prune remote-tracking branches no longer on remote"
-msgstr "окастряне на клоните следящи вече не съществуващи отдалечени клони"
+msgstr "окастряне на клоните следящи вече несъществуващи отдалечени клони"
 
-#: builtin/fetch.c:89
+#: builtin/fetch.c:104
 msgid "on-demand"
 msgstr "при нужда"
 
-#: builtin/fetch.c:90
+#: builtin/fetch.c:105
 msgid "control recursive fetching of submodules"
 msgstr "управление на рекурсивното доставяне на подмодулите"
 
-#: builtin/fetch.c:94
+#: builtin/fetch.c:109
 msgid "keep downloaded pack"
 msgstr "запазване на изтеглените пакети с обекти"
 
-#: builtin/fetch.c:96
+#: builtin/fetch.c:111
 msgid "allow updating of HEAD ref"
 msgstr "позволяване на обновяването на указателя „HEAD“"
 
-#: builtin/fetch.c:99
+#: builtin/fetch.c:114
 msgid "deepen history of shallow clone"
 msgstr "задълбочаване на историята на плитко хранилище"
 
-#: builtin/fetch.c:101
+#: builtin/fetch.c:116
 msgid "convert to a complete repository"
 msgstr "превръщане в пълно хранилище"
 
-#: builtin/fetch.c:103 builtin/log.c:1197
+#: builtin/fetch.c:118 builtin/log.c:1208
 msgid "dir"
 msgstr "директория"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:119
 msgid "prepend this to submodule path output"
 msgstr "добавяне на това пред пътя на подмодула"
 
-#: builtin/fetch.c:107
+#: builtin/fetch.c:122
 msgid "default mode for recursion"
 msgstr "стандартен режим на рекурсия"
 
-#: builtin/fetch.c:109
+#: builtin/fetch.c:124
 msgid "accept refs that update .git/shallow"
 msgstr "приемане на указатели, които обновяват „.git/shallow“"
 
-#: builtin/fetch.c:347
+#: builtin/fetch.c:125
+msgid "refmap"
+msgstr "карта с указатели"
+
+#: builtin/fetch.c:126
+msgid "specify fetch refmap"
+msgstr "указване на картата с указатели за доставяне"
+
+#: builtin/fetch.c:376
 msgid "Couldn't find remote ref HEAD"
 msgstr "Указателят „HEAD“ в отдалеченото хранилище не може да бъде открит"
 
-#: builtin/fetch.c:411
+#: builtin/fetch.c:454
 #, c-format
 msgid "object %s not found"
 msgstr "обектът „%s“ липсва"
 
-#: builtin/fetch.c:416
+#: builtin/fetch.c:459
 msgid "[up to date]"
 msgstr "[актуализиран]"
 
-# FIXME - the signs
-#: builtin/fetch.c:430
+#: builtin/fetch.c:473
 #, c-format
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
-msgstr "! %-*s %-*s -> %s  (в текущия клон не може да се доставя)"
+msgstr "! %-*s %-*s → %s  (в текущия клон не може да се доставя)"
 
-#: builtin/fetch.c:431 builtin/fetch.c:517
+#: builtin/fetch.c:474 builtin/fetch.c:560
 msgid "[rejected]"
 msgstr "[отхвърлен]"
 
-#: builtin/fetch.c:442
+#: builtin/fetch.c:485
 msgid "[tag update]"
 msgstr "[обновяване на етикетите]"
 
-#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497
+#: builtin/fetch.c:487 builtin/fetch.c:522 builtin/fetch.c:540
 msgid "  (unable to update local ref)"
 msgstr "  (локалните указатели не могат да бъдат обновени)"
 
-#: builtin/fetch.c:462
+#: builtin/fetch.c:505
 msgid "[new tag]"
 msgstr "[нов етикет]"
 
-#: builtin/fetch.c:465
+#: builtin/fetch.c:508
 msgid "[new branch]"
 msgstr "[нов клон]"
 
-#: builtin/fetch.c:468
+#: builtin/fetch.c:511
 msgid "[new ref]"
 msgstr "[нов указател]"
 
-#: builtin/fetch.c:513
+#: builtin/fetch.c:556
 msgid "unable to update local ref"
 msgstr "локален указател не може да бъде обновен"
 
-#: builtin/fetch.c:513
+#: builtin/fetch.c:556
 msgid "forced update"
 msgstr "принудително обновяване"
 
-#: builtin/fetch.c:519
+#: builtin/fetch.c:562
 msgid "(non-fast-forward)"
 msgstr "(сливането не е тривиално)"
 
-#: builtin/fetch.c:552 builtin/fetch.c:785
+#: builtin/fetch.c:595 builtin/fetch.c:828
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "файлът „%s“ не може да бъде отворен: %s\n"
 
-#: builtin/fetch.c:561
+#: builtin/fetch.c:604
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "хранилището „%s“ не изпрати всички необходими обекти\n"
 
-#: builtin/fetch.c:579
+#: builtin/fetch.c:622
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 "отхвърляне на върха „%s“, защото плитките хранилища не могат да бъдат "
 "обновявани"
 
-#: builtin/fetch.c:667 builtin/fetch.c:750
+#: builtin/fetch.c:710 builtin/fetch.c:793
 #, c-format
 msgid "From %.*s\n"
 msgstr "От %.*s\n"
 
-#: builtin/fetch.c:678
+# FIXME - is the space necessary
+#: builtin/fetch.c:721
 #, 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“, за да премахнете остарелите клони, които "
+"„git remote prune %s“, за да премахнете остарелите клони, които\n"
 "предизвикват конфликта"
 
-#: builtin/fetch.c:730
+#: builtin/fetch.c:773
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (обектът „%s“ ще се окаже извън клон)"
 
-#: builtin/fetch.c:731
+#: builtin/fetch.c:774
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (обектът „%s“ вече е извън клон)"
 
-#: builtin/fetch.c:755
+#: builtin/fetch.c:798
 msgid "[deleted]"
 msgstr "[изтрит]"
 
-#: builtin/fetch.c:756 builtin/remote.c:1050
+#: builtin/fetch.c:799 builtin/remote.c:1063
 msgid "(none)"
 msgstr "(нищо)"
 
-#: builtin/fetch.c:775
+#: builtin/fetch.c:818
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
-msgstr ""
-"Не може да изтегляте в текущия клон „%s“, на хранилище, което не е голо"
+msgstr "Не може да изтегляте в текущия клон „%s“ на хранилище, което не е голо"
 
-#: builtin/fetch.c:794
+#: builtin/fetch.c:837
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "Стойността „%2$s“ за опцията „%1$s“ не е съвместима с „%3$s“"
 
-#: builtin/fetch.c:797
+#: builtin/fetch.c:840
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Опцията „%s“ се игнорира при „%s“\n"
 
-#: builtin/fetch.c:853
+#: builtin/fetch.c:896
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Не се поддържа доставяне от „%s“"
 
-#: builtin/fetch.c:1015
+#: builtin/fetch.c:1058
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Доставяне на „%s“\n"
 
-#: builtin/fetch.c:1017 builtin/remote.c:90
+#: builtin/fetch.c:1060 builtin/remote.c:90
 #, c-format
 msgid "Could not fetch %s"
 msgstr "„%s“ не може да се достави"
 
-#: builtin/fetch.c:1035
+#: builtin/fetch.c:1078
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
 msgstr ""
 "Не сте указали отдалечено хранилище. Задайте или адрес, или име\n"
-"на отдалечено хранилище, от където да се доставят новите версии."
+"на отдалечено хранилище, откъдето да се доставят новите версии."
 
-#: builtin/fetch.c:1059
+#: builtin/fetch.c:1101
 msgid "You need to specify a tag name."
 msgstr "Трябва да укажете име на етикет."
 
-#: builtin/fetch.c:1107
+#: builtin/fetch.c:1143
 msgid "--depth and --unshallow cannot be used together"
 msgstr "опциите „--depth“ и „--unshallow“ са несъвместими"
 
-#: builtin/fetch.c:1109
+#: builtin/fetch.c:1145
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "не можете да използвате опцията „--unshallow“ върху пълно хранилище"
 
-#: builtin/fetch.c:1132
+#: builtin/fetch.c:1168
 msgid "fetch --all does not take a repository argument"
-msgstr "към „git fetch --all“ не можете да добавите хранилище аргумент"
+msgstr "към „git fetch --all“ не можете да добавите аргумент — хранилище"
 
-#: builtin/fetch.c:1134
+#: builtin/fetch.c:1170
 msgid "fetch --all does not make sense with refspecs"
 msgstr ""
-"към „git fetch --all“ не можете да добавите указател на версия за аргумент"
+"към „git fetch --all“ не можете да добавите аргумент — указател на версия"
 
-#: builtin/fetch.c:1145
+#: builtin/fetch.c:1181
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Няма нито отдалечено хранилище, нито група от хранилища на име „%s“"
 
-#: builtin/fetch.c:1153
+#: builtin/fetch.c:1189
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Указването на група и указването на версия са несъвместими"
 
@@ -5322,9 +5672,9 @@
 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:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700
-#: builtin/merge.c:196 builtin/repack.c:175 builtin/repack.c:179
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:501
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:698
+#: builtin/merge.c:197 builtin/repack.c:179 builtin/repack.c:183
+#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:590
 #: parse-options.h:132 parse-options.h:239
 msgid "n"
 msgstr "БРОЙ"
@@ -5351,154 +5701,159 @@
 msgid "file to read from"
 msgstr "файл, от който да се чете"
 
-#: builtin/for-each-ref.c:1063
+#: builtin/for-each-ref.c:676
+msgid "unable to parse format"
+msgstr "форматът не може да бъде анализиран"
+
+#: builtin/for-each-ref.c:1057
 msgid "git for-each-ref [options] [<pattern>]"
-msgstr ""
+msgstr "git for-each-ref [ОПЦИЯ…] [ШАБЛОН]"
+
+#: builtin/for-each-ref.c:1072
+msgid "quote placeholders suitably for shells"
+msgstr "цитиране подходящо за командни интерпретатори на обвивката"
+
+#: builtin/for-each-ref.c:1074
+msgid "quote placeholders suitably for perl"
+msgstr "цитиране подходящо за perl"
+
+#: builtin/for-each-ref.c:1076
+msgid "quote placeholders suitably for python"
+msgstr "цитиране подходящо за python"
 
 #: builtin/for-each-ref.c:1078
-msgid "quote placeholders suitably for shells"
-msgstr ""
-
-#: builtin/for-each-ref.c:1080
-msgid "quote placeholders suitably for perl"
-msgstr ""
-
-#: builtin/for-each-ref.c:1082
-msgid "quote placeholders suitably for python"
-msgstr ""
-
-#: builtin/for-each-ref.c:1084
 msgid "quote placeholders suitably for tcl"
-msgstr ""
+msgstr "цитиране подходящо за tcl"
 
-#: builtin/for-each-ref.c:1087
+#: builtin/for-each-ref.c:1081
 msgid "show only <n> matched refs"
 msgstr "извеждане само на този БРОЙ напаснати указатели"
 
-#: builtin/for-each-ref.c:1088 builtin/replace.c:177
+#: builtin/for-each-ref.c:1082 builtin/replace.c:438
 msgid "format"
 msgstr "ФОРМАТ"
 
-#: builtin/for-each-ref.c:1088
+#: builtin/for-each-ref.c:1082
 msgid "format to use for the output"
 msgstr "ФОРМАТ за изхода"
 
-#: builtin/for-each-ref.c:1089
+#: builtin/for-each-ref.c:1083
 msgid "key"
-msgstr ""
+msgstr "ключ"
 
-#: builtin/for-each-ref.c:1090
+#: builtin/for-each-ref.c:1084
 msgid "field name to sort on"
-msgstr ""
+msgstr "име на полето, по което да е подредбата"
 
-#: builtin/fsck.c:147 builtin/prune.c:172
+#: builtin/fsck.c:147 builtin/prune.c:136
 msgid "Checking connectivity"
 msgstr "Проверка на връзката"
 
-#: builtin/fsck.c:544
+#: builtin/fsck.c:540
 msgid "Checking object directories"
 msgstr "Проверка на директориите с обекти"
 
-#: builtin/fsck.c:607
+#: builtin/fsck.c:603
 msgid "git fsck [options] [<object>...]"
-msgstr "git fsck [ОПЦИИ] [ОБЕКТ…]"
+msgstr "git fsck [ОПЦИЯ…] [ОБЕКТ…]"
 
-#: builtin/fsck.c:613
+#: builtin/fsck.c:609
 msgid "show unreachable objects"
 msgstr "показване на недостижимите обекти"
 
-#: builtin/fsck.c:614
+#: builtin/fsck.c:610
 msgid "show dangling objects"
 msgstr "показване на обектите извън клоните"
 
-#: builtin/fsck.c:615
+#: builtin/fsck.c:611
 msgid "report tags"
 msgstr "показване на етикетите"
 
-#: builtin/fsck.c:616
+#: builtin/fsck.c:612
 msgid "report root nodes"
 msgstr "показване на кореновите възли"
 
-#: builtin/fsck.c:617
+#: builtin/fsck.c:613
 msgid "make index objects head nodes"
 msgstr "задаване на обекти от индекса да са коренови"
 
 # FIXME bad message
-#: builtin/fsck.c:618
+#: builtin/fsck.c:614
 msgid "make reflogs head nodes (default)"
 msgstr "проследяване на указателите от журнала като глави (стандартно)"
 
-#: builtin/fsck.c:619
+#: builtin/fsck.c:615
 msgid "also consider packs and alternate objects"
 msgstr "допълнително да се проверяват пакетите и алтернативните обекти"
 
-#: builtin/fsck.c:620
+#: builtin/fsck.c:616
 msgid "enable more strict checking"
 msgstr "по-строги проверки"
 
-#: builtin/fsck.c:622
+#: builtin/fsck.c:618
 msgid "write dangling objects in .git/lost-found"
 msgstr "запазване на обектите извън клоните в директорията „.git/lost-found“"
 
-#: builtin/fsck.c:623 builtin/prune.c:144
+#: builtin/fsck.c:619 builtin/prune.c:108
 msgid "show progress"
 msgstr "показване на напредъка"
 
-#: builtin/fsck.c:673
+#: builtin/fsck.c:669
 msgid "Checking objects"
 msgstr "Проверка на обектите"
 
+# FIXME plural with ...
 #: builtin/gc.c:24
 msgid "git gc [options]"
-msgstr "git gc [ОПЦИИ]"
+msgstr "git gc [ОПЦИЯ…]"
 
-#: builtin/gc.c:90
+#: builtin/gc.c:79
 #, c-format
-msgid "Invalid %s: '%s'"
-msgstr "Неправилна стойност за „%s“: „%s“"
+msgid "Invalid gc.pruneexpire: '%s'"
+msgstr "Неправилна стойност за настройката „gc.pruneexpire“: %s"
 
-#: builtin/gc.c:117
+#: builtin/gc.c:107
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "прекалено дълга директория с обекти „%.*s“"
 
-#: builtin/gc.c:273
+#: builtin/gc.c:276
 msgid "prune unreferenced objects"
 msgstr "окастряне на обектите, към които нищо не сочи"
 
-#: builtin/gc.c:275
+#: builtin/gc.c:278
 msgid "be more thorough (increased runtime)"
 msgstr "изчерпателно търсене на боклука (за сметка на повече време работа)"
 
-#: builtin/gc.c:276
+#: builtin/gc.c:279
 msgid "enable auto-gc mode"
 msgstr "включване на автоматичното събиране на боклука (auto-gc)"
 
-#: builtin/gc.c:277
+#: builtin/gc.c:280
 msgid "force running gc even if there may be another gc running"
 msgstr ""
 "изрично стартиране на събирането на боклука, дори и ако вече работи друго "
 "събиране"
 
-#: builtin/gc.c:318
+#: builtin/gc.c:321
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
 "Автоматично пакетиране на заден фон на хранилището за по-добра "
 "производителност.\n"
 
-#: builtin/gc.c:320
+#: builtin/gc.c:323
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "Автоматично пакетиране на хранилището за по-добра производителност.\n"
 
-#: builtin/gc.c:321
+#: builtin/gc.c:324
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr ""
 "Вижте ръководството за повече информация как да изпълните „git help gc“.\n"
 
-#: builtin/gc.c:336
+#: builtin/gc.c:342
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5507,292 +5862,296 @@
 "процеса: %<PRIuMAX> (ако сте сигурни, че това не е вярно, това използвайте\n"
 "опцията „--force“)"
 
-#: builtin/gc.c:361
+#: builtin/gc.c:364
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
-"Има прекалено много недостижими, непакетирани обекти. Използвайте „git "
-"prune“, за да\n"
-"ги окастрите."
+"Има прекалено много недостижими, непакетирани обекти.\n"
+"Използвайте „git prune“, за да ги окастрите."
 
+# FIXME plural ... options
 #: builtin/grep.c:23
 msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]"
-msgstr "git grep [ОПЦИИ] [-e] ШАБЛОН [ВЕРСИЯ…] [[--] ПЪТ…]"
+msgstr "git grep [ОПЦИЯ…] [-e] ШАБЛОН [ВЕРСИЯ…] [[--] ПЪТ…]"
 
 #: builtin/grep.c:218
 #, c-format
 msgid "grep: failed to create thread: %s"
 msgstr "grep: неуспешно създаване на нишка: %s"
 
-#: builtin/grep.c:365
-#, c-format
-msgid "Failed to chdir: %s"
-msgstr "Неуспешна смяна на директория: %s"
-
-#: builtin/grep.c:443 builtin/grep.c:478
+#: builtin/grep.c:441 builtin/grep.c:476
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "дървото не може да бъде прочетено (%s)"
 
-#: builtin/grep.c:493
+#: builtin/grep.c:491
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "не може да се изпълни „grep“ от обект от вида %s"
 
-#: builtin/grep.c:549
+#: builtin/grep.c:547
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "опцията „%c“ очаква число за аргумент"
 
-#: builtin/grep.c:566
+#: builtin/grep.c:564
 #, c-format
 msgid "cannot open '%s'"
 msgstr "„%s“ не може да бъде отворен"
 
-#: builtin/grep.c:640
+#: builtin/grep.c:638
 msgid "search in index instead of in the work tree"
 msgstr "търсене в индекса, а не в работното дърво"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:640
 msgid "find in contents not managed by git"
 msgstr "търсене и във файловете, които не са под управлението на git"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:642
 msgid "search in both tracked and untracked files"
 msgstr "търсене и в следените, и в неследените файлове"
 
-#: builtin/grep.c:646
+#: builtin/grep.c:644
 msgid "search also in ignored files"
 msgstr "търсене и в игнорираните файлове"
 
-#: builtin/grep.c:649
+#: builtin/grep.c:647
 msgid "show non-matching lines"
 msgstr "извеждане на редовете, които не съвпадат"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:649
 msgid "case insensitive matching"
 msgstr "без значение на регистъра на буквите (главни/малки)"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:651
 msgid "match patterns only at word boundaries"
 msgstr "напасване на шаблоните само по границите на думите"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:653
 msgid "process binary files as text"
 msgstr "обработване на двоичните файлове като текстови"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:655
 msgid "don't match patterns in binary files"
 msgstr "прескачане на двоичните файлове"
 
-#: builtin/grep.c:660
+#: builtin/grep.c:658
 msgid "process binary files with textconv filters"
 msgstr ""
 "обработване на двоичните файлове чрез филтри за преобразуване към текст"
 
-#: builtin/grep.c:662
+#: builtin/grep.c:660
 msgid "descend at most <depth> levels"
 msgstr "навлизане максимално на тази ДЪЛБОЧИНА в дървото"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:664
 msgid "use extended POSIX regular expressions"
 msgstr "разширени регулярни изрази по POSIX"
 
-#: builtin/grep.c:669
+#: builtin/grep.c:667
 msgid "use basic POSIX regular expressions (default)"
 msgstr "основни регулярни изрази по POSIX (стандартно)"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:670
 msgid "interpret patterns as fixed strings"
 msgstr "шаблоните са дословни низове"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:673
 msgid "use Perl-compatible regular expressions"
 msgstr "регулярни изрази на Perl"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:676
 msgid "show line numbers"
 msgstr "извеждане на номерата на редовете"
 
-#: builtin/grep.c:679
+#: builtin/grep.c:677
 msgid "don't show filenames"
 msgstr "без извеждане на имената на файловете"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:678
 msgid "show filenames"
 msgstr "извеждане на имената на файловете"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:680
 msgid "show filenames relative to top directory"
 msgstr ""
 "извеждане на относителните имена на файловете спрямо основната директория на "
 "хранилището"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:682
 msgid "show only filenames instead of matching lines"
 msgstr "извеждане само на имената на файловете без напасващите редове"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:684
 msgid "synonym for --files-with-matches"
 msgstr "синоним на „--files-with-matches“"
 
-#: builtin/grep.c:689
+#: builtin/grep.c:687
 msgid "show only the names of files without match"
 msgstr ""
 "извеждане само на имената на файловете, които не съдържат ред, напасващ на "
 "шаблона"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:689
 msgid "print NUL after filenames"
 msgstr "извеждане на нулевия знак „NUL“ след всяко име на файл"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:691
 msgid "show the number of matches instead of matching lines"
 msgstr "извеждане на броя на съвпаденията вместо напасващите редове"
 
-#: builtin/grep.c:694
+#: builtin/grep.c:692
 msgid "highlight matches"
 msgstr "оцветяване на напасванията"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:694
 msgid "print empty line between matches from different files"
 msgstr "извеждане на празен ред между напасванията от различни файлове"
 
-#: builtin/grep.c:698
+#: builtin/grep.c:696
 msgid "show filename only once above matches from same file"
 msgstr ""
 "извеждане на името на файла само веднъж за всички напасвания от този файл"
 
-#: builtin/grep.c:701
+#: builtin/grep.c:699
 msgid "show <n> context lines before and after matches"
 msgstr "извеждане на такъв БРОЙ редове преди и след напасванията"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:702
 msgid "show <n> context lines before matches"
 msgstr "извеждане на такъв БРОЙ редове преди напасванията"
 
-#: builtin/grep.c:706
+#: builtin/grep.c:704
 msgid "show <n> context lines after matches"
 msgstr "извеждане на такъв БРОЙ редове след напасванията"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:705
 msgid "shortcut for -C NUM"
 msgstr "синоним на „-C БРОЙ“"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:708
 msgid "show a line with the function name before matches"
 msgstr "извеждане на ред с името на функцията, в която е напаснат шаблона"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:710
 msgid "show the surrounding function"
 msgstr "извеждане на обхващащата функция"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:713
 msgid "read patterns from file"
 msgstr "изчитане на шаблоните от файл"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:715
 msgid "match <pattern>"
 msgstr "напасване на ШАБЛОН"
 
-#: builtin/grep.c:719
+#: builtin/grep.c:717
 msgid "combine patterns specified with -e"
 msgstr "комбиниране на шаблоните указани с опцията „-e“"
 
-#: builtin/grep.c:731
+#: builtin/grep.c:729
 msgid "indicate hit with exit status without output"
 msgstr ""
 "без извеждане на стандартния изход. Изходният код указва наличието на "
 "напасване"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:731
 msgid "show only matches from files that match all patterns"
 msgstr ""
 "извеждане на редове само от файловете, които напасват на всички шаблони"
 
-#: builtin/grep.c:735
+#: builtin/grep.c:733
 msgid "show parse tree for grep expression"
 msgstr "извеждане на дървото за анализ на регулярния израз"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:737
 msgid "pager"
-msgstr "програма за обхождане"
+msgstr "програма за преглед по страници"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:737
 msgid "show matching files in the pager"
-msgstr "извеждане на съвпадащите файлове в програма за обхождане"
+msgstr "извеждане на съвпадащите файлове в програма за преглед по страници"
 
-#: builtin/grep.c:742
+#: builtin/grep.c:740
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr ""
 "позволяване на стартирането на grep(1) (текущият компилат пренебрегва тази "
 "опция)"
 
-#: builtin/grep.c:743 builtin/show-ref.c:187
+#: builtin/grep.c:741 builtin/show-ref.c:187
 msgid "show usage"
 msgstr "извеждане на начина на употреба на командата"
 
-#: builtin/grep.c:810
+#: builtin/grep.c:808
 msgid "no pattern given."
 msgstr "липсва шаблон."
 
-#: builtin/grep.c:868
+#: builtin/grep.c:866
 msgid "--open-files-in-pager only works on the worktree"
 msgstr ""
 "опцията „--open-files-in-pager“ е съвместима само с търсене в работното дърво"
 
-#: builtin/grep.c:891
+#: builtin/grep.c:892
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "опциите „--cached“ и „--untracked“ са несъвместими с „--no-index“."
 
-#: builtin/grep.c:896
+#: builtin/grep.c:897
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr ""
 "опциите „--cached“ и „--untracked“ са несъвместими с търсене във версии."
 
-#: builtin/grep.c:899
+#: builtin/grep.c:900
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 "опциите „--(no-)exclude-standard“ са несъвместими с търсене по следени "
 "файлове."
 
-#: builtin/grep.c:907
+#: builtin/grep.c:908
 msgid "both --cached and trees are given."
 msgstr "опцията „--cached“ е несъвместима със задаване на дърво."
 
-#: builtin/hash-object.c:60
+#: builtin/hash-object.c:82
 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:61
+# FIXME - list of paths or path...
+#: builtin/hash-object.c:83
 msgid "git hash-object  --stdin-paths < <list-of-paths>"
-msgstr ""
+msgstr "git hash-object  --stdin-paths < ПЪТ…"
 
-#: builtin/hash-object.c:72 builtin/tag.c:521
+#: builtin/hash-object.c:94 builtin/tag.c:610
 msgid "type"
-msgstr ""
+msgstr "ВИД"
 
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:94
 msgid "object type"
-msgstr ""
+msgstr "вид на обекта"
 
-#: builtin/hash-object.c:73
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
-msgstr ""
+msgstr "записване на обекта в базата от данни за обектите"
 
-#: builtin/hash-object.c:74
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
-msgstr ""
+msgstr "изчитане на обекта от стандартния вход"
 
-#: builtin/hash-object.c:76
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
-msgstr ""
+msgstr "запазване на файла както е — без филтри"
 
-#: builtin/hash-object.c:77
-msgid "process file as it were from this path"
+#: builtin/hash-object.c:100
+msgid ""
+"just hash any random garbage to create corrupt objects for debugging Git"
 msgstr ""
+"създаване и хеширане на произволни данни за повредени обекти за трасиране на "
+"Git"
+
+#: builtin/hash-object.c:101
+msgid "process file as it were from this path"
+msgstr "обработване на файла все едно е с този път"
 
 #: builtin/help.c:41
 msgid "print all available commands"
@@ -5823,59 +6182,65 @@
 msgid "unrecognized help format '%s'"
 msgstr "непознат формат на помощта „%s“"
 
-#: builtin/help.c:92
+#: builtin/help.c:91
 msgid "Failed to start emacsclient."
 msgstr "Неуспешно стартиране на „emacsclient“."
 
-#: builtin/help.c:105
+#: builtin/help.c:104
 msgid "Failed to parse emacsclient version."
 msgstr "Версията на „emacsclient“ не може да се анализира."
 
-#: builtin/help.c:113
+#: builtin/help.c:112
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "Прекалено стара версия на „emacsclient“ — %d (< 22)."
 
-#: builtin/help.c:131 builtin/help.c:159 builtin/help.c:168 builtin/help.c:176
+#: builtin/help.c:130 builtin/help.c:158 builtin/help.c:167 builtin/help.c:175
 #, c-format
 msgid "failed to exec '%s': %s"
 msgstr "неуспешно изпълнение на „%s“: %s"
 
-#: builtin/help.c:216
+#: builtin/help.c:215
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
 "Please consider using 'man.<tool>.cmd' instead."
 msgstr ""
-"„%s“: път към неподдържана програма за разглеждане на\n"
+"„%s“: път към неподдържана програма за преглед на\n"
 " ръководството. Вместо нея пробвайте „man.<tool>.cmd“."
 
-#: builtin/help.c:228
+#: builtin/help.c:227
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
 "Please consider using 'man.<tool>.path' instead."
 msgstr ""
-"„%s“: команда за поддържана програма за разглеждане на\n"
+"„%s“: команда за поддържана програма за преглед на\n"
 " ръководството. Вместо нея пробвайте „man.<tool>.path“."
 
-#: builtin/help.c:353
+#: builtin/help.c:352
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "„%s“: непозната програма за преглед на ръководството."
 
-#: builtin/help.c:370
+#: builtin/help.c:369
 msgid "no man viewer handled the request"
-msgstr "никоя програма за ръководство не успя да обработи заявката"
+msgstr "никоя програма за преглед на ръководство не успя да обработи заявката"
 
-#: builtin/help.c:378
+#: builtin/help.c:377
 msgid "no info viewer handled the request"
-msgstr "никоя програма за информационни страници не успя да обработи заявката"
+msgstr ""
+"никоя програма за преглед на информационните страници не успя да обработи "
+"заявката"
 
-#: builtin/help.c:424
+#: builtin/help.c:423
 msgid "Defining attributes per path"
 msgstr "Указване на атрибути към път"
 
+#: builtin/help.c:424
+msgid "Everyday Git With 20 Commands Or So"
+msgstr "Ежедневието в Git в рамките на 20-ина команди"
+
 #: builtin/help.c:425
 msgid "A Git glossary"
 msgstr "Речник с термините на Git"
@@ -5914,367 +6279,400 @@
 msgid "`git %s' is aliased to `%s'"
 msgstr "„git %s“ е синоним на „%s“"
 
-#: builtin/index-pack.c:184
+# FIXME merge with next?
+#: builtin/index-pack.c:150
+#, c-format
+msgid "unable to open %s"
+msgstr "обектът „%s“ не може да бъде отворен"
+
+#: builtin/index-pack.c:200
 #, c-format
 msgid "object type mismatch at %s"
-msgstr ""
+msgstr "неправилен вид на обекта „%s“"
 
-#: builtin/index-pack.c:204
-msgid "object of unexpected type"
-msgstr ""
+#: builtin/index-pack.c:220
+#, c-format
+msgid "did not receive expected object %s"
+msgstr "очакваният обект „%s“ не бе получен"
 
-#: builtin/index-pack.c:244
+#: builtin/index-pack.c:223
+#, c-format
+msgid "object %s: expected type %s, found %s"
+msgstr "неправилен вид на обекта „%s“: очакваше се „%s“, а бе получен „%s“"
+
+#: builtin/index-pack.c:265
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "не може да се запълни %d байт"
+msgstr[1] "не може да се запълнят %d байта"
 
-#: builtin/index-pack.c:254
+#: builtin/index-pack.c:275
 msgid "early EOF"
-msgstr ""
+msgstr "неочакван край на файл"
 
-#: builtin/index-pack.c:255
+#: builtin/index-pack.c:276
 msgid "read error on input"
-msgstr ""
+msgstr "грешка при четене на входните данни"
 
-#: builtin/index-pack.c:267
+#: builtin/index-pack.c:288
 msgid "used more bytes than were available"
-msgstr ""
-
-#: builtin/index-pack.c:274
-msgid "pack too large for current definition of off_t"
-msgstr ""
-
-#: builtin/index-pack.c:290
-#, c-format
-msgid "unable to create '%s'"
-msgstr ""
+msgstr "използвани са повече от наличните байтове"
 
 #: builtin/index-pack.c:295
-#, c-format
-msgid "cannot open packfile '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:309
-msgid "pack signature mismatch"
-msgstr ""
+msgid "pack too large for current definition of off_t"
+msgstr "пакетният файл е прекалено голям за текущата стойност на типа „off_t“"
 
 #: builtin/index-pack.c:311
 #, c-format
-msgid "pack version %<PRIu32> unsupported"
-msgstr ""
+msgid "unable to create '%s'"
+msgstr "пакетният файл „%s“ не може да бъде създаден"
 
-#: builtin/index-pack.c:329
+#: builtin/index-pack.c:316
+#, c-format
+msgid "cannot open packfile '%s'"
+msgstr "пакетният файл „%s“ не може да бъде отворен"
+
+#: builtin/index-pack.c:330
+msgid "pack signature mismatch"
+msgstr "несъответствие в подписа към пакетния файл"
+
+#: builtin/index-pack.c:332
+#, c-format
+msgid "pack version %<PRIu32> unsupported"
+msgstr "не се поддържа пакетиране вeрсия „%<PRIu32>“"
+
+#: builtin/index-pack.c:350
 #, c-format
 msgid "pack has bad object at offset %lu: %s"
-msgstr ""
+msgstr "повреден обект в пакетния файл при отместване %lu: %s"
 
-#: builtin/index-pack.c:451
+#: builtin/index-pack.c:471
 #, c-format
 msgid "inflate returned %d"
-msgstr ""
+msgstr "декомпресирането с „inflate“ върна %d"
 
-#: builtin/index-pack.c:500
+#: builtin/index-pack.c:520
 msgid "offset value overflow for delta base object"
-msgstr ""
+msgstr "стойността на отместването за обекта-разлика води до препълване"
 
-#: builtin/index-pack.c:508
+#: builtin/index-pack.c:528
 msgid "delta base offset is out of bound"
-msgstr ""
+msgstr "стойността на отместването за обекта-разлика е извън диапазона"
 
-#: builtin/index-pack.c:516
+#: builtin/index-pack.c:536
 #, c-format
 msgid "unknown object type %d"
-msgstr ""
+msgstr "непознат вид обект %d"
 
-#: builtin/index-pack.c:547
+#: builtin/index-pack.c:567
 msgid "cannot pread pack file"
-msgstr ""
+msgstr "пакетният файл не може да бъде прочетен"
 
-#: builtin/index-pack.c:549
+#: builtin/index-pack.c:569
 #, c-format
 msgid "premature end of pack file, %lu byte missing"
 msgid_plural "premature end of pack file, %lu bytes missing"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "неочакван край на файл, липсва %lu байт"
+msgstr[1] "неочакван край на файл, липсват %lu байта"
 
-#: builtin/index-pack.c:575
+#: builtin/index-pack.c:595
 msgid "serious inflate inconsistency"
-msgstr ""
+msgstr "сериозна грешка при декомпресиране с „inflate“"
 
-#: builtin/index-pack.c:666 builtin/index-pack.c:672 builtin/index-pack.c:695
-#: builtin/index-pack.c:729 builtin/index-pack.c:738
+#: builtin/index-pack.c:686 builtin/index-pack.c:692 builtin/index-pack.c:715
+#: builtin/index-pack.c:749 builtin/index-pack.c:758
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr ""
+"СЪВПАДЕНИЕ НА СТОЙНОСТИТЕ ЗА СУМИТЕ ЗА SHA1: „%s“ НА ДВА РАЗЛИЧНИ ОБЕКТА!"
 
-#: builtin/index-pack.c:669 builtin/pack-objects.c:162
-#: builtin/pack-objects.c:254
+# FIXME merge with next?
+#: builtin/index-pack.c:689 builtin/pack-objects.c:164
+#: builtin/pack-objects.c:256
 #, c-format
 msgid "unable to read %s"
-msgstr ""
+msgstr "обектът „%s“ не може да бъде прочетен"
 
-#: builtin/index-pack.c:735
+#: builtin/index-pack.c:755
 #, c-format
 msgid "cannot read existing object %s"
-msgstr ""
+msgstr "съществуващият обект „%s“ не може да бъде прочетен"
 
-#: builtin/index-pack.c:749
+#: builtin/index-pack.c:769
 #, c-format
 msgid "invalid blob object %s"
-msgstr ""
+msgstr "неправилен обект BLOB „%s“"
 
-#: builtin/index-pack.c:763
+# FIXME perhaps invalid object
+#: builtin/index-pack.c:783
 #, c-format
 msgid "invalid %s"
-msgstr ""
+msgstr "неправилен обект „%s“"
 
-#: builtin/index-pack.c:766
+#: builtin/index-pack.c:787
 msgid "Error in object"
-msgstr ""
+msgstr "Грешка в обекта"
 
-#: builtin/index-pack.c:768
+#: builtin/index-pack.c:789
 #, c-format
 msgid "Not all child objects of %s are reachable"
-msgstr ""
+msgstr "Някои обекти, наследници на „%s“, не могат да бъдат достигнати"
 
-#: builtin/index-pack.c:839 builtin/index-pack.c:869
+#: builtin/index-pack.c:861 builtin/index-pack.c:890
 msgid "failed to apply delta"
-msgstr ""
-
-#: builtin/index-pack.c:1010
-msgid "Receiving objects"
-msgstr ""
-
-#: builtin/index-pack.c:1010
-msgid "Indexing objects"
-msgstr ""
-
-#: builtin/index-pack.c:1036
-msgid "pack is corrupted (SHA1 mismatch)"
-msgstr ""
-
-#: builtin/index-pack.c:1041
-msgid "cannot fstat packfile"
-msgstr ""
-
-#: builtin/index-pack.c:1044
-msgid "pack has junk at the end"
-msgstr ""
+msgstr "разликата не може да бъде приложена"
 
 #: builtin/index-pack.c:1055
+msgid "Receiving objects"
+msgstr "Получаване на обекти"
+
+#: builtin/index-pack.c:1055
+msgid "Indexing objects"
+msgstr "Индексиране на обекти"
+
+#: builtin/index-pack.c:1081
+msgid "pack is corrupted (SHA1 mismatch)"
+msgstr "пакетният файл е повреден (нееднакви суми по SHA1)"
+
+#: builtin/index-pack.c:1086
+msgid "cannot fstat packfile"
+msgstr "не може да се получи информация за пакетния файл с „fstat“"
+
+#: builtin/index-pack.c:1089
+msgid "pack has junk at the end"
+msgstr "в края на пакетния файл има повредени данни"
+
+# FIXME WTF message
+#: builtin/index-pack.c:1100
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr ""
+"фатална грешка във функцията „parse_pack_objects“. Това е грешка в Git, "
+"докладвайте я на разработчиците, като пратите е-писмо на адрес: „git@vger."
+"kernel.org“."
 
-#: builtin/index-pack.c:1078
+#: builtin/index-pack.c:1123
 msgid "Resolving deltas"
-msgstr ""
+msgstr "Откриване на съответните разлики"
 
-#: builtin/index-pack.c:1088
+#: builtin/index-pack.c:1133
 #, c-format
 msgid "unable to create thread: %s"
-msgstr ""
+msgstr "не може да се създаде нишка: %s"
 
-#: builtin/index-pack.c:1130
+# FIXME WTF message
+#: builtin/index-pack.c:1175
 msgid "confusion beyond insanity"
 msgstr ""
+"фатална грешка във функцията „conclude_pack“. Това е грешка в Git, "
+"докладвайте я на разработчиците, като пратите е-писмо на адрес: „git@vger."
+"kernel.org“."
 
-#: builtin/index-pack.c:1138
+#: builtin/index-pack.c:1181
 #, c-format
 msgid "completed with %d local objects"
-msgstr ""
+msgstr "действието завърши с %d локални обекта"
 
-#: builtin/index-pack.c:1148
+#: builtin/index-pack.c:1191
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr ""
+"Неочаквана последваща сума за грешки за „%s“ (причината може да е грешка в "
+"диска)"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1195
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "в пакета има %d ненапасваща разлика"
+msgstr[1] "в пакета има %d ненапасващи разлики"
 
-#: builtin/index-pack.c:1177
+#: builtin/index-pack.c:1220
 #, c-format
 msgid "unable to deflate appended object (%d)"
-msgstr ""
+msgstr "добавеният обект не може да се компресира с „deflate“: %d"
 
-#: builtin/index-pack.c:1256
+#: builtin/index-pack.c:1299
 #, c-format
 msgid "local object %s is corrupt"
-msgstr ""
+msgstr "локалният обект „%s“ е повреден"
 
-#: builtin/index-pack.c:1280
+#: builtin/index-pack.c:1323
 msgid "error while closing pack file"
-msgstr ""
+msgstr "грешка при затварянето на пакетния файл"
 
-#: builtin/index-pack.c:1293
+#: builtin/index-pack.c:1336
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr ""
+"грешка при записването на файла „%s“, осигуряващ запазване на директория"
 
-#: builtin/index-pack.c:1301
+#: builtin/index-pack.c:1344
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr ""
+"грешка при затварянето на записания файл „%s“, осигуряващ запазване на "
+"директория"
 
-#: builtin/index-pack.c:1314
+#: builtin/index-pack.c:1357
 msgid "cannot store pack file"
-msgstr ""
+msgstr "пакетният файл не може да бъде запазен"
 
-#: builtin/index-pack.c:1325
+#: builtin/index-pack.c:1368
 msgid "cannot store index file"
 msgstr "файлът за индекса не може да бъде съхранен"
 
-#: builtin/index-pack.c:1358
+#: builtin/index-pack.c:1401
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
-msgstr ""
+msgstr "зададена е неправилна версия пакетиране: „pack.indexversion=%<PRIu32>“"
 
-#: builtin/index-pack.c:1364
+#: builtin/index-pack.c:1407
 #, c-format
 msgid "invalid number of threads specified (%d)"
-msgstr ""
+msgstr "зададен е неправилен брой нишки: %d"
 
-#: builtin/index-pack.c:1368 builtin/index-pack.c:1546
+#: builtin/index-pack.c:1411 builtin/index-pack.c:1590
 #, c-format
 msgid "no threads support, ignoring %s"
-msgstr ""
+msgstr "липсва поддръжка за нишки. „%s“ ще се пренебрегне"
 
-#: builtin/index-pack.c:1426
+#: builtin/index-pack.c:1469
 #, c-format
 msgid "Cannot open existing pack file '%s'"
-msgstr ""
+msgstr "Съществуващият пакетен файл „%s“ не може да бъде отворен"
 
-#: builtin/index-pack.c:1428
+#: builtin/index-pack.c:1471
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
-msgstr ""
+msgstr "Съществуващият индекс за пакетния файл „%s“ не може да бъде отворен"
 
-#: builtin/index-pack.c:1475
+#: builtin/index-pack.c:1518
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d обект не е разлика"
+msgstr[1] "%d обекта не са разлика"
 
-#: builtin/index-pack.c:1482
+#: builtin/index-pack.c:1525
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "дължината на веригата е %d: %lu обект"
+msgstr[1] "дължината на веригата е %d: %lu обекта"
 
-#: builtin/index-pack.c:1510
+# FIXME it is not the cwd it is the previous cwd
+#: builtin/index-pack.c:1554
 msgid "Cannot come back to cwd"
-msgstr ""
+msgstr "Процесът не може да се върне към предишната работна директория"
 
-#: builtin/index-pack.c:1558 builtin/index-pack.c:1561
-#: builtin/index-pack.c:1573 builtin/index-pack.c:1577
+#: builtin/index-pack.c:1602 builtin/index-pack.c:1605
+#: builtin/index-pack.c:1617 builtin/index-pack.c:1621
 #, c-format
 msgid "bad %s"
-msgstr ""
+msgstr "неправилна стойност „%s“"
 
-#: builtin/index-pack.c:1591
+#: builtin/index-pack.c:1635
 msgid "--fix-thin cannot be used without --stdin"
-msgstr ""
+msgstr "опцията „--fix-thin“ изисква „--stdin“"
 
-#: builtin/index-pack.c:1595 builtin/index-pack.c:1605
+#: builtin/index-pack.c:1639 builtin/index-pack.c:1648
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
-msgstr ""
+msgstr "името на пакетния файл „%s“ не завършва на „.pack“"
 
-#: builtin/index-pack.c:1614
+#: builtin/index-pack.c:1656
 msgid "--verify with no packfile name given"
-msgstr ""
+msgstr "опцията „--verify“ изисква име на пакетен файл"
 
 #: builtin/init-db.c:35
 #, c-format
 msgid "Could not make %s writable by group"
-msgstr ""
+msgstr "Не могат да се дадат права за запис в директорията „%s“ на групата"
 
+# FIXME - bad wording insanely
 #: builtin/init-db.c:62
 #, c-format
 msgid "insanely long template name %s"
-msgstr ""
+msgstr "твърде дълго име на шаблон: „%s“"
 
 #: builtin/init-db.c:67
 #, c-format
 msgid "cannot stat '%s'"
-msgstr ""
+msgstr "не може да се получи информация чрез „stat“ за директорията „%s“"
 
 #: builtin/init-db.c:73
 #, c-format
 msgid "cannot stat template '%s'"
-msgstr ""
+msgstr "не може да се получи информация чрез „stat“ за шаблона „%s“"
 
 #: builtin/init-db.c:80
 #, c-format
 msgid "cannot opendir '%s'"
-msgstr ""
+msgstr "директорията „%s“ не може да бъде отворена"
 
 #: builtin/init-db.c:97
 #, c-format
 msgid "cannot readlink '%s'"
-msgstr ""
+msgstr "връзката „%s“ не може да бъде прочетена"
 
+# FIXME - bad wording insanely
 #: builtin/init-db.c:99
 #, c-format
 msgid "insanely long symlink %s"
-msgstr ""
+msgstr "твърде дълго име на символна връзка: „%s“"
 
 #: builtin/init-db.c:102
 #, c-format
 msgid "cannot symlink '%s' '%s'"
-msgstr ""
+msgstr "не може да се създаде символна връзка „%s“ в „%s“"
 
 #: builtin/init-db.c:106
 #, c-format
 msgid "cannot copy '%s' to '%s'"
-msgstr ""
+msgstr "„%s“ не може да се копира в „%s“"
 
 #: builtin/init-db.c:110
 #, c-format
 msgid "ignoring template %s"
-msgstr ""
+msgstr "игнориране на шаблона „%s“"
 
+# FIXME bad word insanely
 #: builtin/init-db.c:133
 #, c-format
 msgid "insanely long template path %s"
-msgstr ""
+msgstr "твърде дълъг път към шаблон: „%s“"
 
 #: builtin/init-db.c:141
 #, c-format
 msgid "templates not found %s"
-msgstr ""
+msgstr "директорията с шаблоните не е открита: „%s“"
 
 #: builtin/init-db.c:154
 #, c-format
 msgid "not copying templates of a wrong format version %d from '%s'"
 msgstr ""
+"шаблоните с неправилен номер на формата %d няма да бъдат копирани от „%s“"
 
 #: builtin/init-db.c:192
 #, c-format
 msgid "insane git directory %s"
-msgstr ""
+msgstr "твърде дълго име на директория на Git: „%s“"
 
 #: builtin/init-db.c:323 builtin/init-db.c:326
 #, c-format
 msgid "%s already exists"
-msgstr ""
+msgstr "Директорията „%s“ вече съществува"
 
 #: builtin/init-db.c:355
 #, c-format
 msgid "unable to handle file type %d"
-msgstr ""
+msgstr "файлове от вид %d не се поддържат"
 
 #: builtin/init-db.c:358
 #, c-format
 msgid "unable to move %s to %s"
-msgstr ""
+msgstr "„%s“ не може да се премести в „%s“"
 
 #. TRANSLATORS: The first '%s' is either "Reinitialized
 #. existing" or "Initialized empty", the second " shared" or
@@ -6282,105 +6680,139 @@
 #: builtin/init-db.c:418
 #, c-format
 msgid "%s%s Git repository in %s%s\n"
-msgstr ""
+msgstr "%s%s хранилище на Git в „%s%s“\n"
 
 #: builtin/init-db.c:419
 msgid "Reinitialized existing"
-msgstr ""
+msgstr "Наново инициализирано, съществуващо"
 
 #: builtin/init-db.c:419
 msgid "Initialized empty"
-msgstr ""
+msgstr "Инициализирано празно"
 
 #: builtin/init-db.c:420
 msgid " shared"
-msgstr ""
+msgstr ", споделено"
 
-#: builtin/init-db.c:439
-msgid "cannot tell cwd"
-msgstr ""
-
-#: builtin/init-db.c:465
+#: builtin/init-db.c:467
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [directory]"
 msgstr ""
+"git init [-q | --quiet] [--bare] [--template=ДИРЕКТОРИЯ_С_ШАБЛОНИ] [--"
+"shared[=ПРАВА]] [ДИРЕКТОРИЯ]"
 
-#: builtin/init-db.c:488
+#: builtin/init-db.c:490
 msgid "permissions"
-msgstr ""
+msgstr "права"
 
-#: builtin/init-db.c:489
+#: builtin/init-db.c:491
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr ""
+"указване, че хранилището на Git ще бъде споделено от повече от един "
+"потребител"
 
-#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
+#: builtin/init-db.c:493 builtin/prune-packed.c:57 builtin/repack.c:172
 msgid "be quiet"
 msgstr "без извеждане на информация"
 
-#: builtin/init-db.c:523 builtin/init-db.c:528
+#: builtin/init-db.c:525 builtin/init-db.c:530
 #, c-format
 msgid "cannot mkdir %s"
-msgstr ""
+msgstr "директорията „%s“ не може да бъде създадена"
 
-#: builtin/init-db.c:532
+#: builtin/init-db.c:534
 #, c-format
 msgid "cannot chdir to %s"
-msgstr ""
+msgstr "не може да се влезе в директорията „%s“"
 
-#: builtin/init-db.c:554
+#: builtin/init-db.c:555
 #, 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:578
-msgid "Cannot access current working directory"
-msgstr ""
-
-#: builtin/init-db.c:585
+#: builtin/init-db.c:583
 #, 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:41
 msgid "git log [<options>] [<revision range>] [[--] <path>...]\n"
-msgstr "git log [ОПЦИИ] [ДИАПАЗОН_НА_ВЕРСИИТЕ] [[--] ПЪТ…]\n"
+msgstr "git log [ОПЦИЯ…] [ДИАПАЗОН_НА_ВЕРСИИТЕ] [[--] ПЪТ…]\n"
 
 #: builtin/log.c:42
 msgid "   or: git show [options] <object>..."
-msgstr "   или: git show [ОПЦИИ] ОБЕКТ…"
+msgstr "   или: git show [ОПЦИЯ…] ОБЕКТ…"
 
-#: builtin/log.c:125
+#: builtin/log.c:81
+#, c-format
+msgid "invalid --decorate option: %s"
+msgstr "неправилна опция „--decorate“: %s"
+
+#: builtin/log.c:127
 msgid "suppress diff output"
 msgstr "без извеждане на разликите"
 
-#: builtin/log.c:126
+#: builtin/log.c:128
 msgid "show source"
 msgstr "извеждане на изходния код"
 
-#: builtin/log.c:127
+#: builtin/log.c:129
 msgid "Use mail map file"
 msgstr ""
 "Използване на файл за съответствията на имената и адресите на е-поща („."
 "mailmap“)"
 
-#: builtin/log.c:128
+#: builtin/log.c:130
 msgid "decorate options"
 msgstr "настройки на форма̀та на извежданата информация"
 
-#: builtin/log.c:231
+#: builtin/log.c:133
+msgid "Process line range n,m in file, counting from 1"
+msgstr ""
+"Обработване само на редовете във файла в интервала от n до m включително. "
+"Броенето започва от 1"
+
+#: builtin/log.c:229
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Резултат: %d %s\n"
 
-#: builtin/log.c:473 builtin/log.c:565
+#: builtin/log.c:458
+#, c-format
+msgid "git show %s: bad file"
+msgstr "git show %s: повреден файл"
+
+#: builtin/log.c:472 builtin/log.c:564
 #, c-format
 msgid "Could not read object %s"
 msgstr "Обектът не може да бъде прочетен: %s"
 
-#: builtin/log.c:589
+#: builtin/log.c:588
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Неизвестен вид: %d"
@@ -6389,221 +6821,230 @@
 msgid "format.headers without value"
 msgstr "не е зададена стойност на „format.headers“"
 
-#: builtin/log.c:771
+#: builtin/log.c:773
 msgid "name of output directory is too long"
 msgstr "прекалено дълго име на директорията за изходната информация"
 
-#: builtin/log.c:787
+#: builtin/log.c:789
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Файлът-кръпка „%s“ не може да бъде отворен"
 
-#: builtin/log.c:801
+#: builtin/log.c:803
 msgid "Need exactly one range."
 msgstr "Трябва да зададете точно един диапазон."
 
-#: builtin/log.c:809
+#: builtin/log.c:811
 msgid "Not a range."
 msgstr "Не е диапазон."
 
-#: builtin/log.c:911
+#: builtin/log.c:919
 msgid "Cover letter needs email format"
 msgstr "Придружаващото писмо трябва да е форматирано като е-писмо"
 
-#: builtin/log.c:987
+# FIXME bad wording insanely
+#: builtin/log.c:998
 #, c-format
 msgid "insane in-reply-to: %s"
-msgstr "неправилен формат на заглавната част  за отговор „in-reply-to“: %s"
+msgstr "неправилен формат на заглавната част за отговор „in-reply-to“: %s"
 
-#: builtin/log.c:1015
+#: builtin/log.c:1026
 msgid "git format-patch [options] [<since> | <revision range>]"
-msgstr "git format-patch [ОПЦИИ] [ОТ | ДИАПАЗОН_НА_ВЕРСИИТЕ]"
+msgstr "git format-patch [ОПЦИЯ…] [ОТ | ДИАПАЗОН_НА_ВЕРСИИТЕ]"
 
-# FIXME message
-#: builtin/log.c:1060
+# FIXME message WTF why ask it
+#: builtin/log.c:1071
 msgid "Two output directories?"
-msgstr ""
-"Можете да укажете максимум една директория за изход, а сте задали поне две."
+msgstr "Можете да укажете максимум една директория за изход."
 
-#: builtin/log.c:1175
+#: builtin/log.c:1186
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "номерация „[PATCH n/m]“ дори и при единствена кръпка"
 
-#: builtin/log.c:1178
+#: builtin/log.c:1189
 msgid "use [PATCH] even with multiple patches"
 msgstr "номерация „[PATCH]“ дори и при множество кръпки"
 
-#: builtin/log.c:1182
+#: builtin/log.c:1193
 msgid "print patches to standard out"
 msgstr "извеждане на кръпките на стандартния изход"
 
-#: builtin/log.c:1184
+#: builtin/log.c:1195
 msgid "generate a cover letter"
 msgstr "създаване на придружаващо писмо"
 
-#: builtin/log.c:1186
+#: builtin/log.c:1197
 msgid "use simple number sequence for output file names"
 msgstr "проста числова последователност за имената на файловете-кръпки"
 
-#: builtin/log.c:1187
+#: builtin/log.c:1198
 msgid "sfx"
 msgstr "ЗНАЦИ"
 
-#: builtin/log.c:1188
+#: builtin/log.c:1199
 msgid "use <sfx> instead of '.patch'"
 msgstr "използване на тези ЗНАЦИ за суфикс вместо „.patch“"
 
-#: builtin/log.c:1190
+#: builtin/log.c:1201
 msgid "start numbering patches at <n> instead of 1"
 msgstr "номерирането на кръпките да започва от този БРОЙ, а не с 1"
 
-#: builtin/log.c:1192
+#: builtin/log.c:1203
 msgid "mark the series as Nth re-roll"
 msgstr "отбелязване, че това е N-тата поредна редакция на поредицата от кръпки"
 
-#: builtin/log.c:1194
+#: builtin/log.c:1205
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "Използване на този „[ПРЕФИКС]“ вместо „[PATCH]“"
 
-#: builtin/log.c:1197
+#: builtin/log.c:1208
 msgid "store resulting files in <dir>"
 msgstr "запазване на изходните файлове в тази ДИРЕКТОРИЯ"
 
-#: builtin/log.c:1200
+#: builtin/log.c:1211
 msgid "don't strip/add [PATCH]"
 msgstr "без добавяне/махане на префикса „[PATCH]“"
 
-#: builtin/log.c:1203
+#: builtin/log.c:1214
 msgid "don't output binary diffs"
 msgstr "без извеждане на разлики между двоични файлове"
 
-#: builtin/log.c:1205
+#: builtin/log.c:1216
 msgid "don't include a patch matching a commit upstream"
 msgstr "да не се включват кръпки, които присъстват в следения клон"
 
-#: builtin/log.c:1207
+#: builtin/log.c:1218
 msgid "show patch format instead of default (patch + stat)"
 msgstr ""
 "извеждане във формат за кръпки, а на в стандартния (кръпка и статистика)"
 
-#: builtin/log.c:1209
+#: builtin/log.c:1220
 msgid "Messaging"
 msgstr "Опции при изпращане"
 
-#: builtin/log.c:1210
+#: builtin/log.c:1221
 msgid "header"
 msgstr "ЗАГЛАВНА_ЧАСТ"
 
-#: builtin/log.c:1211
+#: builtin/log.c:1222
 msgid "add email header"
 msgstr "добавяне на тази ЗАГЛАВНА_ЧАСТ"
 
-#: builtin/log.c:1212 builtin/log.c:1214
+#: builtin/log.c:1223 builtin/log.c:1225
 msgid "email"
 msgstr "Е-ПОЩА"
 
-#: builtin/log.c:1212
+#: builtin/log.c:1223
 msgid "add To: header"
 msgstr "добавяне на заглавна част „To:“ (до)"
 
-#: builtin/log.c:1214
+#: builtin/log.c:1225
 msgid "add Cc: header"
 msgstr "добавяне на заглавна част „Cc:“ (и до)"
 
-#: builtin/log.c:1216
+#: builtin/log.c:1227
 msgid "ident"
 msgstr "ИДЕНТИЧНОСТ"
 
-#: builtin/log.c:1217
+#: builtin/log.c:1228
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 "задаване на адреса в заглавната част „From“ да е тази ИДЕНТИЧНОСТ. Ако не е "
 "зададена такава, се взима адреса на подаващия"
 
-#: builtin/log.c:1219
+#: builtin/log.c:1230
 msgid "message-id"
 msgstr "ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
 
-#: builtin/log.c:1220
+#: builtin/log.c:1231
 msgid "make first mail a reply to <message-id>"
 msgstr ""
 "първото съобщение да е в отговор на е-писмото с този "
 "ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
 
-#: builtin/log.c:1221 builtin/log.c:1224
+#: builtin/log.c:1232 builtin/log.c:1235
 msgid "boundary"
 msgstr "граница"
 
-#: builtin/log.c:1222
+#: builtin/log.c:1233
 msgid "attach the patch"
 msgstr "прикрепяне на кръпката"
 
-#: builtin/log.c:1225
+#: builtin/log.c:1236
 msgid "inline the patch"
 msgstr "включване на кръпката в текста на писмата"
 
-#: builtin/log.c:1229
+#: builtin/log.c:1240
 msgid "enable message threading, styles: shallow, deep"
 msgstr ""
 "използване на нишки за съобщенията. Стилът е „shallow“ (плитък) или "
 "„deep“ (дълбок)"
 
-#: builtin/log.c:1231
+#: builtin/log.c:1242
 msgid "signature"
 msgstr "подпис"
 
-#: builtin/log.c:1232
+#: builtin/log.c:1243
 msgid "add a signature"
 msgstr "добавяне на поле за подпис"
 
-#: builtin/log.c:1233
+#: builtin/log.c:1245
+msgid "add a signature from a file"
+msgstr "добавяне на подпис от файл"
+
+#: builtin/log.c:1246
 msgid "don't print the patch filenames"
 msgstr "без извеждане на имената на кръпките"
 
-#: builtin/log.c:1307
+#: builtin/log.c:1320
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "грешна идентичност: %s"
 
-#: builtin/log.c:1322
+#: builtin/log.c:1335
 msgid "-n and -k are mutually exclusive."
 msgstr "опциите „-n“ и „-k“ са несъвместими."
 
-#: builtin/log.c:1324
+#: builtin/log.c:1337
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "опциите „--subject-prefix“ и „-k“ са несъвместими."
 
-#: builtin/log.c:1332
+#: builtin/log.c:1345
 msgid "--name-only does not make sense"
 msgstr "опцията „--name-only“ е несъвместима с генерирането на кръпки"
 
-#: builtin/log.c:1334
+#: builtin/log.c:1347
 msgid "--name-status does not make sense"
 msgstr "опцията „--name-status“ е несъвместима с генерирането на кръпки"
 
-#: builtin/log.c:1336
+#: builtin/log.c:1349
 msgid "--check does not make sense"
 msgstr "опцията „--check“ е несъвместима с генерирането на кръпки"
 
-#: builtin/log.c:1359
+#: builtin/log.c:1372
 msgid "standard output, or directory, which one?"
 msgstr ""
 "изходът може да или стандартният, или да е в директория, но не и двете."
 
-#: builtin/log.c:1361
+#: builtin/log.c:1374
 #, c-format
 msgid "Could not create directory '%s'"
-msgstr "Папката „%s“ не може да бъде създадена"
+msgstr "Директорията „%s“ не може да бъде създадена"
 
-#: builtin/log.c:1509
+#: builtin/log.c:1472
+#, c-format
+msgid "unable to read signature file '%s'"
+msgstr "файлът „%s“ с подпис не може да бъде прочетен"
+
+#: builtin/log.c:1535
 msgid "Failed to create output files"
 msgstr "Изходните файлове не могат да бъдат създадени"
 
-#: builtin/log.c:1558
+#: builtin/log.c:1583
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [ОТДАЛЕЧЕН_КЛОН [ВРЪХ [ПРЕДЕЛ]]]"
 
-#: builtin/log.c:1613
+#: builtin/log.c:1638
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -6611,118 +7052,121 @@
 "Следеният отдалечен клон не бе открит, затова изрично задайте "
 "ОТДАЛЕЧЕН_КЛОН.\n"
 
-#: builtin/log.c:1626 builtin/log.c:1628 builtin/log.c:1640
+#: builtin/log.c:1651 builtin/log.c:1653 builtin/log.c:1665
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Непознато подаване „%s“"
 
 #: builtin/ls-files.c:401
 msgid "git ls-files [options] [<file>...]"
-msgstr ""
+msgstr "git ls-files [ОПЦИЯ…] [ФАЙЛ…]"
 
 #: builtin/ls-files.c:458
 msgid "identify the file status with tags"
-msgstr ""
+msgstr "извеждане на състоянието на файловете с еднобуквени флагове"
 
 #: builtin/ls-files.c:460
 msgid "use lowercase letters for 'assume unchanged' files"
-msgstr ""
+msgstr "малки букви за файловете, които да се счетат за непроменени"
 
 #: builtin/ls-files.c:462
 msgid "show cached files in the output (default)"
-msgstr ""
+msgstr "извеждане на кешираните файлове (стандартно)"
 
 #: builtin/ls-files.c:464
 msgid "show deleted files in the output"
-msgstr ""
+msgstr "извеждане на изтритите файлове"
 
 #: builtin/ls-files.c:466
 msgid "show modified files in the output"
-msgstr ""
+msgstr "извеждане на променените файлове"
 
 #: builtin/ls-files.c:468
 msgid "show other files in the output"
-msgstr ""
+msgstr "извеждане на другите файлове"
 
 #: builtin/ls-files.c:470
 msgid "show ignored files in the output"
-msgstr ""
+msgstr "извеждане на игнорираните файлове"
 
 #: builtin/ls-files.c:473
 msgid "show staged contents' object name in the output"
-msgstr ""
+msgstr "извеждане на името на обекта за съдържанието на индекса"
 
 #: builtin/ls-files.c:475
 msgid "show files on the filesystem that need to be removed"
-msgstr ""
+msgstr "извеждане на файловете, които трябва да бъдат изтрити"
 
 #: builtin/ls-files.c:477
-msgid "show 'other' directories' name only"
-msgstr ""
+msgid "show 'other' directories' names only"
+msgstr "извеждане само на името на другите (неследените) директории"
 
 #: builtin/ls-files.c:480
 msgid "don't show empty directories"
-msgstr ""
+msgstr "без извеждане на празните директории"
 
 #: builtin/ls-files.c:483
 msgid "show unmerged files in the output"
-msgstr ""
+msgstr "извеждане на неслетите файлове"
 
+# FIXME not clear about what this option does
 #: builtin/ls-files.c:485
 msgid "show resolve-undo information"
-msgstr ""
+msgstr "извеждане на информацията за отмяна на разрешените подавания"
 
 #: builtin/ls-files.c:487
 msgid "skip files matching pattern"
-msgstr ""
+msgstr "прескачане на файловете напасващи ШАБЛОНа"
 
 #: builtin/ls-files.c:490
 msgid "exclude patterns are read from <file>"
-msgstr ""
+msgstr "шаблоните за игнориране да се прочетат от този ФАЙЛ"
 
 #: builtin/ls-files.c:493
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr ""
+"изчитане на допълнителните шаблони за игнориране по директория от този ФАЙЛ"
 
 #: builtin/ls-files.c:495
 msgid "add the standard git exclusions"
-msgstr ""
+msgstr "добавяне на стандартно игнорираните от Git файлове"
 
 #: builtin/ls-files.c:498
 msgid "make the output relative to the project top directory"
-msgstr ""
+msgstr "пътищата да са относителни спрямо основната директория на проекта"
 
 #: builtin/ls-files.c:501
 msgid "if any <file> is not in the index, treat this as an error"
-msgstr ""
+msgstr "грешка, ако някой от тези ФАЙЛове не е в индекса"
 
 #: builtin/ls-files.c:502
 msgid "tree-ish"
-msgstr ""
+msgstr "УКАЗАТЕЛ_КЪМ_ДЪРВО"
 
 #: builtin/ls-files.c:503
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
+"считане, че пътищата изтрити след УКАЗАТЕЛя_КЪМ_ДЪРВО все още съществуват"
 
 #: builtin/ls-files.c:505
 msgid "show debugging data"
-msgstr ""
+msgstr "извеждане на информацията за изчистване на грешки"
 
 #: builtin/ls-tree.c:28
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
-msgstr ""
+msgstr "git ls-tree [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО [ПЪТ…]"
 
 #: builtin/ls-tree.c:126
 msgid "only show trees"
-msgstr ""
+msgstr "извеждане само на дървета"
 
 #: builtin/ls-tree.c:128
 msgid "recurse into subtrees"
-msgstr ""
+msgstr "рекурсивно обхождане поддърветата"
 
 #: builtin/ls-tree.c:130
 msgid "show trees when recursing"
-msgstr ""
+msgstr "извеждане на дърветата при рекурсивното обхождане"
 
 #: builtin/ls-tree.c:133
 msgid "terminate entries with NUL byte"
@@ -6730,195 +7174,201 @@
 
 #: builtin/ls-tree.c:134
 msgid "include object size"
-msgstr ""
+msgstr "извеждане на размера на обекта"
 
 #: builtin/ls-tree.c:136 builtin/ls-tree.c:138
 msgid "list only filenames"
-msgstr ""
+msgstr "извеждане само имената на файловете"
 
 #: builtin/ls-tree.c:141
 msgid "use full path names"
-msgstr ""
+msgstr "използване на пълните имена на пътищата"
 
 #: builtin/ls-tree.c:143
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr ""
-
-#: builtin/merge.c:43
-msgid "git merge [options] [<commit>...]"
-msgstr ""
+"извеждане на цялото дърво, не само на текущата директория (включва опцията "
+"„--full-name“)"
 
 #: builtin/merge.c:44
-msgid "git merge [options] <msg> HEAD <commit>"
-msgstr ""
+msgid "git merge [options] [<commit>...]"
+msgstr "git merge [ОПЦИЯ…] [ПОДАВАНЕ…]"
 
 #: builtin/merge.c:45
+msgid "git merge [options] <msg> HEAD <commit>"
+msgstr "git merge [ОПЦИЯ…] СЪОБЩЕНИЕ HEAD ПОДАВАНЕ"
+
+#: builtin/merge.c:46
 msgid "git merge --abort"
-msgstr ""
+msgstr "git merge --abort"
 
-#: builtin/merge.c:98
+# FIXME -m rather than just m
+#: builtin/merge.c:99
 msgid "switch `m' requires a value"
-msgstr ""
-
-#: builtin/merge.c:135
-#, c-format
-msgid "Could not find merge strategy '%s'.\n"
-msgstr ""
+msgstr "опцията „-m“ изисква стойност"
 
 #: builtin/merge.c:136
 #, c-format
-msgid "Available strategies are:"
-msgstr ""
+msgid "Could not find merge strategy '%s'.\n"
+msgstr "Няма такава стратегия за сливане: „%s“.\n"
 
-#: builtin/merge.c:141
+#: builtin/merge.c:137
+#, c-format
+msgid "Available strategies are:"
+msgstr "Наличните стратегии са:"
+
+#: builtin/merge.c:142
 #, c-format
 msgid "Available custom strategies are:"
-msgstr ""
+msgstr "Допълнителните стратегии са:"
 
-#: builtin/merge.c:191
+#: builtin/merge.c:192
 msgid "do not show a diffstat at the end of the merge"
-msgstr ""
-
-#: builtin/merge.c:194
-msgid "show a diffstat at the end of the merge"
-msgstr ""
+msgstr "без извеждане на статистиката след завършване на сливане"
 
 #: builtin/merge.c:195
-msgid "(synonym to --stat)"
-msgstr ""
+msgid "show a diffstat at the end of the merge"
+msgstr "извеждане на статистиката след завършване на сливане"
 
-#: builtin/merge.c:197
+#: builtin/merge.c:196
+msgid "(synonym to --stat)"
+msgstr "(синоним на „--stat“)"
+
+#: builtin/merge.c:198
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 "добавяне (на максимум такъв БРОЙ) записи от съкратения журнал в съобщението "
 "за подаване"
 
-#: builtin/merge.c:200
+#: builtin/merge.c:201
 msgid "create a single commit instead of doing a merge"
-msgstr ""
+msgstr "създаване на едно подаване вместо извършване на сливане"
 
-#: builtin/merge.c:202
+#: builtin/merge.c:203
 msgid "perform a commit if the merge succeeds (default)"
-msgstr ""
-
-#: builtin/merge.c:204
-msgid "edit message before committing"
-msgstr ""
+msgstr "извършване на подаване при успешно сливане (стандартно действие)"
 
 #: builtin/merge.c:205
+msgid "edit message before committing"
+msgstr "редактиране на съобщението преди подаване"
+
+#: builtin/merge.c:206
 msgid "allow fast-forward (default)"
-msgstr ""
+msgstr "позволяване на тривиално сливане (стандартно действие)"
 
-#: builtin/merge.c:207
+#: builtin/merge.c:208
 msgid "abort if fast-forward is not possible"
-msgstr ""
+msgstr "преустановяване, ако сливането не е тривиално"
 
-#: builtin/merge.c:211
+#: builtin/merge.c:212
 msgid "Verify that the named commit has a valid GPG signature"
-msgstr ""
+msgstr "Проверка, че именуваното подаване е с правилен подпис на GPG"
 
-#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
+#: builtin/merge.c:213 builtin/notes.c:741 builtin/revert.c:89
 msgid "strategy"
 msgstr "стратегия"
 
-#: builtin/merge.c:213
-msgid "merge strategy to use"
-msgstr ""
-
 #: builtin/merge.c:214
-msgid "option=value"
-msgstr ""
+msgid "merge strategy to use"
+msgstr "стратегия за сливане, която да се ползва"
 
 #: builtin/merge.c:215
+msgid "option=value"
+msgstr "опция=стойност"
+
+#: builtin/merge.c:216
 msgid "option for selected merge strategy"
-msgstr ""
+msgstr "опция за избраната стратегия за сливане"
 
-#: builtin/merge.c:217
+#: builtin/merge.c:218
 msgid "merge commit message (for a non-fast-forward merge)"
-msgstr ""
+msgstr "съобщение при подаването със сливане (при нетривиални сливания)"
 
-#: builtin/merge.c:221
+#: builtin/merge.c:222
 msgid "abort the current in-progress merge"
-msgstr ""
+msgstr "преустановяване на текущото сливане"
 
 #: builtin/merge.c:250
 msgid "could not run stash."
-msgstr ""
+msgstr "не може да се извърши скатаване"
 
 #: builtin/merge.c:255
 msgid "stash failed"
-msgstr ""
+msgstr "неуспешно скатаване"
 
 #: builtin/merge.c:260
 #, c-format
 msgid "not a valid object: %s"
-msgstr ""
+msgstr "неправилен обект: „%s“"
 
 #: builtin/merge.c:279 builtin/merge.c:296
 msgid "read-tree failed"
-msgstr ""
+msgstr "неуспешно прочитане на обект-дърво"
 
 #: builtin/merge.c:326
 msgid " (nothing to squash)"
-msgstr ""
+msgstr " (няма какво да се смачка)"
 
 #: builtin/merge.c:339
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
-msgstr ""
+msgstr "Подаване със смачкване — указателят „HEAD“ няма да бъде обновен\n"
 
 #: builtin/merge.c:371
 msgid "Writing SQUASH_MSG"
-msgstr ""
+msgstr "Записване на съобщението за смачкване SQUASH_MSG"
 
 #: builtin/merge.c:373
 msgid "Finishing SQUASH_MSG"
-msgstr ""
+msgstr "Завършване на съобщението за смачкване SQUASH_MSG"
 
 #: builtin/merge.c:396
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr ""
+"Липсва съобщение при подаване — указателят „HEAD“ няма да бъде обновен\n"
 
 #: builtin/merge.c:446
 #, c-format
 msgid "'%s' does not point to a commit"
-msgstr ""
+msgstr "„%s“ не сочи към подаване"
 
 #: builtin/merge.c:558
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
-msgstr ""
+msgstr "Неправилен низ за настройката „branch.%s.mergeoptions“: „%s“"
 
 #: builtin/merge.c:653
 msgid "git write-tree failed to write a tree"
 msgstr "Командата „git write-tree“ не успя да запише обект-дърво"
 
-#: builtin/merge.c:681
+#: builtin/merge.c:677
 msgid "Not handling anything other than two heads merge."
-msgstr ""
+msgstr "Поддържа се само сливане на точно две истории."
 
-#: builtin/merge.c:695
+#: builtin/merge.c:691
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
-msgstr ""
+msgstr "Непозната опция за рекурсивното сливане „merge-recursive“: „-X%s“"
 
-#: builtin/merge.c:709
+#: builtin/merge.c:704
 #, c-format
 msgid "unable to write %s"
-msgstr ""
+msgstr "„%s“ не може да бъде записан"
 
-#: builtin/merge.c:798
+#: builtin/merge.c:793
 #, c-format
 msgid "Could not read from '%s'"
-msgstr ""
+msgstr "От „%s“ не може да се чете"
 
-#: builtin/merge.c:807
+#: builtin/merge.c:802
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
+"Сливането няма да бъде подадено. За завършването му и подаването му "
+"използвайте командата „git commit“.\n"
 
-#: builtin/merge.c:813
+#: builtin/merge.c:808
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -6927,244 +7377,266 @@
 "Lines starting with '%c' will be ignored, and an empty message aborts\n"
 "the commit.\n"
 msgstr ""
+"В съобщението при подаване добавете информация за причината за\n"
+"сливането, особено ако сливате обновен отдалечен клон в тематичен клон.\n"
+"\n"
+"Редовете, които започват с „%c“ ще бъдат пропуснати, а празно съобщение\n"
+"преустановява подаването.\n"
 
-#: builtin/merge.c:837
+#: builtin/merge.c:832
 msgid "Empty commit message."
-msgstr ""
+msgstr "Празно съобщение при подаване."
 
-#: builtin/merge.c:849
+# FIXME - WTF is wonderful.
+#: builtin/merge.c:844
 #, c-format
 msgid "Wonderful.\n"
-msgstr ""
+msgstr "Първият етап на тривиалното сливане завърши.\n"
 
-#: builtin/merge.c:914
+#: builtin/merge.c:907
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
-msgstr ""
+msgstr "Неуспешно сливане — коригирайте конфликтите и подайте резултата.\n"
 
-#: builtin/merge.c:930
+#: builtin/merge.c:923
 #, c-format
 msgid "'%s' is not a commit"
-msgstr ""
+msgstr "„%s“ не е подаване"
 
-#: builtin/merge.c:971
+#: builtin/merge.c:964
 msgid "No current branch."
-msgstr ""
+msgstr "Няма текущ клон."
+
+#: builtin/merge.c:966
+msgid "No remote for the current branch."
+msgstr "Текущият клон не следи никой."
+
+#: builtin/merge.c:968
+msgid "No default upstream defined for the current branch."
+msgstr "Текущият клон не следи никой клон."
 
 #: builtin/merge.c:973
-msgid "No remote for the current branch."
-msgstr ""
-
-#: builtin/merge.c:975
-msgid "No default upstream defined for the current branch."
-msgstr ""
-
-#: builtin/merge.c:980
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
-msgstr ""
+msgstr "Никой клон не следи клона „%s“ от хранилището „%s“"
 
-#: builtin/merge.c:1136
+#: builtin/merge.c:1129
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr ""
+"Не може да преустановите сливане, защото в момента не се извършва такова "
+"(липсва указател „MERGE_HEAD“)."
 
-#: builtin/merge.c:1152 git-pull.sh:31
+#: builtin/merge.c:1145
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
-"Please, commit your changes before you can merge."
+"Please, commit your changes before you merge."
 msgstr ""
 "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува).\n"
 "Подайте промените си, преди да започнете ново сливане."
 
-#: builtin/merge.c:1155 git-pull.sh:34
+#: builtin/merge.c:1148 git-pull.sh:34
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува)."
 
-#: builtin/merge.c:1159
+#: builtin/merge.c:1152
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
-"Please, commit your changes before you can merge."
+"Please, commit your changes before you merge."
 msgstr ""
 "Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
 "съществува). Подайте промените си, преди да започнете ново сливане."
 
-#: builtin/merge.c:1162
+#: builtin/merge.c:1155
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr ""
 "Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
 "съществува)."
 
-#: builtin/merge.c:1171
+#: builtin/merge.c:1164
 msgid "You cannot combine --squash with --no-ff."
-msgstr ""
+msgstr "Опцията „--squash“ е несъвместима с „--no-ff“."
 
-#: builtin/merge.c:1180
+#: builtin/merge.c:1173
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr ""
+"Не е указано подаване и настройката „merge.defaultToUpstream“ не е зададена."
 
-#: builtin/merge.c:1212
+#: builtin/merge.c:1205
 msgid "Can merge only exactly one commit into empty head"
-msgstr ""
+msgstr "Можете да слеете точно едно подаване във връх без история"
 
-#: builtin/merge.c:1215
+#: builtin/merge.c:1208
 msgid "Squash commit into empty head not supported yet"
-msgstr ""
+msgstr "Подаване със смачкване във връх без история все още не се поддържа"
 
-#: builtin/merge.c:1217
+#: builtin/merge.c:1210
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
+"Понеже върхът е без история, всички сливания са тривиални, не може да се "
+"извърши нетривиално сливане изисквано от опцията „--no-ff“"
 
-#: builtin/merge.c:1222
+#: builtin/merge.c:1215
 #, c-format
 msgid "%s - not something we can merge"
-msgstr ""
+msgstr "„%s“ — не е нещо, което може да се слее"
 
-#: builtin/merge.c:1273
+#: builtin/merge.c:1266
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
+"Подаването „%s“ е с недоверен подпис от GPG, който твърди, че е на „%s“."
 
-#: builtin/merge.c:1276
+#: builtin/merge.c:1269
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr ""
+"Подаването „%s“ е с неправилен подпис от GPG, който твърди, че е на „%s“."
 
-#: builtin/merge.c:1279
+#: builtin/merge.c:1272
 #, c-format
 msgid "Commit %s does not have a GPG signature."
-msgstr ""
+msgstr "Подаването „%s“ е без подпис от GPG."
 
-#: builtin/merge.c:1282
+#: builtin/merge.c:1275
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
-msgstr ""
+msgstr "Подаването „%s“ е с коректен подпис от GPG на „%s“.\n"
 
-#: builtin/merge.c:1366
+#: builtin/merge.c:1356
 #, c-format
 msgid "Updating %s..%s\n"
-msgstr ""
+msgstr "Обновяване „%s..%s“\n"
 
-#: builtin/merge.c:1405
+#: builtin/merge.c:1395
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
-msgstr ""
+msgstr "Проба с най-тривиалното сливане в рамките на индекса…\n"
 
-#: builtin/merge.c:1412
+# FIXME WTF message
+#: builtin/merge.c:1402
 #, c-format
 msgid "Nope.\n"
-msgstr ""
+msgstr "Неуспешно сливане.\n"
 
-#: builtin/merge.c:1444
+#: builtin/merge.c:1434
 msgid "Not possible to fast-forward, aborting."
 msgstr ""
+"Не може да се извърши тривиално сливане, преустановяване на действието."
 
-#: builtin/merge.c:1467 builtin/merge.c:1546
+#: builtin/merge.c:1457 builtin/merge.c:1536
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
-msgstr ""
+msgstr "Привеждане на дървото към първоначалното…\n"
 
-#: builtin/merge.c:1471
+#: builtin/merge.c:1461
 #, c-format
 msgid "Trying merge strategy %s...\n"
-msgstr ""
+msgstr "Пробване със стратегията за сливане „%s“…\n"
 
-#: builtin/merge.c:1537
+#: builtin/merge.c:1527
 #, c-format
 msgid "No merge strategy handled the merge.\n"
-msgstr ""
+msgstr "Никоя стратегия за сливане не може да извърши сливането.\n"
 
-#: builtin/merge.c:1539
+#: builtin/merge.c:1529
 #, c-format
 msgid "Merge with strategy %s failed.\n"
-msgstr ""
+msgstr "Неуспешно сливане със стратегия „%s“.\n"
 
-#: builtin/merge.c:1548
+#: builtin/merge.c:1538
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr ""
+"Ползва се стратегията „%s“, която ще подготви дървото за коригиране на "
+"ръка.\n"
 
-#: builtin/merge.c:1560
+#: builtin/merge.c:1550
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
+"Автоматичното сливане завърши успешно. Самото подаване не е извършено, "
+"защото бе зададена опцията „--no-commit“.\n"
 
 #: builtin/merge-base.c:29
 msgid "git merge-base [-a|--all] <commit> <commit>..."
-msgstr ""
+msgstr "git merge-base [-a|--all] ПОДАВАНЕ ПОДАВАНЕ…"
 
 #: builtin/merge-base.c:30
 msgid "git merge-base [-a|--all] --octopus <commit>..."
-msgstr ""
+msgstr "git merge-base [-a|--all] --octopus ПОДАВАНЕ…"
 
 #: builtin/merge-base.c:31
 msgid "git merge-base --independent <commit>..."
-msgstr ""
+msgstr "git merge-base --independent ПОДАВАНЕ…"
 
 #: builtin/merge-base.c:32
 msgid "git merge-base --is-ancestor <commit> <commit>"
-msgstr ""
+msgstr "git merge-base --is-ancestor ПОДАВАНЕ_1 ПОДАВАНЕ_2"
 
 #: builtin/merge-base.c:33
 msgid "git merge-base --fork-point <ref> [<commit>]"
-msgstr ""
+msgstr "git merge-base --fork-point УКАЗАТЕЛ [ПОДАВАНЕ]"
 
 #: builtin/merge-base.c:214
 msgid "output all common ancestors"
-msgstr ""
+msgstr "извеждане на всички общи предшественици"
 
 #: builtin/merge-base.c:216
 msgid "find ancestors for a single n-way merge"
 msgstr ""
+"откриване на предшествениците за еднократно сливане на множество истории"
 
 #: builtin/merge-base.c:218
 msgid "list revs not reachable from others"
-msgstr ""
+msgstr "извеждане на недостижимите от другите указатели"
 
 #: builtin/merge-base.c:220
 msgid "is the first one ancestor of the other?"
-msgstr ""
+msgstr "ПОДАВАНЕ_1 предшественик ли е на ПОДАВАНЕ_2?"
 
 #: builtin/merge-base.c:222
 msgid "find where <commit> forked from reflog of <ref>"
-msgstr ""
+msgstr "откриване къде ПОДАВАНЕто се е отклонило от историята на УКАЗАТЕЛя"
 
 #: builtin/merge-file.c:8
 msgid ""
 "git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file "
 "file2"
 msgstr ""
+"git merge-file [ОПЦИЯ…] [-L ИМЕ_1 [-L ОРИГИНАЛ [-L ИМЕ_2]]] ФАЙЛ_1 ОРИГ_ФАЙЛ "
+"ФАЙЛ_2"
 
 #: builtin/merge-file.c:33
 msgid "send results to standard output"
-msgstr ""
+msgstr "извеждане на резултатите на стандартния изход"
 
 #: builtin/merge-file.c:34
 msgid "use a diff3 based merge"
-msgstr ""
+msgstr "сливане на базата на „diff3“"
 
 #: builtin/merge-file.c:35
 msgid "for conflicts, use our version"
-msgstr ""
+msgstr "при конфликти да се ползва локалната версия"
 
 #: builtin/merge-file.c:37
 msgid "for conflicts, use their version"
-msgstr ""
+msgstr "при конфликти да се ползва чуждата версия"
 
 #: builtin/merge-file.c:39
 msgid "for conflicts, use a union version"
-msgstr ""
+msgstr "при конфликти да се ползва обединена версия"
 
 #: builtin/merge-file.c:42
 msgid "for conflicts, use this marker size"
-msgstr ""
+msgstr "при конфликти да се ползва маркер с такъв БРОЙ знаци"
 
 #: builtin/merge-file.c:43
 msgid "do not warn about conflicts"
-msgstr ""
+msgstr "без предупреждения при конфликти"
 
 #: builtin/merge-file.c:45
 msgid "set labels for file1/orig_file/file2"
-msgstr ""
+msgstr "задаване на етикети за ФАЙЛ_1/ОРИГИНАЛ/ФАЙЛ_2"
 
 #: builtin/mktree.c:64
 msgid "git mktree [-z] [--missing] [--batch]"
@@ -7172,7 +7644,7 @@
 
 #: builtin/mktree.c:150
 msgid "input is NUL terminated"
-msgstr "входните записа са разделени с нулевия знак „NUL“"
+msgstr "входните записи са разделени с нулевия знак „NUL“"
 
 #: builtin/mktree.c:151 builtin/write-tree.c:24
 msgid "allow missing objects"
@@ -7184,81 +7656,86 @@
 
 #: builtin/mv.c:15
 msgid "git mv [options] <source>... <destination>"
-msgstr "git mv [ОПЦИИ] ОБЕКТ… ЦЕЛ"
+msgstr "git mv [ОПЦИЯ…] ОБЕКТ… ЦЕЛ"
+
+# FIXME message<
+#: 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“ в индекса,\n"
+"или ги скатайте"
+
+# FIXME message
+#: 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:72
+#: builtin/mv.c:112
 msgid "skip move/rename errors"
 msgstr "прескачане на грешките при преместване/преименуване"
 
-#: builtin/mv.c:122
+#: 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:126
+#: builtin/mv.c:166
 msgid "bad source"
 msgstr "неправилен обект"
 
-#: builtin/mv.c:129
+#: builtin/mv.c:169
 msgid "can not move directory into itself"
 msgstr "директория не може да се премести в себе си"
 
-#: builtin/mv.c:132
+#: builtin/mv.c:172
 msgid "cannot move directory over file"
 msgstr "директория не може да се премести върху файл"
 
-# FIXME message<
-#: builtin/mv.c:138
-#, c-format
-msgid "Huh? Directory %s is in index and no submodule?"
-msgstr "Директорията „%s“ е в индекса, но не е подмодул"
-
-#: builtin/mv.c:140 builtin/rm.c:318
-msgid "Please, stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-"За да продължите или вкарайте промените по файла „.gitmodules“ в индекса,\n"
-"или ги скатайте"
-
-# FIXME message
-#: builtin/mv.c:156
-#, c-format
-msgid "Huh? %.*s is in index?"
-msgstr "„%.*s“ вече е в индекса"
-
-#: builtin/mv.c:169
+#: builtin/mv.c:181
 msgid "source directory is empty"
 msgstr "първоначалната директория е празна"
 
-#: builtin/mv.c:205
+#: builtin/mv.c:206
 msgid "not under version control"
 msgstr "не е под контрола на Git"
 
-#: builtin/mv.c:207
+#: builtin/mv.c:209
 msgid "destination exists"
 msgstr "целта съществува"
 
-#: builtin/mv.c:215
+#: builtin/mv.c:217
 #, c-format
 msgid "overwriting '%s'"
 msgstr "презаписване на „%s“"
 
-#: builtin/mv.c:218
+#: builtin/mv.c:220
 msgid "Cannot overwrite"
 msgstr "Презаписването е невъзможно"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:223
 msgid "multiple sources for the same target"
 msgstr "множество източници за една цел"
 
-#: builtin/mv.c:223
+#: builtin/mv.c:225
 msgid "destination directory does not exist"
 msgstr "целевата директория не съществува"
 
-#: builtin/mv.c:243
+#: builtin/mv.c:232
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, обект: „%s“, цел: „%s“"
@@ -7268,547 +7745,598 @@
 msgid "Renaming %s to %s\n"
 msgstr "Преименуване на „%s“ на „%s“\n"
 
-#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:358
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "неуспешно преименуване на „%s“"
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:255
 msgid "git name-rev [options] <commit>..."
-msgstr ""
+msgstr "git name-rev [ОПЦИЯ…] ПОДАВАНЕ…"
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:256
 msgid "git name-rev [options] --all"
-msgstr ""
+msgstr "git name-rev [ОПЦИЯ…] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:257
 msgid "git name-rev [options] --stdin"
-msgstr ""
+msgstr "git name-rev [ОПЦИЯ…] --stdin"
 
-# FIXME
-#: builtin/name-rev.c:312
+# FIXME sha
+#: builtin/name-rev.c:309
 msgid "print only names (no SHA-1)"
-msgstr ""
+msgstr "извеждане само на имената (без сумите по SHA1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:310
 msgid "only use tags to name the commits"
-msgstr ""
+msgstr "използване само на етикетите за именуване на подаванията"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:312
 msgid "only use refs matching <pattern>"
-msgstr ""
+msgstr "използване само на шаблоните напасващи на ШАБЛОНа"
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:314
 msgid "list all commits reachable from all refs"
 msgstr ""
+"извеждане на всички подавания, които могат да бъдат достигнати от всички "
+"указатели"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:315
 msgid "read from stdin"
-msgstr ""
+msgstr "четене от стандартния вход"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:316
 msgid "allow to print `undefined` names (default)"
-msgstr ""
+msgstr "да се извеждат и недефинираните имена (стандартна стойност на опцията)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:322
 msgid "dereference tags in the input (internal use)"
-msgstr ""
+msgstr "извеждане на идентификаторите на обекти-етикети (за вътрешни нужди)"
 
 #: builtin/notes.c:24
 msgid "git notes [--ref <notes_ref>] [list [<object>]]"
-msgstr ""
+msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] [list [ОБЕКТ]]"
 
 #: builtin/notes.c:25
 msgid ""
 "git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) "
 "<object>] [<object>]"
 msgstr ""
+"git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] add [-f] [-m СЪОБЩЕНИЕ | -F ФАЙЛ | (-c "
+"| -C) ОБЕКТ] [ОБЕКТ]"
 
 #: builtin/notes.c:26
 msgid "git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>"
 msgstr ""
+"git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] copy [-f] ОБЕКТ_ИЗТОЧНИК ОБЕКТ_ЦЕЛ"
 
 #: builtin/notes.c:27
 msgid ""
 "git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) "
 "<object>] [<object>]"
 msgstr ""
+"git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] append [-m СЪОБЩЕНИЕ | -F ФАЙЛ | (-c | "
+"-C) ОБЕКТ] [ОБЕКТ]"
 
 #: builtin/notes.c:28
 msgid "git notes [--ref <notes_ref>] edit [<object>]"
-msgstr ""
+msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] edit [ОБЕКТ]"
 
 #: builtin/notes.c:29
 msgid "git notes [--ref <notes_ref>] show [<object>]"
-msgstr ""
+msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] show [ОБЕКТ]"
 
 #: builtin/notes.c:30
 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
 msgid "git notes merge --commit [-v | -q]"
-msgstr ""
+msgstr "git notes merge --commit [-v | -q]"
 
 #: builtin/notes.c:32
 msgid "git notes merge --abort [-v | -q]"
-msgstr ""
+msgstr "git notes merge --abort [-v | -q]"
 
 #: builtin/notes.c:33
 msgid "git notes [--ref <notes_ref>] remove [<object>...]"
-msgstr ""
+msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] remove [ОБЕКТ…]"
 
 #: builtin/notes.c:34
 msgid "git notes [--ref <notes_ref>] prune [-n | -v]"
-msgstr ""
+msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] prune [-n | -v]"
 
 #: builtin/notes.c:35
 msgid "git notes [--ref <notes_ref>] get-ref"
-msgstr ""
+msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] get-ref"
 
 #: builtin/notes.c:40
 msgid "git notes [list [<object>]]"
-msgstr ""
+msgstr "git notes [list [ОБЕКТ]]"
 
 #: builtin/notes.c:45
 msgid "git notes add [<options>] [<object>]"
-msgstr ""
+msgstr "git notes add [ОПЦИЯ…] [ОБЕКТ]"
 
 #: builtin/notes.c:50
 msgid "git notes copy [<options>] <from-object> <to-object>"
-msgstr ""
+msgstr "git notes copy [ОПЦИЯ…] ОБЕКТ_ИЗТОЧНИК ОБЕКТ_ЦЕЛ"
 
 #: builtin/notes.c:51
 msgid "git notes copy --stdin [<from-object> <to-object>]..."
-msgstr ""
+msgstr "git notes copy --stdin [ОБЕКТ_ИЗТОЧНИК ОБЕКТ_ЦЕЛ]…"
 
 #: builtin/notes.c:56
 msgid "git notes append [<options>] [<object>]"
-msgstr ""
+msgstr "git notes append [ОПЦИЯ…] [ОБЕКТ]"
 
 #: builtin/notes.c:61
 msgid "git notes edit [<object>]"
-msgstr ""
+msgstr "git notes edit [ОБЕКТ]"
 
 #: builtin/notes.c:66
 msgid "git notes show [<object>]"
-msgstr ""
+msgstr "git notes show [ОБЕКТ]"
 
 #: builtin/notes.c:71
 msgid "git notes merge [<options>] <notes_ref>"
-msgstr ""
+msgstr "git notes merge [ОПЦИЯ…] УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
 
 #: builtin/notes.c:72
 msgid "git notes merge --commit [<options>]"
-msgstr ""
+msgstr "git notes merge --commit [ОПЦИЯ…]"
 
 #: builtin/notes.c:73
 msgid "git notes merge --abort [<options>]"
-msgstr ""
+msgstr "git notes merge --abort [ОПЦИЯ…]"
 
 #: builtin/notes.c:78
 msgid "git notes remove [<object>]"
-msgstr ""
+msgstr "git notes remove [ОБЕКТ]"
 
 #: builtin/notes.c:83
 msgid "git notes prune [<options>]"
-msgstr ""
+msgstr "git notes prune [ОПЦИЯ…]"
 
 #: builtin/notes.c:88
 msgid "git notes get-ref"
-msgstr ""
+msgstr "git notes get-ref"
 
-#: builtin/notes.c:137
+#: builtin/notes.c:136
 #, c-format
 msgid "unable to start 'show' for object '%s'"
-msgstr ""
+msgstr "действието „show“ не може да се изпълни за обект „%s“"
 
-#: builtin/notes.c:141
+#: builtin/notes.c:140
 msgid "could not read 'show' output"
-msgstr ""
+msgstr "изведената информация от действието „show“ не може да се прочете"
 
-#: builtin/notes.c:149
+#: builtin/notes.c:148
 #, c-format
 msgid "failed to finish 'show' for object '%s'"
-msgstr ""
+msgstr "действието „show“ не може да се завърши за обект „%s“"
 
-#: builtin/notes.c:167 builtin/tag.c:373
+#: builtin/notes.c:166 builtin/tag.c:477
 #, c-format
 msgid "could not create file '%s'"
-msgstr ""
+msgstr "файлът „%s“ не може да бъде създаден"
 
-#: builtin/notes.c:186
+#: builtin/notes.c:185
 msgid "Please supply the note contents using either -m or -F option"
-msgstr ""
+msgstr "Задайте съдържанието на бележката с някоя от опциите „-m“ или „-F“"
 
-#: builtin/notes.c:207 builtin/notes.c:848
+#: builtin/notes.c:206 builtin/notes.c:847
 #, c-format
 msgid "Removing note for object %s\n"
-msgstr ""
+msgstr "Изтриване на бележката за обекта „%s“\n"
 
-#: builtin/notes.c:212
+#: builtin/notes.c:211
 msgid "unable to write note object"
-msgstr ""
+msgstr "обектът-бележка не може да бъде записан"
 
-#: builtin/notes.c:214
+#: builtin/notes.c:213
 #, c-format
-msgid "The note contents has been left in %s"
-msgstr ""
+msgid "The note contents have been left in %s"
+msgstr "Съдържанието на бележката е във файла „%s“"
 
-#: builtin/notes.c:248 builtin/tag.c:604
+#: builtin/notes.c:247 builtin/tag.c:693
 #, c-format
 msgid "cannot read '%s'"
-msgstr ""
+msgstr "файлът „%s“ не може да бъде прочетен"
 
-#: builtin/notes.c:250 builtin/tag.c:607
+#: builtin/notes.c:249 builtin/tag.c:696
 #, c-format
 msgid "could not open or read '%s'"
-msgstr ""
+msgstr "файлът „%s“ не може да бъде отворен или прочетен"
 
-#: builtin/notes.c:269 builtin/notes.c:320 builtin/notes.c:322
-#: builtin/notes.c:382 builtin/notes.c:436 builtin/notes.c:519
-#: builtin/notes.c:524 builtin/notes.c:599 builtin/notes.c:641
-#: builtin/notes.c:843 builtin/tag.c:620
+#: builtin/notes.c:268 builtin/notes.c:319 builtin/notes.c:321
+#: builtin/notes.c:381 builtin/notes.c:435 builtin/notes.c:518
+#: builtin/notes.c:523 builtin/notes.c:598 builtin/notes.c:640
+#: builtin/notes.c:842 builtin/tag.c:709
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
-msgstr ""
+msgstr "Не може да се открие към какво сочи „%s“."
 
-#: builtin/notes.c:272
+#: builtin/notes.c:271
 #, c-format
 msgid "Failed to read object '%s'."
-msgstr ""
+msgstr "Обектът „%s“ не може да бъде прочетен."
 
-#: builtin/notes.c:276
+#: builtin/notes.c:275
 #, c-format
 msgid "Cannot read note data from non-blob object '%s'."
 msgstr ""
+"Съдържанието на бележка не може да се вземе от обект, който не е BLOB: „%s“."
 
-#: builtin/notes.c:316
+#: builtin/notes.c:315
 #, c-format
 msgid "Malformed input line: '%s'."
-msgstr ""
+msgstr "Даденият входен ред е с неправилен формат: „%s“."
 
-#: builtin/notes.c:331
+#: builtin/notes.c:330
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
-msgstr ""
+msgstr "Бележката не може да се копира от „%s“ към „%s“"
 
-#: builtin/notes.c:375 builtin/notes.c:429 builtin/notes.c:502
-#: builtin/notes.c:514 builtin/notes.c:587 builtin/notes.c:634
-#: builtin/notes.c:908
+#: builtin/notes.c:374 builtin/notes.c:428 builtin/notes.c:501
+#: builtin/notes.c:513 builtin/notes.c:586 builtin/notes.c:633
+#: builtin/notes.c:907
 msgid "too many parameters"
-msgstr ""
+msgstr "прекалено много параметри"
 
-#: builtin/notes.c:388 builtin/notes.c:647
+#: builtin/notes.c:387 builtin/notes.c:646
 #, c-format
 msgid "No note found for object %s."
-msgstr ""
+msgstr "Няма бележки за обекта „%s“."
 
-#: builtin/notes.c:410 builtin/notes.c:567
+#: builtin/notes.c:409 builtin/notes.c:566
 msgid "note contents as a string"
-msgstr ""
+msgstr "низ, който е съдържанието на бележката"
 
-#: builtin/notes.c:413 builtin/notes.c:570
+#: builtin/notes.c:412 builtin/notes.c:569
 msgid "note contents in a file"
-msgstr ""
+msgstr "файл със съдържанието на бележката"
 
-#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
-#: builtin/notes.c:575 builtin/tag.c:539
+#: builtin/notes.c:414 builtin/notes.c:417 builtin/notes.c:571
+#: builtin/notes.c:574 builtin/tag.c:628
 msgid "object"
-msgstr ""
+msgstr "обект"
 
-#: builtin/notes.c:416 builtin/notes.c:573
+#: builtin/notes.c:415 builtin/notes.c:572
 msgid "reuse and edit specified note object"
-msgstr ""
+msgstr "преизползване и редактиране на указания обект-бележка"
 
-#: builtin/notes.c:419 builtin/notes.c:576
+#: builtin/notes.c:418 builtin/notes.c:575
 msgid "reuse specified note object"
-msgstr ""
+msgstr "преизползване на указания обект-бележка"
 
-#: builtin/notes.c:421 builtin/notes.c:489
+#: builtin/notes.c:420 builtin/notes.c:488
 msgid "replace existing notes"
-msgstr ""
+msgstr "замяна на съществуващите бележки"
 
-#: builtin/notes.c:455
+#: builtin/notes.c:454
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr ""
+"Не може да се добави бележка, защото такава вече съществува за обекта „%s“. "
+"Използвайте опцията „-f“, за да презапишете съществуващи бележки."
 
-#: builtin/notes.c:460 builtin/notes.c:537
+#: builtin/notes.c:459 builtin/notes.c:536
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
-msgstr ""
+msgstr "Презаписване на съществуващите бележки за обекта „%s“\n"
 
-#: builtin/notes.c:490
+#: builtin/notes.c:489
 msgid "read objects from stdin"
-msgstr ""
+msgstr "изчитане на обектите от стандартния вход"
 
-#: builtin/notes.c:492
+# FIXME imporve message
+#: builtin/notes.c:491
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr ""
+"зареждане на настройките за КОМАНДАта, която презаписва подавания (включва "
+"опцията „--stdin“)"
 
-#: builtin/notes.c:510
+#: builtin/notes.c:509
 msgid "too few parameters"
-msgstr ""
+msgstr "прекалено малко параметри"
 
-#: builtin/notes.c:531
+#: builtin/notes.c:530
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr ""
+"Не може да се копира бележка, защото такава вече съществува за обекта „%s“. "
+"Използвайте опцията „-f“, за да презапишете съществуващи бележки."
 
-#: builtin/notes.c:543
+#: builtin/notes.c:542
 #, c-format
 msgid "Missing notes on source object %s. Cannot copy."
 msgstr ""
+"Не може да се копира бележка, която не съществува — няма бележки за обекта-"
+"източник „%s“."
 
-#: builtin/notes.c:592
+#: builtin/notes.c:591
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
 "Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
 msgstr ""
+"Задаването на опциите „-m“/„-F“/„-c“/„-C“ с командата „edit“ вече е "
+"остаряло.\n"
+"Вместо това ги използвайте с командата „add“: „git notes add -f -m/-F/-c/-"
+"C“.\n"
 
-#: builtin/notes.c:739
+#: builtin/notes.c:738
 msgid "General options"
-msgstr ""
+msgstr "Общи опции"
 
-#: builtin/notes.c:741
+#: builtin/notes.c:740
 msgid "Merge options"
-msgstr ""
+msgstr "Опции при сливане"
 
-#: builtin/notes.c:743
+#: builtin/notes.c:742
 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:745
+#: builtin/notes.c:744
 msgid "Committing unmerged notes"
-msgstr ""
+msgstr "Подаване на неслети бележки"
 
-#: builtin/notes.c:747
+#: builtin/notes.c:746
 msgid "finalize notes merge by committing unmerged notes"
-msgstr ""
+msgstr "завършване на сливането чрез подаване на неслети бележки"
 
-#: builtin/notes.c:749
+#: builtin/notes.c:748
 msgid "Aborting notes merge resolution"
-msgstr ""
+msgstr "Преустановяване на корекцията при сливането на бележки"
 
-#: builtin/notes.c:751
+#: builtin/notes.c:750
 msgid "abort notes merge"
-msgstr ""
+msgstr "преустановяване на сливането на бележки"
 
-#: builtin/notes.c:846
+#: builtin/notes.c:845
 #, c-format
 msgid "Object %s has no note\n"
-msgstr ""
+msgstr "Няма бележки за обекта „%s“\n"
 
-#: builtin/notes.c:858
+#: builtin/notes.c:857
 msgid "attempt to remove non-existent note is not an error"
-msgstr ""
+msgstr "опитът за изтриването на несъществуваща бележка не се счита за грешка"
 
-#: builtin/notes.c:861
+#: builtin/notes.c:860
 msgid "read object names from the standard input"
-msgstr ""
+msgstr "изчитане на имената на обектите от стандартния вход"
+
+#: builtin/notes.c:941
+msgid "notes-ref"
+msgstr "УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
 
 #: builtin/notes.c:942
-msgid "notes-ref"
-msgstr ""
-
-#: builtin/notes.c:943
 msgid "use notes from <notes_ref>"
-msgstr ""
+msgstr "да се използва бележката сочена от този УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
 
-#: builtin/notes.c:978 builtin/remote.c:1593
+#: builtin/notes.c:977 builtin/remote.c:1624
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Непозната подкоманда: %s"
 
-#: builtin/pack-objects.c:25
+#: builtin/pack-objects.c:28
 msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
 msgstr ""
+"git pack-objects --stdout [ОПЦИЯ…] [< СПИСЪК_С_ВЕРСИИ | < СПИСЪК_С_ОБЕКТИ]"
 
-#: builtin/pack-objects.c:26
+# FIXME [options] vs [options...]
+#: 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
+#: builtin/pack-objects.c:177 builtin/pack-objects.c:180
 #, c-format
 msgid "deflate error (%d)"
-msgstr ""
+msgstr "грешка при декомпресиране с „deflate“ (%d)"
 
-#: builtin/pack-objects.c:771
+#: builtin/pack-objects.c:773
 msgid "Writing objects"
 msgstr "Записване на обектите"
 
-#: builtin/pack-objects.c:1012
+#: builtin/pack-objects.c:1015
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
+"изключване на записването на битовата маска, защото някои обекти няма да се "
+"пакетират"
 
-#: builtin/pack-objects.c:2174
+#: builtin/pack-objects.c:2175
 msgid "Compressing objects"
 msgstr "Компресиране на обектите"
 
-#: builtin/pack-objects.c:2530
+#: builtin/pack-objects.c:2572
 #, c-format
 msgid "unsupported index version %s"
-msgstr ""
+msgstr "неподдържана версия на индекса „%s“"
 
-#: builtin/pack-objects.c:2534
+#: builtin/pack-objects.c:2576
 #, c-format
 msgid "bad index version '%s'"
-msgstr ""
+msgstr "неправилна версия на индекса „%s“"
 
-#: builtin/pack-objects.c:2557
+#: builtin/pack-objects.c:2599
 #, c-format
 msgid "option %s does not accept negative form"
-msgstr ""
+msgstr "опцията „%s“ не притежава отрицателна версия"
 
-#: builtin/pack-objects.c:2561
+#: builtin/pack-objects.c:2603
 #, c-format
 msgid "unable to parse value '%s' for option %s"
-msgstr ""
-
-#: builtin/pack-objects.c:2580
-msgid "do not show progress meter"
-msgstr ""
-
-#: builtin/pack-objects.c:2582
-msgid "show progress meter"
-msgstr ""
-
-#: builtin/pack-objects.c:2584
-msgid "show progress meter during object writing phase"
-msgstr ""
-
-#: builtin/pack-objects.c:2587
-msgid "similar to --all-progress when progress meter is shown"
-msgstr ""
-
-#: builtin/pack-objects.c:2588
-msgid "version[,offset]"
-msgstr ""
-
-#: builtin/pack-objects.c:2589
-msgid "write the pack index file in the specified idx format version"
-msgstr ""
-
-#: builtin/pack-objects.c:2592
-msgid "maximum size of each output pack file"
-msgstr ""
-
-#: builtin/pack-objects.c:2594
-msgid "ignore borrowed objects from alternate object store"
-msgstr ""
-
-#: builtin/pack-objects.c:2596
-msgid "ignore packed objects"
-msgstr ""
-
-#: builtin/pack-objects.c:2598
-msgid "limit pack window by objects"
-msgstr ""
-
-#: builtin/pack-objects.c:2600
-msgid "limit pack window by memory in addition to object limit"
-msgstr ""
-
-#: builtin/pack-objects.c:2602
-msgid "maximum length of delta chain allowed in the resulting pack"
-msgstr ""
-
-#: builtin/pack-objects.c:2604
-msgid "reuse existing deltas"
-msgstr ""
-
-#: builtin/pack-objects.c:2606
-msgid "reuse existing objects"
-msgstr ""
-
-#: builtin/pack-objects.c:2608
-msgid "use OFS_DELTA objects"
-msgstr ""
-
-#: builtin/pack-objects.c:2610
-msgid "use threads when searching for best delta matches"
-msgstr ""
-
-#: builtin/pack-objects.c:2612
-msgid "do not create an empty pack output"
-msgstr ""
-
-#: builtin/pack-objects.c:2614
-msgid "read revision arguments from standard input"
-msgstr ""
-
-#: builtin/pack-objects.c:2616
-msgid "limit the objects to those that are not yet packed"
-msgstr ""
-
-#: builtin/pack-objects.c:2619
-msgid "include objects reachable from any reference"
-msgstr ""
+msgstr "неразпозната стойност „%s“ за опцията „%s“"
 
 #: builtin/pack-objects.c:2622
-msgid "include objects referred by reflog entries"
-msgstr ""
+msgid "do not show progress meter"
+msgstr "без извеждане на напредъка"
 
-#: builtin/pack-objects.c:2625
-msgid "output pack to stdout"
-msgstr ""
+#: builtin/pack-objects.c:2624
+msgid "show progress meter"
+msgstr "извеждане на напредъка"
 
-#: builtin/pack-objects.c:2627
-msgid "include tag objects that refer to objects to be packed"
-msgstr ""
+#: builtin/pack-objects.c:2626
+msgid "show progress meter during object writing phase"
+msgstr "извеждане на напредъка във фазата на запазване на обектите"
 
 #: builtin/pack-objects.c:2629
-msgid "keep unreachable objects"
+msgid "similar to --all-progress when progress meter is shown"
 msgstr ""
+"същото действие като опцията „--all-progress“ при извеждането на напредъка"
 
-#: builtin/pack-objects.c:2630 parse-options.h:140
-msgid "time"
-msgstr "време"
+#: builtin/pack-objects.c:2630
+msgid "version[,offset]"
+msgstr "ВЕРСИЯ[,ОТМЕСТВАНЕ]"
 
 #: builtin/pack-objects.c:2631
-msgid "unpack unreachable objects newer than <time>"
+msgid "write the pack index file in the specified idx format version"
 msgstr ""
+"запазване на индекса на пакетните файлове във форма̀та с указаната версия"
 
 #: builtin/pack-objects.c:2634
-msgid "create thin packs"
-msgstr ""
+msgid "maximum size of each output pack file"
+msgstr "максимален размер на всеки пакетен файл"
 
 #: builtin/pack-objects.c:2636
-msgid "ignore packs that have companion .keep file"
-msgstr ""
+msgid "ignore borrowed objects from alternate object store"
+msgstr "игнориране на обектите заети от други хранилища на обекти"
 
 #: builtin/pack-objects.c:2638
-msgid "pack compression level"
-msgstr ""
+msgid "ignore packed objects"
+msgstr "игнориране на пакетираните обекти"
 
 #: builtin/pack-objects.c:2640
-msgid "do not hide commits by grafts"
-msgstr ""
+msgid "limit pack window by objects"
+msgstr "ограничаване на прозореца за пакетиране по брой обекти"
 
 #: builtin/pack-objects.c:2642
-msgid "use a bitmap index if available to speed up counting objects"
+msgid "limit pack window by memory in addition to object limit"
 msgstr ""
+"ограничаване на прозореца за пакетиране и по памет освен по брой обекти"
 
 #: builtin/pack-objects.c:2644
+msgid "maximum length of delta chain allowed in the resulting pack"
+msgstr ""
+"максимална дължина на веригата от разлики, която е позволена в пакетния файл"
+
+#: builtin/pack-objects.c:2646
+msgid "reuse existing deltas"
+msgstr "преизползване на съществуващите разлики"
+
+#: builtin/pack-objects.c:2648
+msgid "reuse existing objects"
+msgstr "преизползване на съществуващите обекти"
+
+#: builtin/pack-objects.c:2650
+msgid "use OFS_DELTA objects"
+msgstr "използване на обекти „OFS_DELTA“"
+
+#: builtin/pack-objects.c:2652
+msgid "use threads when searching for best delta matches"
+msgstr ""
+"стартиране на нишки за претърсване на най-добрите съвпадения на разликите"
+
+#: builtin/pack-objects.c:2654
+msgid "do not create an empty pack output"
+msgstr "без създаване на празен пакетен файл"
+
+#: builtin/pack-objects.c:2656
+msgid "read revision arguments from standard input"
+msgstr "изчитане на версиите от стандартния вход"
+
+#: builtin/pack-objects.c:2658
+msgid "limit the objects to those that are not yet packed"
+msgstr "ограничаване до все още непакетираните обекти"
+
+#: builtin/pack-objects.c:2661
+msgid "include objects reachable from any reference"
+msgstr ""
+"включване на всички обекти, които могат да се достигнат от произволен "
+"указател"
+
+#: builtin/pack-objects.c:2664
+msgid "include objects referred by reflog entries"
+msgstr "включване и на обектите сочени от записите в журнала на указателите"
+
+#: builtin/pack-objects.c:2667
+msgid "include objects referred to by the index"
+msgstr "включване и на обектите сочени от индекса"
+
+#: builtin/pack-objects.c:2670
+msgid "output pack to stdout"
+msgstr "извеждане на пакета на стандартния изход"
+
+#: builtin/pack-objects.c:2672
+msgid "include tag objects that refer to objects to be packed"
+msgstr ""
+"включване и на обектите-етикети, които сочат към обектите, които ще бъдат "
+"пакетирани"
+
+#: builtin/pack-objects.c:2674
+msgid "keep unreachable objects"
+msgstr "запазване на недостижимите обекти"
+
+#: builtin/pack-objects.c:2675 parse-options.h:140
+msgid "time"
+msgstr "ВРЕМЕ"
+
+#: builtin/pack-objects.c:2676
+msgid "unpack unreachable objects newer than <time>"
+msgstr "разпакетиране на недостижимите обекти, които са по-нови от това ВРЕМЕ"
+
+#: builtin/pack-objects.c:2679
+msgid "create thin packs"
+msgstr "създаване на съкратени пакети"
+
+#: builtin/pack-objects.c:2681
+msgid "ignore packs that have companion .keep file"
+msgstr "игнориране на пакетите, които са придружени от файл „.keep“"
+
+#: builtin/pack-objects.c:2683
+msgid "pack compression level"
+msgstr "ниво на компресиране при пакетиране"
+
+#: builtin/pack-objects.c:2685
+msgid "do not hide commits by grafts"
+msgstr ""
+"извеждане на всички родители — дори и тези, които нормално са скрити при "
+"присажданията"
+
+#: builtin/pack-objects.c:2687
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr ""
+"използване на съществуващи индекси на база битови маски за ускоряване на "
+"преброяването на обектите"
+
+#: builtin/pack-objects.c:2689
 msgid "write a bitmap index together with the pack index"
 msgstr ""
+"запазване и на индекс на база побитова маска, заедно с индекса за пакета"
 
-#: builtin/pack-objects.c:2723
+#: builtin/pack-objects.c:2778
 msgid "Counting objects"
 msgstr "Преброяване на обектите"
 
 #: builtin/pack-refs.c:6
 msgid "git pack-refs [options]"
-msgstr "git pack-refs [ОПЦИИ]"
+msgstr "git pack-refs [ОПЦИЯ…]"
 
 #: builtin/pack-refs.c:14
 msgid "pack everything"
@@ -7822,7 +8350,7 @@
 msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
 msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]"
 
-#: builtin/prune-packed.c:49
+#: builtin/prune-packed.c:40
 msgid "Removing duplicate objects"
 msgstr "Изтриване на повтарящите се обекти"
 
@@ -7830,21 +8358,21 @@
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire ВРЕМЕ] [--] [ВРЪХ…]"
 
-#: builtin/prune.c:142
+#: builtin/prune.c:106
 msgid "do not remove, show only"
 msgstr "само извеждане без действително окастряне"
 
-#: builtin/prune.c:143
+#: builtin/prune.c:107
 msgid "report pruned objects"
 msgstr "информация за окастрените обекти"
 
-#: builtin/prune.c:146
+#: builtin/prune.c:110
 msgid "expire objects older than <time>"
 msgstr "окастряне на обектите по-стари от това ВРЕМЕ"
 
 #: builtin/push.c:14
 msgid "git push [<options>] [<repository> [<refspec>...]]"
-msgstr "git push [ОПЦИИ] [ХРАНИЛИЩЕ [УКАЗАТЕЛ_НА_ВЕРСИЯ…]]"
+msgstr "git push [ОПЦИЯ…] [ХРАНИЛИЩЕ [УКАЗАТЕЛ_НА_ВЕРСИЯ…]]"
 
 #: builtin/push.c:85
 msgid "tag shorthand without <tag>"
@@ -7854,16 +8382,16 @@
 msgid "--delete only accepts plain target ref names"
 msgstr "опцията „--delete“ приема за цел само прости имена на указатели"
 
-#: builtin/push.c:140
+#: builtin/push.c:139
 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:142
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -7888,7 +8416,7 @@
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:158
+#: builtin/push.c:157
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -7902,7 +8430,7 @@
 "\n"
 "    git push %s HEAD:ИМЕ_НА_ОТДАЛЕЧЕНИЯ_КЛОН\n"
 
-#: builtin/push.c:172
+#: builtin/push.c:171
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -7916,14 +8444,14 @@
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:180
+#: builtin/push.c:179
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr ""
 "Текущият клон „%s“ следи няколко отдалечени клона, не можете просто да "
 "изтласкате."
 
-#: builtin/push.c:183
+#: builtin/push.c:182
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -7935,7 +8463,7 @@
 "Трябва да укажете коя версия да се изтласка, за обновяване на отдалечения "
 "клон."
 
-#: builtin/push.c:206
+#: builtin/push.c:205
 msgid ""
 "push.default is unset; its implicit value has changed in\n"
 "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
@@ -7988,14 +8516,14 @@
 "Новата стойност „simple“ бе въведена с версия 1.7.11 на Git. Ако понякога\n"
 "ползвате стари версии на Git, задайте стойност „current“ вместо „simple“."
 
-#: builtin/push.c:273
+#: builtin/push.c:272
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
-"Не сте указали версия за подаване, а настройката „push.default“ не е "
-"зададена."
+"Не сте указали версия за подаване, а настройката „push.default“ е "
+"„nothing“ (нищо без изрично указана версия да не се изтласква)"
 
-#: builtin/push.c:280
+#: builtin/push.c:279
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -8009,21 +8537,20 @@
 "преди отново да изтласкате промените. За повече информация вижте раздела\n"
 "„Note about fast-forwards“ в страницата от ръководството „git push --help“."
 
-#: builtin/push.c:286
+#: builtin/push.c:285
 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"
+"Обновяването е отхвърлено, защото върхът на изтласквания клон е преди върха\n"
+"на отдалечения клон. Проверете клона и внесете отдалечените промени (напр.\n"
+"с командата „git pull…“), преди отново да изтласкате промените. За повече\n"
 "информация вижте раздела „Note about fast-forwards“ в страницата от\n"
 "ръководството „git push --help“."
 
-#: builtin/push.c:292
+#: builtin/push.c:291
 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"
@@ -8042,40 +8569,39 @@
 "от\n"
 "ръководството „git push --help“."
 
-#: builtin/push.c:299
+#: builtin/push.c:298
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr ""
 "Изтласкването е отхвърлено, защото в отдалеченото хранилище съществува "
 "етикет,\n"
 "който ще припокриете с етикет от вашето хранилище."
 
-#: builtin/push.c:302
+#: builtin/push.c:301
 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 ""
-"Не можете да обновите отдалечен указател, който вече сочи към обект, който "
-"не е\n"
-"подаване, както и тепърва да го промените да сочи към подобен обект, без да\n"
-"укажете опцията опцията „--force“.\n"
+"Без да укажете опцията опцията „--force“, не може да обновите отдалечен\n"
+"указател, който вече сочи към обект, който не е подаване, както и тепърва\n"
+"да го промените да сочи към подобен обект.\n"
 
-#: builtin/push.c:361
+#: builtin/push.c:360
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Изтласкване към „%s“\n"
 
-#: builtin/push.c:365
+#: builtin/push.c:364
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "част от указателите не бяха изтласкани към „%s“"
 
-#: builtin/push.c:395
+#: builtin/push.c:394
 #, c-format
 msgid "bad repository '%s'"
 msgstr "неправилно указано хранилище „%s“"
 
-#: builtin/push.c:396
+#: builtin/push.c:395
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -8097,172 +8623,180 @@
 "\n"
 "    git push ИМЕ\n"
 
-#: builtin/push.c:411
+#: builtin/push.c:410
 msgid "--all and --tags are incompatible"
 msgstr "опциите „--all“ и „--tags“ са несъвместими"
 
-#: builtin/push.c:412
+#: builtin/push.c:411
 msgid "--all can't be combined with refspecs"
 msgstr "опцията „--all“ е несъвместима с указването на версия"
 
-#: builtin/push.c:417
+#: builtin/push.c:416
 msgid "--mirror and --tags are incompatible"
 msgstr "опциите „--mirror“ и „--tags“ са несъвместими"
 
-#: builtin/push.c:418
+#: builtin/push.c:417
 msgid "--mirror can't be combined with refspecs"
 msgstr "опцията „--mirror“ е несъвместима с указването на версия"
 
-#: builtin/push.c:423
+#: builtin/push.c:422
 msgid "--all and --mirror are incompatible"
 msgstr "опциите „--all“ и „--mirror“ са несъвместими"
 
-#: builtin/push.c:483
+#: builtin/push.c:493
 msgid "repository"
 msgstr "хранилище"
 
-#: builtin/push.c:484
+#: builtin/push.c:494
 msgid "push all refs"
 msgstr "изтласкване на всички указатели"
 
-#: builtin/push.c:485
+#: builtin/push.c:495
 msgid "mirror all refs"
 msgstr "огледално копие на всички указатели"
 
-#: builtin/push.c:487
+#: builtin/push.c:497
 msgid "delete refs"
 msgstr "изтриване на указателите"
 
-#: builtin/push.c:488
+#: builtin/push.c:498
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "изтласкване на етикетите (несъвместимо с опциите „--all“ и „--mirror“)"
 
-#: builtin/push.c:491
+#: builtin/push.c:501
 msgid "force updates"
 msgstr "принудително обновяване"
 
-# # FIXME double check this
-#: builtin/push.c:493
+# FIXME double check this
+#: builtin/push.c:503
 msgid "refname>:<expect"
 msgstr "УКАЗАТЕЛ>:<ОЧАКВАНА_СТОЙНОСТ"
 
-#: builtin/push.c:494
+#: builtin/push.c:504
 msgid "require old value of ref to be at this value"
 msgstr "УКАЗАТЕЛят трябва първоначално да е с тази ОЧАКВАНА_СТОЙНОСТ"
 
-#: builtin/push.c:496
+#: builtin/push.c:506
 msgid "check"
 msgstr "проверка"
 
-#: builtin/push.c:497
+#: builtin/push.c:507
 msgid "control recursive pushing of submodules"
 msgstr "управление на рекурсивното изтласкване на подмодулите"
 
-#: builtin/push.c:499
+#: builtin/push.c:509
 msgid "use thin pack"
 msgstr "използване на съкратени пакети"
 
-#: builtin/push.c:500 builtin/push.c:501
+#: builtin/push.c:510 builtin/push.c:511
 msgid "receive pack program"
 msgstr "програма за получаването на пакети"
 
-#: builtin/push.c:502
+#: builtin/push.c:512
 msgid "set upstream for git pull/status"
 msgstr "задаване на отдалеченото хранилище за командите „git pull/status“"
 
-#: builtin/push.c:505
+#: builtin/push.c:515
 msgid "prune locally removed refs"
 msgstr "окастряне на указателите, които са премахнати от локалното хранилище"
 
-#: builtin/push.c:507
+#: builtin/push.c:517
 msgid "bypass pre-push hook"
 msgstr "без изпълнение на куката преди изтласкване (pre-push)"
 
-#: builtin/push.c:508
+#: builtin/push.c:518
 msgid "push missing but relevant tags"
 msgstr ""
 "изтласкване на липсващите в отдалеченото хранилище, но свързани с текущото "
 "изтласкване, етикети"
 
-#: builtin/push.c:518
+#: builtin/push.c:520
+msgid "GPG sign the push"
+msgstr "подписване на изтласкването с GPG"
+
+#: builtin/push.c:529
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr ""
 "опцията „--delete“ е несъвместима с опциите  „--all“, „--mirror“ и „--tags“"
 
-#: builtin/push.c:520
+#: builtin/push.c:531
 msgid "--delete doesn't make sense without any refs"
 msgstr "опцията „--delete“ изисква поне един указател на версия"
 
-#: builtin/read-tree.c:36
+#: 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=ФАЙЛ_С_ИЗКЛЮЧЕНИЯ] | -i]] [--no-sparse-"
+"checkout] [--index-output=ФАЙЛ] (--empty | УКАЗАТЕЛ_КЪМ_ДЪРВО_1 "
+"[УКАЗАТЕЛ_КЪМ_ДЪРВО_2 [УКАЗАТЕЛ_КЪМ_ДЪРВО_3]])"
 
-#: builtin/read-tree.c:109
+#: builtin/read-tree.c:110
 msgid "write resulting index to <file>"
-msgstr ""
+msgstr "запазване на индекса в този ФАЙЛ"
 
-#: builtin/read-tree.c:112
+#: builtin/read-tree.c:113
 msgid "only empty the index"
-msgstr ""
+msgstr "само зануляване на индекса"
 
-#: builtin/read-tree.c:114
+#: builtin/read-tree.c:115
 msgid "Merging"
-msgstr ""
+msgstr "Сливане"
 
-#: builtin/read-tree.c:116
+#: builtin/read-tree.c:117
 msgid "perform a merge in addition to a read"
-msgstr ""
+msgstr "да се извърши и сливане след освен изчитането"
 
-#: builtin/read-tree.c:118
+#: builtin/read-tree.c:119
 msgid "3-way merge if no file level merging required"
-msgstr ""
+msgstr "тройно сливане, ако не се налага пофайлово сливане"
 
-#: builtin/read-tree.c:120
+#: builtin/read-tree.c:121
 msgid "3-way merge in presence of adds and removes"
-msgstr ""
-
-#: builtin/read-tree.c:122
-msgid "same as -m, but discard unmerged entries"
-msgstr ""
+msgstr "тройно сливане при добавяне на добавяне и изтриване на файлове"
 
 #: builtin/read-tree.c:123
-msgid "<subdirectory>/"
-msgstr ""
+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 ""
+msgstr "изчитане на дървото към индекса като да е в тази ПОДДИРЕКТОРИЯ/"
 
-#: builtin/read-tree.c:127
+#: builtin/read-tree.c:128
 msgid "update working tree with merge result"
-msgstr ""
-
-#: builtin/read-tree.c:129
-msgid "gitignore"
-msgstr ""
+msgstr "обновяване на работното дърво с резултата от сливането"
 
 #: builtin/read-tree.c:130
-msgid "allow explicitly ignored files to be overwritten"
-msgstr ""
+msgid "gitignore"
+msgstr "ФАЙЛ_С_ИЗКЛЮЧЕНИЯ"
 
-#: builtin/read-tree.c:133
-msgid "don't check the working tree after merging"
-msgstr ""
+#: builtin/read-tree.c:131
+msgid "allow explicitly ignored files to be overwritten"
+msgstr "позволяване на презаписването на изрично пренебрегваните файлове"
 
 #: builtin/read-tree.c:134
+msgid "don't check the working tree after merging"
+msgstr "без проверка на работното дърво след сливането"
+
+#: builtin/read-tree.c:135
 msgid "don't update the index or the work tree"
-msgstr ""
+msgstr "без обновяване и на индекса, и на работното дърво"
 
-#: builtin/read-tree.c:136
+#: builtin/read-tree.c:137
 msgid "skip applying sparse checkout filter"
-msgstr ""
+msgstr "без прилагане на филтъра за частично изтегляне"
 
-#: builtin/read-tree.c:138
+#: builtin/read-tree.c:139
 msgid "debug unpack-trees"
-msgstr ""
+msgstr "изчистване на грешки в командата „unpack-trees“"
 
 # FIXME
 #: builtin/reflog.c:499
@@ -8332,7 +8866,7 @@
 
 #: builtin/remote.c:28
 msgid "git remote add [<options>] <name> <url>"
-msgstr "git remote add [ОПЦИИ] ИМЕ АДРЕС"
+msgstr "git remote add [ОПЦИЯ…] ИМЕ АДРЕС"
 
 #: builtin/remote.c:43
 msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
@@ -8348,15 +8882,15 @@
 
 #: builtin/remote.c:54
 msgid "git remote show [<options>] <name>"
-msgstr "git remote show [ОПЦИИ] ИМЕ"
+msgstr "git remote show [ОПЦИЯ…] ИМЕ"
 
 #: builtin/remote.c:59
 msgid "git remote prune [<options>] <name>"
-msgstr "git remote prune [ОПЦИИ] ИМЕ"
+msgstr "git remote prune [ОПЦИЯ…] ИМЕ"
 
 #: builtin/remote.c:64
 msgid "git remote update [<options>] [<group> | <remote>]..."
-msgstr "git remote update [ОПЦИИ] [ГРУПА | ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ]…"
+msgstr "git remote update [ОПЦИЯ…] [ГРУПА | ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ]…"
 
 #: builtin/remote.c:88
 #, c-format
@@ -8432,21 +8966,16 @@
 msgid "Could not setup master '%s'"
 msgstr "Основният клон „%s“ не може да бъде настроен"
 
-#: builtin/remote.c:289
-#, c-format
-msgid "more than one %s"
-msgstr "повече от едно отдалечено хранилище на име „%s“"
-
-#: builtin/remote.c:334
+#: builtin/remote.c:333
 #, c-format
 msgid "Could not get fetch map for refspec %s"
 msgstr "Обектите за доставяне за указателя „%s“ не могат да бъдат получени"
 
-#: builtin/remote.c:435 builtin/remote.c:443
+#: builtin/remote.c:434 builtin/remote.c:442
 msgid "(matching)"
 msgstr "(съвпадащи)"
 
-#: builtin/remote.c:447
+#: builtin/remote.c:446
 msgid "(delete)"
 msgstr "(за изтриване)"
 
@@ -8455,7 +8984,7 @@
 msgid "Could not append '%s' to '%s'"
 msgstr "„%s“ не може да се добави към „%s“"
 
-#: builtin/remote.c:634 builtin/remote.c:787 builtin/remote.c:885
+#: builtin/remote.c:634 builtin/remote.c:798 builtin/remote.c:898
 #, c-format
 msgid "No such remote: %s"
 msgstr "Такова отдалечено хранилище няма: %s"
@@ -8465,7 +8994,7 @@
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "Разделът „%s“ в настройките не може да бъде преименуван на „%s“"
 
-#: builtin/remote.c:657 builtin/remote.c:794
+#: builtin/remote.c:657 builtin/remote.c:850
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Разделът „%s“ в настройките не може да бъде изтрит"
@@ -8502,12 +9031,12 @@
 msgid "creating '%s' failed"
 msgstr "неуспешно създаване на „%s“"
 
-#: builtin/remote.c:759
+#: builtin/remote.c:769
 #, c-format
 msgid "Could not remove branch %s"
 msgstr "Клонът „%s“ не може да бъде изтрит"
 
-#: builtin/remote.c:829
+#: builtin/remote.c:836
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -8521,371 +9050,441 @@
 "Бележка: Няколко клона извън йерархията „refs/remotes/“ не бяха изтрити.\n"
 "Изтрийте ги чрез командата:"
 
-#: builtin/remote.c:938
+#: builtin/remote.c:951
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " нов (следващото доставяне ще го разположи в „remotes/%s“)"
 
-#: builtin/remote.c:941
+#: builtin/remote.c:954
 msgid " tracked"
 msgstr " следен"
 
-#: builtin/remote.c:943
+#: builtin/remote.c:956
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " стар (изтрийте чрез „git remote prune“)"
 
 # FIXME
-#: builtin/remote.c:945
+#: builtin/remote.c:958
 msgid " ???"
-msgstr " неясно"
+msgstr " неясно състояние"
 
 # CHECK
-#: builtin/remote.c:986
+#: builtin/remote.c:999
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr ""
 "неправилен клон за сливане „%s“. Невъзможно е да пребазирате върху повече от "
 "1 клон"
 
-#: builtin/remote.c:993
+#: builtin/remote.c:1006
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "пребазиране върху отдалечения клон „%s“"
 
-#: builtin/remote.c:996
+#: builtin/remote.c:1009
 #, c-format
 msgid " merges with remote %s"
 msgstr " сливане с отдалечения клон „%s“"
 
-#: builtin/remote.c:997
+#: builtin/remote.c:1010
 msgid "    and with remote"
 msgstr "    и с отдалечения клон"
 
-#: builtin/remote.c:999
+#: builtin/remote.c:1012
 #, c-format
 msgid "merges with remote %s"
 msgstr "сливане с отдалечения клон „%s“"
 
-#: builtin/remote.c:1000
+#: builtin/remote.c:1013
 msgid "   and with remote"
 msgstr "   и с отдалечения клон"
 
-#: builtin/remote.c:1046
+#: builtin/remote.c:1059
 msgid "create"
 msgstr "създаден"
 
-#: builtin/remote.c:1049
+#: builtin/remote.c:1062
 msgid "delete"
 msgstr "изтрит"
 
-#: builtin/remote.c:1053
+#: builtin/remote.c:1066
 msgid "up to date"
 msgstr "актуален"
 
-#: builtin/remote.c:1056
+#: builtin/remote.c:1069
 msgid "fast-forwardable"
 msgstr "може да се слее тривиално"
 
-#: builtin/remote.c:1059
+#: builtin/remote.c:1072
 msgid "local out of date"
-msgstr "локалният е остарял"
+msgstr "локалният е изостанал"
 
-#: builtin/remote.c:1066
+#: builtin/remote.c:1079
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s принудително изтласква към %-*s (%s)"
 
-#: builtin/remote.c:1069
+#: builtin/remote.c:1082
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s изтласква към %-*s (%s)"
 
-#: builtin/remote.c:1073
+#: builtin/remote.c:1086
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s принудително изтласква към %s"
 
-#: builtin/remote.c:1076
+#: builtin/remote.c:1089
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s изтласква към %s"
 
-#: builtin/remote.c:1144
+#: builtin/remote.c:1157
 msgid "do not query remotes"
 msgstr "без заявки към отдалечените хранилища"
 
-#: builtin/remote.c:1171
+#: builtin/remote.c:1184
 #, c-format
 msgid "* remote %s"
 msgstr "● отдалечено хранилище „%s“"
 
-#: builtin/remote.c:1172
+#: builtin/remote.c:1185
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  Адрес за доставяне: %s"
 
-#: builtin/remote.c:1173 builtin/remote.c:1318
+#: builtin/remote.c:1186 builtin/remote.c:1333
 msgid "(no URL)"
 msgstr "(без адрес)"
 
-#: builtin/remote.c:1182 builtin/remote.c:1184
+# FIXME spaces betwen Push and URL
+#: builtin/remote.c:1195 builtin/remote.c:1197
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  Адрес за изтласкване: %s"
 
-#: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190
+#: builtin/remote.c:1199 builtin/remote.c:1201 builtin/remote.c:1203
 #, c-format
 msgid "  HEAD branch: %s"
-msgstr "  клон в HEAD: %s"
+msgstr "  клон сочен от HEAD: %s"
 
-#: builtin/remote.c:1192
+#: builtin/remote.c:1205
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr ""
-"  клон в HEAD (клонът указан във файла HEAD от отдалеченото хранилище е\n"
+"  клонът сочен от HEAD (клонът указан във файла HEAD от отдалеченото "
+"хранилище е\n"
 "  нееднозначен и е някой от следните):\n"
 
-#: builtin/remote.c:1204
+#: builtin/remote.c:1217
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
-msgstr[0] "  Отдалечен клон: %s"
-msgstr[1] "  Отдалечени клони: %s"
+msgstr[0] "  Отдалечен клон:%s"
+msgstr[1] "  Отдалечени клони:%s"
 
-#: builtin/remote.c:1207 builtin/remote.c:1234
+#: builtin/remote.c:1220 builtin/remote.c:1247
 msgid " (status not queried)"
 msgstr " (състоянието не бе проверено)"
 
-#: builtin/remote.c:1216
+#: builtin/remote.c:1229
 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:1224
+#: builtin/remote.c:1237
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  Локалните указатели ще бъдат пренесени чрез „ push“"
 
-#: builtin/remote.c:1231
+#: builtin/remote.c:1244
 #, 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:1252
+#: builtin/remote.c:1265
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "задаване на refs/remotes/ИМЕ/HEAD според отдалеченото хранилище"
 
-#: builtin/remote.c:1254
+#: builtin/remote.c:1267
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "изтриване на refs/remotes/ИМЕ/HEAD"
 
-#: builtin/remote.c:1269
+#: builtin/remote.c:1282
 msgid "Cannot determine remote HEAD"
 msgstr "Не може да се установи отдалеченият връх"
 
-#: builtin/remote.c:1271
+#: builtin/remote.c:1284
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
 "Множество клони с върхове. Изберете изрично някой от тях чрез командата:"
 
-#: builtin/remote.c:1281
+#: builtin/remote.c:1294
 #, c-format
 msgid "Could not delete %s"
 msgstr "„%s“ не може да бъде изтрит"
 
-#: builtin/remote.c:1289
+#: builtin/remote.c:1302
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Неправилен указател: %s"
 
-#: builtin/remote.c:1291
+#: builtin/remote.c:1304
 #, c-format
 msgid "Could not setup %s"
 msgstr "„%s“ не може да се настрои"
 
-#: builtin/remote.c:1307
+#: builtin/remote.c:1322
 #, c-format
 msgid " %s will become dangling!"
 msgstr "„%s“ ще се превърне в обект извън клоните!"
 
-#: builtin/remote.c:1308
+#: builtin/remote.c:1323
 #, c-format
 msgid " %s has become dangling!"
 msgstr "„%s“ се превърна в обект извън клоните!"
 
-#: builtin/remote.c:1314
+#: builtin/remote.c:1329
 #, c-format
 msgid "Pruning %s"
 msgstr "Окастряне на „%s“"
 
-#: builtin/remote.c:1315
+#: builtin/remote.c:1330
 #, c-format
 msgid "URL: %s"
 msgstr "адрес: %s"
 
-#: builtin/remote.c:1328
+#: builtin/remote.c:1357
 #, c-format
 msgid " * [would prune] %s"
 msgstr " ● [ще бъде окастрено] %s"
 
-#: builtin/remote.c:1331
+#: builtin/remote.c:1360
 #, c-format
 msgid " * [pruned] %s"
 msgstr " ● [окастрено] %s"
 
-#: builtin/remote.c:1374
+#: builtin/remote.c:1405
 msgid "prune remotes after fetching"
 msgstr "окастряне на огледалата на отдалечените хранилища след доставяне"
 
-#: builtin/remote.c:1440 builtin/remote.c:1514
+#: builtin/remote.c:1471 builtin/remote.c:1545
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Няма отдалечено хранилище на име „%s“"
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1491
 msgid "add branch"
 msgstr "добавяне на клон"
 
-#: builtin/remote.c:1467
+#: builtin/remote.c:1498
 msgid "no remote specified"
 msgstr "не е указано отдалечено хранилище"
 
-#: builtin/remote.c:1489
+#: builtin/remote.c:1520
 msgid "manipulate push URLs"
 msgstr "промяна на адресите за изтласкване"
 
-#: builtin/remote.c:1491
+#: builtin/remote.c:1522
 msgid "add URL"
 msgstr "добавяне на адреси"
 
-#: builtin/remote.c:1493
+#: builtin/remote.c:1524
 msgid "delete URLs"
 msgstr "изтриване на адреси"
 
-#: builtin/remote.c:1500
+# FIXME message - incompatible
+#: builtin/remote.c:1531
 msgid "--add --delete doesn't make sense"
-msgstr "опциите „--add“ и „--delete“ не могат да се използват заедно"
+msgstr "опциите „--add“ и „--delete“ са несъвместими"
 
-#: builtin/remote.c:1540
+#: builtin/remote.c:1571
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Неправилен (стар) формат за адрес: %s"
 
-#: builtin/remote.c:1548
+#: builtin/remote.c:1579
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Такъв адрес не е открит: %s"
 
 # FIXME CHECK MEANING
-#: builtin/remote.c:1550
+#: builtin/remote.c:1581
 msgid "Will not delete all non-push URLs"
 msgstr "Никой от адресите, които не са за изтласкване, няма да се изтрие"
 
-#: builtin/remote.c:1564
+#: builtin/remote.c:1595
 msgid "be verbose; must be placed before a subcommand"
 msgstr "повече подробности. Поставя се пред подкоманда"
 
-#: builtin/repack.c:16
+#: builtin/repack.c:17
 msgid "git repack [options]"
-msgstr ""
+msgstr "git repack [ОПЦИЯ…]"
 
-#: builtin/repack.c:156
+#: builtin/repack.c:160
 msgid "pack everything in a single pack"
-msgstr ""
+msgstr "пакетиране на всичко в пакет"
 
-#: builtin/repack.c:158
+#: builtin/repack.c:162
 msgid "same as -a, and turn unreachable objects loose"
 msgstr ""
-
-#: builtin/repack.c:161
-msgid "remove redundant packs, and run git-prune-packed"
-msgstr ""
-
-#: builtin/repack.c:163
-msgid "pass --no-reuse-delta to git-pack-objects"
-msgstr ""
+"същото като опцията „-a“. Допълнително — недостижимите обекти да станат "
+"непакетирани"
 
 #: builtin/repack.c:165
-msgid "pass --no-reuse-object to git-pack-objects"
+msgid "remove redundant packs, and run git-prune-packed"
 msgstr ""
+"премахване на ненужните пакетирани файлове и изпълнение на командата „git-"
+"prune-packed“"
 
 #: builtin/repack.c:167
+msgid "pass --no-reuse-delta to git-pack-objects"
+msgstr "подаване на опцията „--no-reuse-delta“ на командата „git-pack-objects“"
+
+#: builtin/repack.c:169
+msgid "pass --no-reuse-object to git-pack-objects"
+msgstr ""
+"подаване на опцията „--no-reuse-object“ на командата „git-pack-objects“"
+
+#: builtin/repack.c:171
 msgid "do not run git-update-server-info"
-msgstr ""
-
-#: builtin/repack.c:170
-msgid "pass --local to git-pack-objects"
-msgstr ""
-
-#: builtin/repack.c:172
-msgid "write bitmap index"
-msgstr ""
-
-#: builtin/repack.c:173
-msgid "approxidate"
-msgstr ""
+msgstr "без изпълнение на командата „git-update-server-info“"
 
 #: builtin/repack.c:174
-msgid "with -A, do not loosen objects older than this"
-msgstr ""
+msgid "pass --local to git-pack-objects"
+msgstr "подаване на опцията „--local“ на командата „git-pack-objects“"
 
 #: builtin/repack.c:176
-msgid "size of the window used for delta compression"
-msgstr ""
+msgid "write bitmap index"
+msgstr "създаване и записване на индекси на база битови маски"
 
-#: builtin/repack.c:177 builtin/repack.c:181
-msgid "bytes"
-msgstr ""
+#: builtin/repack.c:177
+msgid "approxidate"
+msgstr "евристична дата"
 
 #: builtin/repack.c:178
-msgid "same as the above, but limit memory size instead of entries count"
+msgid "with -A, do not loosen objects older than this"
 msgstr ""
+"при комбинирането с опцията „-A“ — без разпакетиране на обектите по стари от "
+"това"
 
 #: builtin/repack.c:180
-msgid "limits the maximum delta depth"
-msgstr ""
+msgid "size of the window used for delta compression"
+msgstr "размер на прозореца за делта компресията"
+
+#: builtin/repack.c:181 builtin/repack.c:185
+msgid "bytes"
+msgstr "байтове"
 
 #: builtin/repack.c:182
-msgid "maximum size of each packfile"
+msgid "same as the above, but limit memory size instead of entries count"
 msgstr ""
+"същото като горната опция, но ограничението да е по размер на паметта, а не "
+"по броя на обектите"
 
 #: builtin/repack.c:184
-msgid "repack objects in packs marked with .keep"
-msgstr ""
+msgid "limits the maximum delta depth"
+msgstr "ограничаване на максималната дълбочина на делтата"
 
-#: builtin/repack.c:371
+#: builtin/repack.c:186
+msgid "maximum size of each packfile"
+msgstr "максимален размер на всеки пакет"
+
+#: builtin/repack.c:188
+msgid "repack objects in packs marked with .keep"
+msgstr "препакетиране на обектите в пакети белязани с „.keep“"
+
+#: builtin/repack.c:374
 #, c-format
 msgid "removing '%s' failed"
-msgstr ""
+msgstr "неуспешно изтриване на „%s“"
 
-#: builtin/replace.c:17
+#: builtin/replace.c:19
 msgid "git replace [-f] <object> <replacement>"
 msgstr "git replace [-f] ОБЕКТ ЗАМЯНА"
 
-#: builtin/replace.c:18
+#: 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:19
+#: builtin/replace.c:23
 msgid "git replace [--format=<format>] [-l [<pattern>]]"
 msgstr "git replace [--format=ФОРМАТ] [-l [ШАБЛОН]]"
 
-#: builtin/replace.c:174
+#: 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“ e неправилен"
+
+#: builtin/replace.c:357
+#, c-format
+msgid "malformed mergetag in commit '%s'"
+msgstr "етикетът при сливане в подаването „%s“ e неправилен"
+
+#: builtin/replace.c:368
+#, c-format
+msgid ""
+"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
+"instead of --graft"
+msgstr ""
+"Първоначалното подаване „%s“ съдържа етикета при сливане „%s“, който е "
+"изхвърлен, затова използвайте опцията „--edit“, а не „--graft“."
+
+#: builtin/replace.c:401
+#, 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:175
+#: builtin/replace.c:433
 msgid "delete replace refs"
 msgstr "изтриване на указателите за замяна"
 
-#: builtin/replace.c:176
-msgid "replace the ref if it exists"
-msgstr "замяна на указателите, ако съществуват"
+#: builtin/replace.c:434
+msgid "edit existing object"
+msgstr "редактиране на съществуващ обект"
 
-#: builtin/replace.c:177
+#: 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 "използване на този ФОРМАТ"
 
@@ -8897,160 +9496,160 @@
 msgid "register clean resolutions in index"
 msgstr "регистриране на чисти корекции на конфликти в индекса"
 
-#: builtin/reset.c:25
+#: 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:26
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr "git reset [-q] ДЪРВО [--] ПЪТИЩА…"
-
 #: builtin/reset.c:27
-msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
-msgstr "git reset --patch [ДЪРВО] [--] [ПЪТИЩА…]"
+msgid "git reset [-q] <tree-ish> [--] <paths>..."
+msgstr "git reset [-q] УКАЗАТЕЛ_КЪМ_ДЪРВО [--] ПЪТИЩА…"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:28
+msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
+msgstr "git reset --patch [УКАЗАТЕЛ_КЪМ_ДЪРВО] [--] [ПЪТИЩА…]"
+
+#: builtin/reset.c:34
 msgid "mixed"
 msgstr "смесено (mixed)"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "soft"
 msgstr "меко (soft)"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "hard"
 msgstr "пълно (hard)"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "merge"
 msgstr "слято (merge)"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "keep"
 msgstr "запазващо (keep)"
 
-#: builtin/reset.c:73
+#: builtin/reset.c:74
 msgid "You do not have a valid HEAD."
 msgstr "Указателят „HEAD“ е повреден."
 
-#: builtin/reset.c:75
+#: builtin/reset.c:76
 msgid "Failed to find tree of HEAD."
 msgstr "Дървото, сочено от указателя „HEAD“, не може да бъде открито."
 
-#: builtin/reset.c:81
+#: builtin/reset.c:82
 #, c-format
 msgid "Failed to find tree of %s."
 msgstr "Дървото, сочено от „%s“, не може да бъде открито."
 
-#: builtin/reset.c:99
+#: builtin/reset.c:100
 #, c-format
 msgid "HEAD is now at %s"
 msgstr "Указателят „HEAD“ сочи към „%s“"
 
-#: builtin/reset.c:182
+#: builtin/reset.c:183
 #, c-format
 msgid "Cannot do a %s reset in the middle of a merge."
 msgstr "Не може да се извърши %s зануляване по време на сливане."
 
-#: builtin/reset.c:273
+#: builtin/reset.c:276
 msgid "be quiet, only report errors"
 msgstr "по-малко подробности, да се извеждат само грешките"
 
-#: builtin/reset.c:275
+#: builtin/reset.c:278
 msgid "reset HEAD and index"
 msgstr "индекса и указателя „HEAD“, без работното дърво"
 
-#: builtin/reset.c:276
+#: builtin/reset.c:279
 msgid "reset only HEAD"
 msgstr "само указателя „HEAD“, без индекса и работното дърво"
 
 # FIXME vs man page
-#: builtin/reset.c:278 builtin/reset.c:280
+#: builtin/reset.c:281 builtin/reset.c:283
 msgid "reset HEAD, index and working tree"
 msgstr "указателя „HEAD“, индекса и работното дърво"
 
 # FIXME vs man page
-#: builtin/reset.c:282
+#: builtin/reset.c:285
 msgid "reset HEAD but keep local changes"
 msgstr "зануляване на указателя „HEAD“, но запазване на локалните промени"
 
-#: builtin/reset.c:285
+#: builtin/reset.c:288
 msgid "record only the fact that removed paths will be added later"
 msgstr ""
 "отбелязване само на факта, че изтритите пътища ще бъдат добавени по-късно"
 
-#: builtin/reset.c:302
+#: builtin/reset.c:305
 #, c-format
 msgid "Failed to resolve '%s' as a valid revision."
 msgstr "Стойността „%s“ не е разпозната като съществуваща версия."
 
-#: builtin/reset.c:305 builtin/reset.c:313
+#: builtin/reset.c:308 builtin/reset.c:316
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "„%s“ не е разпознат като обект."
 
-#: builtin/reset.c:310
+#: builtin/reset.c:313
 #, c-format
 msgid "Failed to resolve '%s' as a valid tree."
 msgstr "„%s“ не е разпознат като дърво."
 
-#: builtin/reset.c:319
+#: builtin/reset.c:322
 msgid "--patch is incompatible with --{hard,mixed,soft}"
 msgstr ""
 "опцията „--patch“ е несъвместима с всяка от опциите „--hard/--mixed/--soft“"
 
-#: builtin/reset.c:328
+#: builtin/reset.c:331
 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
 msgstr ""
 "опцията „--mixed“ не бива да се използва заедно с пътища. Вместо това "
 "изпълнете „git reset -- ПЪТ…“."
 
-#: builtin/reset.c:330
+#: builtin/reset.c:333
 #, c-format
 msgid "Cannot do %s reset with paths."
 msgstr "Не може да извършите %s зануляване, когато сте задали ПЪТ."
 
-#: builtin/reset.c:340
+#: builtin/reset.c:343
 #, c-format
 msgid "%s reset is not allowed in a bare repository"
 msgstr "В голо хранилище не може да извършите %s зануляване"
 
-#: builtin/reset.c:344
+#: builtin/reset.c:347
 msgid "-N can only be used with --mixed"
 msgstr "Опцията „-N“ е съвместима само с „--mixed“"
 
-#: builtin/reset.c:361
+#: builtin/reset.c:364
 msgid "Unstaged changes after reset:"
 msgstr "Промени извън индекса след зануляването:"
 
-#: builtin/reset.c:367
+#: builtin/reset.c:370
 #, c-format
 msgid "Could not reset index file to revision '%s'."
 msgstr "Индексът не може да бъде занулен към версия „%s“."
 
-#: builtin/reset.c:372
+#: builtin/reset.c:374
 msgid "Could not write new index file."
 msgstr "Новият индекс не може да бъде записан."
 
-#: builtin/rev-parse.c:359
+#: builtin/rev-parse.c:361
 msgid "git rev-parse --parseopt [options] -- [<args>...]"
-msgstr "git rev-parse --parseopt [ОПЦИИ] -- [АРГУМЕНТИ…]"
+msgstr "git rev-parse --parseopt [ОПЦИЯ…] -- [АРГУМЕНТИ…]"
 
-#: builtin/rev-parse.c:364
+#: builtin/rev-parse.c:366
 msgid "keep the `--` passed as an arg"
 msgstr "зададеният низ „--“ да се тълкува като аргумент"
 
-#: builtin/rev-parse.c:366
+#: builtin/rev-parse.c:368
 msgid "stop parsing after the first non-option argument"
 msgstr "спиране на анализа след първия аргумент, който не е опция"
 
-#: builtin/rev-parse.c:369
+#: builtin/rev-parse.c:371
 msgid "output in stuck long form"
 msgstr "изход в дългия формат"
 
-#: builtin/rev-parse.c:497
+#: builtin/rev-parse.c:499
 msgid ""
 "git rev-parse --parseopt [options] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -9058,16 +9657,16 @@
 "\n"
 "Run \"git rev-parse --parseopt -h\" for more information on the first usage."
 msgstr ""
-"git rev-parse --parseopt [ОПЦИИ] -- [АРГУМЕНТИ…]\n"
+"git rev-parse --parseopt [ОПЦИЯ…] -- [АРГУМЕНТИ…]\n"
 "   или: git rev-parse --sq-quote [АРГУМЕНТИ…]\n"
-"   или: git rev-parse [ОПЦИИ] [АРГУМЕНТИ…]\n"
+"   или: git rev-parse [ОПЦИЯ…] [АРГУМЕНТИ…]\n"
 "\n"
 "За повече информация за първия вариант изпълнете „git rev-parse --parseopt -"
 "h“"
 
 #: builtin/revert.c:22
 msgid "git revert [options] <commit-ish>..."
-msgstr "git revert [ОПЦИИ] УКАЗАТЕЛ_КЪМ_ПОДАВАНЕ…"
+msgstr "git revert [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ПОДАВАНЕ…"
 
 #: builtin/revert.c:23
 msgid "git revert <subcommand>"
@@ -9075,7 +9674,7 @@
 
 #: builtin/revert.c:28
 msgid "git cherry-pick [options] <commit-ish>..."
-msgstr "git cherry-pick [ОПЦИИ] УКАЗАТЕЛ_КЪМ_ПОДАВАНЕ…"
+msgstr "git cherry-pick [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ПОДАВАНЕ…"
 
 #: builtin/revert.c:29
 msgid "git cherry-pick <subcommand>"
@@ -9088,15 +9687,15 @@
 
 #: builtin/revert.c:80
 msgid "end revert or cherry-pick sequence"
-msgstr "завършване на поредица от отбиране или отмяна на подавания"
+msgstr "завършване на поредица от отбирания или отмени на подавания"
 
 #: builtin/revert.c:81
 msgid "resume revert or cherry-pick sequence"
-msgstr "завършване на поредица от отбиране или отмяна на подавания"
+msgstr "завършване на поредица от отбирания или отмени на подавания"
 
 #: builtin/revert.c:82
 msgid "cancel revert or cherry-pick sequence"
-msgstr "отмяна на поредица от отбиране или отмяна на подавания"
+msgstr "отмяна на поредица от отбирания или отмени на подавания"
 
 #: builtin/revert.c:83
 msgid "don't automatically commit"
@@ -9156,14 +9755,14 @@
 
 #: builtin/rm.c:17
 msgid "git rm [options] [--] <file>..."
-msgstr "git rm [ОПЦИИ] [--] ФАЙЛ…"
+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 its nested submodules)\n"
+"the following submodules (or one of their nested submodules)\n"
 "use a .git directory:"
 msgstr[0] ""
 "следният подмодул или някой от неговите подмодули използват директория на "
@@ -9249,6 +9848,12 @@
 "изходният код да е 0, дори ако никой файл нe e напаснал с шаблона за "
 "изтриване"
 
+#: builtin/rm.c:318
+msgid "Please, stage your changes to .gitmodules or stash them to proceed"
+msgstr ""
+"За да продължите, или вкарайте промените по файла „.gitmodules“ в индекса,\n"
+"или ги скатайте"
+
 #: builtin/rm.c:336
 #, c-format
 msgid "not removing '%s' recursively without -r"
@@ -9261,32 +9866,35 @@
 
 #: builtin/shortlog.c:13
 msgid "git shortlog [<options>] [<revision range>] [[--] [<path>...]]"
-msgstr ""
+msgstr "git shortlog [ОПЦИЯ…] [ДИАПАЗОН_НА_ВЕРСИИТЕ] [[--] [ПЪТ…]]"
 
 #: builtin/shortlog.c:131
 #, c-format
 msgid "Missing author: %s"
-msgstr ""
+msgstr "Авторът липсва: %s"
 
 #: builtin/shortlog.c:230
 msgid "sort output according to the number of commits per author"
-msgstr ""
+msgstr "подредба на подаванията по броя подавания от автор"
 
 #: builtin/shortlog.c:232
 msgid "Suppress commit descriptions, only provides commit count"
-msgstr ""
+msgstr "Без описания на подаванията — да се показва само броя подавания"
 
 #: builtin/shortlog.c:234
 msgid "Show the email address of each author"
-msgstr ""
+msgstr "Извеждане на адреса на е-поща за всеки автор"
 
+# FIXME why is this so short
 #: builtin/shortlog.c:235
 msgid "w[,i1[,i2]]"
-msgstr ""
+msgstr "ШИРОЧИНА[,ОТСТЪП_1[,ОТСТЪП_2]]"
 
 #: builtin/shortlog.c:236
 msgid "Linewrap output"
 msgstr ""
+"Пренасяне на редовете до тази обща ШИРОЧИНА (76), с ОТСТЪП_1 (6) за първия "
+"ред и ОТСТЪП_2 (9) за останалите"
 
 #: builtin/show-branch.c:9
 msgid ""
@@ -9334,7 +9942,7 @@
 
 #: builtin/show-branch.c:662
 msgid "name commits with their object names"
-msgstr "именоване на подаванията с имената им на обекти"
+msgstr "именуване на подаванията с имената им на обекти"
 
 #: builtin/show-branch.c:664
 msgid "show possible merge bases"
@@ -9379,29 +9987,30 @@
 "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 ""
+msgstr "git show-ref --exclude-existing[=ШАБЛОН] < СПИСЪК_С_УКАЗАТЕЛИ"
 
 #: builtin/show-ref.c:168
 msgid "only show tags (can be combined with heads)"
-msgstr ""
+msgstr "извеждане на етикетите (може да се комбинира с върховете)"
 
 #: builtin/show-ref.c:169
 msgid "only show heads (can be combined with tags)"
-msgstr ""
+msgstr "извеждане на върховете (може да се комбинира с етикетите)"
 
 #: builtin/show-ref.c:170
 msgid "stricter reference checking, requires exact ref path"
-msgstr ""
+msgstr "строга проверка на указателите, изисква се указател с пълен път"
 
 #: builtin/show-ref.c:173 builtin/show-ref.c:175
 msgid "show the HEAD reference, even if it would be filtered out"
-msgstr ""
+msgstr "задължително извеждане и на указателя HEAD"
 
 #: builtin/show-ref.c:177
 msgid "dereference tags into object IDs"
-msgstr ""
+msgstr "да се извеждат идентификаторите на обектите-етикети"
 
 #: builtin/show-ref.c:179
 msgid "only show SHA1 hash using <n> digits"
@@ -9410,14 +10019,18 @@
 #: builtin/show-ref.c:183
 msgid "do not print results to stdout (useful with --verify)"
 msgstr ""
+"без извеждане на резултатите на стандартния вход (полезно с опцията „--"
+"verify“)"
 
 #: builtin/show-ref.c:185
 msgid "show refs from stdin that aren't in local repository"
 msgstr ""
+"извеждане на указателите приети от стандартния вход, които липсват в "
+"локалното хранилище"
 
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [options] name [ref]"
-msgstr "git symbolic-ref [ОПЦИИ] ИМЕ [УКАЗАТЕЛ]"
+msgstr "git symbolic-ref [ОПЦИЯ…] ИМЕ [УКАЗАТЕЛ]"
 
 #: builtin/symbolic-ref.c:8
 msgid "git symbolic-ref -d [-q] name"
@@ -9435,11 +10048,11 @@
 msgid "shorten ref output"
 msgstr "кратка информация за указателя"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
 msgid "reason"
 msgstr "причина"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
 msgid "reason of the update"
 msgstr "причина за обновяването"
 
@@ -9452,7 +10065,7 @@
 
 #: builtin/tag.c:23
 msgid "git tag -d <tagname>..."
-msgstr ""
+msgstr "git tag -d ЕТИКЕТ…"
 
 # FIXME tabulator
 #: builtin/tag.c:24
@@ -9460,349 +10073,373 @@
 "git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] \n"
 "\t\t[<pattern>...]"
 msgstr ""
+"git tag -l [-nБРОЙ] [--contains ПОДАВАНЕ] [--points-at ОБЕКТ] \n"
+"           [ШАБЛОН…]"
 
 #: builtin/tag.c:26
 msgid "git tag -v <tagname>..."
-msgstr ""
+msgstr "git tag -v ЕТИКЕТ…"
 
-#: builtin/tag.c:67
+#: builtin/tag.c:69
 #, c-format
 msgid "malformed object at '%s'"
-msgstr ""
+msgstr "обект със сгрешен формат при „%s“"
 
-#: builtin/tag.c:239
+#: builtin/tag.c:301
 #, c-format
 msgid "tag name too long: %.*s..."
-msgstr ""
+msgstr "името на етикета е твърде дълго: „%.*s“…"
 
-#: builtin/tag.c:244
+#: builtin/tag.c:306
 #, c-format
 msgid "tag '%s' not found."
-msgstr ""
+msgstr "етикетът „%s“ не е открит."
 
-#: builtin/tag.c:259
+#: builtin/tag.c:321
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
-msgstr ""
+msgstr "Изтрит е етикетът „%s“ (бе „%s“)\n"
 
-#: builtin/tag.c:271
+#: builtin/tag.c:333
 #, c-format
 msgid "could not verify the tag '%s'"
-msgstr ""
+msgstr "етикетът „%s“ не може да бъде проверен"
 
-#: builtin/tag.c:281
+#: builtin/tag.c:343
 #, c-format
 msgid ""
 "\n"
-"Write a tag message\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:285
+#: builtin/tag.c:347
 #, c-format
 msgid ""
 "\n"
-"Write a tag message\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:324
-msgid "unable to sign the tag"
-msgstr ""
-
-#: builtin/tag.c:326
-msgid "unable to write tag file"
-msgstr ""
-
-#: builtin/tag.c:351
-msgid "bad object type."
-msgstr ""
-
-#: builtin/tag.c:364
-msgid "tag header too big."
-msgstr ""
-
-#: builtin/tag.c:400
-msgid "no tag message?"
-msgstr ""
-
-#: builtin/tag.c:406
+#: builtin/tag.c:371
 #, c-format
-msgid "The tag message has been left in %s\n"
-msgstr ""
+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
+msgid "unable to sign the tag"
+msgstr "етикетът не може да бъде подписан"
+
+#: builtin/tag.c:430
+msgid "unable to write tag file"
+msgstr "файлът за етикета не може да бъде запазен"
 
 #: builtin/tag.c:455
-msgid "switch 'points-at' requires an object"
-msgstr ""
+msgid "bad object type."
+msgstr "неправилен вид обект."
 
-#: builtin/tag.c:457
+#: builtin/tag.c:468
+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
+msgid "no tag message?"
+msgstr "липсва съобщение за етикета"
+
+#: builtin/tag.c:510
+#, 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 ""
+msgstr "неправилно име на обект „%s“"
 
-#: builtin/tag.c:480
-#, c-format
-msgid "unsupported sort specification %s"
-msgstr "зададена е неподдържана подредба: „%s“"
-
-#: builtin/tag.c:500
+#: builtin/tag.c:589
 msgid "list tag names"
-msgstr ""
+msgstr "извеждане на имената на етикетите"
 
-#: builtin/tag.c:502
+#: builtin/tag.c:591
 msgid "print <n> lines of each tag message"
 msgstr "извеждане на този БРОЙ редове от всяко съобщение за етикет"
 
-#: builtin/tag.c:504
+#: builtin/tag.c:593
 msgid "delete tags"
-msgstr ""
+msgstr "изтриване на етикети"
 
-#: builtin/tag.c:505
+#: builtin/tag.c:594
 msgid "verify tags"
-msgstr ""
+msgstr "проверка на етикети"
 
-#: builtin/tag.c:507
+#: builtin/tag.c:596
 msgid "Tag creation options"
-msgstr ""
+msgstr "Опции при създаването на етикети"
 
-#: builtin/tag.c:509
+#: builtin/tag.c:598
 msgid "annotated tag, needs a message"
-msgstr ""
+msgstr "анотирането на етикети изисква съобщение"
 
-#: builtin/tag.c:511
+#: builtin/tag.c:600
 msgid "tag message"
-msgstr ""
+msgstr "съобщение за етикет"
 
-#: builtin/tag.c:513
+#: builtin/tag.c:602
 msgid "annotated and GPG-signed tag"
-msgstr ""
+msgstr "анотиран етикет с подпис по GPG"
 
-#: builtin/tag.c:517
+#: builtin/tag.c:606
 msgid "use another key to sign the tag"
-msgstr ""
+msgstr "използване на друг ключ за подписването на етикет"
 
-#: builtin/tag.c:518
+#: builtin/tag.c:607
 msgid "replace the tag if exists"
-msgstr ""
+msgstr "замяна на етикета, ако съществува"
 
-#: builtin/tag.c:519
+#: builtin/tag.c:608
 msgid "show tag list in columns"
-msgstr ""
+msgstr "извеждане на списъка на етикетите по колони"
 
-#: builtin/tag.c:521
+#: builtin/tag.c:610
 msgid "sort tags"
 msgstr "подреждане на етикетите"
 
-#: builtin/tag.c:525
+#: builtin/tag.c:614
 msgid "Tag listing options"
-msgstr ""
+msgstr "Опции за извеждането на етикети"
 
-#: builtin/tag.c:528 builtin/tag.c:534
+#: builtin/tag.c:617 builtin/tag.c:623
 msgid "print only tags that contain the commit"
-msgstr ""
+msgstr "извеждане само на етикетите, които съдържат подаването"
 
-#: builtin/tag.c:540
+#: builtin/tag.c:629
 msgid "print only tags of the object"
-msgstr ""
+msgstr "извеждане само на етикетите на обекта"
 
-#: builtin/tag.c:566
+#: builtin/tag.c:655
 msgid "--column and -n are incompatible"
-msgstr ""
+msgstr "Опциите „--column“ и „-n“ са несъвместими"
 
-#: builtin/tag.c:578
+#: builtin/tag.c:667
 msgid "--sort and -n are incompatible"
 msgstr "Опциите „--long“ и „-n“ са несъвместими"
 
-#: builtin/tag.c:585
+#: builtin/tag.c:674
 msgid "-n option is only allowed with -l."
-msgstr ""
+msgstr "Опцията „-n“ изисква опцията „-l“."
 
-#: builtin/tag.c:587
+#: builtin/tag.c:676
 msgid "--contains option is only allowed with -l."
-msgstr ""
+msgstr "Опцията „-contains“ изисква опцията „-l“."
 
-#: builtin/tag.c:589
+#: builtin/tag.c:678
 msgid "--points-at option is only allowed with -l."
-msgstr ""
+msgstr "Опцията „-points-at“ изисква опцията „-l“."
 
-#: builtin/tag.c:597
+# FIXME message pattern
+#: builtin/tag.c:686
 msgid "only one -F or -m option is allowed."
-msgstr ""
+msgstr "Опциите „-F“ и „-m“ са несъвместими."
 
-#: builtin/tag.c:617
+#: builtin/tag.c:706
 msgid "too many params"
-msgstr ""
+msgstr "Прекалено много аргументи"
 
-#: builtin/tag.c:623
+#: builtin/tag.c:712
 #, c-format
 msgid "'%s' is not a valid tag name."
-msgstr ""
+msgstr "„%s“ е неправилно име за етикет."
 
-#: builtin/tag.c:628
+#: builtin/tag.c:717
 #, c-format
 msgid "tag '%s' already exists"
-msgstr ""
+msgstr "етикетът „%s“ вече съществува"
 
-#: builtin/tag.c:646
-#, c-format
-msgid "%s: cannot lock the ref"
-msgstr ""
-
-#: builtin/tag.c:648
-#, c-format
-msgid "%s: cannot update the ref"
-msgstr ""
-
-#: builtin/tag.c:650
+#: builtin/tag.c:741
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
-msgstr ""
+msgstr "Обновен етикет „%s“ (бе „%s“)\n"
 
-#: builtin/unpack-objects.c:483
+#: builtin/unpack-objects.c:489
 msgid "Unpacking objects"
 msgstr "Разпакетиране на обектите"
 
-#: builtin/update-index.c:399
+#: builtin/update-index.c:403
 msgid "git update-index [options] [--] [<file>...]"
-msgstr ""
-
-#: builtin/update-index.c:748
-msgid "continue refresh even when index needs update"
-msgstr ""
-
-#: builtin/update-index.c:751
-msgid "refresh: ignore submodules"
-msgstr ""
-
-#: builtin/update-index.c:754
-msgid "do not ignore new files"
-msgstr ""
+msgstr "git update-index [ОПЦИЯ…] [--] [ФАЙЛ…]"
 
 #: builtin/update-index.c:756
+msgid "continue refresh even when index needs update"
+msgstr ""
+"продължаване с обновяването, дори когато индексът трябва да бъде обновен"
+
+#: builtin/update-index.c:759
+msgid "refresh: ignore submodules"
+msgstr "подмодулите да се игнорират при обновяването"
+
+#: builtin/update-index.c:762
+msgid "do not ignore new files"
+msgstr "новите файлове да не се игнорират"
+
+#: builtin/update-index.c:764
 msgid "let files replace directories and vice-versa"
-msgstr ""
+msgstr "файлове да могат да заменят директории и обратно"
 
-#: builtin/update-index.c:758
+#: builtin/update-index.c:766
 msgid "notice files missing from worktree"
-msgstr ""
+msgstr "предупреждаване при липсващи в работното дърво файлове"
 
-#: builtin/update-index.c:760
+#: builtin/update-index.c:768
 msgid "refresh even if index contains unmerged entries"
-msgstr ""
-
-#: builtin/update-index.c:763
-msgid "refresh stat information"
-msgstr ""
-
-#: builtin/update-index.c:767
-msgid "like --refresh, but ignore assume-unchanged setting"
-msgstr ""
+msgstr "обновяване дори и индексът да съдържа неслети обекти"
 
 #: builtin/update-index.c:771
+msgid "refresh stat information"
+msgstr "обновяване на информацията от функцията „stat“"
+
+#: builtin/update-index.c:775
+msgid "like --refresh, but ignore assume-unchanged setting"
+msgstr ""
+"като опцията „--refresh“, но да се проверят и обектите, които са били приети "
+"за непроменени"
+
+#: builtin/update-index.c:779
 msgid "<mode>,<object>,<path>"
-msgstr ""
+msgstr "РЕЖИМ,ОБЕКТ,ПЪТ"
 
-#: builtin/update-index.c:772
+#: builtin/update-index.c:780
 msgid "add the specified entry to the index"
-msgstr ""
-
-#: builtin/update-index.c:776
-msgid "(+/-)x"
-msgstr ""
-
-#: builtin/update-index.c:777
-msgid "override the executable bit of the listed files"
-msgstr ""
-
-#: builtin/update-index.c:781
-msgid "mark files as \"not changing\""
-msgstr ""
+msgstr "добавяне на изброените обекти към индекса"
 
 #: builtin/update-index.c:784
+msgid "(+/-)x"
+msgstr "(+/-)x"
+
+#: builtin/update-index.c:785
+msgid "override the executable bit of the listed files"
+msgstr "изрично задаване на стойността на флага дали файлът е изпълним"
+
+#: builtin/update-index.c:789
+msgid "mark files as \"not changing\""
+msgstr "задаване на флаг, че файлът не се променя"
+
+#: builtin/update-index.c:792
 msgid "clear assumed-unchanged bit"
-msgstr ""
-
-#: builtin/update-index.c:787
-msgid "mark files as \"index-only\""
-msgstr ""
-
-#: builtin/update-index.c:790
-msgid "clear skip-worktree bit"
-msgstr ""
-
-#: builtin/update-index.c:793
-msgid "add to index only; do not add content to object database"
-msgstr ""
+msgstr "изчистване на флага, че файлът не се променя"
 
 #: builtin/update-index.c:795
-msgid "remove named paths even if present in worktree"
-msgstr ""
+msgid "mark files as \"index-only\""
+msgstr "задаване на флаг, че файловете са само за индекса"
 
-#: builtin/update-index.c:797
-msgid "with --stdin: input lines are terminated by null bytes"
-msgstr ""
+#: builtin/update-index.c:798
+msgid "clear skip-worktree bit"
+msgstr "изчистване на флага,  че файловете са само за индекса"
 
-#: builtin/update-index.c:799
-msgid "read list of paths to be updated from standard input"
-msgstr ""
+#: builtin/update-index.c:801
+msgid "add to index only; do not add content to object database"
+msgstr "добавяне само към индекса без добавяне към базата от данни за обектите"
 
 #: builtin/update-index.c:803
-msgid "add entries from standard input to the index"
+msgid "remove named paths even if present in worktree"
+msgstr "изтриване на указаните пътища, дори и да съществуват в работното дърво"
+
+#: builtin/update-index.c:805
+msgid "with --stdin: input lines are terminated by null bytes"
 msgstr ""
+"при комбиниране с опцията „--stdin“ — входните редове са разделени с нулевия "
+"байт"
 
 #: builtin/update-index.c:807
-msgid "repopulate stages #2 and #3 for the listed paths"
-msgstr ""
+msgid "read list of paths to be updated from standard input"
+msgstr "изчитане на списъка с пътища за обновяване от стандартния вход"
 
 #: builtin/update-index.c:811
-msgid "only update entries that differ from HEAD"
-msgstr ""
+msgid "add entries from standard input to the index"
+msgstr "добавяне на елементите от стандартния вход към индекса"
 
 #: builtin/update-index.c:815
+msgid "repopulate stages #2 and #3 for the listed paths"
+msgstr ""
+"възстановяване на състоянието преди сливане или нужда от обновяване за "
+"изброените пътища"
+
+#: builtin/update-index.c:819
+msgid "only update entries that differ from HEAD"
+msgstr "добавяне само на съдържанието, което се различава от това в „HEAD“"
+
+#: builtin/update-index.c:823
 msgid "ignore files missing from worktree"
-msgstr ""
+msgstr "игнориране на файловете, които липсват в работното дърво"
 
-#: builtin/update-index.c:818
+#: builtin/update-index.c:826
 msgid "report actions to standard output"
-msgstr ""
+msgstr "извеждане на действията на стандартния изход"
 
-#: builtin/update-index.c:820
+#: builtin/update-index.c:828
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr ""
+"забравяне на записаната информация за неразрешени конфликти — за командите "
+"от потребителско ниво"
 
-#: builtin/update-index.c:824
+#: builtin/update-index.c:832
 msgid "write index in this format"
-msgstr ""
+msgstr "записване на индекса в този формат"
+
+#: builtin/update-index.c:834
+msgid "enable or disable split index"
+msgstr "включване или изключване на разделянето на индекса"
 
 #: builtin/update-ref.c:9
 msgid "git update-ref [options] -d <refname> [<oldval>]"
-msgstr "git update-ref [ОПЦИИ] -d ИМЕ_НА_УКАЗАТЕЛ [СТАРА_СТОЙНОСТ]"
+msgstr "git update-ref [ОПЦИЯ…] -d ИМЕ_НА_УКАЗАТЕЛ [СТАРА_СТОЙНОСТ]"
 
+# FIXME spaces - not needed in original
 #: builtin/update-ref.c:10
 msgid "git update-ref [options]    <refname> <newval> [<oldval>]"
-msgstr ""
-"git update-ref [ОПЦИИ]    ИМЕ_НА_УКАЗАТЕЛ НОВА_СТОЙНОСТ [СТАРА_СТОЙНОСТ]"
+msgstr "git update-ref [ОПЦИЯ…] ИМЕ_НА_УКАЗАТЕЛ НОВА_СТОЙНОСТ [СТАРА_СТОЙНОСТ]"
 
 #: builtin/update-ref.c:11
 msgid "git update-ref [options] --stdin [-z]"
-msgstr "git update-ref [ОПЦИИ] --stdin [-z]"
+msgstr "git update-ref [ОПЦИЯ…] --stdin [-z]"
 
-#: builtin/update-ref.c:256
+#: builtin/update-ref.c:363
 msgid "delete the reference"
 msgstr "изтриване на указателя"
 
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:365
 msgid "update <refname> not the one it points to"
 msgstr "обновяване на ИМЕто_НА_УКАЗАТЕЛя, а не това, към което сочи"
 
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:366
 msgid "stdin has NUL-terminated arguments"
 msgstr ""
 "някои от елементите подадени на стандартния вход завършват с нулевия знак "
 "„NUL“"
 
-#: builtin/update-ref.c:260
+#: builtin/update-ref.c:367
 msgid "read updates from stdin"
 msgstr "изчитане на указателите от стандартния вход"
 
@@ -9814,15 +10451,23 @@
 msgid "update the info files from scratch"
 msgstr "обновяване на информационните файлове от нулата"
 
-#: builtin/verify-pack.c:56
+#: builtin/verify-commit.c:17
+msgid "git verify-commit [-v|--verbose] <commit>..."
+msgstr "git verify-tag [-v|--verbose] ПОДАВАНЕ…"
+
+#: builtin/verify-commit.c:75
+msgid "print commit contents"
+msgstr "извеждане на съдържанието на подаването"
+
+#: 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:66
+#: builtin/verify-pack.c:64
 msgid "verbose"
 msgstr "извеждане на подробна информация"
 
-#: builtin/verify-pack.c:68
+#: builtin/verify-pack.c:66
 msgid "show statistics only"
 msgstr "извеждане само на статистиката"
 
@@ -9836,23 +10481,27 @@
 
 #: builtin/write-tree.c:13
 msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
-msgstr "git write-tree [--missing-ok] [--prefix=ПРЕДСТАВКА/]"
+msgstr "git write-tree [--missing-ok] [--prefix=ПРЕФИКС/]"
 
 #: builtin/write-tree.c:26
 msgid "<prefix>/"
-msgstr "ПРЕДСТАВКА/"
+msgstr "ПРЕФИКС/"
 
 #: builtin/write-tree.c:27
 msgid "write tree object for a subdirectory <prefix>"
-msgstr "запис на обект-дърво за поддиректорията започваща с тази ПРЕДСТАВКА"
+msgstr "запис на обект-дърво за поддиректорията започваща с тази ПРЕФИКС"
 
 #: builtin/write-tree.c:30
 msgid "only useful for debugging"
 msgstr "само за изчистване на грешки"
 
+#: credential-cache--daemon.c:267
+msgid "print debugging messages to stderr"
+msgstr "извеждане на съобщенията за трасиране на стандартната грешка"
+
 #: git.c:17
 msgid ""
-"'git help -a' and 'git help -g' lists available subcommands and some\n"
+"'git help -a' and 'git help -g' list available subcommands and some\n"
 "concept guides. See 'git help <command>' or 'git help <concept>'\n"
 "to read about a specific subcommand or concept."
 msgstr ""
@@ -9969,15 +10618,26 @@
 msgid "Create, list, delete or verify a tag object signed with GPG"
 msgstr "Извеждане, създаване, изтриване, проверка на етикети подписани с GPG"
 
+#: rerere.h:27
+msgid "update the index with reused conflict resolution if possible"
+msgstr ""
+"при възможност преизползване на решението на конфликта за обновяване на "
+"индекса"
+
 #: git-am.sh:52
 msgid "You need to set your committer info first"
-msgstr ""
+msgstr "Първо трябва да зададете информация за себе си"
 
 #: git-am.sh:97
 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:107
 #, sh-format
@@ -9986,60 +10646,76 @@
 "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:123
 msgid "Cannot fall back to three-way merge."
-msgstr ""
+msgstr "Не може да се премине към тройно сливане."
 
 #: git-am.sh:139
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
+"В хранилището липсват необходимите обекти BLOB, за да се премине към тройно "
+"сливане."
 
 #: git-am.sh:141
 msgid "Using index info to reconstruct a base tree..."
-msgstr ""
+msgstr "Базовото дърво се реконструира от информацията в индекса…"
 
 #: git-am.sh:156
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
 msgstr ""
+"Кръпката не може да се приложи към обектите BLOB в индекса.\n"
+"Да не би да сте я редактирали на ръка?"
 
 #: git-am.sh:165
 msgid "Falling back to patching base and 3-way merge..."
-msgstr ""
+msgstr "Преминаване към прилагане на кръпка към базата и тройно сливане…"
 
 #: git-am.sh:181
 msgid "Failed to merge in the changes."
-msgstr ""
+msgstr "Неуспешно сливане на промените."
 
 #: git-am.sh:276
 msgid "Only one StGIT patch series can be applied at once"
 msgstr ""
+"Само една серия кръпки от „StGIT“ може да бъде прилагана в даден момент"
 
 #: git-am.sh:363
 #, sh-format
 msgid "Patch format $patch_format is not supported."
-msgstr ""
+msgstr "Неподдържан формат на кръпки: „$patch_format“."
 
 #: git-am.sh:365
 msgid "Patch format detection failed."
-msgstr ""
+msgstr "Форматът на кръпката не може да бъде определен."
 
 #: git-am.sh:392
 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:486
 #, sh-format
 msgid "previous rebase directory $dotest still exists but mbox given."
 msgstr ""
+"предишната директория за пребазиране „$dotest“ все още съществува, а е "
+"зададен файл „mbox“."
 
+# FIXME better message
 #: git-am.sh:491
 msgid "Please make up your mind. --skip or --abort?"
-msgstr ""
+msgstr "Опциите „--skip“ и „--abort“ са несъвместими."
 
 #: git-am.sh:527
 #, sh-format
@@ -10047,16 +10723,21 @@
 "Stray $dotest directory found.\n"
 "Use \"git am --abort\" to remove it."
 msgstr ""
+"Открита е излишна директория „$dotest“.\n"
+"Можете да я изтриете с командата „git am --abort“."
 
 #: git-am.sh:535
 msgid "Resolve operation not in progress, we are not resuming."
-msgstr ""
+msgstr "В момента не тече операция по коригиране и няма как да се продължи."
 
 #: git-am.sh:601
 #, sh-format
 msgid "Dirty index: cannot apply patches (dirty: $files)"
 msgstr ""
+"Индексът не е чист: кръпките не могат да бъдат приложени (замърсени са: "
+"$files)"
 
+# FIXME spaces
 #: git-am.sh:705
 #, sh-format
 msgid ""
@@ -10064,18 +10745,25 @@
 "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:732
 msgid "Patch does not have a valid e-mail address."
-msgstr ""
+msgstr "Кръпката не съдържа валиден адрес за е-поща."
 
 #: git-am.sh:779
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
+"За интерактивно изпълнение е необходимо стандартният\n"
+"изход да е свързан с терминал, а в момента не е."
 
 #: git-am.sh:783
 msgid "Commit Body is:"
-msgstr ""
+msgstr "Тялото на кръпката за прилагане е:"
 
 #. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
 #. in your translation. The program will only accept English
@@ -10083,11 +10771,13 @@
 #: git-am.sh:790
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
 msgstr ""
+"Прилагане? „y“ — да/„n“ — не/„e“ — редактиране/„v“ — преглед/„a“ — приемане "
+"на всичко"
 
 #: git-am.sh:826
 #, sh-format
 msgid "Applying: $FIRSTLINE"
-msgstr ""
+msgstr "Прилагане: $FIRSTLINE"
 
 #: git-am.sh:847
 msgid ""
@@ -10095,21 +10785,26 @@
 "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:855
 msgid ""
 "You still have unmerged paths in your index\n"
 "did you forget to use 'git add'?"
 msgstr ""
+"Индексът все още съдържа неслети промени — възможно е да не сте изпълнили "
+"„git add“."
 
 #: git-am.sh:871
 msgid "No changes -- Patch already applied."
-msgstr ""
+msgstr "Без промени — кръпката вече е приложена."
 
 #: git-am.sh:881
 #, sh-format
 msgid "Patch failed at $msgnum $FIRSTLINE"
-msgstr ""
+msgstr "Неуспешно прилагане на кръпката „$msgnum“: „$FIRSTLINE“"
 
 #: git-am.sh:884
 #, sh-format
@@ -10117,105 +10812,119 @@
 "The copy of the patch that failed is found in:\n"
 "   $dotest/patch"
 msgstr ""
+"Дубликат на проблемната кръпка се намира в:\n"
+"   $dotest/patch"
 
 #: git-am.sh:902
 msgid "applying to an empty history"
-msgstr ""
+msgstr "прилагане върху празна история"
 
 #: git-bisect.sh:48
 msgid "You need to start by \"git bisect start\""
-msgstr ""
+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
 msgid "Do you want me to do it for you [Y/n]? "
-msgstr ""
+msgstr "Да се извърши ли автоматично? „Y“ —  ДА, „n“ — не"
 
 #: git-bisect.sh:95
 #, sh-format
 msgid "unrecognised option: '$arg'"
-msgstr ""
+msgstr "непозната опция „$arg“"
 
 #: git-bisect.sh:99
 #, sh-format
 msgid "'$arg' does not appear to be a valid revision"
-msgstr ""
+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
 msgid "Bad HEAD - I need a HEAD"
-msgstr ""
+msgstr "Текущият указател „HEAD“ е неправилен."
 
 #: git-bisect.sh:130
 #, sh-format
 msgid ""
 "Checking out '$start_head' failed. Try 'git bisect reset <validbranch>'."
 msgstr ""
+"Неуспешно преминаване към „$start_head“. Изпълнете командата „git bisect "
+"reset СЪОТВЕТНИЯ_КЛОН“."
 
 #: git-bisect.sh:140
 msgid "won't bisect on cg-seek'ed tree"
 msgstr ""
+"не може да се търси двоично, когато е изпълнена командата „cg-seek“ от "
+"„cogito“"
 
 #: git-bisect.sh:144
 msgid "Bad HEAD - strange symbolic ref"
-msgstr ""
+msgstr "Неправилен указател „HEAD“"
 
 #: git-bisect.sh:189
 #, sh-format
 msgid "Bad bisect_write argument: $state"
-msgstr ""
+msgstr "Неправилен аргумент на функцията „bisect_write“: „$state“"
 
 #: git-bisect.sh:218
 #, sh-format
 msgid "Bad rev input: $arg"
-msgstr ""
+msgstr "Неправилна версия: „$arg“"
 
 #: git-bisect.sh:232
 msgid "Please call 'bisect_state' with at least one argument."
-msgstr ""
+msgstr "Функцията „bisect_state“ изисква поне един аргумент."
 
 #: git-bisect.sh:244
 #, sh-format
 msgid "Bad rev input: $rev"
-msgstr ""
+msgstr "Неправилна версия: „$rev“"
 
 #: git-bisect.sh:250
 msgid "'git bisect bad' can take only one argument."
-msgstr ""
+msgstr "Командата „git bisect bad“ приема само един аргумент."
 
 #: git-bisect.sh:273
 msgid "Warning: bisecting only with a bad commit."
-msgstr ""
+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:279
 msgid "Are you sure [Y/n]? "
-msgstr ""
+msgstr "Да се продължи ли? „Y“ —  ДА, „n“ — не"
 
+# FIXME me?
 #: git-bisect.sh:289
 msgid ""
-"You need to give me at least one good and one bad revisions.\n"
+"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.)"
 msgstr ""
+"Трябва да зададете поне една добра и една лоша версия. (Това може да се\n"
+"направи съответно и чрез командите „git bisect bad“ и „git bisect good“.)"
 
+# FIXME me
 #: git-bisect.sh:292
 msgid ""
 "You need to start by \"git bisect start\".\n"
-"You then need to give me at least one good and one bad revisions.\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.)"
 msgstr ""
+"Трябва да започнете двоичното търсене чрез командата „git bisect start“.\n"
+"трябва да зададете поне една добра и една лоша версия. (Това може да се\n"
+"направи съответно и чрез командите „git bisect bad“ и „git bisect good“.)"
 
 #: git-bisect.sh:363 git-bisect.sh:490
 msgid "We are not bisecting."
-msgstr ""
+msgstr "В момента не се извършва двоично търсене."
 
 #: git-bisect.sh:370
 #, sh-format
 msgid "'$invalid' is not a valid commit"
-msgstr ""
+msgstr "„$invalid“ е неправилно подаване"
 
 #: git-bisect.sh:379
 #, sh-format
@@ -10223,24 +10932,30 @@
 "Could not check out original HEAD '$branch'.\n"
 "Try 'git bisect reset <commit>'."
 msgstr ""
+"Първоначално указаният клон „$branch“ в указателя „HEAD“ не може да бъде\n"
+"изтеглен. Пробвайте да изпълните командата „git bisect reset ПОДАВАНЕ“."
 
 #: git-bisect.sh:406
 msgid "No logfile given"
-msgstr ""
+msgstr "Не е зададен журнален файл"
 
 #: git-bisect.sh:407
 #, sh-format
 msgid "cannot read $file for replaying"
 msgstr ""
+"Журналният файл „$file“ не може да бъде прочетен, за да се изпълнят "
+"командите от него наново"
 
+# FIXME WTF
 #: git-bisect.sh:424
 msgid "?? what are you talking about?"
 msgstr ""
+"Непозната команда. Възможните варианти са: „start“, „good“, „bad“, „skip“"
 
 #: git-bisect.sh:436
 #, sh-format
 msgid "running $command"
-msgstr ""
+msgstr "изпълнение на командата „$command“"
 
 #: git-bisect.sh:443
 #, sh-format
@@ -10248,60 +10963,73 @@
 "bisect run failed:\n"
 "exit code $res from '$command' is < 0 or >= 128"
 msgstr ""
+"неуспешно двоично търсене:\n"
+"изходният код от командата „$command“ е $res — това е извън интервала [0, "
+"128)"
 
 #: git-bisect.sh:469
 msgid "bisect run cannot continue any more"
-msgstr ""
+msgstr "двоичното търсене не може да продължи"
 
+# FIXME initial space
 #: git-bisect.sh:475
 #, sh-format
 msgid ""
 "bisect run failed:\n"
 "'bisect_state $state' exited with error code $res"
 msgstr ""
+"неуспешно двоично търсене:\n"
+"функцията „bisect_state $state“ завърши с код за грешка $res"
 
 #: git-bisect.sh:482
 msgid "bisect run success"
-msgstr ""
+msgstr "успешно двоично търсене"
 
 #: git-pull.sh:21
 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, or use 'git commit -a'."
+"as appropriate to mark resolution and make a commit."
 msgstr ""
 "Невъзможно е да издърпвате в момента, защото някои файлове не са слети. "
 "Трябва\n"
 "да ги прегледате, коригирате, ако е необходимо и да ги добавите или извадите "
 "от\n"
-"индекса с командата „git add/rm ФАЙЛ“. Ако всичко е наред, можете да "
-"ползвате и\n"
-"командата „git commit -a“."
+"индекса с командата „git add/rm ФАЙЛ“, след което трябва да подадете "
+"промените."
 
 #: git-pull.sh:25
 msgid "Pull is not possible because you have unmerged files."
 msgstr ""
 "Невъзможно е да издърпвате в момента, защото някои файлове не са слети."
 
-#: git-pull.sh:247
-msgid "updating an unborn branch with changes added to the index"
-msgstr "обновяване на още несъздаден клон с промените от индекса"
+#: git-pull.sh:31
+msgid ""
+"You have not concluded your merge (MERGE_HEAD exists).\n"
+"Please, commit your changes before you can merge."
+msgstr ""
+"Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува).\n"
+"Подайте промените си, преди да започнете ново сливане."
 
-#: git-pull.sh:271
+#: git-pull.sh:245
+msgid "updating an unborn branch with changes added to the index"
+msgstr "обновяване на все още несъздаден клон с промените от индекса"
+
+#: git-pull.sh:269
 #, sh-format
 msgid ""
 "Warning: fetch updated the current branch head.\n"
 "Warning: fast-forwarding your working tree from\n"
 "Warning: commit $orig_head."
 msgstr ""
-"ПРЕДУПРЕЖДЕНИЕ: доставянето обнови върха на текущия клон.Работното ви копие\n"
-"ПРЕДУПРЕЖДЕНИЕ: бе тривиално слято от подаване „$orig_head“."
+"ПРЕДУПРЕЖДЕНИЕ: доставянето обнови върха на текущия клон. Работното ви\n"
+"ПРЕДУПРЕЖДЕНИЕ: копие бе тривиално слято от подаване „$orig_head“."
 
-#: git-pull.sh:296
+#: git-pull.sh:294
 msgid "Cannot merge multiple branches into empty head"
 msgstr "Не може да сливате множество клони в празен върхов указател"
 
-#: git-pull.sh:300
+#: git-pull.sh:298
 msgid "Cannot rebase onto multiple branches"
 msgstr "Не може да пребазирате върху повече от един клон"
 
@@ -10317,16 +11045,16 @@
 "За да откажете пребазирането и да се върнете към първоначалното състояние,\n"
 "изпълнете „git rebase --abort“."
 
-#: git-rebase.sh:164
+#: git-rebase.sh:165
 msgid "Applied autostash."
 msgstr "Автоматично скатаното е приложено."
 
-#: git-rebase.sh:167
+#: git-rebase.sh:168
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "„$stash_sha1“ не може да бъде запазен"
 
-#: git-rebase.sh:168
+#: git-rebase.sh:169
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
@@ -10336,35 +11064,35 @@
 "надеждно скатани. Можете да пробвате да ги приложите чрез „git stash pop“\n"
 "или да ги изхвърлите чрез „git stash drop“, когато поискате.\n"
 
-#: git-rebase.sh:207
+#: git-rebase.sh:208
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Куката за изпълнение преди пребазиране отхвърли пребазирането."
 
-#: git-rebase.sh:212
+#: git-rebase.sh:213
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr ""
 "Изглежда, че сега се прилагат кръпки чрез командата „git-am“. Не може да "
 "пребазирате в момента."
 
-#: git-rebase.sh:350
+#: git-rebase.sh:351
 msgid "The --exec option must be used with the --interactive option"
 msgstr "Опцията „--exec“ задължително изисква опцията „--interactive“"
 
 # FIXME message
-#: git-rebase.sh:355
+#: git-rebase.sh:356
 msgid "No rebase in progress?"
 msgstr "Изглежда в момента не тече пребазиране"
 
-#: git-rebase.sh:366
+#: git-rebase.sh:367
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 "Опцията „--edit-todo“ е достъпна само по време на интерактивно пребазиране."
 
-#: git-rebase.sh:373
+#: git-rebase.sh:374
 msgid "Cannot read HEAD"
 msgstr "Указателят „HEAD“ не може да бъде прочетен"
 
-#: git-rebase.sh:376
+#: git-rebase.sh:377
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -10372,13 +11100,13 @@
 "Трябва да редактирате всички конфликти при сливането. След това\n"
 "отбележете коригирането им чрез командата „git add“"
 
-#: git-rebase.sh:394
+#: git-rebase.sh:395
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Връщането към „$head_name“ е невъзможно"
 
 # FIXME tabulators, I, double spaces
-#: git-rebase.sh:413
+#: git-rebase.sh:414
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -10399,69 +11127,69 @@
 "и отново започнете пребазирането. Текущото пребазиране се преустановява, за\n"
 "да не загубите случайно промени."
 
-#: git-rebase.sh:464
+#: git-rebase.sh:465
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "неправилна основа за сравнение „$upstream_name“"
 
-#: git-rebase.sh:488
+#: git-rebase.sh:489
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr ""
 "указателят „$onto_name“ може да сочи към повече от една основа за "
 "пребазирането"
 
-#: git-rebase.sh:491 git-rebase.sh:495
+#: git-rebase.sh:492 git-rebase.sh:496
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "указателят „$onto_name“ не сочи към никаква основа за пребазирането"
 
-#: git-rebase.sh:500
+#: git-rebase.sh:501
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "Указателят „$onto_name“ не сочи към подаване"
 
-#: git-rebase.sh:523
+#: git-rebase.sh:524
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "фатална грешка: не съществува клон „$branch_name“"
 
-#: git-rebase.sh:556
+#: git-rebase.sh:557
 msgid "Cannot autostash"
 msgstr "Не може да се скатае автоматично"
 
-#: git-rebase.sh:561
+#: git-rebase.sh:562
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Автоматично скатано: „$stash_abbrev“"
 
-#: git-rebase.sh:565
+#: git-rebase.sh:566
 msgid "Please commit or stash them."
 msgstr "Промените трябва или да се подадат, или да се скатаят."
 
-#: git-rebase.sh:585
+#: git-rebase.sh:586
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "Текущият клон „$branch_name“ е напълно актуален."
 
-#: git-rebase.sh:589
+#: git-rebase.sh:590
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr ""
 "Текущият клон „$branch_name“ е напълно актуален. Пребазирането е "
 "принудително."
 
-#: git-rebase.sh:600
+#: git-rebase.sh:601
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Промените от „$mb“ към „$onto“:"
 
-#: git-rebase.sh:609
+#: git-rebase.sh:610
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 "Първо, указателят „HEAD“ започва да сочи към базата, върху която пребазирате…"
 
-#: git-rebase.sh:619
+#: git-rebase.sh:620
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "Тривиално сливане на „$branch_name“ върху „$onto_name“."
@@ -10479,24 +11207,24 @@
 msgid "Cannot save the current index state"
 msgstr "Състоянието на текущия индекс не може да бъде запазено"
 
-#: git-stash.sh:123 git-stash.sh:136
+#: git-stash.sh:124 git-stash.sh:137
 msgid "Cannot save the current worktree state"
 msgstr "Състоянието на работното дърво не може да бъде запазено"
 
-#: git-stash.sh:140
+#: git-stash.sh:141
 msgid "No changes selected"
 msgstr "Не са избрани никакви промени"
 
 # FIXME can't happen??? може, може
-#: git-stash.sh:143
+#: git-stash.sh:144
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "Временният индекс не може да бъде изтрит"
 
-#: git-stash.sh:156
+#: git-stash.sh:157
 msgid "Cannot record working tree state"
 msgstr "Състоянието на работното дърво не може да бъде запазено"
 
-#: git-stash.sh:190
+#: git-stash.sh:191
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr ""
@@ -10512,7 +11240,7 @@
 #. $ 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:237
+#: git-stash.sh:238
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -10521,361 +11249,436 @@
 "грешка: командата „git stash save“ не поддържа опция „$option“\n"
 "        За да зададете съобщение, изпълнете „git stash save -- '$option'“"
 
-#: git-stash.sh:258
+#: git-stash.sh:259
 msgid "No local changes to save"
 msgstr "Няма никакви локални промени за скатаване"
 
-#: git-stash.sh:262
+#: git-stash.sh:263
 msgid "Cannot initialize stash"
 msgstr "Скатаването не може да стартира"
 
-#: git-stash.sh:266
+#: git-stash.sh:267
 msgid "Cannot save the current status"
 msgstr "Текущото състояние не може да бъде запазено"
 
-#: git-stash.sh:284
+#: git-stash.sh:285
 msgid "Cannot remove worktree changes"
 msgstr "Промените в работното дърво не могат да бъдат занулени"
 
-#: git-stash.sh:383
+#: git-stash.sh:384
 msgid "No stash found."
 msgstr "Не е открито нищо скатано."
 
-#: git-stash.sh:390
+#: git-stash.sh:391
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Указани са прекалено много версии: „$REV“"
 
-#: git-stash.sh:396
+#: git-stash.sh:397
 #, sh-format
-msgid "$reference is not valid reference"
+msgid "$reference is not a valid reference"
 msgstr "Указателят „$reference“ е грешен"
 
-#: git-stash.sh:424
+#: git-stash.sh:425
 #, sh-format
 msgid "'$args' is not a stash-like commit"
-msgstr "„$args“ не е подаване приличащо на нещо скатано"
+msgstr "„$args“ не е подаване, приличащо на нещо скатано"
 
-#: git-stash.sh:435
+#: git-stash.sh:436
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "„$args“ не е указател към нещо скатано"
 
-#: git-stash.sh:443
+#: git-stash.sh:444
 msgid "unable to refresh index"
 msgstr "индексът не може да бъде обновен"
 
-#: git-stash.sh:447
+#: git-stash.sh:448
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "По време на сливане не може да приложите нещо скатано"
 
-#: git-stash.sh:455
+#: git-stash.sh:456
 msgid "Conflicts in index. Try without --index."
 msgstr ""
 "В индекса има конфликти. Пробвайте да изпълните командата без опцията „--"
 "index“."
 
-#: git-stash.sh:457
+#: git-stash.sh:458
 msgid "Could not save index tree"
 msgstr "Дървото сочено от индекса не може да бъде запазено"
 
-#: git-stash.sh:491
+#: git-stash.sh:492
 msgid "Cannot unstage modified files"
 msgstr "Променените файлове не могат да бъдат извадени от индекса"
 
-#: git-stash.sh:506
+#: git-stash.sh:507
 msgid "Index was not unstashed."
 msgstr "Индексът не е скатан."
 
-#: git-stash.sh:529
+#: git-stash.sh:530
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Изтрито е скатаното „${REV}“ ($s)"
 
-#: git-stash.sh:530
+#: git-stash.sh:531
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "Скатаното „${REV}“ не може да бъде изтрито"
 
-#: git-stash.sh:537
+#: git-stash.sh:539
 msgid "No branch name specified"
 msgstr "Не е указано име на клон"
 
-#: git-stash.sh:609
+#: git-stash.sh:611
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(За да ги възстановите, изпълнете командата „git stash apply“)"
 
 #: git-submodule.sh:95
 #, sh-format
 msgid "cannot strip one component off url '$remoteurl'"
-msgstr ""
+msgstr "не може да се махне компонент от адреса „$remoteurl“"
 
 #: git-submodule.sh:237
 #, sh-format
 msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
-msgstr ""
+msgstr "Във файла „.gitmodules“ липсва информация за пътя „$sm_path“"
 
 #: git-submodule.sh:287
 #, sh-format
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
-msgstr ""
+msgstr "Неуспешно клониране на адреса „$url“ в пътя „$sm_path“ като подмодул"
 
-#: git-submodule.sh:299
+#: git-submodule.sh:296
 #, sh-format
 msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
-msgstr ""
+msgstr "Директорията в Git „$a“ е част от пътя на подмодула „$b“ или обратно"
 
-#: git-submodule.sh:409
+#: git-submodule.sh:406
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
+"Относителен път може да се ползва само от основната директория на работното "
+"дърво"
 
-#: git-submodule.sh:419
+# FIXME - what is this regex?
+#: git-submodule.sh:416
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr ""
+"адрес на хранилище: „$repo“ трябва или да е абсолютен, или да започва с „./“ "
+"или „../“"
 
-#: git-submodule.sh:436
+#: git-submodule.sh:433
 #, sh-format
 msgid "'$sm_path' already exists in the index"
-msgstr ""
+msgstr "„$sm_path“ вече съществува в индекса"
 
-#: git-submodule.sh:440
+#: git-submodule.sh:437
 #, 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:458
+#: git-submodule.sh:455
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
-msgstr ""
+msgstr "Добавяне на съществуващото хранилище в „$sm_path“ към индекса"
 
-#: git-submodule.sh:460
+#: git-submodule.sh:457
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
-msgstr ""
+msgstr "„$sm_path“ съществува, а не е хранилище на Git"
 
-#: git-submodule.sh:468
+#: git-submodule.sh:465
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
+"Открита е локална директория на Git — „$sm_name“, която сочи към "
+"отдалечените хранилища:"
 
-#: git-submodule.sh:470
+#: git-submodule.sh:467
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
 msgstr ""
+"Ако искате да преизползвате тази локална директория на Git вместо да отново "
+"да клонирате:"
 
-#: git-submodule.sh:472
+#: git-submodule.sh:469
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
 msgstr ""
+"използвайте опцията „--force“. Ако локалната директория не сочи към "
+"правилното отдалечено хранилище"
 
-#: git-submodule.sh:473
+#: git-submodule.sh:470
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
 "option."
 msgstr ""
+"или не сте сигурни какво означава всичко това, просто задайте друго име като "
+"аргумент на опцията „--name“."
 
-#: git-submodule.sh:475
+# FIXME активиране - какво всъщност става
+#: git-submodule.sh:472
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
-msgstr ""
+msgstr "Активиране на локалното хранилище за подмодула „$sm_name“ наново."
 
-#: git-submodule.sh:487
+#: git-submodule.sh:484
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
-msgstr ""
+msgstr "Подмодулът „$sm_path“ не може да бъде изтеглен"
 
-#: git-submodule.sh:492
+#: git-submodule.sh:489
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
-msgstr ""
+msgstr "Неуспешно добавяне на подмодула „$sm_path“"
 
-#: git-submodule.sh:501
+#: git-submodule.sh:498
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
-msgstr ""
+msgstr "Неуспешно регистриране на подмодула „$sm_path“"
 
-#: git-submodule.sh:545
+#: git-submodule.sh:542
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
-msgstr ""
+msgstr "Влизане в „$prefix$displaypath“"
 
-#: git-submodule.sh:565
+#: git-submodule.sh:562
 #, sh-format
 msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
 msgstr ""
+"Спиране при „$prefix$displaypath“ — изходният код от скрипта бе различен от "
+"0."
 
-#: git-submodule.sh:611
+#: git-submodule.sh:608
 #, sh-format
 msgid "No url found for submodule path '$displaypath' in .gitmodules"
 msgstr ""
+"Във файла „.gitmodules“ не е открит адрес за пътя към подмодул „$displaypath“"
 
-#: git-submodule.sh:620
+#: git-submodule.sh:617
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
-msgstr ""
+msgstr "Неуспешно регистриране на адрес за пътя към подмодул „$displaypath“"
 
-#: git-submodule.sh:622
+#: git-submodule.sh:619
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr ""
+"Регистриран е подмодул „$name“, сочещ към адрес „$url“, за пътя към подмодул "
+"„$displaypath“"
 
-#: git-submodule.sh:639
+#: git-submodule.sh:636
 #, sh-format
 msgid "Failed to register update mode for submodule path '$displaypath'"
 msgstr ""
+"Неуспешно регистриране на режима на обновяване за пътя към подмодул "
+"„$displaypath“"
 
-#: git-submodule.sh:677
+#: git-submodule.sh:674
 #, sh-format
 msgid "Use '.' if you really want to deinitialize all submodules"
-msgstr ""
+msgstr "Използвайте „.“, за да премахнете всички подмодули"
 
-#: git-submodule.sh:694
+#: git-submodule.sh:691
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr ""
+"Пътят към подмодул „$displaypath“ в работното дърво съдържа директория „.git“"
 
-#: git-submodule.sh:695
+#: git-submodule.sh:692
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr ""
+"(използвайте командата „rm -rf“, за да го изтриете заедно с цялата му "
+"история)"
 
-#: git-submodule.sh:701
+#: git-submodule.sh:698
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
 "discard them"
 msgstr ""
+"Пътят към подмодул „$displaypath“ в работното дърво съдържа локални промени. "
+"Можете да ги пренебрегнете и отмените с опцията „-f“"
 
-#: git-submodule.sh:704
+#: git-submodule.sh:701
 #, sh-format
 msgid "Cleared directory '$displaypath'"
-msgstr ""
+msgstr "Директорията „$displaypath“ е изчистена"
 
-#: git-submodule.sh:705
+#: git-submodule.sh:702
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
+"Директорията към работното дърво на подмодула „$displaypath“ не може да бъде "
+"изтрита"
 
-#: git-submodule.sh:708
+#: git-submodule.sh:705
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr ""
+"Празната директория за подмодула „$displaypath“ не може да бъде създадена"
 
-#: git-submodule.sh:717
+#: git-submodule.sh:714
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
+"Премахната е регистрацията на подмодул „$name“, сочещ към адрес „$url“, за "
+"пътя „$displaypath“"
 
-#: git-submodule.sh:833
+#: git-submodule.sh:830
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
 "Maybe you want to use 'update --init'?"
 msgstr ""
+"Пътят към подмодул „$displaypath“ не е инициализиран.\n"
+"Пробвайте с командата „update --init“."
 
-#: git-submodule.sh:846
+#: git-submodule.sh:843
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
-msgstr ""
+msgstr "Текущата версия за подмодула в „$displaypath“ липсва"
 
-#: git-submodule.sh:855
+#: git-submodule.sh:852
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
-msgstr ""
+msgstr "Неуспешно доставяне в пътя към подмодул „$sm_path“"
 
-#: git-submodule.sh:879
+#: git-submodule.sh:876
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
-msgstr ""
+msgstr "Неуспешно доставяне в пътя към подмодул „$displaypath“"
 
-#: git-submodule.sh:893
+#: git-submodule.sh:890
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr ""
+"Неуспешно изтегляне на версия „$sha1“ в пътя към подмодул „$displaypath“'"
 
-#: git-submodule.sh:894
+#: git-submodule.sh:891
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr ""
+msgstr "Път към подмодул „$displaypath“: изтеглена е версия „$sha1“"
 
-#: git-submodule.sh:898
+#: git-submodule.sh:895
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr ""
+"Неуспешно пребазиране на версия „$sha1“ в пътя към подмодул „$displaypath“"
 
-#: git-submodule.sh:899
+#: git-submodule.sh:896
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
-msgstr ""
+msgstr "Път към подмодул „$displaypath“: пребазиране върху версия „$sha1“"
 
-#: git-submodule.sh:904
+#: git-submodule.sh:901
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
-msgstr ""
+msgstr "Неуспешно сливане на версия „$sha1“ в пътя към подмодул „$displaypath“"
 
-#: git-submodule.sh:905
+#: git-submodule.sh:902
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
-msgstr ""
+msgstr "Път към подмодул „$displaypath“: сливане с версия „$sha1“"
 
-#: git-submodule.sh:910
+# FIXME spaces
+#: git-submodule.sh:907
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule  path '$prefix$sm_path'"
 msgstr ""
+"Неуспешно изпълнение на командата „$command $sha1“ в пътя към подмодул "
+"„$prefix$sm_path“"
 
-#: git-submodule.sh:911
+#: git-submodule.sh:908
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
-msgstr ""
+msgstr "Път към подмодул „$prefix$sm_path“: „$command $sha1“"
 
-#: git-submodule.sh:941
+#: git-submodule.sh:938
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr ""
+"Неуспешна обработка на поддиректориите в пътя към подмодул „$displaypath“"
 
-#: git-submodule.sh:1049
+# FIXME message
+#: git-submodule.sh:1046
 msgid "The --cached option cannot be used with the --files option"
-msgstr ""
+msgstr "Опциите „--cached“ и „--files“ са несъвместими"
 
-#: git-submodule.sh:1097
+#: git-submodule.sh:1098
 #, sh-format
 msgid "unexpected mode $mod_dst"
-msgstr ""
+msgstr "неочакван режим „$mod_dst“"
 
-#: git-submodule.sh:1117
+#: git-submodule.sh:1118
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
-msgstr ""
+msgstr "  ПРЕДУПРЕЖДЕНИЕ: „$display_name“ не съдържа подаването „$sha1_src“"
 
-#: git-submodule.sh:1120
+#: git-submodule.sh:1121
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
-msgstr ""
+msgstr "  ПРЕДУПРЕЖДЕНИЕ: „$display_name“ не съдържа подаването „$sha1_dst“"
 
-#: git-submodule.sh:1123
+#: git-submodule.sh:1124
 #, 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:1148
+#: git-submodule.sh:1149
 msgid "blob"
-msgstr ""
+msgstr "обект BLOB"
 
-#: git-submodule.sh:1262
+#: git-submodule.sh:1267
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
-msgstr ""
+msgstr "Неуспешна обработка на поддиректориите в пътя към подмодул „$sm_path“"
 
-#: git-submodule.sh:1326
+#: git-submodule.sh:1331
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
-msgstr ""
+msgstr "Синхронизиране на адреса за пътя към подмодул „$displaypath“"
+
+#~ msgid "Failed to lock ref for update"
+#~ msgstr "Указателят не може да бъде заключен, за да бъде обновен"
+
+#~ msgid "Failed to write ref"
+#~ msgstr "Указателят не може да бъде записан"
+
+#~ msgid "Failed to lock HEAD during fast_forward_to"
+#~ msgstr "Указателят „HEAD“ не може да бъде заключен при тривиално сливане"
+
+#~ msgid "invalid commit: %s"
+#~ msgstr "неправилно подаване: %s"
+
+#~ msgid "cannot lock HEAD ref"
+#~ msgstr "указателят към върха „HEAD“ не може да бъде заключен"
+
+#~ msgid "cannot update HEAD ref"
+#~ msgstr "указателят към върха „HEAD“ не може да бъде обновен"
+
+#~ msgid "Invalid %s: '%s'"
+#~ msgstr "Неправилна стойност за „%s“: „%s“"
+
+#~ msgid "cannot tell cwd"
+#~ msgstr "текущата директория не може да бъде определена"
+
+#~ msgid "%s: cannot lock the ref"
+#~ msgstr "указателят „%s“ не може да бъде заключен"
+
+#~ msgid "%s: cannot update the ref"
+#~ msgstr "указателят „%s“ не може да бъде обновен"
diff --git a/po/ca.po b/po/ca.po
new file mode 100644
index 0000000..ee77dca
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,10951 @@
+# Catalan translations for Git.
+# Copyright (C) 2014 Alex Henrie <alexhenrie24@gmail.com>
+# This file is distributed under the same license as the Git package.
+# Alex Henrie <alexhenrie24@gmail.com>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Git\n"
+"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
+"POT-Creation-Date: 2014-08-04 14:48+0800\n"
+"PO-Revision-Date: 2014-08-22 20:10-0700\n"
+"Last-Translator: Alex Henrie <alexhenrie24@gmail.com>\n"
+"Language-Team: Catalan\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.5.4\n"
+
+#: advice.c:55
+#, c-format
+msgid "hint: %.*s\n"
+msgstr "indirecta: %.*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, or use\n"
+"'git commit -a'."
+msgstr ""
+"Arregleu-los en l'arbre de treball, i després utilitzeu\n"
+"'git add/rm <fitxer>' segons sigui apropiat per marcar la\n"
+"resolució i feu una comissió, o utilitzeu 'git commit -a'."
+
+#: archive.c:10
+msgid "git archive [options] <tree-ish> [<path>...]"
+msgstr "git archive [opcions] <arbre> [<ruta>...]"
+
+#: archive.c:11
+msgid "git archive --list"
+msgstr "git archive --list"
+
+#: archive.c:12
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]"
+msgstr ""
+"git archive --remote <repositori> [--exec <ordre>] [opcions] <arbre> "
+"[<ruta>...]"
+
+#: archive.c:13
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <repositori> [--exec <ordre>] --list"
+
+#: archive.c:243 builtin/add.c:136 builtin/add.c:427 builtin/rm.c:328
+#, c-format
+msgid "pathspec '%s' did not match any files"
+msgstr "L'especificació de ruta '%s' no ha concordat amb cap fitxer"
+
+#: archive.c:328
+msgid "fmt"
+msgstr "format"
+
+#: archive.c:328
+msgid "archive format"
+msgstr "format d'arxiu"
+
+#: archive.c:329 builtin/log.c:1201
+msgid "prefix"
+msgstr "prefix"
+
+#: archive.c:330
+msgid "prepend prefix to each pathname in the archive"
+msgstr "anteposa el prefix a cada nom de ruta en l'arxiu"
+
+#: archive.c:331 builtin/archive.c:88 builtin/blame.c:2517
+#: builtin/blame.c:2518 builtin/config.c:57 builtin/fast-export.c:709
+#: builtin/fast-export.c:711 builtin/grep.c:712 builtin/hash-object.c:77
+#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:412
+#: builtin/notes.c:569 builtin/read-tree.c:108 parse-options.h:151
+msgid "file"
+msgstr "fitxer"
+
+#: archive.c:332 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "escriu l'arxiu a aquest fitxer"
+
+#: archive.c:334
+msgid "read .gitattributes in working directory"
+msgstr "llegeix .gitattributes en el directori de treball"
+
+#: archive.c:335
+msgid "report archived files on stderr"
+msgstr "informa de fitxers arxivats en stderr"
+
+#: archive.c:336
+msgid "store only"
+msgstr "només emmagatzemar"
+
+#: archive.c:337
+msgid "compress faster"
+msgstr "comprimeix més ràpid"
+
+#: archive.c:345
+msgid "compress better"
+msgstr "comprimeix millor"
+
+#: archive.c:348
+msgid "list supported archive formats"
+msgstr "allista els formats d'arxiu suportats"
+
+#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
+msgid "repo"
+msgstr "repositori"
+
+#: archive.c:351 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "recupera l'arxiu del repositori remot <repositori>"
+
+#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
+msgid "command"
+msgstr "ordre"
+
+#: archive.c:353 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "ruta a l'ordre git-upload-archive remot"
+
+#: attr.c:259
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
+msgstr ""
+"Els patrons negatius s'ignoren en els atributes de git\n"
+"Utilitzeu '\\!' per exclamació capdavantera literal."
+
+#: branch.c:60
+#, c-format
+msgid "Not setting branch %s as its own upstream."
+msgstr "No establint la rama %s com la seva pròpia font."
+
+#: branch.c:83
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgstr ""
+"La rama %s està configurada per seguir la rama remota %s de %s per rebasar."
+
+#: branch.c:84
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr "La rama %s està configurada per seguir la rama remota %s de %s."
+
+#: branch.c:88
+#, c-format
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr "La rama %s està configurada per seguir la rama local %s per rebasar."
+
+#: branch.c:89
+#, c-format
+msgid "Branch %s set up to track local branch %s."
+msgstr "La rama %s està configurada per seguir la rama local %s."
+
+#: branch.c:94
+#, c-format
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr ""
+"La rama %s està configurada per seguir la referència remota %s per rebasar."
+
+#: branch.c:95
+#, c-format
+msgid "Branch %s set up to track remote ref %s."
+msgstr "La rama %s està configurada per seguir la referència remota %s."
+
+#: branch.c:99
+#, c-format
+msgid "Branch %s set up to track local ref %s by rebasing."
+msgstr ""
+"La rama %s està configurada per seguir la referència local %s per rebasar."
+
+#: branch.c:100
+#, c-format
+msgid "Branch %s set up to track local ref %s."
+msgstr "La rama %s està configurada per seguir la referència local %s."
+
+#: branch.c:133
+#, c-format
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "No seguint: informació ambigua per a la referència %s"
+
+#: branch.c:178
+#, c-format
+msgid "'%s' is not a valid branch name."
+msgstr "'%s' no és un nom de rama vàlid."
+
+#: branch.c:183
+#, c-format
+msgid "A branch named '%s' already exists."
+msgstr "Una rama amb nom '%s' ja existeix."
+
+#: branch.c:191
+msgid "Cannot force update the current branch."
+msgstr "No es pot actualitzar la rama actual a la força."
+
+#: branch.c:211
+#, c-format
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr ""
+"No es pot configurar la informació de seguimiento; el punt inicial '%s' no "
+"és una rama."
+
+#: branch.c:213
+#, c-format
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "la rama font demanada '%s' no existeix"
+
+#: branch.c:215
+msgid ""
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
+msgstr ""
+"\n"
+"Si planeu basar el teu treball en una rama font que ja\n"
+"existeix al remot, pot que necessiteu executar\n"
+"\"git fetch\" per obtenir-la.\n"
+"\n"
+"Si planeu pujar una rama local nova que seguirà la seva\n"
+"contrapart remota, pot que voleu utilitzar\n"
+"\"git push -u\" per establir la configuració font mentre\n"
+"pugeu."
+
+#: branch.c:260
+#, c-format
+msgid "Not a valid object name: '%s'."
+msgstr "No és un nom d'objecte vàlid: '%s'."
+
+#: branch.c:280
+#, c-format
+msgid "Ambiguous object name: '%s'."
+msgstr "Nom d'objecte ambigu: '%s'."
+
+#: branch.c:285
+#, c-format
+msgid "Not a valid branch point: '%s'."
+msgstr "No és un punt de ramificació vàlid: '%s'."
+
+#: branch.c:291
+msgid "Failed to lock ref for update"
+msgstr "S'ha fallat al bloquejar la referència per actualització"
+
+#: branch.c:309
+msgid "Failed to write ref"
+msgstr "S'ha fallat al escriure la referència"
+
+#: bundle.c:33
+#, c-format
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' no sembla a un fitxer d'embolic v2"
+
+#: bundle.c:60
+#, c-format
+msgid "unrecognized header: %s%s (%d)"
+msgstr "capçalera no reconeguda: %s%s (%d)"
+
+#: bundle.c:86 builtin/commit.c:755
+#, c-format
+msgid "could not open '%s'"
+msgstr "no s'ha pogut obrir '%s'"
+
+#: bundle.c:138
+msgid "Repository lacks these prerequisite commits:"
+msgstr "Al repositori manquen aquestes comissions prerequisits:"
+
+#: bundle.c:162 sequencer.c:630 sequencer.c:1085 builtin/log.c:330
+#: builtin/log.c:821 builtin/log.c:1428 builtin/log.c:1665 builtin/merge.c:357
+#: builtin/shortlog.c:158
+msgid "revision walk setup failed"
+msgstr "la configuració del passeig per revisions ha fallat"
+
+#: bundle.c:184
+#, c-format
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] "L'embolic conté aquesta referència:"
+msgstr[1] "L'embolic conté aquestes %d referències:"
+
+#: bundle.c:191
+msgid "The bundle records a complete history."
+msgstr "L'embolic registra una història completa."
+
+#: bundle.c:193
+#, c-format
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] "L'embolic requereix aquesta referència:"
+msgstr[1] "L'embolic requereix aquestes %d referències:"
+
+#: bundle.c:289
+msgid "rev-list died"
+msgstr "El rev-list s'ha mort"
+
+#: bundle.c:295 builtin/log.c:1339 builtin/shortlog.c:261
+#, c-format
+msgid "unrecognized argument: %s"
+msgstr "paràmetre no reconegut: %s"
+
+#: bundle.c:330
+#, c-format
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "la referència '%s' s'exclou per les opcions de rev-list"
+
+#: bundle.c:375
+msgid "Refusing to create empty bundle."
+msgstr "Refusant crear un embolic buit."
+
+#: bundle.c:390
+msgid "Could not spawn pack-objects"
+msgstr "No s'ha pogut executar el pack-objects"
+
+#: bundle.c:408
+msgid "pack-objects died"
+msgstr "El pack-objects s'ha mort"
+
+#: bundle.c:411
+#, c-format
+msgid "cannot create '%s'"
+msgstr "no es pot crear '%s'"
+
+#: bundle.c:433
+msgid "index-pack died"
+msgstr "L'index-pack s'ha mort"
+
+#: commit.c:40
+#, c-format
+msgid "could not parse %s"
+msgstr "no s'ha pogut analitzar %s"
+
+#: commit.c:42
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s no és una comissió!"
+
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "memòria esgotada"
+
+#: connected.c:70
+msgid "Could not run 'git rev-list'"
+msgstr "No s'ha pogut executar 'git rev-list'"
+
+#: connected.c:90
+#, c-format
+msgid "failed write to rev-list: %s"
+msgstr "escriptura fallada al rev-list: %s"
+
+#: connected.c:98
+#, c-format
+msgid "failed to close rev-list's stdin: %s"
+msgstr "s'ha fallat al tancar el stdin del rev-list: %s"
+
+#: date.c:95
+msgid "in the future"
+msgstr "en el futur"
+
+#: date.c:101
+#, c-format
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "fa %lu segon"
+msgstr[1] "fa %lu segons"
+
+#: date.c:108
+#, c-format
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "fa %lu minut"
+msgstr[1] "fa %lu minuts"
+
+#: date.c:115
+#, c-format
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "fa %lu hora"
+msgstr[1] "fa %lu hores"
+
+#: date.c:122
+#, c-format
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "fa %lu dia"
+msgstr[1] "fa %lu dies"
+
+#: date.c:128
+#, c-format
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "fa %lu setmana"
+msgstr[1] "fa %lu setmanes"
+
+#: date.c:135
+#, c-format
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "fa %lu mes"
+msgstr[1] "fa %lu mesos"
+
+#: date.c:146
+#, c-format
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu any"
+msgstr[1] "%lu anys"
+
+#. TRANSLATORS: "%s" is "<n> years"
+#: date.c:149
+#, c-format
+msgid "%s, %lu month ago"
+msgid_plural "%s, %lu months ago"
+msgstr[0] "%s, fa %lu mes"
+msgstr[1] "%s, fa %lu mesos"
+
+#: date.c:154 date.c:159
+#, c-format
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "fa %lu any"
+msgstr[1] "fa %lu anys"
+
+#: diffcore-order.c:24
+#, c-format
+msgid "failed to read orderfile '%s'"
+msgstr "s'ha fallat al llegir el fitxer d'ordres '%s'"
+
+#: diffcore-rename.c:514
+msgid "Performing inexact rename detection"
+msgstr "Realitzant detecció inexacte de canvi de nom"
+
+#: diff.c:114
+#, c-format
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+msgstr "  S'ha fallat al analitzar el percentatge limitant de dirstat '%s'\n"
+
+#: diff.c:119
+#, c-format
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  Paràmetre de dirstat desconegut '%s'\n"
+
+#: diff.c:214
+#, c-format
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr ""
+"Valor desconegut del variable de configuració de 'diff.submodule': '%s'"
+
+#: diff.c:267
+#, c-format
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr ""
+"Errors trobat en el variable de configuració 'diff.dirstat':\n"
+"%s"
+
+#: diff.c:2934
+#, c-format
+msgid "external diff died, stopping at %s"
+msgstr "El diff external s'ha mort, aturant a %s"
+
+#: diff.c:3329
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow requereix exactament una especificació de ruta"
+
+#: diff.c:3492
+#, c-format
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
+msgstr ""
+"S'ha fallat al analitzar el paràmetre d'opció de --dirstat/-X:\n"
+"%s"
+
+#: diff.c:3506
+#, c-format
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "S'ha fallat al analitzar el paràmetre d'opció de --submodule: %s"
+
+#: gpg-interface.c:73 gpg-interface.c:145
+msgid "could not run gpg."
+msgstr "no s'ha pogut executar el gpg."
+
+#: gpg-interface.c:85
+msgid "gpg did not accept the data"
+msgstr "El gpg no ha acceptat les dades"
+
+#: gpg-interface.c:96
+msgid "gpg failed to sign the data"
+msgstr "gpg ha fallat al firmar les dades"
+
+#: gpg-interface.c:129
+#, c-format
+msgid "could not create temporary file '%s': %s"
+msgstr "no s'ha pogut crear el fitxer temporal '%s': %s"
+
+#: gpg-interface.c:132
+#, c-format
+msgid "failed writing detached signature to '%s': %s"
+msgstr "s'ha fallat al escriure la firma separada a '%s': %s"
+
+#: grep.c:1703
+#, c-format
+msgid "'%s': unable to read %s"
+msgstr "'%s': incapaç de llegir %s"
+
+#: grep.c:1720
+#, c-format
+msgid "'%s': %s"
+msgstr "'%s': %s"
+
+#: grep.c:1731
+#, c-format
+msgid "'%s': short read %s"
+msgstr "'%s': lectura corta %s"
+
+#: help.c:207
+#, c-format
+msgid "available git commands in '%s'"
+msgstr "ordres de git disponibles en '%s'"
+
+#: help.c:214
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "ordres de git disponibles d'altres llocs en la vostra $PATH"
+
+#: help.c:230
+msgid "The most commonly used git commands are:"
+msgstr "Els ordres de git més freqüentment utilitzats són:"
+
+#: help.c:289
+#, c-format
+msgid ""
+"'%s' appears to be a git command, but we were not\n"
+"able to execute it. Maybe git-%s is broken?"
+msgstr ""
+"'%s' sembla un ordre git, però no hem pogut\n"
+"executar-lo. Pot ser que git-%s està estropejat?"
+
+#: help.c:346
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "Ai. El vostre sistema no informa de cap ordre de Git."
+
+#: help.c:368
+#, c-format
+msgid ""
+"WARNING: You called a Git command named '%s', which does not exist.\n"
+"Continuing under the assumption that you meant '%s'"
+msgstr ""
+"AVÍS: Heu invocat un ordre de Git amb nom '%s', el qual no existeix.\n"
+"Continuant baix l'assumpció que volíeu dir '%s'"
+
+#: help.c:373
+#, c-format
+msgid "in %0.1f seconds automatically..."
+msgstr "en %0.1f segons automàticament..."
+
+#: help.c:380
+#, c-format
+msgid "git: '%s' is not a git command. See 'git --help'."
+msgstr "git: '%s' no és un ordre de git. Veu 'git --help'."
+
+#: help.c:384 help.c:444
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] ""
+"\n"
+"Volíeu dir això?"
+msgstr[1] ""
+"\n"
+"Volíeu dir un d'aquests?"
+
+#: help.c:440
+#, c-format
+msgid "%s: %s - %s"
+msgstr "%s: %s - %s"
+
+#: merge.c:40
+msgid "failed to read the cache"
+msgstr "s'ha fallat al llegir la memòria cau"
+
+#: merge.c:93 builtin/checkout.c:356 builtin/checkout.c:556
+#: builtin/clone.c:661
+msgid "unable to write new index file"
+msgstr "incapaç d'escriure un nou fitxer d'índex"
+
+#: merge-recursive.c:190
+#, c-format
+msgid "(bad commit)\n"
+msgstr "(comissió dolenta)\n"
+
+#: merge-recursive.c:210
+#, c-format
+msgid "addinfo_cache failed for path '%s'"
+msgstr "addinfo_cache ha fallat per a la ruta '%s'"
+
+#: merge-recursive.c:271
+msgid "error building trees"
+msgstr "error al construir arbres"
+
+#: merge-recursive.c:692
+#, c-format
+msgid "failed to create path '%s'%s"
+msgstr "s'ha fallat al crear la ruta '%s' %s"
+
+#: merge-recursive.c:703
+#, c-format
+msgid "Removing %s to make room for subdirectory\n"
+msgstr "Traient %s per fer espai per al subdirectori\n"
+
+#: merge-recursive.c:717 merge-recursive.c:738
+msgid ": perhaps a D/F conflict?"
+msgstr ": potser un conflicte D/F?"
+
+#: merge-recursive.c:728
+#, c-format
+msgid "refusing to lose untracked file at '%s'"
+msgstr "refusant perdre el fitxer seguit a '%s'"
+
+#: merge-recursive.c:768
+#, c-format
+msgid "cannot read object %s '%s'"
+msgstr "no es pot llegir l'objecte %s '%s'"
+
+#: merge-recursive.c:770
+#, c-format
+msgid "blob expected for %s '%s'"
+msgstr "blob esperat per a %s '%s'"
+
+#: merge-recursive.c:793 builtin/clone.c:317
+#, c-format
+msgid "failed to open '%s'"
+msgstr "s'ha fallat al obrir '%s'"
+
+#: merge-recursive.c:801
+#, c-format
+msgid "failed to symlink '%s'"
+msgstr "s'ha fallat al fer l'enllaç simbòlic '%s'"
+
+#: merge-recursive.c:804
+#, c-format
+msgid "do not know what to do with %06o %s '%s'"
+msgstr "no es sap què fer amb %06o %s '%s'"
+
+#: merge-recursive.c:942
+msgid "Failed to execute internal merge"
+msgstr "S'ha fallat al executar la fusió interna"
+
+#: merge-recursive.c:946
+#, c-format
+msgid "Unable to add %s to database"
+msgstr "Incapaç d'afegir %s al base de dades"
+
+#: merge-recursive.c:962
+msgid "unsupported object type in the tree"
+msgstr "tipus d'objecte no suportat en l'arbre"
+
+#: merge-recursive.c:1037 merge-recursive.c:1051
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
+msgstr ""
+"CONFLICTE: (%s/supressió): %s suprimit en %s i %s en %s. La versió %s de %s "
+"s'ha deixat en l'arbre."
+
+#: merge-recursive.c:1043 merge-recursive.c:1056
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
+msgstr ""
+"CONFLICTE: (%s/supressió): %s suprimit en %s i %s en %s. La versió %s de %s "
+"s'ha deixat en l'arbre a %s."
+
+#: merge-recursive.c:1097
+msgid "rename"
+msgstr "canvia de nom"
+
+#: merge-recursive.c:1097
+msgid "renamed"
+msgstr "canviat de nom"
+
+#: merge-recursive.c:1153
+#, c-format
+msgid "%s is a directory in %s adding as %s instead"
+msgstr "%s és un directori en %s; afegint com %s en lloc"
+
+#: merge-recursive.c:1175
+#, c-format
+msgid ""
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
+msgstr ""
+"CONFLICTE (canvi de nom/canvi de nom): Canvi de nom \"%s\"->\"%s\" en la "
+"rama \"%s\" canvi de nom \"%s\"->\"%s\" en \"%s\"%s"
+
+#: merge-recursive.c:1180
+msgid " (left unresolved)"
+msgstr " (deixat sense resolució)"
+
+#: merge-recursive.c:1234
+#, 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:1264
+#, 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"
+
+#: merge-recursive.c:1463
+#, c-format
+msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
+msgstr ""
+"CONFLICTE (supressió/afegiment): Canvi de nom %s->%s en %s. %s afegit en %s"
+
+#: merge-recursive.c:1473
+#, c-format
+msgid "Adding merged %s"
+msgstr "Afegint %s fusionat"
+
+#: merge-recursive.c:1478 merge-recursive.c:1676
+#, c-format
+msgid "Adding as %s instead"
+msgstr "Afegint com %s en lloc"
+
+#: merge-recursive.c:1529
+#, c-format
+msgid "cannot read object %s"
+msgstr "no es pot llegir l'objecte %s"
+
+#: merge-recursive.c:1532
+#, c-format
+msgid "object %s is not a blob"
+msgstr "L'objecte %s no és un blob"
+
+#: merge-recursive.c:1580
+msgid "modify"
+msgstr "modifica"
+
+#: merge-recursive.c:1580
+msgid "modified"
+msgstr "modificat"
+
+#: merge-recursive.c:1590
+msgid "content"
+msgstr "contingut"
+
+#: merge-recursive.c:1597
+msgid "add/add"
+msgstr "afegeix/afegeix"
+
+#: merge-recursive.c:1631
+#, c-format
+msgid "Skipped %s (merged same as existing)"
+msgstr "%s saltat (el fusionat és igual a l'existent)"
+
+#: merge-recursive.c:1645
+#, c-format
+msgid "Auto-merging %s"
+msgstr "Autofusionant %s"
+
+#: merge-recursive.c:1649 git-submodule.sh:1150
+msgid "submodule"
+msgstr "submòdul"
+
+#: merge-recursive.c:1650
+#, c-format
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "CONFLICTE (%s): Conflicte de fusió en %s"
+
+#: merge-recursive.c:1740
+#, c-format
+msgid "Removing %s"
+msgstr "Traient %s"
+
+#: merge-recursive.c:1765
+msgid "file/directory"
+msgstr "fitxer/directori"
+
+#: merge-recursive.c:1771
+msgid "directory/file"
+msgstr "directori/fitxer"
+
+#: merge-recursive.c:1776
+#, 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 %s"
+
+#: merge-recursive.c:1786
+#, c-format
+msgid "Adding %s"
+msgstr "Afegint %s"
+
+#: merge-recursive.c:1803
+msgid "Fatal merge failure, shouldn't happen."
+msgstr "Fallat de fusió fatal; això no ha de passar."
+
+#: merge-recursive.c:1822
+msgid "Already up-to-date!"
+msgstr "Ja actualitzat!"
+
+#: merge-recursive.c:1831
+#, c-format
+msgid "merging of trees %s and %s failed"
+msgstr "la fusió dels arbres %s i %s ha fallat"
+
+#: merge-recursive.c:1861
+#, c-format
+msgid "Unprocessed path??? %s"
+msgstr "Ruta no processat??? %s"
+
+#: merge-recursive.c:1906
+msgid "Merging:"
+msgstr "Fusionant:"
+
+#: merge-recursive.c:1919
+#, c-format
+msgid "found %u common ancestor:"
+msgid_plural "found %u common ancestors:"
+msgstr[0] "%u avantpassat trobat:"
+msgstr[1] "%u avantpassats trobats:"
+
+#: merge-recursive.c:1956
+msgid "merge returned no commit"
+msgstr "la fusió no ha retornat cap comissió"
+
+#: merge-recursive.c:2013
+#, c-format
+msgid "Could not parse object '%s'"
+msgstr "No s'ha pogut analitzar l'objecte '%s'"
+
+#: merge-recursive.c:2024 builtin/merge.c:666
+msgid "Unable to write index."
+msgstr "Incapaç d'escriure l'índex."
+
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr "No es pot cometre un arbre de notes no inicialitzat/no referenciat"
+
+#: notes-utils.c:83
+#, c-format
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "Valor de notes.rewriteMode dolent: '%s'"
+
+#: notes-utils.c:93
+#, c-format
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgstr "Refusant reescriure les notes en %s (fora de refs/notes/)"
+
+#. TRANSLATORS: The first %s is the name of the
+#. environment variable, the second %s is its value
+#: notes-utils.c:120
+#, c-format
+msgid "Bad %s value: '%s'"
+msgstr "Valor dolent de %s: '%s'"
+
+#: object.c:234
+#, c-format
+msgid "unable to parse object: %s"
+msgstr "incapaç d'analitzar l'objecte: %s"
+
+#: parse-options.c:534
+msgid "..."
+msgstr "..."
+
+#: parse-options.c:552
+#, c-format
+msgid "usage: %s"
+msgstr "ús: %s"
+
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:556
+#, c-format
+msgid "   or: %s"
+msgstr "   o: %s"
+
+#: parse-options.c:559
+#, c-format
+msgid "    %s"
+msgstr "    %s"
+
+#: parse-options.c:593
+msgid "-NUM"
+msgstr "-NUM"
+
+#: pathspec.c:133
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+msgstr ""
+"els ajusts d'especificació de ruta 'glob' i 'noglob' globals són "
+"incompatibles"
+
+#: pathspec.c:143
+msgid ""
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
+msgstr ""
+"l'ajust d'especificació de ruta 'literal' global és incompatible amb tots "
+"els altres ajusts d'especificació de ruta globals"
+
+#: pathspec.c:177
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "paràmetre invàlid per a la màgica d'especificació de ruta 'prefix'"
+
+#: pathspec.c:183
+#, c-format
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "Màgica d'especificació de ruta invàlida '%.*s' en '%s'"
+
+#: pathspec.c:187
+#, c-format
+msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgstr "')' mancant al final de la màgica d'especificació de ruta en '%s'"
+
+#: pathspec.c:205
+#, c-format
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "Màgica d'especificació de ruta no implementada '%c' en '%s'"
+
+#: pathspec.c:230
+#, c-format
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s: 'literal' i 'glob' són incompatibles"
+
+#: pathspec.c:241
+#, c-format
+msgid "%s: '%s' is outside repository"
+msgstr "%s: '%s' està fora del repositori"
+
+#: pathspec.c:291
+#, c-format
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "L'especificació '%s' està en el submòdul '%.*s'"
+
+#: pathspec.c:353
+#, c-format
+msgid "%s: pathspec magic not supported by this command: %s"
+msgstr "%s: aquest ordre no suporta la màgica d'especificació de ruta: %s"
+
+#: pathspec.c:432
+#, c-format
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr "l'especificació de ruta '%s' està més allà d'un enllaç simbòlic"
+
+#: pathspec.c:441
+msgid ""
+"There is nothing to exclude from by :(exclude) patterns.\n"
+"Perhaps you forgot to add either ':/' or '.' ?"
+msgstr ""
+"No hi ha res que excloure per patrons :(exclusió).\n"
+"Potser heu oblidat afegir o ':/' o '.' ?"
+
+#: progress.c:225
+msgid "done"
+msgstr "fet"
+
+#: read-cache.c:1260
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"index.version establert, però el valor és invàlid.\n"
+"Utilitzant la versió %i"
+
+#: read-cache.c:1270
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"GIT_INDEX_VERSION establert, però el valor és invàlid.\n"
+"Utilitzant la versió %i"
+
+#: remote.c:753
+#, c-format
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "No és pot obtenir ambdós %s i %s a %s"
+
+#: remote.c:757
+#, c-format
+msgid "%s usually tracks %s, not %s"
+msgstr "%s generalment segueix %s, no %s"
+
+#: remote.c:761
+#, c-format
+msgid "%s tracks both %s and %s"
+msgstr "%s segueix ambdós %s i %s"
+
+#: remote.c:769
+msgid "Internal error"
+msgstr "Error intern"
+
+#: remote.c:1943
+#, c-format
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
+msgstr "La teva rama està basada en '%s', però la font no està.\n"
+
+#: remote.c:1947
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "  (utilitzeu \"git branch --unset-upstream\" per arreglar)\n"
+
+#: remote.c:1950
+#, c-format
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "La vostra rama està actualitzada amb '%s'.\n"
+
+#: remote.c:1954
+#, 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 rama està davant de '%s' per %d comissions.\n"
+msgstr[1] "La vostra rama està davant de '%s' per %d comissions.\n"
+
+#: remote.c:1960
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr ""
+"  (utilitzeu \"git push\" per publicar els vostres comissions locals)\n"
+
+#: remote.c:1963
+#, c-format
+msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
+msgid_plural ""
+"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
+msgstr[0] ""
+"La vostra rama està darrere de '%s' per %d comissió, i pot avançar-se "
+"ràpidament.\n"
+msgstr[1] ""
+"La vostra rama està darrere de '%s' per %d comissions, i pot avançar-se "
+"ràpidament.\n"
+
+#: remote.c:1971
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr " (utilitzeu \"git pull\" per actualitzar la vostra rama local)\n"
+
+#: remote.c:1974
+#, c-format
+msgid ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commit each, respectively.\n"
+msgid_plural ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commits each, respectively.\n"
+msgstr[0] ""
+"La vostra rama i '%s' s'han divergit,\n"
+"i tenen %d i %d comissió distinta cada una, respectivament.\n"
+msgstr[1] ""
+"La vostra rama i '%s' s'han divergit,\n"
+"i tenen %d i %d comissions distintes cada una, respectivament.\n"
+
+#: remote.c:1984
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
+msgstr "  (utilitzeu \"git pull\" per fusionar la rama remota a la vostra)\n"
+
+#: run-command.c:80
+msgid "open /dev/null failed"
+msgstr "s'ha fallat al obrir /dev/null"
+
+#: run-command.c:82
+#, c-format
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) s'ha fallat"
+
+#: sequencer.c:171 builtin/merge.c:782 builtin/merge.c:893
+#: builtin/merge.c:1003 builtin/merge.c:1013
+#, c-format
+msgid "Could not open '%s' for writing"
+msgstr "No s'ha pogut obrir '%s' per a escriptura"
+
+#: sequencer.c:173 builtin/merge.c:343 builtin/merge.c:785
+#: builtin/merge.c:1005 builtin/merge.c:1018
+#, c-format
+msgid "Could not write to '%s'"
+msgstr "No s'ha pogut escriure al '%s'"
+
+#: sequencer.c:194
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
+msgstr ""
+"després de resoldre els conflictes, marqueu les rutes\n"
+"corregides amb 'git add <paths>' o 'git rm <paths>'"
+
+#: sequencer.c:197
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
+msgstr ""
+"després de resoldre els conflictes, marqueu les rutes\n"
+"corregides amb 'git add <paths>' o 'git rm <paths>'\n"
+"i cometeu el resultat amb 'git commit'"
+
+#: sequencer.c:210 sequencer.c:841 sequencer.c:924
+#, c-format
+msgid "Could not write to %s"
+msgstr "No s'ha pogut escriure a %s"
+
+#: sequencer.c:213
+#, c-format
+msgid "Error wrapping up %s"
+msgstr "Error terminant %s"
+
+#: sequencer.c:228
+msgid "Your local changes would be overwritten by cherry-pick."
+msgstr "Els vostres canvis locals es sobreescriurien pel recull de cireres."
+
+#: sequencer.c:230
+msgid "Your local changes would be overwritten by revert."
+msgstr "Els vostres canvis locals es sobreescriurien per la reversió."
+
+#: sequencer.c:233
+msgid "Commit your changes or stash them to proceed."
+msgstr "Cometeu els vostres canvis o emmagatzemeu-los per procedir."
+
+#: sequencer.c:250
+msgid "Failed to lock HEAD during fast_forward_to"
+msgstr "S'ha fallat al bloquejar HEAD durant fast_forward_to"
+
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:293
+#, c-format
+msgid "%s: Unable to write new index file"
+msgstr "%s: Incapaç d'escriure un nou fitxer d'índex"
+
+#: sequencer.c:324
+msgid "Could not resolve HEAD commit\n"
+msgstr "No s'ha pogut resoldre la comissió HEAD\n"
+
+#: sequencer.c:344
+msgid "Unable to update cache tree\n"
+msgstr "Incapaç d'actualitzar l'arbre cau\n"
+
+#: sequencer.c:391
+#, c-format
+msgid "Could not parse commit %s\n"
+msgstr "No s'ha pogut analitzar la comissió %s\n"
+
+#: sequencer.c:396
+#, c-format
+msgid "Could not parse parent commit %s\n"
+msgstr "No s'ha pogut analitzar la comissió pare %s\n"
+
+#: sequencer.c:462
+msgid "Your index file is unmerged."
+msgstr "El vostre fitxer d'índex està sense fusionar."
+
+#: sequencer.c:481
+#, c-format
+msgid "Commit %s is a merge but no -m option was given."
+msgstr "La comissió %s és una fusió però cap opció -m s'ha donat."
+
+#: sequencer.c:489
+#, c-format
+msgid "Commit %s does not have parent %d"
+msgstr "La comissió %s no té pare %d"
+
+#: sequencer.c:493
+#, c-format
+msgid "Mainline was specified but commit %s is not a merge."
+msgstr ""
+"S'ha especificat la línia principal però la comissió %s no és una fusió."
+
+#. TRANSLATORS: The first %s will be "revert" or
+#. "cherry-pick", the second %s a SHA1
+#: sequencer.c:506
+#, c-format
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: no es pot analitzar la comissió pare %s"
+
+#: sequencer.c:510
+#, c-format
+msgid "Cannot get commit message for %s"
+msgstr "No es pot obtenir el missatge de comissió de %s"
+
+#: sequencer.c:596
+#, c-format
+msgid "could not revert %s... %s"
+msgstr "no s'ha pogut revertir %s... %s"
+
+#: sequencer.c:597
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "no s'ha pogut aplicar %s... %s"
+
+#: sequencer.c:633
+msgid "empty commit set passed"
+msgstr "conjunt de comissions buit passat"
+
+#: sequencer.c:641
+#, c-format
+msgid "git %s: failed to read the index"
+msgstr "git %s: s'ha fallat al llegir l'índex"
+
+#: sequencer.c:645
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: s'ha fallat al actualitzar l'índex"
+
+#: sequencer.c:705
+#, c-format
+msgid "Cannot %s during a %s"
+msgstr "No es pot %s durant un %s"
+
+#: sequencer.c:727
+#, c-format
+msgid "Could not parse line %d."
+msgstr "No s'ha pogut analitzar la línia %d."
+
+#: sequencer.c:732
+msgid "No commits parsed."
+msgstr "Cap comissió analitzada."
+
+#: sequencer.c:745
+#, c-format
+msgid "Could not open %s"
+msgstr "No s'ha pogut obrir %s"
+
+#: sequencer.c:749
+#, c-format
+msgid "Could not read %s."
+msgstr "No s'ha pogut llegir %s."
+
+#: sequencer.c:756
+#, c-format
+msgid "Unusable instruction sheet: %s"
+msgstr "Full d'instruccions inutilitzable: %s"
+
+#: sequencer.c:786
+#, c-format
+msgid "Invalid key: %s"
+msgstr "Clau invàlid: %s"
+
+#: sequencer.c:789
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr "Valor invàlid per a %s: %s"
+
+#: sequencer.c:801
+#, c-format
+msgid "Malformed options sheet: %s"
+msgstr "Full d'opcions malformat: %s"
+
+#: sequencer.c:822
+msgid "a cherry-pick or revert is already in progress"
+msgstr "un recull de cireres o una reversió ja està en curs"
+
+#: sequencer.c:823
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "intenteu \"git cherry-pick (--continue | --quit | --abort)\""
+
+#: sequencer.c:827
+#, c-format
+msgid "Could not create sequencer directory %s"
+msgstr "No s'ha pogut crear el directori de seqüenciador %s"
+
+#: sequencer.c:843 sequencer.c:928
+#, c-format
+msgid "Error wrapping up %s."
+msgstr "Error al terminar %s."
+
+#: sequencer.c:862 sequencer.c:998
+msgid "no cherry-pick or revert in progress"
+msgstr "cap recull de cireres o reversió en curs"
+
+#: sequencer.c:864
+msgid "cannot resolve HEAD"
+msgstr "no es pot resoldre HEAD"
+
+#: sequencer.c:866
+msgid "cannot abort from a branch yet to be born"
+msgstr "no es pot avortar des d'una rama que encara ha de nàixer"
+
+#: sequencer.c:888 builtin/apply.c:4062
+#, c-format
+msgid "cannot open %s: %s"
+msgstr "no es pot obrir %s: %s"
+
+#: sequencer.c:891
+#, c-format
+msgid "cannot read %s: %s"
+msgstr "no es pot llegir %s: %s"
+
+#: sequencer.c:892
+msgid "unexpected end of file"
+msgstr "fin de fitxer inesperat"
+
+#: sequencer.c:898
+#, c-format
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr ""
+"el fitxer HEAD emmagatzemat abans del recull de cirers '%s' és corrupte"
+
+#: sequencer.c:921
+#, c-format
+msgid "Could not format %s."
+msgstr "No s'ha pogut formatar %s."
+
+#: sequencer.c:1066
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: no es pot recollir com cirera un %s"
+
+#: sequencer.c:1069
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: revisió dolenta"
+
+#: sequencer.c:1103
+msgid "Can't revert as initial commit"
+msgstr "No es pot revertir com comissió inicial"
+
+#: sequencer.c:1104
+msgid "Can't cherry-pick into empty head"
+msgstr "No es pot recollir cireres en un cap buit"
+
+#: sha1_name.c:439
+msgid ""
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
+msgstr ""
+"Git normalment mai crea una referència que termini amb 40 caràcters\n"
+"hexadecimals perquè s'ignorarà quan només especifiqueu 40 caràcters\n"
+"hexadecimals. Aquestes referències es poden crear per error. Per\n"
+"exemple,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"on \"$br\" és de alguna manera buit i una referència de 40 caràcters\n"
+"hexadecimals. Si us plau, examineu aquests referències i potser\n"
+"suprimiu-les. Desactiva aquest missatge per executar\n"
+"\"git config advice.objectNameWarning false\""
+
+#: sha1_name.c:1060
+msgid "HEAD does not point to a branch"
+msgstr "HEAD no assenyala cap rama"
+
+#: sha1_name.c:1063
+#, c-format
+msgid "No such branch: '%s'"
+msgstr "Cap rama així: '%s'"
+
+#: sha1_name.c:1065
+#, c-format
+msgid "No upstream configured for branch '%s'"
+msgstr "Cap font configurada per a la rama '%s'"
+
+#: sha1_name.c:1069
+#, c-format
+msgid "Upstream branch '%s' not stored as a remote-tracking branch"
+msgstr "La rama font '%s' no s'emmagatzema com rama que segueixi al remot"
+
+#: submodule.c:64 submodule.c:98
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr ""
+"No es pot canviar un .gitmodules no fusionat, primer resoldreu els "
+"conflictes de fusió"
+
+#: submodule.c:68 submodule.c:102
+#, c-format
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "No s'ha pogut trobar la secció en .gitmodules on path=%s"
+
+#: submodule.c:76
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr "No s'ha pogut actualitzar l'entrada de .gitmodules %s"
+
+#: submodule.c:109
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "No s'ha pogut treure l'entrada de .gitmodules per a %s"
+
+#: submodule.c:120
+msgid "staging updated .gitmodules failed"
+msgstr "L'allistament del .gitmodules actualitzat ha fallat"
+
+#: submodule.c:1118 builtin/init-db.c:363
+#, c-format
+msgid "Could not create git link %s"
+msgstr "No s'ha pogut crear l'enllaç de git %s"
+
+#: submodule.c:1129
+#, c-format
+msgid "Could not set core.worktree in %s"
+msgstr "No s'ha pogut establir core.worktree en %s"
+
+#: unpack-trees.c:202
+msgid "Checking out files"
+msgstr "Agafant fitxers"
+
+#: urlmatch.c:120
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "esquema d'URL invàlida o manca el sufix '://'"
+
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr "seqüència d'escapament %XX invàlida"
+
+#: urlmatch.c:172
+msgid "missing host and scheme is not 'file:'"
+msgstr "manca l'host i l'esquema no és 'file:'"
+
+#: urlmatch.c:189
+msgid "a 'file:' URL may not have a port number"
+msgstr "un URL 'file:' no pot tenir un número de port"
+
+#: urlmatch.c:199
+msgid "invalid characters in host name"
+msgstr "caràcters invàlids en nom de host"
+
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr "número de port invàlid"
+
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr "segment de ruta '..' invàlid"
+
+#: wrapper.c:460
+#, c-format
+msgid "unable to access '%s': %s"
+msgstr "incapaç d'accedir a '%s': %s"
+
+#: wrapper.c:481
+#, c-format
+msgid "unable to access '%s'"
+msgstr "incapaç d'accedir a '%s'"
+
+#: wrapper.c:492
+#, c-format
+msgid "unable to look up current user in the passwd file: %s"
+msgstr "incapaç de trobar l'usuari actual en el fitxer passwd: %s"
+
+#: wrapper.c:493
+msgid "no such user"
+msgstr "cap usuari així"
+
+#: wt-status.c:150
+msgid "Unmerged paths:"
+msgstr "Rutes sense fusionar:"
+
+#: wt-status.c:177 wt-status.c:204
+#, c-format
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (utilitzeu \"git reset %s <fitxer>...\" per desallistar)"
+
+#: wt-status.c:179 wt-status.c:206
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr "  (utilitzeu \"git rm --cached <fitxer>...\" per desallistar)"
+
+#: wt-status.c:183
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (utilitzeu \"git add <file>...\" per senyalar resolució)"
+
+#: wt-status.c:185 wt-status.c:189
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+msgstr ""
+"  (utilitzeu \"git add/rm <file>...\" segons sigui apropiat per senyalar "
+"resolució)"
+
+#: wt-status.c:187
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (utilitzeu \"git rm <file>...\" per senyalar resolució)"
+
+#: wt-status.c:198
+msgid "Changes to be committed:"
+msgstr "Canvis que cometre:"
+
+#: wt-status.c:216
+msgid "Changes not staged for commit:"
+msgstr "Canvis no allistats per a cometre:"
+
+#: wt-status.c:220
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr "  (utilitzeu \"git add <file>...\" per actualitzar què es cometrà)"
+
+#: wt-status.c:222
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr "  (utilitzeu \"git add/rm <file>...\" per actualitzar què es cometrà)"
+
+#: wt-status.c:223
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+msgstr ""
+"  (utilitzeu \"git checkout -- <file>...\" per descartar els canvis en el "
+"directori de treball)"
+
+#: wt-status.c:225
+msgid "  (commit or discard the untracked or modified content in submodules)"
+msgstr ""
+"  (cometeu o descarteu el contingut modificat o no seguit en els submòduls)"
+
+#: wt-status.c:237
+#, c-format
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr "  (utilitzeu \"git %s <file>...\" per incloure en què es cometrà)"
+
+#: wt-status.c:252
+msgid "both deleted:"
+msgstr "suprimit per ambdós:"
+
+#: wt-status.c:254
+msgid "added by us:"
+msgstr "afegit per nosaltres:"
+
+#: wt-status.c:256
+msgid "deleted by them:"
+msgstr "suprimit per ells:"
+
+#: wt-status.c:258
+msgid "added by them:"
+msgstr "afegit per ells:"
+
+#: wt-status.c:260
+msgid "deleted by us:"
+msgstr "suprimit per nosaltres:"
+
+#: wt-status.c:262
+msgid "both added:"
+msgstr "afegit per ambdós:"
+
+#: wt-status.c:264
+msgid "both modified:"
+msgstr "modificat per ambdós:"
+
+#: wt-status.c:266
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr "bug: estat no fusionat no manejat %x"
+
+#: wt-status.c:274
+msgid "new file:"
+msgstr "fitxer nou:"
+
+#: wt-status.c:276
+msgid "copied:"
+msgstr "copiat:"
+
+#: wt-status.c:278
+msgid "deleted:"
+msgstr "suprimit:"
+
+#: wt-status.c:280
+msgid "modified:"
+msgstr "modificat:"
+
+#: wt-status.c:282
+msgid "renamed:"
+msgstr "canviat de nom:"
+
+#: wt-status.c:284
+msgid "typechange:"
+msgstr "canviat de tipus:"
+
+#: wt-status.c:286
+msgid "unknown:"
+msgstr "desconegut:"
+
+#: wt-status.c:288
+msgid "unmerged:"
+msgstr "sense fusionar:"
+
+#: wt-status.c:370
+msgid "new commits, "
+msgstr "comissions noves, "
+
+#: wt-status.c:372
+msgid "modified content, "
+msgstr "contingut modificat, "
+
+#: wt-status.c:374
+msgid "untracked content, "
+msgstr "contingut no seguit, "
+
+#: wt-status.c:391
+#, c-format
+msgid "bug: unhandled diff status %c"
+msgstr "bug: estat de diferència no manejat %c"
+
+#: wt-status.c:764
+msgid "Submodules changed but not updated:"
+msgstr "Submòduls canviats però no actualitzats:"
+
+#: wt-status.c:766
+msgid "Submodule changes to be committed:"
+msgstr "Canvis de submòdul que cometre:"
+
+#: wt-status.c:845
+msgid ""
+"Do not touch the line above.\n"
+"Everything below will be removed."
+msgstr ""
+"No toquis la línia amunt.\n"
+"Tot a baix es traurà."
+
+#: wt-status.c:936
+msgid "You have unmerged paths."
+msgstr "Teniu rutes sense fusionar."
+
+#: wt-status.c:939
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (arregleu els conflictes i executeu \"git commit\")"
+
+#: wt-status.c:942
+msgid "All conflicts fixed but you are still merging."
+msgstr "Tots els conflictes arreglats però encara esteu fusionant."
+
+#: wt-status.c:945
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (utilitzeu \"git commit\" per concloure la fusió)"
+
+#: wt-status.c:955
+msgid "You are in the middle of an am session."
+msgstr "Esteu en el medi d'una sessió am."
+
+#: wt-status.c:958
+msgid "The current patch is empty."
+msgstr "El pedaç actual està buit."
+
+#: wt-status.c:962
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (arregleu els conflictes i després executeu \"git am --continue\")"
+
+#: wt-status.c:964
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (utilitzeu \"git am --skip\" per saltar aquest pedaç)"
+
+#: wt-status.c:966
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (utilitzeu \"git am --abort\" per restaurar la rama original)"
+
+#: wt-status.c:1026 wt-status.c:1043
+#, c-format
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Actualment esteu rebasant la rama '%s' en '%s'."
+
+#: wt-status.c:1031 wt-status.c:1048
+msgid "You are currently rebasing."
+msgstr "Actualment esteu rebasant."
+
+#: wt-status.c:1034
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr ""
+"  (arregleu els conflictes i després executeu \"git rebase --continue\")"
+
+#: wt-status.c:1036
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (utlitizeu \"git rebase --skip\" per saltar aquest pedaç)"
+
+#: wt-status.c:1038
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (utilitzeu \"git rebase --abort\" per agafar la rama original)"
+
+#: wt-status.c:1051
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr "  (tots els conflictes arreglats: executeu \"git rebase --continue\")"
+
+#: wt-status.c:1055
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"Actualment esteu dividint una comissió mentre rebasant la rama '%s' en '%s'."
+
+#: wt-status.c:1060
+msgid "You are currently splitting a commit during a rebase."
+msgstr "Actualment esteu dividint una comissió durant un rebase."
+
+#: wt-status.c:1063
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr ""
+"  (Una vegada que el vostre directori de treball sigui net, executeu \"git "
+"rebase --continue\")"
+
+#: wt-status.c:1067
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+"Actualment esteu editant una comissió mentre rebasant la rama '%s' en '%s'."
+
+#: wt-status.c:1072
+msgid "You are currently editing a commit during a rebase."
+msgstr "Actualment esteu editant una comissió durant un rebase."
+
+#: wt-status.c:1075
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (utilitzeu \"git commit --amend\" per esmenar la comissió actual)"
+
+#: wt-status.c:1077
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr ""
+"  (utilitzeu \"git rebase --continue\" una vegada que sigueu satisfet amb "
+"els vostres canvis)"
+
+#: wt-status.c:1087
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "Actualment esteu recollint com cirera la comissió %s."
+
+#: wt-status.c:1092
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (arregleu els conflictes i executeu \"git cherry-pick --continue\")"
+
+#: wt-status.c:1095
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr ""
+"  (tots els conflictes arreglats: executeu \"git cherry-pick --continue\")"
+
+#: wt-status.c:1097
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr ""
+"  (utilitzeu \"git cherry-pick --abort\" per cancel·lar l'operació de recull "
+"de cireres)"
+
+#: wt-status.c:1106
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "Actualment esteu revertint la comissió %s."
+
+#: wt-status.c:1111
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (arregleu els conflictes i executeu \"git revert --continue\")"
+
+#: wt-status.c:1114
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr "  (tots els conflictes arreglats: executeu \"git revert --continue\")"
+
+#: wt-status.c:1116
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr ""
+"  (utilitzeu \"git revert --abort\" per cancel·lar l'operació de reversió)"
+
+#: wt-status.c:1127
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "Actualment esteu bisecant, heu començat des de la rama '%s'."
+
+#: wt-status.c:1131
+msgid "You are currently bisecting."
+msgstr "Actualment esteu bisecant."
+
+#: wt-status.c:1134
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr "  (utilitzeu \"git bisect reset\" per tornar a la rama original)"
+
+#: wt-status.c:1309
+msgid "On branch "
+msgstr "En la rama "
+
+#: wt-status.c:1316
+msgid "rebase in progress; onto "
+msgstr "rebase en progrés; en "
+
+#: wt-status.c:1323
+msgid "HEAD detached at "
+msgstr "HEAD separat a"
+
+#: wt-status.c:1325
+msgid "HEAD detached from "
+msgstr "HEAD separat de"
+
+#: wt-status.c:1328
+msgid "Not currently on any branch."
+msgstr "Actualment no en cap rama."
+
+#: wt-status.c:1345
+msgid "Initial commit"
+msgstr "Comissió inicial"
+
+#: wt-status.c:1359
+msgid "Untracked files"
+msgstr "Fitxers no seguits"
+
+#: wt-status.c:1361
+msgid "Ignored files"
+msgstr "Fitxers ignorats"
+
+#: wt-status.c:1365
+#, 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 ""
+"Ha trigat %.2f segons en enumerar fitxers no seguits.\n"
+"'status -uno' pot accelerar-ho, però heu de tenir cuidat de no\n"
+"oblidar afegir fitxers nous per vós mateix (veu\n"
+"'git help status')."
+
+#: wt-status.c:1371
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr "Fitxers no seguits no llistats%s"
+
+#: wt-status.c:1373
+msgid " (use -u option to show untracked files)"
+msgstr " (utilitzeu l'opció -u per mostrar fitxers no seguits)"
+
+#: wt-status.c:1379
+msgid "No changes"
+msgstr "Sense canvis"
+
+#: wt-status.c:1384
+#, c-format
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr ""
+"cap canvi afegit que cometre (afegeix \"git add\" o \"git commit -a\")\n"
+
+#: wt-status.c:1387
+#, c-format
+msgid "no changes added to commit\n"
+msgstr "cap canvi afegit que cometre\n"
+
+#: wt-status.c:1390
+#, c-format
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr ""
+"res afegit que cometre però fitxers no seguits estan presents (utilitzeu "
+"\"git add\" per seguir-los)\n"
+
+#: wt-status.c:1393
+#, c-format
+msgid "nothing added to commit but untracked files present\n"
+msgstr "res afegit que cometre però fitxers no seguits estan presents\n"
+
+#: wt-status.c:1396
+#, c-format
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr ""
+"res que cometre (creeu/copieu fitxers i utilitzeu \"git add\" per seguir-"
+"los)\n"
+
+#: wt-status.c:1399 wt-status.c:1404
+#, c-format
+msgid "nothing to commit\n"
+msgstr "res que cometre\n"
+
+#: wt-status.c:1402
+#, c-format
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr "res que cometre (utilitzeu -u per mostrar fitxers no seguits)\n"
+
+#: wt-status.c:1406
+#, c-format
+msgid "nothing to commit, working directory clean\n"
+msgstr "res que cometre, directori de treball net\n"
+
+#: wt-status.c:1515
+msgid "HEAD (no branch)"
+msgstr "HEAD (sense rama)"
+
+#: wt-status.c:1521
+msgid "Initial commit on "
+msgstr "Comissió inicial en "
+
+#: wt-status.c:1553
+msgid "gone"
+msgstr "no està"
+
+#: wt-status.c:1555 wt-status.c:1563
+msgid "behind "
+msgstr "darrere "
+
+#: compat/precompose_utf8.c:55 builtin/clone.c:356
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "s'ha fallat al desenllaçar '%s'"
+
+#: builtin/add.c:21
+msgid "git add [options] [--] <pathspec>..."
+msgstr "git add [opcions] [--] <especificació-de-ruta>..."
+
+#: builtin/add.c:64
+#, c-format
+msgid "unexpected diff status %c"
+msgstr "estat de diff inesperat %c"
+
+#: builtin/add.c:69 builtin/commit.c:261
+msgid "updating files failed"
+msgstr "s'ha fallat al actualitzar els fitxers"
+
+#: builtin/add.c:79
+#, c-format
+msgid "remove '%s'\n"
+msgstr "treu '%s'\n"
+
+#: builtin/add.c:133
+msgid "Unstaged changes after refreshing the index:"
+msgstr "Canvis no allistats després d'actualitzar l'índex:"
+
+#: builtin/add.c:193 builtin/rev-parse.c:781
+msgid "Could not read the index"
+msgstr "No s'ha pogut llegir l'índex"
+
+#: builtin/add.c:204
+#, c-format
+msgid "Could not open '%s' for writing."
+msgstr "No s'ha pogut obrir '%s' per a escriptura."
+
+#: builtin/add.c:208
+msgid "Could not write patch"
+msgstr "No s'ha pogut escriure el pedaç"
+
+#: builtin/add.c:213
+#, c-format
+msgid "Could not stat '%s'"
+msgstr "No s'ha pogut fer stat a '%s'"
+
+#: builtin/add.c:215
+msgid "Empty patch. Aborted."
+msgstr "Pedaç buit. Avortat."
+
+#: builtin/add.c:221
+#, c-format
+msgid "Could not apply '%s'"
+msgstr "No s'ha pogut aplicar '%s'"
+
+#: builtin/add.c:231
+msgid "The following paths are ignored by one of your .gitignore files:\n"
+msgstr "Les rutes següents s'ignoren per un dels vostres fitxers .gitignore:\n"
+
+#: builtin/add.c:248 builtin/clean.c:875 builtin/fetch.c:108 builtin/mv.c:70
+#: builtin/prune-packed.c:77 builtin/push.c:488 builtin/remote.c:1367
+#: builtin/rm.c:269
+msgid "dry run"
+msgstr "marxa en sec"
+
+#: builtin/add.c:249 builtin/apply.c:4411 builtin/check-ignore.c:19
+#: builtin/commit.c:1328 builtin/count-objects.c:95 builtin/fsck.c:606
+#: builtin/log.c:1613 builtin/mv.c:69 builtin/read-tree.c:113
+msgid "be verbose"
+msgstr "sigues verbós"
+
+#: builtin/add.c:251
+msgid "interactive picking"
+msgstr "recull interactiu"
+
+#: builtin/add.c:252 builtin/checkout.c:1102 builtin/reset.c:285
+msgid "select hunks interactively"
+msgstr "selecciona els trossos interactivament"
+
+#: builtin/add.c:253
+msgid "edit current diff and apply"
+msgstr "edita la diferència actual i aplica"
+
+#: builtin/add.c:254
+msgid "allow adding otherwise ignored files"
+msgstr "permet afegir fitxers que d'altra manera s'ignoren"
+
+#: builtin/add.c:255
+msgid "update tracked files"
+msgstr "actualitza els fitxers seguits"
+
+#: builtin/add.c:256
+msgid "record only the fact that the path will be added later"
+msgstr "registra només el fet que la ruta s'afegirà més tard"
+
+#: builtin/add.c:257
+msgid "add changes from all tracked and untracked files"
+msgstr "afegeix els canvis de tots els fitxers seguits i no seguits"
+
+#: builtin/add.c:260
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr "ignora les rutes tretes en l'arbre de treball (el mateix que --no-all)"
+
+#: builtin/add.c:262
+msgid "don't add, only refresh the index"
+msgstr "no afegeixis, només actualitza l'índex"
+
+#: builtin/add.c:263
+msgid "just skip files which cannot be added because of errors"
+msgstr "només salta els fitxers que no es poden afegir a causa d'errors"
+
+#: builtin/add.c:264
+msgid "check if - even missing - files are ignored in dry run"
+msgstr ""
+"comproveu si els fitxers - encara els mancants - s'ignoran en marxa en sec"
+
+#: builtin/add.c:286
+#, c-format
+msgid "Use -f if you really want to add them.\n"
+msgstr "Utilitzeu -f si realment els voleu afegir.\n"
+
+#: builtin/add.c:287
+msgid "no files added"
+msgstr "cap fitxer afegit"
+
+#: builtin/add.c:293
+msgid "adding files failed"
+msgstr "l'afegiment de fitxers ha fallat"
+
+#: builtin/add.c:329
+msgid "-A and -u are mutually incompatible"
+msgstr "-A i -u són mutualment incompatibles"
+
+#: builtin/add.c:336
+msgid "Option --ignore-missing can only be used together with --dry-run"
+msgstr "L'opció --ignore-missing només es pot utilitzar junt amb --dry-run"
+
+#: builtin/add.c:357
+#, c-format
+msgid "Nothing specified, nothing added.\n"
+msgstr "Res especificat, res afegit.\n"
+
+#: builtin/add.c:358
+#, c-format
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Potser volíeu dir 'git add .'?\n"
+
+#: builtin/add.c:363 builtin/check-ignore.c:172 builtin/clean.c:919
+#: builtin/commit.c:319 builtin/mv.c:90 builtin/reset.c:234 builtin/rm.c:299
+msgid "index file corrupt"
+msgstr "fitxer d'índex malmès"
+
+#: builtin/add.c:446 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:431
+msgid "Unable to write new index file"
+msgstr "Incapaç d'escriure un nou fitxer d'índex"
+
+#: builtin/apply.c:57
+msgid "git apply [options] [<patch>...]"
+msgstr "git apply [opcions] [<pedaç>...]"
+
+#: builtin/apply.c:110
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr "opció d'espai en blanc '%s' no reconeguda"
+
+#: builtin/apply.c:125
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "opció d'ignoral d'espai en blanc '%s' no reconeguda"
+
+#: builtin/apply.c:825
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "No es pot preparar l'expressió regular de marca de temps %s"
+
+#: builtin/apply.c:834
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "regexec ha retornat %d per l'entrada: %s"
+
+#: builtin/apply.c:915
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr "incapaç de trobar el nom de fitxer en el pedaç a la línia %d"
+
+#: builtin/apply.c:947
+#, 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:951
+#, 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:952
+#, 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:959
+#, 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:1422
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recompte: línia inesperada: %.*s"
+
+#: builtin/apply.c:1479
+#, 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:1496
+#, c-format
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] ""
+"a la capçalera de git diff li manca informació de nom de fitxer al treure %d "
+"component de nom de ruta inicial (línia %d)"
+msgstr[1] ""
+"a la capçalera de git diff li manca informació de nom de fitxer al treure %d "
+"components de nom de ruta inicial (línia %d)"
+
+#: builtin/apply.c:1656
+msgid "new file depends on old contents"
+msgstr "el fitxer nou depèn dels continguts antics"
+
+#: builtin/apply.c:1658
+msgid "deleted file still has contents"
+msgstr "el fitxer suprimit encara té continguts"
+
+#: builtin/apply.c:1684
+#, c-format
+msgid "corrupt patch at line %d"
+msgstr "pedaç malmès a la línia %d"
+
+#: builtin/apply.c:1720
+#, c-format
+msgid "new file %s depends on old contents"
+msgstr "el fitxer nou %s depèn dels continguts antics"
+
+#: builtin/apply.c:1722
+#, c-format
+msgid "deleted file %s still has contents"
+msgstr "el fitxer suprimit %s encara té continguts"
+
+#: builtin/apply.c:1725
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** avís: el fitxer %s es buida però no es suprimeix"
+
+#: builtin/apply.c:1871
+#, c-format
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "pedaç binari malmès a la línia %d: %.*s"
+
+#: builtin/apply.c:1900
+#, c-format
+msgid "unrecognized binary patch at line %d"
+msgstr "pedaç binari no reconegut a la línia %d"
+
+#: builtin/apply.c:1986
+#, c-format
+msgid "patch with only garbage at line %d"
+msgstr "pedaç amb només escombraries a la línia %d"
+
+#: builtin/apply.c:2076
+#, c-format
+msgid "unable to read symlink %s"
+msgstr "incapaç de llegir l'enllaç simbòlic %s"
+
+#: builtin/apply.c:2080
+#, c-format
+msgid "unable to open or read %s"
+msgstr "incapaç d'obrir o llegir %s"
+
+#: builtin/apply.c:2688
+#, c-format
+msgid "invalid start of line: '%c'"
+msgstr "inici de línia no vàlid: '%c'"
+
+#: builtin/apply.c:2806
+#, 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:2818
+#, c-format
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "Context reduït a (%ld/%ld) per a aplicar el fragment a %d"
+
+#: builtin/apply.c:2824
+#, c-format
+msgid ""
+"while searching for:\n"
+"%.*s"
+msgstr ""
+"mentre cercant:\n"
+"%.*s"
+
+#: builtin/apply.c:2843
+#, c-format
+msgid "missing binary patch data for '%s'"
+msgstr "manca els dades de pedaç binari de '%s'"
+
+#: builtin/apply.c:2944
+#, c-format
+msgid "binary patch does not apply to '%s'"
+msgstr "el pedaç binari no s'aplica a '%s'"
+
+#: builtin/apply.c:2950
+#, 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:2971
+#, c-format
+msgid "patch failed: %s:%ld"
+msgstr "el pedaç ha fallat: %s:%ld"
+
+#: builtin/apply.c:3095
+#, c-format
+msgid "cannot checkout %s"
+msgstr "no es pot agafar %s"
+
+#: builtin/apply.c:3140 builtin/apply.c:3149 builtin/apply.c:3194
+#, c-format
+msgid "read of %s failed"
+msgstr "la lectura de %s ha fallat"
+
+#: builtin/apply.c:3174 builtin/apply.c:3396
+#, c-format
+msgid "path %s has been renamed/deleted"
+msgstr "la ruta %s s'ha canviat de nom/suprimit"
+
+#: builtin/apply.c:3255 builtin/apply.c:3410
+#, c-format
+msgid "%s: does not exist in index"
+msgstr "%s: no existeix en l'índex"
+
+#: builtin/apply.c:3259 builtin/apply.c:3402 builtin/apply.c:3424
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: builtin/apply.c:3264 builtin/apply.c:3418
+#, c-format
+msgid "%s: does not match index"
+msgstr "%s: no coincideix amb l'índex"
+
+#: builtin/apply.c:3366
+msgid "removal patch leaves file contents"
+msgstr "el pedaç de treta deixa els continguts dels fitxers"
+
+#: builtin/apply.c:3435
+#, c-format
+msgid "%s: wrong type"
+msgstr "%s: tipus erroni"
+
+#: builtin/apply.c:3437
+#, c-format
+msgid "%s has type %o, expected %o"
+msgstr "%s és del tipus %o, %o esperat"
+
+#: builtin/apply.c:3538
+#, c-format
+msgid "%s: already exists in index"
+msgstr "%s: ja existeix en l'índex"
+
+#: builtin/apply.c:3541
+#, c-format
+msgid "%s: already exists in working directory"
+msgstr "%s: ja existeix en el directori de treball"
+
+#: builtin/apply.c:3561
+#, 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:3566
+#, 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:3574
+#, c-format
+msgid "%s: patch does not apply"
+msgstr "%s: el pedaç no aplica"
+
+#: builtin/apply.c:3587
+#, c-format
+msgid "Checking patch %s..."
+msgstr "Comprovant el pedaç %s..."
+
+#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
+#, c-format
+msgid "make_cache_entry failed for path '%s'"
+msgstr "make_cache_entry ha fallat per a la ruta '%s'"
+
+#: builtin/apply.c:3823
+#, c-format
+msgid "unable to remove %s from index"
+msgstr "incapaç de treure %s de l'índex"
+
+#: builtin/apply.c:3852
+#, c-format
+msgid "corrupt patch for submodule %s"
+msgstr "pedaç corrupte per al submòdul %s"
+
+#: builtin/apply.c:3856
+#, c-format
+msgid "unable to stat newly created file '%s'"
+msgstr "incapaç de fer stat al fitxer novament creat '%s'"
+
+#: builtin/apply.c:3861
+#, c-format
+msgid "unable to create backing store for newly created file %s"
+msgstr ""
+"incapaç de crear un magatzem de recolzament per al fitxer novament creat %s"
+
+#: builtin/apply.c:3864 builtin/apply.c:3972
+#, c-format
+msgid "unable to add cache entry for %s"
+msgstr "incapaç d'afegir una entrada de cau per a %s"
+
+#: builtin/apply.c:3897
+#, c-format
+msgid "closing file '%s'"
+msgstr "tancant el fitxer '%s'"
+
+#: builtin/apply.c:3946
+#, c-format
+msgid "unable to write file '%s' mode %o"
+msgstr "incapaç d'escriure el fitxer '%s' mode %o"
+
+#: builtin/apply.c:4033
+#, c-format
+msgid "Applied patch %s cleanly."
+msgstr "El pedaç %s s'ha aplicat netament."
+
+#: builtin/apply.c:4041
+msgid "internal error"
+msgstr "error intern"
+
+#: builtin/apply.c:4044
+#, 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:4054
+#, c-format
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "truncant el nom del fitxer .rej a %.*s.rej"
+
+#: builtin/apply.c:4075
+#, c-format
+msgid "Hunk #%d applied cleanly."
+msgstr "El tros #%d s'ha aplicat netament."
+
+#: builtin/apply.c:4078
+#, c-format
+msgid "Rejected hunk #%d."
+msgstr "S'ha rebutjat el tros #%d."
+
+#: builtin/apply.c:4228
+msgid "unrecognized input"
+msgstr "entrada no reconegut"
+
+#: builtin/apply.c:4239
+msgid "unable to read index file"
+msgstr "incapaç de llegir el fitxer d'índex"
+
+#: builtin/apply.c:4358 builtin/apply.c:4361 builtin/clone.c:90
+#: builtin/fetch.c:93
+msgid "path"
+msgstr "ruta"
+
+#: builtin/apply.c:4359
+msgid "don't apply changes matching the given path"
+msgstr "no apliquis canvis que coincideixen amb la ruta donada"
+
+#: builtin/apply.c:4362
+msgid "apply changes matching the given path"
+msgstr "aplica els canvis que coincideixen amb la ruta donada"
+
+#: builtin/apply.c:4364
+msgid "num"
+msgstr "número"
+
+#: builtin/apply.c:4365
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr ""
+"treu <nombre> barres obliqües inicials de les rutes de diferència "
+"tradicionals"
+
+#: builtin/apply.c:4368
+msgid "ignore additions made by the patch"
+msgstr "ignora afegiments fets pel pedaç"
+
+#: builtin/apply.c:4370
+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:4374
+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:4376
+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:4378
+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:4380
+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:4382
+msgid "apply a patch without touching the working tree"
+msgstr "aplica un pedaç sense tocar l'arbre de treball"
+
+#: builtin/apply.c:4384
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "aplica el pedaç també (utilitzeu amb --stat/--summary/--check)"
+
+#: builtin/apply.c:4386
+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:4388
+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:4390 builtin/checkout-index.c:198 builtin/ls-files.c:455
+msgid "paths are separated with NUL character"
+msgstr "rutes es separen amb el caràcter NUL"
+
+#: builtin/apply.c:4393
+msgid "ensure at least <n> lines of context match"
+msgstr "assegura que almenys <n> línies de context coincideixin"
+
+#: builtin/apply.c:4394
+msgid "action"
+msgstr "acció"
+
+#: builtin/apply.c:4395
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "detecta línies noves o modificades que tenen errors d'espai en blanc"
+
+#: builtin/apply.c:4398 builtin/apply.c:4401
+msgid "ignore changes in whitespace when finding context"
+msgstr "ignora els canvis d'espai en blanc al cercar context"
+
+#: builtin/apply.c:4404
+msgid "apply the patch in reverse"
+msgstr "aplica el pedaç al revés"
+
+#: builtin/apply.c:4406
+msgid "don't expect at least one line of context"
+msgstr "no esperis almenys una línia de context"
+
+#: builtin/apply.c:4408
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "deixa els trossos rebutjats en fitxers *.reg coresspondents"
+
+#: builtin/apply.c:4410
+msgid "allow overlapping hunks"
+msgstr "permet trossos encavalcants"
+
+#: builtin/apply.c:4413
+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:4416
+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:4418
+msgid "root"
+msgstr "arrel"
+
+#: builtin/apply.c:4419
+msgid "prepend <root> to all filenames"
+msgstr "anteposa <arrel> a tots els noms de fitxer"
+
+#: builtin/apply.c:4441
+msgid "--3way outside a repository"
+msgstr "--3way fora d'un repositori"
+
+#: builtin/apply.c:4449
+msgid "--index outside a repository"
+msgstr "--index fora d'un repositori"
+
+#: builtin/apply.c:4452
+msgid "--cached outside a repository"
+msgstr "--cached fora d'un repositori"
+
+#: builtin/apply.c:4468
+#, c-format
+msgid "can't open patch '%s'"
+msgstr "no es pot obrir el pedaç '%s'"
+
+#: builtin/apply.c:4482
+#, 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:4488 builtin/apply.c:4498
+#, c-format
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d línia afegeix errors d'espai en blanc."
+msgstr[1] "%d línies afegeixen errors d'espai en blanc."
+
+#: builtin/archive.c:17
+#, c-format
+msgid "could not create archive file '%s'"
+msgstr "no es pot crear el fitxer d'arxiu '%s'"
+
+#: builtin/archive.c:20
+msgid "could not redirect output"
+msgstr "no s'ha pogut redirigir la sortida"
+
+#: builtin/archive.c:37
+msgid "git archive: Remote with no URL"
+msgstr "git archive: Remot sense URL"
+
+#: builtin/archive.c:58
+msgid "git archive: expected ACK/NAK, got EOF"
+msgstr "git archive: ACK/NAK esperat, EOF rebut"
+
+#: builtin/archive.c:61
+#, c-format
+msgid "git archive: NACK %s"
+msgstr "git archive: %s NACK"
+
+#: builtin/archive.c:63
+#, c-format
+msgid "remote error: %s"
+msgstr "error remot: %s"
+
+#: builtin/archive.c:64
+msgid "git archive: protocol error"
+msgstr "git archive: error de protocol"
+
+#: builtin/archive.c:68
+msgid "git archive: expected a flush"
+msgstr "git archive: rentada esperada"
+
+#: 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 "realitza 'git bisect next'"
+
+#: builtin/bisect--helper.c:19
+msgid "update BISECT_HEAD instead of checking out the current commit"
+msgstr "actualitza BISECT_HEAD en lloc d'agafar la comissió actual"
+
+#: builtin/blame.c:30
+msgid "git blame [options] [rev-opts] [rev] [--] file"
+msgstr "git blame [opcions] [opcions-de-revisió] [revisió] [--] fitxer"
+
+#: builtin/blame.c:35
+msgid "[rev-opts] are documented in git-rev-list(1)"
+msgstr "les [opcions-de-revisió] estàn documentades en git-rev-list(1)"
+
+#: builtin/blame.c:2501
+msgid "Show blame entries as we find them, incrementally"
+msgstr "Mostra les entrades de culpa mentre les trobem, incrementalment"
+
+#: builtin/blame.c:2502
+msgid "Show blank SHA-1 for boundary commits (Default: off)"
+msgstr "Mostra SHA-1 blanc en comissions de frontera (Per defecte: desactivat)"
+
+#: builtin/blame.c:2503
+msgid "Do not treat root commits as boundaries (Default: off)"
+msgstr "No tractis les comissions d'arrel com límits (Per defecte: desactivat)"
+
+#: builtin/blame.c:2504
+msgid "Show work cost statistics"
+msgstr "Mostra les estadístiques de preu de treball"
+
+#: builtin/blame.c:2505
+msgid "Show output score for blame entries"
+msgstr "Mostra la puntuació de sortida de les entrades de culpa"
+
+#: builtin/blame.c:2506
+msgid "Show original filename (Default: auto)"
+msgstr "Mostra el nom de fitxer original (Per defecte: automàtic)"
+
+#: builtin/blame.c:2507
+msgid "Show original linenumber (Default: off)"
+msgstr "Mostra el número de línia original (Per defecte: desactivat)"
+
+#: builtin/blame.c:2508
+msgid "Show in a format designed for machine consumption"
+msgstr "Presenta en un format dissenyat per consumpció per màquina"
+
+#: builtin/blame.c:2509
+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:2510
+msgid "Use the same output mode as git-annotate (Default: off)"
+msgstr ""
+"Utilitza el mateix mode de sortida que git-annotate (Per defecte: desactivat)"
+
+#: builtin/blame.c:2511
+msgid "Show raw timestamp (Default: off)"
+msgstr "Mostra la marca de temps crua (Per defecte: desactivat)"
+
+#: builtin/blame.c:2512
+msgid "Show long commit SHA1 (Default: off)"
+msgstr "Mostra l'SHA1 de comissió llarg (Per defecte: desactivat)"
+
+#: builtin/blame.c:2513
+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:2514
+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:2515
+msgid "Ignore whitespace differences"
+msgstr "Ignora les diferencies d'espai en blanc"
+
+#: builtin/blame.c:2516
+msgid "Spend extra cycles to find better match"
+msgstr "Gasta cicles extres per a trobar una coincidència millora"
+
+#: builtin/blame.c:2517
+msgid "Use revisions from <file> instead of calling git-rev-list"
+msgstr "Utilitza les revisions de <file> en lloc d'invocar git-rev-list"
+
+#: builtin/blame.c:2518
+msgid "Use <file>'s contents as the final image"
+msgstr "Utilitza els continguts de <file> com l'imatge final"
+
+#: builtin/blame.c:2519 builtin/blame.c:2520
+msgid "score"
+msgstr "puntuació"
+
+#: builtin/blame.c:2519
+msgid "Find line copies within and across files"
+msgstr "Troba còpies de línia dins i a través de fitxers"
+
+#: builtin/blame.c:2520
+msgid "Find line movements within and across files"
+msgstr "Troba moviments de línia dins i a través de fitxers"
+
+#: builtin/blame.c:2521
+msgid "n,m"
+msgstr "n,m"
+
+#: builtin/blame.c:2521
+msgid "Process only line range n,m, counting from 1"
+msgstr "Processa només el rang de línies n,m, contant des de 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:2599
+msgid "4 years, 11 months ago"
+msgstr "fa 4 anys, 11 mesos"
+
+#: builtin/branch.c:24
+msgid "git branch [options] [-r | -a] [--merged | --no-merged]"
+msgstr "git branch [opcions] [-r | -a] [--merged | --no-merged]"
+
+#: builtin/branch.c:25
+msgid "git branch [options] [-l] [-f] <branchname> [<start-point>]"
+msgstr "git branch [opcions] [-l] [-f] <nom-de-rama> [<punt-inicial>]"
+
+#: builtin/branch.c:26
+msgid "git branch [options] [-r] (-d | -D) <branchname>..."
+msgstr "git branch [opcions] [-r] (-d | -D) <nom-de-rama>..."
+
+#: builtin/branch.c:27
+msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>"
+msgstr "git branch [opcions] (-m | -M) [<rama-antiga>] <rama-nova>"
+
+#: builtin/branch.c:150
+#, c-format
+msgid ""
+"deleting branch '%s' that has been merged to\n"
+"         '%s', but not yet merged to HEAD."
+msgstr ""
+"suprimint la rama '%s' que s'ha fusionat a\n"
+"         '%s', però encara no fusionat a\n"
+"         HEAD."
+
+#: builtin/branch.c:154
+#, c-format
+msgid ""
+"not deleting branch '%s' that is not yet merged to\n"
+"         '%s', even though it is merged to HEAD."
+msgstr ""
+"no suprimint la rama '%s' que encara no s'ha\n"
+"         fusionat a '%s', encara que està fusionat\n"
+"         a HEAD."
+
+#: builtin/branch.c:168
+#, 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
+#, c-format
+msgid ""
+"The branch '%s' is not fully merged.\n"
+"If you are sure you want to delete it, run 'git branch -D %s'."
+msgstr ""
+"La rama '%s' no està totalment fusionada.\n"
+"Si esteu segur que la voleu suprimir, executeu 'git branch -D %s'."
+
+#: builtin/branch.c:185
+msgid "Update of config-file failed"
+msgstr "L'actualització del fitxer de configuració ha fallat"
+
+#: builtin/branch.c:213
+msgid "cannot use -a with -d"
+msgstr "no es pot utilitzar -a amb -d"
+
+#: builtin/branch.c:219
+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
+#, c-format
+msgid "Cannot delete the branch '%s' which you are currently on."
+msgstr "No es pot suprimir la rama '%s' en que esteu actualment."
+
+#: builtin/branch.c:240
+#, c-format
+msgid "remote branch '%s' not found."
+msgstr "rama remota '%s' no trobada."
+
+#: builtin/branch.c:241
+#, c-format
+msgid "branch '%s' not found."
+msgstr "rama '%s' no trobada"
+
+#: builtin/branch.c:255
+#, c-format
+msgid "Error deleting remote branch '%s'"
+msgstr "Error al suprimir la rama remota '%s'"
+
+#: builtin/branch.c:256
+#, c-format
+msgid "Error deleting branch '%s'"
+msgstr "Error al suprimir la rama '%s'"
+
+#: builtin/branch.c:263
+#, c-format
+msgid "Deleted remote branch %s (was %s).\n"
+msgstr "S'ha suprimit la rama remota %s (ha estat %s).\n"
+
+#: builtin/branch.c:264
+#, c-format
+msgid "Deleted branch %s (was %s).\n"
+msgstr "S'ha suprimit la rama %s (ha estat %s).\n"
+
+#: builtin/branch.c:366
+#, c-format
+msgid "branch '%s' does not point at a commit"
+msgstr "la rama '%s' no assenyala una comissió"
+
+#: builtin/branch.c:454
+#, c-format
+msgid "[%s: gone]"
+msgstr "[%s: no està]"
+
+#: builtin/branch.c:459
+#, c-format
+msgid "[%s]"
+msgstr "[%s]"
+
+#: builtin/branch.c:464
+#, c-format
+msgid "[%s: behind %d]"
+msgstr "[%s: darrere per %d]"
+
+#: builtin/branch.c:466
+#, c-format
+msgid "[behind %d]"
+msgstr "[darrere de %d]"
+
+#: builtin/branch.c:470
+#, c-format
+msgid "[%s: ahead %d]"
+msgstr "[%s: davant per %d]"
+
+#: builtin/branch.c:472
+#, c-format
+msgid "[ahead %d]"
+msgstr "[davant per %d]"
+
+#: builtin/branch.c:475
+#, c-format
+msgid "[%s: ahead %d, behind %d]"
+msgstr "[%s: davant %d, darrere %d]"
+
+#: builtin/branch.c:478
+#, c-format
+msgid "[ahead %d, behind %d]"
+msgstr "[davant %d, darrere %d]"
+
+#: builtin/branch.c:502
+msgid " **** invalid ref ****"
+msgstr " **** referència invàlida ****"
+
+#: builtin/branch.c:594
+#, c-format
+msgid "(no branch, rebasing %s)"
+msgstr "(cap rama, rebasant %s)"
+
+#: builtin/branch.c:597
+#, c-format
+msgid "(no branch, bisect started on %s)"
+msgstr "(cap rama, bisecció començada en %s)"
+
+#: builtin/branch.c:600
+#, c-format
+msgid "(detached from %s)"
+msgstr "(separat de %s)"
+
+#: builtin/branch.c:603
+msgid "(no branch)"
+msgstr "(cap rama)"
+
+#: builtin/branch.c:649
+#, c-format
+msgid "object '%s' does not point to a commit"
+msgstr "l'objecte '%s' no assenyala cap comissió"
+
+#: builtin/branch.c:681
+msgid "some refs could not be read"
+msgstr "algunes referències no s'han pogut llegir"
+
+#: builtin/branch.c:694
+msgid "cannot rename the current branch while not on any."
+msgstr "no es pot canviar el nom de la rama actual mentre no estar en ninguna."
+
+#: builtin/branch.c:704
+#, c-format
+msgid "Invalid branch name: '%s'"
+msgstr "Nom de rama invàlid: '%s'"
+
+#: builtin/branch.c:719
+msgid "Branch rename failed"
+msgstr "El canvi de nom de rama ha fallat"
+
+#: builtin/branch.c:723
+#, c-format
+msgid "Renamed a misnamed branch '%s' away"
+msgstr "S'ha canviat el nom de la rama malanomenada '%s'"
+
+#: builtin/branch.c:727
+#, c-format
+msgid "Branch renamed to %s, but HEAD is not updated!"
+msgstr "S'ha canviat el nom de la rama a %s, però HEAD no està actualitzat!"
+
+#: builtin/branch.c:734
+msgid "Branch is renamed, but update of config-file failed"
+msgstr ""
+"La ramà està canviada de nom, però l'actualització del fitxer de "
+"configuració ha fallat"
+
+#: builtin/branch.c:749
+#, c-format
+msgid "malformed object name %s"
+msgstr "nom d'objecte %s malformat"
+
+#: builtin/branch.c:773
+#, c-format
+msgid "could not write branch description template: %s"
+msgstr "no s'ha pogut escriure la plantilla de descripció de rama: %s"
+
+#: builtin/branch.c:803
+msgid "Generic options"
+msgstr "Opcions genèriques"
+
+#: builtin/branch.c:805
+msgid "show hash and subject, give twice for upstream branch"
+msgstr "mostra el hash i el tema, doneu dos vegades per la rama font"
+
+#: builtin/branch.c:806
+msgid "suppress informational messages"
+msgstr "omet els missatges informatius"
+
+#: builtin/branch.c:807
+msgid "set up tracking mode (see git-pull(1))"
+msgstr "configura el mode de seguiment (veu git-pull(1))"
+
+#: builtin/branch.c:809
+msgid "change upstream info"
+msgstr "canvia la informació de font"
+
+#: builtin/branch.c:813
+msgid "use colored output"
+msgstr "utilitza sortida colorada"
+
+#: builtin/branch.c:814
+msgid "act on remote-tracking branches"
+msgstr "actua en rames amb seguiment remot"
+
+#: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844
+#: builtin/branch.c:850 builtin/commit.c:1573 builtin/commit.c:1574
+#: builtin/commit.c:1575 builtin/commit.c:1576 builtin/tag.c:615
+#: builtin/tag.c:621
+msgid "commit"
+msgstr "comissió"
+
+#: builtin/branch.c:818 builtin/branch.c:824
+msgid "print only branches that contain the commit"
+msgstr "imprimeix només les rames que continguin la comissió"
+
+#: builtin/branch.c:830
+msgid "Specific git-branch actions:"
+msgstr "Accions de git-branch específiques:"
+
+#: builtin/branch.c:831
+msgid "list both remote-tracking and local branches"
+msgstr "llista ambdós les rames amb seguiment remot i les locals"
+
+#: builtin/branch.c:833
+msgid "delete fully merged branch"
+msgstr "suprimeix la rama si completament fusionada"
+
+#: builtin/branch.c:834
+msgid "delete branch (even if not merged)"
+msgstr "suprimeix la rama (encara que no estigui fusionada)"
+
+#: builtin/branch.c:835
+msgid "move/rename a branch and its reflog"
+msgstr "mou/canvia de nom una rama i el seu registre de referència"
+
+#: builtin/branch.c:836
+msgid "move/rename a branch, even if target exists"
+msgstr "mou/canvia de nom una rama, encara que el destí existeixi"
+
+#: builtin/branch.c:837
+msgid "list branch names"
+msgstr "llista els noms de rama"
+
+#: builtin/branch.c:838
+msgid "create the branch's reflog"
+msgstr "crea el registre de referència de la rama"
+
+#: builtin/branch.c:840
+msgid "edit the description for the branch"
+msgstr "edita la descripció de la rama"
+
+#: builtin/branch.c:841
+msgid "force creation (when already exists)"
+msgstr "força creació (quan ja existeix)"
+
+#: builtin/branch.c:844
+msgid "print only not merged branches"
+msgstr "imprimeix només les rames sense fusionar"
+
+#: builtin/branch.c:850
+msgid "print only merged branches"
+msgstr "imprimeix només les rames fusionades"
+
+#: builtin/branch.c:854
+msgid "list branches in columns"
+msgstr "llista les rames en columnes"
+
+#: builtin/branch.c:867
+msgid "Failed to resolve HEAD as a valid ref."
+msgstr "S'ha fallat al resoldre HEAD com referència vàlida."
+
+#: builtin/branch.c:872 builtin/clone.c:636
+msgid "HEAD not found below refs/heads!"
+msgstr "HEAD no trobat baix refs/heads!"
+
+#: builtin/branch.c:896
+msgid "--column and --verbose are incompatible"
+msgstr "--column i --verbose són incompatibles"
+
+#: builtin/branch.c:902 builtin/branch.c:941
+msgid "branch name required"
+msgstr "cal el nom de rama"
+
+#: builtin/branch.c:917
+msgid "Cannot give description to detached HEAD"
+msgstr "No es pot donar descripció a un HEAD separat"
+
+#: builtin/branch.c:922
+msgid "cannot edit description of more than one branch"
+msgstr "no es pot editar la descripció de més d'una rama"
+
+#: builtin/branch.c:929
+#, c-format
+msgid "No commit on branch '%s' yet."
+msgstr "Encara cap comissió en la rama '%s'."
+
+#: builtin/branch.c:932
+#, c-format
+msgid "No branch named '%s'."
+msgstr "Cap rama amb nom '%s'."
+
+#: builtin/branch.c:947
+msgid "too many branches for a rename operation"
+msgstr "massa rames per a una operació de canvi de nom"
+
+#: builtin/branch.c:952
+msgid "too many branches to set new upstream"
+msgstr "massa rames per a establir una nova font"
+
+#: builtin/branch.c:956
+#, 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 %s quan no assenyala cap rama."
+
+#: builtin/branch.c:959 builtin/branch.c:981 builtin/branch.c:1002
+#, c-format
+msgid "no such branch '%s'"
+msgstr "cap rama així '%s'"
+
+#: builtin/branch.c:963
+#, c-format
+msgid "branch '%s' does not exist"
+msgstr "la rama '%s' no existeix"
+
+#: builtin/branch.c:975
+msgid "too many branches to unset upstream"
+msgstr "massa rames per a desestablir la font"
+
+#: builtin/branch.c:979
+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 quan no assenyala cap rama."
+
+#: builtin/branch.c:985
+#, c-format
+msgid "Branch '%s' has no upstream information"
+msgstr "La rama '%s' no té informació de font"
+
+#: builtin/branch.c:999
+msgid "it does not make sense to create 'HEAD' manually"
+msgstr "no té sentit crear 'HEAD' manualment"
+
+#: builtin/branch.c:1005
+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 rama"
+
+#: builtin/branch.c:1008
+#, c-format
+msgid ""
+"The --set-upstream flag is deprecated and will be removed. Consider using --"
+"track or --set-upstream-to\n"
+msgstr ""
+"La bandera --set-upstream està desaprovada i es traurà. Considereu utilitzar "
+"--track o --set-upstream-to\n"
+
+#: builtin/branch.c:1025
+#, c-format
+msgid ""
+"\n"
+"If you wanted to make '%s' track '%s', do this:\n"
+"\n"
+msgstr ""
+"\n"
+"Si volíeu fer '%s' seguir '%s', feu això:\n"
+"\n"
+
+#: builtin/branch.c:1026
+#, c-format
+msgid "    git branch -d %s\n"
+msgstr "    git branch -d %s\n"
+
+#: builtin/branch.c:1027
+#, c-format
+msgid "    git branch --set-upstream-to %s\n"
+msgstr "    git branch --set-upstream-to %s\n"
+
+#: builtin/bundle.c:47
+#, c-format
+msgid "%s is okay\n"
+msgstr "%s està bé\n"
+
+#: builtin/bundle.c:56
+msgid "Need a repository to create a bundle."
+msgstr "Cal un repositori per fer un embolic."
+
+#: builtin/bundle.c:60
+msgid "Need a repository to unbundle."
+msgstr "Cal un repositori per desembolicar."
+
+#: builtin/cat-file.c:331
+msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
+msgstr "git cat-file (-t|-s|-e|-p|<tipus>|--textconv) <objecte>"
+
+#: builtin/cat-file.c:332
+msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
+msgstr "git cat-file (--batch|--batch-check) < <llista_de_objectes>"
+
+#: builtin/cat-file.c:369
+msgid "<type> can be one of: blob, tree, commit, tag"
+msgstr "<tipus> pot ser un de: blob, tree, commit, tag"
+
+#: builtin/cat-file.c:370
+msgid "show object type"
+msgstr "mostra el tipus de l'objecte"
+
+#: builtin/cat-file.c:371
+msgid "show object size"
+msgstr "mostra la mida de l'objecte"
+
+#: builtin/cat-file.c:373
+msgid "exit with zero when there's no error"
+msgstr "surt amb zero quan no hi ha error"
+
+#: builtin/cat-file.c:374
+msgid "pretty-print object's content"
+msgstr "imprimeix bellament el contingut de l'objecte "
+
+#: builtin/cat-file.c:376
+msgid "for blob objects, run textconv on object's content"
+msgstr "en els objectes de blob, executa textconv en el contingut de l'objecte"
+
+#: builtin/cat-file.c:378
+msgid "show info and content of objects fed from the standard input"
+msgstr ""
+"mostra la informació i contingut dels objectes rebuts de l'entrada estàndard"
+
+#: builtin/cat-file.c:381
+msgid "show info about objects fed from the standard input"
+msgstr "mostra informació sobre els objectes rebuts de l'entrada estàndard"
+
+#: builtin/check-attr.c:11
+msgid "git check-attr [-a | --all | attr...] [--] pathname..."
+msgstr "git check-attr [-a | --all | atribut...] [--] nom-de-ruta..."
+
+#: 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-rutes>"
+
+#: builtin/check-attr.c:19
+msgid "report all attributes set on file"
+msgstr "informa de tots els atributs establerts en el fitxer"
+
+#: builtin/check-attr.c:20
+msgid "use .gitattributes only from the index"
+msgstr "utilitza .gitattributes només des de l'índex"
+
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:75
+msgid "read file names from stdin"
+msgstr "llegeix els noms de fitxer de stdin"
+
+#: builtin/check-attr.c:23 builtin/check-ignore.c:24
+msgid "terminate input and output records by a NUL character"
+msgstr "termina els registres d'entrada i de salida per un caràcter NUL"
+
+#: builtin/check-ignore.c:18 builtin/checkout.c:1083 builtin/gc.c:285
+msgid "suppress progress reporting"
+msgstr "omet el reportatge de progrés"
+
+#: builtin/check-ignore.c:26
+msgid "show non-matching input paths"
+msgstr "mostra les rutes d'entrada que no coincideixen"
+
+#: builtin/check-ignore.c:28
+msgid "ignore index when checking"
+msgstr "ignora l'índex al comprovar"
+
+#: builtin/check-ignore.c:154
+msgid "cannot specify pathnames with --stdin"
+msgstr "no es pot especificar noms de ruta amb --stdin"
+
+#: builtin/check-ignore.c:157
+msgid "-z only makes sense with --stdin"
+msgstr "-z només té sentit amb --stdin"
+
+#: builtin/check-ignore.c:159
+msgid "no path specified"
+msgstr "cap ruta especificada"
+
+#: builtin/check-ignore.c:163
+msgid "--quiet is only valid with a single pathname"
+msgstr "--quiet només és vàlid amb un nom de ruta solter"
+
+#: builtin/check-ignore.c:165
+msgid "cannot have both --quiet and --verbose"
+msgstr "no es pot tenir ambdós --quiet i --verbose"
+
+#: builtin/check-ignore.c:168
+msgid "--non-matching is only valid with --verbose"
+msgstr "--non-matching és vàlid només amb --verbose"
+
+#: builtin/check-mailmap.c:8
+msgid "git check-mailmap [options] <contact>..."
+msgstr "git check-mailmap [opcions] <contacte>..."
+
+#: builtin/check-mailmap.c:13
+msgid "also read contacts from stdin"
+msgstr "també llegeix els contactes des de stdin"
+
+#: builtin/check-mailmap.c:24
+#, c-format
+msgid "unable to parse contact: %s"
+msgstr "incapaç d'analitzar el contacte: %s"
+
+#: builtin/check-mailmap.c:47
+msgid "no contacts specified"
+msgstr "cap contacte especificat"
+
+#: builtin/checkout-index.c:126
+msgid "git checkout-index [options] [--] [<file>...]"
+msgstr "git checkout-index [opcions] [--] [<fitxer>...]"
+
+#: builtin/checkout-index.c:188
+msgid "check out all files in the index"
+msgstr "agafa tots els fitxers en l'índex"
+
+#: builtin/checkout-index.c:189
+msgid "force overwrite of existing files"
+msgstr "força la sobreescriptura de fitxers existents"
+
+#: builtin/checkout-index.c:191
+msgid "no warning for existing files and files not in index"
+msgstr "cap avís per a fitxers existents i fitxers no en l'índex"
+
+#: builtin/checkout-index.c:193
+msgid "don't checkout new files"
+msgstr "no agafis fitxers nous"
+
+#: builtin/checkout-index.c:195
+msgid "update stat information in the index file"
+msgstr "actualitza la informació d'estadístiques en el fitxer d'índex"
+
+#: builtin/checkout-index.c:201
+msgid "read list of paths from the standard input"
+msgstr "llegeix la llista de rutes des de l'entrada estàndard"
+
+#: builtin/checkout-index.c:203
+msgid "write the content to temporary files"
+msgstr "escriu el contingut a fitxers temporals"
+
+#: builtin/checkout-index.c:204 builtin/column.c:30
+msgid "string"
+msgstr "cadena"
+
+#: builtin/checkout-index.c:205
+msgid "when creating files, prepend <string>"
+msgstr "al crear fitxers, anteposa <cadena>"
+
+#: builtin/checkout-index.c:208
+msgid "copy out the files from named stage"
+msgstr "copia els fitxers des de l'etapa anomenada"
+
+#: builtin/checkout.c:25
+msgid "git checkout [options] <branch>"
+msgstr "git checkout [opcions] <rama>"
+
+#: builtin/checkout.c:26
+msgid "git checkout [options] [<branch>] -- <file>..."
+msgstr "git checkout [opcions] [<rama>] -- <fitxer>..."
+
+#: builtin/checkout.c:114 builtin/checkout.c:147
+#, c-format
+msgid "path '%s' does not have our version"
+msgstr "la ruta '%s' no té la versió nostra"
+
+#: builtin/checkout.c:116 builtin/checkout.c:149
+#, c-format
+msgid "path '%s' does not have their version"
+msgstr "la ruta '%s' no té la versió seva"
+
+#: builtin/checkout.c:132
+#, c-format
+msgid "path '%s' does not have all necessary versions"
+msgstr "la ruta '%s' no té totes les versions necessàries"
+
+#: builtin/checkout.c:176
+#, c-format
+msgid "path '%s' does not have necessary versions"
+msgstr "la ruta '%s' no té les versions necessàries"
+
+#: builtin/checkout.c:193
+#, c-format
+msgid "path '%s': cannot merge"
+msgstr "ruta '%s': no es pot fusionar"
+
+#: builtin/checkout.c:210
+#, c-format
+msgid "Unable to add merge result for '%s'"
+msgstr "Incapaç d'afegir el resultat de fusió per a '%s'"
+
+#: builtin/checkout.c:231 builtin/checkout.c:234 builtin/checkout.c:237
+#: builtin/checkout.c:240
+#, c-format
+msgid "'%s' cannot be used with updating paths"
+msgstr "'%s' no es pot utilitzar al actualitzar rutes"
+
+#: builtin/checkout.c:243 builtin/checkout.c:246
+#, c-format
+msgid "'%s' cannot be used with %s"
+msgstr "'%s' no es pot utilitzar amb %s"
+
+#: builtin/checkout.c:249
+#, c-format
+msgid "Cannot update paths and switch to branch '%s' at the same time."
+msgstr "No es pot actualitzar les rutes i canviar a la rama '%s' a la vegada."
+
+#: builtin/checkout.c:260 builtin/checkout.c:449
+msgid "corrupt index file"
+msgstr "fitxer d'índex corrupte"
+
+#: builtin/checkout.c:320 builtin/checkout.c:327
+#, c-format
+msgid "path '%s' is unmerged"
+msgstr "la ruta '%s' està sense fusionar"
+
+#: builtin/checkout.c:471
+msgid "you need to resolve your current index first"
+msgstr "heu de resoldre el vostre índex actual primer"
+
+#: builtin/checkout.c:591
+#, c-format
+msgid "Can not do reflog for '%s'\n"
+msgstr "No es pot fer reflog per a '%s'\n"
+
+#: builtin/checkout.c:629
+msgid "HEAD is now at"
+msgstr "HEAD ara està a"
+
+#: builtin/checkout.c:636
+#, c-format
+msgid "Reset branch '%s'\n"
+msgstr "Restableix la rama '%s'\n"
+
+#: builtin/checkout.c:639
+#, c-format
+msgid "Already on '%s'\n"
+msgstr "Ja en '%s'\n"
+
+#: builtin/checkout.c:643
+#, c-format
+msgid "Switched to and reset branch '%s'\n"
+msgstr "Rama '%s' agafat i restablit\n"
+
+#: builtin/checkout.c:645 builtin/checkout.c:1026
+#, c-format
+msgid "Switched to a new branch '%s'\n"
+msgstr "Rama nova '%s' agafada\n"
+
+#: builtin/checkout.c:647
+#, c-format
+msgid "Switched to branch '%s'\n"
+msgstr "Rama '%s' agafada\n"
+
+#: builtin/checkout.c:699
+#, c-format
+msgid " ... and %d more.\n"
+msgstr " ... i %d més.\n"
+
+#: builtin/checkout.c:705
+#, 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] ""
+"Avís: esteu deixant %d comissió darrere, no connectada a\n"
+"qualsevulla de les vostres rames:\n"
+"\n"
+"%s\n"
+msgstr[1] ""
+"Avís: esteu deixant %d comissions darrere, no connectada a\n"
+"qualsevulla de les vostres rames:\n"
+"\n"
+"%s\n"
+
+#: builtin/checkout.c:723
+#, c-format
+msgid ""
+"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 ""
+"Si els voleu retenir per crear una rama nova, ara pot ser una hora bona\n"
+"per fer això amb:\n"
+"\n"
+" git branch new_branch_name %s\n"
+"\n"
+
+#: builtin/checkout.c:753
+msgid "internal error in revision walk"
+msgstr "error intern en el passeig per revisions"
+
+#: builtin/checkout.c:757
+msgid "Previous HEAD position was"
+msgstr "La posició de HEAD anterior ha estat"
+
+#: builtin/checkout.c:784 builtin/checkout.c:1021
+msgid "You are on a branch yet to be born"
+msgstr "Esteu en una rama que encara ha de naixer"
+
+#: builtin/checkout.c:928
+#, c-format
+msgid "only one reference expected, %d given."
+msgstr "només una referència esperada, %d donades."
+
+#: builtin/checkout.c:967
+#, c-format
+msgid "invalid reference: %s"
+msgstr "referència invàlida: %s"
+
+#: builtin/checkout.c:996
+#, c-format
+msgid "reference is not a tree: %s"
+msgstr "la referéncia no és un arbre: %s"
+
+#: builtin/checkout.c:1035
+msgid "paths cannot be used with switching branches"
+msgstr "les rutes no es poden utilitzar amb canvi de rama"
+
+#: builtin/checkout.c:1038 builtin/checkout.c:1042
+#, c-format
+msgid "'%s' cannot be used with switching branches"
+msgstr "'%s' no es pot utilitzar amb canvi de rama"
+
+#: builtin/checkout.c:1046 builtin/checkout.c:1049 builtin/checkout.c:1054
+#: builtin/checkout.c:1057
+#, c-format
+msgid "'%s' cannot be used with '%s'"
+msgstr "'%s' no es pot utilitzar amb '%s'"
+
+#: builtin/checkout.c:1062
+#, c-format
+msgid "Cannot switch branch to a non-commit '%s'"
+msgstr "No es pot canviar la rama a un no comissió '%s'"
+
+#: builtin/checkout.c:1084 builtin/checkout.c:1086 builtin/clone.c:88
+#: builtin/remote.c:159 builtin/remote.c:161
+msgid "branch"
+msgstr "rama"
+
+#: builtin/checkout.c:1085
+msgid "create and checkout a new branch"
+msgstr "crea i agafa una rama nova"
+
+#: builtin/checkout.c:1087
+msgid "create/reset and checkout a branch"
+msgstr "crea/restableix i agafa una rama"
+
+#: builtin/checkout.c:1088
+msgid "create reflog for new branch"
+msgstr "Crea un registre de referència per a la rama nova"
+
+#: builtin/checkout.c:1089
+msgid "detach the HEAD at named commit"
+msgstr "separa el HEAD a la comissió anomenada"
+
+#: builtin/checkout.c:1090
+msgid "set upstream info for new branch"
+msgstr "estableix la informació de font de la rama nova"
+
+#: builtin/checkout.c:1092
+msgid "new-branch"
+msgstr "nova-rama"
+
+#: builtin/checkout.c:1092
+msgid "new unparented branch"
+msgstr "nova rama sense pares"
+
+#: builtin/checkout.c:1093
+msgid "checkout our version for unmerged files"
+msgstr "agafa la versió nostra de fitxers sense fusionar"
+
+#: builtin/checkout.c:1095
+msgid "checkout their version for unmerged files"
+msgstr "agafa la versió seva de fitxers sense fusionar"
+
+#: builtin/checkout.c:1097
+msgid "force checkout (throw away local modifications)"
+msgstr "agafa a la força (descarta qualsevulles modificacions locals)"
+
+#: builtin/checkout.c:1098
+msgid "perform a 3-way merge with the new branch"
+msgstr "realitza una fusió de 3 vies amb la rama nova"
+
+#: builtin/checkout.c:1099 builtin/merge.c:225
+msgid "update ignored files (default)"
+msgstr "actualitza els fitxers ignorats (per defecte)"
+
+#: builtin/checkout.c:1100 builtin/log.c:1236 parse-options.h:245
+msgid "style"
+msgstr "estil"
+
+#: builtin/checkout.c:1101
+msgid "conflict style (merge or diff3)"
+msgstr "estil de conflicte (fusió o diff3)"
+
+#: builtin/checkout.c:1104
+msgid "do not limit pathspecs to sparse entries only"
+msgstr "no limitis les especificacions de ruta a entrades escasses només"
+
+#: builtin/checkout.c:1106
+msgid "second guess 'git checkout no-such-branch'"
+msgstr "dubta 'git checkout cap-rama-així'"
+
+#: builtin/checkout.c:1129
+msgid "-b, -B and --orphan are mutually exclusive"
+msgstr "-b, -B i --orphan són mutualment exclusius"
+
+#: builtin/checkout.c:1146
+msgid "--track needs a branch name"
+msgstr "--track necessita un nom de rama"
+
+#: builtin/checkout.c:1153
+msgid "Missing branch name; try -b"
+msgstr "Manca el nom de rama; proveu -b"
+
+#: builtin/checkout.c:1190
+msgid "invalid path specification"
+msgstr "especificació de ruta invàlida"
+
+#: builtin/checkout.c:1197
+#, 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 ""
+"No es pot actualitzar rames i canviar a la rama '%s' a la vegada.\n"
+"Volíeu agafar '%s' la qual no es pot resoldre com comissió?"
+
+#: builtin/checkout.c:1202
+#, c-format
+msgid "git checkout: --detach does not take a path argument '%s'"
+msgstr "git checkout: --detach no accepta un paràmetre de ruta '%s'"
+
+#: builtin/checkout.c:1206
+msgid ""
+"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
+"checking out of the index."
+msgstr ""
+"git checkout: --ours/--theirs, --force i --merge són incompatibles al\n"
+"agafar de l'índex."
+
+#: builtin/clean.c:26
+msgid ""
+"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
+msgstr ""
+"git clean [-d] [-f] [-i] [-n] [-q] [-e <patró>] [-x | -X] [--] <rutes>..."
+
+#: builtin/clean.c:30
+#, c-format
+msgid "Removing %s\n"
+msgstr "Traient %s\n"
+
+#: builtin/clean.c:31
+#, c-format
+msgid "Would remove %s\n"
+msgstr "Trauria %s\n"
+
+#: builtin/clean.c:32
+#, c-format
+msgid "Skipping repository %s\n"
+msgstr "Saltant el repositori %s\n"
+
+#: builtin/clean.c:33
+#, c-format
+msgid "Would skip repository %s\n"
+msgstr "Saltaria el repositori %s\n"
+
+#: builtin/clean.c:34
+#, c-format
+msgid "failed to remove %s"
+msgstr "s'ha fallat al treure %s"
+
+#: builtin/clean.c:295
+msgid ""
+"Prompt help:\n"
+"1          - select a numbered item\n"
+"foo        - select item based on unique prefix\n"
+"           - (empty) select nothing"
+msgstr ""
+"Ajuda d'avís:\n"
+"1          - selecciona un ítem numerat\n"
+"foo        - selecciona un ítem basat en un prefix únic\n"
+"           - (buit) selecciona res"
+
+#: builtin/clean.c:299
+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 ""
+"Ajuda d'avís:\n"
+"1          - selecciona un ítem solter\n"
+"3-5        - selecciona un rang d'ítems\n"
+"2-3,6-9    - selecciona múltiples rangs\n"
+"foo        - selecciona un ítem basat en un prefix únic\n"
+"-...       - desselecciona els ítems seleccionats\n"
+"*          - tria tots els ítems\n"
+"           - (buit) termina la selecció"
+
+#: builtin/clean.c:517
+#, c-format
+msgid "Huh (%s)?"
+msgstr "Perdó (%s)?"
+
+#: builtin/clean.c:659
+#, c-format
+msgid "Input ignore patterns>> "
+msgstr "Introduïu patrons que ignorar>> "
+
+#: builtin/clean.c:696
+#, c-format
+msgid "WARNING: Cannot find items matched by: %s"
+msgstr "AVÍS: No es pot trobar ítems que coincideixen amb: %s"
+
+#: builtin/clean.c:717
+msgid "Select items to delete"
+msgstr "Selecciona els ítems que suprimir"
+
+#: builtin/clean.c:757
+#, c-format
+msgid "remove %s? "
+msgstr "treure %s?"
+
+#: builtin/clean.c:782
+msgid "Bye."
+msgstr "Adéu."
+
+#: builtin/clean.c:790
+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               - comença a netejar\n"
+"filter by pattern   - exclou ítems de supressió\n"
+"select by numbers   - selecciona ítems que suprimir per números\n"
+"ask each            - confirma cada supressió (com a \"rm -i\")\n"
+"quit                - deixa de netejar\n"
+"help                - aquesta pantalla\n"
+"?                   - ajuda per selecció de l'avís"
+
+#: builtin/clean.c:817
+msgid "*** Commands ***"
+msgstr "*** Ordres ***"
+
+#: builtin/clean.c:818
+msgid "What now"
+msgstr "Què ara"
+
+#: builtin/clean.c:826
+msgid "Would remove the following item:"
+msgid_plural "Would remove the following items:"
+msgstr[0] "Trauria l'ítem següent:"
+msgstr[1] "Trauria els ítems següents:"
+
+#: builtin/clean.c:843
+msgid "No more files to clean, exiting."
+msgstr "No hi ha més fitxers que netejar; sortint."
+
+#: builtin/clean.c:874
+msgid "do not print names of files removed"
+msgstr "no imprimeixis els noms dels fitxers trets"
+
+#: builtin/clean.c:876
+msgid "force"
+msgstr "força"
+
+#: builtin/clean.c:877
+msgid "interactive cleaning"
+msgstr "neteja interactiva"
+
+#: builtin/clean.c:879
+msgid "remove whole directories"
+msgstr "treu directoris enters"
+
+#: builtin/clean.c:880 builtin/describe.c:406 builtin/grep.c:714
+#: builtin/ls-files.c:486 builtin/name-rev.c:311 builtin/show-ref.c:185
+msgid "pattern"
+msgstr "patró"
+
+#: builtin/clean.c:881
+msgid "add <pattern> to ignore rules"
+msgstr "afegiu <patró> per ignorar les regles"
+
+#: builtin/clean.c:882
+msgid "remove ignored files, too"
+msgstr "treu els fitxers ignorats, també"
+
+#: builtin/clean.c:884
+msgid "remove only ignored files"
+msgstr "treu només els fitxers ignorats"
+
+#: builtin/clean.c:902
+msgid "-x and -X cannot be used together"
+msgstr "-x i -X no es poden utilitzar junts"
+
+#: builtin/clean.c:906
+msgid ""
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
+"clean"
+msgstr ""
+"clean.requireForce estaberta a veritat i ni -i, -n ni -f donat; refusant "
+"netejar"
+
+#: builtin/clean.c:909
+msgid ""
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
+"refusing to clean"
+msgstr ""
+"clean.requireForce és per defecte veritat i ni -i, -n ni -f donat; refusant "
+"netejar"
+
+#: builtin/clone.c:36
+msgid "git clone [options] [--] <repo> [<dir>]"
+msgstr "git clone [opcions] [--] <repositori> [<directori>]"
+
+#: builtin/clone.c:64 builtin/fetch.c:112 builtin/merge.c:222
+#: builtin/push.c:503
+msgid "force progress reporting"
+msgstr "força l'informe de progrés"
+
+#: builtin/clone.c:66
+msgid "don't create a checkout"
+msgstr "no fes una agafada"
+
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
+msgid "create a bare repository"
+msgstr "crea un repositori nu"
+
+#: builtin/clone.c:71
+msgid "create a mirror repository (implies bare)"
+msgstr "crea un repositori reflectit (implica nu)"
+
+#: builtin/clone.c:73
+msgid "to clone from a local repository"
+msgstr "per a clonar des d'un repositori local"
+
+#: builtin/clone.c:75
+msgid "don't use local hardlinks, always copy"
+msgstr "no utilitzeu enllaços durs locals, sempre copia"
+
+#: builtin/clone.c:77
+msgid "setup as shared repository"
+msgstr "configura com repositori compartit"
+
+#: builtin/clone.c:79 builtin/clone.c:81
+msgid "initialize submodules in the clone"
+msgstr "initialitza els submòduls en el clon"
+
+#: builtin/clone.c:82 builtin/init-db.c:483
+msgid "template-directory"
+msgstr "directori-de-plantilla"
+
+#: builtin/clone.c:83 builtin/init-db.c:484
+msgid "directory from which templates will be used"
+msgstr "directori del qual les plantilles s'utilitzaran"
+
+#: builtin/clone.c:85
+msgid "reference repository"
+msgstr "repositori de referència"
+
+#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+msgid "name"
+msgstr "nom"
+
+#: builtin/clone.c:87
+msgid "use <name> instead of 'origin' to track upstream"
+msgstr "utilitza <nom> en lloc de 'origin' per seguir la font"
+
+#: builtin/clone.c:89
+msgid "checkout <branch> instead of the remote's HEAD"
+msgstr "agafa <rama> en lloc del HEAD del remot"
+
+#: builtin/clone.c:91
+msgid "path to git-upload-pack on the remote"
+msgstr "ruta a git-upload-pack en el remot"
+
+#: builtin/clone.c:92 builtin/fetch.c:113 builtin/grep.c:659
+msgid "depth"
+msgstr "profunditat"
+
+#: builtin/clone.c:93
+msgid "create a shallow clone of that depth"
+msgstr "crea un clon superficial de tal profunditat"
+
+#: builtin/clone.c:95
+msgid "clone only one branch, HEAD or --branch"
+msgstr "cona només una rama, HEAD o --branch"
+
+#: builtin/clone.c:96 builtin/init-db.c:492
+msgid "gitdir"
+msgstr "directori de git"
+
+#: builtin/clone.c:97 builtin/init-db.c:493
+msgid "separate git dir from working tree"
+msgstr "separa el directori de git de l'arbre de treball"
+
+#: builtin/clone.c:98
+msgid "key=value"
+msgstr "calu=valor"
+
+#: builtin/clone.c:99
+msgid "set config inside the new repository"
+msgstr "estableix la configuració dins del repositori nou"
+
+#: builtin/clone.c:252
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "el repositori de referència '%s' no és un repositori local."
+
+#: builtin/clone.c:256
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "el repositori de referència '%s' és superficial"
+
+#: builtin/clone.c:259
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "el repositori de referència '%s' és empeltat"
+
+#: builtin/clone.c:321
+#, c-format
+msgid "failed to create directory '%s'"
+msgstr "s'ha fallat al crear el directori '%s'"
+
+#: builtin/clone.c:323 builtin/diff.c:83
+#, c-format
+msgid "failed to stat '%s'"
+msgstr "s'ha fallat al fer stat a '%s'"
+
+#: builtin/clone.c:325
+#, c-format
+msgid "%s exists and is not a directory"
+msgstr "%s existeix i no és un directori"
+
+#: builtin/clone.c:339
+#, c-format
+msgid "failed to stat %s\n"
+msgstr "s'ha fallat al fer stat a '%s'\n"
+
+#: builtin/clone.c:361
+#, c-format
+msgid "failed to create link '%s'"
+msgstr "s'ha fallat al crear l'enllaç '%s'"
+
+#: builtin/clone.c:365
+#, c-format
+msgid "failed to copy file to '%s'"
+msgstr "s'ha fallat al copiar el fitxer a '%s'"
+
+#: builtin/clone.c:388 builtin/clone.c:565
+#, c-format
+msgid "done.\n"
+msgstr "fet.\n"
+
+#: builtin/clone.c:401
+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"
+"reintentar l'agafada amb 'git checkout -f HEAD'\n"
+
+#: builtin/clone.c:480
+#, c-format
+msgid "Could not find remote branch %s to clone."
+msgstr "No s'ha pogut trobar la rama remota %s per a clonar."
+
+#: builtin/clone.c:560
+#, c-format
+msgid "Checking connectivity... "
+msgstr "Provant connectivitat... "
+
+#: builtin/clone.c:563
+msgid "remote did not send all necessary objects"
+msgstr "el remot no ha enviat tots els objectes necessaris"
+
+#: builtin/clone.c:627
+msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
+msgstr ""
+"el HEAD remot es refereix a una referència que no existeix; incapaç "
+"d'agafar.\n"
+
+#: builtin/clone.c:658
+msgid "unable to checkout working tree"
+msgstr "incapaç d'agafar l'arbre de treball"
+
+#: builtin/clone.c:768
+msgid "Too many arguments."
+msgstr "Massa paràmetres."
+
+#: builtin/clone.c:772
+msgid "You must specify a repository to clone."
+msgstr "Heu d'especificar un repositori que clonar."
+
+#: builtin/clone.c:783
+#, c-format
+msgid "--bare and --origin %s options are incompatible."
+msgstr "les opcions --bare i --origin %s són incompatibles."
+
+#: builtin/clone.c:786
+msgid "--bare and --separate-git-dir are incompatible."
+msgstr "--bare i --separate-git-dir són incompatibles."
+
+#: builtin/clone.c:799
+#, c-format
+msgid "repository '%s' does not exist"
+msgstr "el repositori '%s' no existeix"
+
+#: builtin/clone.c:805 builtin/fetch.c:1143
+#, c-format
+msgid "depth %s is not a positive number"
+msgstr "la profunditat %s no és nombre positiu"
+
+#: builtin/clone.c:815
+#, c-format
+msgid "destination path '%s' already exists and is not an empty directory."
+msgstr "la ruta destí '%s' ja existeix i no és un directori buit."
+
+#: builtin/clone.c:825
+#, c-format
+msgid "working tree '%s' already exists."
+msgstr "l'arbre de treball '%s' ja existeix."
+
+#: builtin/clone.c:838 builtin/clone.c:850
+#, c-format
+msgid "could not create leading directories of '%s'"
+msgstr "no s'ha pogut crear els directoris inicials de '%s'"
+
+#: builtin/clone.c:841
+#, 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:860
+#, c-format
+msgid "Cloning into bare repository '%s'...\n"
+msgstr "Clonant al repositori nu '%s'...\n"
+
+#: builtin/clone.c:862
+#, c-format
+msgid "Cloning into '%s'...\n"
+msgstr "Clonant a '%s'...\n"
+
+#: builtin/clone.c:898
+msgid "--depth is ignored in local clones; use file:// instead."
+msgstr "--depth s'ignora en clons locals; utilitzeu file:// en lloc."
+
+#: builtin/clone.c:901
+msgid "source repository is shallow, ignoring --local"
+msgstr "el repositori font és superficial, ignorant --local"
+
+#: builtin/clone.c:906
+msgid "--local is ignored"
+msgstr "--local s'ignora"
+
+#: builtin/clone.c:910
+#, c-format
+msgid "Don't know how to clone %s"
+msgstr "No es sap com clonar %s"
+
+#: builtin/clone.c:961 builtin/clone.c:969
+#, c-format
+msgid "Remote branch %s not found in upstream %s"
+msgstr "La rama remota %s no es troba en la font %s"
+
+#: builtin/clone.c:972
+msgid "You appear to have cloned an empty repository."
+msgstr "Sembla que heu clonat un repositori buit."
+
+#: builtin/column.c:9
+msgid "git column [options]"
+msgstr "git column [opcions]"
+
+#: builtin/column.c:26
+msgid "lookup config vars"
+msgstr "cerca els variables de configuració"
+
+#: builtin/column.c:27 builtin/column.c:28
+msgid "layout to use"
+msgstr "pla que utilitzar"
+
+#: builtin/column.c:29
+msgid "Maximum width"
+msgstr "Amplada màxima"
+
+#: builtin/column.c:30
+msgid "Padding space on left border"
+msgstr "Espai d'encoixinada en el marge esquerre"
+
+#: builtin/column.c:31
+msgid "Padding space on right border"
+msgstr "Espai d'encoixinada en el marge dret"
+
+#: builtin/column.c:32
+msgid "Padding space between columns"
+msgstr "Espai d'encoixinada entre columnes"
+
+#: builtin/column.c:51
+msgid "--command must be the first argument"
+msgstr "--command ha de ser el primer paràmetre"
+
+#: builtin/commit.c:36
+msgid "git commit [options] [--] <pathspec>..."
+msgstr "git commit [opcions] [--] <especificació-de-ruta>..."
+
+#: builtin/commit.c:41
+msgid "git status [options] [--] <pathspec>..."
+msgstr "git status [opcions] [--] <especificació-de-ruta>..."
+
+#: builtin/commit.c:46
+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 ""
+"S'han configurat el vostre nom i adreça de correu electrònic\n"
+"automàticament basats en el vostre nom d'usuari i nom de host. Si us\n"
+"plau, comproveu que siguin correctes. Podeu suprimir aquest missatge\n"
+"per establir-los explícitament:\n"
+"\n"
+"    git config --global user.name \"El Vostre Nom\"\n"
+"    git config --global user.email tu@example.com\n"
+"\n"
+"Després de fer això, podeu arreglar la identitat utilitzada per a\n"
+"aquesta comissió amb:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+
+#: builtin/commit.c:58
+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 ""
+"Heu demanat esmenar la comissió més recent, però fer això la feria\n"
+"buida. Podeu repetir el vostre ordre amb --allow-empty, o podeu\n"
+"treure la comissió per complet amb \"git reset HEAD^\".\n"
+
+#: builtin/commit.c:63
+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 ""
+"El recull de cireres previ ja està buit, possiblement a causa de resolució "
+"de conflicte.\n"
+"Si el voleu cometre de totes maneres, utilitzeu:\n"
+"\n"
+"    git commit --allow-empty\n"
+"\n"
+
+#: builtin/commit.c:70
+msgid "Otherwise, please use 'git reset'\n"
+msgstr "D'altra manera, si us plau, utilitzeu 'git reset'\n"
+
+#: builtin/commit.c:73
+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 ""
+"Si voleu saltar aquesta comissió, utilitzeu:\n"
+"\n"
+"    git reset\n"
+"\n"
+"Llavors \"git cherry-pick --continue\" reprendrà recollint\n"
+"com cireres les comissions restants.\n"
+
+#: builtin/commit.c:288
+msgid "failed to unpack HEAD tree object"
+msgstr "s'ha fallat al desempaquetar l'objecte d'arbre HEAD"
+
+#: builtin/commit.c:328
+msgid "unable to create temporary index"
+msgstr "incapaç de crear un índex temporal"
+
+#: builtin/commit.c:334
+msgid "interactive add failed"
+msgstr "l'afegiment interactiu ha fallat"
+
+#: builtin/commit.c:366 builtin/commit.c:387 builtin/commit.c:435
+msgid "unable to write new_index file"
+msgstr "incapaç d'escriure el fitxer new_index"
+
+#: builtin/commit.c:418
+msgid "cannot do a partial commit during a merge."
+msgstr "no es pot fer una comissió parcial durant una fusió."
+
+#: builtin/commit.c:420
+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:429
+msgid "cannot read the index"
+msgstr "no es pot llegir l'índex"
+
+#: builtin/commit.c:447
+msgid "unable to write temporary index file"
+msgstr "incapaç d'escriure un fitxer d'índex temporal"
+
+#: builtin/commit.c:557 builtin/commit.c:563
+#, c-format
+msgid "invalid commit: %s"
+msgstr "comissió invàlida: %s"
+
+#: builtin/commit.c:585
+msgid "malformed --author parameter"
+msgstr "paràmetre --author malformat"
+
+#: builtin/commit.c:592
+#, c-format
+msgid "invalid date format: %s"
+msgstr "format de data invàlid: %s"
+
+#: builtin/commit.c:609
+#, c-format
+msgid "Malformed ident string: '%s'"
+msgstr "Cadena d'identificació malformada: '%s'"
+
+#: builtin/commit.c:642
+msgid ""
+"unable to select a comment character that is not used\n"
+"in the current commit message"
+msgstr ""
+"incapaç de seleccionar un caràcter de comentari que\n"
+"no sigui utilitzat en el missatge de comissió actual"
+
+#: builtin/commit.c:679 builtin/commit.c:712 builtin/commit.c:1086
+#, c-format
+msgid "could not lookup commit %s"
+msgstr "no s'ha pogut trobar la comissió %s"
+
+#: builtin/commit.c:691 builtin/shortlog.c:273
+#, c-format
+msgid "(reading log message from standard input)\n"
+msgstr "(llegint el missatge de registre de l'entrada estàndard)\n"
+
+#: builtin/commit.c:693
+msgid "could not read log from standard input"
+msgstr "no s'ha pogut llegir de l'entrada estàndard"
+
+#: builtin/commit.c:697
+#, c-format
+msgid "could not read log file '%s'"
+msgstr "no s'ha pogut llegir el fitxer de registre '%s'"
+
+#: builtin/commit.c:719
+msgid "could not read MERGE_MSG"
+msgstr "no s'ha pogut llegir MERGE_MSG"
+
+#: builtin/commit.c:723
+msgid "could not read SQUASH_MSG"
+msgstr "no s'ha pogur llegir SQUASH_MSG"
+
+#: builtin/commit.c:727
+#, c-format
+msgid "could not read '%s'"
+msgstr "no s'ha pogut llegir '%s'"
+
+#: builtin/commit.c:798
+msgid "could not write commit template"
+msgstr "no s'ha pogut escriure la plantilla de comissió"
+
+#: builtin/commit.c:816
+#, 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"
+"Sembla que podeu estar cometent una fusió.\n"
+"Si això no és correcte, si us plau, treu el fitxer\n"
+"\t%s\n"
+"i intenteu de nou.\n"
+
+#: builtin/commit.c:821
+#, 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"
+"Sembla que podeu estar cometent un recull de cireres.\n"
+"Si això no és correcte, si us plau treu el fitxer\n"
+"\t%s\n"
+"i intenteu de nou.\n"
+
+#: builtin/commit.c:834
+#, 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 ""
+"Si us plau, introduïu el missatge de comissió dels vostres canvis.\n"
+"S'ignoraran les línies començant amb '%c', i un missatge de\n"
+"comissió buit avorta la comissió.\n"
+
+#: builtin/commit.c:841
+#, 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 ""
+"Si us plau, introduïu el missatge de comissió dels vostres canvis.\n"
+"Es retindran les línies començants amb '%c'; podeu treure'ls per vós\n"
+"mateix si voleu. Un missatge buit avorta la comissió.\n"
+
+#: builtin/commit.c:855
+#, c-format
+msgid "%sAuthor:    %.*s <%.*s>"
+msgstr "%sAutor:    %.*s <%.*s>"
+
+#: builtin/commit.c:863
+#, c-format
+msgid "%sDate:      %s"
+msgstr "%sData:      %s"
+
+#: builtin/commit.c:870
+#, c-format
+msgid "%sCommitter: %.*s <%.*s>"
+msgstr "%sComitent: %.*s <%.*s>"
+
+#: builtin/commit.c:888
+msgid "Cannot read index"
+msgstr "No es pot llegir l'índex"
+
+#: builtin/commit.c:945
+msgid "Error building trees"
+msgstr "Error al construir arbres"
+
+#: builtin/commit.c:960 builtin/tag.c:495
+#, c-format
+msgid "Please supply the message using either -m or -F option.\n"
+msgstr ""
+"Si us plau, proveïu el missatge utilitzant l'opció o -m o l'opció -F.\n"
+
+#: builtin/commit.c:1061
+#, c-format
+msgid "No existing author found with '%s'"
+msgstr "Cap autor existent trobat amb '%s'"
+
+#: builtin/commit.c:1076 builtin/commit.c:1316
+#, c-format
+msgid "Invalid untracked files mode '%s'"
+msgstr "Mode de fitxers no seguits invàlid '%s'"
+
+#: builtin/commit.c:1113
+msgid "--long and -z are incompatible"
+msgstr "--long i -z són incompatibles"
+
+#: builtin/commit.c:1143
+msgid "Using both --reset-author and --author does not make sense"
+msgstr "Utilitzar ambdós --reset-author i --author no té sentit"
+
+#: builtin/commit.c:1152
+msgid "You have nothing to amend."
+msgstr "No teniu res que esmenar."
+
+#: builtin/commit.c:1155
+msgid "You are in the middle of a merge -- cannot amend."
+msgstr "Esteu en el medi d'una fusió -- no es pot esmenar."
+
+#: builtin/commit.c:1157
+msgid "You are in the middle of a cherry-pick -- cannot amend."
+msgstr "Esteu en el medi d'una cherry-pick -- no es pot esmenar."
+
+#: builtin/commit.c:1160
+msgid "Options --squash and --fixup cannot be used together"
+msgstr "Les opcions --squash i --fixup no es poden utilitzar junts"
+
+#: builtin/commit.c:1170
+msgid "Only one of -c/-C/-F/--fixup can be used."
+msgstr "Només un de -c/-C/-F/--fixup es pot utilitzar."
+
+#: builtin/commit.c:1172
+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:1180
+msgid "--reset-author can be used only with -C, -c or --amend."
+msgstr "--reset-author només es pot utilitzar amb -C, -c o --amend."
+
+#: builtin/commit.c:1197
+msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
+msgstr ""
+"Només un de --include/--only/--all/--interactive/--patch es pot utilitzar."
+
+#: builtin/commit.c:1199
+msgid "No paths with --include/--only does not make sense."
+msgstr "--include/--only no té sentit sense ruta."
+
+#: builtin/commit.c:1201
+msgid "Clever... amending the last one with dirty index."
+msgstr "Intel·ligent... esmenant el últim amb índex brut"
+
+#: builtin/commit.c:1203
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
+msgstr ""
+"Rutes explícites especificades sense -i o -o; presumint rutes --only..."
+
+#: builtin/commit.c:1215 builtin/tag.c:727
+#, c-format
+msgid "Invalid cleanup mode %s"
+msgstr "Mode de neteja invàlid %s"
+
+#: builtin/commit.c:1220
+msgid "Paths with -a does not make sense."
+msgstr "-a no té sentit amb rutes."
+
+#: builtin/commit.c:1330 builtin/commit.c:1595
+msgid "show status concisely"
+msgstr "mostra l'estat concisament"
+
+#: builtin/commit.c:1332 builtin/commit.c:1597
+msgid "show branch information"
+msgstr "mostra la informació de rama"
+
+#: builtin/commit.c:1334 builtin/commit.c:1599 builtin/push.c:489
+msgid "machine-readable output"
+msgstr "sortida llegible per màquina"
+
+#: builtin/commit.c:1337 builtin/commit.c:1601
+msgid "show status in long format (default)"
+msgstr "mostra l'estat en format llarg (per defecte)"
+
+#: builtin/commit.c:1340 builtin/commit.c:1604
+msgid "terminate entries with NUL"
+msgstr "termina les entrades amb NUL"
+
+#: builtin/commit.c:1342 builtin/commit.c:1607 builtin/fast-export.c:703
+#: builtin/fast-export.c:706 builtin/tag.c:602
+msgid "mode"
+msgstr "mode"
+
+#: builtin/commit.c:1343 builtin/commit.c:1607
+msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
+msgstr ""
+"mostra els fitxers no seguits, modes opcional: all, normal, no. (Per "
+"defecte: all)"
+
+#: builtin/commit.c:1346
+msgid "show ignored files"
+msgstr "mostra els fitxers ignorats"
+
+#: builtin/commit.c:1347 parse-options.h:153
+msgid "when"
+msgstr "quan"
+
+#: builtin/commit.c:1348
+msgid ""
+"ignore changes to submodules, optional when: all, dirty, untracked. "
+"(Default: all)"
+msgstr ""
+"ignora els canvis als submòduls, opcional quan: all, dirty, untracked. (Per "
+"defecte: all)"
+
+#: builtin/commit.c:1350
+msgid "list untracked files in columns"
+msgstr "mostra els fitxers no seguits en columnes"
+
+#: builtin/commit.c:1419
+msgid "couldn't look up newly created commit"
+msgstr "no s'ha pogut trobar la comissió novament creat"
+
+#: builtin/commit.c:1421
+msgid "could not parse newly created commit"
+msgstr "no s'ha pogut analitzar la comissió novament creat"
+
+#: builtin/commit.c:1469
+msgid "detached HEAD"
+msgstr "HEAD separat"
+
+#: builtin/commit.c:1471
+msgid " (root-commit)"
+msgstr " (comissió d'arrel)"
+
+#: builtin/commit.c:1565
+msgid "suppress summary after successful commit"
+msgstr "omet el resum després d'una comissió reexita"
+
+#: builtin/commit.c:1566
+msgid "show diff in commit message template"
+msgstr "mostra la diferència en la plantilla de missatge de comissió"
+
+#: builtin/commit.c:1568
+msgid "Commit message options"
+msgstr "Opcions de missatge de comissió"
+
+#: builtin/commit.c:1569 builtin/tag.c:600
+msgid "read message from file"
+msgstr "llegiu el missatge des d'un fitxer"
+
+#: builtin/commit.c:1570
+msgid "author"
+msgstr "autor"
+
+#: builtin/commit.c:1570
+msgid "override author for commit"
+msgstr "autor corregit de la comissió"
+
+#: builtin/commit.c:1571 builtin/gc.c:286
+msgid "date"
+msgstr "data"
+
+#: builtin/commit.c:1571
+msgid "override date for commit"
+msgstr "data corregida de la comissió"
+
+#: builtin/commit.c:1572 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:598
+msgid "message"
+msgstr "missatge"
+
+#: builtin/commit.c:1572
+msgid "commit message"
+msgstr "missatge de comissió"
+
+#: builtin/commit.c:1573
+msgid "reuse and edit message from specified commit"
+msgstr "reutilitza i edit el missatge de la comissió especificada"
+
+#: builtin/commit.c:1574
+msgid "reuse message from specified commit"
+msgstr "reutilitza el missatge de la comissió especificada"
+
+#: builtin/commit.c:1575
+msgid "use autosquash formatted message to fixup specified commit"
+msgstr ""
+"utilitza el missatge formatat d'aixafada automàtica per arreglar la comissió "
+"especificada"
+
+#: builtin/commit.c:1576
+msgid "use autosquash formatted message to squash specified commit"
+msgstr ""
+"utilitza el missatge formatat d'aixafada automàtica per aixafar la comissió "
+"especificada"
+
+#: builtin/commit.c:1577
+msgid "the commit is authored by me now (used with -C/-c/--amend)"
+msgstr "l'autor de la comissió ja sóc jo (utilitzat amb -C/-c/--amend)"
+
+#: builtin/commit.c:1578 builtin/log.c:1188 builtin/revert.c:86
+msgid "add Signed-off-by:"
+msgstr "afegeix Signed-off-by:"
+
+#: builtin/commit.c:1579
+msgid "use specified template file"
+msgstr "utilitza el fitxer de plantilla especificat"
+
+#: builtin/commit.c:1580
+msgid "force edit of commit"
+msgstr "edició de la comissió a la força"
+
+#: builtin/commit.c:1581
+msgid "default"
+msgstr "per defecte"
+
+#: builtin/commit.c:1581 builtin/tag.c:603
+msgid "how to strip spaces and #comments from message"
+msgstr "com despullar els espais i #comentaris del missatge"
+
+#: builtin/commit.c:1582
+msgid "include status in commit message template"
+msgstr "inclou l'estat en la plantilla de missatge de comissió"
+
+#: builtin/commit.c:1583 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:604
+msgid "key-id"
+msgstr "ID de clau"
+
+#: builtin/commit.c:1584 builtin/merge.c:224 builtin/revert.c:93
+msgid "GPG sign commit"
+msgstr "firma la comissió amb GPG"
+
+#: builtin/commit.c:1587
+msgid "Commit contents options"
+msgstr "Opcions dels continguts de les comissions"
+
+#: builtin/commit.c:1588
+msgid "commit all changed files"
+msgstr "comet tots els fitxers canviats"
+
+#: builtin/commit.c:1589
+msgid "add specified files to index for commit"
+msgstr "afegeix els fitxers especificats a l'índex per a cometre"
+
+#: builtin/commit.c:1590
+msgid "interactively add files"
+msgstr "afegeix els fitxers interactivament"
+
+#: builtin/commit.c:1591
+msgid "interactively add changes"
+msgstr "afegeix els canvis interactivament"
+
+#: builtin/commit.c:1592
+msgid "commit only specified files"
+msgstr "comet només els fitxers especificats"
+
+#: builtin/commit.c:1593
+msgid "bypass pre-commit hook"
+msgstr "evita el ganxo de precomissió"
+
+#: builtin/commit.c:1594
+msgid "show what would be committed"
+msgstr "mostra què es cometria"
+
+#: builtin/commit.c:1605
+msgid "amend previous commit"
+msgstr "esmena la comissió anterior"
+
+#: builtin/commit.c:1606
+msgid "bypass post-rewrite hook"
+msgstr "evita el ganxo de postreescriure"
+
+#: builtin/commit.c:1611
+msgid "ok to record an empty change"
+msgstr "bé registrar un canvi buit"
+
+#: builtin/commit.c:1613
+msgid "ok to record a change with an empty message"
+msgstr "bé registrar un canvi amb missatge buit"
+
+#: builtin/commit.c:1641
+msgid "could not parse HEAD commit"
+msgstr "no s'ha pogut analitzar la comissió HEAD"
+
+#: builtin/commit.c:1680 builtin/merge.c:518
+#, c-format
+msgid "could not open '%s' for reading"
+msgstr "no s'ha pogut obrir '%s' per lectura"
+
+#: builtin/commit.c:1687
+#, c-format
+msgid "Corrupt MERGE_HEAD file (%s)"
+msgstr "Fitxer MERGE_HEAD corrupte (%s)"
+
+#: builtin/commit.c:1694
+msgid "could not read MERGE_MODE"
+msgstr "no s'ha pogut llegir MERGE_MODE"
+
+#: builtin/commit.c:1713
+#, c-format
+msgid "could not read commit message: %s"
+msgstr "no s'ha pogut llegir el missatge de comissió: %s"
+
+#: builtin/commit.c:1724
+#, 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:1729
+#, 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:1744 builtin/merge.c:851 builtin/merge.c:876
+msgid "failed to write commit object"
+msgstr "s'ha fallat al escriure l'objecte de comissió"
+
+#: builtin/commit.c:1756
+msgid "cannot lock HEAD ref"
+msgstr "no es pot bloquejar la referència HEAD"
+
+#: builtin/commit.c:1769
+msgid "cannot update HEAD ref"
+msgstr "no es pot actualitzar la referència HEAD"
+
+#: builtin/commit.c:1780
+msgid ""
+"Repository has been updated, but unable to write\n"
+"new_index file. Check that disk is not full or quota is\n"
+"not exceeded, and then \"git reset HEAD\" to recover."
+msgstr ""
+"S'ha actualitzat el repositori, però no es pot escriure\n"
+"el fitxer new_index. Comproveu que el disc no estigui\n"
+"ple i la quota no estigui excedit, i després\n"
+"\"git reset HEAD\" per recuperar."
+
+#: builtin/config.c:8
+msgid "git config [options]"
+msgstr "git config [opcions]"
+
+#: builtin/config.c:53
+msgid "Config file location"
+msgstr "Ubicació del fitxer de configuració"
+
+#: builtin/config.c:54
+msgid "use global config file"
+msgstr "utilitza el fitxer de configuració global"
+
+#: builtin/config.c:55
+msgid "use system config file"
+msgstr "utilitza el fitxer de configuració del sistema"
+
+#: builtin/config.c:56
+msgid "use repository config file"
+msgstr "utilitza el fitxer de configuració del repositori"
+
+#: builtin/config.c:57
+msgid "use given config file"
+msgstr "utilitza el fitxer de configuració donat"
+
+#: builtin/config.c:58
+msgid "blob-id"
+msgstr "ID de blob"
+
+#: builtin/config.c:58
+msgid "read config from given blob object"
+msgstr "llegeix la configuració de l'objecte de blob donat"
+
+#: builtin/config.c:59
+msgid "Action"
+msgstr "Acció"
+
+#: builtin/config.c:60
+msgid "get value: name [value-regex]"
+msgstr "obtén valor: nom [regex-de-valors]"
+
+#: builtin/config.c:61
+msgid "get all values: key [value-regex]"
+msgstr "obtén tots els valors: clau [regex-de-valors]"
+
+#: builtin/config.c:62
+msgid "get values for regexp: name-regex [value-regex]"
+msgstr "obtén valors de regexp: regex-de-noms [regex-de-valors]"
+
+#: builtin/config.c:63
+msgid "get value specific for the URL: section[.var] URL"
+msgstr "obtén el valor especific al URL: secció[.variable] URL"
+
+#: builtin/config.c:64
+msgid "replace all matching variables: name value [value_regex]"
+msgstr ""
+"reemplaça tots els variables que coincideixen: nom valor [regex_de_valors]"
+
+#: builtin/config.c:65
+msgid "add a new variable: name value"
+msgstr "afegeix un variable nou: nom valor"
+
+#: builtin/config.c:66
+msgid "remove a variable: name [value-regex]"
+msgstr "treu un variable: nom [regex-de-valors]"
+
+#: builtin/config.c:67
+msgid "remove all matches: name [value-regex]"
+msgstr "treu totes les coincidències: nom [regex-de-valors]"
+
+#: builtin/config.c:68
+msgid "rename section: old-name new-name"
+msgstr "canvia el nom de secció: nom-antic nom-nou"
+
+#: builtin/config.c:69
+msgid "remove a section: name"
+msgstr "treu una secció: nom"
+
+#: builtin/config.c:70
+msgid "list all"
+msgstr "llista tots"
+
+#: builtin/config.c:71
+msgid "open an editor"
+msgstr "obre un editor"
+
+#: builtin/config.c:72 builtin/config.c:73
+msgid "slot"
+msgstr "ranura"
+
+#: builtin/config.c:72
+msgid "find the color configured: [default]"
+msgstr "troba el color configurat: [per defecte]"
+
+#: builtin/config.c:73
+msgid "find the color setting: [stdout-is-tty]"
+msgstr "troba l'ajust de color: [stdout-és-tty]"
+
+#: builtin/config.c:74
+msgid "Type"
+msgstr "Tipus"
+
+#: builtin/config.c:75
+msgid "value is \"true\" or \"false\""
+msgstr "valor és \"true\" o \"false\""
+
+#: builtin/config.c:76
+msgid "value is decimal number"
+msgstr "valor és un nombre decimal"
+
+#: builtin/config.c:77
+msgid "value is --bool or --int"
+msgstr "valor és --bool o --int"
+
+#: builtin/config.c:78
+msgid "value is a path (file or directory name)"
+msgstr "valor és un path (nom de fitxer o directori)"
+
+#: builtin/config.c:79
+msgid "Other"
+msgstr "Altre"
+
+#: builtin/config.c:80
+msgid "terminate values with NUL byte"
+msgstr "termina els valors amb un octet NUL"
+
+#: builtin/config.c:81
+msgid "respect include directives on lookup"
+msgstr "respecta les directives d'inclusió al cercar"
+
+#: builtin/count-objects.c:82
+msgid "git count-objects [-v] [-H | --human-readable]"
+msgstr "git count-objects [-v] [-H | --human-readable]"
+
+#: builtin/count-objects.c:97
+msgid "print sizes in human readable format"
+msgstr "imprimeix les mides en un format llegible per humans"
+
+#: builtin/describe.c:16
+msgid "git describe [options] <commit-ish>*"
+msgstr "git describe [opcions] <comissió>*"
+
+#: builtin/describe.c:17
+msgid "git describe [options] --dirty"
+msgstr "git describe [opcions] --dirty"
+
+#: builtin/describe.c:216
+#, c-format
+msgid "annotated tag %s not available"
+msgstr "l'etiqueta anotada %s no és disponible"
+
+#: builtin/describe.c:220
+#, c-format
+msgid "annotated tag %s has no embedded name"
+msgstr "l'etiqueta anotada %s no té nom incrustat"
+
+#: builtin/describe.c:222
+#, c-format
+msgid "tag '%s' is really '%s' here"
+msgstr "l'etiqueta '%s' realment és '%s' aquí"
+
+#: builtin/describe.c:249
+#, c-format
+msgid "Not a valid object name %s"
+msgstr "%s no és un nom d'objecte vàlid"
+
+#: builtin/describe.c:252
+#, c-format
+msgid "%s is not a valid '%s' object"
+msgstr "%s no és un objecte de '%s' vàlid"
+
+#: builtin/describe.c:269
+#, c-format
+msgid "no tag exactly matches '%s'"
+msgstr "cap etiqueta coincideix exactament amb '%s'"
+
+#: builtin/describe.c:271
+#, c-format
+msgid "searching to describe %s\n"
+msgstr "cercant per descriure %s\n"
+
+#: builtin/describe.c:318
+#, c-format
+msgid "finished search at %s\n"
+msgstr "cerca terminada a %s\n"
+
+#: builtin/describe.c:345
+#, c-format
+msgid ""
+"No annotated tags can describe '%s'.\n"
+"However, there were unannotated tags: try --tags."
+msgstr ""
+"Cap etiqueta anotada pot descriure '%s'.\n"
+"No obstant, hi havia etiquetes no anotades: proveu --tags."
+
+#: builtin/describe.c:349
+#, c-format
+msgid ""
+"No tags can describe '%s'.\n"
+"Try --always, or create some tags."
+msgstr ""
+"Cap etiqueta pot descriure '%s'.\n"
+"Proveu --always, o creeu algunes etiquetes."
+
+#: builtin/describe.c:370
+#, c-format
+msgid "traversed %lu commits\n"
+msgstr "%lu comissions travessades\n"
+
+#: builtin/describe.c:373
+#, c-format
+msgid ""
+"more than %i tags found; listed %i most recent\n"
+"gave up search at %s\n"
+msgstr ""
+"s'ha trobat més de %i etiquetes: s'ha llistat les %i més recents\n"
+"cerca renunciada a %s\n"
+
+#: builtin/describe.c:395
+msgid "find the tag that comes after the commit"
+msgstr "troba l'etiqueta que vingui després de la comissió"
+
+#: builtin/describe.c:396
+msgid "debug search strategy on stderr"
+msgstr "estratègia de cerca de depuració en stderr"
+
+#: builtin/describe.c:397
+msgid "use any ref"
+msgstr "utilitza qualsevulla referència"
+
+#: builtin/describe.c:398
+msgid "use any tag, even unannotated"
+msgstr "utilitza qualsevulla etiqueta, encara les sense anotar"
+
+#: builtin/describe.c:399
+msgid "always use long format"
+msgstr "sempre utilitza el format llarg"
+
+#: builtin/describe.c:400
+msgid "only follow first parent"
+msgstr "només segueix el primer pare"
+
+#: builtin/describe.c:403
+msgid "only output exact matches"
+msgstr "emet només coincidències exactes"
+
+#: builtin/describe.c:405
+msgid "consider <n> most recent tags (default: 10)"
+msgstr "considera les <n> etiquetes més recents (per defecte: 10)"
+
+#: builtin/describe.c:407
+msgid "only consider tags matching <pattern>"
+msgstr "només considera les etiquetes que coincideixen amb <patró>"
+
+#: builtin/describe.c:409 builtin/name-rev.c:318
+msgid "show abbreviated commit object as fallback"
+msgstr "mostra l'objecte de comissió abreviat com retrocediment"
+
+#: builtin/describe.c:410
+msgid "mark"
+msgstr "marca"
+
+#: builtin/describe.c:411
+msgid "append <mark> on dirty working tree (default: \"-dirty\")"
+msgstr "annexa <marca> en l'arbre de treball brut (per defecte: \"-dirty\")"
+
+#: builtin/describe.c:429
+msgid "--long is incompatible with --abbrev=0"
+msgstr "--long és incompatible amb --abbrev=0"
+
+#: builtin/describe.c:455
+msgid "No names found, cannot describe anything."
+msgstr "Cap nom trobat, no es pot descriure res."
+
+#: builtin/describe.c:475
+msgid "--dirty is incompatible with commit-ishes"
+msgstr "--dirty és incompatible amb les comissions"
+
+#: builtin/diff.c:85
+#, c-format
+msgid "'%s': not a regular file or symlink"
+msgstr "'%s': no és un fitxer regular ni enllaç simbòlic"
+
+#: builtin/diff.c:236
+#, c-format
+msgid "invalid option: %s"
+msgstr "opció invàlida: %s"
+
+#: builtin/diff.c:357
+msgid "Not a git repository"
+msgstr "No és un repositori de git"
+
+#: builtin/diff.c:400
+#, c-format
+msgid "invalid object '%s' given."
+msgstr "objecte invàlid '%s' donat."
+
+#: builtin/diff.c:409
+#, c-format
+msgid "more than two blobs given: '%s'"
+msgstr "més de dos blobs donats: '%s'"
+
+#: builtin/diff.c:416
+#, c-format
+msgid "unhandled object '%s' given."
+msgstr "objecte no manejat '%s' donat."
+
+#: builtin/fast-export.c:23
+msgid "git fast-export [rev-list-opts]"
+msgstr "git fast-export [opcions-de-llista-de-revisions]"
+
+#: builtin/fast-export.c:702
+msgid "show progress after <n> objects"
+msgstr "mostra el progrés després de <n> objectes"
+
+#: builtin/fast-export.c:704
+msgid "select handling of signed tags"
+msgstr "selecciona el manejament de les etiquetes firmades"
+
+#: builtin/fast-export.c:707
+msgid "select handling of tags that tag filtered objects"
+msgstr ""
+"selecciona el manejament de les etiquetes que etiqueten objectes filtrats"
+
+#: builtin/fast-export.c:710
+msgid "Dump marks to this file"
+msgstr "Bolcar les marques a aquest fitxer"
+
+#: builtin/fast-export.c:712
+msgid "Import marks from this file"
+msgstr "Importa marques d'aquest fitxer"
+
+#: builtin/fast-export.c:714
+msgid "Fake a tagger when tags lack one"
+msgstr "Fingeix un etiquetador quan als etiquetes lis manca un"
+
+#: builtin/fast-export.c:716
+msgid "Output full tree for each commit"
+msgstr "Imprimeix l'arbre complet per cada comissió"
+
+#: builtin/fast-export.c:718
+msgid "Use the done feature to terminate the stream"
+msgstr "Utilitza la característica done per terminar el corrent"
+
+#: builtin/fast-export.c:719
+msgid "Skip output of blob data"
+msgstr "Salta l'emissió de dades de blob"
+
+#: builtin/fast-export.c:720
+msgid "refspec"
+msgstr "especificació de referència"
+
+#: builtin/fast-export.c:721
+msgid "Apply refspec to exported refs"
+msgstr "Aplica l'especificació de referència a les referències exportades"
+
+#: builtin/fetch.c:20
+msgid "git fetch [<options>] [<repository> [<refspec>...]]"
+msgstr ""
+"git fetch [<opcions>] [<repositori> [<especificació-de-referència>...]]"
+
+#: builtin/fetch.c:21
+msgid "git fetch [<options>] <group>"
+msgstr "git fetch [<opcions>] <grup>"
+
+#: builtin/fetch.c:22
+msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
+msgstr "git fetch --multiple [<opcions>] [(<repositori> | <grup>)...]"
+
+#: builtin/fetch.c:23
+msgid "git fetch --all [<options>]"
+msgstr "git fetch --all [<opcions>]"
+
+#: builtin/fetch.c:90
+msgid "fetch from all remotes"
+msgstr "obtén de tots els remots"
+
+#: builtin/fetch.c:92
+msgid "append to .git/FETCH_HEAD instead of overwriting"
+msgstr "annexa a .git/FETCH_HEAD en lloc de sobreescriure"
+
+#: builtin/fetch.c:94
+msgid "path to upload pack on remote end"
+msgstr "ruta a que pujar el paquet en el costat remot"
+
+#: builtin/fetch.c:95
+msgid "force overwrite of local branch"
+msgstr "força la sobreescriptura de la rama local"
+
+#: builtin/fetch.c:97
+msgid "fetch from multiple remotes"
+msgstr "obtén de múltiples remots"
+
+#: builtin/fetch.c:99
+msgid "fetch all tags and associated objects"
+msgstr "obtén tots les etiquetes i objectes associats"
+
+#: builtin/fetch.c:101
+msgid "do not fetch all tags (--no-tags)"
+msgstr "no obtingues les etiquetes (--no-tags)"
+
+#: builtin/fetch.c:103
+msgid "prune remote-tracking branches no longer on remote"
+msgstr "poda les rames amb seguiment remot que ja no estan en el remot"
+
+#: builtin/fetch.c:104
+msgid "on-demand"
+msgstr "sota demanda"
+
+#: builtin/fetch.c:105
+msgid "control recursive fetching of submodules"
+msgstr "controla l'obteniment recursiu de submòduls"
+
+#: builtin/fetch.c:109
+msgid "keep downloaded pack"
+msgstr "desa el paquet baixat"
+
+#: builtin/fetch.c:111
+msgid "allow updating of HEAD ref"
+msgstr "permet l'actualització de la referència HEAD"
+
+#: builtin/fetch.c:114
+msgid "deepen history of shallow clone"
+msgstr "aprofundeix la història del clon superficial"
+
+#: builtin/fetch.c:116
+msgid "convert to a complete repository"
+msgstr "converteix en un repositori complet"
+
+#: builtin/fetch.c:118 builtin/log.c:1205
+msgid "dir"
+msgstr "directori"
+
+#: builtin/fetch.c:119
+msgid "prepend this to submodule path output"
+msgstr "anteposa això a la sortida de ruta del submòdul"
+
+#: builtin/fetch.c:122
+msgid "default mode for recursion"
+msgstr "mode de recursivitat per defecte"
+
+#: builtin/fetch.c:124
+msgid "accept refs that update .git/shallow"
+msgstr "accepta referències que actualitzin .git/shallow"
+
+#: builtin/fetch.c:125
+msgid "refmap"
+msgstr "mapa de referències"
+
+#: builtin/fetch.c:126
+msgid "specify fetch refmap"
+msgstr "mostra el mapa de referències d'obteniment"
+
+#: builtin/fetch.c:376
+msgid "Couldn't find remote ref HEAD"
+msgstr "No s'ha pogut trobar la referència HEAD remota"
+
+#: builtin/fetch.c:440
+#, c-format
+msgid "object %s not found"
+msgstr "objecte %s no trobat"
+
+#: builtin/fetch.c:445
+msgid "[up to date]"
+msgstr "[actualitzat]"
+
+#: builtin/fetch.c:459
+#, c-format
+msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
+msgstr "! %-*s %-*s -> %s  (no es pot obtenir en la rama actual)"
+
+#: builtin/fetch.c:460 builtin/fetch.c:546
+msgid "[rejected]"
+msgstr "[rebutjat]"
+
+#: builtin/fetch.c:471
+msgid "[tag update]"
+msgstr "[actualització d'etiqueta]"
+
+#: builtin/fetch.c:473 builtin/fetch.c:508 builtin/fetch.c:526
+msgid "  (unable to update local ref)"
+msgstr "  (incapaç d'actualitzar la referència local)"
+
+#: builtin/fetch.c:491
+msgid "[new tag]"
+msgstr "[etiqueta nova]"
+
+#: builtin/fetch.c:494
+msgid "[new branch]"
+msgstr "[rama nova]"
+
+#: builtin/fetch.c:497
+msgid "[new ref]"
+msgstr "[referència nova]"
+
+#: builtin/fetch.c:542
+msgid "unable to update local ref"
+msgstr "incapaç d'actualitzar la referència local"
+
+#: builtin/fetch.c:542
+msgid "forced update"
+msgstr "actualització forçada"
+
+#: builtin/fetch.c:548
+msgid "(non-fast-forward)"
+msgstr "(sense avanç ràpid)"
+
+#: builtin/fetch.c:581 builtin/fetch.c:814
+#, c-format
+msgid "cannot open %s: %s\n"
+msgstr "no és pot obrir %s: %s\n"
+
+#: builtin/fetch.c:590
+#, c-format
+msgid "%s did not send all necessary objects\n"
+msgstr "%s no ha enviat tots els objectes necessaris\n"
+
+#: builtin/fetch.c:608
+#, c-format
+msgid "reject %s because shallow roots are not allowed to be updated"
+msgstr ""
+"rebutja %s perquè no es permet que els arrels superficials s'actualitzin"
+
+#: builtin/fetch.c:696 builtin/fetch.c:779
+#, c-format
+msgid "From %.*s\n"
+msgstr "De %.*s\n"
+
+#: builtin/fetch.c:707
+#, c-format
+msgid ""
+"some local refs could not be updated; try running\n"
+" 'git remote prune %s' to remove any old, conflicting branches"
+msgstr ""
+"algunes referències locals no s'han pogut actualitzar;\n"
+" intenteu executar 'git remote prune %s' per treure\n"
+" qualsevulla rama antiga o conflictiva"
+
+#: builtin/fetch.c:759
+#, c-format
+msgid "   (%s will become dangling)"
+msgstr "   (%s es tornarà penjant)"
+
+#: builtin/fetch.c:760
+#, c-format
+msgid "   (%s has become dangling)"
+msgstr "   (%s s'ha tornat penjant)"
+
+#: builtin/fetch.c:784
+msgid "[deleted]"
+msgstr "[suprimit]"
+
+#: builtin/fetch.c:785 builtin/remote.c:1059
+msgid "(none)"
+msgstr "(cap)"
+
+#: builtin/fetch.c:804
+#, c-format
+msgid "Refusing to fetch into current branch %s of non-bare repository"
+msgstr "Refusar obtenir a la rama actual %s d'un repositori no nu"
+
+#: builtin/fetch.c:823
+#, 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:826
+#, c-format
+msgid "Option \"%s\" is ignored for %s\n"
+msgstr "S'ignora l'opció \"%s\" per a %s\n"
+
+#: builtin/fetch.c:882
+#, c-format
+msgid "Don't know how to fetch from %s"
+msgstr "No es sap com obtenir de %s"
+
+#: builtin/fetch.c:1044
+#, c-format
+msgid "Fetching %s\n"
+msgstr "Obtenint %s\n"
+
+#: builtin/fetch.c:1046 builtin/remote.c:90
+#, c-format
+msgid "Could not fetch %s"
+msgstr "No s'ha pogut obtenir %s"
+
+#: builtin/fetch.c:1064
+msgid ""
+"No remote repository specified.  Please, specify either a URL or a\n"
+"remote name from which new revisions should be fetched."
+msgstr ""
+"Cap repositori remot especificat. Si us plau, especifiqueu o un\n"
+"URL o un nom remot del qual es deuen obtenir les revisions noves."
+
+#: builtin/fetch.c:1087
+msgid "You need to specify a tag name."
+msgstr "Necessiteu especificar un nom d'etiqueta."
+
+#: builtin/fetch.c:1131
+msgid "--depth and --unshallow cannot be used together"
+msgstr "--depth i --unshallow no es poden utilitzar junts"
+
+#: builtin/fetch.c:1133
+msgid "--unshallow on a complete repository does not make sense"
+msgstr "--unshallow en un repositori complet no té sentit"
+
+#: builtin/fetch.c:1156
+msgid "fetch --all does not take a repository argument"
+msgstr "fetch --all no accepta un paràmetre de repositori"
+
+#: builtin/fetch.c:1158
+msgid "fetch --all does not make sense with refspecs"
+msgstr "fetch --all no té sentit amb especificacions de referència"
+
+#: builtin/fetch.c:1169
+#, c-format
+msgid "No such remote or remote group: %s"
+msgstr "Cap remot o grup remot així: %s"
+
+#: builtin/fetch.c:1177
+msgid "Fetching a group and specifying refspecs does not make sense"
+msgstr "Obtenir un grup i especificar referències no té sentit"
+
+#: builtin/fmt-merge-msg.c:13
+msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
+msgstr ""
+"git fmt-merge-msg [-m <missatge>] [--log[=<n>]|--no-log] [--file <fitxer>]"
+
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:698
+#: builtin/merge.c:196 builtin/repack.c:179 builtin/repack.c:183
+#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:589
+#: parse-options.h:132 parse-options.h:239
+msgid "n"
+msgstr "n"
+
+#: builtin/fmt-merge-msg.c:664
+msgid "populate log with at most <n> entries from shortlog"
+msgstr "emplena el registre amb al màxim <n> entrades del registre curt"
+
+#: builtin/fmt-merge-msg.c:667
+msgid "alias for --log (deprecated)"
+msgstr "àlies per --log (desaprovat)"
+
+#: builtin/fmt-merge-msg.c:670
+msgid "text"
+msgstr "text"
+
+#: builtin/fmt-merge-msg.c:671
+msgid "use <text> as start of message"
+msgstr "utilitza <text> com inici de missatge"
+
+#: builtin/fmt-merge-msg.c:672
+msgid "file to read from"
+msgstr "fitxer del qual llegir"
+
+#: builtin/for-each-ref.c:1051
+msgid "git for-each-ref [options] [<pattern>]"
+msgstr "git for-each-ref [opcions] [<patró>]"
+
+#: builtin/for-each-ref.c:1066
+msgid "quote placeholders suitably for shells"
+msgstr ""
+"posa els marcadors de posició entre cometes adequades per als terminals"
+
+#: builtin/for-each-ref.c:1068
+msgid "quote placeholders suitably for perl"
+msgstr "posa els marcadors de posició entre cometes adequades per a perl"
+
+#: builtin/for-each-ref.c:1070
+msgid "quote placeholders suitably for python"
+msgstr "posa els marcadors de posició entre cometes adequades per a python"
+
+#: builtin/for-each-ref.c:1072
+msgid "quote placeholders suitably for tcl"
+msgstr "posa els marcadors de posició entre cometes adequades per a tcl"
+
+#: builtin/for-each-ref.c:1075
+msgid "show only <n> matched refs"
+msgstr "mostra només <n> referències coincidents"
+
+#: builtin/for-each-ref.c:1076 builtin/replace.c:435
+msgid "format"
+msgstr "format"
+
+#: builtin/for-each-ref.c:1076
+msgid "format to use for the output"
+msgstr "format que utilitzar per a la sortida"
+
+#: builtin/for-each-ref.c:1077
+msgid "key"
+msgstr "clau"
+
+#: builtin/for-each-ref.c:1078
+msgid "field name to sort on"
+msgstr "nom de camp en el qual ordenar"
+
+#: builtin/fsck.c:147 builtin/prune.c:172
+msgid "Checking connectivity"
+msgstr "Comprovant connectivitat"
+
+#: builtin/fsck.c:538
+msgid "Checking object directories"
+msgstr "Comprovant els directoris d'objecte"
+
+#: builtin/fsck.c:601
+msgid "git fsck [options] [<object>...]"
+msgstr "git fsck [opcions] [<objecte>...]"
+
+#: builtin/fsck.c:607
+msgid "show unreachable objects"
+msgstr "mostra els objects inabastable"
+
+#: builtin/fsck.c:608
+msgid "show dangling objects"
+msgstr "mostra els objectes penjants"
+
+#: builtin/fsck.c:609
+msgid "report tags"
+msgstr "informa de les etiquetes"
+
+#: builtin/fsck.c:610
+msgid "report root nodes"
+msgstr "informa dels nodes d'arrel"
+
+#: builtin/fsck.c:611
+msgid "make index objects head nodes"
+msgstr "fes els objectes d'índex nodes de cap"
+
+#: builtin/fsck.c:612
+msgid "make reflogs head nodes (default)"
+msgstr "fes notes de cap de registres de referències (per defecte)"
+
+#: builtin/fsck.c:613
+msgid "also consider packs and alternate objects"
+msgstr "també considera els paquets i els objectes alternatius"
+
+#: builtin/fsck.c:614
+msgid "enable more strict checking"
+msgstr "habilita comprovació més estricta"
+
+#: builtin/fsck.c:616
+msgid "write dangling objects in .git/lost-found"
+msgstr "escriu objectes penjants a .git/lost-found"
+
+#: builtin/fsck.c:617 builtin/prune.c:144
+msgid "show progress"
+msgstr "mostra progrés"
+
+#: builtin/fsck.c:667
+msgid "Checking objects"
+msgstr "Comprovant objectes"
+
+#: builtin/gc.c:24
+msgid "git gc [options]"
+msgstr "git gc [opcions]"
+
+#: builtin/gc.c:91
+#, c-format
+msgid "Invalid %s: '%s'"
+msgstr "%s invàlid: '%s'"
+
+#: builtin/gc.c:118
+#, c-format
+msgid "insanely long object directory %.*s"
+msgstr "directori d'objectes increïblement llarga %.*s"
+
+#: builtin/gc.c:287
+msgid "prune unreferenced objects"
+msgstr "poda objectes sense referència"
+
+#: builtin/gc.c:289
+msgid "be more thorough (increased runtime)"
+msgstr "siguis més exhaustiu (temps d'execució augmentat)"
+
+#: builtin/gc.c:290
+msgid "enable auto-gc mode"
+msgstr "habilita mode de recollida d'escombraries automàtica"
+
+#: builtin/gc.c:291
+msgid "force running gc even if there may be another gc running"
+msgstr "força l'execució de gc encara que hi pugui haver altre gc executant"
+
+#: builtin/gc.c:332
+#, c-format
+msgid "Auto packing the repository in background for optimum performance.\n"
+msgstr ""
+"Empaquetant automàticament el repositori en el fons per rendiment optim.\n"
+
+#: builtin/gc.c:334
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
+msgstr "Empaquetant automàticament el repositori per rendiment optim.\n"
+
+#: builtin/gc.c:335
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
+msgstr "Veu \"git help gc\" per neteja manual.\n"
+
+#: builtin/gc.c:353
+#, 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> (utilitzeu --force si "
+"no)"
+
+#: builtin/gc.c:375
+msgid ""
+"There are too many unreachable loose objects; run 'git prune' to remove them."
+msgstr ""
+"Hi ha massa objectes solts inabastables; executeu 'git prune' per treure'ls."
+
+#: builtin/grep.c:23
+msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]"
+msgstr "git grep [opcions] [-e] <patró> [<revisió>...] [[--] <ruta>...]"
+
+#: builtin/grep.c:218
+#, c-format
+msgid "grep: failed to create thread: %s"
+msgstr "grep: s'ha fallat al crear fil: %s"
+
+#: builtin/grep.c:441 builtin/grep.c:476
+#, c-format
+msgid "unable to read tree (%s)"
+msgstr "incapaç de llegir l'arbre (%s)"
+
+#: builtin/grep.c:491
+#, c-format
+msgid "unable to grep from object of type %s"
+msgstr "no es pot fer grep des d'un objecte de tipus %s"
+
+#: builtin/grep.c:547
+#, c-format
+msgid "switch `%c' expects a numerical value"
+msgstr "l'ópcio `%c' espera un valor numèric"
+
+#: builtin/grep.c:564
+#, c-format
+msgid "cannot open '%s'"
+msgstr "no es pot obrir '%s'"
+
+#: builtin/grep.c:638
+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
+msgid "find in contents not managed by git"
+msgstr "cerca en continguts no gestionats per git"
+
+#: builtin/grep.c:642
+msgid "search in both tracked and untracked files"
+msgstr "cerca en ambdós els fitxers seguits i no seguits"
+
+#: builtin/grep.c:644
+msgid "search also in ignored files"
+msgstr "cerca en els fitxers ignorats també"
+
+#: builtin/grep.c:647
+msgid "show non-matching lines"
+msgstr "mostra les línies no coincidents"
+
+#: builtin/grep.c:649
+msgid "case insensitive matching"
+msgstr "coincidència insensible a majúscula i minúscula"
+
+#: builtin/grep.c:651
+msgid "match patterns only at word boundaries"
+msgstr "coincideix amb els patrons només als límits de paraula"
+
+#: builtin/grep.c:653
+msgid "process binary files as text"
+msgstr "processa els fitxers binaris com text"
+
+#: builtin/grep.c:655
+msgid "don't match patterns in binary files"
+msgstr "no coincideixis amb els patrons en els fitxers binaris"
+
+#: builtin/grep.c:658
+msgid "process binary files with textconv filters"
+msgstr "processa els fitxers binaris amb filtres de textconv"
+
+#: builtin/grep.c:660
+msgid "descend at most <depth> levels"
+msgstr "descendeix al màxim <profunditat> nivells"
+
+#: builtin/grep.c:664
+msgid "use extended POSIX regular expressions"
+msgstr "utilitza expressions regulars POSIX esteses"
+
+#: builtin/grep.c:667
+msgid "use basic POSIX regular expressions (default)"
+msgstr "utilitza expressions regulars POSIX bàsiques (per defecte)"
+
+#: builtin/grep.c:670
+msgid "interpret patterns as fixed strings"
+msgstr "interpreta els patrons com cadenes fixades"
+
+#: builtin/grep.c:673
+msgid "use Perl-compatible regular expressions"
+msgstr "utilitza expressions regulars compatibles amb Perl"
+
+#: builtin/grep.c:676
+msgid "show line numbers"
+msgstr "mostra els números de línia"
+
+#: builtin/grep.c:677
+msgid "don't show filenames"
+msgstr "no mostris els noms de fitxer"
+
+#: builtin/grep.c:678
+msgid "show filenames"
+msgstr "mostra els noms de fitxer"
+
+#: builtin/grep.c:680
+msgid "show filenames relative to top directory"
+msgstr "mostra els noms de fitxer relatiu al directori superior"
+
+#: builtin/grep.c:682
+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
+msgid "synonym for --files-with-matches"
+msgstr "sinònim per --files-with-matches"
+
+#: builtin/grep.c:687
+msgid "show only the names of files without match"
+msgstr "mostra només els noms dels fitxers sense coincidència"
+
+#: builtin/grep.c:689
+msgid "print NUL after filenames"
+msgstr "imprimeix NUL desprès dels noms de fitxer"
+
+#: builtin/grep.c:691
+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
+msgid "highlight matches"
+msgstr "ressalta les coincidències"
+
+#: builtin/grep.c:694
+msgid "print empty line between matches from different files"
+msgstr "imprimeix una línia buida entre coincidències de fitxers distintes"
+
+#: builtin/grep.c:696
+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
+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
+msgid "show <n> context lines before matches"
+msgstr "mostra <n> línies de context abans d'una coincidència"
+
+#: builtin/grep.c:704
+msgid "show <n> context lines after matches"
+msgstr "mostra <n> línies de context després d'una coincidència"
+
+#: builtin/grep.c:705
+msgid "shortcut for -C NUM"
+msgstr "drecera per -C NUM"
+
+#: builtin/grep.c:708
+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
+msgid "show the surrounding function"
+msgstr "mostra la funció alrededor"
+
+#: builtin/grep.c:713
+msgid "read patterns from file"
+msgstr "llegeix els patrons des d'un fitxer"
+
+#: builtin/grep.c:715
+msgid "match <pattern>"
+msgstr "coincideix amb <patró>"
+
+#: builtin/grep.c:717
+msgid "combine patterns specified with -e"
+msgstr "combina els patrons especificats amb -e"
+
+#: builtin/grep.c:729
+msgid "indicate hit with exit status without output"
+msgstr "indica coincidència amb estat de sortida sense sortida de text"
+
+#: builtin/grep.c:731
+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
+msgid "show parse tree for grep expression"
+msgstr "mostra l'arbre d'anàlisis de l'expressió de grep"
+
+#: builtin/grep.c:737
+msgid "pager"
+msgstr "paginador"
+
+#: builtin/grep.c:737
+msgid "show matching files in the pager"
+msgstr "mostra els fitxers coincidents en el paginador"
+
+#: builtin/grep.c:740
+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:187
+msgid "show usage"
+msgstr "mostra l'ús"
+
+#: builtin/grep.c:808
+msgid "no pattern given."
+msgstr "cap patró donat."
+
+#: builtin/grep.c:866
+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
+msgid "--cached or --untracked cannot be used with --no-index."
+msgstr "--cached o --untracked no es pot utilitzar amb --no-index."
+
+#: builtin/grep.c:897
+msgid "--no-index or --untracked cannot be used with revs."
+msgstr "--no-index o --untracked no es poden utilitzar amb revisions."
+
+#: builtin/grep.c:900
+msgid "--[no-]exclude-standard cannot be used for tracked contents."
+msgstr ""
+"--[no-]exclude-standard no es pot utilitzar per als continguts seguits."
+
+#: builtin/grep.c:908
+msgid "both --cached and trees are given."
+msgstr "s'ha donat ambdós --caches i arbres."
+
+#: builtin/hash-object.c:60
+msgid ""
+"git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] "
+"<file>..."
+msgstr ""
+"git hash-object [-t <tipus>] [-w] [--path=<fitxer>|--no-filters] [--stdin] "
+"[--] <fitxer>..."
+
+#: builtin/hash-object.c:61
+msgid "git hash-object  --stdin-paths < <list-of-paths>"
+msgstr "git hash-object  --stdin-paths < <llista-de-rutes>"
+
+#: builtin/hash-object.c:72 builtin/tag.c:609
+msgid "type"
+msgstr "tipus"
+
+#: builtin/hash-object.c:72
+msgid "object type"
+msgstr "tipus d'objecte"
+
+#: builtin/hash-object.c:73
+msgid "write the object into the object database"
+msgstr "escriu l'objecte al base de dades d'objectes"
+
+#: builtin/hash-object.c:74
+msgid "read the object from stdin"
+msgstr "llegiu l'objecte des de stdin"
+
+#: builtin/hash-object.c:76
+msgid "store file as is without filters"
+msgstr "emmagatzema el fitxer tal com és sense filtres"
+
+#: builtin/hash-object.c:77
+msgid "process file as it were from this path"
+msgstr "processa el fitxer com si fos d'aquesta ruta"
+
+#: builtin/help.c:41
+msgid "print all available commands"
+msgstr "imprimeix tots els ordres disponibles"
+
+#: builtin/help.c:42
+msgid "print list of useful guides"
+msgstr "imprimeix la llista de guies útils"
+
+#: builtin/help.c:43
+msgid "show man page"
+msgstr "mostra la pàgina de manual"
+
+#: builtin/help.c:44
+msgid "show manual in web browser"
+msgstr "mostra la pàgina de manual en el navegador web"
+
+#: builtin/help.c:46
+msgid "show info page"
+msgstr "mostra la pàgina d'informació"
+
+#: builtin/help.c:52
+msgid "git help [--all] [--guides] [--man|--web|--info] [command]"
+msgstr "git help [--all] [--guides] [--man|--web|--info] [ordre]"
+
+#: builtin/help.c:64
+#, c-format
+msgid "unrecognized help format '%s'"
+msgstr "format d'ajuda no reconegut '%s'"
+
+#: builtin/help.c:92
+msgid "Failed to start emacsclient."
+msgstr "S'ha fallat al iniciar emacsclient."
+
+#: builtin/help.c:105
+msgid "Failed to parse emacsclient version."
+msgstr "S'ha fallat al analitzar la versió d'emacsclint."
+
+#: builtin/help.c:113
+#, c-format
+msgid "emacsclient version '%d' too old (< 22)."
+msgstr "la versió d'emacsclient '%d' és massa vella (< 22)."
+
+#: builtin/help.c:131 builtin/help.c:159 builtin/help.c:168 builtin/help.c:176
+#, c-format
+msgid "failed to exec '%s': %s"
+msgstr "s'ha fallat al executar '%s': %s"
+
+#: builtin/help.c:216
+#, c-format
+msgid ""
+"'%s': path for unsupported man viewer.\n"
+"Please consider using 'man.<tool>.cmd' instead."
+msgstr ""
+"'%s': ruta d'un visualitzador de manuals no suportat.\n"
+"Si us plau, considereu utilitzar 'man.<tool>.cmd' en lloc."
+
+#: builtin/help.c:228
+#, c-format
+msgid ""
+"'%s': cmd for supported man viewer.\n"
+"Please consider using 'man.<tool>.path' instead."
+msgstr ""
+"'%s': ordre per un visualitzador de manuals suportat.\n"
+"Si us plau, considereu utilitzar 'man.<tool>.path' en lloc."
+
+#: builtin/help.c:353
+#, c-format
+msgid "'%s': unknown man viewer."
+msgstr "'%s': visualitzador de manuals desconegut"
+
+#: builtin/help.c:370
+msgid "no man viewer handled the request"
+msgstr "cap visualitzador de manuals ha manejat la sol·licitud"
+
+#: builtin/help.c:378
+msgid "no info viewer handled the request"
+msgstr "cap visualitzador d'informació ha manejat la sol·licitud"
+
+#: builtin/help.c:424
+msgid "Defining attributes per path"
+msgstr "La definició d'atributs per ruta"
+
+#: builtin/help.c:425
+msgid "A Git glossary"
+msgstr "Un glossari de Git"
+
+#: builtin/help.c:426
+msgid "Specifies intentionally untracked files to ignore"
+msgstr "Especifica fitxers intencionalment no seguits que ignorar"
+
+#: builtin/help.c:427
+msgid "Defining submodule properties"
+msgstr "La definició dels propietats de submòduls"
+
+#: builtin/help.c:428
+msgid "Specifying revisions and ranges for Git"
+msgstr "L'especificació de revisions i rangs per a Git"
+
+#: builtin/help.c:429
+msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
+msgstr "Una introducció tutorial a Git (per a la versió 1.5.1 o més nou)"
+
+#: builtin/help.c:430
+msgid "An overview of recommended workflows with Git"
+msgstr "Una visió de conjunt de fluxos de treball recomanats amb Git"
+
+#: builtin/help.c:442
+msgid "The common Git guides are:\n"
+msgstr "Les guies de Git comunes són:\n"
+
+#: builtin/help.c:463 builtin/help.c:480
+#, c-format
+msgid "usage: %s%s"
+msgstr "ús: %s%s"
+
+#: builtin/help.c:496
+#, c-format
+msgid "`git %s' is aliased to `%s'"
+msgstr "`git %s' és àlies a `%s'"
+
+#: builtin/index-pack.c:145
+#, c-format
+msgid "unable to open %s"
+msgstr "incapaç d'obrir %s"
+
+#: builtin/index-pack.c:191
+#, c-format
+msgid "object type mismatch at %s"
+msgstr "discordança de tipus d'objecte a %s"
+
+#: builtin/index-pack.c:211
+#, c-format
+msgid "did not receive expected object %s"
+msgstr "no s'ha rebut l'objecte esperat %s"
+
+#: builtin/index-pack.c:214
+#, c-format
+msgid "object %s: expected type %s, found %s"
+msgstr "objecte %s: tipus %s esperat, %s trobat"
+
+#: builtin/index-pack.c:256
+#, c-format
+msgid "cannot fill %d byte"
+msgid_plural "cannot fill %d bytes"
+msgstr[0] "no es pot omplir %d octet"
+msgstr[1] "no es pot omplir %d octets"
+
+#: builtin/index-pack.c:266
+msgid "early EOF"
+msgstr "EOF aviat"
+
+#: builtin/index-pack.c:267
+msgid "read error on input"
+msgstr "error de lectura d'entrada"
+
+#: builtin/index-pack.c:279
+msgid "used more bytes than were available"
+msgstr "més octets utilitzats que estaven disponibles"
+
+#: builtin/index-pack.c:286
+msgid "pack too large for current definition of off_t"
+msgstr "paquet massa gran per a la definició actual d'off_t"
+
+#: builtin/index-pack.c:302
+#, c-format
+msgid "unable to create '%s'"
+msgstr "no es pot crear '%s'"
+
+#: builtin/index-pack.c:307
+#, c-format
+msgid "cannot open packfile '%s'"
+msgstr "no es pot obrir el fitxer de paquet '%s'"
+
+#: builtin/index-pack.c:321
+msgid "pack signature mismatch"
+msgstr "discordança de firma de paquet"
+
+#: builtin/index-pack.c:323
+#, c-format
+msgid "pack version %<PRIu32> unsupported"
+msgstr "versió de paquet %<PRIu32> no suportada"
+
+#: builtin/index-pack.c:341
+#, c-format
+msgid "pack has bad object at offset %lu: %s"
+msgstr "el paquet té un objecte dolent a desplaçament %lu: %s"
+
+#: builtin/index-pack.c:462
+#, c-format
+msgid "inflate returned %d"
+msgstr "la inflació ha retornat %d"
+
+#: builtin/index-pack.c:511
+msgid "offset value overflow for delta base object"
+msgstr "desbordament de valor de desplaçament per a l'objecte base de delta"
+
+#: builtin/index-pack.c:519
+msgid "delta base offset is out of bound"
+msgstr "desplaçament de base de delta està fora de límits"
+
+#: builtin/index-pack.c:527
+#, c-format
+msgid "unknown object type %d"
+msgstr "tipus d'objecte desconegut %d"
+
+#: builtin/index-pack.c:558
+msgid "cannot pread pack file"
+msgstr "no es pot fer pread en en fitxer de paquet"
+
+#: builtin/index-pack.c:560
+#, c-format
+msgid "premature end of pack file, %lu byte missing"
+msgid_plural "premature end of pack file, %lu bytes missing"
+msgstr[0] "fin prematur de fitxer de paquet, manca %lu octet"
+msgstr[1] "fin prematur de fitxer de paquet, manquen %lu octets"
+
+#: builtin/index-pack.c:586
+msgid "serious inflate inconsistency"
+msgstr "inconsistència d'inflació seria"
+
+#: builtin/index-pack.c:677 builtin/index-pack.c:683 builtin/index-pack.c:706
+#: builtin/index-pack.c:740 builtin/index-pack.c:749
+#, c-format
+msgid "SHA1 COLLISION FOUND WITH %s !"
+msgstr "COL·LISIÓ SHA1 TROBAT AMB %s !"
+
+#: builtin/index-pack.c:680 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
+#, c-format
+msgid "unable to read %s"
+msgstr "incapaç de llegir %s"
+
+#: builtin/index-pack.c:746
+#, c-format
+msgid "cannot read existing object %s"
+msgstr "no es pot llegir l'objecte existent %s"
+
+#: builtin/index-pack.c:760
+#, c-format
+msgid "invalid blob object %s"
+msgstr "objecte de blob invàlid %s"
+
+#: builtin/index-pack.c:774
+#, c-format
+msgid "invalid %s"
+msgstr "%s invàlid"
+
+#: builtin/index-pack.c:777
+msgid "Error in object"
+msgstr "Error en objecte"
+
+#: builtin/index-pack.c:779
+#, c-format
+msgid "Not all child objects of %s are reachable"
+msgstr "No tots els objectes fills de %s són abastables"
+
+#: builtin/index-pack.c:851 builtin/index-pack.c:881
+msgid "failed to apply delta"
+msgstr "s'ha fallat al aplicar delta"
+
+#: builtin/index-pack.c:1022
+msgid "Receiving objects"
+msgstr "Rebent objectes"
+
+#: builtin/index-pack.c:1022
+msgid "Indexing objects"
+msgstr "Indexant objectes"
+
+#: builtin/index-pack.c:1048
+msgid "pack is corrupted (SHA1 mismatch)"
+msgstr "el paquet és corromput (discordança SHA1)"
+
+#: builtin/index-pack.c:1053
+msgid "cannot fstat packfile"
+msgstr "no es pot fer fstat en en fitxer de paquet"
+
+#: builtin/index-pack.c:1056
+msgid "pack has junk at the end"
+msgstr "el paquet té brossa al final"
+
+#: builtin/index-pack.c:1067
+msgid "confusion beyond insanity in parse_pack_objects()"
+msgstr "confusió més enllà de la insanitat en parse_pack_objects()"
+
+#: builtin/index-pack.c:1090
+msgid "Resolving deltas"
+msgstr "Resolent les deltes"
+
+#: builtin/index-pack.c:1100
+#, c-format
+msgid "unable to create thread: %s"
+msgstr "incapaç de crear fil: %s"
+
+#: builtin/index-pack.c:1142
+msgid "confusion beyond insanity"
+msgstr "confusió més enllà de la insanitat"
+
+#: builtin/index-pack.c:1150
+#, c-format
+msgid "completed with %d local objects"
+msgstr "terminat amb %d objectes locals"
+
+#: builtin/index-pack.c:1160
+#, c-format
+msgid "Unexpected tail checksum for %s (disk corruption?)"
+msgstr "Suma de verificació final no esperada per a %s (corrupció de disc?)"
+
+#: builtin/index-pack.c:1164
+#, c-format
+msgid "pack has %d unresolved delta"
+msgid_plural "pack has %d unresolved deltas"
+msgstr[0] "El paquet té %d delta no resolta"
+msgstr[1] "El paquet té %d deltes no resoltes"
+
+#: builtin/index-pack.c:1189
+#, c-format
+msgid "unable to deflate appended object (%d)"
+msgstr "incapaç de desinflar l'objecte annexat (%d)"
+
+#: builtin/index-pack.c:1268
+#, c-format
+msgid "local object %s is corrupt"
+msgstr "l'objecte local %s és corrupte"
+
+#: builtin/index-pack.c:1292
+msgid "error while closing pack file"
+msgstr "error al tancar el fitxer de paquet"
+
+#: builtin/index-pack.c:1305
+#, c-format
+msgid "cannot write keep file '%s'"
+msgstr "no es pot escriure el fitxer que retenir '%s'"
+
+#: builtin/index-pack.c:1313
+#, c-format
+msgid "cannot close written keep file '%s'"
+msgstr "no es pot tancar el fitxer que retenir escrit '%s'"
+
+#: builtin/index-pack.c:1326
+msgid "cannot store pack file"
+msgstr "no es pot emmagatzemar el fitxer de paquet"
+
+#: builtin/index-pack.c:1337
+msgid "cannot store index file"
+msgstr "no es pot emmagatzemar el fitxer d'índex"
+
+#: builtin/index-pack.c:1370
+#, c-format
+msgid "bad pack.indexversion=%<PRIu32>"
+msgstr "pack.indexversion=%<PRIu32> dolent"
+
+#: builtin/index-pack.c:1376
+#, c-format
+msgid "invalid number of threads specified (%d)"
+msgstr "nombre de fils invàlid especificat (%d)"
+
+#: builtin/index-pack.c:1380 builtin/index-pack.c:1559
+#, c-format
+msgid "no threads support, ignoring %s"
+msgstr "cap suport de fils, ignorant %s"
+
+#: builtin/index-pack.c:1438
+#, c-format
+msgid "Cannot open existing pack file '%s'"
+msgstr "No es pot obrir el fitxer de paquet existent '%s'"
+
+#: builtin/index-pack.c:1440
+#, c-format
+msgid "Cannot open existing pack idx file for '%s'"
+msgstr "No es pot obrir el fitxer d'índex de paquets existent de '%s'"
+
+#: builtin/index-pack.c:1487
+#, c-format
+msgid "non delta: %d object"
+msgid_plural "non delta: %d objects"
+msgstr[0] "sense delta: %d objecte"
+msgstr[1] "sense delta: %d objectes"
+
+#: builtin/index-pack.c:1494
+#, c-format
+msgid "chain length = %d: %lu object"
+msgid_plural "chain length = %d: %lu objects"
+msgstr[0] "longitud de cadena = %d: %lu objecte"
+msgstr[1] "longitud de cadena = %d: %lu objectes"
+
+#: builtin/index-pack.c:1523
+msgid "Cannot come back to cwd"
+msgstr "No es pot tornar al directori de treball actual"
+
+#: builtin/index-pack.c:1571 builtin/index-pack.c:1574
+#: builtin/index-pack.c:1586 builtin/index-pack.c:1590
+#, c-format
+msgid "bad %s"
+msgstr "%s dolent"
+
+#: builtin/index-pack.c:1604
+msgid "--fix-thin cannot be used without --stdin"
+msgstr "--fix-thin no es pot utilitzar sense --stdin"
+
+#: builtin/index-pack.c:1608 builtin/index-pack.c:1617
+#, c-format
+msgid "packfile name '%s' does not end with '.pack'"
+msgstr "el nom de fitxer de paquet '%s' no termina amb '.pack'"
+
+#: builtin/index-pack.c:1625
+msgid "--verify with no packfile name given"
+msgstr "--verify donat sense nom de fitxer de paquet"
+
+#: builtin/init-db.c:35
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr "No s'ha pogut fer %s escrivible pel grup"
+
+#: builtin/init-db.c:62
+#, c-format
+msgid "insanely long template name %s"
+msgstr "nom de plantilla insanament llarg %s"
+
+#: builtin/init-db.c:67
+#, c-format
+msgid "cannot stat '%s'"
+msgstr "no es pot fer stat en '%s'"
+
+#: builtin/init-db.c:73
+#, c-format
+msgid "cannot stat template '%s'"
+msgstr "no es pot fer stat en la plantilla '%s'"
+
+#: builtin/init-db.c:80
+#, c-format
+msgid "cannot opendir '%s'"
+msgstr "no es pot fer opendir en el directori '%s'"
+
+#: builtin/init-db.c:97
+#, c-format
+msgid "cannot readlink '%s'"
+msgstr "no es pot fer readlink en '%s'"
+
+#: builtin/init-db.c:99
+#, c-format
+msgid "insanely long symlink %s"
+msgstr "enllaç simbòlic insanament llarg %s"
+
+#: builtin/init-db.c:102
+#, c-format
+msgid "cannot symlink '%s' '%s'"
+msgstr "no es pot fer symlink en '%s' '%s'"
+
+#: builtin/init-db.c:106
+#, c-format
+msgid "cannot copy '%s' to '%s'"
+msgstr "no es pot copiar '%s' a '%s'"
+
+#: builtin/init-db.c:110
+#, c-format
+msgid "ignoring template %s"
+msgstr "ignorant la plantilla %s"
+
+#: builtin/init-db.c:133
+#, c-format
+msgid "insanely long template path %s"
+msgstr "enllaç ruta de plantilla %s"
+
+#: builtin/init-db.c:141
+#, c-format
+msgid "templates not found %s"
+msgstr "plantilles no trobades %s"
+
+#: builtin/init-db.c:154
+#, 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:192
+#, c-format
+msgid "insane git directory %s"
+msgstr "directori de git boig %s"
+
+#: builtin/init-db.c:323 builtin/init-db.c:326
+#, c-format
+msgid "%s already exists"
+msgstr "%s ja existeix"
+
+#: builtin/init-db.c:355
+#, c-format
+msgid "unable to handle file type %d"
+msgstr "incapaç de manejar el tipus de fitxer %d"
+
+#: builtin/init-db.c:358
+#, c-format
+msgid "unable to move %s to %s"
+msgstr "incapaç de moure %s a %s"
+
+#. TRANSLATORS: The first '%s' is either "Reinitialized
+#. existing" or "Initialized empty", the second " shared" or
+#. "", and the last '%s%s' is the verbatim directory name.
+#: builtin/init-db.c:418
+#, c-format
+msgid "%s%s Git repository in %s%s\n"
+msgstr "%s%s repositori de Git en %s%s\n"
+
+#: builtin/init-db.c:419
+msgid "Reinitialized existing"
+msgstr "Reinicialitzat existent"
+
+#: builtin/init-db.c:419
+msgid "Initialized empty"
+msgstr "Inicialitzat buit"
+
+#: builtin/init-db.c:420
+msgid " shared"
+msgstr " compartit"
+
+#: builtin/init-db.c:439
+msgid "cannot tell cwd"
+msgstr "no es pot determinar el directori de treball actual"
+
+#: builtin/init-db.c:465
+msgid ""
+"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
+"shared[=<permissions>]] [directory]"
+msgstr ""
+"git init [-q | --quiet] [--bare] [--template=<directori-de-plantilla>] [--"
+"shared[=<permisos>]] [directori]"
+
+#: builtin/init-db.c:488
+msgid "permissions"
+msgstr "permisos"
+
+#: builtin/init-db.c:489
+msgid "specify that the git repository is to be shared amongst several users"
+msgstr ""
+"especifica que el repositori de git es compartirà entre diversos usuaris"
+
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:172
+msgid "be quiet"
+msgstr "calla"
+
+#: builtin/init-db.c:523 builtin/init-db.c:528
+#, c-format
+msgid "cannot mkdir %s"
+msgstr "no es pot mkdir %s"
+
+#: builtin/init-db.c:532
+#, c-format
+msgid "cannot chdir to %s"
+msgstr "no es pot chdir a %s"
+
+#: builtin/init-db.c:554
+#, c-format
+msgid ""
+"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
+"dir=<directory>)"
+msgstr ""
+"no es permet %s (o --work-tree=<directori>) sense especificar %s (o --git-"
+"dir=<directori>)"
+
+#: builtin/init-db.c:578
+msgid "Cannot access current working directory"
+msgstr "No es pot accedir al directori de treball corrent"
+
+#: builtin/init-db.c:585
+#, c-format
+msgid "Cannot access work tree '%s'"
+msgstr "No es pot accedir al arbre de treball '%s'"
+
+#: builtin/log.c:41
+msgid "git log [<options>] [<revision range>] [[--] <path>...]\n"
+msgstr "git log [<opcions>] [<rang de revisions>] [[--] <ruta>...]\n"
+
+#: builtin/log.c:42
+msgid "   or: git show [options] <object>..."
+msgstr "   o: git show [opcions] <objecte>..."
+
+#: builtin/log.c:127
+msgid "suppress diff output"
+msgstr "omet la sortida de diferències"
+
+#: builtin/log.c:128
+msgid "show source"
+msgstr "mostra el fons"
+
+#: builtin/log.c:129
+msgid "Use mail map file"
+msgstr "Utilitza fitxer de mapa de correu"
+
+#: builtin/log.c:130
+msgid "decorate options"
+msgstr "opcions de decoració"
+
+#: builtin/log.c:229
+#, c-format
+msgid "Final output: %d %s\n"
+msgstr "Sortida final: %d %s\n"
+
+#: builtin/log.c:470 builtin/log.c:562
+#, c-format
+msgid "Could not read object %s"
+msgstr "No es pot llegir l'objecte %s"
+
+#: builtin/log.c:586
+#, c-format
+msgid "Unknown type: %d"
+msgstr "Tipus desconegut: %d"
+
+#: builtin/log.c:687
+msgid "format.headers without value"
+msgstr "format.headers sense valor"
+
+#: builtin/log.c:771
+msgid "name of output directory is too long"
+msgstr "el nom del directori de sortida és massa llarg"
+
+#: builtin/log.c:787
+#, c-format
+msgid "Cannot open patch file %s"
+msgstr "No es pot obrir el fitxer de pedaç %s"
+
+#: builtin/log.c:801
+msgid "Need exactly one range."
+msgstr "Cal exactament un rang."
+
+#: builtin/log.c:809
+msgid "Not a range."
+msgstr "No és un rang."
+
+#: builtin/log.c:916
+msgid "Cover letter needs email format"
+msgstr "La carta de presentació necessita el format de correu electrònic"
+
+#: builtin/log.c:995
+#, c-format
+msgid "insane in-reply-to: %s"
+msgstr "in-reply-to boig: %s"
+
+#: builtin/log.c:1023
+msgid "git format-patch [options] [<since> | <revision range>]"
+msgstr "git format-patch [opcions] [<des de> | <rang de revisions>]"
+
+#: builtin/log.c:1068
+msgid "Two output directories?"
+msgstr "Dos directoris de sortida?"
+
+#: builtin/log.c:1183
+msgid "use [PATCH n/m] even with a single patch"
+msgstr "utilitza [PATCH n/m] encara amb un pedaç solter"
+
+#: builtin/log.c:1186
+msgid "use [PATCH] even with multiple patches"
+msgstr "utilitza [PATCH] encara amb múltiples pedaços"
+
+#: builtin/log.c:1190
+msgid "print patches to standard out"
+msgstr "imprimeix els pedaços al sortida estàndard"
+
+#: builtin/log.c:1192
+msgid "generate a cover letter"
+msgstr "genera una carta de presentació"
+
+#: builtin/log.c:1194
+msgid "use simple number sequence for output file names"
+msgstr "utilitza una seqüència de números per als noms dels fitxers de sortida"
+
+#: builtin/log.c:1195
+msgid "sfx"
+msgstr "sufix"
+
+#: builtin/log.c:1196
+msgid "use <sfx> instead of '.patch'"
+msgstr "utilitza <sufix> en lloc de '.patch'"
+
+#: builtin/log.c:1198
+msgid "start numbering patches at <n> instead of 1"
+msgstr "comença nombrant els pedaços a <n> en lloc d'1"
+
+#: builtin/log.c:1200
+msgid "mark the series as Nth re-roll"
+msgstr "marca la sèrie com la Nª llançada"
+
+#: builtin/log.c:1202
+msgid "Use [<prefix>] instead of [PATCH]"
+msgstr "Utilitza [<prefix>] en lloc de [PATCH]"
+
+#: builtin/log.c:1205
+msgid "store resulting files in <dir>"
+msgstr "emmagatzema els fitxers resultants en <directori>"
+
+#: builtin/log.c:1208
+msgid "don't strip/add [PATCH]"
+msgstr "no despullis/afegeixis [PATCH]"
+
+#: builtin/log.c:1211
+msgid "don't output binary diffs"
+msgstr "no emetis diferències binàries"
+
+#: builtin/log.c:1213
+msgid "don't include a patch matching a commit upstream"
+msgstr "no incloguis un pedaç que coincideixi amb una comissió a la font"
+
+#: builtin/log.c:1215
+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:1217
+msgid "Messaging"
+msgstr "Missatgeria"
+
+#: builtin/log.c:1218
+msgid "header"
+msgstr "capçalera"
+
+#: builtin/log.c:1219
+msgid "add email header"
+msgstr "afegeix capçalera de correu electrònic"
+
+#: builtin/log.c:1220 builtin/log.c:1222
+msgid "email"
+msgstr "correu electrònic"
+
+#: builtin/log.c:1220
+msgid "add To: header"
+msgstr "afegeix capçalera To:"
+
+#: builtin/log.c:1222
+msgid "add Cc: header"
+msgstr "afegeix capçalera Cc:"
+
+#: builtin/log.c:1224
+msgid "ident"
+msgstr "identitat"
+
+#: builtin/log.c:1225
+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 absent)"
+
+#: builtin/log.c:1227
+msgid "message-id"
+msgstr "ID de missatge"
+
+#: builtin/log.c:1228
+msgid "make first mail a reply to <message-id>"
+msgstr "fes el primer missatge una resposta a <ID de missatge>"
+
+#: builtin/log.c:1229 builtin/log.c:1232
+msgid "boundary"
+msgstr "límit"
+
+#: builtin/log.c:1230
+msgid "attach the patch"
+msgstr "ajunta el pedaç"
+
+#: builtin/log.c:1233
+msgid "inline the patch"
+msgstr "posa el pedaç en el cos"
+
+#: builtin/log.c:1237
+msgid "enable message threading, styles: shallow, deep"
+msgstr "habilita l'enfilada de missatges, estils: shallow, deep"
+
+#: builtin/log.c:1239
+msgid "signature"
+msgstr "firma"
+
+#: builtin/log.c:1240
+msgid "add a signature"
+msgstr "afegeix una firma"
+
+#: builtin/log.c:1242
+msgid "add a signature from a file"
+msgstr "afegeix una firma des d'un fitxer"
+
+#: builtin/log.c:1243
+msgid "don't print the patch filenames"
+msgstr "no imprimeixis els noms de fitxer del pedaç"
+
+#: builtin/log.c:1317
+#, c-format
+msgid "invalid ident line: %s"
+msgstr "línia d'identitat invàlida: %s"
+
+#: builtin/log.c:1332
+msgid "-n and -k are mutually exclusive."
+msgstr "-n i -k són mutualment exclusius."
+
+#: builtin/log.c:1334
+msgid "--subject-prefix and -k are mutually exclusive."
+msgstr "--subject-prefix i -k són mutualment exclusius."
+
+#: builtin/log.c:1342
+msgid "--name-only does not make sense"
+msgstr "--name-only no té sentit"
+
+#: builtin/log.c:1344
+msgid "--name-status does not make sense"
+msgstr "--name-status no té sentit"
+
+#: builtin/log.c:1346
+msgid "--check does not make sense"
+msgstr "--check no té sentit"
+
+#: builtin/log.c:1369
+msgid "standard output, or directory, which one?"
+msgstr "sortida estàndard, o directori, qual?"
+
+#: builtin/log.c:1371
+#, c-format
+msgid "Could not create directory '%s'"
+msgstr "No s'ha pogut crear el directori '%s'"
+
+#: builtin/log.c:1468
+#, c-format
+msgid "unable to read signature file '%s'"
+msgstr "incapaç de llegir el fitxer de firma '%s'"
+
+#: builtin/log.c:1531
+msgid "Failed to create output files"
+msgstr "S'ha fallat al crear fitxers de sortida"
+
+#: builtin/log.c:1579
+msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
+msgstr "git cherry [-v] [<font> [<cap> [<límit>]]]"
+
+#: builtin/log.c:1634
+#, c-format
+msgid ""
+"Could not find a tracked remote branch, please specify <upstream> manually.\n"
+msgstr ""
+"No s'ha pogut trobar una rama remota seguida, si us plau, especifiqueu "
+"<font> manualment.\n"
+
+#: builtin/log.c:1647 builtin/log.c:1649 builtin/log.c:1661
+#, c-format
+msgid "Unknown commit %s"
+msgstr "Comissió desconeguda %s"
+
+#: builtin/ls-files.c:401
+msgid "git ls-files [options] [<file>...]"
+msgstr "git ls-files [opcions] [<fitxer>...]"
+
+#: builtin/ls-files.c:458
+msgid "identify the file status with tags"
+msgstr "identifica l'estat de fitxer amb etiquetes"
+
+#: builtin/ls-files.c:460
+msgid "use lowercase letters for 'assume unchanged' files"
+msgstr "utilitza lletres minúscules per als fitxers 'assume unchanged'"
+
+#: builtin/ls-files.c:462
+msgid "show cached files in the output (default)"
+msgstr "mostra els fitxers en cau en la sortida (per defecte)"
+
+#: builtin/ls-files.c:464
+msgid "show deleted files in the output"
+msgstr "mostra els fitxers suprimits en la sortida"
+
+#: builtin/ls-files.c:466
+msgid "show modified files in the output"
+msgstr "mostra els fitxers modificats en la sortida"
+
+#: builtin/ls-files.c:468
+msgid "show other files in the output"
+msgstr "mostra els altres fitxers en la sortida"
+
+#: builtin/ls-files.c:470
+msgid "show ignored files in the output"
+msgstr "mostra els fitxers ignorats en la sortida"
+
+#: builtin/ls-files.c:473
+msgid "show staged contents' object name in the output"
+msgstr "mostra el nom d'objecte dels continguts allistats en la sortida"
+
+#: builtin/ls-files.c:475
+msgid "show files on the filesystem that need to be removed"
+msgstr "mostra els fitxers en el sistema de fitxers que s'han de treure"
+
+#: builtin/ls-files.c:477
+msgid "show 'other' directories' name only"
+msgstr "mostra només els noms dels directoris 'other'"
+
+#: builtin/ls-files.c:480
+msgid "don't show empty directories"
+msgstr "no mostris directoris buits"
+
+#: builtin/ls-files.c:483
+msgid "show unmerged files in the output"
+msgstr "mostra els fitxers sense fusionar en la sortida"
+
+#: builtin/ls-files.c:485
+msgid "show resolve-undo information"
+msgstr "mostra la informació de resolució de desfet"
+
+#: builtin/ls-files.c:487
+msgid "skip files matching pattern"
+msgstr "salta els fitxers coincidents amb el patró"
+
+#: builtin/ls-files.c:490
+msgid "exclude patterns are read from <file>"
+msgstr "els patrons d'exclusió es llegeixen de <fitxer>"
+
+#: builtin/ls-files.c:493
+msgid "read additional per-directory exclude patterns in <file>"
+msgstr "llegeix els patrons d'exclusió per directori addicionals en <fitxer>"
+
+#: builtin/ls-files.c:495
+msgid "add the standard git exclusions"
+msgstr "afegeix les exclusions estàndards de git"
+
+#: builtin/ls-files.c:498
+msgid "make the output relative to the project top directory"
+msgstr "fes que la sortida sigui relativa al directori superior del project"
+
+#: builtin/ls-files.c:501
+msgid "if any <file> is not in the index, treat this as an error"
+msgstr "si qualsevol <fitxer> no està en l'índex, tracta això com error"
+
+#: builtin/ls-files.c:502
+msgid "tree-ish"
+msgstr "arbre"
+
+#: builtin/ls-files.c:503
+msgid "pretend that paths removed since <tree-ish> are still present"
+msgstr ""
+"pretenguis que les rutes tretes deprés de <arbre> encara estiguin presents"
+
+#: builtin/ls-files.c:505
+msgid "show debugging data"
+msgstr "mostra dades de depuració"
+
+#: builtin/ls-tree.c:28
+msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
+msgstr "git ls-tree [<opcions>] <arbre> [<ruta>...]"
+
+#: builtin/ls-tree.c:126
+msgid "only show trees"
+msgstr "mostra només els arbres"
+
+#: builtin/ls-tree.c:128
+msgid "recurse into subtrees"
+msgstr "recursa a subarbres"
+
+#: builtin/ls-tree.c:130
+msgid "show trees when recursing"
+msgstr "mostra els arbres al recursar"
+
+#: builtin/ls-tree.c:133
+msgid "terminate entries with NUL byte"
+msgstr "termina les entrades amb un octet NUL"
+
+#: builtin/ls-tree.c:134
+msgid "include object size"
+msgstr "mida de l'objecte d'inclusió"
+
+#: builtin/ls-tree.c:136 builtin/ls-tree.c:138
+msgid "list only filenames"
+msgstr "llista només noms de fitxer"
+
+#: builtin/ls-tree.c:141
+msgid "use full path names"
+msgstr "utilitza noms de ruta compets"
+
+#: builtin/ls-tree.c:143
+msgid "list entire tree; not just current directory (implies --full-name)"
+msgstr "llista l'arbre enter; no sol el directori actual (implica --full-name)"
+
+#: builtin/merge.c:43
+msgid "git merge [options] [<commit>...]"
+msgstr "git merge [opcions] [<comissió>...]"
+
+#: builtin/merge.c:44
+msgid "git merge [options] <msg> HEAD <commit>"
+msgstr "git merge [opcions] <missatge> HEAD <comissió>"
+
+#: builtin/merge.c:45
+msgid "git merge --abort"
+msgstr "git merge --abort"
+
+#: builtin/merge.c:98
+msgid "switch `m' requires a value"
+msgstr "l'opció `m' requereix un valor"
+
+#: builtin/merge.c:135
+#, c-format
+msgid "Could not find merge strategy '%s'.\n"
+msgstr "No s'ha pogut trobar l'estratègia de fusió '%s'.\n"
+
+#: builtin/merge.c:136
+#, c-format
+msgid "Available strategies are:"
+msgstr "Les estratègies disponibles són:"
+
+#: builtin/merge.c:141
+#, c-format
+msgid "Available custom strategies are:"
+msgstr "Les estratègies personalitzades disponibles són:"
+
+#: builtin/merge.c:191
+msgid "do not show a diffstat at the end of the merge"
+msgstr "no mostris les estadístiques de diferència al final de la fusió"
+
+#: builtin/merge.c:194
+msgid "show a diffstat at the end of the merge"
+msgstr "mostra les estadístiques de diferència al final de la fusió"
+
+#: builtin/merge.c:195
+msgid "(synonym to --stat)"
+msgstr "(sinònim de --stat)"
+
+#: builtin/merge.c:197
+msgid "add (at most <n>) entries from shortlog to merge commit message"
+msgstr ""
+"afegeix (com màxim <n>) entrades del registre curt per fusionar el missatge "
+"de comissió"
+
+#: builtin/merge.c:200
+msgid "create a single commit instead of doing a merge"
+msgstr "crea una comissió soltera en lloc de fusionar"
+
+#: builtin/merge.c:202
+msgid "perform a commit if the merge succeeds (default)"
+msgstr "realitza una comissió si la fusió té èxit (per defecte)"
+
+#: builtin/merge.c:204
+msgid "edit message before committing"
+msgstr "edita el missatge abans de cometre"
+
+#: builtin/merge.c:205
+msgid "allow fast-forward (default)"
+msgstr "permet l'avanç ràpid (per defecte)"
+
+#: builtin/merge.c:207
+msgid "abort if fast-forward is not possible"
+msgstr "avorta si l'avanç ràpid no és possible"
+
+#: builtin/merge.c:211
+msgid "Verify that the named commit has a valid GPG signature"
+msgstr "Verifica que la comissió anomenada té una firma GPG vàlida"
+
+#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
+msgid "strategy"
+msgstr "estratègia"
+
+#: builtin/merge.c:213
+msgid "merge strategy to use"
+msgstr "estratègia de fusió que utilitzar"
+
+#: builtin/merge.c:214
+msgid "option=value"
+msgstr "opció=valor"
+
+#: builtin/merge.c:215
+msgid "option for selected merge strategy"
+msgstr "opció per a l'estratègia de fusió seleccionada"
+
+#: builtin/merge.c:217
+msgid "merge commit message (for a non-fast-forward merge)"
+msgstr "missatge de comissió de fusió (per a una fusió no de avanç ràpid)"
+
+#: builtin/merge.c:221
+msgid "abort the current in-progress merge"
+msgstr "avorta la fusió en curs actual"
+
+#: builtin/merge.c:250
+msgid "could not run stash."
+msgstr "no s'ha pogut executar stash."
+
+#: builtin/merge.c:255
+msgid "stash failed"
+msgstr "L'emmagatzemament ha fallat."
+
+#: builtin/merge.c:260
+#, c-format
+msgid "not a valid object: %s"
+msgstr "no és un objecte vàlid: %s"
+
+#: builtin/merge.c:279 builtin/merge.c:296
+msgid "read-tree failed"
+msgstr "read-tree ha fallat"
+
+#: builtin/merge.c:326
+msgid " (nothing to squash)"
+msgstr " (res que aixafar)"
+
+#: builtin/merge.c:339
+#, c-format
+msgid "Squash commit -- not updating HEAD\n"
+msgstr "Comissió d'aixafada -- no actualitzant HEAD\n"
+
+#: builtin/merge.c:371
+msgid "Writing SQUASH_MSG"
+msgstr "Escrivint SQUASH_MSG"
+
+#: builtin/merge.c:373
+msgid "Finishing SQUASH_MSG"
+msgstr "Terminant SQUASH_MSG"
+
+#: builtin/merge.c:396
+#, c-format
+msgid "No merge message -- not updating HEAD\n"
+msgstr "Cap missatge de fusió -- no actualitzant HEAD\n"
+
+#: builtin/merge.c:446
+#, c-format
+msgid "'%s' does not point to a commit"
+msgstr "'%s' no assenyala una comissió"
+
+#: builtin/merge.c:558
+#, c-format
+msgid "Bad branch.%s.mergeoptions string: %s"
+msgstr "Cadena branch.%s.mergeoptions dolenta: %s"
+
+#: builtin/merge.c:653
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree ha fallat al escriure un arbre"
+
+#: builtin/merge.c:678
+msgid "Not handling anything other than two heads merge."
+msgstr "No manejant res apart de la fusió de dos caps."
+
+#: builtin/merge.c:692
+#, c-format
+msgid "Unknown option for merge-recursive: -X%s"
+msgstr "Opció desconeguda de merge-recursive: -X%s"
+
+#: builtin/merge.c:705
+#, c-format
+msgid "unable to write %s"
+msgstr "incapaç d'escriure %s"
+
+#: builtin/merge.c:794
+#, c-format
+msgid "Could not read from '%s'"
+msgstr "No s'ha pogut llegir de '%s'"
+
+#: builtin/merge.c:803
+#, c-format
+msgid "Not committing merge; use 'git commit' to complete the merge.\n"
+msgstr "No comitent la fusió; utilitzeu 'git commit' per terminar la fusió.\n"
+
+#: builtin/merge.c:809
+#, 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 ""
+"Si us plau, introduïu un missatge de comissió per a explicar per què\n"
+"aquesta fusió és necessari, especialment si fusiona una font\n"
+"actualitzada a una rama temàtica.\n"
+"\n"
+"S'ignoraran les línies que comencin amb '%c', i un missatge buit\n"
+"avorta la comissió.\n"
+
+#: builtin/merge.c:833
+msgid "Empty commit message."
+msgstr "Missatge de comissió buit."
+
+#: builtin/merge.c:845
+#, c-format
+msgid "Wonderful.\n"
+msgstr "Meravellós.\n"
+
+#: builtin/merge.c:908
+#, c-format
+msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
+msgstr ""
+"La fusió automàtica ha fallat; arregleu els conflictes i després cometeu el "
+"resultat.\n"
+
+#: builtin/merge.c:924
+#, c-format
+msgid "'%s' is not a commit"
+msgstr "'%s' no és una comissió"
+
+#: builtin/merge.c:965
+msgid "No current branch."
+msgstr "Cap rama actual."
+
+#: builtin/merge.c:967
+msgid "No remote for the current branch."
+msgstr "Cap remot per a la rama actual."
+
+#: builtin/merge.c:969
+msgid "No default upstream defined for the current branch."
+msgstr "Cap font per defecte definida per a la rama actual."
+
+#: builtin/merge.c:974
+#, c-format
+msgid "No remote-tracking branch for %s from %s"
+msgstr "Cap rama de seguiment remot per a %s a %s"
+
+#: builtin/merge.c:1130
+msgid "There is no merge to abort (MERGE_HEAD missing)."
+msgstr "No hi ha fusió que avortar (manca MERGE_HEAD)."
+
+#: builtin/merge.c:1146 git-pull.sh:31
+msgid ""
+"You have not concluded your merge (MERGE_HEAD exists).\n"
+"Please, commit your changes before you can merge."
+msgstr ""
+"No heu terminat la vostra fusió (MERGE_HEAD existeix).\n"
+"Si us plau, cometeu els vostres canvis abans de fusionar."
+
+#: builtin/merge.c:1149 git-pull.sh:34
+msgid "You have not concluded your merge (MERGE_HEAD exists)."
+msgstr "No heu terminat la vostra fusió (MERGE_HEAD existeix)."
+
+#: builtin/merge.c:1153
+msgid ""
+"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
+"Please, commit your changes before you can merge."
+msgstr ""
+"No heu terminat el vostre recull de cireres (CHERRY_PICK_HEAD existeix).\n"
+"Si us plau, cometeu els vostres canvis abans de fusionar."
+
+#: builtin/merge.c:1156
+msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
+msgstr ""
+"No heu terminat el vostre recull de cireres (CHERRY_PICK_HEAD existeix)."
+
+#: builtin/merge.c:1165
+msgid "You cannot combine --squash with --no-ff."
+msgstr "No podeu combinar --squash amb --no-ff."
+
+#: builtin/merge.c:1174
+msgid "No commit specified and merge.defaultToUpstream not set."
+msgstr "Cap comissió especificada i merge.defaultToUpstream no establert."
+
+#: builtin/merge.c:1206
+msgid "Can merge only exactly one commit into empty head"
+msgstr "Es pot fusionar només exactament una comissió a un cap buit"
+
+#: builtin/merge.c:1209
+msgid "Squash commit into empty head not supported yet"
+msgstr "Aixafar una comissió a un cap buit encara no es suporta"
+
+#: builtin/merge.c:1211
+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:1216
+#, c-format
+msgid "%s - not something we can merge"
+msgstr "%s - no és cosa que podem fusionar"
+
+#: builtin/merge.c:1267
+#, c-format
+msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
+msgstr "La comissió %s té una firma GPG no confiada, suposadament de %s."
+
+#: builtin/merge.c:1270
+#, c-format
+msgid "Commit %s has a bad GPG signature allegedly by %s."
+msgstr "La comissió %s té una firma GPG dolenta suposadament per %s."
+
+#: builtin/merge.c:1273
+#, c-format
+msgid "Commit %s does not have a GPG signature."
+msgstr "La comissió %s no té firma GPG."
+
+#: builtin/merge.c:1276
+#, c-format
+msgid "Commit %s has a good GPG signature by %s\n"
+msgstr "La comissió %s té una firma GPG bona per %s\n"
+
+#: builtin/merge.c:1357
+#, c-format
+msgid "Updating %s..%s\n"
+msgstr "Actualizant %s..%s\n"
+
+#: builtin/merge.c:1396
+#, c-format
+msgid "Trying really trivial in-index merge...\n"
+msgstr "Intentant una fusió realment trivial en l'índex...\n"
+
+#: builtin/merge.c:1403
+#, c-format
+msgid "Nope.\n"
+msgstr "No.\n"
+
+#: builtin/merge.c:1435
+msgid "Not possible to fast-forward, aborting."
+msgstr "No és possible avançar ràpidament, avortant."
+
+#: builtin/merge.c:1458 builtin/merge.c:1537
+#, c-format
+msgid "Rewinding the tree to pristine...\n"
+msgstr "Rebobinant l'arbre a la prístina...\n"
+
+#: builtin/merge.c:1462
+#, c-format
+msgid "Trying merge strategy %s...\n"
+msgstr "Intentant l'estratègia de fusió %s...\n"
+
+#: builtin/merge.c:1528
+#, c-format
+msgid "No merge strategy handled the merge.\n"
+msgstr "Cap estratègia de fusió ha manejat la fusió.\n"
+
+#: builtin/merge.c:1530
+#, c-format
+msgid "Merge with strategy %s failed.\n"
+msgstr "L'estratègia de fusió %s ha fallat.\n"
+
+#: builtin/merge.c:1539
+#, c-format
+msgid "Using the %s to prepare resolving by hand.\n"
+msgstr "Utilitzant el %s per preparar la resolució a mà.\n"
+
+#: builtin/merge.c:1551
+#, c-format
+msgid "Automatic merge went well; stopped before committing as requested\n"
+msgstr ""
+"La fusió automàtica ha sortit bé; aturat abans de cometre com demanat\n"
+
+#: builtin/merge-base.c:29
+msgid "git merge-base [-a|--all] <commit> <commit>..."
+msgstr "git merge-base [-a|--all] <comissió> <comissió>..."
+
+#: builtin/merge-base.c:30
+msgid "git merge-base [-a|--all] --octopus <commit>..."
+msgstr "git merge-base [-a|--all] --octopus <comissió>..."
+
+#: builtin/merge-base.c:31
+msgid "git merge-base --independent <commit>..."
+msgstr "git merge-base --independent <comissió>..."
+
+#: builtin/merge-base.c:32
+msgid "git merge-base --is-ancestor <commit> <commit>"
+msgstr "git merge-base --is-ancestor <comissió> <comissió>"
+
+#: builtin/merge-base.c:33
+msgid "git merge-base --fork-point <ref> [<commit>]"
+msgstr "git merge-base --fork-point <referència> [<comissió>]"
+
+#: builtin/merge-base.c:214
+msgid "output all common ancestors"
+msgstr "emet tots els avantpassats comuns"
+
+#: builtin/merge-base.c:216
+msgid "find ancestors for a single n-way merge"
+msgstr "troba els avantpassats per a una fusió de n vies soltera"
+
+#: builtin/merge-base.c:218
+msgid "list revs not reachable from others"
+msgstr "llista les revisions no abastables d'altres"
+
+#: builtin/merge-base.c:220
+msgid "is the first one ancestor of the other?"
+msgstr "és el primer avantpassat de l'altre?"
+
+#: builtin/merge-base.c:222
+msgid "find where <commit> forked from reflog of <ref>"
+msgstr ""
+"troba on <comissió> s'ha bifurcat del registre de referències de <referència>"
+
+#: builtin/merge-file.c:8
+msgid ""
+"git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file "
+"file2"
+msgstr ""
+"git merge-file [opcions] [-L nom1 [-L original [-L nom2]]] fitxer1 "
+"fitxer_original fitxer2"
+
+#: builtin/merge-file.c:33
+msgid "send results to standard output"
+msgstr "envia els resultats a la sortida estàndard"
+
+#: builtin/merge-file.c:34
+msgid "use a diff3 based merge"
+msgstr "utilitza una fusió basada en diff3"
+
+#: builtin/merge-file.c:35
+msgid "for conflicts, use our version"
+msgstr "en conflictes, utilitza la versió nostra"
+
+#: builtin/merge-file.c:37
+msgid "for conflicts, use their version"
+msgstr "en conflictes, utilitza la versió seva"
+
+#: builtin/merge-file.c:39
+msgid "for conflicts, use a union version"
+msgstr "en conflictes, utilitza una versió d'unió"
+
+#: builtin/merge-file.c:42
+msgid "for conflicts, use this marker size"
+msgstr "en conflicte, utilitza aquesta mida de marcador"
+
+#: builtin/merge-file.c:43
+msgid "do not warn about conflicts"
+msgstr "no avisis de conflictes"
+
+#: builtin/merge-file.c:45
+msgid "set labels for file1/orig_file/file2"
+msgstr "estableix les etiquetes per a file1/orig_file/file2"
+
+#: 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 "l'entrada és terminada per NUL"
+
+#: builtin/mktree.c:151 builtin/write-tree.c:24
+msgid "allow missing objects"
+msgstr "permet els objectes mancants"
+
+#: builtin/mktree.c:152
+msgid "allow creation of more than one tree"
+msgstr "permet la creació de més d'un arbre"
+
+#: builtin/mv.c:15
+msgid "git mv [options] <source>... <destination>"
+msgstr "git mv [opcions] <fons>... <destí>"
+
+#: builtin/mv.c:71
+msgid "force move/rename even if target exists"
+msgstr "força moviment/canvi de nom encara que el destí existeixi"
+
+#: builtin/mv.c:72
+msgid "skip move/rename errors"
+msgstr "salta els error de moviment/canvi de nom"
+
+#: builtin/mv.c:122
+#, c-format
+msgid "Checking rename of '%s' to '%s'\n"
+msgstr "Comprovant el canvi de nom de '%s' a '%s'\n"
+
+#: builtin/mv.c:126
+msgid "bad source"
+msgstr "font dolenta"
+
+#: builtin/mv.c:129
+msgid "can not move directory into itself"
+msgstr "no es pot moure un directori al seu mateix"
+
+#: builtin/mv.c:132
+msgid "cannot move directory over file"
+msgstr "no es pot moure un directori sobre un fitxer"
+
+#: builtin/mv.c:138
+#, c-format
+msgid "Huh? Directory %s is in index and no submodule?"
+msgstr "Perdó? El directori %s està en l'índex i no hi ha submòdul?"
+
+#: builtin/mv.c:140 builtin/rm.c:318
+msgid "Please, stage your changes to .gitmodules or stash them to proceed"
+msgstr ""
+"Si us plau, allisteu els vostres canvis a .gitmodules o emmagatzemeu-los per "
+"a procedir"
+
+#: builtin/mv.c:156
+#, c-format
+msgid "Huh? %.*s is in index?"
+msgstr "Perdó? %.*s està en l'índex?"
+
+#: builtin/mv.c:169
+msgid "source directory is empty"
+msgstr "el directori font està buit"
+
+#: builtin/mv.c:205
+msgid "not under version control"
+msgstr "no baix control de versions"
+
+#: builtin/mv.c:208
+msgid "destination exists"
+msgstr "el destí existeix"
+
+#: builtin/mv.c:216
+#, c-format
+msgid "overwriting '%s'"
+msgstr "sobreescrivint '%s'"
+
+#: builtin/mv.c:219
+msgid "Cannot overwrite"
+msgstr "No es pot sobreescriure"
+
+#: builtin/mv.c:222
+msgid "multiple sources for the same target"
+msgstr "múltiples fonts per al mateix destí"
+
+#: builtin/mv.c:224
+msgid "destination directory does not exist"
+msgstr "el directori destí no existeix"
+
+#: builtin/mv.c:244
+#, c-format
+msgid "%s, source=%s, destination=%s"
+msgstr "%s, origen=%s, destí=%s"
+
+#: builtin/mv.c:254
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Canviant el nom de %s a %s\n"
+
+#: builtin/mv.c:257 builtin/remote.c:725 builtin/repack.c:358
+#, c-format
+msgid "renaming '%s' failed"
+msgstr "el canvi del nom de '%s' ha fallat"
+
+#: builtin/name-rev.c:255
+msgid "git name-rev [options] <commit>..."
+msgstr "git name-rev [opcions] <comissió>..."
+
+#: builtin/name-rev.c:256
+msgid "git name-rev [options] --all"
+msgstr "git name-rev [opcions] --all"
+
+#: builtin/name-rev.c:257
+msgid "git name-rev [options] --stdin"
+msgstr "git name-rev [opcions] --stdin"
+
+#: builtin/name-rev.c:309
+msgid "print only names (no SHA-1)"
+msgstr "imprimeix només els noms (cap SHA-1)"
+
+#: builtin/name-rev.c:310
+msgid "only use tags to name the commits"
+msgstr "només utilitza etiquetes per anomenar les comissions"
+
+#: builtin/name-rev.c:312
+msgid "only use refs matching <pattern>"
+msgstr "només utilitza les referències que coincideixen amb <patró>"
+
+#: builtin/name-rev.c:314
+msgid "list all commits reachable from all refs"
+msgstr "llista totes les comissions abastables de totes les referències"
+
+#: builtin/name-rev.c:315
+msgid "read from stdin"
+msgstr "llegeix de stdin"
+
+#: builtin/name-rev.c:316
+msgid "allow to print `undefined` names (default)"
+msgstr "permet imprimir noms `undefined` (per defecte)"
+
+#: builtin/name-rev.c:322
+msgid "dereference tags in the input (internal use)"
+msgstr "dereferencia les etiquetes en l'entrada (ús intern)"
+
+#: builtin/notes.c:24
+msgid "git notes [--ref <notes_ref>] [list [<object>]]"
+msgstr "git notes [--ref <referència_de_notes>] [llista [<objecte>]]"
+
+#: builtin/notes.c:25
+msgid ""
+"git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) "
+"<object>] [<object>]"
+msgstr ""
+"git notes [--ref <referència_de_notes>] add [-f] [-m <missatge> | -F "
+"<fitxer> | (-c | -C) <objecte>] [<objecte>]"
+
+#: builtin/notes.c:26
+msgid "git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>"
+msgstr ""
+"git notes [--ref <referència_de_notes>] copy [-f] <d'objecte> <a-objecte>"
+
+#: builtin/notes.c:27
+msgid ""
+"git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) "
+"<object>] [<object>]"
+msgstr ""
+"git notes [--ref <referència_de_notes>] append [-m <missatge> | -F <fitxer> "
+"| (-c | -C) <objecte>] [<objecte>]"
+
+#: builtin/notes.c:28
+msgid "git notes [--ref <notes_ref>] edit [<object>]"
+msgstr "git notes [--ref <referència_de_notes>] edit [<objecte>]"
+
+#: builtin/notes.c:29
+msgid "git notes [--ref <notes_ref>] show [<object>]"
+msgstr "git notes [--ref <referència_de_notes>] show [<objecte>]"
+
+#: builtin/notes.c:30
+msgid ""
+"git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>"
+msgstr ""
+"git notes [--ref <referència_de_notes>] merge [-v | -q] [-s <estratègia> ] "
+"<referència_de_notes>"
+
+#: builtin/notes.c:31
+msgid "git notes merge --commit [-v | -q]"
+msgstr "git notes merge --commit [-v | -q]"
+
+#: builtin/notes.c:32
+msgid "git notes merge --abort [-v | -q]"
+msgstr "git notes merge --abort [-v | -q]"
+
+#: builtin/notes.c:33
+msgid "git notes [--ref <notes_ref>] remove [<object>...]"
+msgstr "git notes [--ref <referència_de_notes>] remove [<objecte>...]"
+
+#: builtin/notes.c:34
+msgid "git notes [--ref <notes_ref>] prune [-n | -v]"
+msgstr "git notes [--ref <referència_de_notes>] prune [-n | -v]"
+
+#: builtin/notes.c:35
+msgid "git notes [--ref <notes_ref>] get-ref"
+msgstr "git notes [--ref <referència_de_notes>] get-ref"
+
+#: builtin/notes.c:40
+msgid "git notes [list [<object>]]"
+msgstr "git notes [llista [<objecte>]]"
+
+#: builtin/notes.c:45
+msgid "git notes add [<options>] [<object>]"
+msgstr "git notes add [<opcions>] [<objecte>]"
+
+#: builtin/notes.c:50
+msgid "git notes copy [<options>] <from-object> <to-object>"
+msgstr "git notes copy [<options>] <d'objecte> <a-objecte>"
+
+#: builtin/notes.c:51
+msgid "git notes copy --stdin [<from-object> <to-object>]..."
+msgstr "git notes copy --stdin [<d'objecte> <a-objecte>]..."
+
+#: builtin/notes.c:56
+msgid "git notes append [<options>] [<object>]"
+msgstr "git notes append [<opcions>] [<objecte>]"
+
+#: builtin/notes.c:61
+msgid "git notes edit [<object>]"
+msgstr "git notes edit [<objecte>]"
+
+#: builtin/notes.c:66
+msgid "git notes show [<object>]"
+msgstr "git notes show [<objecte>]"
+
+#: builtin/notes.c:71
+msgid "git notes merge [<options>] <notes_ref>"
+msgstr "git notes merge [<opcions>] <referència_de_notes>"
+
+#: builtin/notes.c:72
+msgid "git notes merge --commit [<options>]"
+msgstr "git notes merge --commit [<opcions>]"
+
+#: builtin/notes.c:73
+msgid "git notes merge --abort [<options>]"
+msgstr "git notes merge --abort [<opcions>]"
+
+#: builtin/notes.c:78
+msgid "git notes remove [<object>]"
+msgstr "git notes remove [<objecte>]"
+
+#: builtin/notes.c:83
+msgid "git notes prune [<options>]"
+msgstr "git notes prune [<opcions>]"
+
+#: builtin/notes.c:88
+msgid "git notes get-ref"
+msgstr "git notes get-ref"
+
+#: builtin/notes.c:137
+#, c-format
+msgid "unable to start 'show' for object '%s'"
+msgstr "incapaç d'iniciar 'show' per al objecte '%s'"
+
+#: builtin/notes.c:141
+msgid "could not read 'show' output"
+msgstr "no s'ha pogut llegir la sortida de 'show'"
+
+#: builtin/notes.c:149
+#, c-format
+msgid "failed to finish 'show' for object '%s'"
+msgstr "s'ha fallat al terminar 'show' per al objecte '%s'"
+
+#: builtin/notes.c:167 builtin/tag.c:477
+#, c-format
+msgid "could not create file '%s'"
+msgstr "no s'ha pogut crear el fitxer '%s'"
+
+#: builtin/notes.c:186
+msgid "Please supply the note contents using either -m or -F option"
+msgstr ""
+"Si us plau, proveïu els continguts de la nota utilitzant o l'opció -m o "
+"l'opció -F"
+
+#: builtin/notes.c:207 builtin/notes.c:848
+#, c-format
+msgid "Removing note for object %s\n"
+msgstr "Traient la nota de l'objecte %s\n"
+
+#: builtin/notes.c:212
+msgid "unable to write note object"
+msgstr "incapaç d'escriure l'objecte de nota"
+
+#: builtin/notes.c:214
+#, c-format
+msgid "The note contents has been left in %s"
+msgstr "Els continguts de la nota s'han deixat en %s"
+
+#: builtin/notes.c:248 builtin/tag.c:692
+#, c-format
+msgid "cannot read '%s'"
+msgstr "no es pot llegir '%s'"
+
+#: builtin/notes.c:250 builtin/tag.c:695
+#, c-format
+msgid "could not open or read '%s'"
+msgstr "no s'ha pogut obrir ni llegir '%s'"
+
+#: builtin/notes.c:269 builtin/notes.c:320 builtin/notes.c:322
+#: builtin/notes.c:382 builtin/notes.c:436 builtin/notes.c:519
+#: builtin/notes.c:524 builtin/notes.c:599 builtin/notes.c:641
+#: builtin/notes.c:843 builtin/tag.c:708
+#, c-format
+msgid "Failed to resolve '%s' as a valid ref."
+msgstr "S'ha fallat al resoldre '%s' com referència vàlida."
+
+#: builtin/notes.c:272
+#, c-format
+msgid "Failed to read object '%s'."
+msgstr "S'ha fallat al llegir l'objecte '%s'."
+
+#: builtin/notes.c:276
+#, c-format
+msgid "Cannot read note data from non-blob object '%s'."
+msgstr "No es pot llegir dades de node de l'objecte no de blob '%s'."
+
+#: builtin/notes.c:316
+#, c-format
+msgid "Malformed input line: '%s'."
+msgstr "Línia d'entrada malformada: '%s'."
+
+#: builtin/notes.c:331
+#, c-format
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "S'ha fallat al copiar les notes de '%s' a '%s'"
+
+#: builtin/notes.c:375 builtin/notes.c:429 builtin/notes.c:502
+#: builtin/notes.c:514 builtin/notes.c:587 builtin/notes.c:634
+#: builtin/notes.c:908
+msgid "too many parameters"
+msgstr "massa paràmetres"
+
+#: builtin/notes.c:388 builtin/notes.c:647
+#, c-format
+msgid "No note found for object %s."
+msgstr "Cap nota trobada per a l'objecte %s."
+
+#: builtin/notes.c:410 builtin/notes.c:567
+msgid "note contents as a string"
+msgstr "nota els continguta com cadena"
+
+#: builtin/notes.c:413 builtin/notes.c:570
+msgid "note contents in a file"
+msgstr "nota els continguts en un fitxer"
+
+#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
+#: builtin/notes.c:575 builtin/tag.c:627
+msgid "object"
+msgstr "objecte"
+
+#: builtin/notes.c:416 builtin/notes.c:573
+msgid "reuse and edit specified note object"
+msgstr "reutilitza i edita l'objecte de nota especificat"
+
+#: builtin/notes.c:419 builtin/notes.c:576
+msgid "reuse specified note object"
+msgstr "reutilitza l'objecte de nota especificat"
+
+#: builtin/notes.c:421 builtin/notes.c:489
+msgid "replace existing notes"
+msgstr "reemplaça notes existents"
+
+#: builtin/notes.c:455
+#, c-format
+msgid ""
+"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
+msgstr ""
+"No es pot afegir les notes. S'ha trobat notes existents de l'objecte %s. "
+"Utilitza '-f' per sobreescriure les notes existents."
+
+#: builtin/notes.c:460 builtin/notes.c:537
+#, c-format
+msgid "Overwriting existing notes for object %s\n"
+msgstr "Sobreescrivint les notes existents de l'objecte %s\n"
+
+#: builtin/notes.c:490
+msgid "read objects from stdin"
+msgstr "llegeix els objects des de stdin"
+
+#: builtin/notes.c:492
+msgid "load rewriting config for <command> (implies --stdin)"
+msgstr "carrega configuració de reescriptura per a <ordre> (implica --stdin)"
+
+#: builtin/notes.c:510
+msgid "too few parameters"
+msgstr "massa pocs paràmetres"
+
+#: builtin/notes.c:531
+#, c-format
+msgid ""
+"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
+msgstr ""
+"No es pot copiar les notes. S'ha trobat notes existents de l'objecte %s. "
+"Utilitza '-f' per sobreescriure les notes existents."
+
+#: builtin/notes.c:543
+#, c-format
+msgid "Missing notes on source object %s. Cannot copy."
+msgstr "Manquen notes en l'objecte font %s. No es pot copiar."
+
+#: builtin/notes.c:592
+#, c-format
+msgid ""
+"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
+"Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
+msgstr ""
+"S'han desaprovat les opcions -m/-F/-c/-C del subordre 'edit'.\n"
+"Si us plau, utilitzeu 'git notes add -f -m/-F/-c/-C' en lloc.\n"
+
+#: builtin/notes.c:739
+msgid "General options"
+msgstr "Opcions generals"
+
+#: builtin/notes.c:741
+msgid "Merge options"
+msgstr "Opcions de fusió"
+
+#: builtin/notes.c:743
+msgid ""
+"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
+"cat_sort_uniq)"
+msgstr ""
+"resol conflictes de nota utilitzant l'estratègia donada (manual/ours/theirs/"
+"union/cat_sort_uniq)"
+
+#: builtin/notes.c:745
+msgid "Committing unmerged notes"
+msgstr "Cometent les notes sense fusionar"
+
+#: builtin/notes.c:747
+msgid "finalize notes merge by committing unmerged notes"
+msgstr "finalitza la fusió de notes per cometre les notes sense fusionar"
+
+#: builtin/notes.c:749
+msgid "Aborting notes merge resolution"
+msgstr "Avortant la resolució de fusió de notes"
+
+#: builtin/notes.c:751
+msgid "abort notes merge"
+msgstr "avorta fusió de notes"
+
+#: builtin/notes.c:846
+#, c-format
+msgid "Object %s has no note\n"
+msgstr "L'objecte %s no té cap nota\n"
+
+#: builtin/notes.c:858
+msgid "attempt to remove non-existent note is not an error"
+msgstr "L'intent de treure una nota no existent no és un error"
+
+#: builtin/notes.c:861
+msgid "read object names from the standard input"
+msgstr "llegeix els noms d'objecte des de l'entrada estàndard"
+
+#: builtin/notes.c:942
+msgid "notes-ref"
+msgstr "referència de notes"
+
+#: builtin/notes.c:943
+msgid "use notes from <notes_ref>"
+msgstr "utilitza les notes de <referència de notes>"
+
+#: builtin/notes.c:978 builtin/remote.c:1616
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "Subordre desconegut: %s"
+
+#: builtin/pack-objects.c:25
+msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
+msgstr ""
+"git pack-objects --stdout [opcions...] [< llista-de-referències | < llista-"
+"de-objectes]"
+
+#: builtin/pack-objects.c:26
+msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
+msgstr ""
+"git pack-objects [opcions...] base-name [< llista-de-referències | < llista-"
+"de-objectes]"
+
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
+#, c-format
+msgid "deflate error (%d)"
+msgstr "error de deflació (%d)"
+
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr "Escrivint objectes"
+
+#: builtin/pack-objects.c:1012
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr ""
+"deshabilitant l'escriptura de mapes de bits, perquè alguns objectes no "
+"s'estan empaquetant"
+
+#: builtin/pack-objects.c:2174
+msgid "Compressing objects"
+msgstr "Comprimint objectes"
+
+#: builtin/pack-objects.c:2526
+#, c-format
+msgid "unsupported index version %s"
+msgstr "versió d'índex no suportada %s"
+
+#: builtin/pack-objects.c:2530
+#, c-format
+msgid "bad index version '%s'"
+msgstr "versió d'índex dolenta '%s'"
+
+#: builtin/pack-objects.c:2553
+#, c-format
+msgid "option %s does not accept negative form"
+msgstr "l'opció %s no accepta el forma negatiu"
+
+#: builtin/pack-objects.c:2557
+#, c-format
+msgid "unable to parse value '%s' for option %s"
+msgstr "incapaç d'analitzar el valor '%s' per a l'opció %s"
+
+#: builtin/pack-objects.c:2576
+msgid "do not show progress meter"
+msgstr "no mostris l'indicador de progrés"
+
+#: builtin/pack-objects.c:2578
+msgid "show progress meter"
+msgstr "mostra indicador de progrés"
+
+#: builtin/pack-objects.c:2580
+msgid "show progress meter during object writing phase"
+msgstr "mostra indicador de progrés durant el fase d'escriptura d'objectes"
+
+#: builtin/pack-objects.c:2583
+msgid "similar to --all-progress when progress meter is shown"
+msgstr "similar a --all-progress quan l'indicador de progrés es mostra"
+
+#: builtin/pack-objects.c:2584
+msgid "version[,offset]"
+msgstr "versió[,desplaçament]"
+
+#: builtin/pack-objects.c:2585
+msgid "write the pack index file in the specified idx format version"
+msgstr ""
+"escriu el fitxer d'índex de paquet en la versió de format d'índex "
+"especificada"
+
+#: builtin/pack-objects.c:2588
+msgid "maximum size of each output pack file"
+msgstr "mida màxima de cada fitxer de paquet de sortida"
+
+#: builtin/pack-objects.c:2590
+msgid "ignore borrowed objects from alternate object store"
+msgstr ""
+"ignora els objectes prestats d'un emmagatzemament d'objectes alternatiu"
+
+#: builtin/pack-objects.c:2592
+msgid "ignore packed objects"
+msgstr "ignora objectes empaquetats"
+
+#: builtin/pack-objects.c:2594
+msgid "limit pack window by objects"
+msgstr "limita la finestra de paquete per objectes"
+
+#: builtin/pack-objects.c:2596
+msgid "limit pack window by memory in addition to object limit"
+msgstr "limita la finestra de paquet per memòria a més del límit d'objectes"
+
+#: builtin/pack-objects.c:2598
+msgid "maximum length of delta chain allowed in the resulting pack"
+msgstr "longitud màxima de la cadena de deltes permesa en el paquet resultat"
+
+#: builtin/pack-objects.c:2600
+msgid "reuse existing deltas"
+msgstr "reutilitza deltes existents"
+
+#: builtin/pack-objects.c:2602
+msgid "reuse existing objects"
+msgstr "reutilitza objectes existents"
+
+#: builtin/pack-objects.c:2604
+msgid "use OFS_DELTA objects"
+msgstr "utilitza objectes OFS_DELTA"
+
+#: builtin/pack-objects.c:2606
+msgid "use threads when searching for best delta matches"
+msgstr "utilitza fils al cercar les millores coincidències de delta"
+
+#: builtin/pack-objects.c:2608
+msgid "do not create an empty pack output"
+msgstr "no creis una emissió de paquet buida"
+
+#: builtin/pack-objects.c:2610
+msgid "read revision arguments from standard input"
+msgstr "llegeix els paràmetres de revisió des de l'entrada estàndard"
+
+#: builtin/pack-objects.c:2612
+msgid "limit the objects to those that are not yet packed"
+msgstr "limita els objectes als que encara no s'hagin empaquetat"
+
+#: builtin/pack-objects.c:2615
+msgid "include objects reachable from any reference"
+msgstr "inclou els objectes abastables de qualsevulla referència"
+
+#: builtin/pack-objects.c:2618
+msgid "include objects referred by reflog entries"
+msgstr "inclou els objectes referits per entrades del registre de referències"
+
+#: builtin/pack-objects.c:2621
+msgid "output pack to stdout"
+msgstr "emet el paquet a stdout"
+
+#: builtin/pack-objects.c:2623
+msgid "include tag objects that refer to objects to be packed"
+msgstr ""
+"inclou els objectes d'etiqueta que refereixin als objectes que empaquetar"
+
+#: builtin/pack-objects.c:2625
+msgid "keep unreachable objects"
+msgstr "reté objectes inabastables"
+
+#: builtin/pack-objects.c:2626 parse-options.h:140
+msgid "time"
+msgstr "hora"
+
+#: builtin/pack-objects.c:2627
+msgid "unpack unreachable objects newer than <time>"
+msgstr "desempaquetar els objectes inabastables més nous que <hora>"
+
+#: builtin/pack-objects.c:2630
+msgid "create thin packs"
+msgstr "crea paquets prims"
+
+#: builtin/pack-objects.c:2632
+msgid "ignore packs that have companion .keep file"
+msgstr "ignora els paquets que tinguin un fitxer .keep de company"
+
+#: builtin/pack-objects.c:2634
+msgid "pack compression level"
+msgstr "nivell de compressió de paquet"
+
+#: builtin/pack-objects.c:2636
+msgid "do not hide commits by grafts"
+msgstr "no amaguis les comissions per empelt"
+
+#: builtin/pack-objects.c:2638
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr ""
+"utilitza un índex de mapa de bits, si disponible, per accelerar el recompte "
+"d'objectes"
+
+#: builtin/pack-objects.c:2640
+msgid "write a bitmap index together with the pack index"
+msgstr "escriu un índex de mapa de bits junt amb l'índex de paquet"
+
+#: builtin/pack-objects.c:2719
+msgid "Counting objects"
+msgstr "Comptant objectes"
+
+#: builtin/pack-refs.c:6
+msgid "git pack-refs [options]"
+msgstr "git pack-refs [opcions]"
+
+#: builtin/pack-refs.c:14
+msgid "pack everything"
+msgstr "empaqueta tot"
+
+#: builtin/pack-refs.c:15
+msgid "prune loose refs (default)"
+msgstr "poda referències soltes (per defecte)"
+
+#: 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:49
+msgid "Removing duplicate objects"
+msgstr "Traient objectes duplicats"
+
+#: builtin/prune.c:12
+msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
+msgstr "git prune [-n] [-v] [--expire <hora>] [--] [<cap>...]"
+
+#: builtin/prune.c:142
+msgid "do not remove, show only"
+msgstr "no treguis, només mostra"
+
+#: builtin/prune.c:143
+msgid "report pruned objects"
+msgstr "informa d'objectes podats"
+
+#: builtin/prune.c:146
+msgid "expire objects older than <time>"
+msgstr "caduca els objectes majors que <hora>"
+
+#: builtin/push.c:14
+msgid "git push [<options>] [<repository> [<refspec>...]]"
+msgstr "git push [<options>] [<repositori> [<especificació-de-referència>...]]"
+
+#: builtin/push.c:85
+msgid "tag shorthand without <tag>"
+msgstr "abreviatura d'etiqueta sense <etiqueta>"
+
+#: builtin/push.c:95
+msgid "--delete only accepts plain target ref names"
+msgstr "--delete només accepta noms de referència destí senzells"
+
+#: builtin/push.c:139
+msgid ""
+"\n"
+"To choose either option permanently, see push.default in 'git help config'."
+msgstr ""
+"\n"
+"Per triar qualsevulla opció permanentment, veu push.default en 'git help "
+"config'."
+
+#: builtin/push.c:142
+#, 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 ""
+"La rama font de la vostra rama actual no coincideix amb\n"
+"el nom de la vostra rama actual. Per pujar-la a la rama font\n"
+"en el remot, utilitzeu\n"
+"\n"
+"    git push %s HEAD:%s\n"
+"\n"
+"Per pujar a la rama de la mateixa nom en el remot, utilitzeu\n"
+"\n"
+"    git push %s %s\n"
+"%s"
+
+#: builtin/push.c:157
+#, 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 ""
+"Actualment no esteu en una rama.\n"
+"Per pujar la història que condueix a l'estat actual (HEAD\n"
+"separat) ara, utilitzeu\n"
+"\n"
+"    git push %s HEAD:<nom-de-rama-remota>\n"
+
+#: builtin/push.c:171
+#, 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 ""
+"La rama actual %s no té rama font.\n"
+"Per pujar la rama actual i estableix el remot com font, utilitzeu\n"
+"\n"
+"    git push --set-upstream %s %s\n"
+
+#: builtin/push.c:179
+#, c-format
+msgid "The current branch %s has multiple upstream branches, refusing to push."
+msgstr "La rama actual %s té múltiples rames fonts, refusant pujar."
+
+#: builtin/push.c:182
+#, 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 ""
+"Esteu pujant al remot '%s', que no és la font de la vostra\n"
+"rama actual '%s', sense dir-me què pujar per actualitzar\n"
+"quina rama remota."
+
+#: builtin/push.c:205
+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 no està estabert; el seu valor implícit s'ha\n"
+"canviat en Git 2.0 de 'matching' a 'simple'. Per suprimir\n"
+"aquest missatge i mantenir el compartament tradicional,\n"
+"utilitzeu:\n"
+"\n"
+"  git config --global push.default matching\n"
+"\n"
+"Per suprimir aquest missatge i adoptar el comportament nou ara, utilitzeu:\n"
+"\n"
+"  git config --global push.default simple\n"
+"\n"
+"Quan push.default és 'matching', git pujarà les rames locals a les\n"
+"rames remotes que ja existeixen amb el mateix nom.\n"
+"\n"
+"Des de Git 2.0, Git per defecte té el comportament més\n"
+"conservatiu 'simple', que només puja la rama actual a la rama\n"
+"corresponent que 'git pull' utilitza per actualitzar la rama\n"
+"actual.\n"
+"\n"
+"Veu 'git help config' i cerqueu 'push.default' per més informació.\n"
+"(s'ha introduït el mode 'simple' en Git 1.7.11. Utilitzeu el mode similar\n"
+"'current' en lloc de 'simple' si a vegades utilitzeu versions més\n"
+"antigues de Git)"
+
+#: builtin/push.c:272
+msgid ""
+"You didn't specify any refspecs to push, and push.default is \"nothing\"."
+msgstr ""
+"No heu especificat cap especificació de referència que pujar, i push.default "
+"és \"nothing\"."
+
+#: builtin/push.c:279
+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 ""
+"S'han rebutjat les actualitzacions perquè el punt de la vostra rama\n"
+"actual està darrerre de la seva contrapart remota. Integreu els canvis\n"
+"remots (per exemple, 'git pull ...') abans de pujar de nou.\n"
+"Veu la 'Nota sobre avances ràpids' en 'git push --help' per detalls."
+
+#: builtin/push.c:285
+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 ""
+"S'han rebutjat les actualitzacions perquè un punt de rama pujada està\n"
+"darrere de la seva contraparte remota. Agafeu aquesta rama i integreu\n"
+"els canvis remots (per exemple, 'git pull ...') abans de pujar de nou.\n"
+"Veu la 'Nota sobre avances ràpids' en 'git push --help' per detalls."
+
+#: builtin/push.c:291
+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 ""
+"S'han rebutjat les actualitzacions perquè el remot conté treball que\n"
+"no teniu localment. Això usualment es causa per altre repositori\n"
+"havent pujant a la mateixa referència. Podeu voler primer integar els\n"
+"canvis remots (per exemple, 'git pull ...') abans de pujar de nou.\n"
+"Veu la 'Nota sobre avances ràpids' en 'git push --help' per detalls."
+
+#: builtin/push.c:298
+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:301
+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 ""
+"No podeu actualitzar una referència remota que assenyala un\n"
+"objecte no de comissió, ni actualitzar una referència remota per\n"
+"fer que assenyali un objecte no de comissió, sense utilitzar\n"
+"l'opció '--force'.\n"
+
+#: builtin/push.c:360
+#, c-format
+msgid "Pushing to %s\n"
+msgstr "Pujant a %s\n"
+
+#: builtin/push.c:364
+#, c-format
+msgid "failed to push some refs to '%s'"
+msgstr "s'ha fallat al pujar algunes referències a '%s'"
+
+#: builtin/push.c:394
+#, c-format
+msgid "bad repository '%s'"
+msgstr "repositori dolent '%s'"
+
+#: builtin/push.c:395
+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 ""
+"Cap destí de pujada configurada.\n"
+"O especifiqueu l'URL des de la línia d'ordres o configura un repositori "
+"remot utilitzant\n"
+"\n"
+"    git remote add <name> <url>\n"
+"\n"
+"i després pujeu utilitzant el nom remot\n"
+"\n"
+"    git push <name>\n"
+
+#: builtin/push.c:410
+msgid "--all and --tags are incompatible"
+msgstr "--all i --tags són incompatibles"
+
+#: builtin/push.c:411
+msgid "--all can't be combined with refspecs"
+msgstr "--all no es pot combinar amb especificacions de referència"
+
+#: builtin/push.c:416
+msgid "--mirror and --tags are incompatible"
+msgstr "--mirror i --tags són incompatibles"
+
+#: builtin/push.c:417
+msgid "--mirror can't be combined with refspecs"
+msgstr "--mirror no es pot combinar amb especificacions de referència"
+
+#: builtin/push.c:422
+msgid "--all and --mirror are incompatible"
+msgstr "--all i --mirror són incompatibles"
+
+#: builtin/push.c:482
+msgid "repository"
+msgstr "repositori"
+
+#: builtin/push.c:483
+msgid "push all refs"
+msgstr "envia totes les referències"
+
+#: builtin/push.c:484
+msgid "mirror all refs"
+msgstr "reflecteix totes les referències"
+
+#: builtin/push.c:486
+msgid "delete refs"
+msgstr "suprimeix les referències"
+
+#: builtin/push.c:487
+msgid "push tags (can't be used with --all or --mirror)"
+msgstr "envia les etiquetes (no es pot utilitzar amb --all o --mirror)"
+
+#: builtin/push.c:490
+msgid "force updates"
+msgstr "força actualitzacions"
+
+#: builtin/push.c:492
+msgid "refname>:<expect"
+msgstr "nom-de-referència>:<esperat"
+
+#: builtin/push.c:493
+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:495
+msgid "check"
+msgstr "comprova"
+
+#: builtin/push.c:496
+msgid "control recursive pushing of submodules"
+msgstr "controla la pujada recursiva de submòduls"
+
+#: builtin/push.c:498
+msgid "use thin pack"
+msgstr "utilitza el paquet prim"
+
+#: builtin/push.c:499 builtin/push.c:500
+msgid "receive pack program"
+msgstr "programa que rep els paquets"
+
+#: builtin/push.c:501
+msgid "set upstream for git pull/status"
+msgstr "estableix la font per a git pull/status"
+
+#: builtin/push.c:504
+msgid "prune locally removed refs"
+msgstr "poda les referències localment tretes"
+
+#: builtin/push.c:506
+msgid "bypass pre-push hook"
+msgstr "evita el ganxo de prepujada"
+
+#: builtin/push.c:507
+msgid "push missing but relevant tags"
+msgstr "puja les etiquetes mancants però relevants"
+
+#: builtin/push.c:517
+msgid "--delete is incompatible with --all, --mirror and --tags"
+msgstr "--delete és incompatible amb --all, --mirror i --tags"
+
+#: builtin/push.c:519
+msgid "--delete doesn't make sense without any refs"
+msgstr "--delete no té sentit sense referències"
+
+#: builtin/read-tree.c:36
+msgid ""
+"git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] "
+"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
+"index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"
+msgstr ""
+"git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] "
+"[-u [--exclude-per-directory=<ignoral-de-git>] | -i]] [--no-sparse-checkout] "
+"[--index-output=<fitxer>] (--empty | <arbre1> [<arbre2> [<arbre3>]])"
+
+#: builtin/read-tree.c:109
+msgid "write resulting index to <file>"
+msgstr "escriu l'índex resultant al <fitxer>"
+
+#: builtin/read-tree.c:112
+msgid "only empty the index"
+msgstr "només buida l'índex"
+
+#: builtin/read-tree.c:114
+msgid "Merging"
+msgstr "Fusionant"
+
+#: builtin/read-tree.c:116
+msgid "perform a merge in addition to a read"
+msgstr "realitza una fusió a més d'una lectura"
+
+#: builtin/read-tree.c:118
+msgid "3-way merge if no file level merging required"
+msgstr "fusió de 3 vies si no cal fusió a la nivell de fitxers"
+
+#: builtin/read-tree.c:120
+msgid "3-way merge in presence of adds and removes"
+msgstr "fusió de 3 vies en presència d'afegiments i tretes"
+
+#: builtin/read-tree.c:122
+msgid "same as -m, but discard unmerged entries"
+msgstr "el mateix que -m, però descarta les entrades no fusionades"
+
+#: builtin/read-tree.c:123
+msgid "<subdirectory>/"
+msgstr "<subdirectori>/"
+
+#: builtin/read-tree.c:124
+msgid "read the tree into the index under <subdirectory>/"
+msgstr "llegiu l'arbre a l'índex baix <subdirectori>/"
+
+#: builtin/read-tree.c:127
+msgid "update working tree with merge result"
+msgstr "actualitza l'arbre de treball amb el resultat de fusió"
+
+#: builtin/read-tree.c:129
+msgid "gitignore"
+msgstr "ignoral de git"
+
+#: builtin/read-tree.c:130
+msgid "allow explicitly ignored files to be overwritten"
+msgstr "permet que els fitxers explícitament ignorats es sobreescriguin"
+
+#: builtin/read-tree.c:133
+msgid "don't check the working tree after merging"
+msgstr "no comprovis l'arbre de treball després de fusionar"
+
+#: builtin/read-tree.c:134
+msgid "don't update the index or the work tree"
+msgstr "no actualitzis l'índex ni l'arbre de treball"
+
+#: builtin/read-tree.c:136
+msgid "skip applying sparse checkout filter"
+msgstr "salta l'aplicació del filtre d'agafament escàs"
+
+#: builtin/read-tree.c:138
+msgid "debug unpack-trees"
+msgstr "depura unpack-trees"
+
+#: builtin/reflog.c:499
+#, c-format
+msgid "%s' for '%s' is not a valid timestamp"
+msgstr "%s' per '%s' no és una marca de temps vàlida"
+
+#: builtin/reflog.c:615 builtin/reflog.c:620
+#, c-format
+msgid "'%s' is not a valid timestamp"
+msgstr "'%s' no és una marca de temps vàlida"
+
+#: 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 <rama>] [-m <mestre>] [-f] [--tags|--no-tags] [--"
+"mirror=<fetch|push>] <nom> <url>"
+
+#: builtin/remote.c:14 builtin/remote.c:33
+msgid "git remote rename <old> <new>"
+msgstr "git remote rename <antic> <nou>"
+
+#: builtin/remote.c:15 builtin/remote.c:38
+msgid "git remote remove <name>"
+msgstr "git remote remove <nom>"
+
+#: builtin/remote.c:16
+msgid "git remote set-head <name> (-a | --auto | -d | --delete |<branch>)"
+msgstr "git remote set-head <nom> (-a | --auto | -d | --delete |<rama>)"
+
+#: builtin/remote.c:17
+msgid "git remote [-v | --verbose] show [-n] <name>"
+msgstr "git remote [-v | --verbose] show [-n] <nom>"
+
+#: builtin/remote.c:18
+msgid "git remote prune [-n | --dry-run] <name>"
+msgstr "git remote prune [-n | --dry-run] <nom>"
+
+#: builtin/remote.c:19
+msgid ""
+"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
+msgstr ""
+"git remote [-v | --verbose] update [-p | --prune] [(<grup> | <remot>)...]"
+
+#: builtin/remote.c:20
+msgid "git remote set-branches [--add] <name> <branch>..."
+msgstr "git remote set-branches [--add] <nom> <rama>..."
+
+#: builtin/remote.c:21 builtin/remote.c:69
+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
+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
+msgid "git remote set-url --delete <name> <url>"
+msgstr "git remote set-url --delete <nom> <url>"
+
+#: builtin/remote.c:28
+msgid "git remote add [<options>] <name> <url>"
+msgstr "git remote add [<opcions>] <nom> <url>"
+
+#: builtin/remote.c:43
+msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
+msgstr "git remote set-head <nom> (-a | --auto | -d | --delete | <rama>)"
+
+#: builtin/remote.c:48
+msgid "git remote set-branches <name> <branch>..."
+msgstr "git remote set-branches <nom> <rama>..."
+
+#: builtin/remote.c:49
+msgid "git remote set-branches --add <name> <branch>..."
+msgstr "git remote set-branches --add <nom> <rama>..."
+
+#: builtin/remote.c:54
+msgid "git remote show [<options>] <name>"
+msgstr "git remote show [<opcions>] <nom>"
+
+#: builtin/remote.c:59
+msgid "git remote prune [<options>] <name>"
+msgstr "git remote prune [<opcions>] <nom>"
+
+#: builtin/remote.c:64
+msgid "git remote update [<options>] [<group> | <remote>]..."
+msgstr "git remote update [<opcions>] [<grup> | <remot>]..."
+
+#: builtin/remote.c:88
+#, c-format
+msgid "Updating %s"
+msgstr "Actualitzant %s"
+
+#: builtin/remote.c:120
+msgid ""
+"--mirror is dangerous and deprecated; please\n"
+"\t use --mirror=fetch or --mirror=push instead"
+msgstr ""
+"--mirror és peligrós i desaprovat; si us\n"
+"\t plau, utilitzeu --mirror=fetch o\t --mirror=push en lloc"
+
+#: builtin/remote.c:137
+#, c-format
+msgid "unknown mirror argument: %s"
+msgstr "paràmetre de reflexió desconegut: %s"
+
+#: builtin/remote.c:153
+msgid "fetch the remote branches"
+msgstr "obtén les rames remotes"
+
+#: builtin/remote.c:155
+msgid "import all tags and associated objects when fetching"
+msgstr "importa totes les etiquetes i tos els objectes al obtenir"
+
+#: builtin/remote.c:158
+msgid "or do not fetch any tag at all (--no-tags)"
+msgstr "o no obtén cap etiqueta (--no-tags)"
+
+#: builtin/remote.c:160
+msgid "branch(es) to track"
+msgstr "rames que seguir"
+
+#: builtin/remote.c:161
+msgid "master branch"
+msgstr "rama mestre"
+
+#: builtin/remote.c:162
+msgid "push|fetch"
+msgstr "push|fetch"
+
+#: builtin/remote.c:163
+msgid "set up remote as a mirror to push to or fetch from"
+msgstr "estableix remot com mirall a que pujar o de que obtenir"
+
+#: builtin/remote.c:175
+msgid "specifying a master branch makes no sense with --mirror"
+msgstr "especificar una rama mestra no té sentit amb --mirror"
+
+#: builtin/remote.c:177
+msgid "specifying branches to track makes sense only with fetch mirrors"
+msgstr "especificar rames que seguir té sentit només amb miralls d'obteniment"
+
+#: builtin/remote.c:185 builtin/remote.c:640
+#, c-format
+msgid "remote %s already exists."
+msgstr "el remot %s ja existeix."
+
+#: builtin/remote.c:189 builtin/remote.c:644
+#, c-format
+msgid "'%s' is not a valid remote name"
+msgstr "'%s' no és un nom de remot vàlid"
+
+#: builtin/remote.c:233
+#, c-format
+msgid "Could not setup master '%s'"
+msgstr "No s'ha pogut configurar el mestre '%s'"
+
+#: builtin/remote.c:288
+#, c-format
+msgid "more than one %s"
+msgstr "més d'un %s"
+
+#: builtin/remote.c:333
+#, c-format
+msgid "Could not get fetch map for refspec %s"
+msgstr ""
+"No s'ha pogut obtenir el mapa d'obteniment de l'especificació de referència "
+"%s"
+
+#: builtin/remote.c:434 builtin/remote.c:442
+msgid "(matching)"
+msgstr "(coincident)"
+
+#: builtin/remote.c:446
+msgid "(delete)"
+msgstr "(suprimir)"
+
+#: builtin/remote.c:589 builtin/remote.c:595 builtin/remote.c:601
+#, c-format
+msgid "Could not append '%s' to '%s'"
+msgstr "No s'ha pogut annexar '%s' a '%s'"
+
+#: builtin/remote.c:633 builtin/remote.c:794 builtin/remote.c:894
+#, c-format
+msgid "No such remote: %s"
+msgstr "Cap remot així: %s"
+
+#: builtin/remote.c:650
+#, 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:656 builtin/remote.c:846
+#, c-format
+msgid "Could not remove config section '%s'"
+msgstr "No s'ha pogut treure la secció de configuració '%s'"
+
+#: builtin/remote.c:671
+#, c-format
+msgid ""
+"Not updating non-default fetch refspec\n"
+"\t%s\n"
+"\tPlease update the configuration manually if necessary."
+msgstr ""
+"No actualitzant l'especificació de referències d'obteniment no per defecte\n"
+"\t%s\n"
+"\tSi us plau, actualitzeu la configuració manualment si és necessari."
+
+#: builtin/remote.c:677
+#, c-format
+msgid "Could not append '%s'"
+msgstr "No s'ha pogut annexar '%s'"
+
+#: builtin/remote.c:688
+#, c-format
+msgid "Could not set '%s'"
+msgstr "No s'ha pogut establir '%s'"
+
+#: builtin/remote.c:710
+#, c-format
+msgid "deleting '%s' failed"
+msgstr "la supressió de '%s' ha fallat"
+
+#: builtin/remote.c:744
+#, c-format
+msgid "creating '%s' failed"
+msgstr "la creació de '%s' ha fallat"
+
+#: builtin/remote.c:765
+#, c-format
+msgid "Could not remove branch %s"
+msgstr "No s'ha pogut treure la rama %s"
+
+#: builtin/remote.c:832
+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] ""
+"Nota: Una rama fora de la jerarquia refs/remotes/ no s'ha tret;\n"
+"per suprimir-la, utilitzeu:"
+msgstr[1] ""
+"Nota: Unes rames fora de la jerarquia refs/remotes/ no s'han tret;\n"
+"per suprimir-les, utilitzeu:"
+
+#: builtin/remote.c:947
+#, c-format
+msgid " new (next fetch will store in remotes/%s)"
+msgstr " nou (el pròxim obteniment emmagatzemarà en remotes/%s)"
+
+#: builtin/remote.c:950
+msgid " tracked"
+msgstr " seguit"
+
+#: builtin/remote.c:952
+msgid " stale (use 'git remote prune' to remove)"
+msgstr " ranci (utilitzeu 'git remote prune' per treure)"
+
+#: builtin/remote.c:954
+msgid " ???"
+msgstr " ???"
+
+#: builtin/remote.c:995
+#, c-format
+msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
+msgstr "branch.%s.merge invàlid; no es pot rebasar en > 1 rama"
+
+#: builtin/remote.c:1002
+#, c-format
+msgid "rebases onto remote %s"
+msgstr "es rebasa en el remot %s"
+
+#: builtin/remote.c:1005
+#, c-format
+msgid " merges with remote %s"
+msgstr "es fusiona amb el remot %s"
+
+#: builtin/remote.c:1006
+msgid "    and with remote"
+msgstr "    i amb el remot"
+
+#: builtin/remote.c:1008
+#, c-format
+msgid "merges with remote %s"
+msgstr "es fusiona amb el remot %s"
+
+#: builtin/remote.c:1009
+msgid "   and with remote"
+msgstr "   i amb el remot"
+
+#: builtin/remote.c:1055
+msgid "create"
+msgstr "crea"
+
+#: builtin/remote.c:1058
+msgid "delete"
+msgstr "suprimeix"
+
+#: builtin/remote.c:1062
+msgid "up to date"
+msgstr "actualitzat"
+
+#: builtin/remote.c:1065
+msgid "fast-forwardable"
+msgstr "avanç ràpid possible"
+
+#: builtin/remote.c:1068
+msgid "local out of date"
+msgstr "local no actualitzat"
+
+#: builtin/remote.c:1075
+#, c-format
+msgid "    %-*s forces to %-*s (%s)"
+msgstr "    %-*s força a %-*s (%s)"
+
+#: builtin/remote.c:1078
+#, c-format
+msgid "    %-*s pushes to %-*s (%s)"
+msgstr "    %-*s puja a %-*s (%s)"
+
+#: builtin/remote.c:1082
+#, c-format
+msgid "    %-*s forces to %s"
+msgstr "    %-*s força a %s"
+
+#: builtin/remote.c:1085
+#, c-format
+msgid "    %-*s pushes to %s"
+msgstr "    %-*s puja a %s"
+
+#: builtin/remote.c:1153
+msgid "do not query remotes"
+msgstr "no consultis els remots"
+
+#: builtin/remote.c:1180
+#, c-format
+msgid "* remote %s"
+msgstr "* remot %s"
+
+#: builtin/remote.c:1181
+#, c-format
+msgid "  Fetch URL: %s"
+msgstr "  URL d'obteniment: %s"
+
+#: builtin/remote.c:1182 builtin/remote.c:1329
+msgid "(no URL)"
+msgstr "(sense URL)"
+
+#: builtin/remote.c:1191 builtin/remote.c:1193
+#, c-format
+msgid "  Push  URL: %s"
+msgstr "  URL de pujada: %s"
+
+#: builtin/remote.c:1195 builtin/remote.c:1197 builtin/remote.c:1199
+#, c-format
+msgid "  HEAD branch: %s"
+msgstr "  Rama de HEAD: %s"
+
+#: builtin/remote.c:1201
+#, c-format
+msgid ""
+"  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
+msgstr "  Rama de HEAD (el HEAD remot és ambigu, pot ser un dels següents):\n"
+
+#: builtin/remote.c:1213
+#, c-format
+msgid "  Remote branch:%s"
+msgid_plural "  Remote branches:%s"
+msgstr[0] "  Rama remota:%s"
+msgstr[1] "  Rames remotes:%s"
+
+#: builtin/remote.c:1216 builtin/remote.c:1243
+msgid " (status not queried)"
+msgstr " (estat no consultat)"
+
+#: builtin/remote.c:1225
+msgid "  Local branch configured for 'git pull':"
+msgid_plural "  Local branches configured for 'git pull':"
+msgstr[0] "  Rama local configurada per a 'git pull':"
+msgstr[1] "  Rames locals configurades per a 'git pull':"
+
+#: builtin/remote.c:1233
+msgid "  Local refs will be mirrored by 'git push'"
+msgstr "  'git push' reflectira les referències locals"
+
+#: builtin/remote.c:1240
+#, 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:1261
+msgid "set refs/remotes/<name>/HEAD according to remote"
+msgstr "estableix refs/remotes/<name>/HEAD segons el remot"
+
+#: builtin/remote.c:1263
+msgid "delete refs/remotes/<name>/HEAD"
+msgstr "suprimeix refs/remotes/<name>/HEAD"
+
+#: builtin/remote.c:1278
+msgid "Cannot determine remote HEAD"
+msgstr "No es pot determinar el HEAD remot"
+
+#: builtin/remote.c:1280
+msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
+msgstr ""
+"Múltiples rames de HEAD remotes. Si us plau, trieu una explícitament amb:"
+
+#: builtin/remote.c:1290
+#, c-format
+msgid "Could not delete %s"
+msgstr "No s'ha pogut suprimir %s"
+
+#: builtin/remote.c:1298
+#, c-format
+msgid "Not a valid ref: %s"
+msgstr "No és una referència vàlida: %s"
+
+#: builtin/remote.c:1300
+#, c-format
+msgid "Could not setup %s"
+msgstr "No s'ha pogut configurar %s"
+
+#: builtin/remote.c:1318
+#, c-format
+msgid " %s will become dangling!"
+msgstr " %s es tornarà en penjant!"
+
+#: builtin/remote.c:1319
+#, c-format
+msgid " %s has become dangling!"
+msgstr " %s s'ha tornat en penjant!"
+
+#: builtin/remote.c:1325
+#, c-format
+msgid "Pruning %s"
+msgstr "Podant %s"
+
+#: builtin/remote.c:1326
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: builtin/remote.c:1349
+#, c-format
+msgid " * [would prune] %s"
+msgstr " * [podaria] %s"
+
+#: builtin/remote.c:1352
+#, c-format
+msgid " * [pruned] %s"
+msgstr " * [podat] %s"
+
+#: builtin/remote.c:1397
+msgid "prune remotes after fetching"
+msgstr "poda els remots després d'obtenir-los"
+
+#: builtin/remote.c:1463 builtin/remote.c:1537
+#, c-format
+msgid "No such remote '%s'"
+msgstr "Cap remot així '%s'"
+
+#: builtin/remote.c:1483
+msgid "add branch"
+msgstr "afegeix rama"
+
+#: builtin/remote.c:1490
+msgid "no remote specified"
+msgstr "cap remot especificat"
+
+#: builtin/remote.c:1512
+msgid "manipulate push URLs"
+msgstr "manipula els URL de pujada"
+
+#: builtin/remote.c:1514
+msgid "add URL"
+msgstr "afegeix URL"
+
+#: builtin/remote.c:1516
+msgid "delete URLs"
+msgstr "suprimeix URLs"
+
+#: builtin/remote.c:1523
+msgid "--add --delete doesn't make sense"
+msgstr "--add --delete no té sentit"
+
+#: builtin/remote.c:1563
+#, c-format
+msgid "Invalid old URL pattern: %s"
+msgstr "Patró d'URL antic invàlid: %s"
+
+#: builtin/remote.c:1571
+#, c-format
+msgid "No such URL found: %s"
+msgstr "Cap URL així trobat: %s"
+
+#: builtin/remote.c:1573
+msgid "Will not delete all non-push URLs"
+msgstr "Suprimirà tots els URL no de pujada"
+
+#: builtin/remote.c:1587
+msgid "be verbose; must be placed before a subcommand"
+msgstr "sigues verbós; s'ha de col·locar abans d'un subordre"
+
+#: builtin/repack.c:17
+msgid "git repack [options]"
+msgstr "git repack [opcions]"
+
+#: builtin/repack.c:160
+msgid "pack everything in a single pack"
+msgstr "empaqueta tot en un paquet solter"
+
+#: builtin/repack.c:162
+msgid "same as -a, and turn unreachable objects loose"
+msgstr "el mateix que -a, i solta els objectes inabastables"
+
+#: builtin/repack.c:165
+msgid "remove redundant packs, and run git-prune-packed"
+msgstr "tragueu els paquets redundants, i executeu git-prune-packed"
+
+#: builtin/repack.c:167
+msgid "pass --no-reuse-delta to git-pack-objects"
+msgstr "passa --no-resuse-delta a git-pack-objects"
+
+#: builtin/repack.c:169
+msgid "pass --no-reuse-object to git-pack-objects"
+msgstr "passa --no-reuse-object a git-pack-objects"
+
+#: builtin/repack.c:171
+msgid "do not run git-update-server-info"
+msgstr "no executis git-update-server-info"
+
+#: builtin/repack.c:174
+msgid "pass --local to git-pack-objects"
+msgstr "passa --local a git-pack-objects"
+
+#: builtin/repack.c:176
+msgid "write bitmap index"
+msgstr "escriu índex de mapa de bits"
+
+#: builtin/repack.c:177
+msgid "approxidate"
+msgstr "aproximat"
+
+#: builtin/repack.c:178
+msgid "with -A, do not loosen objects older than this"
+msgstr "amb -A, no soltis objectes majors que aquest"
+
+#: builtin/repack.c:180
+msgid "size of the window used for delta compression"
+msgstr "mida de la ventana utilitzada per compressió de deltes"
+
+#: builtin/repack.c:181 builtin/repack.c:185
+msgid "bytes"
+msgstr "octets"
+
+#: builtin/repack.c:182
+msgid "same as the above, but limit memory size instead of entries count"
+msgstr ""
+"ex mateix que l'anterior, però limita la mida de memòria en lloc del "
+"recompte d'entrades"
+
+#: builtin/repack.c:184
+msgid "limits the maximum delta depth"
+msgstr "limita la profunditat màxima dels deltes"
+
+#: builtin/repack.c:186
+msgid "maximum size of each packfile"
+msgstr "mida màxima de cada fitxer de paquet"
+
+#: builtin/repack.c:188
+msgid "repack objects in packs marked with .keep"
+msgstr "reempaqueta els objectes en paquets marcats amb .keep"
+
+#: builtin/repack.c:374
+#, c-format
+msgid "removing '%s' failed"
+msgstr "la treta de '%s' ha fallat"
+
+#: builtin/replace.c:19
+msgid "git replace [-f] <object> <replacement>"
+msgstr "git replace [-f] <objecte> <reemplaçament>"
+
+#: builtin/replace.c:20
+msgid "git replace [-f] --edit <object>"
+msgstr "git replace [-f] --edit <objecte>"
+
+#: builtin/replace.c:21
+msgid "git replace [-f] --graft <commit> [<parent>...]"
+msgstr "git replace [-f] --graft <comissió> [<pare>...]"
+
+#: builtin/replace.c:22
+msgid "git replace -d <object>..."
+msgstr "git replace -d <objecte>..."
+
+#: builtin/replace.c:23
+msgid "git replace [--format=<format>] [-l [<pattern>]]"
+msgstr "git replace [--format=<format>] [-l [<patró>]]"
+
+#: builtin/replace.c:322 builtin/replace.c:360 builtin/replace.c:388
+#, c-format
+msgid "Not a valid object name: '%s'"
+msgstr "No és un nom d'objecte vàlid: '%s'"
+
+#: builtin/replace.c:352
+#, c-format
+msgid "bad mergetag in commit '%s'"
+msgstr "etiqueta de fusió dolenta en la comissió '%s'"
+
+#: builtin/replace.c:354
+#, c-format
+msgid "malformed mergetag in commit '%s'"
+msgstr "etiqueta de fusió malformada en la comissió '%s'"
+
+#: builtin/replace.c:365
+#, c-format
+msgid ""
+"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
+"instead of --graft"
+msgstr ""
+"la comissió original '%s' conté l'etiqueta de fusió '%s' que es descarta; "
+"utilitzeu --edit en lloc de --graft"
+
+#: builtin/replace.c:398
+#, c-format
+msgid "the original commit '%s' has a gpg signature."
+msgstr "la comissió original '%s' té una firma gpg."
+
+#: builtin/replace.c:399
+msgid "the signature will be removed in the replacement commit!"
+msgstr "la firma es traurà en la comissió de reemplaçament!"
+
+#: builtin/replace.c:405
+#, c-format
+msgid "could not write replacement commit for: '%s'"
+msgstr "no s'ha pogut escriure la comissió de reemplaçament per a: '%s'"
+
+#: builtin/replace.c:429
+msgid "list replace refs"
+msgstr "llista les referències reemplaçades"
+
+#: builtin/replace.c:430
+msgid "delete replace refs"
+msgstr "suprimeix les referències reemplaçades"
+
+#: builtin/replace.c:431
+msgid "edit existing object"
+msgstr "edita un objecte existent"
+
+#: builtin/replace.c:432
+msgid "change a commit's parents"
+msgstr "canvia els pares d'una comissió"
+
+#: builtin/replace.c:433
+msgid "replace the ref if it exists"
+msgstr "reemplaça la referència si existeix"
+
+#: builtin/replace.c:434
+msgid "do not pretty-print contents for --edit"
+msgstr "no imprimeixis bellament els continguts per a --edit"
+
+#: builtin/replace.c:435
+msgid "use this format"
+msgstr "utilitza aquest format"
+
+#: builtin/rerere.c:12
+msgid "git rerere [clear | forget path... | status | remaining | diff | gc]"
+msgstr "git rerere [clear | forget path... | status | remaining | diff | gc]"
+
+#: builtin/rerere.c:57
+msgid "register clean resolutions in index"
+msgstr "registre les resolucions netes en l'índex"
+
+#: builtin/reset.c:25
+msgid ""
+"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
+msgstr ""
+"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<comissió>]"
+
+#: builtin/reset.c:26
+msgid "git reset [-q] <tree-ish> [--] <paths>..."
+msgstr "git reset [-q] <arbre> [--] <rutes>..."
+
+#: builtin/reset.c:27
+msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
+msgstr "git reset --patch [<arbre>] [--] [<rutes>...]"
+
+#: builtin/reset.c:33
+msgid "mixed"
+msgstr "mixt"
+
+#: builtin/reset.c:33
+msgid "soft"
+msgstr "suau"
+
+#: builtin/reset.c:33
+msgid "hard"
+msgstr "dur"
+
+#: builtin/reset.c:33
+msgid "merge"
+msgstr "fusió"
+
+#: builtin/reset.c:33
+msgid "keep"
+msgstr "reteniment"
+
+#: builtin/reset.c:73
+msgid "You do not have a valid HEAD."
+msgstr "No teniu un HEAD vàlid."
+
+#: builtin/reset.c:75
+msgid "Failed to find tree of HEAD."
+msgstr "S'ha fallat al trobar l'arbre de HEAD."
+
+#: builtin/reset.c:81
+#, c-format
+msgid "Failed to find tree of %s."
+msgstr "S'ha fallat al trobar l'arbre de %s."
+
+#: builtin/reset.c:99
+#, c-format
+msgid "HEAD is now at %s"
+msgstr "HEAD ara està a %s"
+
+#: builtin/reset.c:182
+#, c-format
+msgid "Cannot do a %s reset in the middle of a merge."
+msgstr "No es pot fer un restabliment de %s en el medi d'una fusió."
+
+#: builtin/reset.c:275
+msgid "be quiet, only report errors"
+msgstr "calla, només informa d'errors"
+
+#: builtin/reset.c:277
+msgid "reset HEAD and index"
+msgstr "restableix HEAD i l'índex"
+
+#: builtin/reset.c:278
+msgid "reset only HEAD"
+msgstr "restablex només HEAD"
+
+#: builtin/reset.c:280 builtin/reset.c:282
+msgid "reset HEAD, index and working tree"
+msgstr "restableix HEAD, l'índex i l'arbre de treball"
+
+#: builtin/reset.c:284
+msgid "reset HEAD but keep local changes"
+msgstr "restableix HEAD però reté els canvis locals"
+
+#: builtin/reset.c:287
+msgid "record only the fact that removed paths will be added later"
+msgstr "registre només el fet de que les rutes tretes s'afegiran després"
+
+#: builtin/reset.c:304
+#, c-format
+msgid "Failed to resolve '%s' as a valid revision."
+msgstr "S'ha fallat al resoldre '%s' com revisió vàlida."
+
+#: builtin/reset.c:307 builtin/reset.c:315
+#, c-format
+msgid "Could not parse object '%s'."
+msgstr "No s'ha pogut analitzar l'objecte '%s'."
+
+#: builtin/reset.c:312
+#, c-format
+msgid "Failed to resolve '%s' as a valid tree."
+msgstr "S'ha fallat al resoldre '%s' com arbre vàlid."
+
+#: builtin/reset.c:321
+msgid "--patch is incompatible with --{hard,mixed,soft}"
+msgstr "--patch és incompatible amb --{hard,mixed,soft}"
+
+#: builtin/reset.c:330
+msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
+msgstr ""
+"--mixed amb rutes es desaprovat; utilitzeu 'git reset -- <paths>' en lloc."
+
+#: builtin/reset.c:332
+#, c-format
+msgid "Cannot do %s reset with paths."
+msgstr "No es pot fer reinici de %s amb rutes."
+
+#: builtin/reset.c:342
+#, c-format
+msgid "%s reset is not allowed in a bare repository"
+msgstr "reset de %s no és permet en un repositori nu"
+
+#: builtin/reset.c:346
+msgid "-N can only be used with --mixed"
+msgstr "-N només es pot utilitzar amb --mixed"
+
+#: builtin/reset.c:363
+msgid "Unstaged changes after reset:"
+msgstr "Canvis no allistats després de restabliment:"
+
+#: builtin/reset.c:369
+#, c-format
+msgid "Could not reset index file to revision '%s'."
+msgstr "No s'ha pogut restablir el fitxer d'índex a la revisió '%s'."
+
+#: builtin/reset.c:373
+msgid "Could not write new index file."
+msgstr "No s'ha pogut escriure el fitxer d'índex nou."
+
+#: builtin/rev-parse.c:360
+msgid "git rev-parse --parseopt [options] -- [<args>...]"
+msgstr "git rev-parse --parseopt [opcions] -- [<paràmetres>...]"
+
+#: builtin/rev-parse.c:365
+msgid "keep the `--` passed as an arg"
+msgstr "reté el `--` passat com paràmetre"
+
+#: builtin/rev-parse.c:367
+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:370
+msgid "output in stuck long form"
+msgstr "emet en forma llarga enganxada"
+
+#: builtin/rev-parse.c:498
+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 [opcions] -- [<paràmetres>...]\n"
+"   or: git rev-parse --sq-quote [<paràmetre>...]\n"
+"   or: git rev-parse [opcions] [<paràmetre>...]\n"
+"\n"
+"Executeu \"git rev-parse --parseopt -h\"  per més informació sobre l'ús "
+"inicial."
+
+#: builtin/revert.c:22
+msgid "git revert [options] <commit-ish>..."
+msgstr "git revert [opcions] <comissió>..."
+
+#: builtin/revert.c:23
+msgid "git revert <subcommand>"
+msgstr "git revert <subordre>"
+
+#: builtin/revert.c:28
+msgid "git cherry-pick [options] <commit-ish>..."
+msgstr "git cherry-pick [opcions] <comissió>..."
+
+#: builtin/revert.c:29
+msgid "git cherry-pick <subcommand>"
+msgstr "git cherry-pick <subordre>"
+
+#: builtin/revert.c:71
+#, c-format
+msgid "%s: %s cannot be used with %s"
+msgstr "%s: %s no es pot utilitzar amb %s"
+
+#: builtin/revert.c:80
+msgid "end revert or cherry-pick sequence"
+msgstr "termina la seqüència de reversió o recull de cireres"
+
+#: builtin/revert.c:81
+msgid "resume revert or cherry-pick sequence"
+msgstr "reprèn la seqüència de reversió o recull de cireres"
+
+#: builtin/revert.c:82
+msgid "cancel revert or cherry-pick sequence"
+msgstr "cancel·la la seqüència de reversió o recull de cireres"
+
+#: builtin/revert.c:83
+msgid "don't automatically commit"
+msgstr "no cometis automàticament"
+
+#: builtin/revert.c:84
+msgid "edit the commit message"
+msgstr "edita el missatge de comissió"
+
+#: builtin/revert.c:87
+msgid "parent number"
+msgstr "número de pare"
+
+#: builtin/revert.c:89
+msgid "merge strategy"
+msgstr "estratègia de fusió"
+
+#: builtin/revert.c:90
+msgid "option"
+msgstr "opció"
+
+#: builtin/revert.c:91
+msgid "option for merge strategy"
+msgstr "opció d'estratègia de fusió"
+
+#: builtin/revert.c:104
+msgid "append commit name"
+msgstr "nom de la comissió que annexar"
+
+#: builtin/revert.c:105
+msgid "allow fast-forward"
+msgstr "permet l'avanç ràpid"
+
+#: builtin/revert.c:106
+msgid "preserve initially empty commits"
+msgstr "preserva les comissions inicialment buides"
+
+#: builtin/revert.c:107
+msgid "allow commits with empty messages"
+msgstr "permet les comissions amb missatges buits"
+
+#: builtin/revert.c:108
+msgid "keep redundant, empty commits"
+msgstr "retén les comissions redundants i buides"
+
+#: builtin/revert.c:112
+msgid "program error"
+msgstr "error de programa"
+
+#: builtin/revert.c:197
+msgid "revert failed"
+msgstr "la reversió ha fallat"
+
+#: builtin/revert.c:212
+msgid "cherry-pick failed"
+msgstr "el recull de cireres ha fallat"
+
+#: builtin/rm.c:17
+msgid "git rm [options] [--] <file>..."
+msgstr "git rm [opcions] [--] <fitxer>..."
+
+#: builtin/rm.c:65
+msgid ""
+"the following submodule (or one of its nested submodules)\n"
+"uses a .git directory:"
+msgid_plural ""
+"the following submodules (or one of its nested submodules)\n"
+"use a .git directory:"
+msgstr[0] ""
+"el submòdul següent (o un dels seus submòduls niats)\n"
+"utilitza un directori .git:"
+msgstr[1] ""
+"els submòduls següents (o un dels seus submòduls niats)\n"
+"utilitza un directori .git:"
+
+#: builtin/rm.c:71
+msgid ""
+"\n"
+"(use 'rm -rf' if you really want to remove it including all of its history)"
+msgstr ""
+"\n"
+"(utilitzeu 'rm -rf' si realment voleu treure'l, inclòs tota la seva història)"
+
+#: builtin/rm.c:231
+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] ""
+"el fitxer següent té contingut allistat diferent d'ambdós el\n"
+"fitxer i el HEAD:"
+msgstr[1] ""
+"els fitxers següents tenen contingut allistat diferent d'ambdós\n"
+"el fitxer i el HEAD:"
+
+#: builtin/rm.c:236
+msgid ""
+"\n"
+"(use -f to force removal)"
+msgstr ""
+"\n"
+"(utilitzeu -f per forçar la treta)"
+
+#: builtin/rm.c:240
+msgid "the following file has changes staged in the index:"
+msgid_plural "the following files have changes staged in the index:"
+msgstr[0] "el fitxer següent té canvis allistats en l'índex:"
+msgstr[1] "els fitxers següents tenen canvis allistats en l'índex:"
+
+#: builtin/rm.c:244 builtin/rm.c:255
+msgid ""
+"\n"
+"(use --cached to keep the file, or -f to force removal)"
+msgstr ""
+"\n"
+"(utilitzeu --cached per desar el fitxer, o -f per forçar la treta)"
+
+#: builtin/rm.c:252
+msgid "the following file has local modifications:"
+msgid_plural "the following files have local modifications:"
+msgstr[0] "el fitxer següent té modificacions locals:"
+msgstr[1] "els fitxers següents tenen modificacions locals:"
+
+#: builtin/rm.c:270
+msgid "do not list removed files"
+msgstr "no llistis els fitxers trets"
+
+#: builtin/rm.c:271
+msgid "only remove from the index"
+msgstr "només treu de l'índex"
+
+#: builtin/rm.c:272
+msgid "override the up-to-date check"
+msgstr "passa per dalt la comprovació d'actualització"
+
+#: builtin/rm.c:273
+msgid "allow recursive removal"
+msgstr "permet treta recursiva"
+
+#: builtin/rm.c:275
+msgid "exit with a zero status even if nothing matched"
+msgstr "surt amb estat zero encara que res hagi coincidit"
+
+#: builtin/rm.c:336
+#, c-format
+msgid "not removing '%s' recursively without -r"
+msgstr "no trent '%s' recursivament sense -r"
+
+#: builtin/rm.c:375
+#, c-format
+msgid "git rm: unable to remove %s"
+msgstr "git rm: incapaç de treure %s"
+
+#: builtin/shortlog.c:13
+msgid "git shortlog [<options>] [<revision range>] [[--] [<path>...]]"
+msgstr "git shortlog [<opcions>] [<rang de revisions>] [[--] [<ruta>...]]"
+
+#: builtin/shortlog.c:131
+#, c-format
+msgid "Missing author: %s"
+msgstr "Manca l'autor: %s"
+
+#: builtin/shortlog.c:230
+msgid "sort output according to the number of commits per author"
+msgstr "ordena la sortida segons el nombre de comissions per autor"
+
+#: builtin/shortlog.c:232
+msgid "Suppress commit descriptions, only provides commit count"
+msgstr ""
+"Omet les descripcions de comissió, només proveeix el recompte de comissions"
+
+#: builtin/shortlog.c:234
+msgid "Show the email address of each author"
+msgstr "Mostra l'adreça de correu electrònic de cada autor"
+
+#: builtin/shortlog.c:235
+msgid "w[,i1[,i2]]"
+msgstr "w[,i1[,i2]]"
+
+#: builtin/shortlog.c:236
+msgid "Linewrap output"
+msgstr "Ajusta les línies de la sortida"
+
+#: builtin/show-branch.c:9
+msgid ""
+"git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--"
+"current] [--color[=<when>] | --no-color] [--sparse] [--more=<n> | --list | --"
+"independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<rev> | "
+"<glob>)...]"
+msgstr ""
+"git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--"
+"current] [--color[=<when>] | --no-color] [--sparse] [--more=<n> | --list | --"
+"independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<revisió> "
+"| <glob>)...]"
+
+#: builtin/show-branch.c:10
+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:649
+msgid "show remote-tracking and local branches"
+msgstr "mostra les rames amb seguiment remot i les locals"
+
+#: builtin/show-branch.c:651
+msgid "show remote-tracking branches"
+msgstr "mostra les rames amb seguiment remot"
+
+#: builtin/show-branch.c:653
+msgid "color '*!+-' corresponding to the branch"
+msgstr "colora '*!+-' corresponent a la rama"
+
+#: builtin/show-branch.c:655
+msgid "show <n> more commits after the common ancestor"
+msgstr "mostra <n> comissions després de l'avantpassat comú"
+
+#: builtin/show-branch.c:657
+msgid "synonym to more=-1"
+msgstr "sinònim de more=-1"
+
+#: builtin/show-branch.c:658
+msgid "suppress naming strings"
+msgstr "omet l'anomenament de cadenes"
+
+#: builtin/show-branch.c:660
+msgid "include the current branch"
+msgstr "inclou la rama actual"
+
+#: builtin/show-branch.c:662
+msgid "name commits with their object names"
+msgstr "anomena les comissions amb els seus noms d'objecte"
+
+#: builtin/show-branch.c:664
+msgid "show possible merge bases"
+msgstr "mostra els bases de fusió possibles"
+
+#: builtin/show-branch.c:666
+msgid "show refs unreachable from any other ref"
+msgstr "mostra les referències inabastables de qualsevulla altra referència"
+
+#: builtin/show-branch.c:668
+msgid "show commits in topological order"
+msgstr "mostra les comissions en ordre topològic"
+
+#: builtin/show-branch.c:671
+msgid "show only commits not on the first branch"
+msgstr "mostra només les comissions no en la primera rama"
+
+#: builtin/show-branch.c:673
+msgid "show merges reachable from only one tip"
+msgstr "mostra les fusions abastables de només una punta"
+
+#: builtin/show-branch.c:675
+msgid "topologically sort, maintaining date order where possible"
+msgstr "ordena topològicament, mantenint l'ordre de dates on possible"
+
+#: builtin/show-branch.c:678
+msgid "<n>[,<base>]"
+msgstr "<n>[,<base>]"
+
+#: builtin/show-branch.c:679
+msgid "show <n> most recent ref-log entries starting at base"
+msgstr "mostra les <n> entrades més recents començant al base"
+
+#: 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] [--] [patró*] "
+
+#: builtin/show-ref.c:11
+msgid "git show-ref --exclude-existing[=pattern] < ref-list"
+msgstr "git show-ref --exclude-existing[=pattern] < llista-de-referències"
+
+#: builtin/show-ref.c:168
+msgid "only show tags (can be combined with heads)"
+msgstr "mostra només les etiquetes (pot combinar-se amb heads)"
+
+#: builtin/show-ref.c:169
+msgid "only show heads (can be combined with tags)"
+msgstr "mostra només els caps (pot combinar-se amb etiquetes)"
+
+#: builtin/show-ref.c:170
+msgid "stricter reference checking, requires exact ref path"
+msgstr ""
+"comprovació de referència més estricta, requereix la ruta de referència "
+"exacta"
+
+#: builtin/show-ref.c:173 builtin/show-ref.c:175
+msgid "show the HEAD reference, even if it would be filtered out"
+msgstr "mostra la referència HEAD, encara que es filtraria"
+
+#: builtin/show-ref.c:177
+msgid "dereference tags into object IDs"
+msgstr "dereferencia les etiquetes a IDs d'objecte"
+
+#: builtin/show-ref.c:179
+msgid "only show SHA1 hash using <n> digits"
+msgstr "mostra el hash SHA1 només utilitzant <n> xifres"
+
+#: builtin/show-ref.c:183
+msgid "do not print results to stdout (useful with --verify)"
+msgstr "no imprimeixis els resultats a stdout (útil amb --verify)"
+
+#: builtin/show-ref.c:185
+msgid "show refs from stdin that aren't in local repository"
+msgstr "mostra les referència de stdin que no estan en el repositori local"
+
+#: builtin/symbolic-ref.c:7
+msgid "git symbolic-ref [options] name [ref]"
+msgstr "git symbolic-ref [opcions] nom [referència]"
+
+#: builtin/symbolic-ref.c:8
+msgid "git symbolic-ref -d [-q] name"
+msgstr "git symbolic-ref -d [-q] nom"
+
+#: builtin/symbolic-ref.c:40
+msgid "suppress error message for non-symbolic (detached) refs"
+msgstr "omet el missatge d'error de referències no simbòliques (separades)"
+
+#: builtin/symbolic-ref.c:41
+msgid "delete symbolic ref"
+msgstr "suprimeix la referència simbòlica"
+
+#: builtin/symbolic-ref.c:42
+msgid "shorten ref output"
+msgstr "escurça la sortida de referències"
+
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:349
+msgid "reason"
+msgstr "raó"
+
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:349
+msgid "reason of the update"
+msgstr "raó de l'actualització"
+
+#: builtin/tag.c:22
+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 <missatge>|-F <fitxer>] <nom-"
+"d'etiqueta> [<cap>]"
+
+#: builtin/tag.c:23
+msgid "git tag -d <tagname>..."
+msgstr "git tag -d <nom-d'etiqueta>..."
+
+#: builtin/tag.c:24
+msgid ""
+"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] \n"
+"\t\t[<pattern>...]"
+msgstr ""
+"git tag -l [-n[<nombre>]] [--contains <comissió>] \n"
+"\t\t[--points-at <objecte>] [<patró>...]"
+
+#: builtin/tag.c:26
+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 malformat a '%s'"
+
+#: builtin/tag.c:301
+#, c-format
+msgid "tag name too long: %.*s..."
+msgstr "nom d'etiqueta massa llarg: %.*s..."
+
+#: builtin/tag.c:306
+#, c-format
+msgid "tag '%s' not found."
+msgstr "etiqueta '%s' no trobada"
+
+#: builtin/tag.c:321
+#, c-format
+msgid "Deleted tag '%s' (was %s)\n"
+msgstr "L'etiqueta '%s' s'ha suprimit (ha estat %s)\n"
+
+#: builtin/tag.c:333
+#, c-format
+msgid "could not verify the tag '%s'"
+msgstr "no s'ha pogut verificar l'etiqueta '%s'"
+
+#: builtin/tag.c:343
+#, c-format
+msgid ""
+"\n"
+"Write a message for tag:\n"
+"  %s\n"
+"Lines starting with '%c' will be ignored.\n"
+msgstr ""
+"\n"
+"Escrui el missatge de l'etiqueta:\n"
+"  %s\n"
+"Les línies que comencen amb '%c' s'ignoraran.\n"
+
+#: builtin/tag.c:347
+#, 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"
+"Escriu el missatge de l'etiqueta:\n"
+"  %s\n"
+"Les línies començant amb '%c' es retindran; podeu treure'ls per vós mateix "
+"si voleu.\n"
+
+#: builtin/tag.c:371
+#, c-format
+msgid "unsupported sort specification '%s'"
+msgstr "especificació d'ordenació '%s' no suportat"
+
+#: builtin/tag.c:373
+#, c-format
+msgid "unsupported sort specification '%s' in variable '%s'"
+msgstr "especificació d'ordenació '%s' no suportat en el variable '%s'"
+
+#: builtin/tag.c:428
+msgid "unable to sign the tag"
+msgstr "incapaç de firmar l'etiqueta"
+
+#: builtin/tag.c:430
+msgid "unable to write tag file"
+msgstr "incapaç d'escriure el fitxer d'etiqueta"
+
+#: builtin/tag.c:455
+msgid "bad object type."
+msgstr "tipus d'objecte dolent."
+
+#: builtin/tag.c:468
+msgid "tag header too big."
+msgstr "capçalera d'etiqueta massa gran."
+
+#: builtin/tag.c:504
+msgid "no tag message?"
+msgstr "cap missatge d'etiqueta?"
+
+#: builtin/tag.c:510
+#, 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 malformat '%s'"
+
+#: builtin/tag.c:588
+msgid "list tag names"
+msgstr "llista els noms d'etiqueta"
+
+#: builtin/tag.c:590
+msgid "print <n> lines of each tag message"
+msgstr "imprimeix <n> línies de cada missatge d'etiqueta"
+
+#: builtin/tag.c:592
+msgid "delete tags"
+msgstr "suprimeix etiquetes"
+
+#: builtin/tag.c:593
+msgid "verify tags"
+msgstr "verifica etiquetes"
+
+#: builtin/tag.c:595
+msgid "Tag creation options"
+msgstr "Opcions de creació d'etiquetes"
+
+#: builtin/tag.c:597
+msgid "annotated tag, needs a message"
+msgstr "etiqueta anotada, necessita un missatge"
+
+#: builtin/tag.c:599
+msgid "tag message"
+msgstr "missatge d'etiqueta"
+
+#: builtin/tag.c:601
+msgid "annotated and GPG-signed tag"
+msgstr "etiqueta anotada i firmada per GPG"
+
+#: builtin/tag.c:605
+msgid "use another key to sign the tag"
+msgstr "utilitza altra clau per firmar l'etiqueta"
+
+#: builtin/tag.c:606
+msgid "replace the tag if exists"
+msgstr "reempaça l'etiqueta si existeix"
+
+#: builtin/tag.c:607
+msgid "show tag list in columns"
+msgstr "mostra la llista d'etiquetes en columnes"
+
+#: builtin/tag.c:609
+msgid "sort tags"
+msgstr "ordena les etiquetes"
+
+#: builtin/tag.c:613
+msgid "Tag listing options"
+msgstr "Opcions de llistament d'etiquetes"
+
+#: builtin/tag.c:616 builtin/tag.c:622
+msgid "print only tags that contain the commit"
+msgstr "imprimeix només les etiquetes que continguin la comissió"
+
+#: builtin/tag.c:628
+msgid "print only tags of the object"
+msgstr "imprimeix només les etiquets de l'objecte"
+
+#: builtin/tag.c:654
+msgid "--column and -n are incompatible"
+msgstr "--column i -n són incompatibles"
+
+#: builtin/tag.c:666
+msgid "--sort and -n are incompatible"
+msgstr "--sort i -n són incompatibles"
+
+#: builtin/tag.c:673
+msgid "-n option is only allowed with -l."
+msgstr "es permet l'opció -n només amb -l."
+
+#: builtin/tag.c:675
+msgid "--contains option is only allowed with -l."
+msgstr "es permet l'opció --contains només amb -l."
+
+#: builtin/tag.c:677
+msgid "--points-at option is only allowed with -l."
+msgstr "es permet --points-at option només amb -l."
+
+#: builtin/tag.c:685
+msgid "only one -F or -m option is allowed."
+msgstr "només una opció -F o -m es permet."
+
+#: builtin/tag.c:705
+msgid "too many params"
+msgstr "massa paràmetres"
+
+#: builtin/tag.c:711
+#, c-format
+msgid "'%s' is not a valid tag name."
+msgstr "'%s' no és un nom d'etiqueta vàlid."
+
+#: builtin/tag.c:716
+#, c-format
+msgid "tag '%s' already exists"
+msgstr "l'etiqueta '%s' ja existeix"
+
+#: builtin/tag.c:734
+#, c-format
+msgid "%s: cannot lock the ref"
+msgstr "%s: no es pot bloquejar la referència"
+
+#: builtin/tag.c:736
+#, c-format
+msgid "%s: cannot update the ref"
+msgstr "%s: no es pot actualitzar la referència"
+
+#: builtin/tag.c:738
+#, c-format
+msgid "Updated tag '%s' (was %s)\n"
+msgstr "Etiqueta '%s' actualitzada (ha estat %s)\n"
+
+#: builtin/unpack-objects.c:483
+msgid "Unpacking objects"
+msgstr "Desempaquetant objectes"
+
+#: builtin/update-index.c:402
+msgid "git update-index [options] [--] [<file>...]"
+msgstr "git update-index [opcions] [--] [<fitxer>...]"
+
+#: builtin/update-index.c:755
+msgid "continue refresh even when index needs update"
+msgstr ""
+"continua l'actualització encara que l'índex necessiti una actualització"
+
+#: builtin/update-index.c:758
+msgid "refresh: ignore submodules"
+msgstr "actualitza: ignora els submòduls"
+
+#: builtin/update-index.c:761
+msgid "do not ignore new files"
+msgstr "no ignoris fitxers nous"
+
+#: builtin/update-index.c:763
+msgid "let files replace directories and vice-versa"
+msgstr "deixa que els fitxer reemplacin els directoris i viceversa"
+
+#: builtin/update-index.c:765
+msgid "notice files missing from worktree"
+msgstr "nota els fitxers mancants de l'arbre de treball"
+
+#: builtin/update-index.c:767
+msgid "refresh even if index contains unmerged entries"
+msgstr "actualitza encara que l'índex contingui entrades no fusionades"
+
+#: builtin/update-index.c:770
+msgid "refresh stat information"
+msgstr "actualitza la informació d'estadístiques"
+
+#: builtin/update-index.c:774
+msgid "like --refresh, but ignore assume-unchanged setting"
+msgstr "com --refresh, però ignora l'ajust assume-unchanged"
+
+#: builtin/update-index.c:778
+msgid "<mode>,<object>,<path>"
+msgstr "<mode>,<objecte>,<ruta>"
+
+#: builtin/update-index.c:779
+msgid "add the specified entry to the index"
+msgstr "afegeix l'entrada especificada a l'índex"
+
+#: builtin/update-index.c:783
+msgid "(+/-)x"
+msgstr "(+/-)x"
+
+#: builtin/update-index.c:784
+msgid "override the executable bit of the listed files"
+msgstr "passa per dalt el bit executable dels fitxers llistats"
+
+#: builtin/update-index.c:788
+msgid "mark files as \"not changing\""
+msgstr "marca els fitxers com \"not changing\""
+
+#: builtin/update-index.c:791
+msgid "clear assumed-unchanged bit"
+msgstr "neteja el bit assumed-unchanged"
+
+#: builtin/update-index.c:794
+msgid "mark files as \"index-only\""
+msgstr "marca els fitxers com \"index-only\""
+
+#: builtin/update-index.c:797
+msgid "clear skip-worktree bit"
+msgstr "neteja el bit skip-worktree"
+
+#: builtin/update-index.c:800
+msgid "add to index only; do not add content to object database"
+msgstr ""
+"només afegeix a l'índex; no afegeixis el contingut al base de dades "
+"d'objectes"
+
+#: builtin/update-index.c:802
+msgid "remove named paths even if present in worktree"
+msgstr ""
+"treu les rutes anomenades encara que estiguin presents en l'arbre de treball"
+
+#: builtin/update-index.c:804
+msgid "with --stdin: input lines are terminated by null bytes"
+msgstr "amb --stdin: les línies d'entrada es terminen per octets nuls"
+
+#: builtin/update-index.c:806
+msgid "read list of paths to be updated from standard input"
+msgstr "llegeix la llista de rutes que actualitzar des de l'entrada estàndard"
+
+#: builtin/update-index.c:810
+msgid "add entries from standard input to the index"
+msgstr "afegeix les entrades de l'entrada estàndard a l'índex"
+
+#: builtin/update-index.c:814
+msgid "repopulate stages #2 and #3 for the listed paths"
+msgstr "reemplena les etapes #2 i #3 per a les rutes llistades"
+
+#: builtin/update-index.c:818
+msgid "only update entries that differ from HEAD"
+msgstr "només actualitza les entrades que difereixin de HEAD"
+
+#: builtin/update-index.c:822
+msgid "ignore files missing from worktree"
+msgstr "ignora els fitxers que manquin a l'arbre de treball"
+
+#: builtin/update-index.c:825
+msgid "report actions to standard output"
+msgstr "informa de les accions en la sortida estàndard"
+
+#: builtin/update-index.c:827
+msgid "(for porcelains) forget saved unresolved conflicts"
+msgstr "(per porcellanes) oblida't dels conflictes no resolts ni desats"
+
+#: builtin/update-index.c:831
+msgid "write index in this format"
+msgstr "escriu l'índex en aquest format"
+
+#: builtin/update-index.c:833
+msgid "enable or disable split index"
+msgstr "habilita o deshabilita l'índex dividit"
+
+#: builtin/update-ref.c:9
+msgid "git update-ref [options] -d <refname> [<oldval>]"
+msgstr "git update-ref [opcions] -d <nom-de-referència> [<valor-antic>]"
+
+#: builtin/update-ref.c:10
+msgid "git update-ref [options]    <refname> <newval> [<oldval>]"
+msgstr ""
+"git update-ref [opcions]    <nom-de-referència> <valor-nou> [<valor-antic>]"
+
+#: builtin/update-ref.c:11
+msgid "git update-ref [options] --stdin [-z]"
+msgstr "git update-ref [opcions] --stdin [-z]"
+
+#: builtin/update-ref.c:350
+msgid "delete the reference"
+msgstr "suprimeix la referència"
+
+#: builtin/update-ref.c:352
+msgid "update <refname> not the one it points to"
+msgstr "actualitza <nom de referència>, no la a que assenyali"
+
+#: builtin/update-ref.c:353
+msgid "stdin has NUL-terminated arguments"
+msgstr "stdin té paràmetres terminats per NUL"
+
+#: builtin/update-ref.c:354
+msgid "read updates from stdin"
+msgstr "llegeix actualitzacions des de stdin"
+
+#: 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 "actualitza els fitxers d'informació des de zero"
+
+#: builtin/verify-commit.c:17
+msgid "git verify-commit [-v|--verbose] <commit>..."
+msgstr "git verify-commit [-v|--verbose] <comissió>..."
+
+#: builtin/verify-commit.c:75
+msgid "print commit contents"
+msgstr "imprimeix els continguts de la comissió"
+
+#: builtin/verify-pack.c:55
+msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."
+msgstr "git verify-pack [-v|--verbose] [-s|--stat-only] <paquet>..."
+
+#: builtin/verify-pack.c:65
+msgid "verbose"
+msgstr "verbós"
+
+#: builtin/verify-pack.c:67
+msgid "show statistics only"
+msgstr "mostra només estadístiques"
+
+#: builtin/verify-tag.c:17
+msgid "git verify-tag [-v|--verbose] <tag>..."
+msgstr "git verify-tag [-v|--verbose] <etiqueta>..."
+
+#: builtin/verify-tag.c:73
+msgid "print tag contents"
+msgstr "imprimeix els continguits de l'etiqueta"
+
+#: builtin/write-tree.c:13
+msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
+msgstr "git write-tree [--missing-ok] [--prefix=<prefix>/]"
+
+#: builtin/write-tree.c:26
+msgid "<prefix>/"
+msgstr "<prefix>/"
+
+#: builtin/write-tree.c:27
+msgid "write tree object for a subdirectory <prefix>"
+msgstr "escriu l'objecte d'arbre per a un subdirectori <prefix>"
+
+#: builtin/write-tree.c:30
+msgid "only useful for debugging"
+msgstr "només útil per la depuració"
+
+#: git.c:17
+msgid ""
+"'git help -a' and 'git help -g' lists 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' i 'git help -g' llisten subordres disponibles i\n"
+"algunes guies de concepte. Veu 'git help <command>' o\n"
+"'git help <concept>' per llegir sobre un subordre o concepte\n"
+"específic."
+
+#: parse-options.h:143
+msgid "expiry-date"
+msgstr "data-de-caducitat"
+
+#: parse-options.h:158
+msgid "no-op (backward compatibility)"
+msgstr "operació nul·la (compatibilitat amb versions anteriors)"
+
+#: parse-options.h:232
+msgid "be more verbose"
+msgstr "siguis més verbós"
+
+#: parse-options.h:234
+msgid "be more quiet"
+msgstr "siguis més callat"
+
+#: parse-options.h:240
+msgid "use <n> digits to display SHA-1s"
+msgstr "utilitza <n> xifres per presentar els SHA-1"
+
+#: common-cmds.h:8
+msgid "Add file contents to the index"
+msgstr "Afegeix els continguts de fitxers a l'índex"
+
+#: common-cmds.h:9
+msgid "Find by binary search the change that introduced a bug"
+msgstr "Troba per cerca binària el canvi que ha introduït un defecte"
+
+#: common-cmds.h:10
+msgid "List, create, or delete branches"
+msgstr "Llista, crea o suprimeix rames"
+
+#: common-cmds.h:11
+msgid "Checkout a branch or paths to the working tree"
+msgstr "Agafa una rama o unes rutes a l'arbre de treball"
+
+#: common-cmds.h:12
+msgid "Clone a repository into a new directory"
+msgstr "Clona un repositori a un directori nou"
+
+#: common-cmds.h:13
+msgid "Record changes to the repository"
+msgstr "Registre els canvis al repositori"
+
+#: common-cmds.h:14
+msgid "Show changes between commits, commit and working tree, etc"
+msgstr ""
+"Mostra els canvis entre comissions, la comissió i l'arbre de treball, etc"
+
+#: common-cmds.h:15
+msgid "Download objects and refs from another repository"
+msgstr "Baixa objectes i referències d'altre repositori"
+
+#: common-cmds.h:16
+msgid "Print lines matching a pattern"
+msgstr "Imprimeix les línies coincidents amb un patró"
+
+#: common-cmds.h:17
+msgid "Create an empty Git repository or reinitialize an existing one"
+msgstr "Crea un repositori de Git buit o reinicialitza un existent"
+
+#: common-cmds.h:18
+msgid "Show commit logs"
+msgstr "Mostra els registres de comissió"
+
+#: common-cmds.h:19
+msgid "Join two or more development histories together"
+msgstr "Uneix dos o més històries de desenvolupament"
+
+#: common-cmds.h:20
+msgid "Move or rename a file, a directory, or a symlink"
+msgstr "Mou o canvia de nom un fitxer, directori, o enllaç simbòlic"
+
+#: common-cmds.h:21
+msgid "Fetch from and integrate with another repository or a local branch"
+msgstr "Obté de i integra con altre repositori o una rama local"
+
+#: common-cmds.h:22
+msgid "Update remote refs along with associated objects"
+msgstr "Actualitza les referències remotes juntes amb els objectes associats"
+
+#: common-cmds.h:23
+msgid "Forward-port local commits to the updated upstream head"
+msgstr "Avança les comissions locals al cap font actualitzat"
+
+#: common-cmds.h:24
+msgid "Reset current HEAD to the specified state"
+msgstr "Restableix el HEAD actual a l'estat especificat"
+
+#: common-cmds.h:25
+msgid "Remove files from the working tree and from the index"
+msgstr "Treu fitxers de l'arbre de treball i de l'índex"
+
+#: common-cmds.h:26
+msgid "Show various types of objects"
+msgstr "Mostra diversos tipus d'objectes"
+
+#: common-cmds.h:27
+msgid "Show the working tree status"
+msgstr "Mostra l'estat de l'arbre de treball"
+
+#: common-cmds.h:28
+msgid "Create, list, delete or verify a tag object signed with GPG"
+msgstr ""
+"Crea, llista, suprimeix o verifica un objecte d'etiqueta firmat amb GPG"
+
+#: git-am.sh:52
+msgid "You need to set your committer info first"
+msgstr "Cal establir la vostra informació de comitent primer"
+
+#: git-am.sh:97
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr ""
+"Sembla que heu mot HEAD després de l'última fallada de 'am'.\n"
+"No rebobinant a ORIG_HEAD"
+
+#: git-am.sh:107
+#, 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 ""
+"Quan heu resolt aquest problema, executeu \"$cmdline --continue\".\n"
+"Si preferiu saltar aquest pedaç, executeu \"$cmdline --skip\" en lloc.\n"
+"Per restaurar la rama original i deixar d'apedaçar, executeu \"$cmdline --"
+"abort\"."
+
+#: git-am.sh:123
+msgid "Cannot fall back to three-way merge."
+msgstr "No es pot retrocedir a una fusió de 3 vies."
+
+#: git-am.sh:139
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr ""
+"Al repositori li manquen els blobs necessaris per a retrocedir a una fusió "
+"de 3 vies."
+
+#: git-am.sh:141
+msgid "Using index info to reconstruct a base tree..."
+msgstr "Utilitzant la informació d'índex per reconstruir un arbre base..."
+
+#: git-am.sh:156
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr ""
+"Heu editat el vostre pedaç a mà?\n"
+"No s'aplica als blobs recordats en el seu índex."
+
+#: git-am.sh:165
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "Retrocedint a apedaçar el base i fusionar de 3 vies..."
+
+#: git-am.sh:181
+msgid "Failed to merge in the changes."
+msgstr "S'ha fallat al fusionar els canvis."
+
+#: git-am.sh:276
+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"
+
+#: git-am.sh:363
+#, sh-format
+msgid "Patch format $patch_format is not supported."
+msgstr "El format de pedaç $patch_format no és suportat."
+
+#: git-am.sh:365
+msgid "Patch format detection failed."
+msgstr "La detecció de format de pedaç ha fallat."
+
+#: git-am.sh:392
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
+msgstr ""
+"Fa molt que l'opció -b/--binary no ha fet res, i\n"
+"es traurà. Si us plau, no l'utilitzis més."
+
+#: git-am.sh:486
+#, sh-format
+msgid "previous rebase directory $dotest still exists but mbox given."
+msgstr ""
+"un directori de rebase anterior $dotest encara existeix però s'ha donat una "
+"bústia."
+
+#: git-am.sh:491
+msgid "Please make up your mind. --skip or --abort?"
+msgstr "Si us plau, preneu una decisió. --skip o --abort?"
+
+#: git-am.sh:527
+#, sh-format
+msgid ""
+"Stray $dotest directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr ""
+"Directori $dotest extraviat trobat.\n"
+"Utilitzeu \"git am --abort\" per treure'l."
+
+#: git-am.sh:535
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "Operació de resolució no en curs, no reprenem."
+
+#: git-am.sh:601
+#, sh-format
+msgid "Dirty index: cannot apply patches (dirty: $files)"
+msgstr "Índex brut: no es pot aplicar pedaços (bruts: $files)"
+
+#: git-am.sh:705
+#, 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 ""
+"El pedaç és buit. S'ha dividit mal?\n"
+"Si preferiríeu saltar aquest pedaç, en lloc executeu \"$cmdline --skip\".\n"
+"Per restaurar la rama original i deixar d'empaquetar, executeu \"$cmdline --"
+"abort\"."
+
+#: git-am.sh:732
+msgid "Patch does not have a valid e-mail address."
+msgstr "El pedaç no té adreça de correu electrònic vàlida."
+
+#: git-am.sh:779
+msgid "cannot be interactive without stdin connected to a terminal."
+msgstr ""
+"no es pot ser interactiu sense que stdin sigui connectat a un terminal."
+
+#: git-am.sh:783
+msgid "Commit Body is:"
+msgstr "El cos de la comissió és:"
+
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#: git-am.sh:790
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
+msgstr "Aplica? sí [y]/[n]o/[e]dita/[v]isualitza pedaç/[a]ccepta tots"
+
+#: git-am.sh:826
+#, sh-format
+msgid "Applying: $FIRSTLINE"
+msgstr "Aplicant: $FIRSTLINE"
+
+#: git-am.sh:847
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
+msgstr ""
+"Cap canvi - heu oblidat utilitzar 'git add'?\n"
+"Si no hi ha res que allistar, probablement alguna altra cosa\n"
+"ja ha introduït els mateixos canvis; potser voleu saltar aquest pedaç."
+
+#: git-am.sh:855
+msgid ""
+"You still have unmerged paths in your index\n"
+"did you forget to use 'git add'?"
+msgstr ""
+"Encara teniu rutes sense fusionar en el vostre índex\n"
+"heu oblidat utilitzar 'git add'?"
+
+#: git-am.sh:871
+msgid "No changes -- Patch already applied."
+msgstr "Sense canvis -- Pedaç ja aplicat."
+
+#: git-am.sh:881
+#, sh-format
+msgid "Patch failed at $msgnum $FIRSTLINE"
+msgstr "El pedaç ha fallat a $msgnum $FIRSTLINE"
+
+#: git-am.sh:884
+#, sh-format
+msgid ""
+"The copy of the patch that failed is found in:\n"
+"   $dotest/patch"
+msgstr ""
+"La còpia del pedaç que ha fallat es troba en:\n"
+"   $dotest/patch"
+
+#: git-am.sh:902
+msgid "applying to an empty history"
+msgstr "aplicant a una història buida"
+
+#: git-bisect.sh:48
+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:54
+msgid "Do you want me to do it for you [Y/n]? "
+msgstr "Voleu que jo el faci per vós [Y/n]? "
+
+#: git-bisect.sh:95
+#, sh-format
+msgid "unrecognised option: '$arg'"
+msgstr "opció no reconeguda: '$arg'"
+
+#: git-bisect.sh:99
+#, sh-format
+msgid "'$arg' does not appear to be a valid revision"
+msgstr "'$arg' no sembla una revisió vàlida"
+
+#: git-bisect.sh:117
+msgid "Bad HEAD - I need a HEAD"
+msgstr "HEAD dolent - Cal un HEAD"
+
+#: git-bisect.sh:130
+#, sh-format
+msgid ""
+"Checking out '$start_head' failed. Try 'git bisect reset <validbranch>'."
+msgstr ""
+"L'agafament de '$start_head' ha fallat. Proveu 'git bisect reset "
+"<validbranch>'."
+
+#: git-bisect.sh:140
+msgid "won't bisect on cg-seek'ed tree"
+msgstr "no es bisecarà en un arbre en que s'ha fet cg-seek"
+
+#: git-bisect.sh:144
+msgid "Bad HEAD - strange symbolic ref"
+msgstr "HEAD dolent - referència simbòlica estranya"
+
+#: git-bisect.sh:189
+#, sh-format
+msgid "Bad bisect_write argument: $state"
+msgstr "Paràmetre bisect_write dolent: $state"
+
+#: git-bisect.sh:218
+#, sh-format
+msgid "Bad rev input: $arg"
+msgstr "Introducció de revisió dolenta: $arg"
+
+#: git-bisect.sh:232
+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:244
+#, sh-format
+msgid "Bad rev input: $rev"
+msgstr "Introducció de revisió dolenta: $rev"
+
+#: git-bisect.sh:250
+msgid "'git bisect bad' can take only one argument."
+msgstr "'git bisect bad' pot acceptar només un paràmetre."
+
+#: git-bisect.sh:273
+msgid "Warning: bisecting only with a bad commit."
+msgstr "Avís: bisecant amb només comissió dolenta."
+
+#. TRANSLATORS: Make sure to include [Y] and [n] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-bisect.sh:279
+msgid "Are you sure [Y/n]? "
+msgstr "Esteu segur [Y/n]? "
+
+#: git-bisect.sh:289
+msgid ""
+"You need to give me at least one good and one bad revisions.\n"
+"(You can use \"git bisect bad\" and \"git bisect good\" for that.)"
+msgstr ""
+"Cal donar-me almenys una revisió bona i una dolenta.\n"
+"(Podeu utilitzar \"git bisect bad\" i \"git bisect good\" per això.)"
+
+#: git-bisect.sh:292
+msgid ""
+"You need to start by \"git bisect start\".\n"
+"You then need to give me at least one good and one bad revisions.\n"
+"(You can use \"git bisect bad\" and \"git bisect good\" for that.)"
+msgstr ""
+"Cal començar amb \"git bisect start\".\n"
+"Després cal donar-me almenys una revisió bona i una dolenta.\n"
+"(Podeu utilitzar \"git bisect bad\" i \"git bisect good\" per això.)"
+
+#: git-bisect.sh:363 git-bisect.sh:490
+msgid "We are not bisecting."
+msgstr "No estem bisecant."
+
+#: git-bisect.sh:370
+#, sh-format
+msgid "'$invalid' is not a valid commit"
+msgstr "'$invalid' no és una comissió vàlida"
+
+#: git-bisect.sh:379
+#, sh-format
+msgid ""
+"Could not check out original HEAD '$branch'.\n"
+"Try 'git bisect reset <commit>'."
+msgstr ""
+"No s'ha pogut agafar el HEAD original '$branch'.\n"
+"Proveu 'git bisect reset <comissió>'."
+
+#: git-bisect.sh:406
+msgid "No logfile given"
+msgstr "Cap fitxer de registre donat"
+
+#: git-bisect.sh:407
+#, sh-format
+msgid "cannot read $file for replaying"
+msgstr "no es pot llegir $file per reproduir"
+
+#: git-bisect.sh:424
+msgid "?? what are you talking about?"
+msgstr "?? de què parleu?"
+
+#: git-bisect.sh:436
+#, sh-format
+msgid "running $command"
+msgstr "executant $command"
+
+#: git-bisect.sh:443
+#, sh-format
+msgid ""
+"bisect run failed:\n"
+"exit code $res from '$command' is < 0 or >= 128"
+msgstr ""
+"el pas de bisecció ha fallat:\n"
+"el codi de sortida $res de '$command' és < 0 o >= 128"
+
+#: git-bisect.sh:469
+msgid "bisect run cannot continue any more"
+msgstr "el pas de bisecció no pot continuar més"
+
+#: git-bisect.sh:475
+#, sh-format
+msgid ""
+"bisect run failed:\n"
+"'bisect_state $state' exited with error code $res"
+msgstr ""
+"el pas de bisecció ha fallat:\n"
+"'bisect_state $state' ha surt amb el codi d'error $res"
+
+#: git-bisect.sh:482
+msgid "bisect run success"
+msgstr "pas de bisecció reeixit"
+
+#: git-pull.sh:21
+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, or use 'git commit -a'."
+msgstr ""
+"Baixar no és possible perquè teniu fitxers sense fusionar.\n"
+"Si us plau, arregleu-los en l'arbre de treball, i després utilitzeu\n"
+"'git add/rm <file>' segons sigui apropiat per a marcar resolució, o\n"
+"utilitzeu 'git commit -a'."
+
+#: git-pull.sh:25
+msgid "Pull is not possible because you have unmerged files."
+msgstr "Baixar no és possible perquè teniu fitxers sense fusionar."
+
+#: git-pull.sh:245
+msgid "updating an unborn branch with changes added to the index"
+msgstr "actualitzant una rama no nascuda amb canvis afegits a l'índex"
+
+#: git-pull.sh:269
+#, sh-format
+msgid ""
+"Warning: fetch updated the current branch head.\n"
+"Warning: fast-forwarding your working tree from\n"
+"Warning: commit $orig_head."
+msgstr ""
+"Avís: l'obteniment ha actualitzat el cap de la\n"
+"Avís: rama actual. avançant ràpidament el\n"
+"Avís: vostre arbre de treball des de la\n"
+"Avís: comissió $orig_head."
+
+#: git-pull.sh:294
+msgid "Cannot merge multiple branches into empty head"
+msgstr "No es pot fusionar múltiples rama a un cap buit"
+
+#: git-pull.sh:298
+msgid "Cannot rebase onto multiple branches"
+msgstr "No es pot rebasar en múltiples rames"
+
+#: 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 ""
+"Quan heu resolt aquest problema, executeu \"git rebase --continue\".\n"
+"Si preferiu saltar aquest pedaç, executeu \"git rebase --skip\" en lloc.\n"
+"Per agafar la rama original i deixar de rebasar, executeu \"git rebase --"
+"abort\"."
+
+#: git-rebase.sh:165
+msgid "Applied autostash."
+msgstr "Magatzem automàtic aplicat."
+
+#: git-rebase.sh:168
+#, sh-format
+msgid "Cannot store $stash_sha1"
+msgstr "No es pot emmagatzemar $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 ""
+"L'aplicació del magatzem automàtic ha resultat en conflictes.\n"
+"Els vostres canvis estan segurs el el magatzem.\n"
+"Podeu executar \"git stash pop\" o \"git stash drop\" en qualsevol moment.\n"
+
+#: git-rebase.sh:208
+msgid "The pre-rebase hook refused to rebase."
+msgstr "El ganxo prerebase ha refusat rebasar."
+
+#: git-rebase.sh:213
+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
+msgid "The --exec option must be used with the --interactive option"
+msgstr "L'opció --exec s'ha d'utilitzar amb l'opció --interactive"
+
+#: git-rebase.sh:356
+msgid "No rebase in progress?"
+msgstr "Cap rebase en curs?"
+
+#: git-rebase.sh:367
+msgid "The --edit-todo action can only be used during interactive rebase."
+msgstr ""
+"L'acció --edit-todo només es pot utilitzar durant un rebase interactiu."
+
+#: git-rebase.sh:374
+msgid "Cannot read HEAD"
+msgstr "No es pot llegir HEAD"
+
+#: git-rebase.sh:377
+msgid ""
+"You must edit all merge conflicts and then\n"
+"mark them as resolved using git add"
+msgstr ""
+"Heu d'editar tots els conflictes de fusió i després\n"
+"marcar-los com resolts utilitzant git add"
+
+#: git-rebase.sh:395
+#, sh-format
+msgid "Could not move back to $head_name"
+msgstr "No s'ha pogut retardar a $head_name"
+
+#: git-rebase.sh:414
+#, sh-format
+msgid ""
+"It seems that there is already a $state_dir_base directory, and\n"
+"I wonder if you are in the middle of another rebase.  If that is the\n"
+"case, please try\n"
+"\t$cmd_live_rebase\n"
+"If that is not the case, please\n"
+"\t$cmd_clear_stale_rebase\n"
+"and run me again.  I am stopping in case you still have something\n"
+"valuable there."
+msgstr ""
+"Semla que ja hi ha altre directori $state_dir_base, i\n"
+"em pregonu si esteu en el medi d'altre rebase. Si això és el\n"
+"cas, si us plau, proveu\n"
+"\t$cmd_live_rebase\n"
+"Si no és el cas, si us plau,\n"
+"\t$cmd_clear_stale_rebase\n"
+"i executeu-me de nou. M'aturo en cas de que encara tingueu alguna cosa\n"
+"de valor allà."
+
+#: git-rebase.sh:465
+#, sh-format
+msgid "invalid upstream $upstream_name"
+msgstr "font invàlida $upstream_name"
+
+#: git-rebase.sh:489
+#, sh-format
+msgid "$onto_name: there are more than one merge bases"
+msgstr "$onto_name: ja hi ha més d'un base de fusió"
+
+#: git-rebase.sh:492 git-rebase.sh:496
+#, sh-format
+msgid "$onto_name: there is no merge base"
+msgstr "$onto_name: no hi ha base de fusió"
+
+#: git-rebase.sh:501
+#, sh-format
+msgid "Does not point to a valid commit: $onto_name"
+msgstr "No assenyala una comissió vàlida: $onto_name"
+
+#: git-rebase.sh:524
+#, sh-format
+msgid "fatal: no such branch: $branch_name"
+msgstr "fatal: cap rama així: $branch_name"
+
+#: git-rebase.sh:557
+msgid "Cannot autostash"
+msgstr "No es pot emmagatzemar automàticament"
+
+#: git-rebase.sh:562
+#, sh-format
+msgid "Created autostash: $stash_abbrev"
+msgstr "Magatzem automàtic creat: $stash_abbrev"
+
+#: git-rebase.sh:566
+msgid "Please commit or stash them."
+msgstr "Si us plau, cometeu-los o emmagatzemeu-los."
+
+#: git-rebase.sh:586
+#, sh-format
+msgid "Current branch $branch_name is up to date."
+msgstr "La rama actual $branch_name està actualitzada."
+
+#: git-rebase.sh:590
+#, sh-format
+msgid "Current branch $branch_name is up to date, rebase forced."
+msgstr "La rama actual $branch_name està actualitzada, rebase forçat."
+
+#: git-rebase.sh:601
+#, sh-format
+msgid "Changes from $mb to $onto:"
+msgstr "Canvis de $mb a $onto:"
+
+#: git-rebase.sh:610
+msgid "First, rewinding head to replay your work on top of it..."
+msgstr "Primer, rebobinant el cap per reproduir el vostre treball encima..."
+
+#: git-rebase.sh:620
+#, sh-format
+msgid "Fast-forwarded $branch_name to $onto_name."
+msgstr "$branch_name avançada ràpidament a $onto_name"
+
+#: git-stash.sh:51
+msgid "git stash clear with parameters is unimplemented"
+msgstr "git stash clear amb paràmetres no està implementat"
+
+#: git-stash.sh:74
+msgid "You do not have the initial commit yet"
+msgstr "Encara no teniu la comissió inicial"
+
+#: git-stash.sh:89
+msgid "Cannot save the current index state"
+msgstr "No es pot desar l'estat d'índex actual"
+
+#: git-stash.sh:124 git-stash.sh:137
+msgid "Cannot save the current worktree state"
+msgstr "No es pot desar l'estat d'arbre de treball actual"
+
+#: git-stash.sh:141
+msgid "No changes selected"
+msgstr "Cap canvi seleccionat"
+
+#: git-stash.sh:144
+msgid "Cannot remove temporary index (can't happen)"
+msgstr "No es pot treure l'índex temporal (no es pot passar)"
+
+#: git-stash.sh:157
+msgid "Cannot record working tree state"
+msgstr "No es pot registrar l'estat de l'arbre de treball"
+
+#: git-stash.sh:191
+#, sh-format
+msgid "Cannot update $ref_stash with $w_commit"
+msgstr "No es pot actualitzar $ref_stash amb $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:238
+#, sh-format
+msgid ""
+"error: unknown option for 'stash save': $option\n"
+"       To provide a message, use git stash save -- '$option'"
+msgstr ""
+"error: opció desconeguda de 'stash save': $option\n"
+"       Per proveir un missatge, utilitzeu git stash save -- '$option'"
+
+#: git-stash.sh:259
+msgid "No local changes to save"
+msgstr "Cap canvi local que desar"
+
+#: git-stash.sh:263
+msgid "Cannot initialize stash"
+msgstr "No es pot inicialitzar el magatzem."
+
+#: git-stash.sh:267
+msgid "Cannot save the current status"
+msgstr "No es pot desar l'estat actual"
+
+#: git-stash.sh:285
+msgid "Cannot remove worktree changes"
+msgstr "No es pot treure els canvis de l'arbre de treball"
+
+#: git-stash.sh:384
+msgid "No stash found."
+msgstr "Cap magatzem trobat."
+
+#: git-stash.sh:391
+#, sh-format
+msgid "Too many revisions specified: $REV"
+msgstr "Massa revisions especificades: $REV"
+
+#: git-stash.sh:397
+#, sh-format
+msgid "$reference is not valid reference"
+msgstr "$reference no és referència vàlida"
+
+#: git-stash.sh:425
+#, sh-format
+msgid "'$args' is not a stash-like commit"
+msgstr "'$args' no és comissió com a un magatzem"
+
+#: git-stash.sh:436
+#, sh-format
+msgid "'$args' is not a stash reference"
+msgstr "'$args' no és referència de magatzem"
+
+#: git-stash.sh:444
+msgid "unable to refresh index"
+msgstr "incapaç d'actualitzar l'índex"
+
+#: git-stash.sh:448
+msgid "Cannot apply a stash in the middle of a merge"
+msgstr "No es pot aplicar un magatzem en el medi d'una fusió"
+
+#: git-stash.sh:456
+msgid "Conflicts in index. Try without --index."
+msgstr "Hi ha conflictes en l'índex. Proveu-lo sense --index."
+
+#: git-stash.sh:458
+msgid "Could not save index tree"
+msgstr "No s'ha pogut desar l'arbre d'índex"
+
+#: git-stash.sh:492
+msgid "Cannot unstage modified files"
+msgstr "No es pot desallistar fitxers modificats"
+
+#: git-stash.sh:507
+msgid "Index was not unstashed."
+msgstr "L'índex no estava sense emmagatzemar."
+
+#: git-stash.sh:530
+#, sh-format
+msgid "Dropped ${REV} ($s)"
+msgstr "${REV} ($s) descartada"
+
+#: git-stash.sh:531
+#, sh-format
+msgid "${REV}: Could not drop stash entry"
+msgstr "${REV}: No s'ha pogut descartar l'entrada de magatzem"
+
+#: git-stash.sh:538
+msgid "No branch name specified"
+msgstr "Cap nom de rama especificat"
+
+#: git-stash.sh:610
+msgid "(To restore them type \"git stash apply\")"
+msgstr "(Per restaurar-les teclegeu \"git stash apply\")"
+
+#: git-submodule.sh:95
+#, 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 ""
+"Cap mapatge de submòdul trobada en .gitmodules per a la ruta '$sm_path'"
+
+#: git-submodule.sh:287
+#, sh-format
+msgid "Clone of '$url' into submodule path '$sm_path' failed"
+msgstr "La clonatge de '$url' a la ruta 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 de la ruta de submòdul '$b' o viceversa"
+
+#: git-submodule.sh:406
+msgid "Relative path can only be used from the toplevel of the working tree"
+msgstr ""
+"La ruta relativa només es pot utilitzar des del nivell superior de l'arbre "
+"de treball"
+
+#: git-submodule.sh:416
+#, sh-format
+msgid "repo URL: '$repo' must be absolute or begin with ./|../"
+msgstr ""
+"URL de repositori: '$repo' ha de ser absolut o ha de començar amb ./|../"
+
+#: git-submodule.sh:433
+#, sh-format
+msgid "'$sm_path' already exists in the index"
+msgstr "'$sm_path' ja existeix en l'índex"
+
+#: git-submodule.sh:437
+#, 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 ""
+"La ruta següent s'ignora per un dels vostres fitxers .gitignore:\n"
+"$sm_path\n"
+"Utilitzeu -f si realment voleu afegir-lo."
+
+#: git-submodule.sh:455
+#, sh-format
+msgid "Adding existing repo at '$sm_path' to the index"
+msgstr "Afegint el repositori existent a '$sm_path' a l'índex"
+
+#: git-submodule.sh:457
+#, sh-format
+msgid "'$sm_path' already exists and is not a valid git repo"
+msgstr "'$sm_path' ja existeix i no és un repositori de git vàlid"
+
+#: git-submodule.sh:465
+#, 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
+#, sh-format
+msgid ""
+"If you want to reuse this local git directory instead of cloning again from"
+msgstr ""
+"Si voleu reutilitzar aquest directori de git local en lloc de clonar de nou "
+"de"
+
+#: git-submodule.sh:469
+#, sh-format
+msgid ""
+"use the '--force' option. If the local git directory is not the correct repo"
+msgstr ""
+"utilitzeu l'opció '--force'. Si el directori de git local no és el "
+"repositori correcte"
+
+#: git-submodule.sh:470
+#, sh-format
+msgid ""
+"or you are unsure what this means choose another name with the '--name' "
+"option."
+msgstr ""
+"o esteu insegur de què vol dir això, trieu altre nom amb l'opció '--name'."
+
+#: git-submodule.sh:472
+#, 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
+#, sh-format
+msgid "Unable to checkout submodule '$sm_path'"
+msgstr "Incapaç d'agafar el submòdul '$sm_path'"
+
+#: git-submodule.sh:489
+#, sh-format
+msgid "Failed to add submodule '$sm_path'"
+msgstr "S'ha fallat al afegir el submòdul '$sm_path'"
+
+#: git-submodule.sh:498
+#, sh-format
+msgid "Failed to register submodule '$sm_path'"
+msgstr "S'ha fallat al registrar el submòdul '$sm_path'"
+
+#: git-submodule.sh:542
+#, sh-format
+msgid "Entering '$prefix$displaypath'"
+msgstr "Entrant '$prefix$displaypath'"
+
+#: git-submodule.sh:562
+#, 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
+#, sh-format
+msgid "No url found for submodule path '$displaypath' in .gitmodules"
+msgstr "Cap url trobat per a la ruta de submòdul '$displaypath' en .gitmodules"
+
+#: git-submodule.sh:617
+#, sh-format
+msgid "Failed to register url for submodule path '$displaypath'"
+msgstr ""
+"S'ha fallat al registrar l'url per a la ruta de submòdul '$displaypath'"
+
+#: git-submodule.sh:619
+#, sh-format
+msgid "Submodule '$name' ($url) registered for path '$displaypath'"
+msgstr "Submòdul '$name' ($url) registrat per a la ruta '$displaypath'"
+
+#: git-submodule.sh:636
+#, sh-format
+msgid "Failed to register update mode for submodule path '$displaypath'"
+msgstr ""
+"S'ha fallat al registrar el mode d'actualització per a la ruta de submòdul "
+"'$displaypath'"
+
+#: git-submodule.sh:674
+#, sh-format
+msgid "Use '.' if you really want to deinitialize all submodules"
+msgstr "Utilitzeu '.' si realment voleu desinicialitzar tots els submòduls"
+
+#: git-submodule.sh:691
+#, 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
+#, sh-format
+msgid ""
+"(use 'rm -rf' if you really want to remove it including all of its history)"
+msgstr ""
+"(utilitzeu 'rm -rf' si realment voleu treure'l inclòs tota la seva història)"
+
+#: git-submodule.sh:698
+#, sh-format
+msgid ""
+"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
+"discard them"
+msgstr ""
+"L'arbre de treball de submòdul '$displaypath' conté modificacions locals; "
+"utilitzeu '-f' per descartar-les"
+
+#: git-submodule.sh:701
+#, sh-format
+msgid "Cleared directory '$displaypath'"
+msgstr "S'ha netejat el directori '$displaypath'"
+
+#: git-submodule.sh:702
+#, sh-format
+msgid "Could not remove submodule work tree '$displaypath'"
+msgstr "No s'ha pogut treure l'arbre de treball de submòdul '$displaypath'"
+
+#: git-submodule.sh:705
+#, 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
+#, sh-format
+msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
+msgstr "Submòdul '$name' ($url) no registrat per a la ruta '$displaypath'"
+
+#: git-submodule.sh:830
+#, sh-format
+msgid ""
+"Submodule path '$displaypath' not initialized\n"
+"Maybe you want to use 'update --init'?"
+msgstr ""
+"Ruta de submòdul '$displaypath' no inicialitzat\n"
+"Potser voleu utilitzar 'update --init'?"
+
+#: git-submodule.sh:843
+#, sh-format
+msgid "Unable to find current revision in submodule path '$displaypath'"
+msgstr ""
+"Incapaç de trobar la revisió actual en la ruta de submòdul '$displaypath'"
+
+#: git-submodule.sh:852
+#, sh-format
+msgid "Unable to fetch in submodule path '$sm_path'"
+msgstr "Incapaç d'agafar en la ruta de submòdul '$sm_path'"
+
+#: git-submodule.sh:876
+#, sh-format
+msgid "Unable to fetch in submodule path '$displaypath'"
+msgstr "Incapaç d'agafar en la ruta de submòdul '$displaypath'"
+
+#: git-submodule.sh:890
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+msgstr "Incapaç d'agafar '$sha1' en la ruta de submòdul '$displaypath'"
+
+#: git-submodule.sh:891
+#, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "Ruta de submòdul '$displaypath': agafat '$sha1'"
+
+#: git-submodule.sh:895
+#, sh-format
+msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
+msgstr "Incapaç de rebasar '$sha1' en la ruta de submòdul '$displaypath'"
+
+#: git-submodule.sh:896
+#, sh-format
+msgid "Submodule path '$displaypath': rebased into '$sha1'"
+msgstr "Ruta de submòdul '$displaypath': rebasada en '$sha1'"
+
+#: git-submodule.sh:901
+#, sh-format
+msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
+msgstr "Incapaç de fusionar '$sha1' en la ruta de submòdul '$displaypath'"
+
+#: git-submodule.sh:902
+#, sh-format
+msgid "Submodule path '$displaypath': merged in '$sha1'"
+msgstr "Ruta de submòdul '$displaypath': fusionada en '$sha1'"
+
+#: git-submodule.sh:907
+#, sh-format
+msgid ""
+"Execution of '$command $sha1' failed in submodule  path '$prefix$sm_path'"
+msgstr ""
+"L'execució de '$command $sha1' ha fallat en la ruta de submòdul '$prefix"
+"$sm_path'"
+
+#: git-submodule.sh:908
+#, sh-format
+msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
+msgstr "Ruta de submòdul '$prefix$sm_path': '$command $sha1'"
+
+#: git-submodule.sh:938
+#, sh-format
+msgid "Failed to recurse into submodule path '$displaypath'"
+msgstr "S'ha fallat al recursar a la ruta de submòdul '$displaypath'"
+
+#: git-submodule.sh:1046
+msgid "The --cached option cannot be used with the --files option"
+msgstr "L'opció --cached no es pot utilitzar amb l'opció --files"
+
+#: git-submodule.sh:1098
+#, sh-format
+msgid "unexpected mode $mod_dst"
+msgstr "mode inesperat $mod_dst"
+
+#: git-submodule.sh:1118
+#, 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
+#, 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
+#, 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
+msgid "blob"
+msgstr "blob"
+
+#: git-submodule.sh:1267
+#, sh-format
+msgid "Failed to recurse into submodule path '$sm_path'"
+msgstr "S'ha fallat al recursar a la ruta de submòdul '$sm_path'"
+
+#: git-submodule.sh:1331
+#, 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 8f126d7..c807967 100644
--- a/po/de.po
+++ b/po/de.po
@@ -5,9 +5,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: git 2.0.0\n"
+"Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-04-17 12:13+0800\n"
+"POT-Creation-Date: 2014-08-04 14:48+0800\n"
 "PO-Revision-Date: 2013-07-28 18:42+0200\n"
 "Last-Translator: Ralf Thielow <ralf.thielow@gmail.com>\n"
 "Language-Team: German <>\n"
@@ -22,17 +22,15 @@
 msgid "hint: %.*s\n"
 msgstr "Hinweis: %.*s\n"
 
-#: advice.c:85
+#: advice.c:88
 msgid ""
-"Fix them up in the work tree,\n"
-"and then use 'git add/rm <file>' as\n"
-"appropriate to mark resolution and make a commit,\n"
-"or use 'git commit -a'."
+"Fix them up in the work tree, and then use 'git add/rm <file>'\n"
+"as appropriate to mark resolution and make a commit, or use\n"
+"'git commit -a'."
 msgstr ""
-"Korrigieren Sie dies im Arbeitsverzeichnis,\n"
-"und benutzen Sie dann 'git add/rm <Datei>'\n"
-"um die Auflösung entsprechend zu markieren und zu committen,\n"
-"oder benutzen Sie 'git commit -a'."
+"Korrigieren Sie dies im Arbeitsverzeichnis, und benutzen Sie\n"
+"dann 'git add/rm <Datei>', um die Auflösung entsprechend zu markieren\n"
+"und zu committen, oder benutzen Sie 'git commit -a'."
 
 #: archive.c:10
 msgid "git archive [options] <tree-ish> [<path>...]"
@@ -53,7 +51,7 @@
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <Repository> [--exec <Programm>] --list"
 
-#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
+#: archive.c:243 builtin/add.c:136 builtin/add.c:427 builtin/rm.c:328
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "Pfadspezifikation '%s' stimmt mit keinen Dateien überein"
@@ -66,7 +64,7 @@
 msgid "archive format"
 msgstr "Archivformat"
 
-#: archive.c:329 builtin/log.c:1193
+#: archive.c:329 builtin/log.c:1201
 msgid "prefix"
 msgstr "Präfix"
 
@@ -74,9 +72,9 @@
 msgid "prepend prefix to each pathname in the archive"
 msgstr "stellt einen Präfix vor jeden Pfadnamen in dem Archiv"
 
-#: archive.c:331 builtin/archive.c:88 builtin/blame.c:2258
-#: builtin/blame.c:2259 builtin/config.c:57 builtin/fast-export.c:680
-#: builtin/fast-export.c:682 builtin/grep.c:714 builtin/hash-object.c:77
+#: archive.c:331 builtin/archive.c:88 builtin/blame.c:2517
+#: builtin/blame.c:2518 builtin/config.c:57 builtin/fast-export.c:709
+#: builtin/fast-export.c:711 builtin/grep.c:712 builtin/hash-object.c:77
 #: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:412
 #: builtin/notes.c:569 builtin/read-tree.c:108 parse-options.h:151
 msgid "file"
@@ -268,7 +266,7 @@
 msgid "unrecognized header: %s%s (%d)"
 msgstr "nicht erkannter Kopfbereich: %s%s (%d)"
 
-#: bundle.c:86 builtin/commit.c:706
+#: bundle.c:86 builtin/commit.c:755
 #, c-format
 msgid "could not open '%s'"
 msgstr "Konnte '%s' nicht öffnen"
@@ -277,8 +275,8 @@
 msgid "Repository lacks these prerequisite commits:"
 msgstr "Dem Repository fehlen folgende vorausgesetzte Commits:"
 
-#: bundle.c:162 sequencer.c:669 sequencer.c:1123 builtin/log.c:332
-#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357
+#: bundle.c:162 sequencer.c:630 sequencer.c:1085 builtin/log.c:330
+#: builtin/log.c:821 builtin/log.c:1428 builtin/log.c:1665 builtin/merge.c:357
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "Einrichtung des Revisionsgangs fehlgeschlagen"
@@ -301,47 +299,47 @@
 msgstr[0] "Das Paket benötigt diese Referenz:"
 msgstr[1] "Das Paket benötigt diese %d Referenzen:"
 
-#: bundle.c:293
+#: bundle.c:289
 msgid "rev-list died"
 msgstr "\"rev-list\" abgebrochen"
 
-#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:295 builtin/log.c:1339 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "nicht erkanntes Argument: %s"
 
-#: bundle.c:334
+#: bundle.c:330
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "Referenz '%s' wird durch \"rev-list\" Optionen ausgeschlossen"
 
-#: bundle.c:379
+#: bundle.c:375
 msgid "Refusing to create empty bundle."
 msgstr "Erstellung eines leeren Pakets zurückgewiesen."
 
-#: bundle.c:395
+#: bundle.c:390
 msgid "Could not spawn pack-objects"
 msgstr "Konnte Paketobjekte nicht erstellen"
 
-#: bundle.c:413
+#: bundle.c:408
 msgid "pack-objects died"
 msgstr "Erstellung der Paketobjekte abgebrochen"
 
-#: bundle.c:416
+#: bundle.c:411
 #, c-format
 msgid "cannot create '%s'"
 msgstr "kann '%s' nicht erstellen"
 
-#: bundle.c:438
+#: bundle.c:433
 msgid "index-pack died"
 msgstr "Erstellung der Paketindexdatei abgebrochen"
 
-#: commit.c:54
+#: commit.c:40
 #, c-format
 msgid "could not parse %s"
 msgstr "konnte %s nicht parsen"
 
-#: commit.c:56
+#: commit.c:42
 #, c-format
 msgid "%s %s is not a commit!"
 msgstr "%s %s ist kein Commit!"
@@ -437,27 +435,27 @@
 msgid "failed to read orderfile '%s'"
 msgstr "Fehler beim Lesen der Reihenfolgedatei '%s'."
 
-#: diffcore-rename.c:517
+#: diffcore-rename.c:514
 msgid "Performing inexact rename detection"
 msgstr "Führe Erkennung für ungenaue Umbenennung aus"
 
-#: diff.c:113
+#: diff.c:114
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr ""
 "  Fehler beim Parsen des abgeschnittenen \"dirstat\" Prozentsatzes '%s'\n"
 
-#: diff.c:118
+#: diff.c:119
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Unbekannter \"dirstat\" Parameter '%s'\n"
 
-#: diff.c:213
+#: diff.c:214
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "Unbekannter Wert in Konfigurationsvariable 'diff.dirstat': '%s'"
 
-#: diff.c:263
+#: diff.c:267
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -466,7 +464,16 @@
 "Fehler in 'diff.dirstat' Konfigurationsvariable gefunden:\n"
 "%s"
 
-#: diff.c:3495
+#: diff.c:2934
+#, c-format
+msgid "external diff died, stopping at %s"
+msgstr "externes Diff-Programm unerwartet beendet, angehalten bei %s"
+
+#: diff.c:3329
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow erfordert genau eine Pfadspezifikation"
+
+#: diff.c:3492
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -475,58 +482,58 @@
 "Fehler beim Parsen des --dirstat/-X Optionsparameters:\n"
 "%s"
 
-#: diff.c:3509
+#: diff.c:3506
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Fehler beim Parsen des --submodule Optionsparameters: '%s'"
 
-#: gpg-interface.c:59 gpg-interface.c:131
+#: gpg-interface.c:73 gpg-interface.c:145
 msgid "could not run gpg."
 msgstr "konnte gpg nicht ausführen"
 
-#: gpg-interface.c:71
+#: gpg-interface.c:85
 msgid "gpg did not accept the data"
 msgstr "gpg hat die Daten nicht akzeptiert"
 
-#: gpg-interface.c:82
+#: gpg-interface.c:96
 msgid "gpg failed to sign the data"
 msgstr "gpg beim Signieren der Daten fehlgeschlagen"
 
-#: gpg-interface.c:115
+#: gpg-interface.c:129
 #, c-format
 msgid "could not create temporary file '%s': %s"
 msgstr "konnte temporäre Datei '%s' nicht erstellen: %s"
 
-#: gpg-interface.c:118
+#: gpg-interface.c:132
 #, c-format
 msgid "failed writing detached signature to '%s': %s"
 msgstr "Fehler beim Schreiben der Signatur nach '%s': %s"
 
-#: grep.c:1698
+#: grep.c:1703
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "'%s': konnte nicht lesen %s"
 
-#: grep.c:1715
+#: grep.c:1720
 #, c-format
 msgid "'%s': %s"
 msgstr "'%s': %s"
 
-#: grep.c:1726
+#: grep.c:1731
 #, c-format
 msgid "'%s': short read %s"
 msgstr "'%s': read() zu kurz %s"
 
-#: help.c:209
+#: help.c:207
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "Vorhandene Git-Kommandos in '%s'"
 
-#: help.c:216
+#: help.c:214
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "Vorhandene Git-Kommandos irgendwo in Ihrem $PATH"
 
-#: help.c:232
+#: help.c:230
 msgid "The most commonly used git commands are:"
 msgstr "Die allgemein verwendeten Git-Kommandos sind:"
 
@@ -562,7 +569,7 @@
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git: '%s' ist kein Git-Kommando. Siehe 'git --help'."
 
-#: help.c:384 help.c:443
+#: help.c:384 help.c:444
 msgid ""
 "\n"
 "Did you mean this?"
@@ -576,16 +583,16 @@
 "\n"
 "Haben Sie eines von diesen gemeint?"
 
-#: help.c:439
+#: help.c:440
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %s - %s"
 
-#: merge.c:56
+#: merge.c:40
 msgid "failed to read the cache"
 msgstr "Lesen des Zwischenspeichers fehlgeschlagen"
 
-#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
+#: merge.c:93 builtin/checkout.c:356 builtin/checkout.c:556
 #: builtin/clone.c:661
 msgid "unable to write new index file"
 msgstr "Konnte neue Staging-Area-Datei nicht schreiben."
@@ -595,7 +602,7 @@
 msgid "(bad commit)\n"
 msgstr "(ungültiger Commit)\n"
 
-#: merge-recursive.c:208
+#: merge-recursive.c:210
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "addinfo_cache für Pfad '%s' fehlgeschlagen"
@@ -604,64 +611,64 @@
 msgid "error building trees"
 msgstr "Fehler beim Erstellen der \"Tree\"-Objekte"
 
-#: merge-recursive.c:675
+#: merge-recursive.c:692
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "Fehler beim Erstellen des Pfades '%s'%s"
 
-#: merge-recursive.c:686
+#: merge-recursive.c:703
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
-msgstr "Entferne %s um Platz für Unterverzeichnis zu schaffen\n"
+msgstr "Entferne %s, um Platz für Unterverzeichnis zu schaffen\n"
 
-#: merge-recursive.c:700 merge-recursive.c:721
+#: merge-recursive.c:717 merge-recursive.c:738
 msgid ": perhaps a D/F conflict?"
 msgstr ": vielleicht ein Verzeichnis/Datei-Konflikt?"
 
-#: merge-recursive.c:711
+#: merge-recursive.c:728
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "verweigere, da unbeobachtete Dateien in '%s' verloren gehen würden"
 
-#: merge-recursive.c:751
+#: merge-recursive.c:768
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "kann Objekt %s '%s' nicht lesen"
 
-#: merge-recursive.c:753
+#: merge-recursive.c:770
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "Blob erwartet für %s '%s'"
 
-#: merge-recursive.c:776 builtin/clone.c:317
+#: merge-recursive.c:793 builtin/clone.c:317
 #, c-format
 msgid "failed to open '%s'"
 msgstr "Fehler beim Öffnen von '%s'"
 
-#: merge-recursive.c:784
+#: merge-recursive.c:801
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "Fehler beim Erstellen eines symbolischen Verweises für '%s'"
 
-#: merge-recursive.c:787
+#: merge-recursive.c:804
 #, 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:925
+#: merge-recursive.c:942
 msgid "Failed to execute internal merge"
 msgstr "Fehler bei Ausführung des internen Merges"
 
-#: merge-recursive.c:929
+#: merge-recursive.c:946
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Konnte %s nicht zur Datenbank hinzufügen"
 
-#: merge-recursive.c:945
+#: merge-recursive.c:962
 msgid "unsupported object type in the tree"
 msgstr "nicht unterstützter Objekttyp im Verzeichnis"
 
-#: merge-recursive.c:1024 merge-recursive.c:1038
+#: merge-recursive.c:1037 merge-recursive.c:1051
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -670,7 +677,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:1030 merge-recursive.c:1043
+#: merge-recursive.c:1043 merge-recursive.c:1056
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -679,20 +686,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:1084
+#: merge-recursive.c:1097
 msgid "rename"
 msgstr "umbenennen"
 
-#: merge-recursive.c:1084
+#: merge-recursive.c:1097
 msgid "renamed"
 msgstr "umbenannt"
 
-#: merge-recursive.c:1140
+#: merge-recursive.c:1153
 #, 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:1162
+#: merge-recursive.c:1175
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -701,162 +708,162 @@
 "KONFLIKT (umbenennen/umbenennen): Benenne um \"%s\"->\"%s\" in Branch \"%s\" "
 "und \"%s\"->\"%s\" in Branch \"%s\"%s"
 
-#: merge-recursive.c:1167
+#: merge-recursive.c:1180
 msgid " (left unresolved)"
 msgstr " (bleibt unaufgelöst)"
 
-#: merge-recursive.c:1221
+#: merge-recursive.c:1234
 #, 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:1251
+#: merge-recursive.c:1264
 #, 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:1450
+#: merge-recursive.c:1463
 #, 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:1460
+#: merge-recursive.c:1473
 #, c-format
 msgid "Adding merged %s"
 msgstr "Füge zusammengeführte Datei %s hinzu"
 
-#: merge-recursive.c:1465 merge-recursive.c:1663
+#: merge-recursive.c:1478 merge-recursive.c:1676
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Füge stattdessen als %s hinzu"
 
-#: merge-recursive.c:1516
+#: merge-recursive.c:1529
 #, c-format
 msgid "cannot read object %s"
 msgstr "kann Objekt %s nicht lesen"
 
-#: merge-recursive.c:1519
+#: merge-recursive.c:1532
 #, c-format
 msgid "object %s is not a blob"
 msgstr "Objekt %s ist kein Blob"
 
-#: merge-recursive.c:1567
+#: merge-recursive.c:1580
 msgid "modify"
 msgstr "ändern"
 
-#: merge-recursive.c:1567
+#: merge-recursive.c:1580
 msgid "modified"
 msgstr "geändert"
 
-#: merge-recursive.c:1577
+#: merge-recursive.c:1590
 msgid "content"
 msgstr "Inhalt"
 
-#: merge-recursive.c:1584
+#: merge-recursive.c:1597
 msgid "add/add"
 msgstr "hinzufügen/hinzufügen"
 
-#: merge-recursive.c:1618
+#: merge-recursive.c:1631
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "%s ausgelassen (Ergebnis des Merges existiert bereits)"
 
-#: merge-recursive.c:1632
+#: merge-recursive.c:1645
 #, c-format
 msgid "Auto-merging %s"
 msgstr "automatischer Merge von %s"
 
-#: merge-recursive.c:1636 git-submodule.sh:1149
+#: merge-recursive.c:1649 git-submodule.sh:1150
 msgid "submodule"
 msgstr "Submodul"
 
-#: merge-recursive.c:1637
+#: merge-recursive.c:1650
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "KONFLIKT (%s): Merge-Konflikt in %s"
 
-#: merge-recursive.c:1727
+#: merge-recursive.c:1740
 #, c-format
 msgid "Removing %s"
 msgstr "Entferne %s"
 
-#: merge-recursive.c:1752
+#: merge-recursive.c:1765
 msgid "file/directory"
 msgstr "Datei/Verzeichnis"
 
-#: merge-recursive.c:1758
+#: merge-recursive.c:1771
 msgid "directory/file"
 msgstr "Verzeichnis/Datei"
 
-#: merge-recursive.c:1763
+#: merge-recursive.c:1776
 #, 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:1773
+#: merge-recursive.c:1786
 #, c-format
 msgid "Adding %s"
 msgstr "Füge %s hinzu"
 
-#: merge-recursive.c:1790
+#: merge-recursive.c:1803
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Fataler Merge-Fehler. Sollte nicht passieren."
 
-#: merge-recursive.c:1809
+#: merge-recursive.c:1822
 msgid "Already up-to-date!"
 msgstr "Bereits aktuell!"
 
-#: merge-recursive.c:1818
+#: merge-recursive.c:1831
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "Zusammenführen der \"Tree\"-Objekte %s und %s fehlgeschlagen"
 
-#: merge-recursive.c:1848
+#: merge-recursive.c:1861
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "unverarbeiteter Pfad??? %s"
 
-#: merge-recursive.c:1893
+#: merge-recursive.c:1906
 msgid "Merging:"
 msgstr "Merge:"
 
-#: merge-recursive.c:1906
+#: merge-recursive.c:1919
 #, 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:1943
+#: merge-recursive.c:1956
 msgid "merge returned no commit"
 msgstr "Merge hat keinen Commit zurückgegeben"
 
-#: merge-recursive.c:2000
+#: merge-recursive.c:2013
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: merge-recursive.c:2012 builtin/merge.c:668
+#: merge-recursive.c:2024 builtin/merge.c:666
 msgid "Unable to write index."
 msgstr "Konnte Staging-Area nicht schreiben."
 
-#: notes-utils.c:40
+#: notes-utils.c:41
 msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr ""
 "Kann uninitialisiertes/unreferenzierte Notiz-Verzeichnis nicht committen."
 
-#: notes-utils.c:81
+#: notes-utils.c:83
 #, c-format
 msgid "Bad notes.rewriteMode value: '%s'"
 msgstr "Ungültiger notes.rewriteMode Wert: '%s'"
 
-#: notes-utils.c:91
+#: notes-utils.c:93
 #, c-format
 msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
 msgstr ""
@@ -864,38 +871,38 @@
 
 #. TRANSLATORS: The first %s is the name of the
 #. environment variable, the second %s is its value
-#: notes-utils.c:118
+#: notes-utils.c:120
 #, c-format
 msgid "Bad %s value: '%s'"
 msgstr "Ungültiger %s Wert: '%s'"
 
-#: object.c:229
+#: object.c:234
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: parse-options.c:532
+#: parse-options.c:534
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:550
+#: parse-options.c:552
 #, c-format
 msgid "usage: %s"
 msgstr "Verwendung: %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:554
+#: parse-options.c:556
 #, c-format
 msgid "   or: %s"
 msgstr "      oder: %s"
 
-#: parse-options.c:557
+#: parse-options.c:559
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:591
+#: parse-options.c:593
 msgid "-NUM"
 msgstr "-NUM"
 
@@ -953,12 +960,12 @@
 msgstr ""
 "%s: Pfadspezifikationsangabe wird von diesem Kommando nicht unterstützt: %s"
 
-#: pathspec.c:433
+#: pathspec.c:432
 #, c-format
 msgid "pathspec '%s' is beyond a symbolic link"
 msgstr "Pfadspezifikation '%s' ist hinter einem symbolischen Verweis"
 
-#: pathspec.c:442
+#: pathspec.c:441
 msgid ""
 "There is nothing to exclude from by :(exclude) patterns.\n"
 "Perhaps you forgot to add either ':/' or '.' ?"
@@ -966,11 +973,11 @@
 ":(exclude) Muster, aber keine anderen Pfadspezifikationen angegeben.\n"
 "Vielleicht haben Sie vergessen entweder ':/' oder '.' hinzuzufügen?"
 
-#: progress.c:224
+#: progress.c:225
 msgid "done"
 msgstr "Fertig"
 
-#: read-cache.c:1238
+#: read-cache.c:1260
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -979,7 +986,7 @@
 "index.version gesetzt, aber Wert ungültig.\n"
 "Verwende Version %i"
 
-#: read-cache.c:1248
+#: read-cache.c:1270
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -988,51 +995,51 @@
 "GIT_INDEX_VERSION gesetzt, aber Wert ungültig.\n"
 "Verwende Version %i"
 
-#: remote.c:758
+#: remote.c:753
 #, 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:762
+#: remote.c:757
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s folgt üblicherweise %s, nicht %s"
 
-#: remote.c:766
+#: remote.c:761
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s folgt sowohl %s als auch %s"
 
-#: remote.c:774
+#: remote.c:769
 msgid "Internal error"
 msgstr "Interner Fehler"
 
-#: remote.c:1948
+#: remote.c:1943
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "Ihr Branch basiert auf '%s', aber Upstream-Branch wurde entfernt.\n"
 
-#: remote.c:1952
+#: remote.c:1947
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (benutzen Sie \"git branch --unset-upstream\" zum Beheben)\n"
 
-#: remote.c:1955
+#: remote.c:1950
 #, 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:1959
+#: remote.c:1954
 #, 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:1965
+#: remote.c:1960
 msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (benutzen Sie \"git push\" um lokale Commits zu publizieren)\n"
+msgstr "  (benutzen Sie \"git push\", um lokale Commits zu publizieren)\n"
 
-#: remote.c:1968
+#: remote.c:1963
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1042,12 +1049,12 @@
 msgstr[1] ""
 "Ihr Branch ist zu '%s' um %d Commits hinterher, und kann vorgespult werden.\n"
 
-#: remote.c:1976
+#: remote.c:1971
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr ""
-"  (benutzen Sie \"git pull\" um Ihren lokalen Branch zu aktualisieren)\n"
+"  (benutzen Sie \"git pull\", um Ihren lokalen Branch zu aktualisieren)\n"
 
-#: remote.c:1979
+#: remote.c:1974
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1062,10 +1069,10 @@
 "Ihr Branch und '%s' sind divergiert,\n"
 "und haben jeweils %d und %d unterschiedliche Commits.\n"
 
-#: remote.c:1989
+#: remote.c:1984
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr ""
-"  (benutzen Sie \"git pull\" um Ihren Branch mit dem Remote-Branch "
+"  (benutzen Sie \"git pull\", um Ihren Branch mit dem Remote-Branch "
 "zusammenzuführen)\n"
 
 #: run-command.c:80
@@ -1077,19 +1084,19 @@
 msgid "dup2(%d,%d) failed"
 msgstr "dup2(%d,%d) fehlgeschlagen"
 
-#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
-#: builtin/merge.c:1009 builtin/merge.c:1019
+#: sequencer.c:171 builtin/merge.c:782 builtin/merge.c:893
+#: builtin/merge.c:1003 builtin/merge.c:1013
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "Konnte '%s' nicht zum Schreiben öffnen."
 
-#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
-#: builtin/merge.c:1011 builtin/merge.c:1024
+#: sequencer.c:173 builtin/merge.c:343 builtin/merge.c:785
+#: builtin/merge.c:1005 builtin/merge.c:1018
 #, c-format
 msgid "Could not write to '%s'"
 msgstr "Konnte nicht nach '%s' schreiben."
 
-#: sequencer.c:229
+#: sequencer.c:194
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'"
@@ -1097,7 +1104,7 @@
 "nach Auflösung der Konflikte, markieren Sie die korrigierten Pfade\n"
 "mit 'git add <Pfade>' oder 'git rm <Pfade>'"
 
-#: sequencer.c:232
+#: sequencer.c:197
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'\n"
@@ -1107,222 +1114,226 @@
 "mit 'git add <Pfade>' oder 'git rm <Pfade>'und tragen Sie das Ergebnis mit\n"
 "'git commit' ein"
 
-#: sequencer.c:245 sequencer.c:879 sequencer.c:962
+#: sequencer.c:210 sequencer.c:841 sequencer.c:924
 #, c-format
 msgid "Could not write to %s"
 msgstr "Konnte nicht nach %s schreiben"
 
-#: sequencer.c:248
+#: sequencer.c:213
 #, c-format
 msgid "Error wrapping up %s"
 msgstr "Fehler bei Nachbereitung von %s"
 
-#: sequencer.c:263
+#: sequencer.c:228
 msgid "Your local changes would be overwritten by cherry-pick."
 msgstr ""
 "Ihre lokalen Änderungen würden von \"cherry-pick\" überschrieben werden."
 
-#: sequencer.c:265
+#: sequencer.c:230
 msgid "Your local changes would be overwritten by revert."
 msgstr "Ihre lokalen Änderungen würden von \"revert\" überschrieben werden."
 
-#: sequencer.c:268
+#: sequencer.c:233
 msgid "Commit your changes or stash them to proceed."
 msgstr ""
-"Tragen Sie Ihre Änderungen ein oder benutzen Sie \"stash\" um fortzufahren."
+"Tragen Sie Ihre Änderungen ein oder benutzen Sie \"stash\", um fortzufahren."
+
+#: sequencer.c:250
+msgid "Failed to lock HEAD during fast_forward_to"
+msgstr "Fehler beim Sperren von HEAD während fast_forward_to"
 
 #. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:325
+#: sequencer.c:293
 #, c-format
 msgid "%s: Unable to write new index file"
 msgstr "%s: Konnte neue Staging-Area-Datei nicht schreiben"
 
-#: sequencer.c:356
+#: sequencer.c:324
 msgid "Could not resolve HEAD commit\n"
 msgstr "Konnte Commit von HEAD nicht auflösen\n"
 
-#: sequencer.c:378
+#: sequencer.c:344
 msgid "Unable to update cache tree\n"
 msgstr "Konnte Cache-Verzeichnis nicht aktualisieren\n"
 
-#: sequencer.c:430
+#: sequencer.c:391
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr "Konnte Commit %s nicht parsen\n"
 
-#: sequencer.c:435
+#: sequencer.c:396
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr "Konnte Eltern-Commit %s nicht parsen\n"
 
-#: sequencer.c:501
+#: sequencer.c:462
 msgid "Your index file is unmerged."
 msgstr "Ihre Staging-Area-Datei ist nicht zusammengeführt."
 
-#: sequencer.c:520
+#: sequencer.c:481
 #, c-format
 msgid "Commit %s is a merge but no -m option was given."
 msgstr "Commit %s ist ein Merge, aber die Option -m wurde nicht angegeben."
 
-#: sequencer.c:528
+#: sequencer.c:489
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr "Commit %s hat keinen Elternteil %d"
 
-#: sequencer.c:532
+#: sequencer.c:493
 #, c-format
 msgid "Mainline was specified but commit %s is not a merge."
 msgstr "Hauptlinie wurde spezifiziert, aber Commit %s ist kein Merge."
 
 #. TRANSLATORS: The first %s will be "revert" or
 #. "cherry-pick", the second %s a SHA1
-#: sequencer.c:545
+#: sequencer.c:506
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s: kann Eltern-Commit %s nicht parsen"
 
-#: sequencer.c:549
+#: sequencer.c:510
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr "Kann keine Commit-Beschreibung für %s bekommen"
 
-#: sequencer.c:635
+#: sequencer.c:596
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "Konnte \"revert\" nicht auf %s ausführen... %s"
 
-#: sequencer.c:636
+#: sequencer.c:597
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "Konnte %s nicht anwenden... %s"
 
-#: sequencer.c:672
+#: sequencer.c:633
 msgid "empty commit set passed"
 msgstr "leere Menge von Commits übergeben"
 
-#: sequencer.c:680
+#: sequencer.c:641
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s: Fehler beim Lesen der Staging-Area"
 
-#: sequencer.c:685
+#: sequencer.c:645
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s: Fehler beim Aktualisieren der Staging-Area"
 
-#: sequencer.c:743
+#: sequencer.c:705
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr "Kann %s nicht während eines %s durchführen"
 
-#: sequencer.c:765
+#: sequencer.c:727
 #, c-format
 msgid "Could not parse line %d."
 msgstr "Konnte Zeile %d nicht parsen."
 
-#: sequencer.c:770
+#: sequencer.c:732
 msgid "No commits parsed."
 msgstr "Keine Commits geparst."
 
-#: sequencer.c:783
+#: sequencer.c:745
 #, c-format
 msgid "Could not open %s"
 msgstr "Konnte %s nicht öffnen"
 
-#: sequencer.c:787
+#: sequencer.c:749
 #, c-format
 msgid "Could not read %s."
 msgstr "Konnte %s nicht lesen."
 
-#: sequencer.c:794
+#: sequencer.c:756
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr "Unbenutzbares Instruktionsblatt: %s"
 
-#: sequencer.c:824
+#: sequencer.c:786
 #, c-format
 msgid "Invalid key: %s"
 msgstr "Ungültiger Schlüssel: %s"
 
-#: sequencer.c:827
+#: sequencer.c:789
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr "Ungültiger Wert für %s: %s"
 
-#: sequencer.c:839
+#: sequencer.c:801
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr "Fehlerhaftes Optionsblatt: %s"
 
-#: sequencer.c:860
+#: sequencer.c:822
 msgid "a cherry-pick or revert is already in progress"
 msgstr "\"cherry-pick\" oder \"revert\" ist bereits im Gang"
 
-#: sequencer.c:861
+#: sequencer.c:823
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr "versuchen Sie \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: sequencer.c:865
+#: sequencer.c:827
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr "Konnte \"sequencer\"-Verzeichnis %s nicht erstellen"
 
-#: sequencer.c:881 sequencer.c:966
+#: sequencer.c:843 sequencer.c:928
 #, c-format
 msgid "Error wrapping up %s."
 msgstr "Fehler beim Einpacken von %s."
 
-#: sequencer.c:900 sequencer.c:1036
+#: sequencer.c:862 sequencer.c:998
 msgid "no cherry-pick or revert in progress"
 msgstr "kein \"cherry-pick\" oder \"revert\" im Gang"
 
-#: sequencer.c:902
+#: sequencer.c:864
 msgid "cannot resolve HEAD"
 msgstr "kann HEAD nicht auflösen"
 
-#: sequencer.c:904
+#: sequencer.c:866
 msgid "cannot abort from a branch yet to be born"
 msgstr "kann nicht abbrechen: bin auf einem Branch, der noch geboren wird"
 
-#: sequencer.c:926 builtin/apply.c:4061
+#: sequencer.c:888 builtin/apply.c:4062
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "Kann %s nicht öffnen: %s"
 
-#: sequencer.c:929
+#: sequencer.c:891
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "Kann %s nicht lesen: %s"
 
-#: sequencer.c:930
+#: sequencer.c:892
 msgid "unexpected end of file"
 msgstr "Unerwartetes Dateiende"
 
-#: sequencer.c:936
+#: sequencer.c:898
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr "gespeicherte \"pre-cherry-pick\" HEAD Datei '%s' ist beschädigt"
 
-#: sequencer.c:959
+#: sequencer.c:921
 #, c-format
 msgid "Could not format %s."
 msgstr "Konnte %s nicht formatieren."
 
-#: sequencer.c:1104
+#: sequencer.c:1066
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr "%s: %s kann nicht in \"cherry-pick\" benutzt werden"
 
-#: sequencer.c:1107
+#: sequencer.c:1069
 #, c-format
 msgid "%s: bad revision"
 msgstr "%s: ungültiger Commit"
 
-#: sequencer.c:1141
+#: sequencer.c:1103
 msgid "Can't revert as initial commit"
 msgstr "Kann nicht als allerersten Commit einen Revert ausführen."
 
-#: sequencer.c:1142
+#: sequencer.c:1104
 msgid "Can't cherry-pick into empty head"
 msgstr "Kann nicht als allerersten Commit einen Cherry-Pick ausführen."
 
@@ -1351,21 +1362,21 @@
 "indem Sie \"git config advice.objectNameWarning false\"\n"
 "ausführen."
 
-#: sha1_name.c:1072
+#: sha1_name.c:1060
 msgid "HEAD does not point to a branch"
 msgstr "HEAD zeigt auf keinen Branch"
 
-#: sha1_name.c:1075
+#: sha1_name.c:1063
 #, c-format
 msgid "No such branch: '%s'"
 msgstr "Kein solcher Branch '%s'"
 
-#: sha1_name.c:1077
+#: sha1_name.c:1065
 #, c-format
 msgid "No upstream configured for branch '%s'"
 msgstr "Kein Upstream-Branch für Branch '%s' konfiguriert."
 
-#: sha1_name.c:1081
+#: sha1_name.c:1069
 #, c-format
 msgid "Upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "Upstream-Branch '%s' ist nicht als Remote-Tracking-Branch gespeichert"
@@ -1395,17 +1406,17 @@
 msgid "staging updated .gitmodules failed"
 msgstr "Konnte aktualisierte .gitmodules-Datei nicht zum Commit vormerken"
 
-#: submodule.c:1121 builtin/init-db.c:363
+#: submodule.c:1118 builtin/init-db.c:363
 #, c-format
 msgid "Could not create git link %s"
 msgstr "Konnte git-Verweis %s nicht erstellen"
 
-#: submodule.c:1132
+#: submodule.c:1129
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "Konnte core.worktree in '%s' nicht setzen."
 
-#: unpack-trees.c:206
+#: unpack-trees.c:202
 msgid "Checking out files"
 msgstr "Checke Dateien aus"
 
@@ -1438,22 +1449,22 @@
 msgid "invalid '..' path segment"
 msgstr "ungültiges '..' Pfadsegment"
 
-#: wrapper.c:422
+#: wrapper.c:460
 #, c-format
 msgid "unable to access '%s': %s"
 msgstr "konnte nicht auf '%s' zugreifen: %s"
 
-#: wrapper.c:443
+#: wrapper.c:481
 #, c-format
 msgid "unable to access '%s'"
 msgstr "konnte nicht auf '%s' zugreifen"
 
-#: wrapper.c:454
+#: wrapper.c:492
 #, 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:455
+#: wrapper.c:493
 msgid "no such user"
 msgstr "kein solcher Benutzer"
 
@@ -1477,18 +1488,18 @@
 #: wt-status.c:183
 msgid "  (use \"git add <file>...\" to mark resolution)"
 msgstr ""
-"  (benutzen Sie \"git add/rm <Datei>...\" um die Auflösung zu markieren)"
+"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung zu markieren)"
 
 #: wt-status.c:185 wt-status.c:189
 msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
 msgstr ""
-"  (benutzen Sie \"git add/rm <Datei>...\" um die Auflösung entsprechend zu "
+"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung entsprechend zu "
 "markieren)"
 
 #: wt-status.c:187
 msgid "  (use \"git rm <file>...\" to mark resolution)"
 msgstr ""
-"  (benutzen Sie \"git add/rm <Datei>...\" um die Auflösung zu markieren)"
+"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung zu markieren)"
 
 #: wt-status.c:198
 msgid "Changes to be committed:"
@@ -1501,20 +1512,20 @@
 #: wt-status.c:220
 msgid "  (use \"git add <file>...\" to update what will be committed)"
 msgstr ""
-"  (benutzen Sie \"git add <Datei>...\" um die Änderungen zum Commit "
+"  (benutzen Sie \"git add <Datei>...\", um die Änderungen zum Commit "
 "vorzumerken)"
 
 #: wt-status.c:222
 msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
 msgstr ""
-"  (benutzen Sie \"git add/rm <Datei>...\" um die Änderungen zum Commit "
+"  (benutzen Sie \"git add/rm <Datei>...\", um die Änderungen zum Commit "
 "vorzumerken)"
 
 #: wt-status.c:223
 msgid ""
 "  (use \"git checkout -- <file>...\" to discard changes in working directory)"
 msgstr ""
-"  (benutzen Sie \"git checkout -- <Datei>...\" um die Änderungen im "
+"  (benutzen Sie \"git checkout -- <Datei>...\", um die Änderungen im "
 "Arbeitsverzeichnis zu verwerfen)"
 
 #: wt-status.c:225
@@ -1527,7 +1538,7 @@
 #, c-format
 msgid "  (use \"git %s <file>...\" to include in what will be committed)"
 msgstr ""
-"  (benutzen Sie \"git %s <Datei>...\" um die Änderungen zum Commit "
+"  (benutzen Sie \"git %s <Datei>...\", um die Änderungen zum Commit "
 "vorzumerken)"
 
 #: wt-status.c:252
@@ -1612,15 +1623,15 @@
 msgid "bug: unhandled diff status %c"
 msgstr "Fehler: unbehandelter Differenz-Status %c"
 
-#: wt-status.c:765
+#: wt-status.c:764
 msgid "Submodules changed but not updated:"
 msgstr "Submodule geändert, aber nicht aktualisiert:"
 
-#: wt-status.c:767
+#: wt-status.c:766
 msgid "Submodule changes to be committed:"
 msgstr "Änderungen in Submodul zum Committen:"
 
-#: wt-status.c:846
+#: wt-status.c:845
 msgid ""
 "Do not touch the line above.\n"
 "Everything below will be removed."
@@ -1628,75 +1639,75 @@
 "Ändern Sie nicht die obige Zeile.\n"
 "Alles unterhalb von ihr wird entfernt."
 
-#: wt-status.c:937
+#: wt-status.c:936
 msgid "You have unmerged paths."
 msgstr "Sie haben nicht zusammengeführte Pfade."
 
-#: wt-status.c:940
+#: wt-status.c:939
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr " (beheben Sie die Konflikte und führen Sie \"git commit\" aus)"
 
-#: wt-status.c:943
+#: wt-status.c:942
 msgid "All conflicts fixed but you are still merging."
 msgstr "Alle Konflikte sind behoben, aber Sie sind immer noch beim Merge."
 
-#: wt-status.c:946
+#: wt-status.c:945
 msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (benutzen Sie \"git commit\" um den Merge abzuschließen)"
+msgstr "  (benutzen Sie \"git commit\", um den Merge abzuschließen)"
 
-#: wt-status.c:956
+#: wt-status.c:955
 msgid "You are in the middle of an am session."
 msgstr "Eine \"am\"-Sitzung ist im Gange."
 
-#: wt-status.c:959
+#: wt-status.c:958
 msgid "The current patch is empty."
 msgstr "Der aktuelle Patch ist leer."
 
-#: wt-status.c:963
+#: wt-status.c:962
 msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr ""
 "  (beheben Sie die Konflikte und führen Sie dann \"git am --continue\" aus)"
 
-#: wt-status.c:965
+#: wt-status.c:964
 msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (benutzen Sie \"git am --skip\" um diesen Patch auszulassen)"
+msgstr "  (benutzen Sie \"git am --skip\", um diesen Patch auszulassen)"
 
-#: wt-status.c:967
+#: wt-status.c:966
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr ""
-"  (benutzen Sie \"git am --abort\" um den ursprünglichen Branch "
+"  (benutzen Sie \"git am --abort\", um den ursprünglichen Branch "
 "wiederherzustellen)"
 
-#: wt-status.c:1027 wt-status.c:1044
+#: wt-status.c:1026 wt-status.c:1043
 #, c-format
 msgid "You are currently rebasing branch '%s' on '%s'."
 msgstr "Sie sind gerade beim Rebase von Branch '%s' auf '%s'."
 
-#: wt-status.c:1032 wt-status.c:1049
+#: wt-status.c:1031 wt-status.c:1048
 msgid "You are currently rebasing."
 msgstr "Sie sind gerade beim Rebase."
 
-#: wt-status.c:1035
+#: wt-status.c:1034
 msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr ""
 "  (beheben Sie die Konflikte und führen Sie dann \"git rebase --continue\" "
 "aus)"
 
-#: wt-status.c:1037
+#: wt-status.c:1036
 msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (benutzen Sie \"git rebase --skip\" um diesen Patch auszulassen)"
+msgstr "  (benutzen Sie \"git rebase --skip\", um diesen Patch auszulassen)"
 
-#: wt-status.c:1039
+#: wt-status.c:1038
 msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr ""
-"  (benutzen Sie \"git rebase --abort\" um den ursprünglichen Branch "
+"  (benutzen Sie \"git rebase --abort\", um den ursprünglichen Branch "
 "auszuchecken)"
 
-#: wt-status.c:1052
+#: wt-status.c:1051
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr "  (alle Konflikte behoben: führen Sie \"git rebase --continue\" aus)"
 
-#: wt-status.c:1056
+#: wt-status.c:1055
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
@@ -1704,129 +1715,129 @@
 "Sie teilen gerade einen Commit auf, während ein Rebase von Branch '%s' auf "
 "'%s' im Gange ist."
 
-#: wt-status.c:1061
+#: wt-status.c:1060
 msgid "You are currently splitting a commit during a rebase."
 msgstr "Sie teilen gerade einen Commit während eines Rebase auf."
 
-#: wt-status.c:1064
+#: wt-status.c:1063
 msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr ""
 "  (Sobald Ihr Arbeitsverzeichnis unverändert ist, führen Sie \"git rebase --"
 "continue\" aus)"
 
-#: wt-status.c:1068
+#: wt-status.c:1067
 #, c-format
 msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr ""
 "Sie editieren gerade einen Commit während eines Rebase von Branch '%s' auf "
 "'%s'."
 
-#: wt-status.c:1073
+#: wt-status.c:1072
 msgid "You are currently editing a commit during a rebase."
 msgstr "Sie editieren gerade einen Commit während eines Rebase."
 
-#: wt-status.c:1076
+#: wt-status.c:1075
 msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr ""
-"  (benutzen Sie \"git commit --amend\" um den aktuellen Commit nachzubessern)"
+"  (benutzen Sie \"git commit --amend\", um den aktuellen Commit nachzubessern)"
 
-#: wt-status.c:1078
+#: wt-status.c:1077
 msgid ""
 "  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr ""
 "  (benutzen Sie \"git rebase --continue\" sobald Ihre Änderungen "
 "abgeschlossen sind)"
 
-#: wt-status.c:1088
+#: wt-status.c:1087
 #, c-format
 msgid "You are currently cherry-picking commit %s."
 msgstr "Sie führen gerade \"cherry-pick\" von Commit %s aus."
 
-#: wt-status.c:1093
+#: wt-status.c:1092
 msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
 msgstr ""
 "  (beheben Sie die Konflikte und führen Sie dann \"git cherry-pick --continue"
 "\" aus)"
 
-#: wt-status.c:1096
+#: wt-status.c:1095
 msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr ""
 "  (alle Konflikte behoben: führen Sie \"git cherry-pick --continue\" aus)"
 
-#: wt-status.c:1098
+#: wt-status.c:1097
 msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr ""
-"  (benutzen Sie \"git cherry-pick --abort\" um die Cherry-Pick-Operation "
+"  (benutzen Sie \"git cherry-pick --abort\", um die Cherry-Pick-Operation "
 "abzubrechen)"
 
-#: wt-status.c:1107
+#: wt-status.c:1106
 #, c-format
 msgid "You are currently reverting commit %s."
 msgstr "Sie sind gerade an einem Revert von Commit '%s'."
 
-#: wt-status.c:1112
+#: wt-status.c:1111
 msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr ""
 "  (beheben Sie die Konflikte und führen Sie dann \"git revert --continue\" "
 "aus)"
 
-#: wt-status.c:1115
+#: wt-status.c:1114
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr "  (alle Konflikte behoben: führen Sie \"git revert --continue\" aus)"
 
-#: wt-status.c:1117
+#: wt-status.c:1116
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr ""
-"  (benutzen Sie \"git revert --abort\" um die Revert-Operation abzubrechen)"
+"  (benutzen Sie \"git revert --abort\", um die Revert-Operation abzubrechen)"
 
-#: wt-status.c:1128
+#: wt-status.c:1127
 #, c-format
 msgid "You are currently bisecting, started from branch '%s'."
 msgstr "Sie sind gerade bei einer binären Suche, gestartet von Branch '%s'."
 
-#: wt-status.c:1132
+#: wt-status.c:1131
 msgid "You are currently bisecting."
 msgstr "Sie sind gerade bei einer binären Suche."
 
-#: wt-status.c:1135
+#: wt-status.c:1134
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr ""
-"  (benutzen Sie \"git bisect reset\" um zum ursprünglichen Branch "
+"  (benutzen Sie \"git bisect reset\", um zum ursprünglichen Branch "
 "zurückzukehren)"
 
-#: wt-status.c:1310
+#: wt-status.c:1309
 msgid "On branch "
 msgstr "Auf Branch "
 
-#: wt-status.c:1317
+#: wt-status.c:1316
 msgid "rebase in progress; onto "
 msgstr "Rebase im Gange; auf "
 
-#: wt-status.c:1324
+#: wt-status.c:1323
 msgid "HEAD detached at "
 msgstr "HEAD losgelöst bei "
 
-#: wt-status.c:1326
+#: wt-status.c:1325
 msgid "HEAD detached from "
 msgstr "HEAD losgelöst von "
 
-#: wt-status.c:1329
+#: wt-status.c:1328
 msgid "Not currently on any branch."
 msgstr "Im Moment auf keinem Branch."
 
-#: wt-status.c:1346
+#: wt-status.c:1345
 msgid "Initial commit"
 msgstr "Initialer Commit"
 
-#: wt-status.c:1360
+#: wt-status.c:1359
 msgid "Untracked files"
 msgstr "Unbeobachtete Dateien"
 
-#: wt-status.c:1362
+#: wt-status.c:1361
 msgid "Ignored files"
 msgstr "Ignorierte Dateien"
 
-#: wt-status.c:1366
+#: wt-status.c:1365
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1837,32 +1848,32 @@
 "'status -uno' könnte das beschleunigen, aber Sie müssen darauf achten,\n"
 "neue Dateien selbstständig hinzuzufügen (siehe 'git help status')."
 
-#: wt-status.c:1372
+#: wt-status.c:1371
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr "Unbeobachtete Dateien nicht aufgelistet%s"
 
-#: wt-status.c:1374
+#: wt-status.c:1373
 msgid " (use -u option to show untracked files)"
-msgstr " (benutzen Sie die Option -u um unbeobachteten Dateien anzuzeigen)"
+msgstr " (benutzen Sie die Option -u, um unbeobachteten Dateien anzuzeigen)"
 
-#: wt-status.c:1380
+#: wt-status.c:1379
 msgid "No changes"
 msgstr "Keine Änderungen"
 
-#: wt-status.c:1385
+#: wt-status.c:1384
 #, c-format
 msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr ""
 "keine Änderungen zum Commit vorgemerkt (benutzen Sie \"git add\" und/oder "
 "\"git commit -a\")\n"
 
-#: wt-status.c:1388
+#: wt-status.c:1387
 #, c-format
 msgid "no changes added to commit\n"
 msgstr "keine Änderungen zum Commit vorgemerkt\n"
 
-#: wt-status.c:1391
+#: wt-status.c:1390
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
@@ -1871,48 +1882,48 @@
 "nichts zum Commit vorgemerkt, aber es gibt unbeobachtete Dateien (benutzen "
 "Sie \"git add\" zum Beobachten)\n"
 
-#: wt-status.c:1394
+#: wt-status.c:1393
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
 msgstr "nichts zum Commit vorgemerkt, aber es gibt unbeobachtete Dateien\n"
 
-#: wt-status.c:1397
+#: wt-status.c:1396
 #, c-format
 msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
 "nichts zu committen (Erstellen/Kopieren Sie Dateien und benutzen Sie \"git "
 "add\" zum Beobachten)\n"
 
-#: wt-status.c:1400 wt-status.c:1405
+#: wt-status.c:1399 wt-status.c:1404
 #, c-format
 msgid "nothing to commit\n"
 msgstr "nichts zu committen\n"
 
-#: wt-status.c:1403
+#: wt-status.c:1402
 #, c-format
 msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
 "nichts zu committen (benutzen Sie die Option -u, um unbeobachtete Dateien "
 "anzuzeigen)\n"
 
-#: wt-status.c:1407
+#: wt-status.c:1406
 #, c-format
 msgid "nothing to commit, working directory clean\n"
 msgstr "nichts zu committen, Arbeitsverzeichnis unverändert\n"
 
-#: wt-status.c:1516
+#: wt-status.c:1515
 msgid "HEAD (no branch)"
 msgstr "HEAD (kein Branch)"
 
-#: wt-status.c:1522
+#: wt-status.c:1521
 msgid "Initial commit on "
 msgstr "Initialer Commit auf "
 
-#: wt-status.c:1554
+#: wt-status.c:1553
 msgid "gone"
 msgstr "entfernt"
 
-#: wt-status.c:1556 wt-status.c:1564
+#: wt-status.c:1555 wt-status.c:1563
 msgid "behind "
 msgstr "hinterher "
 
@@ -1944,7 +1955,7 @@
 msgstr ""
 "Nicht zum Commit vorgemerkte Änderungen nach Aktualisierung der Staging-Area:"
 
-#: builtin/add.c:193
+#: builtin/add.c:193 builtin/rev-parse.c:781
 msgid "Could not read the index"
 msgstr "Konnte die Staging-Area nicht lesen"
 
@@ -1977,15 +1988,15 @@
 "Die folgenden Pfade werden durch eine Ihrer \".gitignore\" Dateien "
 "ignoriert:\n"
 
-#: builtin/add.c:248 builtin/clean.c:876 builtin/fetch.c:93 builtin/mv.c:70
-#: builtin/prune-packed.c:77 builtin/push.c:489 builtin/remote.c:1344
+#: builtin/add.c:248 builtin/clean.c:875 builtin/fetch.c:108 builtin/mv.c:70
+#: builtin/prune-packed.c:77 builtin/push.c:488 builtin/remote.c:1367
 #: builtin/rm.c:269
 msgid "dry run"
 msgstr "Probelauf"
 
-#: builtin/add.c:249 builtin/apply.c:4410 builtin/check-ignore.c:19
-#: builtin/commit.c:1256 builtin/count-objects.c:95 builtin/fsck.c:612
-#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113
+#: builtin/add.c:249 builtin/apply.c:4411 builtin/check-ignore.c:19
+#: builtin/commit.c:1328 builtin/count-objects.c:95 builtin/fsck.c:606
+#: builtin/log.c:1613 builtin/mv.c:69 builtin/read-tree.c:113
 msgid "be verbose"
 msgstr "erweiterte Ausgaben"
 
@@ -1993,7 +2004,7 @@
 msgid "interactive picking"
 msgstr "interaktives Auswählen"
 
-#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
+#: builtin/add.c:252 builtin/checkout.c:1102 builtin/reset.c:285
 msgid "select hunks interactively"
 msgstr "Blöcke interaktiv auswählen"
 
@@ -2049,31 +2060,31 @@
 msgid "adding files failed"
 msgstr "Hinzufügen von Dateien fehlgeschlagen"
 
-#: builtin/add.c:330
+#: builtin/add.c:329
 msgid "-A and -u are mutually incompatible"
 msgstr "Die Optionen -A und -u sind zueinander inkompatibel."
 
-#: builtin/add.c:337
+#: builtin/add.c:336
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr ""
 "Die Option --ignore-missing kann nur zusammen mit --dry-run verwendet werden."
 
-#: builtin/add.c:358
+#: builtin/add.c:357
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Nichts spezifiziert, nichts hinzugefügt.\n"
 
-#: builtin/add.c:359
+#: builtin/add.c:358
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "Wollten Sie vielleicht 'git add .' sagen?\n"
 
-#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:920
-#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:234 builtin/rm.c:299
+#: builtin/add.c:363 builtin/check-ignore.c:172 builtin/clean.c:919
+#: builtin/commit.c:319 builtin/mv.c:90 builtin/reset.c:234 builtin/rm.c:299
 msgid "index file corrupt"
 msgstr "Staging-Area-Datei beschädigt"
 
-#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
+#: builtin/add.c:446 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:431
 msgid "Unable to write new index file"
 msgstr "Konnte neue Staging-Area-Datei nicht schreiben."
 
@@ -2091,41 +2102,41 @@
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "nicht erkannte Option zum Ignorieren von Whitespace: '%s'"
 
-#: builtin/apply.c:823
+#: builtin/apply.c:825
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr "Kann regulären Ausdruck für Zeitstempel %s nicht verarbeiten"
 
-#: builtin/apply.c:832
+#: builtin/apply.c:834
 #, 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:913
+#: builtin/apply.c:915
 #, 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:945
+#: builtin/apply.c:947
 #, 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:949
+#: builtin/apply.c:951
 #, 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:950
+#: builtin/apply.c:952
 #, 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:957
+#: builtin/apply.c:959
 #, 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"
@@ -2224,7 +2235,7 @@
 #: builtin/apply.c:2818
 #, 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"
+msgstr "Kontext reduziert zu (%ld/%ld), um Patch-Bereich bei %d anzuwenden"
 
 #: builtin/apply.c:2824
 #, c-format
@@ -2240,18 +2251,18 @@
 msgid "missing binary patch data for '%s'"
 msgstr "keine Daten in Binär-Patch für '%s'"
 
-#: builtin/apply.c:2946
+#: builtin/apply.c:2944
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "Konnte Binär-Patch nicht auf '%s' anwenden"
 
-#: builtin/apply.c:2952
+#: builtin/apply.c:2950
 #, 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:2973
+#: builtin/apply.c:2971
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "Anwendung des Patches fehlgeschlagen: %s:%ld"
@@ -2340,230 +2351,230 @@
 msgid "unable to remove %s from index"
 msgstr "konnte %s nicht aus der Staging-Area entfernen"
 
-#: builtin/apply.c:3851
+#: builtin/apply.c:3852
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr "fehlerhafter Patch für Submodul %s"
 
-#: builtin/apply.c:3855
+#: builtin/apply.c:3856
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr "konnte neu erstellte Datei '%s' nicht lesen"
 
-#: builtin/apply.c:3860
+#: builtin/apply.c:3861
 #, 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:3863 builtin/apply.c:3971
+#: builtin/apply.c:3864 builtin/apply.c:3972
 #, 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:3896
+#: builtin/apply.c:3897
 #, c-format
 msgid "closing file '%s'"
 msgstr "schließe Datei '%s'"
 
-#: builtin/apply.c:3945
+#: builtin/apply.c:3946
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "konnte Datei '%s' mit Modus %o nicht schreiben"
 
-#: builtin/apply.c:4032
+#: builtin/apply.c:4033
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "Patch %s sauber angewendet"
 
-#: builtin/apply.c:4040
+#: builtin/apply.c:4041
 msgid "internal error"
 msgstr "interner Fehler"
 
-#: builtin/apply.c:4043
+#: builtin/apply.c:4044
 #, 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:4053
+#: builtin/apply.c:4054
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "Verkürze Name von .rej Datei zu %.*s.rej"
 
-#: builtin/apply.c:4074
+#: builtin/apply.c:4075
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "Patch-Bereich #%d sauber angewendet."
 
-#: builtin/apply.c:4077
+#: builtin/apply.c:4078
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "Patch-Block #%d zurückgewiesen."
 
-#: builtin/apply.c:4227
+#: builtin/apply.c:4228
 msgid "unrecognized input"
 msgstr "nicht erkannte Eingabe"
 
-#: builtin/apply.c:4238
+#: builtin/apply.c:4239
 msgid "unable to read index file"
 msgstr "Konnte Staging-Area-Datei nicht lesen"
 
-#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90
-#: builtin/fetch.c:78
+#: builtin/apply.c:4358 builtin/apply.c:4361 builtin/clone.c:90
+#: builtin/fetch.c:93
 msgid "path"
 msgstr "Pfad"
 
-#: builtin/apply.c:4358
+#: builtin/apply.c:4359
 msgid "don't apply changes matching the given path"
 msgstr "wendet keine Änderungen im angegebenen Pfad an"
 
-#: builtin/apply.c:4361
+#: builtin/apply.c:4362
 msgid "apply changes matching the given path"
 msgstr "wendet Änderungen nur im angegebenen Pfad an"
 
-#: builtin/apply.c:4363
+#: builtin/apply.c:4364
 msgid "num"
 msgstr "Anzahl"
 
-#: builtin/apply.c:4364
+#: builtin/apply.c:4365
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr ""
 "entfernt <Anzahl> vorangestellte Schrägstriche von herkömmlichen "
 "Differenzpfaden"
 
-#: builtin/apply.c:4367
+#: builtin/apply.c:4368
 msgid "ignore additions made by the patch"
 msgstr "ignoriert hinzugefügte Zeilen des Patches"
 
-#: builtin/apply.c:4369
+#: builtin/apply.c:4370
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr ""
 "anstatt der Anwendung des Patches, wird der \"diffstat\" für die Eingabe "
 "ausgegeben"
 
-#: builtin/apply.c:4373
+#: builtin/apply.c:4374
 msgid "show number of added and deleted lines in decimal notation"
 msgstr ""
 "zeigt die Anzahl von hinzugefügten/entfernten Zeilen in Dezimalnotation"
 
-#: builtin/apply.c:4375
+#: builtin/apply.c:4376
 msgid "instead of applying the patch, output a summary for the input"
 msgstr ""
 "anstatt der Anwendung des Patches, wird eine Zusammenfassung für die Eingabe "
 "ausgegeben"
 
-#: builtin/apply.c:4377
+#: builtin/apply.c:4378
 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:4379
+#: builtin/apply.c:4380
 msgid "make sure the patch is applicable to the current index"
 msgstr ""
 "stellt sicher, dass der Patch in der aktuellen Staging-Area angewendet "
 "werden kann"
 
-#: builtin/apply.c:4381
+#: builtin/apply.c:4382
 msgid "apply a patch without touching the working tree"
 msgstr ""
 "wendet einen Patch an, ohne Änderungen im Arbeitsverzeichnis vorzunehmen"
 
-#: builtin/apply.c:4383
+#: builtin/apply.c:4384
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr "wendet den Patch an (Benutzung mit --stat/--summary/--check)"
 
-#: builtin/apply.c:4385
+#: builtin/apply.c:4386
 msgid "attempt three-way merge if a patch does not apply"
 msgstr "versucht 3-Wege-Merge, wenn der Patch nicht angewendet werden konnte"
 
-#: builtin/apply.c:4387
+#: builtin/apply.c:4388
 msgid "build a temporary index based on embedded index information"
 msgstr ""
 "erstellt eine temporäre Staging-Area basierend auf den integrierten Staging-"
 "Area-Informationen"
 
-#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
+#: builtin/apply.c:4390 builtin/checkout-index.c:198 builtin/ls-files.c:455
 msgid "paths are separated with NUL character"
 msgstr "Pfade sind getrennt durch NUL Zeichen"
 
-#: builtin/apply.c:4392
+#: builtin/apply.c:4393
 msgid "ensure at least <n> lines of context match"
 msgstr "stellt sicher, dass mindestens <n> Zeilen des Kontextes übereinstimmen"
 
-#: builtin/apply.c:4393
+#: builtin/apply.c:4394
 msgid "action"
 msgstr "Aktion"
 
-#: builtin/apply.c:4394
+#: builtin/apply.c:4395
 msgid "detect new or modified lines that have whitespace errors"
 msgstr "ermittelt neue oder geänderte Zeilen die Whitespace-Fehler haben"
 
-#: builtin/apply.c:4397 builtin/apply.c:4400
+#: builtin/apply.c:4398 builtin/apply.c:4401
 msgid "ignore changes in whitespace when finding context"
 msgstr "ignoriert Änderungen im Whitespace bei der Suche des Kontextes"
 
-#: builtin/apply.c:4403
+#: builtin/apply.c:4404
 msgid "apply the patch in reverse"
 msgstr "wendet den Patch in umgekehrter Reihenfolge an"
 
-#: builtin/apply.c:4405
+#: builtin/apply.c:4406
 msgid "don't expect at least one line of context"
 msgstr "erwartet keinen Kontext"
 
-#: builtin/apply.c:4407
+#: builtin/apply.c:4408
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr ""
 "hinterlässt zurückgewiesene Patch-Blöcke in entsprechenden *.rej Dateien"
 
-#: builtin/apply.c:4409
+#: builtin/apply.c:4410
 msgid "allow overlapping hunks"
 msgstr "erlaubt sich überlappende Patch-Blöcke"
 
-#: builtin/apply.c:4412
+#: builtin/apply.c:4413
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr "toleriert fehlerhaft erkannten fehlenden Zeilenumbruch am Dateiende"
 
-#: builtin/apply.c:4415
+#: builtin/apply.c:4416
 msgid "do not trust the line counts in the hunk headers"
 msgstr "vertraut nicht den Zeilennummern im Kopf des Patch-Blocks"
 
-#: builtin/apply.c:4417
+#: builtin/apply.c:4418
 msgid "root"
 msgstr "Wurzelverzeichnis"
 
-#: builtin/apply.c:4418
+#: builtin/apply.c:4419
 msgid "prepend <root> to all filenames"
 msgstr "stellt <Wurzelverzeichnis> vor alle Dateinamen"
 
-#: builtin/apply.c:4440
+#: builtin/apply.c:4441
 msgid "--3way outside a repository"
 msgstr ""
 "Die Option --3way kann nicht außerhalb eines Repositories verwendet werden."
 
-#: builtin/apply.c:4448
+#: builtin/apply.c:4449
 msgid "--index outside a repository"
 msgstr ""
 "Die Option --index kann nicht außerhalb eines Repositories verwendet werden."
 
-#: builtin/apply.c:4451
+#: builtin/apply.c:4452
 msgid "--cached outside a repository"
 msgstr ""
 "Die Option --cached kann nicht außerhalb eines Repositories verwendet werden."
 
-#: builtin/apply.c:4467
+#: builtin/apply.c:4468
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "kann Patch '%s' nicht öffnen"
 
-#: builtin/apply.c:4481
+#: builtin/apply.c:4482
 #, 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:4487 builtin/apply.c:4497
+#: builtin/apply.c:4488 builtin/apply.c:4498
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -2617,107 +2628,117 @@
 msgid "update BISECT_HEAD instead of checking out the current commit"
 msgstr "aktualisiert BISECT_HEAD, anstatt den aktuellen Commit auszuchecken"
 
-#: builtin/blame.c:27
+#: builtin/blame.c:30
 msgid "git blame [options] [rev-opts] [rev] [--] file"
 msgstr "git blame [Optionen] [rev-opts] [rev] [--] Datei"
 
-#: builtin/blame.c:32
+#: builtin/blame.c:35
 msgid "[rev-opts] are documented in git-rev-list(1)"
 msgstr "[rev-opts] sind dokumentiert in git-rev-list(1)"
 
-#: builtin/blame.c:2242
+#: builtin/blame.c:2501
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Zeigt \"blame\"-Einträge schrittweise, während wir sie generieren"
 
-#: builtin/blame.c:2243
+#: builtin/blame.c:2502
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "Zeigt leere SHA-1 für Grenz-Commits (Standard: aus)"
 
-#: builtin/blame.c:2244
+#: builtin/blame.c:2503
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Behandelt Ursprungs-Commit nicht als Grenzen (Standard: aus)"
 
-#: builtin/blame.c:2245
+#: builtin/blame.c:2504
 msgid "Show work cost statistics"
 msgstr "Zeigt Statistiken zum Arbeitsaufwand"
 
-#: builtin/blame.c:2246
+#: builtin/blame.c:2505
 msgid "Show output score for blame entries"
 msgstr "Zeigt Ausgabebewertung für \"blame\"-Einträge"
 
-#: builtin/blame.c:2247
+#: builtin/blame.c:2506
 msgid "Show original filename (Default: auto)"
 msgstr "Zeigt ursprünglichen Dateinamen (Standard: auto)"
 
-#: builtin/blame.c:2248
+#: builtin/blame.c:2507
 msgid "Show original linenumber (Default: off)"
 msgstr "Zeigt ursprüngliche Zeilennummer (Standard: aus)"
 
-#: builtin/blame.c:2249
+#: builtin/blame.c:2508
 msgid "Show in a format designed for machine consumption"
 msgstr "Anzeige in einem Format für maschinelle Auswertung"
 
-#: builtin/blame.c:2250
+#: builtin/blame.c:2509
 msgid "Show porcelain format with per-line commit information"
 msgstr ""
 "Anzeige in Format für Fremdprogramme mit Commit-Informationen pro Zeile"
 
-#: builtin/blame.c:2251
+#: builtin/blame.c:2510
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "Benutzt den gleichen Ausgabemodus wie \"git-annotate\" (Standard: aus)"
 
-#: builtin/blame.c:2252
+#: builtin/blame.c:2511
 msgid "Show raw timestamp (Default: off)"
 msgstr "Zeigt unbearbeiteten Zeitstempel (Standard: aus)"
 
-#: builtin/blame.c:2253
+#: builtin/blame.c:2512
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Zeigt langen Commit-SHA1 (Standard: aus)"
 
-#: builtin/blame.c:2254
+#: builtin/blame.c:2513
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Unterdrückt den Namen des Autors und den Zeitstempel (Standard: aus)"
 
-#: builtin/blame.c:2255
+#: builtin/blame.c:2514
 msgid "Show author email instead of name (Default: off)"
-msgstr "Zeigt anstatt des Namens die Email-Adresse des Autors (Standard: aus)"
+msgstr "Zeigt anstatt des Namens die E-Mail-Adresse des Autors (Standard: aus)"
 
-#: builtin/blame.c:2256
+#: builtin/blame.c:2515
 msgid "Ignore whitespace differences"
 msgstr "Ignoriert Unterschiede im Whitespace"
 
-#: builtin/blame.c:2257
+#: builtin/blame.c:2516
 msgid "Spend extra cycles to find better match"
 msgstr "arbeite länger, um bessere Übereinstimmungen zu finden"
 
-#: builtin/blame.c:2258
+#: builtin/blame.c:2517
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Benutzt Commits von <Datei> anstatt \"git-rev-list\" aufzurufen"
 
-#: builtin/blame.c:2259
+#: builtin/blame.c:2518
 msgid "Use <file>'s contents as the final image"
 msgstr "Benutzt Inhalte der <Datei>en als entgültiges Abbild"
 
-#: builtin/blame.c:2260 builtin/blame.c:2261
+#: builtin/blame.c:2519 builtin/blame.c:2520
 msgid "score"
 msgstr "Bewertung"
 
-#: builtin/blame.c:2260
+#: builtin/blame.c:2519
 msgid "Find line copies within and across files"
 msgstr "Findet kopierte Zeilen innerhalb oder zwischen Dateien"
 
-#: builtin/blame.c:2261
+#: builtin/blame.c:2520
 msgid "Find line movements within and across files"
 msgstr "Findet verschobene Zeilen innerhalb oder zwischen Dateien"
 
-#: builtin/blame.c:2262
+#: builtin/blame.c:2521
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2262
+#: builtin/blame.c:2521
 msgid "Process only line range n,m, counting from 1"
 msgstr "Verarbeitet nur Zeilen im Bereich n,m, gezählt von 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:2599
+msgid "4 years, 11 months ago"
+msgstr "vor 4 Jahren, und 11 Monaten"
+
 #: builtin/branch.c:24
 msgid "git branch [options] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [Optionen] [-r | -a] [--merged | --no-merged]"
@@ -2961,9 +2982,9 @@
 msgstr "wirkt auf Remote-Tracking-Branches"
 
 #: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844
-#: builtin/branch.c:850 builtin/commit.c:1494 builtin/commit.c:1495
-#: builtin/commit.c:1496 builtin/commit.c:1497 builtin/tag.c:527
-#: builtin/tag.c:533
+#: builtin/branch.c:850 builtin/commit.c:1573 builtin/commit.c:1574
+#: builtin/commit.c:1575 builtin/commit.c:1576 builtin/tag.c:615
+#: builtin/tag.c:621
 msgid "commit"
 msgstr "Commit"
 
@@ -3028,7 +3049,7 @@
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Konnte HEAD nicht als gültige Referenz auflösen."
 
-#: builtin/branch.c:872 builtin/clone.c:635
+#: builtin/branch.c:872 builtin/clone.c:636
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD wurde nicht unter \"refs/heads\" gefunden!"
 
@@ -3064,7 +3085,7 @@
 
 #: builtin/branch.c:952
 msgid "too many branches to set new upstream"
-msgstr "zu viele Branches angegeben um Upstream-Branch zu setzen"
+msgstr "zu viele Branches angegeben, um Upstream-Branch zu setzen"
 
 #: builtin/branch.c:956
 #, c-format
@@ -3087,7 +3108,7 @@
 #: builtin/branch.c:975
 msgid "too many branches to unset upstream"
 msgstr ""
-"zu viele Branches angegeben um Konfiguration zu Upstream-Branch zu entfernen"
+"zu viele Branches angegeben, um Konfiguration zu Upstream-Branch zu entfernen"
 
 #: builtin/branch.c:979
 msgid "could not unset upstream of HEAD when it does not point to any branch."
@@ -3221,7 +3242,7 @@
 msgid "terminate input and output records by a NUL character"
 msgstr "schließt Einträge von Ein- und Ausgabe mit NUL-Zeichen ab"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
+#: builtin/check-ignore.c:18 builtin/checkout.c:1083 builtin/gc.c:285
 msgid "suppress progress reporting"
 msgstr "unterdrückt Fortschrittsanzeige"
 
@@ -3279,46 +3300,46 @@
 msgid "git checkout-index [options] [--] [<file>...]"
 msgstr "git checkout-index [Optionen] [--] [<Datei>...]"
 
-#: builtin/checkout-index.c:187
+#: builtin/checkout-index.c:188
 msgid "check out all files in the index"
 msgstr "checkt alle Dateien in der Staging-Area aus"
 
-#: builtin/checkout-index.c:188
+#: builtin/checkout-index.c:189
 msgid "force overwrite of existing files"
 msgstr "erzwingt das Überschreiben bereits existierender Dateien"
 
-#: builtin/checkout-index.c:190
+#: builtin/checkout-index.c:191
 msgid "no warning for existing files and files not in index"
 msgstr ""
 "keine Warnung für existierende Dateien, und Dateien, die sich nicht in der "
 "Staging-Area befinden"
 
-#: builtin/checkout-index.c:192
+#: builtin/checkout-index.c:193
 msgid "don't checkout new files"
 msgstr "checkt keine neuen Dateien aus"
 
-#: builtin/checkout-index.c:194
+#: builtin/checkout-index.c:195
 msgid "update stat information in the index file"
 msgstr "aktualisiert Dateiinformationen in der Staging-Area-Datei"
 
-#: builtin/checkout-index.c:200
+#: builtin/checkout-index.c:201
 msgid "read list of paths from the standard input"
 msgstr "liest eine Liste von Pfaden von der Standard-Eingabe"
 
-#: builtin/checkout-index.c:202
+#: builtin/checkout-index.c:203
 msgid "write the content to temporary files"
 msgstr "schreibt den Inhalt in temporäre Dateien"
 
-#: builtin/checkout-index.c:203 builtin/column.c:30
+#: builtin/checkout-index.c:204 builtin/column.c:30
 msgid "string"
 msgstr "Zeichenkette"
 
-#: builtin/checkout-index.c:204
+#: builtin/checkout-index.c:205
 msgid "when creating files, prepend <string>"
 msgstr ""
 "wenn Dateien erzeugt werden, stelle <Zeichenkette> dem Dateinamen voran"
 
-#: builtin/checkout-index.c:207
+#: builtin/checkout-index.c:208
 msgid "copy out the files from named stage"
 msgstr "kopiert Dateien von dem benannten Stand"
 
@@ -3360,76 +3381,76 @@
 msgid "Unable to add merge result for '%s'"
 msgstr "Konnte Merge-Ergebnis von '%s' nicht hinzufügen."
 
-#: builtin/checkout.c:232 builtin/checkout.c:235 builtin/checkout.c:238
-#: builtin/checkout.c:241
+#: builtin/checkout.c:231 builtin/checkout.c:234 builtin/checkout.c:237
+#: builtin/checkout.c:240
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "'%s' kann nicht mit Pfaden verwendet werden"
 
-#: builtin/checkout.c:244 builtin/checkout.c:247
+#: builtin/checkout.c:243 builtin/checkout.c:246
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' kann nicht mit '%s' verwendet werden"
 
-#: builtin/checkout.c:250
+#: builtin/checkout.c:249
 #, 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:261 builtin/checkout.c:450
+#: builtin/checkout.c:260 builtin/checkout.c:449
 msgid "corrupt index file"
 msgstr "beschädigte Staging-Area-Datei"
 
-#: builtin/checkout.c:321 builtin/checkout.c:328
+#: builtin/checkout.c:320 builtin/checkout.c:327
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "Pfad '%s' ist nicht zusammengeführt."
 
-#: builtin/checkout.c:472
+#: builtin/checkout.c:471
 msgid "you need to resolve your current index first"
 msgstr "Sie müssen zuerst Ihre aktuelle Staging-Area auflösen."
 
-#: builtin/checkout.c:593
+#: builtin/checkout.c:591
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr "Konnte \"reflog\" für '%s' nicht durchführen\n"
 
-#: builtin/checkout.c:631
+#: builtin/checkout.c:629
 msgid "HEAD is now at"
 msgstr "HEAD ist jetzt bei"
 
-#: builtin/checkout.c:638
+#: builtin/checkout.c:636
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Setze Branch '%s' neu\n"
 
-#: builtin/checkout.c:641
+#: builtin/checkout.c:639
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Bereits auf '%s'\n"
 
-#: builtin/checkout.c:645
+#: builtin/checkout.c:643
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
-msgstr "Gewechselt zu umgesetzten Branch '%s'\n"
+msgstr "Zu umgesetztem Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:647 builtin/checkout.c:1032
+#: builtin/checkout.c:645 builtin/checkout.c:1026
 #, c-format
 msgid "Switched to a new branch '%s'\n"
-msgstr "Gewechselt zu einem neuem Branch '%s'\n"
+msgstr "Zu neuem Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:649
+#: builtin/checkout.c:647
 #, c-format
 msgid "Switched to branch '%s'\n"
-msgstr "Gewechselt zu Branch '%s'\n"
+msgstr "Zu Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:705
+#: builtin/checkout.c:699
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... und %d weitere.\n"
 
-#: builtin/checkout.c:711
+#: builtin/checkout.c:705
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -3452,7 +3473,7 @@
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:729
+#: builtin/checkout.c:723
 #, c-format
 msgid ""
 "If you want to keep them by creating a new branch, this may be a good time\n"
@@ -3467,139 +3488,139 @@
 " git branch neuer_branch_name %s\n"
 "\n"
 
-#: builtin/checkout.c:759
+#: builtin/checkout.c:753
 msgid "internal error in revision walk"
 msgstr "interner Fehler im Revisionsgang"
 
-#: builtin/checkout.c:763
+#: builtin/checkout.c:757
 msgid "Previous HEAD position was"
 msgstr "Vorherige Position von HEAD war"
 
-#: builtin/checkout.c:790 builtin/checkout.c:1027
+#: builtin/checkout.c:784 builtin/checkout.c:1021
 msgid "You are on a branch yet to be born"
 msgstr "Sie sind auf einem Branch, der noch geboren wird"
 
-#: builtin/checkout.c:934
+#: builtin/checkout.c:928
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "nur eine Referenz erwartet, %d gegeben."
 
-#: builtin/checkout.c:973
+#: builtin/checkout.c:967
 #, c-format
 msgid "invalid reference: %s"
 msgstr "Ungültige Referenz: %s"
 
-#: builtin/checkout.c:1002
+#: builtin/checkout.c:996
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "Referenz ist kein \"Tree\"-Objekt: %s"
 
-#: builtin/checkout.c:1041
+#: builtin/checkout.c:1035
 msgid "paths cannot be used with switching branches"
 msgstr "Pfade können nicht beim Wechseln von Branches verwendet werden"
 
-#: builtin/checkout.c:1044 builtin/checkout.c:1048
+#: builtin/checkout.c:1038 builtin/checkout.c:1042
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' kann nicht beim Wechseln von Branches verwendet werden"
 
-#: builtin/checkout.c:1052 builtin/checkout.c:1055 builtin/checkout.c:1060
-#: builtin/checkout.c:1063
+#: builtin/checkout.c:1046 builtin/checkout.c:1049 builtin/checkout.c:1054
+#: builtin/checkout.c:1057
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' kann nicht mit '%s' verwendet werden"
 
-#: builtin/checkout.c:1068
+#: builtin/checkout.c:1062
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Kann Branch nicht zu Nicht-Commit '%s' wechseln"
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
+#: builtin/checkout.c:1084 builtin/checkout.c:1086 builtin/clone.c:88
 #: builtin/remote.c:159 builtin/remote.c:161
 msgid "branch"
 msgstr "Branch"
 
-#: builtin/checkout.c:1091
+#: builtin/checkout.c:1085
 msgid "create and checkout a new branch"
 msgstr "erzeugt und checkt einen neuen Branch aus"
 
-#: builtin/checkout.c:1093
+#: builtin/checkout.c:1087
 msgid "create/reset and checkout a branch"
 msgstr "erzeugt/setzt um und checkt einen Branch aus"
 
-#: builtin/checkout.c:1094
+#: builtin/checkout.c:1088
 msgid "create reflog for new branch"
 msgstr "erzeugt das Reflog für den neuen Branch"
 
-#: builtin/checkout.c:1095
+#: builtin/checkout.c:1089
 msgid "detach the HEAD at named commit"
 msgstr "setzt HEAD zu benanntem Commit"
 
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1090
 msgid "set upstream info for new branch"
 msgstr "setzt Informationen zum Upstream-Branch für den neuen Branch"
 
-#: builtin/checkout.c:1098
+#: builtin/checkout.c:1092
 msgid "new-branch"
 msgstr "neuer Branch"
 
-#: builtin/checkout.c:1098
+#: builtin/checkout.c:1092
 msgid "new unparented branch"
 msgstr "neuer Branch ohne Eltern-Commit"
 
-#: builtin/checkout.c:1099
+#: builtin/checkout.c:1093
 msgid "checkout our version for unmerged files"
 msgstr "checkt unsere Variante für nicht zusammengeführte Dateien aus"
 
-#: builtin/checkout.c:1101
+#: builtin/checkout.c:1095
 msgid "checkout their version for unmerged files"
 msgstr "checkt ihre Variante für nicht zusammengeführte Dateien aus"
 
-#: builtin/checkout.c:1103
+#: builtin/checkout.c:1097
 msgid "force checkout (throw away local modifications)"
 msgstr "erzwingt Auschecken (verwirft lokale Änderungen)"
 
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1098
 msgid "perform a 3-way merge with the new branch"
 msgstr "führt einen 3-Wege-Merge mit dem neuen Branch aus"
 
-#: builtin/checkout.c:1105 builtin/merge.c:225
+#: builtin/checkout.c:1099 builtin/merge.c:225
 msgid "update ignored files (default)"
 msgstr "aktualisiert ignorierte Dateien (Standard)"
 
-#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
+#: builtin/checkout.c:1100 builtin/log.c:1236 parse-options.h:245
 msgid "style"
 msgstr "Stil"
 
-#: builtin/checkout.c:1107
+#: builtin/checkout.c:1101
 msgid "conflict style (merge or diff3)"
 msgstr "Konfliktstil (merge oder diff3)"
 
-#: builtin/checkout.c:1110
+#: builtin/checkout.c:1104
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "Pfadspezifikationen ignorieren Einstellungen zum partiellen Auschecken"
 
-#: builtin/checkout.c:1112
+#: builtin/checkout.c:1106
 msgid "second guess 'git checkout no-such-branch'"
 msgstr "second guess 'git checkout no-such-branch'"
 
-#: builtin/checkout.c:1135
+#: builtin/checkout.c:1129
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "Die Optionen -b, -B und --orphan schließen sich gegenseitig aus."
 
-#: builtin/checkout.c:1152
+#: builtin/checkout.c:1146
 msgid "--track needs a branch name"
 msgstr "Bei der Option --track muss ein Branchname angegeben werden."
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1153
 msgid "Missing branch name; try -b"
 msgstr "Vermisse Branchnamen; versuchen Sie -b"
 
-#: builtin/checkout.c:1196
+#: builtin/checkout.c:1190
 msgid "invalid path specification"
 msgstr "ungültige Pfadspezifikation"
 
-#: builtin/checkout.c:1203
+#: builtin/checkout.c:1197
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3609,12 +3630,12 @@
 "Haben Sie beabsichtigt '%s' auszuchecken, welcher nicht als Commit aufgelöst "
 "werden kann?"
 
-#: builtin/checkout.c:1208
+#: builtin/checkout.c:1202
 #, 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:1212
+#: builtin/checkout.c:1206
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -3690,30 +3711,30 @@
 msgid "Huh (%s)?"
 msgstr "Wie bitte (%s)?"
 
-#: builtin/clean.c:660
+#: builtin/clean.c:659
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Ignorier-Muster eingeben>> "
 
-#: builtin/clean.c:697
+#: builtin/clean.c:696
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "WARNUNG: Kann keine Einträge finden die Muster entsprechen: %s"
 
-#: builtin/clean.c:718
+#: builtin/clean.c:717
 msgid "Select items to delete"
 msgstr "Wählen Sie Einträge zum Löschen"
 
-#: builtin/clean.c:758
+#: builtin/clean.c:757
 #, c-format
 msgid "remove %s? "
 msgstr "'%s' löschen? "
 
-#: builtin/clean.c:783
+#: builtin/clean.c:782
 msgid "Bye."
 msgstr "Tschüss."
 
-#: builtin/clean.c:791
+#: builtin/clean.c:790
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -3731,62 +3752,62 @@
 "help                - diese Meldung anzeigen\n"
 "?                   - Hilfe zur Auswahl mittels Eingabe anzeigen"
 
-#: builtin/clean.c:818
+#: builtin/clean.c:817
 msgid "*** Commands ***"
 msgstr "*** Kommandos ***"
 
-#: builtin/clean.c:819
+#: builtin/clean.c:818
 msgid "What now"
 msgstr "Was nun"
 
-#: builtin/clean.c:827
+#: builtin/clean.c:826
 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:844
+#: builtin/clean.c:843
 msgid "No more files to clean, exiting."
 msgstr "Keine Dateien mehr zum Löschen, beende."
 
-#: builtin/clean.c:875
+#: builtin/clean.c:874
 msgid "do not print names of files removed"
 msgstr "gibt keine Namen von gelöschten Dateien aus"
 
-#: builtin/clean.c:877
+#: builtin/clean.c:876
 msgid "force"
 msgstr "erzwingt Aktion"
 
-#: builtin/clean.c:878
+#: builtin/clean.c:877
 msgid "interactive cleaning"
 msgstr "interaktives Clean"
 
-#: builtin/clean.c:880
+#: builtin/clean.c:879
 msgid "remove whole directories"
 msgstr "löscht ganze Verzeichnisse"
 
-#: builtin/clean.c:881 builtin/describe.c:415 builtin/grep.c:716
-#: builtin/ls-files.c:486 builtin/name-rev.c:314 builtin/show-ref.c:185
+#: builtin/clean.c:880 builtin/describe.c:406 builtin/grep.c:714
+#: builtin/ls-files.c:486 builtin/name-rev.c:311 builtin/show-ref.c:185
 msgid "pattern"
 msgstr "Muster"
 
-#: builtin/clean.c:882
+#: builtin/clean.c:881
 msgid "add <pattern> to ignore rules"
 msgstr "fügt <Muster> zu den Regeln für ignorierte Pfade hinzu"
 
-#: builtin/clean.c:883
+#: builtin/clean.c:882
 msgid "remove ignored files, too"
 msgstr "löscht auch ignorierte Dateien"
 
-#: builtin/clean.c:885
+#: builtin/clean.c:884
 msgid "remove only ignored files"
 msgstr "löscht nur ignorierte Dateien"
 
-#: builtin/clean.c:903
+#: builtin/clean.c:902
 msgid "-x and -X cannot be used together"
 msgstr "Die Optionen -x und -X können nicht gemeinsam verwendet werden."
 
-#: builtin/clean.c:907
+#: builtin/clean.c:906
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
@@ -3794,7 +3815,7 @@
 "clean.requireForce auf \"true\" gesetzt und weder -i, -n noch -f gegeben; "
 "\"clean\" verweigert"
 
-#: builtin/clean.c:910
+#: builtin/clean.c:909
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -3806,8 +3827,8 @@
 msgid "git clone [options] [--] <repo> [<dir>]"
 msgstr "git clone [Optionen] [--] <Repository> [<Verzeichnis>]"
 
-#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:504
+#: builtin/clone.c:64 builtin/fetch.c:112 builtin/merge.c:222
+#: builtin/push.c:503
 msgid "force progress reporting"
 msgstr "erzwingt Fortschrittsanzeige"
 
@@ -3867,7 +3888,7 @@
 msgid "path to git-upload-pack on the remote"
 msgstr "Pfad zu \"git-upload-pack\" auf der Gegenseite"
 
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
+#: builtin/clone.c:92 builtin/fetch.c:113 builtin/grep.c:659
 msgid "depth"
 msgstr "Tiefe"
 
@@ -3973,100 +3994,100 @@
 msgid "remote did not send all necessary objects"
 msgstr "Remote-Repository hat nicht alle erforderlichen Objekte gesendet."
 
-#: builtin/clone.c:626
+#: builtin/clone.c:627
 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:657
+#: builtin/clone.c:658
 msgid "unable to checkout working tree"
 msgstr "Arbeitsverzeichnis konnte nicht ausgecheckt werden"
 
-#: builtin/clone.c:765
+#: builtin/clone.c:768
 msgid "Too many arguments."
 msgstr "Zu viele Argumente."
 
-#: builtin/clone.c:769
+#: builtin/clone.c:772
 msgid "You must specify a repository to clone."
 msgstr "Sie müssen ein Repository zum Klonen angeben."
 
-#: builtin/clone.c:780
+#: builtin/clone.c:783
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "Die Optionen --bare und --origin %s sind inkompatibel."
 
-#: builtin/clone.c:783
+#: builtin/clone.c:786
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "Die Optionen --bare und --separate-git-dir sind inkompatibel."
 
-#: builtin/clone.c:796
+#: builtin/clone.c:799
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "Repository '%s' existiert nicht."
 
-#: builtin/clone.c:802
+#: builtin/clone.c:805 builtin/fetch.c:1143
+#, c-format
+msgid "depth %s is not a positive number"
+msgstr "Tiefe %s ist keine positive Zahl"
+
+#: builtin/clone.c:815
+#, 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:825
+#, c-format
+msgid "working tree '%s' already exists."
+msgstr "Arbeitsverzeichnis '%s' existiert bereits."
+
+#: builtin/clone.c:838 builtin/clone.c:850
+#, c-format
+msgid "could not create leading directories of '%s'"
+msgstr "Konnte führende Verzeichnisse von '%s' nicht erstellen."
+
+#: builtin/clone.c:841
+#, c-format
+msgid "could not create work tree dir '%s'."
+msgstr "Konnte Arbeitsverzeichnis '%s' nicht erstellen."
+
+#: builtin/clone.c:860
+#, c-format
+msgid "Cloning into bare repository '%s'...\n"
+msgstr "Klone in Bare-Repository '%s'...\n"
+
+#: builtin/clone.c:862
+#, c-format
+msgid "Cloning into '%s'...\n"
+msgstr "Klone nach '%s'...\n"
+
+#: builtin/clone.c:898
 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:805
+#: builtin/clone.c:901
 msgid "source repository is shallow, ignoring --local"
 msgstr ""
 "Quelle ist ein Repository mit unvollständiger Historie (shallow),ignoriere --"
 "local"
 
-#: builtin/clone.c:810
+#: builtin/clone.c:906
 msgid "--local is ignored"
 msgstr "--local wird ignoriert"
 
-#: builtin/clone.c:814 builtin/fetch.c:1119
-#, c-format
-msgid "depth %s is not a positive number"
-msgstr "Tiefe %s ist keine positive Zahl"
-
-#: builtin/clone.c:824
-#, 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:834
-#, c-format
-msgid "working tree '%s' already exists."
-msgstr "Arbeitsverzeichnis '%s' existiert bereits."
-
-#: builtin/clone.c:847 builtin/clone.c:859
-#, c-format
-msgid "could not create leading directories of '%s'"
-msgstr "Konnte führende Verzeichnisse von '%s' nicht erstellen."
-
-#: builtin/clone.c:850
-#, c-format
-msgid "could not create work tree dir '%s'."
-msgstr "Konnte Arbeitsverzeichnis '%s' nicht erstellen."
-
-#: builtin/clone.c:869
-#, c-format
-msgid "Cloning into bare repository '%s'...\n"
-msgstr "Klone in Bare-Repository '%s'...\n"
-
-#: builtin/clone.c:871
-#, c-format
-msgid "Cloning into '%s'...\n"
-msgstr "Klone nach '%s'...\n"
-
-#: builtin/clone.c:906
+#: builtin/clone.c:910
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Weiß nicht wie %s zu klonen ist."
 
-#: builtin/clone.c:957 builtin/clone.c:965
+#: builtin/clone.c:961 builtin/clone.c:969
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Remote-Branch %s nicht im Upstream-Repository %s gefunden"
 
-#: builtin/clone.c:968
+#: builtin/clone.c:972
 msgid "You appear to have cloned an empty repository."
 msgstr "Sie scheinen ein leeres Repository geklont zu haben."
 
@@ -4185,90 +4206,99 @@
 msgid "failed to unpack HEAD tree object"
 msgstr "Fehler beim Entpacken des \"Tree\"-Objektes von HEAD."
 
-#: builtin/commit.c:330
+#: builtin/commit.c:328
 msgid "unable to create temporary index"
 msgstr "Konnte temporäre Staging-Area nicht erstellen."
 
-#: builtin/commit.c:336
+#: builtin/commit.c:334
 msgid "interactive add failed"
 msgstr "interaktives Hinzufügen fehlgeschlagen"
 
-#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
+#: builtin/commit.c:366 builtin/commit.c:387 builtin/commit.c:435
 msgid "unable to write new_index file"
 msgstr "Konnte new_index Datei nicht schreiben"
 
-#: builtin/commit.c:421
+#: builtin/commit.c:418
 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:423
+#: builtin/commit.c:420
 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:433
+#: builtin/commit.c:429
 msgid "cannot read the index"
 msgstr "Kann Staging-Area nicht lesen"
 
-#: builtin/commit.c:453
+#: builtin/commit.c:447
 msgid "unable to write temporary index file"
 msgstr "Konnte temporäre Staging-Area-Datei nicht schreiben."
 
-#: builtin/commit.c:544 builtin/commit.c:550
+#: builtin/commit.c:557 builtin/commit.c:563
 #, c-format
 msgid "invalid commit: %s"
 msgstr "Ungültiger Commit: %s"
 
-#: builtin/commit.c:572
+#: builtin/commit.c:585
 msgid "malformed --author parameter"
 msgstr "Fehlerhafter --author Parameter"
 
 #: builtin/commit.c:592
 #, c-format
+msgid "invalid date format: %s"
+msgstr "Ungültiges Datumsformat: %s"
+
+#: builtin/commit.c:609
+#, c-format
 msgid "Malformed ident string: '%s'"
 msgstr "Fehlerhafter Ident-String: '%s'"
 
-#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
+#: builtin/commit.c:642
+msgid ""
+"unable to select a comment character that is not used\n"
+"in the current commit message"
+msgstr ""
+"Konnte kein Kommentar-Zeichen auswählen, das nicht in\n"
+"der aktuellen Commit-Beschreibung verwendet wird."
+
+#: builtin/commit.c:679 builtin/commit.c:712 builtin/commit.c:1086
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "Konnte Commit %s nicht nachschlagen"
 
-#: builtin/commit.c:641 builtin/shortlog.c:273
+#: builtin/commit.c:691 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:643
+#: builtin/commit.c:693
 msgid "could not read log from standard input"
 msgstr "Konnte Log nicht von Standard-Eingabe lesen."
 
-#: builtin/commit.c:647
+#: builtin/commit.c:697
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "Konnte Log-Datei '%s' nicht lesen"
 
-#: builtin/commit.c:654
-msgid "commit has empty message"
-msgstr "Commit hat eine leere Beschreibung"
-
-#: builtin/commit.c:670
+#: builtin/commit.c:719
 msgid "could not read MERGE_MSG"
 msgstr "Konnte MERGE_MSG nicht lesen"
 
-#: builtin/commit.c:674
+#: builtin/commit.c:723
 msgid "could not read SQUASH_MSG"
 msgstr "Konnte SQUASH_MSG nicht lesen"
 
-#: builtin/commit.c:678
+#: builtin/commit.c:727
 #, c-format
 msgid "could not read '%s'"
 msgstr "Konnte '%s' nicht lesen"
 
-#: builtin/commit.c:749
+#: builtin/commit.c:798
 msgid "could not write commit template"
 msgstr "Konnte Commit-Vorlage nicht schreiben"
 
-#: builtin/commit.c:764
+#: builtin/commit.c:816
 #, c-format
 msgid ""
 "\n"
@@ -4283,7 +4313,7 @@
 "\t%s\n"
 "und versuchen Sie es erneut.\n"
 
-#: builtin/commit.c:769
+#: builtin/commit.c:821
 #, c-format
 msgid ""
 "\n"
@@ -4298,7 +4328,7 @@
 "\t%s\n"
 "und versuchen Sie es erneut.\n"
 
-#: builtin/commit.c:782
+#: builtin/commit.c:834
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4308,7 +4338,7 @@
 "die mit '%c' beginnen, werden ignoriert, und eine leere Beschreibung\n"
 "bricht den Commit ab.\n"
 
-#: builtin/commit.c:789
+#: builtin/commit.c:841
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4321,150 +4351,155 @@
 "entfernen.\n"
 "Eine leere Beschreibung bricht den Commit ab.\n"
 
-#: builtin/commit.c:802
+#: builtin/commit.c:855
 #, c-format
-msgid "%sAuthor:    %s"
-msgstr "%sAutor:    %s"
+msgid "%sAuthor:    %.*s <%.*s>"
+msgstr  "%sAutor:           %.*s <%.*s>"
 
-#: builtin/commit.c:809
+#: builtin/commit.c:863
 #, c-format
-msgid "%sCommitter: %s"
-msgstr "%sCommit-Ersteller: %s"
+msgid "%sDate:      %s"
+msgstr "%sDatum:            %s"
 
-#: builtin/commit.c:829
+#: builtin/commit.c:870
+#, c-format
+msgid "%sCommitter: %.*s <%.*s>"
+msgstr "%sCommit-Ersteller: %.*s <%.*s>"
+
+#: builtin/commit.c:888
 msgid "Cannot read index"
 msgstr "Kann Staging-Area nicht lesen"
 
-#: builtin/commit.c:872
+#: builtin/commit.c:945
 msgid "Error building trees"
 msgstr "Fehler beim Erzeugen der \"Tree\"-Objekte"
 
-#: builtin/commit.c:887 builtin/tag.c:391
+#: builtin/commit.c:960 builtin/tag.c:495
 #, 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:989
+#: builtin/commit.c:1061
 #, c-format
 msgid "No existing author found with '%s'"
 msgstr "Kein existierender Autor mit '%s' gefunden."
 
-#: builtin/commit.c:1004 builtin/commit.c:1244
+#: builtin/commit.c:1076 builtin/commit.c:1316
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Ungültiger Modus '%s' für unbeobachtete Dateien"
 
-#: builtin/commit.c:1041
+#: builtin/commit.c:1113
 msgid "--long and -z are incompatible"
 msgstr "Die Optionen --long und -z sind inkompatibel."
 
-#: builtin/commit.c:1071
+#: builtin/commit.c:1143
 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:1080
+#: builtin/commit.c:1152
 msgid "You have nothing to amend."
 msgstr "Sie haben nichts für \"--amend\"."
 
-#: builtin/commit.c:1083
+#: builtin/commit.c:1155
 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:1085
+#: builtin/commit.c:1157
 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:1088
+#: builtin/commit.c:1160
 msgid "Options --squash and --fixup cannot be used together"
 msgstr ""
 "Die Optionen --squash und --fixup können nicht gemeinsam verwendet werden."
 
-#: builtin/commit.c:1098
+#: builtin/commit.c:1170
 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:1100
+#: builtin/commit.c:1172
 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:1108
+#: builtin/commit.c:1180
 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:1125
+#: builtin/commit.c:1197
 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:1127
+#: builtin/commit.c:1199
 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:1129
+#: builtin/commit.c:1201
 msgid "Clever... amending the last one with dirty index."
 msgstr ""
 "Klug... den letzten Commit mit einer geänderten Staging-Area nachbessern."
 
-#: builtin/commit.c:1131
+#: builtin/commit.c:1203
 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:1143 builtin/tag.c:639
+#: builtin/commit.c:1215 builtin/tag.c:727
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Ungültiger \"cleanup\" Modus %s"
 
-#: builtin/commit.c:1148
+#: builtin/commit.c:1220
 msgid "Paths with -a does not make sense."
 msgstr "Die Option -a kann nur mit der Angabe von Pfaden verwendet werden."
 
-#: builtin/commit.c:1258 builtin/commit.c:1516
+#: builtin/commit.c:1330 builtin/commit.c:1595
 msgid "show status concisely"
 msgstr "zeigt Status im Kurzformat"
 
-#: builtin/commit.c:1260 builtin/commit.c:1518
+#: builtin/commit.c:1332 builtin/commit.c:1597
 msgid "show branch information"
 msgstr "zeigt Branchinformationen"
 
-#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
+#: builtin/commit.c:1334 builtin/commit.c:1599 builtin/push.c:489
 msgid "machine-readable output"
 msgstr "maschinenlesbare Ausgabe"
 
-#: builtin/commit.c:1265 builtin/commit.c:1522
+#: builtin/commit.c:1337 builtin/commit.c:1601
 msgid "show status in long format (default)"
 msgstr "zeigt Status im Langformat (Standard)"
 
-#: builtin/commit.c:1268 builtin/commit.c:1525
+#: builtin/commit.c:1340 builtin/commit.c:1604
 msgid "terminate entries with NUL"
 msgstr "schließt Einträge mit NUL-Zeichen ab"
 
-#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:514
+#: builtin/commit.c:1342 builtin/commit.c:1607 builtin/fast-export.c:703
+#: builtin/fast-export.c:706 builtin/tag.c:602
 msgid "mode"
 msgstr "Modus"
 
-#: builtin/commit.c:1271 builtin/commit.c:1528
+#: builtin/commit.c:1343 builtin/commit.c:1607
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 "zeigt nicht beobachtete Dateien, optionale Modi: all, normal, no. (Standard: "
 "all)"
 
-#: builtin/commit.c:1274
+#: builtin/commit.c:1346
 msgid "show ignored files"
 msgstr "zeigt ignorierte Dateien"
 
-#: builtin/commit.c:1275 parse-options.h:153
+#: builtin/commit.c:1347 parse-options.h:153
 msgid "when"
 msgstr "wann"
 
-#: builtin/commit.c:1276
+#: builtin/commit.c:1348
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -4472,219 +4507,219 @@
 "ignoriert Änderungen in Submodulen, optional wenn: all, dirty, untracked. "
 "(Standard: all)"
 
-#: builtin/commit.c:1278
+#: builtin/commit.c:1350
 msgid "list untracked files in columns"
 msgstr "listet unbeobachtete Dateien in Spalten auf"
 
-#: builtin/commit.c:1347
+#: builtin/commit.c:1419
 msgid "couldn't look up newly created commit"
 msgstr "Konnte neu erstellten Commit nicht nachschlagen."
 
-#: builtin/commit.c:1349
+#: builtin/commit.c:1421
 msgid "could not parse newly created commit"
 msgstr "Konnte neulich erstellten Commit nicht analysieren."
 
-#: builtin/commit.c:1390
+#: builtin/commit.c:1469
 msgid "detached HEAD"
 msgstr "losgelöster HEAD"
 
-#: builtin/commit.c:1392
+#: builtin/commit.c:1471
 msgid " (root-commit)"
 msgstr " (Basis-Commit)"
 
-#: builtin/commit.c:1486
+#: builtin/commit.c:1565
 msgid "suppress summary after successful commit"
 msgstr "unterdrückt Zusammenfassung nach erfolgreichem Commit"
 
-#: builtin/commit.c:1487
+#: builtin/commit.c:1566
 msgid "show diff in commit message template"
 msgstr "zeigt Unterschiede in Commit-Beschreibungsvorlage an"
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1568
 msgid "Commit message options"
 msgstr "Optionen für Commit-Beschreibung"
 
-#: builtin/commit.c:1490 builtin/tag.c:512
+#: builtin/commit.c:1569 builtin/tag.c:600
 msgid "read message from file"
 msgstr "liest Beschreibung von Datei"
 
-#: builtin/commit.c:1491
+#: builtin/commit.c:1570
 msgid "author"
 msgstr "Autor"
 
-#: builtin/commit.c:1491
+#: builtin/commit.c:1570
 msgid "override author for commit"
 msgstr "überschreibt Autor eines Commits"
 
-#: builtin/commit.c:1492 builtin/gc.c:272
+#: builtin/commit.c:1571 builtin/gc.c:286
 msgid "date"
 msgstr "Datum"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1571
 msgid "override date for commit"
 msgstr "überschreibt Datum eines Commits"
 
-#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
-#: builtin/notes.c:566 builtin/tag.c:510
+#: builtin/commit.c:1572 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:598
 msgid "message"
 msgstr "Beschreibung"
 
-#: builtin/commit.c:1493
+#: builtin/commit.c:1572
 msgid "commit message"
 msgstr "Commit-Beschreibung"
 
-#: builtin/commit.c:1494
+#: builtin/commit.c:1573
 msgid "reuse and edit message from specified commit"
 msgstr "verwendet wieder und editiert Beschreibung des angegebenen Commits"
 
-#: builtin/commit.c:1495
+#: builtin/commit.c:1574
 msgid "reuse message from specified commit"
 msgstr "verwendet Beschreibung des angegebenen Commits wieder"
 
-#: builtin/commit.c:1496
+#: builtin/commit.c:1575
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "verwendet eine automatisch zusammengesetzte Beschreibung zum Nachbessern des "
 "angegebenen Commits"
 
-#: builtin/commit.c:1497
+#: builtin/commit.c:1576
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "verwendet eine automatisch zusammengesetzte Beschreibung beim \"squash\" des "
 "angegebenen Commits"
 
-#: builtin/commit.c:1498
+#: builtin/commit.c:1577
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "Setzt Sie als Autor des Commits (verwendet mit -C/-c/--amend)"
 
-#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1578 builtin/log.c:1188 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "fügt 'Signed-off-by:'-Zeile hinzu"
 
-#: builtin/commit.c:1500
+#: builtin/commit.c:1579
 msgid "use specified template file"
 msgstr "verwendet angegebene Vorlagendatei"
 
-#: builtin/commit.c:1501
+#: builtin/commit.c:1580
 msgid "force edit of commit"
 msgstr "erzwingt Bearbeitung des Commits"
 
-#: builtin/commit.c:1502
+#: builtin/commit.c:1581
 msgid "default"
 msgstr "Standard"
 
-#: builtin/commit.c:1502 builtin/tag.c:515
+#: builtin/commit.c:1581 builtin/tag.c:603
 msgid "how to strip spaces and #comments from message"
 msgstr ""
 "wie Leerzeichen und #Kommentare von der Beschreibung getrennt werden sollen"
 
-#: builtin/commit.c:1503
+#: builtin/commit.c:1582
 msgid "include status in commit message template"
 msgstr "fügt Status in die Commit-Beschreibungsvorlage ein"
 
-#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
-#: builtin/tag.c:516
+#: builtin/commit.c:1583 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:604
 msgid "key-id"
 msgstr "GPG-Schlüsselkennung"
 
-#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
+#: builtin/commit.c:1584 builtin/merge.c:224 builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "signiert Commit mit GPG"
 
-#: builtin/commit.c:1508
+#: builtin/commit.c:1587
 msgid "Commit contents options"
 msgstr "Optionen für Commit-Inhalt"
 
-#: builtin/commit.c:1509
+#: builtin/commit.c:1588
 msgid "commit all changed files"
 msgstr "committet alle geänderten Dateien"
 
-#: builtin/commit.c:1510
+#: builtin/commit.c:1589
 msgid "add specified files to index for commit"
 msgstr "merkt die angegebenen Dateien zusätzlich zum Commit vor"
 
-#: builtin/commit.c:1511
+#: builtin/commit.c:1590
 msgid "interactively add files"
 msgstr "interaktives Hinzufügen von Dateien"
 
-#: builtin/commit.c:1512
+#: builtin/commit.c:1591
 msgid "interactively add changes"
 msgstr "interaktives Hinzufügen von Änderungen"
 
-#: builtin/commit.c:1513
+#: builtin/commit.c:1592
 msgid "commit only specified files"
 msgstr "committet nur die angegebenen Dateien"
 
-#: builtin/commit.c:1514
+#: builtin/commit.c:1593
 msgid "bypass pre-commit hook"
 msgstr "umgeht \"pre-commit hook\""
 
-#: builtin/commit.c:1515
+#: builtin/commit.c:1594
 msgid "show what would be committed"
 msgstr "zeigt an, was committet werden würde"
 
-#: builtin/commit.c:1526
+#: builtin/commit.c:1605
 msgid "amend previous commit"
 msgstr "ändert vorherigen Commit"
 
-#: builtin/commit.c:1527
+#: builtin/commit.c:1606
 msgid "bypass post-rewrite hook"
 msgstr "umgeht \"post-rewrite hook\""
 
-#: builtin/commit.c:1532
+#: builtin/commit.c:1611
 msgid "ok to record an empty change"
 msgstr "erlaubt Aufzeichnung einer leeren Änderung"
 
-#: builtin/commit.c:1534
+#: builtin/commit.c:1613
 msgid "ok to record a change with an empty message"
 msgstr "erlaubt Aufzeichnung einer Änderung mit einer leeren Beschreibung"
 
-#: builtin/commit.c:1562
+#: builtin/commit.c:1641
 msgid "could not parse HEAD commit"
 msgstr "Konnte Commit von HEAD nicht analysieren."
 
-#: builtin/commit.c:1601 builtin/merge.c:518
+#: builtin/commit.c:1680 builtin/merge.c:518
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "Konnte '%s' nicht zum Lesen öffnen."
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1687
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Beschädigte MERGE_HEAD-Datei (%s)"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1694
 msgid "could not read MERGE_MODE"
 msgstr "Konnte MERGE_MODE nicht lesen"
 
-#: builtin/commit.c:1634
+#: builtin/commit.c:1713
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "Konnte Commit-Beschreibung nicht lesen: %s"
 
-#: builtin/commit.c:1645
+#: builtin/commit.c:1724
 #, 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:1650
+#: builtin/commit.c:1729
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Commit aufgrund leerer Beschreibung abgebrochen.\n"
 
-#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
+#: builtin/commit.c:1744 builtin/merge.c:851 builtin/merge.c:876
 msgid "failed to write commit object"
 msgstr "Fehler beim Schreiben des Commit-Objektes."
 
-#: builtin/commit.c:1686
+#: builtin/commit.c:1756
 msgid "cannot lock HEAD ref"
 msgstr "Kann Referenz von HEAD nicht sperren."
 
-#: builtin/commit.c:1690
+#: builtin/commit.c:1769
 msgid "cannot update HEAD ref"
 msgstr "Kann Referenz von HEAD nicht aktualisieren."
 
-#: builtin/commit.c:1701
+#: builtin/commit.c:1780
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full or quota is\n"
@@ -4839,47 +4874,47 @@
 msgid "git describe [options] --dirty"
 msgstr "git describe [Optionen] --dirty"
 
-#: builtin/describe.c:225
+#: builtin/describe.c:216
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "annotiertes Tag %s ist nicht verfügbar"
 
-#: builtin/describe.c:229
+#: builtin/describe.c:220
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr "annotiertes Tag %s hat keinen eingebetteten Namen"
 
-#: builtin/describe.c:231
+#: builtin/describe.c:222
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "Tag '%s' ist eigentlich '%s' hier"
 
-#: builtin/describe.c:258
+#: builtin/describe.c:249
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "%s ist kein gültiger Objekt-Name"
 
-#: builtin/describe.c:261
+#: builtin/describe.c:252
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr "%s ist kein gültiges '%s' Objekt"
 
-#: builtin/describe.c:278
+#: builtin/describe.c:269
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr "kein Tag entspricht exakt '%s'"
 
-#: builtin/describe.c:280
+#: builtin/describe.c:271
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "suche zur Beschreibung von %s\n"
 
-#: builtin/describe.c:327
+#: builtin/describe.c:318
 #, c-format
 msgid "finished search at %s\n"
 msgstr "beendete Suche bei %s\n"
 
-#: builtin/describe.c:354
+#: builtin/describe.c:345
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -4888,7 +4923,7 @@
 "Keine annotierten Tags können '%s' beschreiben.\n"
 "Jedoch gab es nicht-annotierte Tags: versuchen Sie --tags."
 
-#: builtin/describe.c:358
+#: builtin/describe.c:349
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -4897,12 +4932,12 @@
 "Keine Tags können '%s' beschreiben.\n"
 "Versuchen Sie --always oder erstellen Sie einige Tags."
 
-#: builtin/describe.c:379
+#: builtin/describe.c:370
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "%lu Commits durchlaufen\n"
 
-#: builtin/describe.c:382
+#: builtin/describe.c:373
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
@@ -4911,65 +4946,65 @@
 "mehr als %i Tags gefunden; Führe die ersten %i auf\n"
 "Suche bei %s aufgegeben\n"
 
-#: builtin/describe.c:404
+#: builtin/describe.c:395
 msgid "find the tag that comes after the commit"
 msgstr "findet das Tag, das nach Commit kommt"
 
-#: builtin/describe.c:405
+#: builtin/describe.c:396
 msgid "debug search strategy on stderr"
 msgstr "protokolliert die Suchstrategie in der Standard-Fehlerausgabe"
 
-#: builtin/describe.c:406
+#: builtin/describe.c:397
 msgid "use any ref"
 msgstr "verwendet alle Referenzen"
 
-#: builtin/describe.c:407
+#: builtin/describe.c:398
 msgid "use any tag, even unannotated"
 msgstr "verwendet jedes Tag, auch nicht-annotierte"
 
-#: builtin/describe.c:408
+#: builtin/describe.c:399
 msgid "always use long format"
 msgstr "verwendet immer langes Format"
 
-#: builtin/describe.c:409
+#: builtin/describe.c:400
 msgid "only follow first parent"
 msgstr "folgt nur erstem Elternteil"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:403
 msgid "only output exact matches"
 msgstr "gibt nur exakte Übereinstimmungen aus"
 
-#: builtin/describe.c:414
+#: builtin/describe.c:405
 msgid "consider <n> most recent tags (default: 10)"
 msgstr "betrachtet die jüngsten <n> Tags (Standard: 10)"
 
-#: builtin/describe.c:416
+#: builtin/describe.c:407
 msgid "only consider tags matching <pattern>"
 msgstr "betrachtet nur Tags die <Muster> entsprechen"
 
-#: builtin/describe.c:418 builtin/name-rev.c:321
+#: builtin/describe.c:409 builtin/name-rev.c:318
 msgid "show abbreviated commit object as fallback"
 msgstr "zeigt gekürztes Commit-Objekt, wenn sonst nichts zutrifft"
 
-#: builtin/describe.c:419
+#: builtin/describe.c:410
 msgid "mark"
 msgstr "Kennzeichen"
 
-#: builtin/describe.c:420
+#: builtin/describe.c:411
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr ""
 "fügt <Kennzeichen> bei geändertem Arbeitsverzeichnis hinzu (Standard: \"-"
 "dirty\")"
 
-#: builtin/describe.c:438
+#: builtin/describe.c:429
 msgid "--long is incompatible with --abbrev=0"
 msgstr "Die Optionen --long und --abbrev=0 sind inkompatibel."
 
-#: builtin/describe.c:464
+#: builtin/describe.c:455
 msgid "No names found, cannot describe anything."
 msgstr "Keine Namen gefunden, kann nichts beschreiben."
 
-#: builtin/describe.c:484
+#: builtin/describe.c:475
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "Die Option --dirty kann nicht mit Commits verwendet werden."
 
@@ -5002,46 +5037,54 @@
 msgid "unhandled object '%s' given."
 msgstr "unbehandeltes Objekt '%s' angegeben"
 
-#: builtin/fast-export.c:22
+#: builtin/fast-export.c:23
 msgid "git fast-export [rev-list-opts]"
 msgstr "git fast-export [rev-list-opts]"
 
-#: builtin/fast-export.c:673
+#: builtin/fast-export.c:702
 msgid "show progress after <n> objects"
 msgstr "zeigt Fortschritt nach <n> Objekten an"
 
-#: builtin/fast-export.c:675
+#: builtin/fast-export.c:704
 msgid "select handling of signed tags"
 msgstr "wählt Behandlung von signierten Tags"
 
-#: builtin/fast-export.c:678
+#: builtin/fast-export.c:707
 msgid "select handling of tags that tag filtered objects"
 msgstr "wählt Behandlung von Tags, die gefilterte Objekte markieren"
 
-#: builtin/fast-export.c:681
+#: builtin/fast-export.c:710
 msgid "Dump marks to this file"
 msgstr "Schreibt Kennzeichen in diese Datei"
 
-#: builtin/fast-export.c:683
+#: builtin/fast-export.c:712
 msgid "Import marks from this file"
 msgstr "Importiert Kennzeichen von dieser Datei"
 
-#: builtin/fast-export.c:685
+#: builtin/fast-export.c:714
 msgid "Fake a tagger when tags lack one"
 msgstr "erzeugt künstlich einen Tag-Ersteller, wenn das Tag keinen hat"
 
-#: builtin/fast-export.c:687
+#: builtin/fast-export.c:716
 msgid "Output full tree for each commit"
 msgstr "gibt für jeden Commit das gesamte Verzeichnis aus"
 
-#: builtin/fast-export.c:689
+#: builtin/fast-export.c:718
 msgid "Use the done feature to terminate the stream"
-msgstr "Benutzt die \"done\"-Funktion um den Strom abzuschließen"
+msgstr "Benutzt die \"done\"-Funktion, um den Strom abzuschließen"
 
-#: builtin/fast-export.c:690
+#: builtin/fast-export.c:719
 msgid "Skip output of blob data"
 msgstr "Überspringt Ausgabe von Blob-Daten"
 
+#: builtin/fast-export.c:720
+msgid "refspec"
+msgstr "Refspec"
+
+#: builtin/fast-export.c:721
+msgid "Apply refspec to exported refs"
+msgstr "Wendet Refspec auf exportierte Referenzen an"
+
 #: builtin/fetch.c:20
 msgid "git fetch [<options>] [<repository> [<refspec>...]]"
 msgstr "git fetch [<Optionen>] [<Repository> [<Refspec>...]]"
@@ -5058,218 +5101,226 @@
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<Optionen>]"
 
-#: builtin/fetch.c:75
+#: builtin/fetch.c:90
 msgid "fetch from all remotes"
 msgstr "fordert von allen Remote-Repositories an"
 
-#: builtin/fetch.c:77
+#: builtin/fetch.c:92
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "hängt an .git/FETCH_HEAD an, anstatt zu überschreiben"
 
-#: builtin/fetch.c:79
+#: builtin/fetch.c:94
 msgid "path to upload pack on remote end"
 msgstr "Pfad des Programms zum Hochladen von Paketen auf der Gegenseite"
 
-#: builtin/fetch.c:80
+#: builtin/fetch.c:95
 msgid "force overwrite of local branch"
 msgstr "erzwingt das Überschreiben von lokalen Branches"
 
-#: builtin/fetch.c:82
+#: builtin/fetch.c:97
 msgid "fetch from multiple remotes"
 msgstr "fordert von mehreren Remote-Repositories an"
 
-#: builtin/fetch.c:84
+#: builtin/fetch.c:99
 msgid "fetch all tags and associated objects"
 msgstr "fordert alle Tags und verbundene Objekte an"
 
-#: builtin/fetch.c:86
+#: builtin/fetch.c:101
 msgid "do not fetch all tags (--no-tags)"
 msgstr "fordert nicht alle Tags an (--no-tags)"
 
-#: builtin/fetch.c:88
+#: builtin/fetch.c:103
 msgid "prune remote-tracking branches no longer on remote"
 msgstr ""
 "entfernt Remote-Tracking-Branches, die sich nicht mehr im Remote-Repository "
 "befinden"
 
-#: builtin/fetch.c:89
+#: builtin/fetch.c:104
 msgid "on-demand"
 msgstr "bei-Bedarf"
 
-#: builtin/fetch.c:90
+#: builtin/fetch.c:105
 msgid "control recursive fetching of submodules"
 msgstr "kontrolliert rekursive Anforderungen von Submodulen"
 
-#: builtin/fetch.c:94
+#: builtin/fetch.c:109
 msgid "keep downloaded pack"
 msgstr "behält heruntergeladenes Paket"
 
-#: builtin/fetch.c:96
+#: builtin/fetch.c:111
 msgid "allow updating of HEAD ref"
 msgstr "erlaubt Aktualisierung der \"HEAD\"-Referenz"
 
-#: builtin/fetch.c:99
+#: builtin/fetch.c:114
 msgid "deepen history of shallow clone"
 msgstr ""
 "vertieft die Historie eines Klons mit unvollständiger Historie (shallow)"
 
-#: builtin/fetch.c:101
+#: builtin/fetch.c:116
 msgid "convert to a complete repository"
 msgstr "konvertiert zu einem vollständigen Repository"
 
-#: builtin/fetch.c:103 builtin/log.c:1197
+#: builtin/fetch.c:118 builtin/log.c:1205
 msgid "dir"
 msgstr "Verzeichnis"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:119
 msgid "prepend this to submodule path output"
 msgstr "stellt dies an die Ausgabe der Submodul-Pfade voran"
 
-#: builtin/fetch.c:107
+#: builtin/fetch.c:122
 msgid "default mode for recursion"
 msgstr "Standard-Modus für Rekursion"
 
-#: builtin/fetch.c:109
+#: builtin/fetch.c:124
 msgid "accept refs that update .git/shallow"
 msgstr "akzeptiert Referenzen die .git/shallow aktualisieren"
 
-#: builtin/fetch.c:347
+#: builtin/fetch.c:125
+msgid "refmap"
+msgstr "Refmap"
+
+#: builtin/fetch.c:126
+msgid "specify fetch refmap"
+msgstr "Angabe der Refmap für 'fetch'"
+
+#: builtin/fetch.c:376
 msgid "Couldn't find remote ref HEAD"
 msgstr "Konnte Remote-Referenz von HEAD nicht finden."
 
-#: builtin/fetch.c:411
+#: builtin/fetch.c:440
 #, c-format
 msgid "object %s not found"
 msgstr "Objekt %s nicht gefunden"
 
-#: builtin/fetch.c:416
+#: builtin/fetch.c:445
 msgid "[up to date]"
 msgstr "[aktuell]"
 
-#: builtin/fetch.c:430
+#: builtin/fetch.c:459
 #, c-format
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr ""
 "! %-*s %-*s -> %s  (kann \"fetch\" im aktuellen Branch nicht ausführen)"
 
-#: builtin/fetch.c:431 builtin/fetch.c:517
+#: builtin/fetch.c:460 builtin/fetch.c:546
 msgid "[rejected]"
 msgstr "[zurückgewiesen]"
 
-#: builtin/fetch.c:442
+#: builtin/fetch.c:471
 msgid "[tag update]"
 msgstr "[Tag Aktualisierung]"
 
-#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497
+#: builtin/fetch.c:473 builtin/fetch.c:508 builtin/fetch.c:526
 msgid "  (unable to update local ref)"
 msgstr "  (kann lokale Referenz nicht aktualisieren)"
 
-#: builtin/fetch.c:462
+#: builtin/fetch.c:491
 msgid "[new tag]"
 msgstr "[neues Tag]"
 
-#: builtin/fetch.c:465
+#: builtin/fetch.c:494
 msgid "[new branch]"
 msgstr "[neuer Branch]"
 
-#: builtin/fetch.c:468
+#: builtin/fetch.c:497
 msgid "[new ref]"
 msgstr "[neue Referenz]"
 
-#: builtin/fetch.c:513
+#: builtin/fetch.c:542
 msgid "unable to update local ref"
 msgstr "kann lokale Referenz nicht aktualisieren"
 
-#: builtin/fetch.c:513
+#: builtin/fetch.c:542
 msgid "forced update"
 msgstr "Aktualisierung erzwungen"
 
-#: builtin/fetch.c:519
+#: builtin/fetch.c:548
 msgid "(non-fast-forward)"
 msgstr "(kein Vorspulen)"
 
-#: builtin/fetch.c:552 builtin/fetch.c:785
+#: builtin/fetch.c:581 builtin/fetch.c:814
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "kann %s nicht öffnen: %s\n"
 
-#: builtin/fetch.c:561
+#: builtin/fetch.c:590
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s hat nicht alle erforderlichen Objekte gesendet\n"
 
-#: builtin/fetch.c:579
+#: builtin/fetch.c:608
 #, 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:667 builtin/fetch.c:750
+#: builtin/fetch.c:696 builtin/fetch.c:779
 #, c-format
 msgid "From %.*s\n"
 msgstr "Von %.*s\n"
 
-#: builtin/fetch.c:678
+#: builtin/fetch.c:707
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
 " 'git remote prune %s' to remove any old, conflicting branches"
 msgstr ""
 "Einige lokale Referenzen konnten nicht aktualisiert werden; versuchen Sie\n"
-"'git remote prune %s' um jeden älteren, widersprüchlichen Branch zu löschen."
+"'git remote prune %s', um jeden älteren, widersprüchlichen Branch zu löschen."
 
-#: builtin/fetch.c:730
+#: builtin/fetch.c:759
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s wird unreferenziert)"
 
-#: builtin/fetch.c:731
+#: builtin/fetch.c:760
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s wurde unreferenziert)"
 
-#: builtin/fetch.c:755
+#: builtin/fetch.c:784
 msgid "[deleted]"
 msgstr "[gelöscht]"
 
-#: builtin/fetch.c:756 builtin/remote.c:1050
+#: builtin/fetch.c:785 builtin/remote.c:1059
 msgid "(none)"
 msgstr "(nichts)"
 
-#: builtin/fetch.c:775
+#: builtin/fetch.c:804
 #, 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:794
+#: builtin/fetch.c:823
 #, 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:797
+#: builtin/fetch.c:826
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Option \"%s\" wird ignoriert für %s\n"
 
-#: builtin/fetch.c:853
+#: builtin/fetch.c:882
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Weiß nicht wie von %s angefordert wird."
 
-#: builtin/fetch.c:1015
+#: builtin/fetch.c:1044
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Fordere an von %s\n"
 
-#: builtin/fetch.c:1017 builtin/remote.c:90
+#: builtin/fetch.c:1046 builtin/remote.c:90
 #, c-format
 msgid "Could not fetch %s"
 msgstr "Konnte nicht von %s anfordern"
 
-#: builtin/fetch.c:1035
+#: builtin/fetch.c:1064
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -5278,35 +5329,35 @@
 "oder den Namen des Remote-Repositories an, von welchem neue\n"
 "Commits angefordert werden sollen."
 
-#: builtin/fetch.c:1059
+#: builtin/fetch.c:1087
 msgid "You need to specify a tag name."
 msgstr "Sie müssen den Namen des Tags angeben."
 
-#: builtin/fetch.c:1107
+#: builtin/fetch.c:1131
 msgid "--depth and --unshallow cannot be used together"
 msgstr ""
 "Die Optionen --depth und --unshallow können nicht gemeinsam verwendet werden."
 
-#: builtin/fetch.c:1109
+#: builtin/fetch.c:1133
 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:1132
+#: builtin/fetch.c:1156
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all akzeptiert kein Repository als Argument"
 
-#: builtin/fetch.c:1134
+#: builtin/fetch.c:1158
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all kann nicht mit Refspecs verwendet werden."
 
-#: builtin/fetch.c:1145
+#: builtin/fetch.c:1169
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Kein Remote-Repository (einzeln oder Gruppe): %s"
 
-#: builtin/fetch.c:1153
+#: builtin/fetch.c:1177
 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"
@@ -5317,9 +5368,9 @@
 msgstr ""
 "git fmt-merge-msg [-m <Beschreibung>] [--log[=<n>]|--no-log] [--file <Datei>]"
 
-#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700
-#: builtin/merge.c:196 builtin/repack.c:175 builtin/repack.c:179
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:501
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:698
+#: builtin/merge.c:196 builtin/repack.c:179 builtin/repack.c:183
+#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:589
 #: parse-options.h:132 parse-options.h:239
 msgid "n"
 msgstr "Anzahl"
@@ -5344,43 +5395,43 @@
 msgid "file to read from"
 msgstr "Datei zum Einlesen"
 
-#: builtin/for-each-ref.c:1063
+#: builtin/for-each-ref.c:1051
 msgid "git for-each-ref [options] [<pattern>]"
 msgstr "git for-each-ref [Optionen] [<Muster>]"
 
-#: builtin/for-each-ref.c:1078
+#: builtin/for-each-ref.c:1066
 msgid "quote placeholders suitably for shells"
 msgstr "formatiert Platzhalter als Shell-String"
 
-#: builtin/for-each-ref.c:1080
+#: builtin/for-each-ref.c:1068
 msgid "quote placeholders suitably for perl"
 msgstr "formatiert Platzhalter als Perl-String"
 
-#: builtin/for-each-ref.c:1082
+#: builtin/for-each-ref.c:1070
 msgid "quote placeholders suitably for python"
 msgstr "formatiert Platzhalter als Python-String"
 
-#: builtin/for-each-ref.c:1084
+#: builtin/for-each-ref.c:1072
 msgid "quote placeholders suitably for tcl"
 msgstr "formatiert Platzhalter als TCL-String"
 
-#: builtin/for-each-ref.c:1087
+#: builtin/for-each-ref.c:1075
 msgid "show only <n> matched refs"
 msgstr "zeigt nur <n> passende Referenzen"
 
-#: builtin/for-each-ref.c:1088 builtin/replace.c:177
+#: builtin/for-each-ref.c:1076 builtin/replace.c:435
 msgid "format"
 msgstr "Format"
 
-#: builtin/for-each-ref.c:1088
+#: builtin/for-each-ref.c:1076
 msgid "format to use for the output"
 msgstr "für die Ausgabe zu verwendendes Format"
 
-#: builtin/for-each-ref.c:1089
+#: builtin/for-each-ref.c:1077
 msgid "key"
 msgstr "Schüssel"
 
-#: builtin/for-each-ref.c:1090
+#: builtin/for-each-ref.c:1078
 msgid "field name to sort on"
 msgstr "sortiere nach diesem Feld"
 
@@ -5388,55 +5439,55 @@
 msgid "Checking connectivity"
 msgstr "Prüfe Konnektivität"
 
-#: builtin/fsck.c:544
+#: builtin/fsck.c:538
 msgid "Checking object directories"
 msgstr "Prüfe Objekt-Verzeichnisse"
 
-#: builtin/fsck.c:607
+#: builtin/fsck.c:601
 msgid "git fsck [options] [<object>...]"
 msgstr "git fsck [Optionen] [<Objekt>...]"
 
-#: builtin/fsck.c:613
+#: builtin/fsck.c:607
 msgid "show unreachable objects"
 msgstr "zeigt unerreichbare Objekte"
 
-#: builtin/fsck.c:614
+#: builtin/fsck.c:608
 msgid "show dangling objects"
 msgstr "zeigt unreferenzierte Objekte"
 
-#: builtin/fsck.c:615
+#: builtin/fsck.c:609
 msgid "report tags"
 msgstr "meldet Tags"
 
-#: builtin/fsck.c:616
+#: builtin/fsck.c:610
 msgid "report root nodes"
 msgstr "meldet Hauptwurzeln"
 
-#: builtin/fsck.c:617
+#: builtin/fsck.c:611
 msgid "make index objects head nodes"
 msgstr "prüft Objekte in der Staging-Area"
 
-#: builtin/fsck.c:618
+#: builtin/fsck.c:612
 msgid "make reflogs head nodes (default)"
 msgstr "prüft die Reflogs (Standard)"
 
-#: builtin/fsck.c:619
+#: builtin/fsck.c:613
 msgid "also consider packs and alternate objects"
 msgstr ""
 
-#: builtin/fsck.c:620
+#: builtin/fsck.c:614
 msgid "enable more strict checking"
 msgstr "aktiviert genauere Prüfung"
 
-#: builtin/fsck.c:622
+#: builtin/fsck.c:616
 msgid "write dangling objects in .git/lost-found"
 msgstr "schreibt unreferenzierte Objekte nach .git/lost-found"
 
-#: builtin/fsck.c:623 builtin/prune.c:144
+#: builtin/fsck.c:617 builtin/prune.c:144
 msgid "show progress"
 msgstr "zeigt Fortschrittsanzeige"
 
-#: builtin/fsck.c:673
+#: builtin/fsck.c:667
 msgid "Checking objects"
 msgstr "Prüfe Objekte"
 
@@ -5444,54 +5495,54 @@
 msgid "git gc [options]"
 msgstr "git gc [Optionen]"
 
-#: builtin/gc.c:90
+#: builtin/gc.c:91
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "Ungültiger %s: '%s'"
 
-#: builtin/gc.c:117
+#: builtin/gc.c:118
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "zu langes Objekt-Verzeichnis %.*s"
 
-#: builtin/gc.c:273
+#: builtin/gc.c:287
 msgid "prune unreferenced objects"
 msgstr "entfernt unreferenzierte Objekte"
 
-#: builtin/gc.c:275
+#: builtin/gc.c:289
 msgid "be more thorough (increased runtime)"
 msgstr "mehr Gründlichkeit (erhöht Laufzeit)"
 
-#: builtin/gc.c:276
+#: builtin/gc.c:290
 msgid "enable auto-gc mode"
 msgstr "aktiviert \"auto-gc\" Modus"
 
-#: builtin/gc.c:277
+#: builtin/gc.c:291
 msgid "force running gc even if there may be another gc running"
 msgstr ""
 "erzwingt Ausführung von \"git gc\" selbst wenn ein anderes\n"
 "\"git gc\" bereits ausgeführt wird"
 
-#: builtin/gc.c:318
+#: builtin/gc.c:332
 #, 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:320
+#: builtin/gc.c:334
 #, 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:321
+#: builtin/gc.c:335
 #, 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:353
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5499,7 +5550,7 @@
 "\"git gc\" wird bereits auf Maschine '%s' pid %<PRIuMAX> ausgeführt\n"
 "(benutzen Sie --force falls nicht)"
 
-#: builtin/gc.c:361
+#: builtin/gc.c:375
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -5515,235 +5566,230 @@
 msgid "grep: failed to create thread: %s"
 msgstr "grep: Fehler beim Erzeugen eines Thread: %s"
 
-#: builtin/grep.c:365
-#, c-format
-msgid "Failed to chdir: %s"
-msgstr "Fehler beim Verzeichniswechsel: %s"
-
-#: builtin/grep.c:443 builtin/grep.c:478
+#: builtin/grep.c:441 builtin/grep.c:476
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "konnte \"Tree\"-Objekt (%s) nicht lesen"
 
-#: builtin/grep.c:493
+#: builtin/grep.c:491
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "kann \"grep\" nicht mit Objekten des Typs %s durchführen"
 
-#: builtin/grep.c:549
+#: builtin/grep.c:547
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "Schalter '%c' erwartet einen numerischen Wert"
 
-#: builtin/grep.c:566
+#: builtin/grep.c:564
 #, c-format
 msgid "cannot open '%s'"
 msgstr "kann '%s' nicht öffnen"
 
-#: builtin/grep.c:640
+#: builtin/grep.c:638
 msgid "search in index instead of in the work tree"
 msgstr "sucht in der Staging-Area anstatt im Arbeitsverzeichnis"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:640
 msgid "find in contents not managed by git"
 msgstr "findet auch in Inhalten, die nicht von Git verwaltet werden"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:642
 msgid "search in both tracked and untracked files"
 msgstr "sucht in beobachteten und unbeobachteten Dateien"
 
-#: builtin/grep.c:646
+#: builtin/grep.c:644
 msgid "search also in ignored files"
 msgstr "sucht auch in ignorierten Dateien"
 
-#: builtin/grep.c:649
+#: builtin/grep.c:647
 msgid "show non-matching lines"
 msgstr "zeigt Zeilen ohne Übereinstimmungen"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:649
 msgid "case insensitive matching"
 msgstr "findet Übereinstimmungen unabhängig von Groß- und Kleinschreibung"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:651
 msgid "match patterns only at word boundaries"
 msgstr "sucht nur ganze Wörter"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:653
 msgid "process binary files as text"
 msgstr "verarbeitet binäre Dateien als Text"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:655
 msgid "don't match patterns in binary files"
 msgstr "findet keine Muster in Binärdateien"
 
-#: builtin/grep.c:660
+#: builtin/grep.c:658
 msgid "process binary files with textconv filters"
 msgstr "verarbeitet binäre Dateien mit \"textconv\"-Filtern"
 
-#: builtin/grep.c:662
+#: builtin/grep.c:660
 msgid "descend at most <depth> levels"
 msgstr "durchläuft höchstens <Tiefe> Ebenen"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:664
 msgid "use extended POSIX regular expressions"
 msgstr "verwendet erweiterte reguläre Ausdrücke aus POSIX"
 
-#: builtin/grep.c:669
+#: builtin/grep.c:667
 msgid "use basic POSIX regular expressions (default)"
 msgstr "verwendet grundlegende reguläre Ausdrücke aus POSIX (Standard)"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:670
 msgid "interpret patterns as fixed strings"
 msgstr "interpretiert Muster als feste Zeichenketten"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:673
 msgid "use Perl-compatible regular expressions"
 msgstr "verwendet Perl-kompatible reguläre Ausdrücke"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:676
 msgid "show line numbers"
 msgstr "zeigt Zeilennummern"
 
-#: builtin/grep.c:679
+#: builtin/grep.c:677
 msgid "don't show filenames"
 msgstr "zeigt keine Dateinamen"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:678
 msgid "show filenames"
 msgstr "zeigt Dateinamen"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:680
 msgid "show filenames relative to top directory"
 msgstr "zeigt Dateinamen relativ zum Projektverzeichnis"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:682
 msgid "show only filenames instead of matching lines"
 msgstr "zeigt nur Dateinamen anstatt übereinstimmende Zeilen"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:684
 msgid "synonym for --files-with-matches"
 msgstr "Synonym für --files-with-matches"
 
-#: builtin/grep.c:689
+#: builtin/grep.c:687
 msgid "show only the names of files without match"
 msgstr "zeigt nur die Dateinamen ohne Übereinstimmungen"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:689
 msgid "print NUL after filenames"
 msgstr "gibt NUL-Zeichen nach Dateinamen aus"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:691
 msgid "show the number of matches instead of matching lines"
 msgstr "zeigt, anstatt der Zeilen, die Anzahl der übereinstimmenden Zeilen"
 
-#: builtin/grep.c:694
+#: builtin/grep.c:692
 msgid "highlight matches"
 msgstr "hebt Übereinstimmungen hervor"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:694
 msgid "print empty line between matches from different files"
 msgstr ""
 "gibt eine Leerzeile zwischen Übereinstimmungen in verschiedenen Dateien aus"
 
-#: builtin/grep.c:698
+#: builtin/grep.c:696
 msgid "show filename only once above matches from same file"
 msgstr ""
 "zeigt den Dateinamen nur einmal oberhalb der Übereinstimmungen aus dieser "
 "Datei an"
 
-#: builtin/grep.c:701
+#: builtin/grep.c:699
 msgid "show <n> context lines before and after matches"
 msgstr "zeigt <n> Zeilen vor und nach den Übereinstimmungen an"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:702
 msgid "show <n> context lines before matches"
 msgstr "zeigt <n> Zeilen vor den Übereinstimmungen an"
 
-#: builtin/grep.c:706
+#: builtin/grep.c:704
 msgid "show <n> context lines after matches"
 msgstr "zeigt <n> Zeilen nach den Übereinstimmungen an"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:705
 msgid "shortcut for -C NUM"
 msgstr "Kurzform für -C NUM"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:708
 msgid "show a line with the function name before matches"
 msgstr "zeigt eine Zeile mit dem Funktionsnamen vor Übereinstimmungen an"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:710
 msgid "show the surrounding function"
 msgstr "zeigt die umgebende Funktion an"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:713
 msgid "read patterns from file"
 msgstr "liest Muster von einer Datei"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:715
 msgid "match <pattern>"
 msgstr "findet <Muster>"
 
-#: builtin/grep.c:719
+#: builtin/grep.c:717
 msgid "combine patterns specified with -e"
 msgstr "kombiniert Muster, die mit -e angegeben wurden"
 
-#: builtin/grep.c:731
+#: builtin/grep.c:729
 msgid "indicate hit with exit status without output"
 msgstr "zeigt Übereinstimmungen nur durch Beendigungsstatus an"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:731
 msgid "show only matches from files that match all patterns"
 msgstr "zeigt nur Übereinstimmungen von Dateien, die allen Mustern entsprechen"
 
-#: builtin/grep.c:735
+#: builtin/grep.c:733
 msgid "show parse tree for grep expression"
 msgstr "zeigt geparstes Verzeichnis für \"grep\"-Ausdruck"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:737
 msgid "pager"
 msgstr "Anzeigeprogramm"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:737
 msgid "show matching files in the pager"
 msgstr "zeigt Dateien mit Übereinstimmungen im Anzeigeprogramm"
 
-#: builtin/grep.c:742
+#: builtin/grep.c:740
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "erlaubt den Aufruf von grep(1) (von dieser Programmversion ignoriert)"
 
-#: builtin/grep.c:743 builtin/show-ref.c:187
+#: builtin/grep.c:741 builtin/show-ref.c:187
 msgid "show usage"
 msgstr "zeigt Verwendung"
 
-#: builtin/grep.c:810
+#: builtin/grep.c:808
 msgid "no pattern given."
 msgstr "keine Muster angegeben"
 
-#: builtin/grep.c:868
+#: builtin/grep.c:866
 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:891
+#: builtin/grep.c:892
 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:896
+#: builtin/grep.c:897
 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:899
+#: builtin/grep.c:900
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 "Die Option --[no-]exclude-standard kann nicht mit beobachteten Inhalten "
 "verwendet werden."
 
-#: builtin/grep.c:907
+#: builtin/grep.c:908
 msgid "both --cached and trees are given."
 msgstr "Die Option --cached kann nicht mit \"Tree\"-Objekten verwendet werden."
 
@@ -5759,7 +5805,7 @@
 msgid "git hash-object  --stdin-paths < <list-of-paths>"
 msgstr "git hash-object  --stdin-paths < <Liste-von-Pfaden>"
 
-#: builtin/hash-object.c:72 builtin/tag.c:521
+#: builtin/hash-object.c:72 builtin/tag.c:609
 msgid "type"
 msgstr "Art"
 
@@ -5903,281 +5949,292 @@
 msgid "`git %s' is aliased to `%s'"
 msgstr "für `git %s' wurde der Alias `%s' angelegt"
 
-#: builtin/index-pack.c:184
+#: builtin/index-pack.c:145
+#, c-format
+msgid "unable to open %s"
+msgstr "kann %s nicht öffnen"
+
+#: builtin/index-pack.c:191
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "Objekt-Typen passen bei %s nicht zusammen"
 
-#: builtin/index-pack.c:204
-msgid "object of unexpected type"
-msgstr "Objekt hat unerwarteten Typ"
+#: builtin/index-pack.c:211
+#, c-format
+msgid "did not receive expected object %s"
+msgstr "konnte erwartetes Objekt %s nicht empfangen"
 
-#: builtin/index-pack.c:244
+#: builtin/index-pack.c:214
+#, c-format
+msgid "object %s: expected type %s, found %s"
+msgstr "Objekt %s: erwarteter Typ %s, %s gefunden"
+
+#: builtin/index-pack.c:256
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "kann %d Byte nicht lesen"
 msgstr[1] "kann %d Bytes nicht lesen"
 
-#: builtin/index-pack.c:254
+#: builtin/index-pack.c:266
 msgid "early EOF"
 msgstr "zu frühes Dateiende"
 
-#: builtin/index-pack.c:255
+#: builtin/index-pack.c:267
 msgid "read error on input"
 msgstr "Fehler beim Lesen der Eingabe"
 
-#: builtin/index-pack.c:267
+#: builtin/index-pack.c:279
 msgid "used more bytes than were available"
 msgstr "verwendete mehr Bytes als verfügbar waren"
 
-#: builtin/index-pack.c:274
+#: builtin/index-pack.c:286
 msgid "pack too large for current definition of off_t"
 msgstr "Paket ist zu groß für die aktuelle Definition von off_t"
 
-#: builtin/index-pack.c:290
+#: builtin/index-pack.c:302
 #, c-format
 msgid "unable to create '%s'"
 msgstr "konnte '%s' nicht erstellen"
 
-#: builtin/index-pack.c:295
+#: builtin/index-pack.c:307
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "Kann Paketdatei '%s' nicht öffnen"
 
-#: builtin/index-pack.c:309
+#: builtin/index-pack.c:321
 msgid "pack signature mismatch"
 msgstr "Paketsignatur stimmt nicht überein"
 
-#: builtin/index-pack.c:311
+#: builtin/index-pack.c:323
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "Paketversion %<PRIu32> nicht unterstützt"
 
-#: builtin/index-pack.c:329
+#: builtin/index-pack.c:341
 #, c-format
 msgid "pack has bad object at offset %lu: %s"
 msgstr "Paket hat ein ungültiges Objekt bei Versatz %lu: %s"
 
-#: builtin/index-pack.c:451
+#: builtin/index-pack.c:462
 #, c-format
 msgid "inflate returned %d"
 msgstr "Dekomprimierung gab %d zurück"
 
-#: builtin/index-pack.c:500
+#: builtin/index-pack.c:511
 msgid "offset value overflow for delta base object"
 msgstr "Wert für Versatz bei Differenzobjekt übergelaufen"
 
-#: builtin/index-pack.c:508
+#: builtin/index-pack.c:519
 msgid "delta base offset is out of bound"
 msgstr ""
 "Wert für Versatz bei Differenzobjekt liegt außerhalb des gültigen Bereichs"
 
-#: builtin/index-pack.c:516
+#: builtin/index-pack.c:527
 #, c-format
 msgid "unknown object type %d"
 msgstr "Unbekannter Objekt-Typ %d"
 
-#: builtin/index-pack.c:547
+#: builtin/index-pack.c:558
 msgid "cannot pread pack file"
 msgstr "Kann Paketdatei %s nicht lesen"
 
-#: builtin/index-pack.c:549
+#: builtin/index-pack.c:560
 #, c-format
 msgid "premature end of pack file, %lu byte missing"
 msgid_plural "premature end of pack file, %lu bytes missing"
 msgstr[0] "frühzeitiges Ende der Paketdatei, vermisse %lu Byte"
 msgstr[1] "frühzeitiges Ende der Paketdatei, vermisse %lu Bytes"
 
-#: builtin/index-pack.c:575
+#: builtin/index-pack.c:586
 msgid "serious inflate inconsistency"
 msgstr "ernsthafte Inkonsistenz nach Dekomprimierung"
 
-#: builtin/index-pack.c:666 builtin/index-pack.c:672 builtin/index-pack.c:695
-#: builtin/index-pack.c:729 builtin/index-pack.c:738
+#: builtin/index-pack.c:677 builtin/index-pack.c:683 builtin/index-pack.c:706
+#: builtin/index-pack.c:740 builtin/index-pack.c:749
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "SHA1 KOLLISION MIT %s GEFUNDEN !"
 
-#: builtin/index-pack.c:669 builtin/pack-objects.c:162
+#: builtin/index-pack.c:680 builtin/pack-objects.c:162
 #: builtin/pack-objects.c:254
 #, c-format
 msgid "unable to read %s"
 msgstr "kann %s nicht lesen"
 
-#: builtin/index-pack.c:735
+#: builtin/index-pack.c:746
 #, c-format
 msgid "cannot read existing object %s"
 msgstr "Kann existierendes Objekt %s nicht lesen."
 
-#: builtin/index-pack.c:749
+#: builtin/index-pack.c:760
 #, c-format
 msgid "invalid blob object %s"
 msgstr "ungültiges Blob-Objekt %s"
 
-#: builtin/index-pack.c:763
+#: builtin/index-pack.c:774
 #, c-format
 msgid "invalid %s"
 msgstr "Ungültiger Objekt-Typ %s"
 
-#: builtin/index-pack.c:766
+#: builtin/index-pack.c:777
 msgid "Error in object"
 msgstr "Fehler in Objekt"
 
-#: builtin/index-pack.c:768
+#: builtin/index-pack.c:779
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "Nicht alle Kind-Objekte von %s sind erreichbar"
 
-#: builtin/index-pack.c:839 builtin/index-pack.c:869
+#: builtin/index-pack.c:851 builtin/index-pack.c:881
 msgid "failed to apply delta"
 msgstr "Konnte Dateiunterschied nicht anwenden"
 
-#: builtin/index-pack.c:1010
+#: builtin/index-pack.c:1022
 msgid "Receiving objects"
 msgstr "Empfange Objekte"
 
-#: builtin/index-pack.c:1010
+#: builtin/index-pack.c:1022
 msgid "Indexing objects"
 msgstr "Indiziere Objekte"
 
-#: builtin/index-pack.c:1036
+#: builtin/index-pack.c:1048
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "Paket ist beschädigt (SHA1 unterschiedlich)"
 
-#: builtin/index-pack.c:1041
+#: builtin/index-pack.c:1053
 msgid "cannot fstat packfile"
 msgstr "kann Paketdatei nicht lesen"
 
-#: builtin/index-pack.c:1044
+#: builtin/index-pack.c:1056
 msgid "pack has junk at the end"
 msgstr "Paketende enthält nicht verwendbaren Inhalt"
 
-#: builtin/index-pack.c:1055
+#: builtin/index-pack.c:1067
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "Fehler beim Ausführen von \"parse_pack_objects()\""
 
-#: builtin/index-pack.c:1078
+#: builtin/index-pack.c:1090
 msgid "Resolving deltas"
 msgstr "Löse Unterschiede auf"
 
-#: builtin/index-pack.c:1088
+#: builtin/index-pack.c:1100
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "kann Thread nicht erzeugen: %s"
 
-#: builtin/index-pack.c:1130
+#: builtin/index-pack.c:1142
 msgid "confusion beyond insanity"
 msgstr "Fehler beim Auflösen der Unterschiede"
 
-#: builtin/index-pack.c:1138
+#: builtin/index-pack.c:1150
 #, c-format
 msgid "completed with %d local objects"
 msgstr "abgeschlossen mit %d lokalen Objekten"
 
-#: builtin/index-pack.c:1148
+#: builtin/index-pack.c:1160
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "Unerwartete Prüfsumme für %s (Festplattenfehler?)"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1164
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "Paket hat %d unaufgelöste Unterschied"
 msgstr[1] "Paket hat %d unaufgelöste Unterschiede"
 
-#: builtin/index-pack.c:1177
+#: builtin/index-pack.c:1189
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "Konnte angehängtes Objekt (%d) nicht komprimieren"
 
-#: builtin/index-pack.c:1256
+#: builtin/index-pack.c:1268
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "lokales Objekt %s ist beschädigt"
 
-#: builtin/index-pack.c:1280
+#: builtin/index-pack.c:1292
 msgid "error while closing pack file"
 msgstr "Fehler beim Schließen der Paketdatei"
 
-#: builtin/index-pack.c:1293
+#: builtin/index-pack.c:1305
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "Kann Paketbeschreibungsdatei '%s' nicht schreiben"
 
-#: builtin/index-pack.c:1301
+#: builtin/index-pack.c:1313
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "Kann eben erstellte Paketbeschreibungsdatei '%s' nicht schließen"
 
-#: builtin/index-pack.c:1314
+#: builtin/index-pack.c:1326
 msgid "cannot store pack file"
 msgstr "Kann Paketdatei nicht speichern"
 
-#: builtin/index-pack.c:1325
+#: builtin/index-pack.c:1337
 msgid "cannot store index file"
 msgstr "Kann Indexdatei nicht speichern"
 
-#: builtin/index-pack.c:1358
+#: builtin/index-pack.c:1370
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "\"pack.indexversion=%<PRIu32>\" ist ungültig"
 
-#: builtin/index-pack.c:1364
+#: builtin/index-pack.c:1376
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "ungültige Anzahl von Threads angegeben (%d)"
 
-#: builtin/index-pack.c:1368 builtin/index-pack.c:1546
+#: builtin/index-pack.c:1380 builtin/index-pack.c:1559
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "keine Unterstützung von Threads, '%s' wird ignoriert"
 
-#: builtin/index-pack.c:1426
+#: builtin/index-pack.c:1438
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Kann existierende Paketdatei '%s' nicht öffnen"
 
-#: builtin/index-pack.c:1428
+#: builtin/index-pack.c:1440
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "Kann existierende Indexdatei für Paket '%s' nicht öffnen"
 
-#: builtin/index-pack.c:1475
+#: builtin/index-pack.c:1487
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "kein Unterschied: %d Objekt"
 msgstr[1] "kein Unterschied: %d Objekte"
 
-#: builtin/index-pack.c:1482
+#: builtin/index-pack.c:1494
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "Länge der Objekt-Liste = %d: %lu Objekt"
 msgstr[1] "Länge der Objekt-Liste = %d: %lu Objekte"
 
-#: builtin/index-pack.c:1510
+#: builtin/index-pack.c:1523
 msgid "Cannot come back to cwd"
 msgstr "Kann nicht zurück zu Arbeitsverzeichnis wechseln"
 
-#: builtin/index-pack.c:1558 builtin/index-pack.c:1561
-#: builtin/index-pack.c:1573 builtin/index-pack.c:1577
+#: builtin/index-pack.c:1571 builtin/index-pack.c:1574
+#: builtin/index-pack.c:1586 builtin/index-pack.c:1590
 #, c-format
 msgid "bad %s"
 msgstr "%s ist ungültig"
 
-#: builtin/index-pack.c:1591
+#: builtin/index-pack.c:1604
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "Die Option --fix-thin kann nicht ohne --stdin verwendet werden."
 
-#: builtin/index-pack.c:1595 builtin/index-pack.c:1605
+#: builtin/index-pack.c:1608 builtin/index-pack.c:1617
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "Name der Paketdatei '%s' endet nicht mit '.pack'"
 
-#: builtin/index-pack.c:1614
+#: builtin/index-pack.c:1625
 msgid "--verify with no packfile name given"
 msgstr "Die Option --verify wurde ohne Namen der Paketdatei angegeben."
 
@@ -6292,11 +6349,11 @@
 
 #: builtin/init-db.c:465
 msgid ""
-"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared"
-"[=<permissions>]] [directory]"
+"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
+"shared[=<permissions>]] [directory]"
 msgstr ""
-"git init [-q | --quiet] [--bare] [--template=<Vorlagenverzeichnis>] [--shared"
-"[=<Berechtigungen>]] [Verzeichnis]"
+"git init [-q | --quiet] [--bare] [--template=<Vorlagenverzeichnis>] [--"
+"shared[=<Berechtigungen>]] [Verzeichnis]"
 
 #: builtin/init-db.c:488
 msgid "permissions"
@@ -6306,7 +6363,7 @@
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "gibt an, dass das Git-Repository mit mehreren Benutzern geteilt wird"
 
-#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:172
 msgid "be quiet"
 msgstr "weniger Ausgaben"
 
@@ -6346,38 +6403,38 @@
 msgid "   or: git show [options] <object>..."
 msgstr "   oder: git show [Optionen] <Objekt>..."
 
-#: builtin/log.c:125
+#: builtin/log.c:127
 msgid "suppress diff output"
 msgstr "unterdrückt Ausgabe der Unterschiede"
 
-#: builtin/log.c:126
+#: builtin/log.c:128
 msgid "show source"
 msgstr "zeigt Quelle"
 
-#: builtin/log.c:127
+#: builtin/log.c:129
 msgid "Use mail map file"
 msgstr "verwendet \"mailmap\"-Datei"
 
-#: builtin/log.c:128
+#: builtin/log.c:130
 msgid "decorate options"
 msgstr "decorate-Optionen"
 
-#: builtin/log.c:231
+#: builtin/log.c:229
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "letzte Ausgabe: %d %s\n"
 
-#: builtin/log.c:473 builtin/log.c:565
+#: builtin/log.c:470 builtin/log.c:562
 #, c-format
 msgid "Could not read object %s"
 msgstr "Kann Objekt %s nicht lesen."
 
-#: builtin/log.c:589
+#: builtin/log.c:586
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Unbekannter Typ: %d"
 
-#: builtin/log.c:689
+#: builtin/log.c:687
 msgid "format.headers without value"
 msgstr "format.headers ohne Wert"
 
@@ -6398,197 +6455,206 @@
 msgid "Not a range."
 msgstr "Kein Commit-Bereich."
 
-#: builtin/log.c:911
+#: builtin/log.c:916
 msgid "Cover letter needs email format"
 msgstr "Anschreiben benötigt E-Mail-Format"
 
-#: builtin/log.c:987
+#: builtin/log.c:995
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "ungültiges in-reply-to: %s"
 
-#: builtin/log.c:1015
+#: builtin/log.c:1023
 msgid "git format-patch [options] [<since> | <revision range>]"
 msgstr "git format-patch [Optionen] [<seit> | <Commitbereich>]"
 
-#: builtin/log.c:1060
+#: builtin/log.c:1068
 msgid "Two output directories?"
 msgstr "Zwei Ausgabeverzeichnisse?"
 
-#: builtin/log.c:1175
+#: builtin/log.c:1183
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "verwendet [PATCH n/m] auch mit einzelnem Patch"
 
-#: builtin/log.c:1178
+#: builtin/log.c:1186
 msgid "use [PATCH] even with multiple patches"
 msgstr "verwendet [PATCH] auch mit mehreren Patches"
 
-#: builtin/log.c:1182
+#: builtin/log.c:1190
 msgid "print patches to standard out"
 msgstr "Ausgabe der Patches in Standard-Ausgabe"
 
-#: builtin/log.c:1184
+#: builtin/log.c:1192
 msgid "generate a cover letter"
 msgstr "erzeugt ein Deckblatt"
 
-#: builtin/log.c:1186
+#: builtin/log.c:1194
 msgid "use simple number sequence for output file names"
 msgstr "verwendet einfache Nummernfolge für die Namen der Ausgabedateien"
 
-#: builtin/log.c:1187
+#: builtin/log.c:1195
 msgid "sfx"
 msgstr "Dateiendung"
 
-#: builtin/log.c:1188
+#: builtin/log.c:1196
 msgid "use <sfx> instead of '.patch'"
 msgstr "verwendet <Dateiendung> anstatt '.patch'"
 
-#: builtin/log.c:1190
+#: builtin/log.c:1198
 msgid "start numbering patches at <n> instead of 1"
 msgstr "beginnt die Nummerierung der Patches bei <n> anstatt bei 1"
 
-#: builtin/log.c:1192
+#: builtin/log.c:1200
 msgid "mark the series as Nth re-roll"
 msgstr "kennzeichnet die Serie als n-te Fassung"
 
-#: builtin/log.c:1194
+#: builtin/log.c:1202
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "verwendet [<Präfix>] anstatt [PATCH]"
 
-#: builtin/log.c:1197
+#: builtin/log.c:1205
 msgid "store resulting files in <dir>"
 msgstr "speichert erzeugte Dateien in <Verzeichnis>"
 
-#: builtin/log.c:1200
+#: builtin/log.c:1208
 msgid "don't strip/add [PATCH]"
 msgstr "[PATCH] wird nicht entfernt/hinzugefügt"
 
-#: builtin/log.c:1203
+#: builtin/log.c:1211
 msgid "don't output binary diffs"
 msgstr "gibt keine binären Unterschiede aus"
 
-#: builtin/log.c:1205
+#: builtin/log.c:1213
 msgid "don't include a patch matching a commit upstream"
 msgstr ""
 "schließt keine Patches ein, die einem Commit im Upstream-Branch entsprechen"
 
-#: builtin/log.c:1207
+#: builtin/log.c:1215
 msgid "show patch format instead of default (patch + stat)"
 msgstr "zeigt Patchformat anstatt des Standards (Patch + Zusammenfassung)"
 
-#: builtin/log.c:1209
+#: builtin/log.c:1217
 msgid "Messaging"
-msgstr "Email-Einstellungen"
+msgstr "E-Mail-Einstellungen"
 
-#: builtin/log.c:1210
+#: builtin/log.c:1218
 msgid "header"
 msgstr "Header"
 
-#: builtin/log.c:1211
+#: builtin/log.c:1219
 msgid "add email header"
-msgstr "fügt Email-Header hinzu"
+msgstr "fügt E-Mail-Header hinzu"
 
-#: builtin/log.c:1212 builtin/log.c:1214
+#: builtin/log.c:1220 builtin/log.c:1222
 msgid "email"
-msgstr "Email"
+msgstr "E-Mail"
 
-#: builtin/log.c:1212
+#: builtin/log.c:1220
 msgid "add To: header"
 msgstr "fügt  \"To:\"-Header hinzu"
 
-#: builtin/log.c:1214
+#: builtin/log.c:1222
 msgid "add Cc: header"
 msgstr "fügt \"Cc:\"-Header hinzu"
 
-#: builtin/log.c:1216
+#: builtin/log.c:1224
 msgid "ident"
 msgstr "Ident"
 
-#: builtin/log.c:1217
+#: builtin/log.c:1225
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 "setzt \"From\"-Adresse auf <Ident> (oder Ident des Commit-Erstellers,wenn "
 "fehlend)"
 
-#: builtin/log.c:1219
+#: builtin/log.c:1227
 msgid "message-id"
 msgstr "message-id"
 
-#: builtin/log.c:1220
+#: builtin/log.c:1228
 msgid "make first mail a reply to <message-id>"
-msgstr "macht aus erster Email eine Antwort zu <message-id>"
+msgstr "macht aus erster E-Mail eine Antwort zu <message-id>"
 
-#: builtin/log.c:1221 builtin/log.c:1224
+#: builtin/log.c:1229 builtin/log.c:1232
 msgid "boundary"
 msgstr "Grenze"
 
-#: builtin/log.c:1222
+#: builtin/log.c:1230
 msgid "attach the patch"
 msgstr "hängt einen Patch an"
 
-#: builtin/log.c:1225
+#: builtin/log.c:1233
 msgid "inline the patch"
 msgstr "fügt den Patch direkt in die Nachricht ein"
 
-#: builtin/log.c:1229
+#: builtin/log.c:1237
 msgid "enable message threading, styles: shallow, deep"
 msgstr "aktiviert Nachrichtenverkettung, Stile: shallow, deep"
 
-#: builtin/log.c:1231
+#: builtin/log.c:1239
 msgid "signature"
 msgstr "Signatur"
 
-#: builtin/log.c:1232
+#: builtin/log.c:1240
 msgid "add a signature"
 msgstr "fügt eine Signatur hinzu"
 
-#: builtin/log.c:1233
+#: builtin/log.c:1242
+msgid "add a signature from a file"
+msgstr "fügt eine Signatur aus einer Datei hinzu"
+
+#: builtin/log.c:1243
 msgid "don't print the patch filenames"
 msgstr "zeigt keine Dateinamen der Patches"
 
-#: builtin/log.c:1307
+#: builtin/log.c:1317
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "Ungültige Identifikationszeile: %s"
 
-#: builtin/log.c:1322
+#: builtin/log.c:1332
 msgid "-n and -k are mutually exclusive."
 msgstr "Die Optionen -n und -k schließen sich gegenseitig aus."
 
-#: builtin/log.c:1324
+#: builtin/log.c:1334
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "Die Optionen --subject-prefix und -k schließen sich gegenseitig aus."
 
-#: builtin/log.c:1332
+#: builtin/log.c:1342
 msgid "--name-only does not make sense"
 msgstr "Die Option --name-only kann nicht verwendet werden."
 
-#: builtin/log.c:1334
+#: builtin/log.c:1344
 msgid "--name-status does not make sense"
 msgstr "Die Option --name-status kann nicht verwendet werden."
 
-#: builtin/log.c:1336
+#: builtin/log.c:1346
 msgid "--check does not make sense"
 msgstr "Die Option --check kann nicht verwendet werden."
 
-#: builtin/log.c:1359
+#: builtin/log.c:1369
 msgid "standard output, or directory, which one?"
 msgstr "Standard-Ausgabe oder Verzeichnis, welches von beidem?"
 
-#: builtin/log.c:1361
+#: builtin/log.c:1371
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Konnte Verzeichnis '%s' nicht erstellen."
 
-#: builtin/log.c:1509
+#: builtin/log.c:1468
+#, c-format
+msgid "unable to read signature file '%s'"
+msgstr "Konnte Signatur-Datei '%s' nicht lesen"
+
+#: builtin/log.c:1531
 msgid "Failed to create output files"
 msgstr "Fehler beim Erstellen der Ausgabedateien."
 
-#: builtin/log.c:1558
+#: builtin/log.c:1579
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<Upstream> [<Branch> [<Limit>]]]"
 
-#: builtin/log.c:1613
+#: builtin/log.c:1634
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -6596,7 +6662,7 @@
 "Konnte gefolgten Remote-Branch nicht finden, bitte geben Sie <Upstream> "
 "manuell an.\n"
 
-#: builtin/log.c:1626 builtin/log.c:1628 builtin/log.c:1640
+#: builtin/log.c:1647 builtin/log.c:1649 builtin/log.c:1661
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Unbekannter Commit %s"
@@ -6889,33 +6955,33 @@
 msgid "git write-tree failed to write a tree"
 msgstr "\"git write-tree\" schlug beim Schreiben eines \"Tree\"-Objektes fehl"
 
-#: builtin/merge.c:681
+#: builtin/merge.c:678
 msgid "Not handling anything other than two heads merge."
 msgstr "Es wird nur der Merge von zwei Branches behandelt."
 
-#: builtin/merge.c:695
+#: builtin/merge.c:692
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Unbekannte Option für merge-recursive: -X%s"
 
-#: builtin/merge.c:709
+#: builtin/merge.c:705
 #, c-format
 msgid "unable to write %s"
 msgstr "konnte %s nicht schreiben"
 
-#: builtin/merge.c:798
+#: builtin/merge.c:794
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "konnte nicht von '%s' lesen"
 
-#: builtin/merge.c:807
+#: builtin/merge.c:803
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
-"Merge wurde nicht committet; benutzen Sie 'git commit' um den Merge "
+"Merge wurde nicht committet; benutzen Sie 'git commit', um den Merge "
 "abzuschließen.\n"
 
-#: builtin/merge.c:813
+#: builtin/merge.c:809
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -6924,57 +6990,57 @@
 "Lines starting with '%c' will be ignored, and an empty message aborts\n"
 "the commit.\n"
 msgstr ""
-"Bitte geben Sie eine Commit-Beschreibung ein um zu erklären, warum dieser\n"
+"Bitte geben Sie eine Commit-Beschreibung ein, um zu erklären, warum dieser\n"
 "Merge erforderlich ist, insbesondere wenn es einen aktualisierten\n"
 "Upstream-Branch mit einem Thema-Branch zusammenführt.\n"
 "\n"
 "Zeilen beginnend mit '%c' werden ignoriert, und eine leere Beschreibung\n"
 "bricht den Commit ab.\n"
 
-#: builtin/merge.c:837
+#: builtin/merge.c:833
 msgid "Empty commit message."
 msgstr "Leere Commit-Beschreibung"
 
-#: builtin/merge.c:849
+#: builtin/merge.c:845
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Wunderbar.\n"
 
-#: builtin/merge.c:914
+#: builtin/merge.c:908
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 "Automatischer Merge fehlgeschlagen; beheben Sie die Konflikte und committen "
 "Sie dann das Ergebnis.\n"
 
-#: builtin/merge.c:930
+#: builtin/merge.c:924
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "'%s' ist kein Commit"
 
-#: builtin/merge.c:971
+#: builtin/merge.c:965
 msgid "No current branch."
 msgstr "Sie befinden sich auf keinem Branch."
 
-#: builtin/merge.c:973
+#: builtin/merge.c:967
 msgid "No remote for the current branch."
 msgstr "Kein Remote-Repository für den aktuellen Branch."
 
-#: builtin/merge.c:975
+#: builtin/merge.c:969
 msgid "No default upstream defined for the current branch."
 msgstr ""
 "Es ist kein Standard-Upstream-Branch für den aktuellen Branch definiert."
 
-#: builtin/merge.c:980
+#: builtin/merge.c:974
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Kein Remote-Tracking-Branch für %s von %s"
 
-#: builtin/merge.c:1136
+#: builtin/merge.c:1130
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Es gibt keinen Merge zum Abbrechen (vermisse MERGE_HEAD)"
 
-#: builtin/merge.c:1152 git-pull.sh:31
+#: builtin/merge.c:1146 git-pull.sh:31
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -6982,11 +7048,11 @@
 "Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert).\n"
 "Bitte committen Sie Ihre Änderungen, bevor Sie \"merge\" ausführen können."
 
-#: builtin/merge.c:1155 git-pull.sh:34
+#: builtin/merge.c:1149 git-pull.sh:34
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert)."
 
-#: builtin/merge.c:1159
+#: builtin/merge.c:1153
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -6994,105 +7060,105 @@
 "Sie haben \"cherry-pick\" nicht abgeschlossen (CHERRY_PICK_HEAD existiert).\n"
 "Bitte committen Sie Ihre Änderungen, bevor Sie \"merge\" ausführen können."
 
-#: builtin/merge.c:1162
+#: builtin/merge.c:1156
 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:1171
+#: builtin/merge.c:1165
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Sie können --squash nicht mit --no-ff kombinieren."
 
-#: builtin/merge.c:1180
+#: builtin/merge.c:1174
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Kein Commit angegeben und merge.defaultToUpstream ist nicht gesetzt."
 
-#: builtin/merge.c:1212
+#: builtin/merge.c:1206
 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:1215
+#: builtin/merge.c:1209
 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:1217
+#: builtin/merge.c:1211
 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:1222
+#: builtin/merge.c:1216
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - nichts was wir zusammenführen können"
 
-#: builtin/merge.c:1273
+#: builtin/merge.c:1267
 #, 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:1276
+#: builtin/merge.c:1270
 #, 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:1279
+#: builtin/merge.c:1273
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Commit %s hat keine GPG-Signatur."
 
-#: builtin/merge.c:1282
+#: builtin/merge.c:1276
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "Commit %s hat eine gültige GPG-Signatur von %s\n"
 
-#: builtin/merge.c:1366
+#: builtin/merge.c:1357
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Aktualisiere %s..%s\n"
 
-#: builtin/merge.c:1405
+#: builtin/merge.c:1396
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Probiere wirklich trivialen \"in-index\"-Merge...\n"
 
-#: builtin/merge.c:1412
+#: builtin/merge.c:1403
 #, c-format
 msgid "Nope.\n"
 msgstr "Nein.\n"
 
-#: builtin/merge.c:1444
+#: builtin/merge.c:1435
 msgid "Not possible to fast-forward, aborting."
 msgstr "Vorspulen nicht möglich, breche ab."
 
-#: builtin/merge.c:1467 builtin/merge.c:1546
+#: builtin/merge.c:1458 builtin/merge.c:1537
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Rücklauf des Verzeichnisses bis zum Ursprung...\n"
 
-#: builtin/merge.c:1471
+#: builtin/merge.c:1462
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Probiere Merge-Strategie %s...\n"
 
-#: builtin/merge.c:1537
+#: builtin/merge.c:1528
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Keine Merge-Strategie behandelt diesen Merge.\n"
 
-#: builtin/merge.c:1539
+#: builtin/merge.c:1530
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Merge mit Strategie %s fehlgeschlagen.\n"
 
-#: builtin/merge.c:1548
+#: builtin/merge.c:1539
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
-msgstr "Benutzen Sie \"%s\" um die Auflösung per Hand vorzubereiten.\n"
+msgstr "Benutzen Sie \"%s\", um die Auflösung per Hand vorzubereiten.\n"
 
-#: builtin/merge.c:1560
+#: builtin/merge.c:1551
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -7233,7 +7299,7 @@
 msgstr ""
 "Bitte merken Sie Ihre Änderungen in .gitmodules zum Commit vor oder "
 "benutzen\n"
-"Sie \"stash\" um fortzufahren."
+"Sie \"stash\", um fortzufahren."
 
 #: builtin/mv.c:156
 #, c-format
@@ -7248,79 +7314,79 @@
 msgid "not under version control"
 msgstr "nicht unter Versionskontrolle"
 
-#: builtin/mv.c:207
+#: builtin/mv.c:208
 msgid "destination exists"
 msgstr "Ziel existiert bereits"
 
-#: builtin/mv.c:215
+#: builtin/mv.c:216
 #, c-format
 msgid "overwriting '%s'"
 msgstr "überschreibe '%s'"
 
-#: builtin/mv.c:218
+#: builtin/mv.c:219
 msgid "Cannot overwrite"
 msgstr "Kann nicht überschreiben"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:222
 msgid "multiple sources for the same target"
 msgstr "mehrere Quellen für das selbe Ziel"
 
-#: builtin/mv.c:223
+#: builtin/mv.c:224
 msgid "destination directory does not exist"
 msgstr "Zielverzeichnis existiert nicht"
 
-#: builtin/mv.c:243
+#: builtin/mv.c:244
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, Quelle=%s, Ziel=%s"
 
-#: builtin/mv.c:253
+#: builtin/mv.c:254
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "Benenne %s nach %s um\n"
 
-#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
+#: builtin/mv.c:257 builtin/remote.c:725 builtin/repack.c:358
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "Umbenennung von '%s' fehlgeschlagen"
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:255
 msgid "git name-rev [options] <commit>..."
 msgstr "git name-rev [Optionen] <Commit>..."
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:256
 msgid "git name-rev [options] --all"
 msgstr "git name-rev [Optionen] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:257
 msgid "git name-rev [options] --stdin"
 msgstr "git name-rev [Optionen] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:309
 msgid "print only names (no SHA-1)"
 msgstr "zeigt nur Namen an (keine SHA-1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:310
 msgid "only use tags to name the commits"
-msgstr "verwendet nur Tags um die Commits zu benennen"
+msgstr "verwendet nur Tags, um die Commits zu benennen"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:312
 msgid "only use refs matching <pattern>"
 msgstr "verwendet nur Referenzen die <Muster> entsprechen"
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:314
 msgid "list all commits reachable from all refs"
 msgstr "listet alle Commits auf, die von allen Referenzen erreichbar sind"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:315
 msgid "read from stdin"
 msgstr "liest von der Standard-Eingabe"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:316
 msgid "allow to print `undefined` names (default)"
 msgstr "erlaubt Ausgabe von `undefinierten` Namen (Standard)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:322
 msgid "dereference tags in the input (internal use)"
 msgstr "dereferenziert Tags in der Eingabe (interne Verwendung)"
 
@@ -7450,7 +7516,7 @@
 msgid "failed to finish 'show' for object '%s'"
 msgstr "konnte 'show' für Objekt '%s' nicht abschließen"
 
-#: builtin/notes.c:167 builtin/tag.c:373
+#: builtin/notes.c:167 builtin/tag.c:477
 #, c-format
 msgid "could not create file '%s'"
 msgstr "konnte Datei '%s' nicht erstellen"
@@ -7474,12 +7540,12 @@
 msgid "The note contents has been left in %s"
 msgstr "Die Notiz-Inhalte wurden in %s belassen"
 
-#: builtin/notes.c:248 builtin/tag.c:604
+#: builtin/notes.c:248 builtin/tag.c:692
 #, c-format
 msgid "cannot read '%s'"
 msgstr "kann '%s' nicht lesen"
 
-#: builtin/notes.c:250 builtin/tag.c:607
+#: builtin/notes.c:250 builtin/tag.c:695
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "konnte '%s' nicht öffnen oder lesen"
@@ -7487,7 +7553,7 @@
 #: builtin/notes.c:269 builtin/notes.c:320 builtin/notes.c:322
 #: builtin/notes.c:382 builtin/notes.c:436 builtin/notes.c:519
 #: builtin/notes.c:524 builtin/notes.c:599 builtin/notes.c:641
-#: builtin/notes.c:843 builtin/tag.c:620
+#: builtin/notes.c:843 builtin/tag.c:708
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Konnte '%s' nicht als gültige Referenz auflösen."
@@ -7532,7 +7598,7 @@
 msgstr "Notizinhalte in einer Datei"
 
 #: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
-#: builtin/notes.c:575 builtin/tag.c:539
+#: builtin/notes.c:575 builtin/tag.c:627
 msgid "object"
 msgstr "Objekt"
 
@@ -7555,7 +7621,7 @@
 "existing notes"
 msgstr ""
 "Konnte Notizen nicht hinzufügen. Existierende Notizen für Objekt %s "
-"gefunden. Verwenden Sie '-f' um die existierenden Notizen zu überschreiben."
+"gefunden. Verwenden Sie '-f', um die existierenden Notizen zu überschreiben."
 
 #: builtin/notes.c:460 builtin/notes.c:537
 #, c-format
@@ -7583,7 +7649,7 @@
 "existing notes"
 msgstr ""
 "Kann Notizen nicht kopieren. Existierende Notizen für Objekt %s gefunden. "
-"Verwenden Sie '-f' um die existierenden Notizen zu überschreiben."
+"Verwenden Sie '-f', um die existierenden Notizen zu überschreiben."
 
 #: builtin/notes.c:543
 #, c-format
@@ -7654,7 +7720,7 @@
 msgid "use notes from <notes_ref>"
 msgstr "verwendet Notizen von <Notiz-Referenz>"
 
-#: builtin/notes.c:978 builtin/remote.c:1593
+#: builtin/notes.c:978 builtin/remote.c:1616
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Unbekanntes Unterkommando: %s"
@@ -7680,167 +7746,169 @@
 
 #: builtin/pack-objects.c:1012
 msgid "disabling bitmap writing, as some objects are not being packed"
-msgstr "Deaktiviere Schreiben des Bitmap-Index, da einige Objekte nicht in\n"
+msgstr ""
+"Deaktiviere Schreiben des Bitmap-Index, da einige Objekte nicht in\n"
 "eine Pack-Datei geschrieben wurden"
 
 #: builtin/pack-objects.c:2174
 msgid "Compressing objects"
 msgstr "Komprimiere Objekte"
 
-#: builtin/pack-objects.c:2530
+#: builtin/pack-objects.c:2526
 #, c-format
 msgid "unsupported index version %s"
 msgstr "Nicht unterstützte Staging-Area-Version %s"
 
-#: builtin/pack-objects.c:2534
+#: builtin/pack-objects.c:2530
 #, c-format
 msgid "bad index version '%s'"
 msgstr "Ungültige Staging-Area-Version '%s'"
 
-#: builtin/pack-objects.c:2557
+#: builtin/pack-objects.c:2553
 #, c-format
 msgid "option %s does not accept negative form"
 msgstr "Option %s akzeptiert keine negative Form"
 
-#: builtin/pack-objects.c:2561
+#: builtin/pack-objects.c:2557
 #, c-format
 msgid "unable to parse value '%s' for option %s"
 msgstr "konnte Wert '%s' für Option %s nicht parsen"
 
-#: builtin/pack-objects.c:2580
+#: builtin/pack-objects.c:2576
 msgid "do not show progress meter"
 msgstr "zeigt keine Fortschrittsanzeige"
 
-#: builtin/pack-objects.c:2582
+#: builtin/pack-objects.c:2578
 msgid "show progress meter"
 msgstr "zeigt Fortschrittsanzeige"
 
-#: builtin/pack-objects.c:2584
+#: builtin/pack-objects.c:2580
 msgid "show progress meter during object writing phase"
 msgstr "zeigt Forschrittsanzeige während der Phase des Schreibens der Objekte"
 
-#: builtin/pack-objects.c:2587
+#: builtin/pack-objects.c:2583
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "ähnlich zu --all-progress wenn Fortschrittsanzeige darstellt wird"
 
-#: builtin/pack-objects.c:2588
+#: builtin/pack-objects.c:2584
 msgid "version[,offset]"
 msgstr "version[,offset]"
 
-#: builtin/pack-objects.c:2589
+#: builtin/pack-objects.c:2585
 msgid "write the pack index file in the specified idx format version"
 msgstr ""
 "schreibt die Index-Datei des Paketes in der angegebenen Indexformat-Version"
 
-#: builtin/pack-objects.c:2592
+#: builtin/pack-objects.c:2588
 msgid "maximum size of each output pack file"
 msgstr "maximale Größe für jede ausgegebene Paketdatei"
 
-#: builtin/pack-objects.c:2594
+#: builtin/pack-objects.c:2590
 msgid "ignore borrowed objects from alternate object store"
 msgstr "ignoriert geliehene Objekte von alternativem Objektspeicher"
 
-#: builtin/pack-objects.c:2596
+#: builtin/pack-objects.c:2592
 msgid "ignore packed objects"
 msgstr "ignoriert gepackte Objekte"
 
-#: builtin/pack-objects.c:2598
+#: builtin/pack-objects.c:2594
 msgid "limit pack window by objects"
 msgstr "begrenzt Paketfenster durch Objekte"
 
-#: builtin/pack-objects.c:2600
+#: builtin/pack-objects.c:2596
 msgid "limit pack window by memory in addition to object limit"
 msgstr "begrenzt Paketfenster, zusätzlich zur Objektbegrenzung, durch Speicher"
 
-#: builtin/pack-objects.c:2602
+#: builtin/pack-objects.c:2598
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr ""
 "maximale Länge der erlaubten Differenzverkettung im resultierenden Paket"
 
-#: builtin/pack-objects.c:2604
+#: builtin/pack-objects.c:2600
 msgid "reuse existing deltas"
 msgstr "verwendet existierende Unterschiede wieder"
 
-#: builtin/pack-objects.c:2606
+#: builtin/pack-objects.c:2602
 msgid "reuse existing objects"
 msgstr "verwendet existierende Objekte wieder"
 
-#: builtin/pack-objects.c:2608
+#: builtin/pack-objects.c:2604
 msgid "use OFS_DELTA objects"
 msgstr "verwendet OFS_DELTA Objekte"
 
-#: builtin/pack-objects.c:2610
+#: builtin/pack-objects.c:2606
 msgid "use threads when searching for best delta matches"
 msgstr ""
 "verwendet Threads bei der Suche nach den besten Übereinstimmungen bei "
 "Unterschieden"
 
-#: builtin/pack-objects.c:2612
+#: builtin/pack-objects.c:2608
 msgid "do not create an empty pack output"
 msgstr "erzeugt keine leeren Pakete"
 
-#: builtin/pack-objects.c:2614
+#: builtin/pack-objects.c:2610
 msgid "read revision arguments from standard input"
 msgstr "liest Argumente bezüglich Commits von der Standard-Eingabe"
 
-#: builtin/pack-objects.c:2616
+#: builtin/pack-objects.c:2612
 msgid "limit the objects to those that are not yet packed"
 msgstr "begrenzt die Objekte zu solchen, die noch nicht gepackt wurden"
 
-#: builtin/pack-objects.c:2619
+#: builtin/pack-objects.c:2615
 msgid "include objects reachable from any reference"
 msgstr "schließt Objekte ein, die von jeder Referenz erreichbar sind"
 
-#: builtin/pack-objects.c:2622
+#: builtin/pack-objects.c:2618
 msgid "include objects referred by reflog entries"
 msgstr ""
 "schließt Objekte ein, die von Einträgen des Reflogs referenziert werden"
 
-#: builtin/pack-objects.c:2625
+#: builtin/pack-objects.c:2621
 msgid "output pack to stdout"
 msgstr "schreibt Paket in die Standard-Ausgabe"
 
-#: builtin/pack-objects.c:2627
+#: builtin/pack-objects.c:2623
 msgid "include tag objects that refer to objects to be packed"
 msgstr "schließt Tag-Objekte ein, die auf gepackte Objekte referenzieren"
 
-#: builtin/pack-objects.c:2629
+#: builtin/pack-objects.c:2625
 msgid "keep unreachable objects"
 msgstr "behält nicht erreichbare Objekte"
 
-#: builtin/pack-objects.c:2630 parse-options.h:140
+#: builtin/pack-objects.c:2626 parse-options.h:140
 msgid "time"
 msgstr "Zeit"
 
-#: builtin/pack-objects.c:2631
+#: builtin/pack-objects.c:2627
 msgid "unpack unreachable objects newer than <time>"
 msgstr "entpackt nicht erreichbare Objekte, die neuer als <Zeit> sind"
 
-#: builtin/pack-objects.c:2634
+#: builtin/pack-objects.c:2630
 msgid "create thin packs"
 msgstr "erzeugt dünnere Pakete"
 
-#: builtin/pack-objects.c:2636
+#: builtin/pack-objects.c:2632
 msgid "ignore packs that have companion .keep file"
 msgstr "ignoriert Pakete die .keep Dateien haben"
 
-#: builtin/pack-objects.c:2638
+#: builtin/pack-objects.c:2634
 msgid "pack compression level"
 msgstr "Komprimierungsgrad für Paketierung"
 
-#: builtin/pack-objects.c:2640
+#: builtin/pack-objects.c:2636
 msgid "do not hide commits by grafts"
 msgstr "verbirgt keine künstlichen Vorgänger-Commits (\"grafts\")"
 
-#: builtin/pack-objects.c:2642
+#: builtin/pack-objects.c:2638
 msgid "use a bitmap index if available to speed up counting objects"
-msgstr "benutzt Bitmap-Index (falls verfügbar) zur Optimierung der Objektzählung"
+msgstr ""
+"benutzt Bitmap-Index (falls verfügbar) zur Optimierung der Objektzählung"
 
-#: builtin/pack-objects.c:2644
+#: builtin/pack-objects.c:2640
 msgid "write a bitmap index together with the pack index"
 msgstr "schreibt Bitmap-Index zusammen mit Pack-Index"
 
-#: builtin/pack-objects.c:2723
+#: builtin/pack-objects.c:2719
 msgid "Counting objects"
 msgstr "Zähle Objekte"
 
@@ -7892,7 +7960,7 @@
 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:139
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -7901,7 +7969,7 @@
 "Um eine Variante permanent zu verwenden, siehe push.default in 'git help "
 "config'."
 
-#: builtin/push.c:143
+#: builtin/push.c:142
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -7927,7 +7995,7 @@
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:158
+#: builtin/push.c:157
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -7942,7 +8010,7 @@
 "\n"
 "    git push %s HEAD:<Name-des-Remote-Branches>\n"
 
-#: builtin/push.c:172
+#: builtin/push.c:171
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -7956,13 +8024,13 @@
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:180
+#: builtin/push.c:179
 #, 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:182
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -7973,7 +8041,7 @@
 "Branches '%s' ist, ohne anzugeben, was versendet werden soll, um welchen\n"
 "Remote-Branch zu aktualisieren."
 
-#: builtin/push.c:206
+#: builtin/push.c:205
 msgid ""
 "push.default is unset; its implicit value has changed in\n"
 "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
@@ -8024,14 +8092,14 @@
 "von\n"
 "Git benutzen.)"
 
-#: builtin/push.c:273
+#: builtin/push.c:272
 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:279
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -8045,7 +8113,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:285
 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"
@@ -8059,7 +8127,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:291
 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"
@@ -8078,13 +8146,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:298
 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:301
 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"
@@ -8094,22 +8162,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:360
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Versende nach %s\n"
 
-#: builtin/push.c:365
+#: builtin/push.c:364
 #, 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:394
 #, c-format
 msgid "bad repository '%s'"
 msgstr "ungültiges Repository '%s'"
 
-#: builtin/push.c:396
+#: builtin/push.c:395
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -8131,95 +8199,95 @@
 "\n"
 "    git push <Name>\n"
 
-#: builtin/push.c:411
+#: builtin/push.c:410
 msgid "--all and --tags are incompatible"
 msgstr "Die Optionen --all und --tags sind inkompatibel."
 
-#: builtin/push.c:412
+#: builtin/push.c:411
 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:416
 msgid "--mirror and --tags are incompatible"
 msgstr "Die Optionen --mirror und --tags sind inkompatibel."
 
-#: builtin/push.c:418
+#: builtin/push.c:417
 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:422
 msgid "--all and --mirror are incompatible"
 msgstr "Die Optionen --all und --mirror sind inkompatibel."
 
-#: builtin/push.c:483
+#: builtin/push.c:482
 msgid "repository"
 msgstr "Repository"
 
-#: builtin/push.c:484
+#: builtin/push.c:483
 msgid "push all refs"
 msgstr "versendet alle Referenzen"
 
-#: builtin/push.c:485
+#: builtin/push.c:484
 msgid "mirror all refs"
 msgstr "spiegelt alle Referenzen"
 
-#: builtin/push.c:487
+#: builtin/push.c:486
 msgid "delete refs"
 msgstr "löscht Referenzen"
 
-#: builtin/push.c:488
+#: builtin/push.c:487
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "versendet Tags (kann nicht mit --all oder --mirror verwendet werden)"
 
-#: builtin/push.c:491
+#: builtin/push.c:490
 msgid "force updates"
 msgstr "erzwingt Aktualisierung"
 
-#: builtin/push.c:493
+#: builtin/push.c:492
 msgid "refname>:<expect"
 msgstr "Referenzname>:<Erwartungswert"
 
-#: builtin/push.c:494
+#: builtin/push.c:493
 msgid "require old value of ref to be at this value"
 msgstr "Referenz muss sich auf dem angegebenen Wert befinden"
 
-#: builtin/push.c:496
+#: builtin/push.c:495
 msgid "check"
 msgstr ""
 
-#: builtin/push.c:497
+#: builtin/push.c:496
 msgid "control recursive pushing of submodules"
 msgstr "steuert rekursiven \"push\" von Submodulen"
 
-#: builtin/push.c:499
+#: builtin/push.c:498
 msgid "use thin pack"
 msgstr "verwendet kleinere Pakete"
 
-#: builtin/push.c:500 builtin/push.c:501
+#: builtin/push.c:499 builtin/push.c:500
 msgid "receive pack program"
 msgstr "'receive pack' Programm"
 
-#: builtin/push.c:502
+#: builtin/push.c:501
 msgid "set upstream for git pull/status"
 msgstr "setzt Upstream für \"git pull/status\""
 
-#: builtin/push.c:505
+#: builtin/push.c:504
 msgid "prune locally removed refs"
 msgstr "entfernt lokal gelöschte Referenzen"
 
-#: builtin/push.c:507
+#: builtin/push.c:506
 msgid "bypass pre-push hook"
 msgstr "umgeht \"pre-push hook\""
 
-#: builtin/push.c:508
+#: builtin/push.c:507
 msgid "push missing but relevant tags"
 msgstr "versendet fehlende, aber relevante Tags"
 
-#: builtin/push.c:518
+#: builtin/push.c:517
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "Die Option --delete ist inkompatibel mit --all, --mirror und --tags."
 
-#: builtin/push.c:520
+#: builtin/push.c:519
 msgid "--delete doesn't make sense without any refs"
 msgstr "Die Option --delete kann nur mit Referenzen verwendet werden."
 
@@ -8450,12 +8518,12 @@
 "Die Angabe von zu folgenden Branches kann nur mit dem Anfordern von "
 "Spiegelarchiven verwendet werden."
 
-#: builtin/remote.c:185 builtin/remote.c:641
+#: builtin/remote.c:185 builtin/remote.c:640
 #, c-format
 msgid "remote %s already exists."
 msgstr "externes Repository %s existiert bereits"
 
-#: builtin/remote.c:189 builtin/remote.c:645
+#: builtin/remote.c:189 builtin/remote.c:644
 #, c-format
 msgid "'%s' is not a valid remote name"
 msgstr "'%s' ist kein gültiger Name für ein Remote-Repository"
@@ -8465,45 +8533,45 @@
 msgid "Could not setup master '%s'"
 msgstr "Konnte symbolische Referenz für Hauptbranch von '%s' nicht einrichten"
 
-#: builtin/remote.c:289
+#: builtin/remote.c:288
 #, c-format
 msgid "more than one %s"
 msgstr "mehr als ein %s"
 
-#: builtin/remote.c:334
+#: builtin/remote.c:333
 #, c-format
 msgid "Could not get fetch map for refspec %s"
 msgstr "Konnte Fetch-Map für Refspec %s nicht bekommen"
 
-#: builtin/remote.c:435 builtin/remote.c:443
+#: builtin/remote.c:434 builtin/remote.c:442
 msgid "(matching)"
 msgstr "(übereinstimmend)"
 
-#: builtin/remote.c:447
+#: builtin/remote.c:446
 msgid "(delete)"
 msgstr "(lösche)"
 
-#: builtin/remote.c:590 builtin/remote.c:596 builtin/remote.c:602
+#: builtin/remote.c:589 builtin/remote.c:595 builtin/remote.c:601
 #, c-format
 msgid "Could not append '%s' to '%s'"
 msgstr "Konnte '%s' nicht an '%s' anhängen."
 
-#: builtin/remote.c:634 builtin/remote.c:787 builtin/remote.c:885
+#: builtin/remote.c:633 builtin/remote.c:794 builtin/remote.c:894
 #, c-format
 msgid "No such remote: %s"
 msgstr "Kein solches Remote-Repository: %s"
 
-#: builtin/remote.c:651
+#: builtin/remote.c:650
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "Konnte Sektion '%s' in Konfiguration nicht nach '%s' umbenennen"
 
-#: builtin/remote.c:657 builtin/remote.c:794
+#: builtin/remote.c:656 builtin/remote.c:846
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Konnte Sektion '%s' nicht aus Konfiguration entfernen"
 
-#: builtin/remote.c:672
+#: builtin/remote.c:671
 #, c-format
 msgid ""
 "Not updating non-default fetch refspec\n"
@@ -8514,32 +8582,32 @@
 "\t%s\n"
 "\tBitte aktualisieren Sie, falls notwendig, die Konfiguration manuell."
 
-#: builtin/remote.c:678
+#: builtin/remote.c:677
 #, c-format
 msgid "Could not append '%s'"
 msgstr "Konnte '%s' nicht anhängen."
 
-#: builtin/remote.c:689
+#: builtin/remote.c:688
 #, c-format
 msgid "Could not set '%s'"
 msgstr "Konnte '%s' nicht setzen"
 
-#: builtin/remote.c:711
+#: builtin/remote.c:710
 #, c-format
 msgid "deleting '%s' failed"
 msgstr "Konnte '%s' nicht löschen"
 
-#: builtin/remote.c:745
+#: builtin/remote.c:744
 #, c-format
 msgid "creating '%s' failed"
 msgstr "Konnte '%s' nicht erstellen"
 
-#: builtin/remote.c:759
+#: builtin/remote.c:765
 #, c-format
 msgid "Could not remove branch %s"
 msgstr "Konnte Branch %s nicht löschen"
 
-#: builtin/remote.c:829
+#: builtin/remote.c:832
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -8555,120 +8623,120 @@
 "entfernt;\n"
 "um diese zu entfernen, benutzen Sie:"
 
-#: builtin/remote.c:938
+#: builtin/remote.c:947
 #, 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:941
+#: builtin/remote.c:950
 msgid " tracked"
 msgstr " gefolgt"
 
-#: builtin/remote.c:943
+#: builtin/remote.c:952
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " veraltet (benutzen Sie 'git remote prune' zum Löschen)"
 
-#: builtin/remote.c:945
+#: builtin/remote.c:954
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:986
+#: builtin/remote.c:995
 #, 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:993
+#: builtin/remote.c:1002
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "Rebase auf Remote-Branch %s"
 
-#: builtin/remote.c:996
+#: builtin/remote.c:1005
 #, c-format
 msgid " merges with remote %s"
 msgstr " führt mit Remote-Branch %s zusammen"
 
-#: builtin/remote.c:997
+#: builtin/remote.c:1006
 msgid "    and with remote"
 msgstr "    und mit Remote-Branch"
 
-#: builtin/remote.c:999
+#: builtin/remote.c:1008
 #, c-format
 msgid "merges with remote %s"
 msgstr "führt mit Remote-Branch %s zusammen"
 
-#: builtin/remote.c:1000
+#: builtin/remote.c:1009
 msgid "   and with remote"
 msgstr "   und mit Remote-Branch"
 
-#: builtin/remote.c:1046
+#: builtin/remote.c:1055
 msgid "create"
 msgstr "erstellt"
 
-#: builtin/remote.c:1049
+#: builtin/remote.c:1058
 msgid "delete"
 msgstr "gelöscht"
 
-#: builtin/remote.c:1053
+#: builtin/remote.c:1062
 msgid "up to date"
 msgstr "aktuell"
 
-#: builtin/remote.c:1056
+#: builtin/remote.c:1065
 msgid "fast-forwardable"
 msgstr "vorspulbar"
 
-#: builtin/remote.c:1059
+#: builtin/remote.c:1068
 msgid "local out of date"
 msgstr "lokal nicht aktuell"
 
-#: builtin/remote.c:1066
+#: builtin/remote.c:1075
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s erzwingt Versandt nach %-*s (%s)"
 
-#: builtin/remote.c:1069
+#: builtin/remote.c:1078
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s versendet nach %-*s (%s)"
 
-#: builtin/remote.c:1073
+#: builtin/remote.c:1082
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s erzwingt Versand nach %s"
 
-#: builtin/remote.c:1076
+#: builtin/remote.c:1085
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s versendet nach %s"
 
-#: builtin/remote.c:1144
+#: builtin/remote.c:1153
 msgid "do not query remotes"
 msgstr "keine Abfrage von Remote-Repositories"
 
-#: builtin/remote.c:1171
+#: builtin/remote.c:1180
 #, c-format
 msgid "* remote %s"
 msgstr "* Remote-Repository %s"
 
-#: builtin/remote.c:1172
+#: builtin/remote.c:1181
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL zum Abholen: %s"
 
-#: builtin/remote.c:1173 builtin/remote.c:1318
+#: builtin/remote.c:1182 builtin/remote.c:1329
 msgid "(no URL)"
 msgstr "(keine URL)"
 
-#: builtin/remote.c:1182 builtin/remote.c:1184
+#: builtin/remote.c:1191 builtin/remote.c:1193
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  URL zum Versenden: %s"
 
-#: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190
+#: builtin/remote.c:1195 builtin/remote.c:1197 builtin/remote.c:1199
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Hauptbranch: %s"
 
-#: builtin/remote.c:1192
+#: builtin/remote.c:1201
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
@@ -8676,249 +8744,308 @@
 "  Hauptbranch (externer HEAD ist mehrdeutig, könnte einer der folgenden "
 "sein):\n"
 
-#: builtin/remote.c:1204
+#: builtin/remote.c:1213
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Remote-Branch:%s"
 msgstr[1] "  Remote-Branches:%s"
 
-#: builtin/remote.c:1207 builtin/remote.c:1234
+#: builtin/remote.c:1216 builtin/remote.c:1243
 msgid " (status not queried)"
 msgstr " (Zustand nicht abgefragt)"
 
-#: builtin/remote.c:1216
+#: builtin/remote.c:1225
 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:1224
+#: builtin/remote.c:1233
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  Lokale Referenzen werden von 'git push' gespiegelt"
 
-#: builtin/remote.c:1231
+#: builtin/remote.c:1240
 #, 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:1252
+#: builtin/remote.c:1261
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "setzt refs/remotes/<Name>/HEAD gemäß dem Remote-Repository"
 
-#: builtin/remote.c:1254
+#: builtin/remote.c:1263
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "entfernt refs/remotes/<Name>/HEAD"
 
-#: builtin/remote.c:1269
+#: builtin/remote.c:1278
 msgid "Cannot determine remote HEAD"
 msgstr "Kann HEAD des Remote-Repositories nicht bestimmen"
 
-#: builtin/remote.c:1271
+#: builtin/remote.c:1280
 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:1281
+#: builtin/remote.c:1290
 #, c-format
 msgid "Could not delete %s"
 msgstr "Konnte %s nicht entfernen"
 
-#: builtin/remote.c:1289
+#: builtin/remote.c:1298
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "keine gültige Referenz: %s"
 
-#: builtin/remote.c:1291
+#: builtin/remote.c:1300
 #, c-format
 msgid "Could not setup %s"
 msgstr "Konnte %s nicht einrichten"
 
-#: builtin/remote.c:1307
+#: builtin/remote.c:1318
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s wird unreferenziert!"
 
-#: builtin/remote.c:1308
+#: builtin/remote.c:1319
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s wurde unreferenziert!"
 
-#: builtin/remote.c:1314
+#: builtin/remote.c:1325
 #, c-format
 msgid "Pruning %s"
 msgstr "entferne veraltete Branches von %s"
 
-#: builtin/remote.c:1315
+#: builtin/remote.c:1326
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1328
+#: builtin/remote.c:1349
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [würde veralteten Branch entfernen] %s"
 
-#: builtin/remote.c:1331
+#: builtin/remote.c:1352
 #, c-format
 msgid " * [pruned] %s"
 msgstr "* [veralteten Branch entfernt] %s"
 
-#: builtin/remote.c:1374
+#: builtin/remote.c:1397
 msgid "prune remotes after fetching"
 msgstr "entfernt veraltete Branches im Remote-Repository nach \"fetch\""
 
-#: builtin/remote.c:1440 builtin/remote.c:1514
+#: builtin/remote.c:1463 builtin/remote.c:1537
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Kein solches Remote-Repository '%s'"
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1483
 msgid "add branch"
 msgstr "fügt Branch hinzu"
 
-#: builtin/remote.c:1467
+#: builtin/remote.c:1490
 msgid "no remote specified"
 msgstr "kein Remote-Repository angegeben"
 
-#: builtin/remote.c:1489
+#: builtin/remote.c:1512
 msgid "manipulate push URLs"
 msgstr "manipuliert URLs für \"push\""
 
-#: builtin/remote.c:1491
+#: builtin/remote.c:1514
 msgid "add URL"
 msgstr "fügt URL hinzu"
 
-#: builtin/remote.c:1493
+#: builtin/remote.c:1516
 msgid "delete URLs"
 msgstr "löscht URLs"
 
-#: builtin/remote.c:1500
+#: builtin/remote.c:1523
 msgid "--add --delete doesn't make sense"
 msgstr ""
 "Die Optionen --add und --delete können nicht gemeinsam verwendet werden."
 
-#: builtin/remote.c:1540
+#: builtin/remote.c:1563
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "ungültiges altes URL Format: %s"
 
-#: builtin/remote.c:1548
+#: builtin/remote.c:1571
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Keine solche URL gefunden: %s"
 
-#: builtin/remote.c:1550
+#: builtin/remote.c:1573
 msgid "Will not delete all non-push URLs"
 msgstr "Werde keine URLs entfernen, die nicht für \"push\" bestimmt sind"
 
-#: builtin/remote.c:1564
+#: builtin/remote.c:1587
 msgid "be verbose; must be placed before a subcommand"
 msgstr "erweiterte Ausgaben; muss vor einem Unterkommando angegeben werden"
 
-#: builtin/repack.c:16
+#: builtin/repack.c:17
 msgid "git repack [options]"
 msgstr "git repack [Optionen]"
 
-#: builtin/repack.c:156
+#: builtin/repack.c:160
 msgid "pack everything in a single pack"
 msgstr "packt alles in eine einzige Pack-Datei"
 
-#: builtin/repack.c:158
+#: builtin/repack.c:162
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "genau wie -a, unerreichbare Objekte werden aber nicht gelöscht"
 
-#: builtin/repack.c:161
+#: builtin/repack.c:165
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "entfernt redundante Pakete und führt \"git-prune-packed\" aus"
 
-#: builtin/repack.c:163
+#: builtin/repack.c:167
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "übergibt --no-reuse-delta an git-pack-objects"
 
-#: builtin/repack.c:165
+#: builtin/repack.c:169
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "übergibt --no-reuse-object an git-pack-objects"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:171
 msgid "do not run git-update-server-info"
 msgstr "git-update-server-info nicht ausführen"
 
-#: builtin/repack.c:170
+#: builtin/repack.c:174
 msgid "pass --local to git-pack-objects"
 msgstr "übergibt --local an git-pack-objects"
 
-#: builtin/repack.c:172
+#: builtin/repack.c:176
 msgid "write bitmap index"
 msgstr "schreibt Bitmap-Index"
 
-#: builtin/repack.c:173
+#: builtin/repack.c:177
 msgid "approxidate"
 msgstr "Datumsangabe"
 
-#: builtin/repack.c:174
+#: builtin/repack.c:178
 msgid "with -A, do not loosen objects older than this"
 msgstr "mit -A, löscht keine Objekte älter als dieses Datum"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:180
 msgid "size of the window used for delta compression"
 msgstr "Größe des Fensters für die Delta-Kompression"
 
-#: builtin/repack.c:177 builtin/repack.c:181
+#: builtin/repack.c:181 builtin/repack.c:185
 msgid "bytes"
 msgstr "Bytes"
 
-#: builtin/repack.c:178
+#: builtin/repack.c:182
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr ""
 "gleiches wie oben, limitiert aber die Speichergröße anstatt der\n"
 "Anzahl der Einträge"
 
-#: builtin/repack.c:180
+#: builtin/repack.c:184
 msgid "limits the maximum delta depth"
 msgstr "limitiert die maximale Delta-Tiefe"
 
-#: builtin/repack.c:182
+#: builtin/repack.c:186
 msgid "maximum size of each packfile"
 msgstr "maximale Größe für jede Paketdatei"
 
-#: builtin/repack.c:184
+#: builtin/repack.c:188
 msgid "repack objects in packs marked with .keep"
-msgstr "packt Objekte um, die sich in mit .keep markierten Pack-Dateien befinden"
+msgstr ""
+"packt Objekte um, die sich in mit .keep markierten Pack-Dateien befinden"
 
-#: builtin/repack.c:371
+#: builtin/repack.c:374
 #, c-format
 msgid "removing '%s' failed"
 msgstr "Löschen von '%s' fehlgeschlagen"
 
-#: builtin/replace.c:17
+#: builtin/replace.c:19
 msgid "git replace [-f] <object> <replacement>"
 msgstr "git replace [-f] <Objekt> <Ersetzung>"
 
-#: builtin/replace.c:18
+#: builtin/replace.c:20
+msgid "git replace [-f] --edit <object>"
+msgstr "git replace [-f] --edit <Objekt>"
+
+#: builtin/replace.c:21
+msgid "git replace [-f] --graft <commit> [<parent>...]"
+msgstr "git replace [-f] --graft <Commit> [<Eltern-Commit>...]"
+
+#: builtin/replace.c:22
 msgid "git replace -d <object>..."
 msgstr "git replace -d <Objekt>..."
 
-#: builtin/replace.c:19
+#: builtin/replace.c:23
 msgid "git replace [--format=<format>] [-l [<pattern>]]"
 msgstr "git replace [--format=<Format>] [-l [<Muster>]]"
 
-#: builtin/replace.c:174
+#: builtin/replace.c:322 builtin/replace.c:360 builtin/replace.c:388
+#, c-format
+msgid "Not a valid object name: '%s'"
+msgstr "Ungültiger Objekt-Name: '%s'"
+
+#: builtin/replace.c:352
+#, c-format
+msgid "bad mergetag in commit '%s'"
+msgstr "ungültiger Merge-Tag in Commit '%s'"
+
+#: builtin/replace.c:354
+#, c-format
+msgid "malformed mergetag in commit '%s'"
+msgstr "fehlerhafter Merge-Tag in Commit '%s'"
+
+#: builtin/replace.c:365
+#, c-format
+msgid ""
+"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
+"instead of --graft"
+msgstr ""
+"Der ursprüngliche Commit '%s' enthält Merge-Tag '%s', der verworfen\n"
+"wird; benutzen Sie --edit anstatt --graft"
+
+#: builtin/replace.c:398
+#, c-format
+msgid "the original commit '%s' has a gpg signature."
+msgstr "Der ursprüngliche Commit '%s' hat eine GPG-Signatur."
+
+#: builtin/replace.c:399
+msgid "the signature will be removed in the replacement commit!"
+msgstr "Die Signatur wird in dem Ersetzungs-Commit entfernt!"
+
+#: builtin/replace.c:405
+#, c-format
+msgid "could not write replacement commit for: '%s'"
+msgstr "Konnte Ersetzungs-Commit für '%s' nicht schreiben"
+
+#: builtin/replace.c:429
 msgid "list replace refs"
 msgstr "listet ersetzende Referenzen auf"
 
-#: builtin/replace.c:175
+#: builtin/replace.c:430
 msgid "delete replace refs"
 msgstr "löscht ersetzende Referenzen"
 
-#: builtin/replace.c:176
+#: builtin/replace.c:431
+msgid "edit existing object"
+msgstr "bearbeitet existierendes Objekt"
+
+#: builtin/replace.c:432
+msgid "change a commit's parents"
+msgstr "ändert Eltern-Commits eines Commits"
+
+#: builtin/replace.c:433
 msgid "replace the ref if it exists"
 msgstr "ersetzt die Referenz, wenn sie existiert"
 
-#: builtin/replace.c:177
+#: builtin/replace.c:434
+msgid "do not pretty-print contents for --edit"
+msgstr "keine ansprechende Anzeige des Objektinhaltes für --edit"
+
+#: builtin/replace.c:435
 msgid "use this format"
 msgstr "benutzt das angegebene Format"
 
@@ -8987,100 +9114,100 @@
 msgid "Cannot do a %s reset in the middle of a merge."
 msgstr "Kann keinen '%s'-Reset durchführen, während ein Merge im Gange ist."
 
-#: builtin/reset.c:273
+#: builtin/reset.c:275
 msgid "be quiet, only report errors"
 msgstr "weniger Ausgaben, meldet nur Fehler"
 
-#: builtin/reset.c:275
+#: builtin/reset.c:277
 msgid "reset HEAD and index"
 msgstr "setzt HEAD und Staging-Area um"
 
-#: builtin/reset.c:276
+#: builtin/reset.c:278
 msgid "reset only HEAD"
 msgstr "setzt nur HEAD um"
 
-#: builtin/reset.c:278 builtin/reset.c:280
+#: builtin/reset.c:280 builtin/reset.c:282
 msgid "reset HEAD, index and working tree"
 msgstr "setzt HEAD, Staging-Area und Arbeitsverzeichnis um"
 
-#: builtin/reset.c:282
+#: builtin/reset.c:284
 msgid "reset HEAD but keep local changes"
 msgstr "setzt HEAD um, behält aber lokale Änderungen"
 
-#: builtin/reset.c:285
+#: builtin/reset.c:287
 msgid "record only the fact that removed paths will be added later"
 msgstr "speichert nur, dass gelöschte Pfade später hinzugefügt werden sollen"
 
-#: builtin/reset.c:302
+#: builtin/reset.c:304
 #, c-format
 msgid "Failed to resolve '%s' as a valid revision."
 msgstr "Konnte '%s' nicht als gültigen Commit auflösen."
 
-#: builtin/reset.c:305 builtin/reset.c:313
+#: builtin/reset.c:307 builtin/reset.c:315
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: builtin/reset.c:310
+#: builtin/reset.c:312
 #, c-format
 msgid "Failed to resolve '%s' as a valid tree."
 msgstr "Konnte '%s' nicht als gültiges \"Tree\"-Objekt auflösen."
 
-#: builtin/reset.c:319
+#: builtin/reset.c:321
 msgid "--patch is incompatible with --{hard,mixed,soft}"
 msgstr "--patch ist inkompatibel mit --{hard,mixed,soft}"
 
-#: builtin/reset.c:328
+#: builtin/reset.c:330
 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
 msgstr ""
 "--mixed mit Pfaden ist veraltet; benutzen Sie stattdessen 'git reset -- "
 "<Pfade>'."
 
-#: builtin/reset.c:330
+#: builtin/reset.c:332
 #, c-format
 msgid "Cannot do %s reset with paths."
 msgstr "Ein '%s'-Reset mit Pfaden ist nicht möglich."
 
-#: builtin/reset.c:340
+#: builtin/reset.c:342
 #, c-format
 msgid "%s reset is not allowed in a bare repository"
 msgstr "'%s'-Reset ist in einem Bare-Repository nicht erlaubt"
 
-#: builtin/reset.c:344
+#: builtin/reset.c:346
 msgid "-N can only be used with --mixed"
 msgstr "-N kann nur mit -mixed benutzt werden"
 
-#: builtin/reset.c:361
+#: builtin/reset.c:363
 msgid "Unstaged changes after reset:"
 msgstr "Nicht zum Commit vorgemerkte Änderungen nach Zurücksetzung:"
 
-#: builtin/reset.c:367
+#: builtin/reset.c:369
 #, c-format
 msgid "Could not reset index file to revision '%s'."
 msgstr "Konnte Staging-Area-Datei nicht zu Commit '%s' setzen."
 
-#: builtin/reset.c:372
+#: builtin/reset.c:373
 msgid "Could not write new index file."
 msgstr "Konnte neue Staging-Area-Datei nicht schreiben."
 
-#: builtin/rev-parse.c:359
+#: builtin/rev-parse.c:360
 msgid "git rev-parse --parseopt [options] -- [<args>...]"
 msgstr "git rev-parse --parseopt [Optionen] -- [<Argumente>...]"
 
-#: builtin/rev-parse.c:364
+#: builtin/rev-parse.c:365
 msgid "keep the `--` passed as an arg"
 msgstr "lässt `--` als Argument"
 
-#: builtin/rev-parse.c:366
+#: builtin/rev-parse.c:367
 msgid "stop parsing after the first non-option argument"
 msgstr "stoppt das Parsen nach dem ersten Argument was keine Option ist"
 
-#: builtin/rev-parse.c:369
+#: builtin/rev-parse.c:370
 msgid "output in stuck long form"
 msgstr ""
 "Ausgabe in Langform mit Argumenten an den Optionen (getrennt durch '=')"
 
-#: builtin/rev-parse.c:497
+#: builtin/rev-parse.c:498
 msgid ""
 "git rev-parse --parseopt [options] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -9232,7 +9359,7 @@
 "(use -f to force removal)"
 msgstr ""
 "\n"
-"(benutzen Sie -f um die Löschung zu erzwingen)"
+"(benutzen Sie -f, um die Löschung zu erzwingen)"
 
 #: builtin/rm.c:240
 msgid "the following file has changes staged in the index:"
@@ -9246,7 +9373,7 @@
 "(use --cached to keep the file, or -f to force removal)"
 msgstr ""
 "\n"
-"(benutzen Sie --cached um die Datei zu behalten, oder -f um die Entfernung "
+"(benutzen Sie --cached, um die Datei zu behalten, oder -f, um die Entfernung "
 "zu erzwingen)"
 
 #: builtin/rm.c:252
@@ -9304,7 +9431,7 @@
 
 #: builtin/shortlog.c:234
 msgid "Show the email address of each author"
-msgstr "Zeigt die Email-Adresse von jedem Autor"
+msgstr "Zeigt die E-Mail-Adresse von jedem Autor"
 
 #: builtin/shortlog.c:235
 msgid "w[,i1[,i2]]"
@@ -9396,11 +9523,11 @@
 
 #: builtin/show-ref.c:10
 msgid ""
-"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash"
-"[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] "
+"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] [--] [pattern*] "
+"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--"
+"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] "
 
 #: builtin/show-ref.c:11
 msgid "git show-ref --exclude-existing[=pattern] < ref-list"
@@ -9462,11 +9589,11 @@
 msgid "shorten ref output"
 msgstr "verkürzte Ausgabe der Referenzen"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:349
 msgid "reason"
 msgstr "Grund"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:349
 msgid "reason of the update"
 msgstr "Grund für die Aktualisierung"
 
@@ -9493,203 +9620,212 @@
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <Tagname>..."
 
-#: builtin/tag.c:67
+#: builtin/tag.c:69
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "fehlerhaftes Objekt bei '%s'"
 
-#: builtin/tag.c:239
+#: builtin/tag.c:301
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "Tagname zu lang: %.*s..."
 
-#: builtin/tag.c:244
+#: builtin/tag.c:306
 #, c-format
 msgid "tag '%s' not found."
 msgstr "Tag '%s' nicht gefunden."
 
-#: builtin/tag.c:259
+#: builtin/tag.c:321
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Tag '%s' gelöscht (war %s)\n"
 
-#: builtin/tag.c:271
+#: builtin/tag.c:333
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "Konnte Tag '%s' nicht verifizieren"
 
-#: builtin/tag.c:281
+#: builtin/tag.c:343
 #, c-format
 msgid ""
 "\n"
-"Write a tag message\n"
+"Write a message for tag:\n"
+"  %s\n"
 "Lines starting with '%c' will be ignored.\n"
 msgstr ""
 "\n"
-"Geben Sie eine Tag-Beschreibung ein.\n"
-"Zeilen, die mit '%c' beginnen, werden ignoriert.\n"
+"Geben Sie eine Beschreibung für Tag\n"
+"  %s\n"
+"ein. Zeilen, die mit '%c' beginnen, werden ignoriert.\n"
 
-#: builtin/tag.c:285
+#: builtin/tag.c:347
 #, c-format
 msgid ""
 "\n"
-"Write a tag message\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"
-"Geben Sie eine Tag-Beschreibung ein.\n"
-"Zeilen, die mit '%c' beginnen, werden behalten; Sie dürfen diese\n"
+"Geben Sie eine Beschreibung für Tag\n"
+"  %s\n"
+"ein. Zeilen, die mit '%c' beginnen, werden behalten; Sie dürfen diese\n"
 "selbst entfernen wenn Sie möchten.\n"
 
-#: builtin/tag.c:324
+#: 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
 msgid "unable to sign the tag"
 msgstr "konnte Tag nicht signieren"
 
-#: builtin/tag.c:326
+#: builtin/tag.c:430
 msgid "unable to write tag file"
 msgstr "konnte Tag-Datei nicht schreiben"
 
-#: builtin/tag.c:351
+#: builtin/tag.c:455
 msgid "bad object type."
 msgstr "ungültiger Objekt-Typ"
 
-#: builtin/tag.c:364
+#: builtin/tag.c:468
 msgid "tag header too big."
 msgstr "Tag-Kopf zu groß."
 
-#: builtin/tag.c:400
+#: builtin/tag.c:504
 msgid "no tag message?"
 msgstr "keine Tag-Beschreibung?"
 
-#: builtin/tag.c:406
+#: builtin/tag.c:510
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "Die Tag-Beschreibung wurde gelassen in %s\n"
 
-#: builtin/tag.c:455
+#: builtin/tag.c:559
 msgid "switch 'points-at' requires an object"
 msgstr "Option 'points-at' erfordert ein Objekt"
 
-#: builtin/tag.c:457
+#: builtin/tag.c:561
 #, c-format
 msgid "malformed object name '%s'"
 msgstr "fehlerhafter Objekt-Name '%s'"
 
-#: builtin/tag.c:480
-#, c-format
-msgid "unsupported sort specification %s"
-msgstr "Nicht unterstützte Angabe für \"--sort\": %s"
-
-#: builtin/tag.c:500
+#: builtin/tag.c:588
 msgid "list tag names"
 msgstr "listet Tagnamen auf"
 
-#: builtin/tag.c:502
+#: builtin/tag.c:590
 msgid "print <n> lines of each tag message"
 msgstr "zeigt <n> Zeilen jeder Tag-Beschreibung"
 
-#: builtin/tag.c:504
+#: builtin/tag.c:592
 msgid "delete tags"
 msgstr "löscht Tags"
 
-#: builtin/tag.c:505
+#: builtin/tag.c:593
 msgid "verify tags"
 msgstr "überprüft Tags"
 
-#: builtin/tag.c:507
+#: builtin/tag.c:595
 msgid "Tag creation options"
 msgstr "Optionen für Erstellung von Tags"
 
-#: builtin/tag.c:509
+#: builtin/tag.c:597
 msgid "annotated tag, needs a message"
 msgstr "annotiertes Tag, benötigt eine Beschreibung"
 
-#: builtin/tag.c:511
+#: builtin/tag.c:599
 msgid "tag message"
 msgstr "Tag-Beschreibung"
 
-#: builtin/tag.c:513
+#: builtin/tag.c:601
 msgid "annotated and GPG-signed tag"
 msgstr "annotiertes und GPG-signiertes Tag"
 
-#: builtin/tag.c:517
+#: builtin/tag.c:605
 msgid "use another key to sign the tag"
-msgstr "verwendet einen anderen Schlüssel um das Tag zu signieren"
+msgstr "verwendet einen anderen Schlüssel, um das Tag zu signieren"
 
-#: builtin/tag.c:518
+#: builtin/tag.c:606
 msgid "replace the tag if exists"
 msgstr "ersetzt das Tag, wenn es existiert"
 
-#: builtin/tag.c:519
+#: builtin/tag.c:607
 msgid "show tag list in columns"
 msgstr "zeigt Liste der Tags in Spalten"
 
-#: builtin/tag.c:521
+#: builtin/tag.c:609
 msgid "sort tags"
 msgstr "sortiert Tags"
 
-#: builtin/tag.c:525
+#: builtin/tag.c:613
 msgid "Tag listing options"
 msgstr "Optionen für Auflistung der Tags"
 
-#: builtin/tag.c:528 builtin/tag.c:534
+#: builtin/tag.c:616 builtin/tag.c:622
 msgid "print only tags that contain the commit"
 msgstr "gibt nur Tags aus, die diesen Commit beinhalten"
 
-#: builtin/tag.c:540
+#: builtin/tag.c:628
 msgid "print only tags of the object"
 msgstr "gibt nur Tags von dem Objekt aus"
 
-#: builtin/tag.c:566
+#: builtin/tag.c:654
 msgid "--column and -n are incompatible"
 msgstr "--column und -n sind inkompatibel"
 
-#: builtin/tag.c:578
+#: builtin/tag.c:666
 msgid "--sort and -n are incompatible"
 msgstr "--sort und -n sind inkompatibel"
 
-#: builtin/tag.c:585
+#: builtin/tag.c:673
 msgid "-n option is only allowed with -l."
 msgstr "-n Option ist nur erlaubt mit -l."
 
-#: builtin/tag.c:587
+#: builtin/tag.c:675
 msgid "--contains option is only allowed with -l."
 msgstr "--contains Option ist nur erlaubt mit -l."
 
-#: builtin/tag.c:589
+#: builtin/tag.c:677
 msgid "--points-at option is only allowed with -l."
 msgstr "--points-at Option ist nur erlaubt mit -l."
 
-#: builtin/tag.c:597
+#: builtin/tag.c:685
 msgid "only one -F or -m option is allowed."
 msgstr "nur eine -F oder -m Option ist erlaubt."
 
-#: builtin/tag.c:617
+#: builtin/tag.c:705
 msgid "too many params"
 msgstr "zu viele Parameter"
 
-#: builtin/tag.c:623
+#: builtin/tag.c:711
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' ist kein gültiger Tagname."
 
-#: builtin/tag.c:628
+#: builtin/tag.c:716
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "Tag '%s' existiert bereits"
 
-#: builtin/tag.c:646
+#: builtin/tag.c:734
 #, c-format
 msgid "%s: cannot lock the ref"
 msgstr "%s: kann Referenz nicht sperren"
 
-#: builtin/tag.c:648
+#: builtin/tag.c:736
 #, c-format
 msgid "%s: cannot update the ref"
 msgstr "%s: kann Referenz nicht aktualisieren"
 
-#: builtin/tag.c:650
+#: builtin/tag.c:738
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Tag '%s' aktualisiert (war %s)\n"
@@ -9698,126 +9834,130 @@
 msgid "Unpacking objects"
 msgstr "Entpacke Objekte"
 
-#: builtin/update-index.c:399
+#: builtin/update-index.c:402
 msgid "git update-index [options] [--] [<file>...]"
 msgstr "git update-index [Optionen] [--] [<Datei>...]"
 
-#: builtin/update-index.c:748
+#: builtin/update-index.c:755
 msgid "continue refresh even when index needs update"
 msgstr ""
 "Aktualisierung fortsetzen, auch wenn die Staging-Area aktualisiert werden "
 "muss"
 
-#: builtin/update-index.c:751
+#: builtin/update-index.c:758
 msgid "refresh: ignore submodules"
 msgstr "Aktualisierung: ignoriert Submodule"
 
-#: builtin/update-index.c:754
+#: builtin/update-index.c:761
 msgid "do not ignore new files"
 msgstr "ignoriert keine neuen Dateien"
 
-#: builtin/update-index.c:756
+#: builtin/update-index.c:763
 msgid "let files replace directories and vice-versa"
 msgstr "lässt Dateien Verzeichnisse ersetzen, und umgedreht"
 
-#: builtin/update-index.c:758
+#: builtin/update-index.c:765
 msgid "notice files missing from worktree"
 msgstr "beachtet fehlende Dateien im Arbeitsverzeichnis"
 
-#: builtin/update-index.c:760
+#: builtin/update-index.c:767
 msgid "refresh even if index contains unmerged entries"
 msgstr ""
 "aktualisiert, auch wenn die Staging-Area nicht zusammengeführte Einträge "
 "beinhaltet"
 
-#: builtin/update-index.c:763
+#: builtin/update-index.c:770
 msgid "refresh stat information"
 msgstr "aktualisiert Dateiinformationen"
 
-#: builtin/update-index.c:767
+#: builtin/update-index.c:774
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "wie --refresh, ignoriert aber \"assume-unchanged\" Einstellung"
 
-#: builtin/update-index.c:771
+#: builtin/update-index.c:778
 msgid "<mode>,<object>,<path>"
 msgstr "<Modus>,<Objekt>,<Pfad>"
 
-#: builtin/update-index.c:772
+#: builtin/update-index.c:779
 msgid "add the specified entry to the index"
 msgstr "merkt den angegebenen Eintrag zum Commit vor"
 
-#: builtin/update-index.c:776
+#: builtin/update-index.c:783
 msgid "(+/-)x"
 msgstr "(+/-)x"
 
-#: builtin/update-index.c:777
+#: builtin/update-index.c:784
 msgid "override the executable bit of the listed files"
 msgstr "überschreibt das \"ausführbar\"-Bit der aufgelisteten Dateien"
 
-#: builtin/update-index.c:781
+#: builtin/update-index.c:788
 msgid "mark files as \"not changing\""
 msgstr "betrachte diese Datei immer als unverändert"
 
-#: builtin/update-index.c:784
+#: builtin/update-index.c:791
 msgid "clear assumed-unchanged bit"
 msgstr "löscht \"assumed-unchanged\"-Bit"
 
-#: builtin/update-index.c:787
+#: builtin/update-index.c:794
 msgid "mark files as \"index-only\""
 msgstr "markiert Dateien als \"index-only\""
 
-#: builtin/update-index.c:790
+#: builtin/update-index.c:797
 msgid "clear skip-worktree bit"
 msgstr "löscht \"skip-worktree\"-Bit"
 
-#: builtin/update-index.c:793
+#: builtin/update-index.c:800
 msgid "add to index only; do not add content to object database"
 msgstr ""
 "merkt die Änderungen nur zum Commit vor; Inhalt wird nicht der Objekt-"
 "Datenbank hinzugefügt"
 
-#: builtin/update-index.c:795
+#: builtin/update-index.c:802
 msgid "remove named paths even if present in worktree"
 msgstr ""
 "löscht benannte Pfade, auch wenn sie sich im Arbeitsverzeichnis befinden"
 
-#: builtin/update-index.c:797
+#: builtin/update-index.c:804
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "mit --stdin: eingegebene Zeilen sind durch NUL-Bytes abgeschlossen"
 
-#: builtin/update-index.c:799
+#: builtin/update-index.c:806
 msgid "read list of paths to be updated from standard input"
 msgstr "liest Liste der zu aktualisierenden Pfade von der Standard-Eingabe"
 
-#: builtin/update-index.c:803
+#: builtin/update-index.c:810
 msgid "add entries from standard input to the index"
 msgstr "merkt Einträge von der Standard-Eingabe zum Commit vor"
 
-#: builtin/update-index.c:807
+#: builtin/update-index.c:814
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr ""
 "wiederholtes Einpflegen der Zustände #2 und #3 für die aufgelisteten Pfade"
 
-#: builtin/update-index.c:811
+#: builtin/update-index.c:818
 msgid "only update entries that differ from HEAD"
 msgstr "aktualisiert nur Einträge, die unterschiedlich zu HEAD sind"
 
-#: builtin/update-index.c:815
+#: builtin/update-index.c:822
 msgid "ignore files missing from worktree"
 msgstr "ignoriert fehlende Dateien im Arbeitsverzeichnis"
 
-#: builtin/update-index.c:818
+#: builtin/update-index.c:825
 msgid "report actions to standard output"
 msgstr "gibt die Aktionen in der Standard-Ausgabe aus"
 
-#: builtin/update-index.c:820
+#: builtin/update-index.c:827
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(für Fremdprogramme) keine gespeicherten, nicht aufgelöste Konflikte"
 
-#: builtin/update-index.c:824
+#: builtin/update-index.c:831
 msgid "write index in this format"
 msgstr "schreibt Staging-Area-Datei in diesem Format"
 
+#: builtin/update-index.c:833
+msgid "enable or disable split index"
+msgstr "Aktivierung oder Deaktivierung des Splittings der Staging-Area"
+
 #: builtin/update-ref.c:9
 msgid "git update-ref [options] -d <refname> [<oldval>]"
 msgstr "git update-ref [Optionen] -d <Referenzname> [<alterWert>]"
@@ -9830,19 +9970,19 @@
 msgid "git update-ref [options] --stdin [-z]"
 msgstr "git update-ref [Optionen] --stdin [-z]"
 
-#: builtin/update-ref.c:256
+#: builtin/update-ref.c:350
 msgid "delete the reference"
 msgstr "löscht diese Referenz"
 
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:352
 msgid "update <refname> not the one it points to"
 msgstr "aktualisiert <Referenzname>, nicht den Verweis"
 
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:353
 msgid "stdin has NUL-terminated arguments"
 msgstr "Standard-Eingabe hat durch NUL-Zeichen abgeschlossene Argumente"
 
-#: builtin/update-ref.c:260
+#: builtin/update-ref.c:354
 msgid "read updates from stdin"
 msgstr "liest Aktualisierungen von der Standard-Eingabe"
 
@@ -9854,15 +9994,23 @@
 msgid "update the info files from scratch"
 msgstr "aktualisiert die Informationsdateien von Grund auf"
 
-#: builtin/verify-pack.c:56
+#: builtin/verify-commit.c:17
+msgid "git verify-commit [-v|--verbose] <commit>..."
+msgstr "git verify-commit [-v|--verbose] <Commit>..."
+
+#: builtin/verify-commit.c:75
+msgid "print commit contents"
+msgstr "gibt Commit-Inhalte aus"
+
+#: builtin/verify-pack.c:55
 msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."
 msgstr "git verify-pack [-v|--verbose] [-s|--stat-only] <Paket>..."
 
-#: builtin/verify-pack.c:66
+#: builtin/verify-pack.c:65
 msgid "verbose"
 msgstr "erweiterte Ausgaben"
 
-#: builtin/verify-pack.c:68
+#: builtin/verify-pack.c:67
 msgid "show statistics only"
 msgstr "zeigt nur Statistiken"
 
@@ -9898,7 +10046,7 @@
 msgstr ""
 "'git help -a' und 'git help -g' listet verfügbare Unterkommandos und\n"
 "einige Anleitungen zu Git-Konzepten auf. Benutzen Sie 'git help <Kommando>'\n"
-"oder 'git help <Konzept>' um mehr über ein spezifisches Kommando oder\n"
+"oder 'git help <Konzept>', um mehr über ein spezifisches Kommando oder\n"
 "Konzept zu erfahren."
 
 #: parse-options.h:143
@@ -10052,7 +10200,7 @@
 #: git-am.sh:141
 msgid "Using index info to reconstruct a base tree..."
 msgstr ""
-"Verwende Informationen aus der Staging-Area um einen Basisverzeichnis "
+"Verwende Informationen aus der Staging-Area, um einen Basisverzeichnis "
 "nachzustellen"
 
 #: git-am.sh:156
@@ -10109,7 +10257,7 @@
 "Use \"git am --abort\" to remove it."
 msgstr ""
 "Stray $dotest Verzeichnis gefunden.\n"
-"Benutzen Sie \"git am --abort\" um es zu entfernen."
+"Benutzen Sie \"git am --abort\", um es zu entfernen."
 
 #: git-am.sh:535
 msgid "Resolve operation not in progress, we are not resuming."
@@ -10136,7 +10284,7 @@
 
 #: git-am.sh:732
 msgid "Patch does not have a valid e-mail address."
-msgstr "Patch enthält keine gültige Email-Adresse."
+msgstr "Patch enthält keine gültige E-Mail-Adresse."
 
 #: git-am.sh:779
 msgid "cannot be interactive without stdin connected to a terminal."
@@ -10367,7 +10515,7 @@
 msgstr ""
 "\"pull\" ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben.\n"
 "Bitte korrigieren Sie dies im Arbeitsverzeichnis und benutzen Sie dann \n"
-"'git add/rm <Datei>' um die Auflösung entsprechend zu markieren, oder\n"
+"'git add/rm <Datei>', um die Auflösung entsprechend zu markieren, oder\n"
 "benutzen Sie 'git commit -a'."
 
 #: git-pull.sh:25
@@ -10375,13 +10523,13 @@
 msgstr ""
 "\"pull\" ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
 
-#: git-pull.sh:247
+#: git-pull.sh:245
 msgid "updating an unborn branch with changes added to the index"
 msgstr ""
 "Aktualisiere einen ungeborenen Branch mit Änderungen, die zum Commit "
 "vorgemerkt sind"
 
-#: git-pull.sh:271
+#: git-pull.sh:269
 #, sh-format
 msgid ""
 "Warning: fetch updated the current branch head.\n"
@@ -10391,11 +10539,11 @@
 "Warnung: \"fetch\" aktualisierte die Spitze des aktuellen Branches.\n"
 "Warnung: Spule Ihr Arbeitsverzeichnis von Commit $orig_head vor."
 
-#: git-pull.sh:296
+#: git-pull.sh:294
 msgid "Cannot merge multiple branches into empty head"
 msgstr "Kann nicht mehrere Branches in einen ungeborenen Branch zusammenführen"
 
-#: git-pull.sh:300
+#: git-pull.sh:298
 msgid "Cannot rebase onto multiple branches"
 msgstr "kann Rebase nicht auf mehrere Branches ausführen"
 
@@ -10413,16 +10561,16 @@
 "Um den ursprünglichen Branch wiederherzustellen und den Rebase abzubrechen,\n"
 "führen Sie \"git rebase --abort\" aus."
 
-#: git-rebase.sh:164
+#: git-rebase.sh:165
 msgid "Applied autostash."
 msgstr "\"autostash\" angewendet."
 
-#: git-rebase.sh:167
+#: git-rebase.sh:168
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Kann $stash_sha1 nicht speichern."
 
-#: git-rebase.sh:168
+#: git-rebase.sh:169
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
@@ -10432,33 +10580,33 @@
 "Ihre Änderungen sind im Stash sicher.\n"
 "Sie können jederzeit \"git stash pop\" oder \"git stash drop\" ausführen.\n"
 
-#: git-rebase.sh:207
+#: git-rebase.sh:208
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Der \"pre-rebase hook\" hat den Rebase zurückgewiesen."
 
-#: git-rebase.sh:212
+#: git-rebase.sh:213
 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:350
+#: git-rebase.sh:351
 msgid "The --exec option must be used with the --interactive option"
 msgstr "Die Option --exec muss mit --interactive verwendet werden."
 
-#: git-rebase.sh:355
+#: git-rebase.sh:356
 msgid "No rebase in progress?"
 msgstr "Kein Rebase im Gange?"
 
-#: git-rebase.sh:366
+#: git-rebase.sh:367
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 "Die --edit-todo Aktion kann nur während eines interaktiven Rebase verwendet "
 "werden."
 
-#: git-rebase.sh:373
+#: git-rebase.sh:374
 msgid "Cannot read HEAD"
 msgstr "Kann HEAD nicht lesen"
 
-#: git-rebase.sh:376
+#: git-rebase.sh:377
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -10466,12 +10614,12 @@
 "Sie müssen alle Merge-Konflikte editieren und diese dann\n"
 "mittels \"git add\" als aufgelöst markieren"
 
-#: git-rebase.sh:394
+#: git-rebase.sh:395
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Konnte nicht zu $head_name zurückgehen"
 
-#: git-rebase.sh:413
+#: git-rebase.sh:414
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -10492,67 +10640,67 @@
 "und führen Sie dieses Kommando nochmal aus. Es wird angehalten, falls noch\n"
 "etwas Schützenswertes vorhanden ist."
 
-#: git-rebase.sh:464
+#: git-rebase.sh:465
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "ungültiger Upstream-Branch $upstream_name"
 
-#: git-rebase.sh:488
+#: git-rebase.sh:489
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: es gibt mehr als eine Merge-Basis"
 
-#: git-rebase.sh:491 git-rebase.sh:495
+#: git-rebase.sh:492 git-rebase.sh:496
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: es gibt keine Merge-Basis"
 
-#: git-rebase.sh:500
+#: git-rebase.sh:501
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "$onto_name zeigt auf keinen gültigen Commit"
 
-#: git-rebase.sh:523
+#: git-rebase.sh:524
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "fatal: Branch $branch_name nicht gefunden"
 
-#: git-rebase.sh:556
+#: git-rebase.sh:557
 msgid "Cannot autostash"
 msgstr "Kann \"autostash\" nicht ausführen."
 
-#: git-rebase.sh:561
+#: git-rebase.sh:562
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "\"autostash\" erzeugt: $stash_abbrev"
 
-#: git-rebase.sh:565
+#: git-rebase.sh:566
 msgid "Please commit or stash them."
 msgstr "Bitte committen Sie die Änderungen oder benutzen Sie \"stash\"."
 
-#: git-rebase.sh:585
+#: git-rebase.sh:586
 #, sh-format
 msgid "Current branch $branch_name is up to date."
-msgstr "Aktueller Branch $branch_name ist auf dem neusten Stand."
+msgstr "Aktueller Branch $branch_name ist auf dem neuesten Stand."
 
-#: git-rebase.sh:589
+#: git-rebase.sh:590
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr ""
-"Aktueller Branch $branch_name ist auf dem neusten Stand, Rebase erzwungen."
+"Aktueller Branch $branch_name ist auf dem neuesten Stand, Rebase erzwungen."
 
-#: git-rebase.sh:600
+#: git-rebase.sh:601
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Änderungen von $mb zu $onto:"
 
-#: git-rebase.sh:609
+#: git-rebase.sh:610
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 "Zunächst wird der Branch zurückgespult, um Ihre Änderungen\n"
 "darauf neu anzuwenden..."
 
-#: git-rebase.sh:619
+#: git-rebase.sh:620
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "$branch_name zu $onto_name vorgespult."
@@ -10569,23 +10717,23 @@
 msgid "Cannot save the current index state"
 msgstr "Kann den aktuellen Zustand der Staging-Area nicht speichern"
 
-#: git-stash.sh:123 git-stash.sh:136
+#: git-stash.sh:124 git-stash.sh:137
 msgid "Cannot save the current worktree state"
 msgstr "Kann den aktuellen Zustand des Arbeitsverzeichnisses nicht speichern"
 
-#: git-stash.sh:140
+#: git-stash.sh:141
 msgid "No changes selected"
 msgstr "Keine Änderungen ausgewählt"
 
-#: git-stash.sh:143
+#: git-stash.sh:144
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "Kann temporäre Staging-Area nicht löschen (kann nicht passieren)"
 
-#: git-stash.sh:156
+#: git-stash.sh:157
 msgid "Cannot record working tree state"
 msgstr "Kann Zustand des Arbeitsverzeichnisses nicht aufzeichnen"
 
-#: git-stash.sh:190
+#: git-stash.sh:191
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "Kann $ref_stash nicht mit $w_commit aktualisieren."
@@ -10600,7 +10748,7 @@
 #. $ 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:237
+#: git-stash.sh:238
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -10610,85 +10758,85 @@
 "        Um eine Beschreibung anzugeben, benutzen Sie \"git stash save -- "
 "'$option'\""
 
-#: git-stash.sh:258
+#: git-stash.sh:259
 msgid "No local changes to save"
 msgstr "Keine lokalen Änderungen zum Speichern"
 
-#: git-stash.sh:262
+#: git-stash.sh:263
 msgid "Cannot initialize stash"
 msgstr "Kann \"stash\" nicht initialisieren"
 
-#: git-stash.sh:266
+#: git-stash.sh:267
 msgid "Cannot save the current status"
 msgstr "Kann den aktuellen Status nicht speichern"
 
-#: git-stash.sh:284
+#: git-stash.sh:285
 msgid "Cannot remove worktree changes"
 msgstr "Kann Änderungen im Arbeitsverzeichnis nicht löschen"
 
-#: git-stash.sh:383
+#: git-stash.sh:384
 msgid "No stash found."
 msgstr "Kein \"stash\" gefunden."
 
-#: git-stash.sh:390
+#: git-stash.sh:391
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Zu viele Commits angegeben: $REV"
 
-#: git-stash.sh:396
+#: git-stash.sh:397
 #, sh-format
 msgid "$reference is not valid reference"
 msgstr "$reference ist keine gültige Referenz"
 
-#: git-stash.sh:424
+#: git-stash.sh:425
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' ist kein \"stash\"-artiger Commit"
 
-#: git-stash.sh:435
+#: git-stash.sh:436
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' ist keine \"stash\"-Referenz"
 
-#: git-stash.sh:443
+#: git-stash.sh:444
 msgid "unable to refresh index"
 msgstr "unfähig die Staging-Area zu aktualisieren"
 
-#: git-stash.sh:447
+#: git-stash.sh:448
 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:455
+#: git-stash.sh:456
 msgid "Conflicts in index. Try without --index."
 msgstr "Konflikte in der Staging-Area. Versuchen Sie es ohne --index."
 
-#: git-stash.sh:457
+#: git-stash.sh:458
 msgid "Could not save index tree"
 msgstr "Konnte Staging-Area-Verzeichnis nicht speichern"
 
-#: git-stash.sh:491
+#: git-stash.sh:492
 msgid "Cannot unstage modified files"
 msgstr "Kann geänderte Dateien nicht aus der Staging-Area entfernen"
 
-#: git-stash.sh:506
+#: git-stash.sh:507
 msgid "Index was not unstashed."
 msgstr "Staging-Area wurde nicht aus dem Stash zurückgeladen."
 
-#: git-stash.sh:529
+#: git-stash.sh:530
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Gelöscht ${REV} ($s)"
 
-#: git-stash.sh:530
+#: git-stash.sh:531
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Konnte \"stash\"-Eintrag nicht löschen"
 
-#: git-stash.sh:537
+#: git-stash.sh:538
 msgid "No branch name specified"
 msgstr "Kein Branchname spezifiziert"
 
-#: git-stash.sh:609
+#: git-stash.sh:610
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Zur Wiederherstellung geben Sie \"git stash apply\" ein)"
 
@@ -10707,28 +10855,28 @@
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
 msgstr "Klonen von '$url' in Submodul-Pfad '$sm_path' fehlgeschlagen"
 
-#: git-submodule.sh:299
+#: 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:409
+#: git-submodule.sh:406
 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:419
+#: git-submodule.sh:416
 #, 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:436
+#: git-submodule.sh:433
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' ist bereits zum Commit vorgemerkt"
 
-#: git-submodule.sh:440
+#: git-submodule.sh:437
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -10739,24 +10887,24 @@
 "$sm_path\n"
 "Benutzen Sie -f wenn Sie diesen wirklich hinzufügen möchten."
 
-#: git-submodule.sh:458
+#: git-submodule.sh:455
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Füge existierendes Repository in '$sm_path' der Staging-Area hinzu."
 
-#: git-submodule.sh:460
+#: git-submodule.sh:457
 #, 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:468
+#: git-submodule.sh:465
 #, 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:470
+#: git-submodule.sh:467
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
@@ -10764,7 +10912,7 @@
 "Wenn Sie dieses lokale Git-Verzeichnis wiederverwenden möchtest, anstatt "
 "erneut zu klonen"
 
-#: git-submodule.sh:472
+#: git-submodule.sh:469
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
@@ -10772,7 +10920,7 @@
 "benutzen Sie die Option '--force'. Wenn das lokale Git-Verzeichnis nicht das "
 "korrekte Repository ist"
 
-#: git-submodule.sh:473
+#: git-submodule.sh:470
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
@@ -10781,77 +10929,77 @@
 "oder Sie sich unsicher sind, was das bedeutet, wählen Sie einen anderen "
 "Namenmit der Option '--name'."
 
-#: git-submodule.sh:475
+#: git-submodule.sh:472
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Reaktiviere lokales Git-Verzeichnis für Submodul '$sm_name'."
 
-#: git-submodule.sh:487
+#: git-submodule.sh:484
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Kann Submodul '$sm_path' nicht auschecken"
 
-#: git-submodule.sh:492
+#: git-submodule.sh:489
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Hinzufügen von Submodul '$sm_path' fehlgeschlagen"
 
-#: git-submodule.sh:501
+#: git-submodule.sh:498
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Fehler beim Eintragen von Submodul '$sm_path' in die Konfiguration."
 
-#: git-submodule.sh:545
+#: git-submodule.sh:542
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "Betrete '$prefix$displaypath'"
 
-#: git-submodule.sh:565
+#: git-submodule.sh:562
 #, 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:611
+#: git-submodule.sh:608
 #, 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:620
+#: git-submodule.sh:617
 #, 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:622
+#: git-submodule.sh:619
 #, 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:639
+#: git-submodule.sh:636
 #, 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:677
+#: git-submodule.sh:674
 #, 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:694
+#: git-submodule.sh:691
 #, 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:695
+#: git-submodule.sh:692
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
@@ -10859,40 +11007,40 @@
 "(benutzen Sie 'rm -rf' wenn Sie dieses Submodul wirklich mitsamt\n"
 "seiner Historie löschen möchten)"
 
-#: git-submodule.sh:701
+#: git-submodule.sh:698
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
 "discard them"
 msgstr ""
 "Arbeitsverzeichnis von Submodul in '$displaypath' enthält lokale Änderungen; "
-"verwenden Sie '-f' um diese zu verwerfen"
+"verwenden Sie '-f', um diese zu verwerfen"
 
-#: git-submodule.sh:704
+#: git-submodule.sh:701
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Verzeichnis '$displaypath' bereinigt."
 
-#: git-submodule.sh:705
+#: git-submodule.sh:702
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
 "Konnte Arbeitsverzeichnis des Submoduls in '$displaypath' nicht löschen."
 
-#: git-submodule.sh:708
+#: git-submodule.sh:705
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr ""
 "Konnte kein leeres Verzeichnis für Submodul in '$displaypath' erstellen."
 
-#: git-submodule.sh:717
+#: git-submodule.sh:714
 #, 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:833
+#: git-submodule.sh:830
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
@@ -10901,52 +11049,52 @@
 "Submodul-Pfad '$displaypath' ist nicht initialisiert.\n"
 "Vielleicht möchten Sie 'update --init' benutzen?"
 
-#: git-submodule.sh:846
+#: git-submodule.sh:843
 #, 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:855
+#: git-submodule.sh:852
 #, 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:879
+#: git-submodule.sh:876
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Konnte \"fetch\" in Submodul-Pfad '$displaypath' nicht ausführen"
 
-#: git-submodule.sh:893
+#: git-submodule.sh:890
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "Konnte '$sha1' in Submodul-Pfad '$displaypath' nicht auschecken."
 
-#: git-submodule.sh:894
+#: git-submodule.sh:891
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Submodul-Pfad: '$displaypath': '$sha1' ausgecheckt"
 
-#: git-submodule.sh:898
+#: git-submodule.sh:895
 #, 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:899
+#: git-submodule.sh:896
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Submodul-Pfad '$displaypath': Rebase auf '$sha1'"
 
-#: git-submodule.sh:904
+#: git-submodule.sh:901
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "Merge von '$sha1' in Submodul-Pfad '$displaypath' fehlgeschlagen"
 
-#: git-submodule.sh:905
+#: git-submodule.sh:902
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Submodul-Pfad '$displaypath': zusammengeführt in '$sha1'"
 
-#: git-submodule.sh:910
+#: git-submodule.sh:907
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule  path '$prefix$sm_path'"
@@ -10954,56 +11102,62 @@
 "Ausführung von '$command $sha1' in Submodul-Pfad '$prefix$sm_path' "
 "fehlgeschlagen"
 
-#: git-submodule.sh:911
+#: git-submodule.sh:908
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr "Submodul-Pfad '$prefix$sm_path': '$command $sha1'"
 
-#: git-submodule.sh:941
+#: git-submodule.sh:938
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Fehler bei Rekursion in Submodul-Pfad '$displaypath'"
 
-#: git-submodule.sh:1049
+#: git-submodule.sh:1046
 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:1097
+#: git-submodule.sh:1098
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "unerwarteter Modus $mod_dst"
 
-#: git-submodule.sh:1117
+#: git-submodule.sh:1118
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Warnung: $display_name beinhaltet nicht Commit $sha1_src"
 
-#: git-submodule.sh:1120
+#: git-submodule.sh:1121
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Warnung: $display_name beinhaltet nicht Commit $sha1_dst"
 
-#: git-submodule.sh:1123
+#: git-submodule.sh:1124
 #, 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:1148
+#: git-submodule.sh:1149
 msgid "blob"
 msgstr "Blob"
 
-#: git-submodule.sh:1262
+#: git-submodule.sh:1267
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Fehler bei Rekursion in Submodul-Pfad '$sm_path'"
 
-#: git-submodule.sh:1326
+#: git-submodule.sh:1331
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Synchronisiere Submodul-URL für '$displaypath'"
 
+#~ msgid "commit has empty message"
+#~ msgstr "Commit hat eine leere Beschreibung"
+
+#~ msgid "Failed to chdir: %s"
+#~ msgstr "Fehler beim Verzeichniswechsel: %s"
+
 #~ msgid "key id"
 #~ msgstr "Schlüssel-ID"
 
diff --git a/po/fr.po b/po/fr.po
index 6b32da0..6652be8 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: 2014-04-19 12:50+0800\n"
-"PO-Revision-Date: 2014-04-22 21:28+0200\n"
+"POT-Creation-Date: 2014-11-01 07:46+0800\n"
+"PO-Revision-Date: 2014-11-01 16:51+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"
@@ -88,111 +88,108 @@
 msgid "hint: %.*s\n"
 msgstr "astuce: %.*s\n"
 
-#: advice.c:85
+#: advice.c:88
 msgid ""
-"Fix them up in the work tree,\n"
-"and then use 'git add/rm <file>' as\n"
-"appropriate to mark resolution and make a commit,\n"
-"or use 'git commit -a'."
+"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 ""
 "Corrigez-les dans la copie de travail,\n"
-"et utilisez 'git add/rm <fichier>' si\n"
-"nécessaire pour marquer la résolution et valider,\n"
-"ou utilisez 'git commit -a'."
+"puis utilisez 'git add/rm <fichier>' si\n"
+"nécessaire pour marquer la résolution et valider."
 
-#: archive.c:10
+#: archive.c:11
 msgid "git archive [options] <tree-ish> [<path>...]"
 msgstr "git archive [options] <arbre ou apparenté> [<chemin>...]"
 
-#: archive.c:11
+#: archive.c:12
 msgid "git archive --list"
 msgstr "git archive --list"
 
-#: archive.c:12
+#: archive.c:13
 msgid ""
 "git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]"
 msgstr ""
 "git archive --remote <dépôt> [--exec <commande>] [options] <arbre ou "
 "apparenté> [<chemin>...]"
 
-#: archive.c:13
+#: archive.c:14
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <dépôt> [--exec <commande>] --list"
 
-#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
+#: archive.c:334 builtin/add.c:137 builtin/add.c:427 builtin/rm.c:328
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "le chemin '%s' ne correspond à aucun fichier"
 
-#: archive.c:328
+#: archive.c:419
 msgid "fmt"
 msgstr "fmt"
 
-#: archive.c:328
+#: archive.c:419
 msgid "archive format"
 msgstr "format d'archive"
 
-#: archive.c:329 builtin/log.c:1193
+#: archive.c:420 builtin/log.c:1204
 msgid "prefix"
 msgstr "préfixe"
 
-#: archive.c:330
+#: archive.c:421
 msgid "prepend prefix to each pathname in the archive"
 msgstr "préfixer chaque chemin de fichier dans l'archive"
 
-#: archive.c:331 builtin/archive.c:88 builtin/blame.c:2258
-#: builtin/blame.c:2259 builtin/config.c:57 builtin/fast-export.c:680
-#: builtin/fast-export.c:682 builtin/grep.c:714 builtin/hash-object.c:77
-#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:412
-#: builtin/notes.c:569 builtin/read-tree.c:108 parse-options.h:151
+#: archive.c:422 builtin/archive.c:88 builtin/blame.c:2517
+#: builtin/blame.c:2518 builtin/config.c:57 builtin/fast-export.c:986
+#: builtin/fast-export.c:988 builtin/grep.c:712 builtin/hash-object.c:101
+#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:411
+#: builtin/notes.c:568 builtin/read-tree.c:109 parse-options.h:151
 msgid "file"
 msgstr "fichier"
 
-#: archive.c:332 builtin/archive.c:89
+#: archive.c:423 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr "écrire l'archive dans ce fichier"
 
-#: archive.c:334
+#: archive.c:425
 msgid "read .gitattributes in working directory"
 msgstr "lire .gitattributes dans le répertoire de travail"
 
-#: archive.c:335
+#: archive.c:426
 msgid "report archived files on stderr"
 msgstr "afficher les fichiers archivés sur stderr"
 
-#: archive.c:336
+#: archive.c:427
 msgid "store only"
 msgstr "stockage seulement"
 
-#: archive.c:337
+#: archive.c:428
 msgid "compress faster"
 msgstr "compression rapide"
 
-#: archive.c:345
+#: archive.c:436
 msgid "compress better"
 msgstr "compression efficace"
 
-#: archive.c:348
+#: archive.c:439
 msgid "list supported archive formats"
 msgstr "afficher les formats d'archive supportés"
 
-#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:441 builtin/archive.c:90 builtin/clone.c:85
 msgid "repo"
 msgstr "dépôt"
 
-#: archive.c:351 builtin/archive.c:91
+#: archive.c:442 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:352 builtin/archive.c:92 builtin/notes.c:491
+#: archive.c:443 builtin/archive.c:92 builtin/notes.c:490
 msgid "command"
 msgstr "commande"
 
-#: archive.c:353 builtin/archive.c:93
+#: archive.c:444 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr "chemin vers la commande distante git-upload-archive"
 
-#: attr.c:259
+#: attr.c:258
 msgid ""
 "Negative patterns are ignored in git attributes\n"
 "Use '\\!' for literal leading exclamation."
@@ -257,33 +254,33 @@
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr "Pas de suivi : information ambiguë pour la référence %s"
 
-#: branch.c:178
+#: branch.c:162
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "'%s' n'est pas un nom de branche valide."
 
-#: branch.c:183
+#: branch.c:167
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "Une branche nommée '%s' existe déjà."
 
-#: branch.c:191
+#: branch.c:175
 msgid "Cannot force update the current branch."
 msgstr "Impossible de forcer la mise à jour de la branche courante."
 
-#: branch.c:211
+#: branch.c:195
 #, 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:213
+#: branch.c:197
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "la branche amont demandée '%s' n'existe pas"
 
-#: branch.c:215
+#: branch.c:199
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -303,113 +300,111 @@
 "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:260
+#: branch.c:243
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "Nom d'objet invalide : '%s'."
 
-#: branch.c:280
+#: branch.c:263
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "Nom d'objet ambigu : '%s'."
 
-#: branch.c:285
+#: branch.c:268
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "Point d'embranchement invalide : '%s'."
 
-#: branch.c:291
-msgid "Failed to lock ref for update"
-msgstr "Échec du verrouillage de la référence pour mise à jour"
-
-#: branch.c:309
-msgid "Failed to write ref"
-msgstr "Échec de l'écriture de la référence"
-
-#: bundle.c:33
+#: bundle.c:34
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
 msgstr "'%s' ne semble pas être un fichier bundle v2"
 
-#: bundle.c:60
+#: bundle.c:61
 #, c-format
 msgid "unrecognized header: %s%s (%d)"
 msgstr "en-tête non reconnu : %s%s (%d)"
 
-#: bundle.c:86 builtin/commit.c:706
+#: bundle.c:87 builtin/commit.c:788
 #, c-format
 msgid "could not open '%s'"
 msgstr "impossible d'ouvrir '%s'"
 
-#: bundle.c:138
+#: bundle.c:139
 msgid "Repository lacks these prerequisite commits:"
 msgstr "Le dépôt ne dispose pas des commits prérequis suivants :"
 
-#: bundle.c:162 sequencer.c:669 sequencer.c:1123 builtin/log.c:332
-#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357
+#: bundle.c:163 sequencer.c:641 sequencer.c:1096 builtin/blame.c:2706
+#: builtin/branch.c:652 builtin/commit.c:1085 builtin/log.c:330
+#: builtin/log.c:823 builtin/log.c:1432 builtin/log.c:1669 builtin/merge.c:357
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "échec de la préparation du parcours des révisions"
 
-#: bundle.c:184
+#: bundle.c:185
 #, c-format
 msgid "The bundle contains this ref:"
 msgid_plural "The bundle contains these %d refs:"
 msgstr[0] "Le colis contient cette référence :"
 msgstr[1] "Le colis contient ces %d références :"
 
-#: bundle.c:191
+#: bundle.c:192
 msgid "The bundle records a complete history."
 msgstr "Le colis enregistre l'historique complet."
 
-#: bundle.c:193
+#: bundle.c:194
 #, c-format
 msgid "The bundle requires this ref:"
 msgid_plural "The bundle requires these %d refs:"
 msgstr[0] "Le colis exige cette référence :"
 msgstr[1] "Le colis exige ces %d références :"
 
-#: bundle.c:293
+#: bundle.c:292
 msgid "rev-list died"
 msgstr "rev-list a disparu"
 
-#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:298 builtin/log.c:153 builtin/log.c:1342 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "argument non reconnu : %s"
 
-#: bundle.c:334
+#: bundle.c:333
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "la référence '%s' est exclue par les options de rev-list"
 
-#: bundle.c:379
+#: bundle.c:378
 msgid "Refusing to create empty bundle."
 msgstr "Refus de créer un colis vide."
 
-#: bundle.c:395
+#: bundle.c:393
 msgid "Could not spawn pack-objects"
 msgstr "Impossible de créer des objets groupés"
 
-#: bundle.c:413
+#: bundle.c:411
 msgid "pack-objects died"
 msgstr "les objets groupés ont disparu"
 
-#: bundle.c:416
+#: bundle.c:414
 #, c-format
 msgid "cannot create '%s'"
 msgstr "impossible de créer '%s'"
 
-#: bundle.c:438
+#: bundle.c:435
 msgid "index-pack died"
 msgstr "l'index de groupe a disparu"
 
-#: commit.c:54
+#: color.c:157
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr "Valeur invalide de couleur : %.*s"
+
+#: commit.c:40
 #, c-format
 msgid "could not parse %s"
 msgstr "impossible d'analyser %s"
 
-#: commit.c:56
+#: commit.c:42
 #, c-format
 msgid "%s %s is not a commit!"
 msgstr "%s %s n'est pas un commit !"
@@ -418,16 +413,69 @@
 msgid "memory exhausted"
 msgstr "plus de mémoire"
 
-#: connected.c:70
+#: config.c:469 config.c:471
+#, c-format
+msgid "bad config file line %d in %s"
+msgstr "ligne %d de fichier de config incorrecte dans %s"
+
+#: config.c:587
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "valeur numérique de configuration incorrecte '%s' pour '%s' dans %s : %s"
+
+#: config.c:589
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "valeur numérique de configuration invalide '%s' pour '%s' : %s"
+
+#: config.c:674
+#, c-format
+msgid "failed to expand user dir in: '%s'"
+msgstr "impossible d'étendre le répertoire utilisateur dans : '%s'"
+
+#: config.c:752 config.c:763
+#, c-format
+msgid "bad zlib compression level %d"
+msgstr "niveau de compression zlib incorrect %d"
+
+#: config.c:885
+#, c-format
+msgid "invalid mode for object creation: %s"
+msgstr "mode invalide pour la création d'objet : %s"
+
+#: config.c:1201
+msgid "unable to parse command-line config"
+msgstr "lecture de la configuration de ligne de commande impossible"
+
+#: config.c:1262
+msgid "unknown error occured while reading the configuration files"
+msgstr "erreur inconnue pendant la lecture des fichiers de configuration"
+
+#: config.c:1586
+#, c-format
+msgid "unable to parse '%s' from command-line config"
+msgstr "impossible d'analyser '%s' depuis le configuration en ligne de commande"
+
+#: config.c:1588
+#, c-format
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "variable de configuration '%s' incorrecte dans le fichier '%s' à la ligne %d"
+
+#: config.c:1647
+#, c-format
+msgid "%s has multiple values"
+msgstr "%s a des valeurs multiples"
+
+#: connected.c:69
 msgid "Could not run 'git rev-list'"
 msgstr "Impossible de lancer 'git rev-list'"
 
-#: connected.c:90
+#: connected.c:89
 #, c-format
 msgid "failed write to rev-list: %s"
 msgstr "impossible d'écrire dans la rev-list : %s"
 
-#: connected.c:98
+#: connected.c:97
 #, c-format
 msgid "failed to close rev-list's stdin: %s"
 msgstr "impossible de fermer l'entrée standard du rev-list : %s"
@@ -505,28 +553,28 @@
 msgid "failed to read orderfile '%s'"
 msgstr "impossible de lire le fichier de commande '%s'"
 
-#: diffcore-rename.c:517
+#: diffcore-rename.c:516
 msgid "Performing inexact rename detection"
 msgstr "Détection de renommage inexact en cours"
 
-#: diff.c:113
+#: diff.c:114
 #, 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:118
+#: diff.c:119
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Paramètre dirstat inconnu '%s'\n"
 
-#: diff.c:213
+#: diff.c:214
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr ""
 "Valeur inconnue pour la variable de configuration 'diff.submodule' : '%s'"
 
-#: diff.c:263
+#: diff.c:266
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -535,7 +583,16 @@
 "Erreurs dans la variable de configuration 'diff.dirstat' :\n"
 "%s"
 
-#: diff.c:3495
+#: diff.c:2957
+#, c-format
+msgid "external diff died, stopping at %s"
+msgstr "l'application de diff externe a disparu, arrêt à %s"
+
+#: diff.c:3352
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow a besoin d'une spécification de chemin unique"
+
+#: diff.c:3515
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -544,58 +601,58 @@
 "Impossible d'analyser le paramètre de l'option --dirstat/-X :\n"
 "%s"
 
-#: diff.c:3509
+#: diff.c:3529
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Impossible d'analyser le paramètre de l'option --submodule : '%s'"
 
-#: gpg-interface.c:59 gpg-interface.c:131
+#: gpg-interface.c:129 gpg-interface.c:200
 msgid "could not run gpg."
 msgstr "impossible de lancer gpg."
 
-#: gpg-interface.c:71
+#: gpg-interface.c:141
 msgid "gpg did not accept the data"
 msgstr "gpg n'a pas accepté les données"
 
-#: gpg-interface.c:82
+#: gpg-interface.c:152
 msgid "gpg failed to sign the data"
 msgstr "gpg n'a pas pu signer les données"
 
-#: gpg-interface.c:115
+#: gpg-interface.c:185
 #, c-format
 msgid "could not create temporary file '%s': %s"
 msgstr "impossible de créer un fichier temporaire '%s' : %s"
 
-#: gpg-interface.c:118
+#: gpg-interface.c:188
 #, c-format
 msgid "failed writing detached signature to '%s': %s"
 msgstr "impossible d'écrire la signature détachée dans '%s' : %s"
 
-#: grep.c:1698
+#: grep.c:1718
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "'%s' : lecture de %s impossible"
 
-#: grep.c:1715
+#: grep.c:1735
 #, c-format
 msgid "'%s': %s"
 msgstr "'%s' : %s"
 
-#: grep.c:1726
+#: grep.c:1746
 #, c-format
 msgid "'%s': short read %s"
 msgstr "'%s' : lecture tronquée %s"
 
-#: help.c:209
+#: help.c:207
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "commandes git disponibles dans '%s'"
 
-#: help.c:216
+#: help.c:214
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "commandes git disponibles depuis un autre endroit de votre $PATH"
 
-#: help.c:232
+#: help.c:230
 msgid "The most commonly used git commands are:"
 msgstr "Les commandes git les plus utilisées sont :"
 
@@ -632,7 +689,7 @@
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git : '%s' n'est pas une commande git. Voir 'git --help'."
 
-#: help.c:384 help.c:443
+#: help.c:384 help.c:444
 msgid ""
 "\n"
 "Did you mean this?"
@@ -646,92 +703,100 @@
 "\n"
 "Vouliez-vous dire un de ceux-là ?"
 
-#: help.c:439
+#: help.c:440
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %s - %s"
 
-#: merge.c:56
+#: lockfile.c:275
+msgid "BUG: reopen a lockfile that is still open"
+msgstr "BUG: réouverture d'un fichier verrou déjà ouvert"
+
+#: lockfile.c:277
+msgid "BUG: reopen a lockfile that has been committed"
+msgstr "BUG: réouverture d'un fichier verrou validé"
+
+#: merge.c:41
 msgid "failed to read the cache"
 msgstr "impossible de lire le cache"
 
-#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
-#: builtin/clone.c:661
+#: merge.c:94 builtin/checkout.c:356 builtin/checkout.c:562
+#: builtin/clone.c:659
 msgid "unable to write new index file"
 msgstr "impossible d'écrire le nouveau fichier d'index"
 
-#: merge-recursive.c:190
+#: merge-recursive.c:189
 #, c-format
 msgid "(bad commit)\n"
 msgstr "(mauvais commit)\n"
 
-#: merge-recursive.c:208
+#: merge-recursive.c:209
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "échec de addinfo_cache pour le chemin '%s'"
 
-#: merge-recursive.c:271
+#: merge-recursive.c:270
 msgid "error building trees"
 msgstr "erreur de construction des arbres"
 
-#: merge-recursive.c:675
+#: merge-recursive.c:691
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "impossible de créer le chemin '%s' %s"
 
-#: merge-recursive.c:686
+#: merge-recursive.c:702
 #, 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:700 merge-recursive.c:721
+#: merge-recursive.c:716 merge-recursive.c:737
 msgid ": perhaps a D/F conflict?"
 msgstr ": peut-être un conflit D/F ?"
 
-#: merge-recursive.c:711
+#: merge-recursive.c:727
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "refus de perdre le fichier non suivi '%s'"
 
-#: merge-recursive.c:751
+#: merge-recursive.c:767
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "impossible de lire l'objet %s '%s'"
 
-#: merge-recursive.c:753
+#: merge-recursive.c:769
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "blob attendu pour %s '%s'"
 
-#: merge-recursive.c:776 builtin/clone.c:317
+#: merge-recursive.c:792 builtin/clone.c:318
 #, c-format
 msgid "failed to open '%s'"
 msgstr "échec à l'ouverture de '%s'"
 
-#: merge-recursive.c:784
+#: merge-recursive.c:800
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "échec à la création du lien symbolique '%s'"
 
-#: merge-recursive.c:787
+#: merge-recursive.c:803
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "ne sait pas traiter %06o %s '%s'"
 
-#: merge-recursive.c:925
+#: merge-recursive.c:941
 msgid "Failed to execute internal merge"
 msgstr "Échec à l'exécution de la fusion interne"
 
-#: merge-recursive.c:929
+#: merge-recursive.c:945
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Impossible d'ajouter %s à la base de données"
 
-#: merge-recursive.c:945
+#: merge-recursive.c:961
 msgid "unsupported object type in the tree"
 msgstr "type d'objet non supporté dans l'arbre"
 
-#: merge-recursive.c:1024 merge-recursive.c:1038
+#: merge-recursive.c:1036 merge-recursive.c:1050
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -740,7 +805,7 @@
 "CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans %s. Version %s de "
 "%s laissée dans l'arbre."
 
-#: merge-recursive.c:1030 merge-recursive.c:1043
+#: merge-recursive.c:1042 merge-recursive.c:1055
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -749,20 +814,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:1084
+#: merge-recursive.c:1096
 msgid "rename"
 msgstr "renommage"
 
-#: merge-recursive.c:1084
+#: merge-recursive.c:1096
 msgid "renamed"
 msgstr "renommé"
 
-#: merge-recursive.c:1140
+#: merge-recursive.c:1152
 #, 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:1162
+#: merge-recursive.c:1174
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -771,197 +836,197 @@
 "CONFLIT (renommage/renommage) : Renommage de \"%s\"->\"%s\" dans la branche "
 "\"%s\" et renommage \"%s\"->\"%s\" dans \"%s\"%s"
 
-#: merge-recursive.c:1167
+#: merge-recursive.c:1179
 msgid " (left unresolved)"
 msgstr " (laissé non résolu)"
 
-#: merge-recursive.c:1221
+#: merge-recursive.c:1233
 #, 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:1251
+#: merge-recursive.c:1263
 #, 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:1450
+#: merge-recursive.c:1462
 #, 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:1460
+#: merge-recursive.c:1472
 #, c-format
 msgid "Adding merged %s"
 msgstr "Ajout de %s fusionné"
 
-#: merge-recursive.c:1465 merge-recursive.c:1663
+#: merge-recursive.c:1477 merge-recursive.c:1675
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Ajout plutôt comme %s"
 
-#: merge-recursive.c:1516
+#: merge-recursive.c:1528
 #, c-format
 msgid "cannot read object %s"
 msgstr "impossible de lire l'objet %s"
 
-#: merge-recursive.c:1519
+#: merge-recursive.c:1531
 #, c-format
 msgid "object %s is not a blob"
 msgstr "l'objet %s n'est pas un blob"
 
-#: merge-recursive.c:1567
+#: merge-recursive.c:1579
 msgid "modify"
 msgstr "modification"
 
-#: merge-recursive.c:1567
+#: merge-recursive.c:1579
 msgid "modified"
 msgstr "modifié"
 
-#: merge-recursive.c:1577
+#: merge-recursive.c:1589
 msgid "content"
 msgstr "contenu"
 
-#: merge-recursive.c:1584
+#: merge-recursive.c:1596
 msgid "add/add"
 msgstr "ajout/ajout"
 
-#: merge-recursive.c:1618
+#: merge-recursive.c:1630
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "%s sauté (fusion identique à l'existant)"
 
-#: merge-recursive.c:1632
+#: merge-recursive.c:1644
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Fusion automatique de %s"
 
-#: merge-recursive.c:1636 git-submodule.sh:1149
+#: merge-recursive.c:1648 git-submodule.sh:1150
 msgid "submodule"
 msgstr "sous-module"
 
-#: merge-recursive.c:1637
+#: merge-recursive.c:1649
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "CONFLIT (%s) : Conflit de fusion dans %s"
 
-#: merge-recursive.c:1727
+#: merge-recursive.c:1735
 #, c-format
 msgid "Removing %s"
 msgstr "Suppression de %s"
 
-#: merge-recursive.c:1752
+#: merge-recursive.c:1760
 msgid "file/directory"
 msgstr "fichier/répertoire"
 
-#: merge-recursive.c:1758
+#: merge-recursive.c:1766
 msgid "directory/file"
 msgstr "répertoire/fichier"
 
-#: merge-recursive.c:1763
+#: merge-recursive.c:1771
 #, 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:1773
+#: merge-recursive.c:1781
 #, c-format
 msgid "Adding %s"
 msgstr "Ajout de %s"
 
-#: merge-recursive.c:1790
+#: merge-recursive.c:1798
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Échec fatal de fusion, qui ne devrait jamais arriver."
 
-#: merge-recursive.c:1809
+#: merge-recursive.c:1817
 msgid "Already up-to-date!"
 msgstr "Déjà à jour !"
 
-#: merge-recursive.c:1818
+#: merge-recursive.c:1826
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "échec de fusion des arbres %s et %s"
 
-#: merge-recursive.c:1848
+#: merge-recursive.c:1856
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "Chemin non traité ??? %s"
 
-#: merge-recursive.c:1893
+#: merge-recursive.c:1901
 msgid "Merging:"
 msgstr "Fusion :"
 
-#: merge-recursive.c:1906
+#: merge-recursive.c:1914
 #, 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:1943
+#: merge-recursive.c:1951
 msgid "merge returned no commit"
 msgstr "la fusion n'a pas retourné de commit"
 
-#: merge-recursive.c:2000
+#: merge-recursive.c:2008
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Impossible d'analyser l'objet '%s'"
 
-#: merge-recursive.c:2012 builtin/merge.c:668
+#: merge-recursive.c:2019 builtin/merge.c:666
 msgid "Unable to write index."
 msgstr "Impossible d'écrire l'index."
 
-#: notes-utils.c:40
+#: notes-utils.c:41
 msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr "Impossible de valider un arbre de notes non initialisé/référencé"
 
-#: notes-utils.c:81
+#: notes-utils.c:83
 #, c-format
 msgid "Bad notes.rewriteMode value: '%s'"
 msgstr "Mauvaise valeur de notes.rewriteMode : '%s'"
 
-#: notes-utils.c:91
+#: notes-utils.c:93
 #, c-format
 msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
 msgstr "Refus de réécrire des notes dans %s (hors de refs/notes/)"
 
 #. TRANSLATORS: The first %s is the name of the
 #. environment variable, the second %s is its value
-#: notes-utils.c:118
+#: notes-utils.c:120
 #, c-format
 msgid "Bad %s value: '%s'"
 msgstr "Mauvaise valeur de %s : '%s'"
 
-#: object.c:229
+#: object.c:241
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "impossible d'analyser l'objet : %s"
 
-#: parse-options.c:532
+#: parse-options.c:546
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:550
+#: parse-options.c:564
 #, c-format
 msgid "usage: %s"
 msgstr "usage : %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:554
+#: parse-options.c:568
 #, c-format
 msgid "   or: %s"
 msgstr "   ou : %s"
 
-#: parse-options.c:557
+#: parse-options.c:571
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:591
+#: parse-options.c:605
 msgid "-NUM"
 msgstr "-NUM"
 
@@ -1020,12 +1085,12 @@
 "%s : le spécificateur magique de chemin n'est pas supporté par cette "
 "commande : %s"
 
-#: pathspec.c:433
+#: pathspec.c:432
 #, c-format
 msgid "pathspec '%s' is beyond a symbolic link"
 msgstr "le chemin '%s' est au-delà d'un lien symbolique"
 
-#: pathspec.c:442
+#: pathspec.c:441
 msgid ""
 "There is nothing to exclude from by :(exclude) patterns.\n"
 "Perhaps you forgot to add either ':/' or '.' ?"
@@ -1033,11 +1098,15 @@
 "Il n'y a rien dont il faut exclure par des motifs :(exclure).\n"
 "Peut-être avez-vous oublié d'ajouter ':/' ou '.' ?"
 
-#: progress.c:224
+#: pretty.c:968
+msgid "unable to parse --pretty format"
+msgstr "impossible d'analyser le format --pretty"
+
+#: progress.c:225
 msgid "done"
 msgstr "fait"
 
-#: read-cache.c:1238
+#: read-cache.c:1261
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -1046,7 +1115,7 @@
 "version d'index renseignée, mais la valeur est invalide.\n"
 "Utilisation de la version %i"
 
-#: read-cache.c:1248
+#: read-cache.c:1271
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -1055,51 +1124,51 @@
 "GIT_INDEX_VERSION est renseigné, mais la valeur est invalide.\n"
 "Utilisation de la version %i"
 
-#: remote.c:758
+#: remote.c:782
 #, 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:762
+#: remote.c:786
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s suit habituellement %s, pas %s"
 
-#: remote.c:766
+#: remote.c:790
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s suit à la fois %s et %s"
 
-#: remote.c:774
+#: remote.c:798
 msgid "Internal error"
 msgstr "Erreur interne"
 
-#: remote.c:1948
+#: remote.c:1968
 #, 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:1952
+#: remote.c:1972
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (utilisez \"git branch --unset-upstream\" pour corriger)\n"
 
-#: remote.c:1955
+#: remote.c:1975
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "Votre branche est à jour avec '%s'.\n"
 
-#: remote.c:1959
+#: remote.c:1979
 #, 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:1965
+#: remote.c:1985
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (utilisez \"git push\" pour publier vos commits locaux)\n"
 
-#: remote.c:1968
+#: remote.c:1988
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1111,11 +1180,11 @@
 "Votre branche est en retard sur '%s' de %d commits, et peut être mise à jour "
 "en avance rapide.\n"
 
-#: remote.c:1976
+#: remote.c:1996
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (utilisez \"git pull\" pour mettre à jour votre branche locale)\n"
 
-#: remote.c:1979
+#: remote.c:1999
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1130,33 +1199,41 @@
 "Votre branche et '%s' ont divergé,\n"
 "et ont %d et %d commits différents chacune respectivement.\n"
 
-#: remote.c:1989
+#: remote.c:2009
 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"
 
-#: run-command.c:80
+#: run-command.c:87
 msgid "open /dev/null failed"
 msgstr "échec de l'ouverture de /dev/null"
 
-#: run-command.c:82
+#: run-command.c:89
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "échec de dup2(%d,%d)"
 
-#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
-#: builtin/merge.c:1009 builtin/merge.c:1019
+#: send-pack.c:265
+msgid "failed to sign the push certificate"
+msgstr "impossible de signer le certificat de poussée"
+
+#: send-pack.c:322
+msgid "the receiving end does not support --signed push"
+msgstr "Le receveur ne gère pas les poussées avec --signed"
+
+#: sequencer.c:172 builtin/merge.c:781 builtin/merge.c:892
+#: builtin/merge.c:1002 builtin/merge.c:1012
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "Impossible d'ouvrir '%s' en écriture"
 
-#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
-#: builtin/merge.c:1011 builtin/merge.c:1024
+#: sequencer.c:174 builtin/merge.c:343 builtin/merge.c:784
+#: builtin/merge.c:1004 builtin/merge.c:1017
 #, c-format
 msgid "Could not write to '%s'"
 msgstr "Impossible d'écrire dans '%s'"
 
-#: sequencer.c:229
+#: sequencer.c:195
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'"
@@ -1164,7 +1241,7 @@
 "après résolution des conflits, marquez les chemins corrigés\n"
 "avec 'git add <chemins>' ou 'git rm <chemins>'"
 
-#: sequencer.c:232
+#: sequencer.c:198
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'\n"
@@ -1174,67 +1251,67 @@
 "avec 'git add <chemins>' ou 'git rm <chemins>'\n"
 "puis validez le résultat avec 'git commit'"
 
-#: sequencer.c:245 sequencer.c:879 sequencer.c:962
+#: sequencer.c:211 sequencer.c:852 sequencer.c:935
 #, c-format
 msgid "Could not write to %s"
 msgstr "Impossible d'écrire dans %s"
 
-#: sequencer.c:248
+#: sequencer.c:214
 #, c-format
 msgid "Error wrapping up %s"
 msgstr "Erreur à l'emballage de %s"
 
-#: sequencer.c:263
+#: sequencer.c:229
 msgid "Your local changes would be overwritten by cherry-pick."
 msgstr "Vos modifications locales seraient écrasées par cherry-pick."
 
-#: sequencer.c:265
+#: sequencer.c:231
 msgid "Your local changes would be overwritten by revert."
 msgstr "Vos modifications locales seraient écrasées par revert."
 
-#: sequencer.c:268
+#: sequencer.c:234
 msgid "Commit your changes or stash them to proceed."
 msgstr "Validez vos modifications ou les remiser pour continuer."
 
 #. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:325
+#: sequencer.c:304
 #, c-format
 msgid "%s: Unable to write new index file"
 msgstr "%s: Impossible d'écrire le nouveau fichier index"
 
-#: sequencer.c:356
+#: sequencer.c:335
 msgid "Could not resolve HEAD commit\n"
 msgstr "Impossible de résoudre le commit HEAD\n"
 
-#: sequencer.c:378
+#: sequencer.c:355
 msgid "Unable to update cache tree\n"
 msgstr "Impossible de mettre à jour l'arbre de cache\n"
 
-#: sequencer.c:430
+#: sequencer.c:402
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr "Impossible d'analyser le commit %s\n"
 
-#: sequencer.c:435
+#: sequencer.c:407
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr "Impossible d'analyser le commit parent %s\n"
 
-#: sequencer.c:501
+#: sequencer.c:473
 msgid "Your index file is unmerged."
 msgstr "Votre fichier d'index n'est pas fusionné."
 
-#: sequencer.c:520
+#: sequencer.c:492
 #, c-format
 msgid "Commit %s is a merge but no -m option was given."
 msgstr "Le commit %s est une fusion mais l'option -m n'a pas été spécifiée."
 
-#: sequencer.c:528
+#: sequencer.c:500
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr "Le commit %s n'a pas le parent %d"
 
-#: sequencer.c:532
+#: sequencer.c:504
 #, c-format
 msgid "Mainline was specified but commit %s is not a merge."
 msgstr ""
@@ -1243,157 +1320,157 @@
 
 #. TRANSLATORS: The first %s will be "revert" or
 #. "cherry-pick", the second %s a SHA1
-#: sequencer.c:545
+#: sequencer.c:517
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s : impossible d'analyser le commit parent %s"
 
-#: sequencer.c:549
+#: sequencer.c:521
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr "Impossible d'obtenir un message de validation pour %s"
 
-#: sequencer.c:635
+#: sequencer.c:607
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "impossible d'annuler %s... %s"
 
-#: sequencer.c:636
+#: sequencer.c:608
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "impossible d'appliquer %s... %s"
 
-#: sequencer.c:672
+#: sequencer.c:644
 msgid "empty commit set passed"
 msgstr "l'ensemble de commits spécifié est vide"
 
-#: sequencer.c:680
+#: sequencer.c:652
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s : échec à la lecture de l'index"
 
-#: sequencer.c:685
+#: sequencer.c:656
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s : échec du rafraîchissement de l'index"
 
-#: sequencer.c:743
+#: sequencer.c:716
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr "Impossible de %s pendant un %s"
 
-#: sequencer.c:765
+#: sequencer.c:738
 #, c-format
 msgid "Could not parse line %d."
 msgstr "Impossible d'analyser la ligne %d."
 
-#: sequencer.c:770
+#: sequencer.c:743
 msgid "No commits parsed."
 msgstr "Aucun commit analysé."
 
-#: sequencer.c:783
+#: sequencer.c:756
 #, c-format
 msgid "Could not open %s"
 msgstr "Impossible d'ouvrir %s"
 
-#: sequencer.c:787
+#: sequencer.c:760
 #, c-format
 msgid "Could not read %s."
 msgstr "Impossible de lire %s."
 
-#: sequencer.c:794
+#: sequencer.c:767
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr "Feuille d'instruction inutilisable : %s"
 
-#: sequencer.c:824
+#: sequencer.c:797
 #, c-format
 msgid "Invalid key: %s"
 msgstr "Clé invalide: %s"
 
-#: sequencer.c:827
+#: sequencer.c:800
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr "Valeur invalide pour %s : %s"
 
-#: sequencer.c:839
+#: sequencer.c:812
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr "Feuille d'options malformée : %s"
 
-#: sequencer.c:860
+#: sequencer.c:833
 msgid "a cherry-pick or revert is already in progress"
 msgstr "un picorage ou un retour est déjà en cours"
 
-#: sequencer.c:861
+#: sequencer.c:834
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr "essayez \"git cherry-pick (--continue|--quit|-- abort)\""
 
-#: sequencer.c:865
+#: sequencer.c:838
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr "Impossible de créer le répertoire de séquenceur %s"
 
-#: sequencer.c:881 sequencer.c:966
+#: sequencer.c:854 sequencer.c:939
 #, c-format
 msgid "Error wrapping up %s."
 msgstr "Erreur lors de l'emballage de %s."
 
-#: sequencer.c:900 sequencer.c:1036
+#: sequencer.c:873 sequencer.c:1009
 msgid "no cherry-pick or revert in progress"
 msgstr "aucun picorage ou retour en cours"
 
-#: sequencer.c:902
+#: sequencer.c:875
 msgid "cannot resolve HEAD"
 msgstr "impossible de résoudre HEAD"
 
-#: sequencer.c:904
+#: sequencer.c:877
 msgid "cannot abort from a branch yet to be born"
 msgstr "impossible d'abandonner depuis une branche non encore créée"
 
-#: sequencer.c:926 builtin/apply.c:4061
+#: sequencer.c:899 builtin/apply.c:4128
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "impossible d'ouvrir %s : %s"
 
-#: sequencer.c:929
+#: sequencer.c:902
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "impossible de lire %s : %s"
 
-#: sequencer.c:930
+#: sequencer.c:903
 msgid "unexpected end of file"
 msgstr "fin de fichier inattendue"
 
-#: sequencer.c:936
+#: sequencer.c:909
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr "le fichier HEAD de préparation de picorage '%s' est corrompu"
 
-#: sequencer.c:959
+#: sequencer.c:932
 #, c-format
 msgid "Could not format %s."
 msgstr "Impossible de formater %s."
 
-#: sequencer.c:1104
+#: sequencer.c:1077
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr "%s : impossible de picorer un %s"
 
-#: sequencer.c:1107
+#: sequencer.c:1080
 #, c-format
 msgid "%s: bad revision"
 msgstr "%s : mauvaise révision"
 
-#: sequencer.c:1141
+#: sequencer.c:1114
 msgid "Can't revert as initial commit"
 msgstr "Impossible d'annuler en tant que commit initial"
 
-#: sequencer.c:1142
+#: sequencer.c:1115
 msgid "Can't cherry-pick into empty head"
 msgstr "Impossible de picorer vers une HEAD vide"
 
-#: sha1_name.c:439
+#: sha1_name.c:440
 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"
@@ -1418,21 +1495,21 @@
 "message\n"
 "en lançant \"git config advice.objectNameWarning false\""
 
-#: sha1_name.c:1072
+#: sha1_name.c:1068
 msgid "HEAD does not point to a branch"
 msgstr "HEAD ne pointe pas sur une branche"
 
-#: sha1_name.c:1075
+#: sha1_name.c:1071
 #, c-format
 msgid "No such branch: '%s'"
 msgstr "Branche inconnue : '%s'"
 
-#: sha1_name.c:1077
+#: sha1_name.c:1073
 #, c-format
 msgid "No upstream configured for branch '%s'"
 msgstr "Aucune branche amont configurée pour la branche '%s'"
 
-#: sha1_name.c:1081
+#: sha1_name.c:1077
 #, 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"
@@ -1463,17 +1540,42 @@
 msgid "staging updated .gitmodules failed"
 msgstr "échec de la mise en index du .gitmodules mis à jour"
 
-#: submodule.c:1121 builtin/init-db.c:363
+#: submodule.c:1111 builtin/init-db.c:363
 #, c-format
 msgid "Could not create git link %s"
 msgstr "Impossible de créer le lien git %s"
 
-#: submodule.c:1132
+#: submodule.c:1122
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "Impossible de paramétrer core.worktree dans %s"
 
-#: unpack-trees.c:206
+#: trailer.c:500 trailer.c:504 trailer.c:508 trailer.c:562 trailer.c:566
+#: trailer.c:570
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "valeur inconnue '%s' pour la clé '%s'"
+
+#: trailer.c:552 trailer.c:557 builtin/remote.c:288
+#, c-format
+msgid "more than one %s"
+msgstr "plus d'un %s"
+
+#: trailer.c:587
+#, c-format
+msgid "empty trailer token in trailer '%s'"
+msgstr "symbole vide dans la ligne de fin '%s'"
+
+#: trailer.c:706
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "impossible de lire le fichier d'entrée '%s'"
+
+#: trailer.c:709
+msgid "could not read from stdin"
+msgstr "Impossible de lire depuis l'entrée standard"
+
+#: unpack-trees.c:202
 msgid "Checking out files"
 msgstr "Extraction des fichiers"
 
@@ -1506,27 +1608,31 @@
 msgid "invalid '..' path segment"
 msgstr "segment de chemin '..' invalide"
 
-#: wrapper.c:422
+#: wrapper.c:509
 #, c-format
 msgid "unable to access '%s': %s"
 msgstr "impossible d'accéder à '%s' : %s"
 
-#: wrapper.c:443
+#: wrapper.c:530
 #, c-format
 msgid "unable to access '%s'"
 msgstr "impossible d'accéder à '%s'"
 
-#: wrapper.c:454
+#: wrapper.c:541
 #, 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:455
+#: wrapper.c:542
 msgid "no such user"
 msgstr "utilisateur inconnu"
 
+#: wrapper.c:550
+msgid "unable to get current working directory"
+msgstr "impossible d'accéder au répertoire de travail courant"
+
 #: wt-status.c:150
 msgid "Unmerged paths:"
 msgstr "Chemins non fusionnés :"
@@ -1673,15 +1779,15 @@
 msgid "bug: unhandled diff status %c"
 msgstr "bogue : état de diff non géré %c"
 
-#: wt-status.c:765
+#: wt-status.c:761
 msgid "Submodules changed but not updated:"
 msgstr "Sous-modules modifiés mais non mis à jour :"
 
-#: wt-status.c:767
+#: wt-status.c:763
 msgid "Submodule changes to be committed:"
 msgstr "Changements du sous-module à valider :"
 
-#: wt-status.c:846
+#: wt-status.c:842
 msgid ""
 "Do not touch the line above.\n"
 "Everything below will be removed."
@@ -1689,68 +1795,68 @@
 "Ne touchez pas à la ligne ci-dessus\n"
 "Tout se qui suit sera éliminé."
 
-#: wt-status.c:937
+#: wt-status.c:933
 msgid "You have unmerged paths."
 msgstr "Vous avez des chemins non fusionnés."
 
-#: wt-status.c:940
+#: wt-status.c:936
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr "  (réglez les conflits puis lancez \"git commit\")"
 
-#: wt-status.c:943
+#: wt-status.c:939
 msgid "All conflicts fixed but you are still merging."
 msgstr "Tous les conflits sont réglés mais la fusion n'est pas terminée."
 
-#: wt-status.c:946
+#: wt-status.c:942
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr "  (utilisez \"git commit\" pour terminer la fusion)"
 
-#: wt-status.c:956
+#: wt-status.c:952
 msgid "You are in the middle of an am session."
 msgstr "Vous êtes au milieu d'une session am."
 
-#: wt-status.c:959
+#: wt-status.c:955
 msgid "The current patch is empty."
 msgstr "Le patch actuel est vide."
 
-#: wt-status.c:963
+#: wt-status.c:959
 msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr "  (réglez les conflits puis lancez \"git am --continue\")"
 
-#: wt-status.c:965
+#: wt-status.c:961
 msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr "  (utilisez \"git am --skip\" pour sauter ce patch)"
 
-#: wt-status.c:967
+#: wt-status.c:963
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr "  (utilisez \"git am --abort\" pour restaurer la branche d'origine)"
 
-#: wt-status.c:1027 wt-status.c:1044
+#: wt-status.c:1023 wt-status.c:1040
 #, c-format
 msgid "You are currently rebasing branch '%s' on '%s'."
 msgstr "Vous êtes en train de rebaser la branche '%s' sur '%s'."
 
-#: wt-status.c:1032 wt-status.c:1049
+#: wt-status.c:1028 wt-status.c:1045
 msgid "You are currently rebasing."
 msgstr "Vous êtes en train de rebaser."
 
-#: wt-status.c:1035
+#: wt-status.c:1031
 msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr "  (réglez les conflits puis lancez \"git rebase --continue\")"
 
-#: wt-status.c:1037
+#: wt-status.c:1033
 msgid "  (use \"git rebase --skip\" to skip this patch)"
 msgstr "  (utilisez \"git rebase --skip\" pour sauter ce patch)"
 
-#: wt-status.c:1039
+#: wt-status.c:1035
 msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr "  (utilisez \"git rebase --abort\" pour extraire la branche d'origine)"
 
-#: wt-status.c:1052
+#: wt-status.c:1048
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr "  (tous les conflits sont réglés : lancez \"git rebase --continue\")"
 
-#: wt-status.c:1056
+#: wt-status.c:1052
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
@@ -1758,120 +1864,120 @@
 "Vous êtes actuellement en train de fractionner un commit pendant un rebasage "
 "de la branche '%s' sur '%s'."
 
-#: wt-status.c:1061
+#: wt-status.c:1057
 msgid "You are currently splitting a commit during a rebase."
 msgstr ""
 "Vous êtes actuellement en train de fractionner un commit pendant un rebasage."
 
-#: wt-status.c:1064
+#: wt-status.c:1060
 msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr ""
 "  (Une fois la copie de travail nettoyée, lancez \"git rebase --continue\")"
 
-#: wt-status.c:1068
+#: wt-status.c:1064
 #, c-format
 msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr ""
 "Vous êtes actuellement en train d'éditer un commit pendant un rebasage de la "
 "branche '%s' sur '%s'."
 
-#: wt-status.c:1073
+#: wt-status.c:1069
 msgid "You are currently editing a commit during a rebase."
 msgstr ""
 "Vous êtes actuellement en train d'éditer un commit pendant un rebasage."
 
-#: wt-status.c:1076
+#: wt-status.c:1072
 msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr "  (utilisez \"git commit --amend\" pour corriger le commit actuel)"
 
-#: wt-status.c:1078
+#: wt-status.c:1074
 msgid ""
 "  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr ""
 "  (utilisez \"git rebase --continue\" quand vous êtes satisfait de vos "
 "modifications)"
 
-#: wt-status.c:1088
+#: wt-status.c:1084
 #, c-format
 msgid "You are currently cherry-picking commit %s."
 msgstr "Vous êtes actuellement en train de picorer le commit %s."
 
-#: wt-status.c:1093
+#: wt-status.c:1089
 msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
 msgstr "  (réglez les conflits puis lancez \"git cherry-pick --continue\")"
 
-#: wt-status.c:1096
+#: wt-status.c:1092
 msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr ""
 "  (tous les conflits sont réglés : lancez \"git cherry-pick --continue\")"
 
-#: wt-status.c:1098
+#: wt-status.c:1094
 msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr "  (utilisez \"git cherry-pick --abort\" pour annuler le picorage)"
 
-#: wt-status.c:1107
+#: wt-status.c:1103
 #, c-format
 msgid "You are currently reverting commit %s."
 msgstr "Vous êtes actuellement en train de rétablir le commit %s."
 
-#: wt-status.c:1112
+#: wt-status.c:1108
 msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr "  (réglez les conflits puis lancez \"git revert --continue\")"
 
-#: wt-status.c:1115
+#: wt-status.c:1111
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr "  (tous les conflits sont réglés : lancez \"git revert --continue\")"
 
-#: wt-status.c:1117
+#: wt-status.c:1113
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr "  (utilisez \"git revert --abort\" pour annuler le rétablissement)"
 
-#: wt-status.c:1128
+#: wt-status.c:1124
 #, c-format
 msgid "You are currently bisecting, started from branch '%s'."
 msgstr "Vous êtes en cours de bissection, depuis la branche '%s'."
 
-#: wt-status.c:1132
+#: wt-status.c:1128
 msgid "You are currently bisecting."
 msgstr "Vous êtes en cours de bissection."
 
-#: wt-status.c:1135
+#: wt-status.c:1131
 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:1310
+#: wt-status.c:1306
 msgid "On branch "
 msgstr "Sur la branche "
 
-#: wt-status.c:1317
+#: wt-status.c:1313
 msgid "rebase in progress; onto "
 msgstr "rebasage en cours ; sur "
 
-#: wt-status.c:1324
+#: wt-status.c:1320
 msgid "HEAD detached at "
 msgstr "HEAD détachée sur "
 
-#: wt-status.c:1326
+#: wt-status.c:1322
 msgid "HEAD detached from "
 msgstr "HEAD détachée depuis "
 
-#: wt-status.c:1329
+#: wt-status.c:1325
 msgid "Not currently on any branch."
 msgstr "Actuellement sur aucun branche."
 
-#: wt-status.c:1346
+#: wt-status.c:1342
 msgid "Initial commit"
 msgstr "Validation initiale"
 
-#: wt-status.c:1360
+#: wt-status.c:1356
 msgid "Untracked files"
 msgstr "Fichiers non suivis"
 
-#: wt-status.c:1362
+#: wt-status.c:1358
 msgid "Ignored files"
 msgstr "Fichiers ignorés"
 
-#: wt-status.c:1366
+#: wt-status.c:1362
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1883,32 +1989,32 @@
 "oublier d'ajouter les nouveaux fichiers par vous-même (voir 'git help "
 "status')."
 
-#: wt-status.c:1372
+#: wt-status.c:1368
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr "Fichiers non suivis non affichés%s"
 
-#: wt-status.c:1374
+#: wt-status.c:1370
 msgid " (use -u option to show untracked files)"
 msgstr " (utilisez -u pour afficher les fichiers non suivis)"
 
-#: wt-status.c:1380
+#: wt-status.c:1376
 msgid "No changes"
 msgstr "Aucune modification"
 
-#: wt-status.c:1385
+#: wt-status.c:1381
 #, c-format
 msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr ""
 "aucune modification n'a été ajoutée à la validation (utilisez \"git add\" ou "
 "\"git commit -a\")\n"
 
-#: wt-status.c:1388
+#: wt-status.c:1384
 #, c-format
 msgid "no changes added to commit\n"
 msgstr "aucune modification ajoutée à la validation\n"
 
-#: wt-status.c:1391
+#: wt-status.c:1387
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
@@ -1917,98 +2023,98 @@
 "aucune modification ajoutée à la validation mais des fichiers non suivis "
 "sont présents (utilisez \"git add\" pour les suivre)\n"
 
-#: wt-status.c:1394
+#: wt-status.c:1390
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
 msgstr ""
 "aucune modification ajoutée à la validation mais des fichiers non suivis "
 "sont présents\n"
 
-#: wt-status.c:1397
+#: wt-status.c:1393
 #, c-format
 msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
 "rien à valider (créez/copiez des fichiers et utilisez \"git add\" pour les "
 "suivre)\n"
 
-#: wt-status.c:1400 wt-status.c:1405
+#: wt-status.c:1396 wt-status.c:1401
 #, c-format
 msgid "nothing to commit\n"
 msgstr "rien à valider\n"
 
-#: wt-status.c:1403
+#: wt-status.c:1399
 #, c-format
 msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr "rien à valider (utilisez -u pour afficher les fichiers non suivis)\n"
 
-#: wt-status.c:1407
+#: wt-status.c:1403
 #, c-format
 msgid "nothing to commit, working directory clean\n"
 msgstr "rien à valider, la copie de travail est propre\n"
 
-#: wt-status.c:1516
+#: wt-status.c:1512
 msgid "HEAD (no branch)"
 msgstr "HEAD (aucune branche)"
 
-#: wt-status.c:1522
+#: wt-status.c:1518
 msgid "Initial commit on "
 msgstr "Validation initiale sur "
 
 # à priori on parle d'une branche ici
-#: wt-status.c:1554
+#: wt-status.c:1550
 msgid "gone"
 msgstr "disparue"
 
-#: wt-status.c:1556 wt-status.c:1564
+#: wt-status.c:1552 wt-status.c:1560
 msgid "behind "
 msgstr "derrière "
 
-#: compat/precompose_utf8.c:55 builtin/clone.c:356
+#: compat/precompose_utf8.c:55 builtin/clone.c:357
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "échec lors de l'unlink de '%s'"
 
-#: builtin/add.c:21
+#: builtin/add.c:22
 msgid "git add [options] [--] <pathspec>..."
 msgstr "git add [options] [--] <chemin>..."
 
-#: builtin/add.c:64
+#: builtin/add.c:65
 #, c-format
 msgid "unexpected diff status %c"
 msgstr "status de diff inattendu %c"
 
-#: builtin/add.c:69 builtin/commit.c:261
+#: builtin/add.c:70 builtin/commit.c:275
 msgid "updating files failed"
 msgstr "échec de la mise à jour des fichiers"
 
-#: builtin/add.c:79
+#: builtin/add.c:80
 #, c-format
 msgid "remove '%s'\n"
 msgstr "suppression de '%s'\n"
 
-#: builtin/add.c:133
+#: builtin/add.c:134
 msgid "Unstaged changes after refreshing the index:"
 msgstr "Modifications non indexées après rafraîchissement de l'index :"
 
-#: builtin/add.c:193
+#: builtin/add.c:194 builtin/rev-parse.c:785
 msgid "Could not read the index"
 msgstr "Impossible de lire l'index"
 
-#: builtin/add.c:204
+#: builtin/add.c:205
 #, c-format
 msgid "Could not open '%s' for writing."
 msgstr "Impossible d'ouvrir '%s' en écriture."
 
-#: builtin/add.c:208
+#: builtin/add.c:209
 msgid "Could not write patch"
 msgstr "Impossible d'écrire le patch"
 
-#: builtin/add.c:213
+#: builtin/add.c:214
 #, c-format
 msgid "Could not stat '%s'"
 msgstr "Stat de '%s' impossible"
 
-#: builtin/add.c:215
+#: builtin/add.c:216
 msgid "Empty patch. Aborted."
 msgstr "Patch vide. Abandon."
 
@@ -2022,15 +2128,15 @@
 msgstr ""
 "Les chemins suivants sont ignorés par un de vos fichiers .gitignore :\n"
 
-#: builtin/add.c:248 builtin/clean.c:876 builtin/fetch.c:93 builtin/mv.c:70
-#: builtin/prune-packed.c:77 builtin/push.c:489 builtin/remote.c:1344
+#: builtin/add.c:248 builtin/clean.c:875 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/prune-packed.c:55 builtin/push.c:499 builtin/remote.c:1375
 #: builtin/rm.c:269
 msgid "dry run"
 msgstr "simuler l'action"
 
-#: builtin/add.c:249 builtin/apply.c:4410 builtin/check-ignore.c:19
-#: builtin/commit.c:1256 builtin/count-objects.c:95 builtin/fsck.c:612
-#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113
+#: builtin/add.c:249 builtin/apply.c:4415 builtin/check-ignore.c:19
+#: builtin/commit.c:1362 builtin/count-objects.c:63 builtin/fsck.c:608
+#: builtin/log.c:1617 builtin/mv.c:109 builtin/read-tree.c:114
 msgid "be verbose"
 msgstr "mode verbeux"
 
@@ -2038,7 +2144,7 @@
 msgid "interactive picking"
 msgstr "sélection interactive"
 
-#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:286
 msgid "select hunks interactively"
 msgstr "sélection interactive des sections"
 
@@ -2094,101 +2200,101 @@
 msgid "adding files failed"
 msgstr "échec de l'ajout de fichiers"
 
-#: builtin/add.c:330
+#: builtin/add.c:329
 msgid "-A and -u are mutually incompatible"
 msgstr "-A et -u sont mutuellement incompatibles"
 
-#: builtin/add.c:337
+#: builtin/add.c:336
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr ""
 "L'option --ignore-missing ne peut être utilisée qu'en complément de --dry-run"
 
-#: builtin/add.c:358
+#: builtin/add.c:357
 #, 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:358
 #, 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:920
-#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:234 builtin/rm.c:299
+#: builtin/add.c:363 builtin/check-ignore.c:172 builtin/clean.c:919
+#: builtin/commit.c:333 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:299
 msgid "index file corrupt"
 msgstr "fichier d'index corrompu"
 
-#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
+#: builtin/add.c:446 builtin/apply.c:4510 builtin/mv.c:279 builtin/rm.c:431
 msgid "Unable to write new index file"
 msgstr "Impossible d'écrire le nouveau fichier d'index"
 
-#: builtin/apply.c:57
+#: builtin/apply.c:58
 msgid "git apply [options] [<patch>...]"
 msgstr "git apply [options] [<patch>...]"
 
-#: builtin/apply.c:110
+#: builtin/apply.c:111
 #, c-format
 msgid "unrecognized whitespace option '%s'"
 msgstr "option d'espace non reconnue '%s'"
 
-#: builtin/apply.c:125
+#: builtin/apply.c:126
 #, c-format
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "option d'ignorance d'espace non reconnue '%s'"
 
-#: builtin/apply.c:823
+#: builtin/apply.c:826
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr "Impossible de préparer la regexp d'horodatage %s"
 
-#: builtin/apply.c:832
+#: builtin/apply.c:835
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr "regexec a retourné %d pour l'entrée : %s"
 
-#: builtin/apply.c:913
+#: builtin/apply.c:916
 #, 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:945
+#: builtin/apply.c:948
 #, 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:949
+#: builtin/apply.c:952
 #, 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:950
+#: builtin/apply.c:953
 #, 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:957
+#: builtin/apply.c:960
 #, 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:1422
+#: builtin/apply.c:1423
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "recomptage : ligne inattendue : %.*s"
 
-#: builtin/apply.c:1479
+#: builtin/apply.c:1480
 #, 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:1496
+#: builtin/apply.c:1497
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -2203,77 +2309,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:1656
+#: builtin/apply.c:1657
 msgid "new file depends on old contents"
 msgstr "le nouveau fichier dépend de contenus anciens"
 
-#: builtin/apply.c:1658
+#: builtin/apply.c:1659
 msgid "deleted file still has contents"
 msgstr "le fichier supprimé a encore du contenu"
 
-#: builtin/apply.c:1684
+#: builtin/apply.c:1685
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "patch corrompu à la ligne %d"
 
-#: builtin/apply.c:1720
+#: builtin/apply.c:1721
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "le nouveau fichier %s dépend de contenus anciens"
 
-#: builtin/apply.c:1722
+#: builtin/apply.c:1723
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "le fichier supprimé %s a encore du contenu"
 
-#: builtin/apply.c:1725
+#: builtin/apply.c:1726
 #, 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:1871
+#: builtin/apply.c:1872
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "patch binaire corrompu à la ligne %d : %.*s"
 
-#: builtin/apply.c:1900
+#: builtin/apply.c:1901
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "patch binaire non reconnu à la ligne %d"
 
-#: builtin/apply.c:1986
+#: builtin/apply.c:2052
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "patch totalement incompréhensible à la ligne %d"
 
-#: builtin/apply.c:2076
+#: builtin/apply.c:2142
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "lecture du lien symbolique %s impossible"
 
-#: builtin/apply.c:2080
+#: builtin/apply.c:2146
 #, c-format
 msgid "unable to open or read %s"
 msgstr "ouverture ou lecture de %s impossible"
 
-#: builtin/apply.c:2688
+#: builtin/apply.c:2754
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "début de ligne invalide : '%c'"
 
-#: builtin/apply.c:2806
+#: builtin/apply.c:2872
 #, 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:2818
+#: builtin/apply.c:2884
 #, 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:2824
+#: builtin/apply.c:2890
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -2282,328 +2388,328 @@
 "pendant la recherche de :\n"
 "%.*s"
 
-#: builtin/apply.c:2843
+#: builtin/apply.c:2909
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "données de patch binaire manquantes pour '%s'"
 
-#: builtin/apply.c:2946
+#: builtin/apply.c:3010
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "le patch binaire ne s'applique par correctement à '%s'"
 
-#: builtin/apply.c:2952
+#: builtin/apply.c:3016
 #, 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:2973
+#: builtin/apply.c:3037
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "le patch a échoué : %s:%ld"
 
-#: builtin/apply.c:3095
+#: builtin/apply.c:3161
 #, c-format
 msgid "cannot checkout %s"
 msgstr "extraction de %s impossible"
 
-#: builtin/apply.c:3140 builtin/apply.c:3149 builtin/apply.c:3194
+#: builtin/apply.c:3206 builtin/apply.c:3215 builtin/apply.c:3260
 #, c-format
 msgid "read of %s failed"
 msgstr "échec de la lecture de %s"
 
-#: builtin/apply.c:3174 builtin/apply.c:3396
+#: builtin/apply.c:3240 builtin/apply.c:3462
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "le chemin %s a été renommé/supprimé"
 
-#: builtin/apply.c:3255 builtin/apply.c:3410
+#: builtin/apply.c:3321 builtin/apply.c:3476
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "%s : n'existe pas dans l'index"
 
-#: builtin/apply.c:3259 builtin/apply.c:3402 builtin/apply.c:3424
+#: builtin/apply.c:3325 builtin/apply.c:3468 builtin/apply.c:3490
 #, c-format
 msgid "%s: %s"
 msgstr "%s : %s"
 
-#: builtin/apply.c:3264 builtin/apply.c:3418
+#: builtin/apply.c:3330 builtin/apply.c:3484
 #, c-format
 msgid "%s: does not match index"
 msgstr "%s : ne correspond pas à l'index"
 
-#: builtin/apply.c:3366
+#: builtin/apply.c:3432
 msgid "removal patch leaves file contents"
 msgstr "le patch de suppression laisse un contenu dans le fichier"
 
-#: builtin/apply.c:3435
+#: builtin/apply.c:3501
 #, c-format
 msgid "%s: wrong type"
 msgstr "%s : type erroné"
 
-#: builtin/apply.c:3437
+#: builtin/apply.c:3503
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "%s est de type %o, mais %o attendu"
 
-#: builtin/apply.c:3538
+#: builtin/apply.c:3604
 #, c-format
 msgid "%s: already exists in index"
 msgstr "%s : existe déjà dans l'index"
 
-#: builtin/apply.c:3541
+#: builtin/apply.c:3607
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "%s : existe déjà dans la copie de travail"
 
-#: builtin/apply.c:3561
+#: builtin/apply.c:3627
 #, 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:3566
+#: builtin/apply.c:3632
 #, 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:3574
+#: builtin/apply.c:3640
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "%s : le patch ne s'applique pas"
 
-#: builtin/apply.c:3587
+#: builtin/apply.c:3653
 #, c-format
 msgid "Checking patch %s..."
 msgstr "Vérification du patch %s..."
 
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
+#: builtin/apply.c:3746 builtin/checkout.c:213 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:3823
+#: builtin/apply.c:3889
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "suppression de %s dans l'index impossible"
 
-#: builtin/apply.c:3851
+#: builtin/apply.c:3918
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr "patch corrompu pour le sous-module %s"
 
-#: builtin/apply.c:3855
+#: builtin/apply.c:3922
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr "stat du fichier nouvellement créé '%s' impossible"
 
-#: builtin/apply.c:3860
+#: builtin/apply.c:3927
 #, 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:3863 builtin/apply.c:3971
+#: builtin/apply.c:3930 builtin/apply.c:4038
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "ajout de l'élément de cache %s impossible"
 
-#: builtin/apply.c:3896
+#: builtin/apply.c:3963
 #, c-format
 msgid "closing file '%s'"
 msgstr "fermeture du fichier '%s'"
 
-#: builtin/apply.c:3945
+#: builtin/apply.c:4012
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "écriture du fichier '%s' mode %o impossible"
 
-#: builtin/apply.c:4032
+#: builtin/apply.c:4099
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "Patch %s appliqué proprement."
 
-#: builtin/apply.c:4040
+#: builtin/apply.c:4107
 msgid "internal error"
 msgstr "erreur interne"
 
-#: builtin/apply.c:4043
+#: builtin/apply.c:4110
 #, 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:4053
+#: builtin/apply.c:4120
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "troncature du nom de fichier .rej en %.*s.rej"
 
-#: builtin/apply.c:4074
+#: builtin/apply.c:4141
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "Section n°%d appliquée proprement."
 
-#: builtin/apply.c:4077
+#: builtin/apply.c:4144
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "Section n°%d rejetée."
 
-#: builtin/apply.c:4227
+#: builtin/apply.c:4234
 msgid "unrecognized input"
 msgstr "entrée non reconnue"
 
-#: builtin/apply.c:4238
+#: builtin/apply.c:4245
 msgid "unable to read index file"
 msgstr "lecture du fichier d'index impossible"
 
-#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90
-#: builtin/fetch.c:78
+#: builtin/apply.c:4362 builtin/apply.c:4365 builtin/clone.c:91
+#: builtin/fetch.c:93
 msgid "path"
 msgstr "chemin"
 
-#: builtin/apply.c:4358
+#: builtin/apply.c:4363
 msgid "don't apply changes matching the given path"
 msgstr "ne pas appliquer les modifications qui correspondent au chemin donné"
 
-#: builtin/apply.c:4361
+#: builtin/apply.c:4366
 msgid "apply changes matching the given path"
 msgstr "appliquer les modifications qui correspondent au chemin donné"
 
-#: builtin/apply.c:4363
+#: builtin/apply.c:4368
 msgid "num"
 msgstr "num"
 
-#: builtin/apply.c:4364
+#: builtin/apply.c:4369
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr "supprimer <num> barres obliques des chemins traditionnels de diff"
 
-#: builtin/apply.c:4367
+#: builtin/apply.c:4372
 msgid "ignore additions made by the patch"
 msgstr "ignorer les additions réalisées par le patch"
 
-#: builtin/apply.c:4369
+#: builtin/apply.c:4374
 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:4373
+#: builtin/apply.c:4378
 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:4375
+#: builtin/apply.c:4380
 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:4377
+#: builtin/apply.c:4382
 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:4379
+#: builtin/apply.c:4384
 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:4381
+#: builtin/apply.c:4386
 msgid "apply a patch without touching the working tree"
 msgstr "appliquer les patch sans toucher à la copie de travail"
 
-#: builtin/apply.c:4383
+#: builtin/apply.c:4388
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr "appliquer aussi le patch (à utiliser avec ---stat/--summary/--check)"
 
-#: builtin/apply.c:4385
+#: builtin/apply.c:4390
 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:4387
+#: builtin/apply.c:4392
 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:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
+#: builtin/apply.c:4394 builtin/checkout-index.c:198 builtin/ls-files.c:455
 msgid "paths are separated with NUL character"
 msgstr "les chemins sont séparés par un caractère NUL"
 
-#: builtin/apply.c:4392
+#: builtin/apply.c:4397
 msgid "ensure at least <n> lines of context match"
 msgstr "s'assurer d'au moins <n> lignes de correspondance de contexte"
 
-#: builtin/apply.c:4393
+#: builtin/apply.c:4398
 msgid "action"
 msgstr "action"
 
-#: builtin/apply.c:4394
+#: builtin/apply.c:4399
 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:4397 builtin/apply.c:4400
+#: builtin/apply.c:4402 builtin/apply.c:4405
 msgid "ignore changes in whitespace when finding context"
 msgstr "ignorer des modifications d'espace lors de la recherche de contexte"
 
-#: builtin/apply.c:4403
+#: builtin/apply.c:4408
 msgid "apply the patch in reverse"
 msgstr "appliquer le patch en sens inverse"
 
-#: builtin/apply.c:4405
+#: builtin/apply.c:4410
 msgid "don't expect at least one line of context"
 msgstr "ne pas s'attendre à au moins une ligne de contexte"
 
-#: builtin/apply.c:4407
+#: builtin/apply.c:4412
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr "laisser les sections rejetées dans les fichiers *.rej correspondants"
 
-#: builtin/apply.c:4409
+#: builtin/apply.c:4414
 msgid "allow overlapping hunks"
 msgstr "accepter les recouvrements de sections"
 
-#: builtin/apply.c:4412
+#: builtin/apply.c:4417
 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:4415
+#: builtin/apply.c:4420
 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:4417
+#: builtin/apply.c:4422
 msgid "root"
 msgstr "racine"
 
-#: builtin/apply.c:4418
+#: builtin/apply.c:4423
 msgid "prepend <root> to all filenames"
 msgstr "préfixer tous les noms de fichier avec <root>"
 
-#: builtin/apply.c:4440
+#: builtin/apply.c:4445
 msgid "--3way outside a repository"
 msgstr "--3way hors d'un dépôt"
 
-#: builtin/apply.c:4448
+#: builtin/apply.c:4453
 msgid "--index outside a repository"
 msgstr "--index hors d'un dépôt"
 
-#: builtin/apply.c:4451
+#: builtin/apply.c:4456
 msgid "--cached outside a repository"
 msgstr "--cached hors d'un dépôt"
 
-#: builtin/apply.c:4467
+#: builtin/apply.c:4472
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "ouverture impossible du patch '%s'"
 
-#: builtin/apply.c:4481
+#: builtin/apply.c:4486
 #, 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:4487 builtin/apply.c:4497
+#: builtin/apply.c:4492 builtin/apply.c:4502
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -2657,112 +2763,122 @@
 msgid "update BISECT_HEAD instead of checking out the current commit"
 msgstr "mettre à jour BISECT_HEAD au lieu d'extraire le commit actuel"
 
-#: builtin/blame.c:27
+#: builtin/blame.c:30
 msgid "git blame [options] [rev-opts] [rev] [--] file"
 msgstr "git blame [options] [options-de-révision] [rev] [--] fichier"
 
-#: builtin/blame.c:32
+#: builtin/blame.c:35
 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:2242
+#: builtin/blame.c:2501
 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:2243
+#: builtin/blame.c:2502
 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:2244
+#: builtin/blame.c:2503
 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:2245
+#: builtin/blame.c:2504
 msgid "Show work cost statistics"
 msgstr "Montrer les statistiques de coût d'activité"
 
-#: builtin/blame.c:2246
+#: builtin/blame.c:2505
 msgid "Show output score for blame entries"
 msgstr "Montrer le score de sortie pour les éléments de blâme"
 
-#: builtin/blame.c:2247
+#: builtin/blame.c:2506
 msgid "Show original filename (Default: auto)"
 msgstr "Montrer les noms de fichier originaux (Défaut : auto)"
 
-#: builtin/blame.c:2248
+#: builtin/blame.c:2507
 msgid "Show original linenumber (Default: off)"
 msgstr "Montrer les numéros de lignes originaux (Défaut : désactivé)"
 
-#: builtin/blame.c:2249
+#: builtin/blame.c:2508
 msgid "Show in a format designed for machine consumption"
 msgstr "Afficher dans un format propice à la consommation par machine"
 
-#: builtin/blame.c:2250
+#: builtin/blame.c:2509
 msgid "Show porcelain format with per-line commit information"
 msgstr "Afficher en format porcelaine avec l'information de commit par ligne"
 
-#: builtin/blame.c:2251
+#: builtin/blame.c:2510
 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:2252
+#: builtin/blame.c:2511
 msgid "Show raw timestamp (Default: off)"
 msgstr "Afficher les horodatages bruts (Défaut : désactivé)"
 
-#: builtin/blame.c:2253
+#: builtin/blame.c:2512
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Afficher les longs SHA1 de commits (Défaut : désactivé)"
 
-#: builtin/blame.c:2254
+#: builtin/blame.c:2513
 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:2255
+#: builtin/blame.c:2514
 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:2256
+#: builtin/blame.c:2515
 msgid "Ignore whitespace differences"
 msgstr "Ignorer les différences d'espace"
 
-#: builtin/blame.c:2257
+#: builtin/blame.c:2516
 msgid "Spend extra cycles to find better match"
 msgstr ""
 "Dépenser des cycles supplémentaires pour trouver une meilleure correspondance"
 
-#: builtin/blame.c:2258
+#: builtin/blame.c:2517
 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:2259
+#: builtin/blame.c:2518
 msgid "Use <file>'s contents as the final image"
 msgstr "Utiliser le contenu de <fichier> comme image finale"
 
-#: builtin/blame.c:2260 builtin/blame.c:2261
+#: builtin/blame.c:2519 builtin/blame.c:2520
 msgid "score"
 msgstr "score"
 
-#: builtin/blame.c:2260
+#: builtin/blame.c:2519
 msgid "Find line copies within and across files"
 msgstr "Trouver les copies de ligne dans et entre les fichiers"
 
-#: builtin/blame.c:2261
+#: builtin/blame.c:2520
 msgid "Find line movements within and across files"
 msgstr "Trouver les mouvements de ligne dans et entre les fichiers"
 
-#: builtin/blame.c:2262
+#: builtin/blame.c:2521
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2262
+#: builtin/blame.c:2521
 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"
 
+#. 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:2602
+msgid "4 years, 11 months ago"
+msgstr "il y a 10 ans et 11 mois"
+
 #: builtin/branch.c:24
 msgid "git branch [options] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [options] [-r | -a] [--merged | --no-merged]"
@@ -2779,7 +2895,7 @@
 msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>"
 msgstr "git branch [options] (-m | -M) [<anciennebranche>] <nouvellebranche>"
 
-#: builtin/branch.c:150
+#: builtin/branch.c:152
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -2788,7 +2904,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:156
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -2797,12 +2913,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:170
 #, 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:174
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -2811,304 +2927,304 @@
 "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:187
 msgid "Update of config-file failed"
 msgstr "Échec de la mise à jour du fichier de configuration"
 
-#: builtin/branch.c:213
+#: builtin/branch.c:215
 msgid "cannot use -a with -d"
 msgstr "impossible d'utiliser -a avec -d"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:221
 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:229
 #, 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:240
+#: builtin/branch.c:245
 #, c-format
 msgid "remote branch '%s' not found."
 msgstr "branche distante %s' non trouvée."
 
-#: builtin/branch.c:241
+#: builtin/branch.c:246
 #, c-format
 msgid "branch '%s' not found."
 msgstr "branche '%s' non trouvée."
 
-#: builtin/branch.c:255
+#: builtin/branch.c:260
 #, c-format
 msgid "Error deleting remote branch '%s'"
 msgstr "Erreur lors de la suppression de la branche distante '%s'"
 
-#: builtin/branch.c:256
+#: builtin/branch.c:261
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Erreur lors de la suppression de la branche '%s'"
 
-#: builtin/branch.c:263
+#: builtin/branch.c:268
 #, c-format
 msgid "Deleted remote branch %s (was %s).\n"
 msgstr "Branche distante %s supprimée (précédemment %s).\n"
 
-#: builtin/branch.c:264
+#: builtin/branch.c:269
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Branche %s supprimée (précédemment %s).\n"
 
-#: builtin/branch.c:366
+#: builtin/branch.c:370
 #, 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:454
+#: builtin/branch.c:459
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: disparue]"
 
-#: builtin/branch.c:459
+#: builtin/branch.c:464
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:464
+#: builtin/branch.c:469
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: en retard de %d]"
 
-#: builtin/branch.c:466
+#: builtin/branch.c:471
 #, c-format
 msgid "[behind %d]"
 msgstr "[en retard de %d]"
 
-#: builtin/branch.c:470
+#: builtin/branch.c:475
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s : en avance de %d]"
 
-#: builtin/branch.c:472
+#: builtin/branch.c:477
 #, c-format
 msgid "[ahead %d]"
 msgstr "[en avance de %d]"
 
-#: builtin/branch.c:475
+#: builtin/branch.c:480
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s : en avance de %d, en retard de %d]"
 
-#: builtin/branch.c:478
+#: builtin/branch.c:483
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[en avance de %d, en retard de %d]"
 
-#: builtin/branch.c:502
+#: builtin/branch.c:496
 msgid " **** invalid ref ****"
 msgstr " **** référence invalide ****"
 
-#: builtin/branch.c:594
+#: builtin/branch.c:587
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(aucune branche, rebasage de %s)"
 
-#: builtin/branch.c:597
+#: builtin/branch.c:590
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(aucune branche, bisect a démarré sur %s)"
 
-#: builtin/branch.c:600
+#: builtin/branch.c:593
 #, c-format
 msgid "(detached from %s)"
 msgstr "(détaché de %s)"
 
-#: builtin/branch.c:603
+#: builtin/branch.c:596
 msgid "(no branch)"
 msgstr "(aucune branche)"
 
-#: builtin/branch.c:649
+#: 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:681
+#: 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:694
+#: builtin/branch.c:704
 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:704
+#: builtin/branch.c:714
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Nom de branche invalide : '%s'"
 
-#: builtin/branch.c:719
+#: builtin/branch.c:729
 msgid "Branch rename failed"
 msgstr "Échec de renommage de la branche"
 
-#: builtin/branch.c:723
+#: builtin/branch.c:733
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "Renommage d'un branche mal nommée '%s'"
 
-#: builtin/branch.c:727
+#: builtin/branch.c:737
 #, 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:734
+#: builtin/branch.c:744
 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:749
+#: builtin/branch.c:759
 #, c-format
 msgid "malformed object name %s"
 msgstr "nom d'objet malformé %s"
 
-#: builtin/branch.c:773
+#: builtin/branch.c:783
 #, 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:803
+#: builtin/branch.c:813
 msgid "Generic options"
 msgstr "Options génériques"
 
-#: builtin/branch.c:805
+#: builtin/branch.c:815
 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:806
+#: builtin/branch.c:816
 msgid "suppress informational messages"
 msgstr "supprimer les messages d'information"
 
-#: builtin/branch.c:807
+#: builtin/branch.c:817
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "régler le mode de suivi (voir git-pull(1))"
 
-#: builtin/branch.c:809
+#: builtin/branch.c:819
 msgid "change upstream info"
 msgstr "modifier l'information amont"
 
-#: builtin/branch.c:813
+#: builtin/branch.c:823
 msgid "use colored output"
 msgstr "utiliser la coloration dans la sortie"
 
-#: builtin/branch.c:814
+#: builtin/branch.c:824
 msgid "act on remote-tracking branches"
 msgstr "agir sur les branches de suivi distantes"
 
-#: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844
-#: builtin/branch.c:850 builtin/commit.c:1494 builtin/commit.c:1495
-#: builtin/commit.c:1496 builtin/commit.c:1497 builtin/tag.c:527
-#: builtin/tag.c:533
+#: builtin/branch.c:827 builtin/branch.c:833 builtin/branch.c:854
+#: builtin/branch.c:860 builtin/commit.c:1622 builtin/commit.c:1623
+#: builtin/commit.c:1624 builtin/commit.c:1625 builtin/tag.c:616
+#: builtin/tag.c:622
 msgid "commit"
 msgstr "commit"
 
-#: builtin/branch.c:818 builtin/branch.c:824
+#: builtin/branch.c:828 builtin/branch.c:834
 msgid "print only branches that contain the commit"
 msgstr "afficher seulement les branches qui contiennent le commit"
 
-#: builtin/branch.c:830
+#: builtin/branch.c:840
 msgid "Specific git-branch actions:"
 msgstr "Actions spécifiques à git-branch :"
 
-#: builtin/branch.c:831
+#: builtin/branch.c:841
 msgid "list both remote-tracking and local branches"
 msgstr "afficher à la fois les branches de suivi et les branches locales"
 
-#: builtin/branch.c:833
+#: builtin/branch.c:843
 msgid "delete fully merged branch"
 msgstr "supprimer une branche totalement fusionnée"
 
-#: builtin/branch.c:834
+#: builtin/branch.c:844
 msgid "delete branch (even if not merged)"
 msgstr "supprimer une branche (même non fusionnée)"
 
-#: builtin/branch.c:835
+#: builtin/branch.c:845
 msgid "move/rename a branch and its reflog"
 msgstr "déplacer/renommer une branche et son reflog"
 
-#: builtin/branch.c:836
+#: builtin/branch.c:846
 msgid "move/rename a branch, even if target exists"
 msgstr "déplacer/renommer une branche, même si la cible existe"
 
-#: builtin/branch.c:837
+#: builtin/branch.c:847
 msgid "list branch names"
 msgstr "afficher les noms des branches"
 
-#: builtin/branch.c:838
+#: builtin/branch.c:848
 msgid "create the branch's reflog"
 msgstr "créer le reflog de la branche"
 
-#: builtin/branch.c:840
+#: builtin/branch.c:850
 msgid "edit the description for the branch"
 msgstr "éditer la description de la branche"
 
-#: builtin/branch.c:841
+#: builtin/branch.c:851
 msgid "force creation (when already exists)"
 msgstr "forcer la création (même si la cible existe)"
 
-#: builtin/branch.c:844
+#: builtin/branch.c:854
 msgid "print only not merged branches"
 msgstr "afficher seulement les branches non fusionnées"
 
-#: builtin/branch.c:850
+#: builtin/branch.c:860
 msgid "print only merged branches"
 msgstr "afficher seulement les branches fusionnées"
 
-#: builtin/branch.c:854
+#: builtin/branch.c:864
 msgid "list branches in columns"
 msgstr "afficher les branches en colonnes"
 
-#: builtin/branch.c:867
+#: builtin/branch.c:877
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Échec de résolution de HEAD comme référence valide."
 
-#: builtin/branch.c:872 builtin/clone.c:635
+#: builtin/branch.c:881 builtin/clone.c:634
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD non trouvée sous refs/heads !"
 
-#: builtin/branch.c:896
+#: builtin/branch.c:903
 msgid "--column and --verbose are incompatible"
 msgstr "--column et --verbose sont incompatibles"
 
-#: builtin/branch.c:902 builtin/branch.c:941
+#: builtin/branch.c:909 builtin/branch.c:948
 msgid "branch name required"
 msgstr "le nom de branche est requis"
 
-#: builtin/branch.c:917
+#: builtin/branch.c:924
 msgid "Cannot give description to detached HEAD"
 msgstr "Impossible de décrire une HEAD détachée"
 
-#: builtin/branch.c:922
+#: builtin/branch.c:929
 msgid "cannot edit description of more than one branch"
 msgstr "impossible d'éditer la description de plus d'une branche"
 
-#: builtin/branch.c:929
+#: builtin/branch.c:936
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Aucun commit sur la branche '%s'."
 
-#: builtin/branch.c:932
+#: builtin/branch.c:939
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Aucune branche nommée '%s'."
 
-#: builtin/branch.c:947
+#: builtin/branch.c:954
 msgid "too many branches for a rename operation"
 msgstr "trop de branches pour une opération de renommage"
 
-#: builtin/branch.c:952
+#: builtin/branch.c:959
 msgid "too many branches to set new upstream"
 msgstr "trop de branches pour spécifier une branche amont"
 
-#: builtin/branch.c:956
+#: builtin/branch.c:963
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -3116,41 +3232,41 @@
 "impossible de spécifier une branche amont de HEAD par %s qui ne pointe sur "
 "aucune branche."
 
-#: builtin/branch.c:959 builtin/branch.c:981 builtin/branch.c:1002
+#: builtin/branch.c:966 builtin/branch.c:988 builtin/branch.c:1009
 #, c-format
 msgid "no such branch '%s'"
 msgstr "pas de branche '%s'"
 
-#: builtin/branch.c:963
+#: builtin/branch.c:970
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "la branche '%s' n'existe pas"
 
-#: builtin/branch.c:975
+#: builtin/branch.c:982
 msgid "too many branches to unset upstream"
 msgstr "trop de branches pour désactiver un amont"
 
-#: builtin/branch.c:979
+#: builtin/branch.c:986
 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:985
+#: builtin/branch.c:992
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "La branche '%s' n'a aucune information de branche amont"
 
-#: builtin/branch.c:999
+#: builtin/branch.c:1006
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "créer manuellement 'HEAD' n'a pas de sens"
 
-#: builtin/branch.c:1005
+#: builtin/branch.c:1012
 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:1008
+#: builtin/branch.c:1015
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -3159,7 +3275,7 @@
 "l'option --set-upstream est obsolète et va disparaître. Utilisez plutôt --"
 "track ou --set-upstream-to\n"
 
-#: builtin/branch.c:1025
+#: builtin/branch.c:1032
 #, c-format
 msgid ""
 "\n"
@@ -3170,12 +3286,12 @@
 "Si vous vouliez que '%s' suive '%s', faîtes ceci :\n"
 "\n"
 
-#: builtin/branch.c:1026
+#: builtin/branch.c:1033
 #, c-format
 msgid "    git branch -d %s\n"
 msgstr "    git branch -d %s\n"
 
-#: builtin/branch.c:1027
+#: builtin/branch.c:1034
 #, c-format
 msgid "    git branch --set-upstream-to %s\n"
 msgstr "    git branch --set-upstream-to %s\n"
@@ -3193,44 +3309,44 @@
 msgid "Need a repository to unbundle."
 msgstr "Le dépaquetage d'un colis requiert un dépôt."
 
-#: builtin/cat-file.c:331
+#: builtin/cat-file.c:332
 msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
 msgstr "git cat-file (-t|-s|-e|-p|<type>|--textconv) <objet>"
 
-#: builtin/cat-file.c:332
+#: builtin/cat-file.c:333
 msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
 msgstr "git cat-file (--batch|--batch-check) < <liste_d_objets>"
 
-#: builtin/cat-file.c:369
+#: builtin/cat-file.c:370
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<type> peut être : blob, tree, commit ou tag"
 
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:371
 msgid "show object type"
 msgstr "afficher le type de l'objet"
 
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:372
 msgid "show object size"
 msgstr "afficher la taille de l'objet"
 
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:374
 msgid "exit with zero when there's no error"
 msgstr "sortir avec un code d'erreur nul quand il n'y a aucune erreur"
 
-#: builtin/cat-file.c:374
+#: builtin/cat-file.c:375
 msgid "pretty-print object's content"
 msgstr "afficher avec mise en forme le contenu de l'objet"
 
-#: builtin/cat-file.c:376
+#: builtin/cat-file.c:377
 msgid "for blob objects, run textconv on object's content"
 msgstr "pour les objets blob, lancer textconv sur le contenu de l'objet"
 
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:379
 msgid "show info and content of objects fed from the standard input"
 msgstr ""
 "afficher l'information et le contenu des objets passés en entrée standard"
 
-#: builtin/cat-file.c:381
+#: builtin/cat-file.c:382
 msgid "show info about objects fed from the standard input"
 msgstr "afficher l'information des objets passés en entrée standard"
 
@@ -3251,7 +3367,7 @@
 msgid "use .gitattributes only from the index"
 msgstr "utiliser .gitattributes seulement depuis l'index"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:75
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "lire les noms de fichier depuis l'entrée standard"
 
@@ -3260,7 +3376,7 @@
 msgstr ""
 "terminer les enregistrements en entrée et en sortie par un caractère NUL"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:274
 msgid "suppress progress reporting"
 msgstr "supprimer l'état d'avancement"
 
@@ -3317,45 +3433,45 @@
 msgid "git checkout-index [options] [--] [<file>...]"
 msgstr "git checkout-index [options] [--] [<fichier>...]"
 
-#: builtin/checkout-index.c:187
+#: builtin/checkout-index.c:188
 msgid "check out all files in the index"
 msgstr "extraire tous les fichiers présents dans l'index"
 
-#: builtin/checkout-index.c:188
+#: builtin/checkout-index.c:189
 msgid "force overwrite of existing files"
 msgstr "forcer l'écrasement des fichiers existants"
 
-#: builtin/checkout-index.c:190
+#: builtin/checkout-index.c:191
 msgid "no warning for existing files and files not in index"
 msgstr ""
 "pas d'avertissement pour les fichiers existants et les fichiers absents de "
 "l'index"
 
-#: builtin/checkout-index.c:192
+#: builtin/checkout-index.c:193
 msgid "don't checkout new files"
 msgstr "ne pas extraire les nouveaux fichiers"
 
-#: builtin/checkout-index.c:194
+#: builtin/checkout-index.c:195
 msgid "update stat information in the index file"
 msgstr "mettre à jour l'information de stat dans le fichier d'index"
 
-#: builtin/checkout-index.c:200
+#: builtin/checkout-index.c:201
 msgid "read list of paths from the standard input"
 msgstr "lire la liste des chemins depuis l'entrée standard"
 
-#: builtin/checkout-index.c:202
+#: builtin/checkout-index.c:203
 msgid "write the content to temporary files"
 msgstr "écrire le contenu dans des fichiers temporaires"
 
-#: builtin/checkout-index.c:203 builtin/column.c:30
+#: builtin/checkout-index.c:204 builtin/column.c:30
 msgid "string"
 msgstr "chaîne"
 
-#: builtin/checkout-index.c:204
+#: builtin/checkout-index.c:205
 msgid "when creating files, prepend <string>"
 msgstr "lors de la création de fichiers, préfixer par <chaîne>"
 
-#: builtin/checkout-index.c:207
+#: builtin/checkout-index.c:208
 msgid "copy out the files from named stage"
 msgstr "copier les fichiers depuis l'index nommé"
 
@@ -3397,67 +3513,67 @@
 msgid "Unable to add merge result for '%s'"
 msgstr "Impossible d'ajouter le résultat de fusion pour '%s'"
 
-#: builtin/checkout.c:232 builtin/checkout.c:235 builtin/checkout.c:238
-#: builtin/checkout.c:241
+#: builtin/checkout.c:231 builtin/checkout.c:234 builtin/checkout.c:237
+#: builtin/checkout.c:240
 #, 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:244 builtin/checkout.c:247
+#: builtin/checkout.c:243 builtin/checkout.c:246
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' ne peut pas être utilisé avec %s"
 
-#: builtin/checkout.c:250
+#: builtin/checkout.c:249
 #, 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:261 builtin/checkout.c:450
+#: builtin/checkout.c:260 builtin/checkout.c:449
 msgid "corrupt index file"
 msgstr "fichier d'index corrompu"
 
-#: builtin/checkout.c:321 builtin/checkout.c:328
+#: builtin/checkout.c:320 builtin/checkout.c:327
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "le chemin '%s' n'est pas fusionné"
 
-#: builtin/checkout.c:472
+#: builtin/checkout.c:471
 msgid "you need to resolve your current index first"
 msgstr "vous devez d'abord résoudre votre index courant"
 
-#: builtin/checkout.c:593
+#: builtin/checkout.c:597
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr "Impossible de faire un reflog pour '%s'\n"
 
-#: builtin/checkout.c:631
+#: builtin/checkout.c:635
 msgid "HEAD is now at"
 msgstr "HEAD est maintenant sur"
 
-#: builtin/checkout.c:638
+#: builtin/checkout.c:642
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Remise à zéro de la branche '%s'\n"
 
-#: builtin/checkout.c:641
+#: builtin/checkout.c:645
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Déjà sur '%s'\n"
 
-#: builtin/checkout.c:645
+#: builtin/checkout.c:649
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Basculement et remise à zéro de la branche '%s'\n"
 
-#: builtin/checkout.c:647 builtin/checkout.c:1032
+#: builtin/checkout.c:651 builtin/checkout.c:1032
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Basculement sur la nouvelle branche '%s'\n"
 
-#: builtin/checkout.c:649
+#: builtin/checkout.c:653
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Basculement sur la branche '%s'\n"
@@ -3512,7 +3628,7 @@
 
 #: builtin/checkout.c:763
 msgid "Previous HEAD position was"
-msgstr "La position précédente de HEAD était"
+msgstr "La position précédente de HEAD était sur "
 
 #: builtin/checkout.c:790 builtin/checkout.c:1027
 msgid "You are on a branch yet to be born"
@@ -3553,7 +3669,7 @@
 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:1090 builtin/checkout.c:1092 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:89
 #: builtin/remote.c:159 builtin/remote.c:161
 msgid "branch"
 msgstr "branche"
@@ -3602,11 +3718,11 @@
 msgid "perform a 3-way merge with the new branch"
 msgstr "effectuer une fusion à 3 points avec la nouvelle branche"
 
-#: builtin/checkout.c:1105 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:226
 msgid "update ignored files (default)"
 msgstr "mettre à jour les fichiers ignorés (par défaut)"
 
-#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
+#: builtin/checkout.c:1106 builtin/log.c:1239 parse-options.h:245
 msgid "style"
 msgstr "style"
 
@@ -3630,15 +3746,15 @@
 msgid "--track needs a branch name"
 msgstr "--track requiert un nom de branche"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1157
 msgid "Missing branch name; try -b"
 msgstr "Nom de branche manquant ; essayez -b"
 
-#: builtin/checkout.c:1196
+#: builtin/checkout.c:1194
 msgid "invalid path specification"
 msgstr "spécification de chemin invalide"
 
-#: builtin/checkout.c:1203
+#: builtin/checkout.c:1201
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3648,12 +3764,12 @@
 "en même temps.\n"
 "Souhaitiez-vous extraire '%s' qui ne peut être résolu comme commit ?"
 
-#: builtin/checkout.c:1208
+#: builtin/checkout.c:1206
 #, 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:1212
+#: builtin/checkout.c:1210
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -3729,30 +3845,30 @@
 msgid "Huh (%s)?"
 msgstr "Hein (%s) ?"
 
-#: builtin/clean.c:660
+#: builtin/clean.c:659
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Entrez les motifs à ignorer>> "
 
-#: builtin/clean.c:697
+#: builtin/clean.c:696
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "ATTENTION : Impossible de trouver les éléments correspondant à : %s"
 
-#: builtin/clean.c:718
+#: builtin/clean.c:717
 msgid "Select items to delete"
 msgstr "Sélectionner les éléments à supprimer"
 
-#: builtin/clean.c:758
+#: builtin/clean.c:757
 #, c-format
 msgid "remove %s? "
 msgstr "supprimer %s ? "
 
-#: builtin/clean.c:783
+#: builtin/clean.c:782
 msgid "Bye."
 msgstr "Au revoir."
 
-#: builtin/clean.c:791
+#: builtin/clean.c:790
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -3770,68 +3886,70 @@
 "help                - cet écran\n"
 "?                   - aide pour la sélection en ligne"
 
-#: builtin/clean.c:818
+#: builtin/clean.c:817
 msgid "*** Commands ***"
 msgstr "*** Commandes ***"
 
-#: builtin/clean.c:819
+#: builtin/clean.c:818
 msgid "What now"
 msgstr "Et maintenant ?"
 
-#: builtin/clean.c:827
+#: builtin/clean.c:826
 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:844
+#: builtin/clean.c:843
 msgid "No more files to clean, exiting."
 msgstr "Plus de fichier à nettoyer, sortie."
 
-#: builtin/clean.c:875
+#: builtin/clean.c:874
 msgid "do not print names of files removed"
 msgstr "ne pas afficher les noms des fichiers supprimés"
 
-#: builtin/clean.c:877
+#: builtin/clean.c:876
 msgid "force"
 msgstr "forcer"
 
-#: builtin/clean.c:878
+#: builtin/clean.c:877
 msgid "interactive cleaning"
 msgstr "nettoyage interactif"
 
-#: builtin/clean.c:880
+#: builtin/clean.c:879
 msgid "remove whole directories"
 msgstr "supprimer les répertoires entiers"
 
-#: builtin/clean.c:881 builtin/describe.c:415 builtin/grep.c:716
-#: builtin/ls-files.c:486 builtin/name-rev.c:314 builtin/show-ref.c:185
+#: builtin/clean.c:880 builtin/describe.c:407 builtin/grep.c:714
+#: builtin/ls-files.c:486 builtin/name-rev.c:311 builtin/show-ref.c:185
 msgid "pattern"
 msgstr "motif"
 
-#: builtin/clean.c:882
+#: builtin/clean.c:881
 msgid "add <pattern> to ignore rules"
 msgstr "ajouter <motif> aux règles ignore"
 
-#: builtin/clean.c:883
+#: builtin/clean.c:882
 msgid "remove ignored files, too"
 msgstr "supprimer les fichiers ignorés, aussi"
 
-#: builtin/clean.c:885
+#: builtin/clean.c:884
 msgid "remove only ignored files"
 msgstr "supprimer seulement les fichiers ignorés"
 
-#: builtin/clean.c:903
+#: builtin/clean.c:902
 msgid "-x and -X cannot be used together"
 msgstr "-x et -X ne peuvent pas être utilisés ensemble"
 
-#: builtin/clean.c:907
+#: builtin/clean.c:906
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
-msgstr "clean.requireForce positionné à true et ni -i, -n ou -f fourni ; refus de nettoyer"
+msgstr ""
+"clean.requireForce positionné à true et ni -i, -n ou -f fourni ; refus de "
+"nettoyer"
 
-#: builtin/clean.c:910
+#: builtin/clean.c:909
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -3839,145 +3957,145 @@
 "clean.requireForce à true par défaut et ni -i, -n ou -f fourni ; refus de "
 "nettoyer"
 
-#: builtin/clone.c:36
+#: builtin/clone.c:37
 msgid "git clone [options] [--] <repo> [<dir>]"
 msgstr "git clone [options] [--] <dépôt> [<répertoire>]"
 
-#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:504
+#: builtin/clone.c:65 builtin/fetch.c:112 builtin/merge.c:223
+#: builtin/push.c:514
 msgid "force progress reporting"
 msgstr "forcer l'affichage de l'état d'avancement"
 
-#: builtin/clone.c:66
+#: builtin/clone.c:67
 msgid "don't create a checkout"
 msgstr "ne pas créer d'extraction"
 
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
+#: builtin/clone.c:68 builtin/clone.c:70 builtin/init-db.c:488
 msgid "create a bare repository"
 msgstr "créer un dépôt nu"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:72
 msgid "create a mirror repository (implies bare)"
 msgstr "créer un dépôt miroir (implique dépôt nu)"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:74
 msgid "to clone from a local repository"
 msgstr "pour cloner depuis un dépôt local"
 
-#: builtin/clone.c:75
+#: builtin/clone.c:76
 msgid "don't use local hardlinks, always copy"
 msgstr "ne pas utiliser de liens durs locaux, toujours copier"
 
-#: builtin/clone.c:77
+#: builtin/clone.c:78
 msgid "setup as shared repository"
 msgstr "régler comme dépôt partagé"
 
-#: builtin/clone.c:79 builtin/clone.c:81
+#: builtin/clone.c:80 builtin/clone.c:82
 msgid "initialize submodules in the clone"
 msgstr "initialiser les sous-modules dans le clone"
 
-#: builtin/clone.c:82 builtin/init-db.c:483
+#: builtin/clone.c:83 builtin/init-db.c:485
 msgid "template-directory"
 msgstr "répertoire-modèle"
 
-#: builtin/clone.c:83 builtin/init-db.c:484
+#: builtin/clone.c:84 builtin/init-db.c:486
 msgid "directory from which templates will be used"
 msgstr "répertoire depuis lequel les modèles vont être utilisés"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:86
 msgid "reference repository"
 msgstr "dépôt de référence"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44
 msgid "name"
 msgstr "nom"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:88
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "utiliser <nom> au lieu de 'origin' pour suivre la branche amont"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:90
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "extraire <branche> au lieu de la HEAD du répertoire distant"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:92
 msgid "path to git-upload-pack on the remote"
 msgstr "chemin vers git-upload-pack sur le serveur distant"
 
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
+#: builtin/clone.c:93 builtin/fetch.c:113 builtin/grep.c:659
 msgid "depth"
 msgstr "profondeur"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:94
 msgid "create a shallow clone of that depth"
 msgstr "créer un clone superficiel de cette profondeur"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:96
 msgid "clone only one branch, HEAD or --branch"
 msgstr "cloner seulement une branche, HEAD ou --branch"
 
-#: builtin/clone.c:96 builtin/init-db.c:492
+#: builtin/clone.c:97 builtin/init-db.c:494
 msgid "gitdir"
 msgstr "gitdir"
 
-#: builtin/clone.c:97 builtin/init-db.c:493
+#: builtin/clone.c:98 builtin/init-db.c:495
 msgid "separate git dir from working tree"
 msgstr "séparer le répertoire git de la copie de travail"
 
-#: builtin/clone.c:98
+#: builtin/clone.c:99
 msgid "key=value"
 msgstr "clé=valeur"
 
-#: builtin/clone.c:99
+#: builtin/clone.c:100
 msgid "set config inside the new repository"
 msgstr "régler la configuration dans le nouveau dépôt"
 
-#: builtin/clone.c:252
+#: builtin/clone.c:253
 #, 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:256
+#: builtin/clone.c:257
 #, c-format
 msgid "reference repository '%s' is shallow"
 msgstr "le dépôt de référence '%s' est superficiel"
 
-#: builtin/clone.c:259
+#: builtin/clone.c:260
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr "le dépôt de référence '%s' est greffé"
 
-#: builtin/clone.c:321
+#: builtin/clone.c:322
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr "échec de la création du répertoire '%s'"
 
-#: builtin/clone.c:323 builtin/diff.c:83
+#: builtin/clone.c:324 builtin/diff.c:84
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "échec du stat de '%s'"
 
-#: builtin/clone.c:325
+#: builtin/clone.c:326
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s existe et n'est pas un répertoire"
 
-#: builtin/clone.c:339
+#: builtin/clone.c:340
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "échec du stat de %s\n"
 
-#: builtin/clone.c:361
+#: builtin/clone.c:362
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "échec de la création du lien '%s'"
 
-#: builtin/clone.c:365
+#: builtin/clone.c:366
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "échec de la copie vers '%s'"
 
-#: builtin/clone.c:388 builtin/clone.c:565
+#: builtin/clone.c:389 builtin/clone.c:563
 #, c-format
 msgid "done.\n"
 msgstr "fait.\n"
@@ -3992,27 +4110,27 @@
 "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:480
+#: builtin/clone.c:478
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Impossible de trouver la branche distante '%s' à cloner."
 
-#: builtin/clone.c:560
+#: builtin/clone.c:558
 #, c-format
 msgid "Checking connectivity... "
 msgstr "Vérification de la connectivité... "
 
-#: builtin/clone.c:563
+#: builtin/clone.c:561
 msgid "remote did not send all necessary objects"
 msgstr "le serveur distant n'a pas envoyé tous les objets nécessaires"
 
-#: builtin/clone.c:626
+#: builtin/clone.c:625
 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:657
+#: builtin/clone.c:656
 msgid "unable to checkout working tree"
 msgstr "impossible d'extraire la copie de travail"
 
@@ -4038,66 +4156,66 @@
 msgid "repository '%s' does not exist"
 msgstr "le dépôt '%s' n'existe pas"
 
-#: builtin/clone.c:802
-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:805
-msgid "source repository is shallow, ignoring --local"
-msgstr "le dépôt source est superficiel, option --local ignorée"
-
-#: builtin/clone.c:810
-msgid "--local is ignored"
-msgstr "--local est ignoré"
-
-#: builtin/clone.c:814 builtin/fetch.c:1119
+#: builtin/clone.c:802 builtin/fetch.c:1155
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "la profondeur %s n'est pas un entier positif"
 
-#: builtin/clone.c:824
+#: builtin/clone.c:812
 #, 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:834
+#: builtin/clone.c:822
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "la copie de travail '%s' existe déjà."
 
-#: builtin/clone.c:847 builtin/clone.c:859
+#: builtin/clone.c:835 builtin/clone.c:847
 #, 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:850
+#: builtin/clone.c:838
 #, 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:869
+#: builtin/clone.c:857
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Clonage dans le dépôt nu '%s'\n"
 
-#: builtin/clone.c:871
+#: builtin/clone.c:859
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Clonage dans '%s'...\n"
 
-#: builtin/clone.c:906
+#: builtin/clone.c:895
+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:898
+msgid "source repository is shallow, ignoring --local"
+msgstr "le dépôt source est superficiel, option --local ignorée"
+
+#: builtin/clone.c:903
+msgid "--local is ignored"
+msgstr "--local est ignoré"
+
+#: builtin/clone.c:907
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Je ne sais pas cloner %s"
 
-#: builtin/clone.c:957 builtin/clone.c:965
+#: builtin/clone.c:958 builtin/clone.c:966
 #, 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:968
+#: builtin/clone.c:969
 msgid "You appear to have cloned an empty repository."
 msgstr "Vous semblez avoir cloné un dépôt vide."
 
@@ -4133,15 +4251,41 @@
 msgid "--command must be the first argument"
 msgstr "--command doit être le premier argument"
 
-#: builtin/commit.c:36
+#: builtin/commit.c:37
 msgid "git commit [options] [--] <pathspec>..."
 msgstr "git commit [options] [--] <spécification-de-chemin>..."
 
-#: builtin/commit.c:41
+#: builtin/commit.c:42
 msgid "git status [options] [--] <pathspec>..."
 msgstr "git status [options] [--] <spécification-de-chemin>..."
 
-#: builtin/commit.c:46
+#: builtin/commit.c:47
+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 ""
+"Votre nom et votre adresse e-mail ont été configurés automatiquement en se\n"
+"fondant sur votre nom d'utilisateur et le nom de votre machine. Veuillez \n"
+"vérifier qu'ils sont corrects. Vous pouvez supprimer ce message en les \n"
+"paramétrant explicitement. Lancez les commandes suivantes et suivez les\n"
+"instruction dans votre éditeur pour éditer votre fichier de configuration :\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"Après ceci, vous pouvez corriger l'identité utilisée pour cette validation avec :\n"
+"\n"
+"    git commit --amend --reset-author\n"
+
+#: builtin/commit.c:60
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4167,7 +4311,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:58
+#: builtin/commit.c:72
 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"
@@ -4178,7 +4322,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:63
+#: builtin/commit.c:77
 msgid ""
 "The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
 "If you wish to commit it anyway, use:\n"
@@ -4193,11 +4337,11 @@
 "    git commit --allow-empty\n"
 "\n"
 
-#: builtin/commit.c:70
+#: builtin/commit.c:84
 msgid "Otherwise, please use 'git reset'\n"
 msgstr "Sinon, veuillez utiliser 'git reset'\n"
 
-#: builtin/commit.c:73
+#: builtin/commit.c:87
 msgid ""
 "If you wish to skip this commit, use:\n"
 "\n"
@@ -4213,93 +4357,119 @@
 "Puis \"git cherry-pick --continue\" continuera le picorage \n"
 "des commits restants.\n"
 
-#: builtin/commit.c:288
+#: builtin/commit.c:302
 msgid "failed to unpack HEAD tree object"
 msgstr "échec du dépaquetage de l'objet arbre HEAD"
 
-#: builtin/commit.c:330
+#: builtin/commit.c:342
 msgid "unable to create temporary index"
 msgstr "impossible de créer l'index temporaire"
 
-#: builtin/commit.c:336
+#: builtin/commit.c:348
 msgid "interactive add failed"
 msgstr "échec de l'ajout interactif"
 
-#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
+#: builtin/commit.c:359
+msgid "unable to write index file"
+msgstr "impossible d'écrire le fichier d'index"
+
+#: builtin/commit.c:361
+msgid "unable to update temporary index"
+msgstr "impossible de mettre à jour l'index temporaire"
+
+#: builtin/commit.c:363
+msgid "Failed to update main cache tree"
+msgstr "Impossible de mettre à jour l'arbre de cache principal"
+
+#: builtin/commit.c:387 builtin/commit.c:412 builtin/commit.c:461
 msgid "unable to write new_index file"
 msgstr "impossible d'écrire le fichier new_index"
 
-#: builtin/commit.c:421
+#: builtin/commit.c:443
 msgid "cannot do a partial commit during a merge."
 msgstr "impossible de faire une validation partielle pendant une fusion."
 
-#: builtin/commit.c:423
+#: builtin/commit.c:445
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "impossible de faire une validation partielle pendant un picorage."
 
-#: builtin/commit.c:433
+#: builtin/commit.c:454
 msgid "cannot read the index"
 msgstr "impossible de lire l'index"
 
-#: builtin/commit.c:453
+#: builtin/commit.c:473
 msgid "unable to write temporary index file"
 msgstr "impossible d'écrire le fichier d'index temporaire"
 
-#: builtin/commit.c:544 builtin/commit.c:550
+#: builtin/commit.c:592
 #, c-format
-msgid "invalid commit: %s"
-msgstr "commit invalide : %s"
+msgid "commit '%s' lacks author header"
+msgstr "entête d'auteur manquant dans le commit '%s'"
 
-#: builtin/commit.c:572
+#: builtin/commit.c:594
+#, c-format
+msgid "commit '%s' has malformed author line"
+msgstr "le commit '%s' a une ligne d'auteur malformée"
+
+#: builtin/commit.c:613
 msgid "malformed --author parameter"
 msgstr "paramètre --author mal formé"
 
-#: builtin/commit.c:592
+#: builtin/commit.c:621
+#, c-format
+msgid "invalid date format: %s"
+msgstr "format de date invalide : %s"
+
+#: builtin/commit.c:642
 #, c-format
 msgid "Malformed ident string: '%s'"
 msgstr "Chaîne ident mal formée : '%s'"
 
-#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
+#: builtin/commit.c:675
+msgid ""
+"unable to select a comment character that is not used\n"
+"in the current commit message"
+msgstr ""
+"impossible de sélectionner un caractère de commentaire\n"
+"qui n'est pas utilisé dans le message de validation actuel"
+
+#: builtin/commit.c:712 builtin/commit.c:745 builtin/commit.c:1120
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "impossible de rechercher le commit %s"
 
-#: builtin/commit.c:641 builtin/shortlog.c:273
+#: builtin/commit.c:724 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:643
+#: builtin/commit.c:726
 msgid "could not read log from standard input"
 msgstr "impossible de lire le journal depuis l'entrée standard"
 
-#: builtin/commit.c:647
+#: builtin/commit.c:730
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "impossible de lire le fichier de journal '%s'"
 
-#: builtin/commit.c:654
-msgid "commit has empty message"
-msgstr "le commit a un message vide"
-
-#: builtin/commit.c:670
+#: builtin/commit.c:752
 msgid "could not read MERGE_MSG"
 msgstr "impossible de lire MERGE_MSG"
 
-#: builtin/commit.c:674
+#: builtin/commit.c:756
 msgid "could not read SQUASH_MSG"
 msgstr "impossible de lire SQUASH_MSG"
 
-#: builtin/commit.c:678
+#: builtin/commit.c:760
 #, c-format
 msgid "could not read '%s'"
 msgstr "impossible de lire '%s'"
 
-#: builtin/commit.c:749
+#: builtin/commit.c:831
 msgid "could not write commit template"
 msgstr "impossible d'écrire le modèle de commit"
 
-#: builtin/commit.c:764
+#: builtin/commit.c:849
 #, c-format
 msgid ""
 "\n"
@@ -4314,7 +4484,7 @@
 "\t%s\n"
 "et essayez à nouveau.\n"
 
-#: builtin/commit.c:769
+#: builtin/commit.c:854
 #, c-format
 msgid ""
 "\n"
@@ -4329,7 +4499,7 @@
 "\t%s\n"
 "et essayez à nouveau.\n"
 
-#: builtin/commit.c:782
+#: builtin/commit.c:867
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4339,7 +4509,7 @@
 "commençant par '%c' seront ignorées, et un message vide abandonne la "
 "validation.\n"
 
-#: builtin/commit.c:789
+#: builtin/commit.c:874
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4350,142 +4520,147 @@
 "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:802
+#: builtin/commit.c:888
 #, c-format
-msgid "%sAuthor:    %s"
-msgstr "%sAuteur :     %s"
+msgid "%sAuthor:    %.*s <%.*s>"
+msgstr "%sAuteur :     %.*s <%.*s>"
 
-#: builtin/commit.c:809
+#: builtin/commit.c:896
 #, c-format
-msgid "%sCommitter: %s"
-msgstr "%sValidateur : %s"
+msgid "%sDate:      %s"
+msgstr "%sDate :       %s"
 
-#: builtin/commit.c:829
+#: builtin/commit.c:903
+#, c-format
+msgid "%sCommitter: %.*s <%.*s>"
+msgstr "%sValidateur : %.*s <%.*s>"
+
+#: builtin/commit.c:921
 msgid "Cannot read index"
 msgstr "Impossible de lire l'index"
 
-#: builtin/commit.c:872
+#: builtin/commit.c:978
 msgid "Error building trees"
 msgstr "Erreur lors de la construction des arbres"
 
-#: builtin/commit.c:887 builtin/tag.c:391
+#: builtin/commit.c:993 builtin/tag.c:495
 #, 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:989
+#: builtin/commit.c:1095
 #, c-format
 msgid "No existing author found with '%s'"
 msgstr "Aucun auteur existant trouvé avec '%s'"
 
-#: builtin/commit.c:1004 builtin/commit.c:1244
+#: builtin/commit.c:1110 builtin/commit.c:1350
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Mode de fichier non suivi invalide '%s'"
 
-#: builtin/commit.c:1041
+#: builtin/commit.c:1147
 msgid "--long and -z are incompatible"
 msgstr "--long et -z sont incompatibles"
 
-#: builtin/commit.c:1071
+#: builtin/commit.c:1177
 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:1080
+#: builtin/commit.c:1186
 msgid "You have nothing to amend."
 msgstr "Il n'y a rien à corriger."
 
-#: builtin/commit.c:1083
+#: builtin/commit.c:1189
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Vous êtes en pleine fusion -- impossible de corriger (amend)."
 
-#: builtin/commit.c:1085
+#: builtin/commit.c:1191
 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:1088
+#: builtin/commit.c:1194
 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:1098
+#: builtin/commit.c:1204
 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:1100
+#: builtin/commit.c:1206
 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:1108
+#: builtin/commit.c:1214
 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:1125
+#: builtin/commit.c:1231
 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:1127
+#: builtin/commit.c:1233
 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:1129
+#: builtin/commit.c:1235
 msgid "Clever... amending the last one with dirty index."
 msgstr "Malin... correction du dernier avec un index sale."
 
-#: builtin/commit.c:1131
+#: builtin/commit.c:1237
 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:1143 builtin/tag.c:639
+#: builtin/commit.c:1249 builtin/tag.c:728
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Mode de nettoyage invalide %s"
 
-#: builtin/commit.c:1148
+#: builtin/commit.c:1254
 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:1258 builtin/commit.c:1516
+#: builtin/commit.c:1364 builtin/commit.c:1644
 msgid "show status concisely"
 msgstr "afficher le statut avec concision"
 
-#: builtin/commit.c:1260 builtin/commit.c:1518
+#: builtin/commit.c:1366 builtin/commit.c:1646
 msgid "show branch information"
 msgstr "afficher l'information de branche"
 
-#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
+#: builtin/commit.c:1368 builtin/commit.c:1648 builtin/push.c:500
 msgid "machine-readable output"
 msgstr "sortie pour traitement automatique"
 
-#: builtin/commit.c:1265 builtin/commit.c:1522
+#: builtin/commit.c:1371 builtin/commit.c:1650
 msgid "show status in long format (default)"
 msgstr "afficher le statut en format long (par défaut)"
 
-#: builtin/commit.c:1268 builtin/commit.c:1525
+#: builtin/commit.c:1374 builtin/commit.c:1653
 msgid "terminate entries with NUL"
 msgstr "terminer les éléments par NUL"
 
-#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:514
+#: builtin/commit.c:1376 builtin/commit.c:1656 builtin/fast-export.c:980
+#: builtin/fast-export.c:983 builtin/tag.c:603
 msgid "mode"
 msgstr "mode"
 
-#: builtin/commit.c:1271 builtin/commit.c:1528
+#: builtin/commit.c:1377 builtin/commit.c:1656
 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:1274
+#: builtin/commit.c:1380
 msgid "show ignored files"
 msgstr "afficher les fichiers ignorés"
 
-#: builtin/commit.c:1275 parse-options.h:153
+#: builtin/commit.c:1381 parse-options.h:153
 msgid "when"
 msgstr "quand"
 
-#: builtin/commit.c:1276
+#: builtin/commit.c:1382
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -4493,220 +4668,212 @@
 "ignorer les modifications dans les sous-modules, \"quand\" facultatif : all "
 "(tous), dirty (sale), untracked (non suivi). (Défaut : all)"
 
-#: builtin/commit.c:1278
+#: builtin/commit.c:1384
 msgid "list untracked files in columns"
 msgstr "afficher les fichiers non suivis en colonnes"
 
-#: builtin/commit.c:1347
+#: builtin/commit.c:1471
 msgid "couldn't look up newly created commit"
 msgstr "impossible de retrouver le commit nouvellement créé"
 
-#: builtin/commit.c:1349
+#: builtin/commit.c:1473
 msgid "could not parse newly created commit"
 msgstr "impossible d'analyser le commit nouvellement créé"
 
-#: builtin/commit.c:1390
+#: builtin/commit.c:1518
 msgid "detached HEAD"
 msgstr "HEAD détachée"
 
-#: builtin/commit.c:1392
+#: builtin/commit.c:1521
 msgid " (root-commit)"
 msgstr " (commit racine)"
 
-#: builtin/commit.c:1486
+#: builtin/commit.c:1614
 msgid "suppress summary after successful commit"
 msgstr "supprimer le résumé après une validation réussie"
 
-#: builtin/commit.c:1487
+#: builtin/commit.c:1615
 msgid "show diff in commit message template"
 msgstr "afficher les diff dans le modèle de message de validation"
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1617
 msgid "Commit message options"
 msgstr "Options du message de validation"
 
-#: builtin/commit.c:1490 builtin/tag.c:512
+#: builtin/commit.c:1618 builtin/tag.c:601
 msgid "read message from file"
 msgstr "lire le message depuis un fichier"
 
-#: builtin/commit.c:1491
+#: builtin/commit.c:1619
 msgid "author"
 msgstr "auteur"
 
-#: builtin/commit.c:1491
+#: builtin/commit.c:1619
 msgid "override author for commit"
 msgstr "remplacer l'auteur pour la validation"
 
-#: builtin/commit.c:1492 builtin/gc.c:272
+#: builtin/commit.c:1620 builtin/gc.c:275
 msgid "date"
 msgstr "date"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1620
 msgid "override date for commit"
 msgstr "remplacer la date pour la validation"
 
-#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
-#: builtin/notes.c:566 builtin/tag.c:510
+#: builtin/commit.c:1621 builtin/merge.c:217 builtin/notes.c:408
+#: builtin/notes.c:565 builtin/tag.c:599
 msgid "message"
 msgstr "message"
 
-#: builtin/commit.c:1493
+#: builtin/commit.c:1621
 msgid "commit message"
 msgstr "message de validation"
 
-#: builtin/commit.c:1494
+#: builtin/commit.c:1622
 msgid "reuse and edit message from specified commit"
 msgstr "réutiliser et éditer le message du commit spécifié"
 
-#: builtin/commit.c:1495
+#: builtin/commit.c:1623
 msgid "reuse message from specified commit"
 msgstr "réutiliser le message du commit spécifié"
 
-#: builtin/commit.c:1496
+#: builtin/commit.c:1624
 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:1497
+#: builtin/commit.c:1625
 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:1498
+#: builtin/commit.c:1626
 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:1499 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1627 builtin/log.c:1191 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "ajouter une entrée Signed-off-by :"
 
-#: builtin/commit.c:1500
+#: builtin/commit.c:1628
 msgid "use specified template file"
 msgstr "utiliser le fichier de modèle spécifié"
 
-#: builtin/commit.c:1501
+#: builtin/commit.c:1629
 msgid "force edit of commit"
 msgstr "forcer l'édition du commit"
 
-#: builtin/commit.c:1502
+#: builtin/commit.c:1630
 msgid "default"
 msgstr "défaut"
 
-#: builtin/commit.c:1502 builtin/tag.c:515
+#: builtin/commit.c:1630 builtin/tag.c:604
 msgid "how to strip spaces and #comments from message"
 msgstr "comment éliminer les espaces et les commentaires # du message"
 
-#: builtin/commit.c:1503
+#: builtin/commit.c:1631
 msgid "include status in commit message template"
 msgstr "inclure le statut dans le modèle de message de validation"
 
-#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
-#: builtin/tag.c:516
+#: builtin/commit.c:1632 builtin/merge.c:224 builtin/revert.c:92
+#: builtin/tag.c:605
 msgid "key-id"
 msgstr "id de clé"
 
-#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
+#: builtin/commit.c:1633 builtin/merge.c:225 builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "signer la validation avec GPG"
 
-#: builtin/commit.c:1508
+#: builtin/commit.c:1636
 msgid "Commit contents options"
 msgstr "Valider les options des contenus"
 
-#: builtin/commit.c:1509
+#: builtin/commit.c:1637
 msgid "commit all changed files"
 msgstr "valider tous les fichiers modifiés"
 
-#: builtin/commit.c:1510
+#: builtin/commit.c:1638
 msgid "add specified files to index for commit"
 msgstr "ajouter les fichiers spécifiés à l'index pour la validation"
 
-#: builtin/commit.c:1511
+#: builtin/commit.c:1639
 msgid "interactively add files"
 msgstr "ajouter des fichiers en mode interactif"
 
-#: builtin/commit.c:1512
+#: builtin/commit.c:1640
 msgid "interactively add changes"
 msgstr "ajouter les modifications en mode interactif"
 
-#: builtin/commit.c:1513
+#: builtin/commit.c:1641
 msgid "commit only specified files"
 msgstr "valider seulement les fichiers spécifiés"
 
-#: builtin/commit.c:1514
+#: builtin/commit.c:1642
 msgid "bypass pre-commit hook"
 msgstr "éviter d'utiliser le crochet pre-commit"
 
-#: builtin/commit.c:1515
+#: builtin/commit.c:1643
 msgid "show what would be committed"
 msgstr "afficher ce qui serait validé"
 
-#: builtin/commit.c:1526
+#: builtin/commit.c:1654
 msgid "amend previous commit"
 msgstr "corriger la validation précédente"
 
-#: builtin/commit.c:1527
+#: builtin/commit.c:1655
 msgid "bypass post-rewrite hook"
 msgstr "éviter d'utiliser le crochet post-rewrite"
 
-#: builtin/commit.c:1532
+#: builtin/commit.c:1660
 msgid "ok to record an empty change"
 msgstr "accepter d'enregistrer une modification vide"
 
-#: builtin/commit.c:1534
+#: builtin/commit.c:1662
 msgid "ok to record a change with an empty message"
 msgstr "accepter d'enregistrer une modification avec un message vide"
 
-#: builtin/commit.c:1562
+#: builtin/commit.c:1691
 msgid "could not parse HEAD commit"
 msgstr "impossible d'analyser le commit HEAD"
 
-#: builtin/commit.c:1601 builtin/merge.c:518
+#: builtin/commit.c:1730 builtin/merge.c:518
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "impossible d'ouvrir '%s' en lecture"
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1737
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Fichier MERGE_HEAD corrompu (%s)"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1744
 msgid "could not read MERGE_MODE"
 msgstr "impossible de lire MERGE_MODE"
 
-#: builtin/commit.c:1634
+#: builtin/commit.c:1763
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "impossible de lire le message de validation : %s"
 
-#: builtin/commit.c:1645
+#: builtin/commit.c:1774
 #, 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:1650
+#: builtin/commit.c:1779
 #, 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:1665 builtin/merge.c:857 builtin/merge.c:882
+#: builtin/commit.c:1794 builtin/merge.c:850 builtin/merge.c:875
 msgid "failed to write commit object"
 msgstr "échec de l'écriture de l'objet commit"
 
-#: builtin/commit.c:1686
-msgid "cannot lock HEAD ref"
-msgstr "impossible de verrouiller la référence HEAD"
-
-#: builtin/commit.c:1690
-msgid "cannot update HEAD ref"
-msgstr "impossible de mettre à jour la référence HEAD"
-
-#: builtin/commit.c:1701
+#: builtin/commit.c:1827
 msgid ""
 "Repository has been updated, but unable to write\n"
-"new_index file. Check that disk is not full or quota is\n"
+"new_index file. Check that disk is not full and quota is\n"
 "not exceeded, and then \"git reset HEAD\" to recover."
 msgstr ""
 "Le dépôt a été mis à jour, mais impossible d'écrire le fichier\n"
@@ -4842,63 +5009,87 @@
 msgid "respect include directives on lookup"
 msgstr "respecter les directives d'inclusion lors de la recherche"
 
-#: builtin/count-objects.c:82
+#: builtin/config.c:315
+msgid "unable to parse default color value"
+msgstr "impossible de lire la valeur de couleur par défaut"
+
+#: builtin/config.c:455
+#, c-format
+msgid ""
+"# This is Git's per-user configuration file.\n"
+"[core]\n"
+"# Please adapt and uncomment the following lines:\n"
+"#\tuser = %s\n"
+"#\temail = %s\n"
+msgstr ""
+"# Ceci est le fichier de configuration personnel.\n"
+"[core]\n"
+"# Veuillez adapter et décommenter les lignes suivantes :\n"
+"#\tuser = %s\n"
+"#\temail = %s\n"
+
+#: builtin/config.c:590
+#, c-format
+msgid "cannot create configuration file %s"
+msgstr "création impossible du fichier de configuration '%s'"
+
+#: builtin/count-objects.c:55
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:97
+#: builtin/count-objects.c:65
 msgid "print sizes in human readable format"
 msgstr "affiche les tailles dans un format humainement lisible"
 
-#: builtin/describe.c:16
+#: builtin/describe.c:17
 msgid "git describe [options] <commit-ish>*"
 msgstr "git describe [options] <commit ou apparenté>*"
 
-#: builtin/describe.c:17
+#: builtin/describe.c:18
 msgid "git describe [options] --dirty"
 msgstr "git describe [options] --dirty"
 
-#: builtin/describe.c:225
+#: builtin/describe.c:217
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "l'étiquette annotée %s n'est pas disponible"
 
-#: builtin/describe.c:229
+#: builtin/describe.c:221
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr "l'étiquette annotée %s n'a pas de nom embarqué"
 
-#: builtin/describe.c:231
+#: builtin/describe.c:223
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "l'étiquette '%s' est en fait '%s'"
 
-#: builtin/describe.c:258
+#: builtin/describe.c:250 builtin/log.c:452
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "%s n'est pas un nom d'objet valide"
 
-#: builtin/describe.c:261
+#: builtin/describe.c:253
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr "%s n'est pas un objet '%s' valide"
 
-#: builtin/describe.c:278
+#: builtin/describe.c:270
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr "aucune étiquette ne correspond parfaitement à '%s'"
 
-#: builtin/describe.c:280
+#: builtin/describe.c:272
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "recherche de la description de %s\n"
 
-#: builtin/describe.c:327
+#: builtin/describe.c:319
 #, c-format
 msgid "finished search at %s\n"
 msgstr "recherche terminée à %s\n"
 
-#: builtin/describe.c:354
+#: builtin/describe.c:346
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -4907,7 +5098,7 @@
 "Aucune étiquette annotée ne peut décrire '%s'.\n"
 "Cependant, il existe des étiquettes non-annotées : essayez avec --tags."
 
-#: builtin/describe.c:358
+#: builtin/describe.c:350
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -4916,12 +5107,12 @@
 "Aucune étiquette ne peut décrire '%s'.\n"
 "Essayez --always, ou créez des étiquettes."
 
-#: builtin/describe.c:379
+#: builtin/describe.c:371
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "%lu commits parcourus\n"
 
-#: builtin/describe.c:382
+#: builtin/describe.c:374
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
@@ -4931,137 +5122,149 @@
 "affichées\n"
 "abandon de la recherche à %s\n"
 
-#: builtin/describe.c:404
+#: builtin/describe.c:396
 msgid "find the tag that comes after the commit"
 msgstr "rechercher l'étiquette qui suit le commit"
 
-#: builtin/describe.c:405
+#: builtin/describe.c:397
 msgid "debug search strategy on stderr"
 msgstr "déboguer la stratégie de recherche sur stderr"
 
-#: builtin/describe.c:406
+#: builtin/describe.c:398
 msgid "use any ref"
 msgstr "utiliser n'importe quelle référence"
 
-#: builtin/describe.c:407
+#: builtin/describe.c:399
 msgid "use any tag, even unannotated"
 msgstr "utiliser n'importe quelle étiquette, même non-annotée"
 
-#: builtin/describe.c:408
+#: builtin/describe.c:400
 msgid "always use long format"
 msgstr "toujours utiliser le format long"
 
-#: builtin/describe.c:409
+#: builtin/describe.c:401
 msgid "only follow first parent"
 msgstr "ne suivre que le premier parent"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:404
 msgid "only output exact matches"
 msgstr "n'afficher que les correspondances exactes"
 
-#: builtin/describe.c:414
+#: builtin/describe.c:406
 msgid "consider <n> most recent tags (default: 10)"
 msgstr ""
 "considérer uniquement les <n> étiquettes le plus récentes (défaut : 10)"
 
-#: builtin/describe.c:416
+#: builtin/describe.c:408
 msgid "only consider tags matching <pattern>"
 msgstr "ne considérer que les étiquettes correspondant à <motif>"
 
-#: builtin/describe.c:418 builtin/name-rev.c:321
+#: builtin/describe.c:410 builtin/name-rev.c:318
 msgid "show abbreviated commit object as fallback"
 msgstr "afficher les objets commits abrégés en dernier recours"
 
-#: builtin/describe.c:419
+#: builtin/describe.c:411
 msgid "mark"
 msgstr "marque"
 
-#: builtin/describe.c:420
+#: builtin/describe.c:412
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr "ajouter <marque> si la copie de travail est sale (défaut : \"-dirty\")"
 
-#: builtin/describe.c:438
+#: builtin/describe.c:430
 msgid "--long is incompatible with --abbrev=0"
 msgstr "--long et --abbrev=0 sont incompatibles"
 
-#: builtin/describe.c:464
+#: builtin/describe.c:456
 msgid "No names found, cannot describe anything."
 msgstr "aucun nom trouvé, impossible de décrire quoi que ce soit."
 
-#: builtin/describe.c:484
+#: builtin/describe.c:476
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "--dirty est incompatible avec la spécification de commits ou assimilés"
 
-#: builtin/diff.c:85
+#: builtin/diff.c:86
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "'%s' : n'est pas un fichier régulier ni un lien symbolique"
 
-#: builtin/diff.c:236
+#: builtin/diff.c:237
 #, c-format
 msgid "invalid option: %s"
 msgstr "option invalide : %s"
 
-#: builtin/diff.c:357
+#: builtin/diff.c:358
 msgid "Not a git repository"
 msgstr "Ce n'est pas un dépôt git !"
 
-#: builtin/diff.c:400
+#: builtin/diff.c:401
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "objet spécifié '%s' invalide."
 
-#: builtin/diff.c:409
+#: builtin/diff.c:410
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "plus de deux blobs spécifiés : '%s'"
 
-#: builtin/diff.c:416
+#: builtin/diff.c:417
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "objet non géré '%s' spécifié."
 
-#: builtin/fast-export.c:22
+#: builtin/fast-export.c:24
 msgid "git fast-export [rev-list-opts]"
 msgstr "git fast-export [options-de-liste-de-révisions]"
 
-#: builtin/fast-export.c:673
+#: builtin/fast-export.c:979
 msgid "show progress after <n> objects"
 msgstr "afficher la progression après <n> objets"
 
-#: builtin/fast-export.c:675
+#: builtin/fast-export.c:981
 msgid "select handling of signed tags"
 msgstr "sélectionner la gestion des étiquettes signées"
 
-#: builtin/fast-export.c:678
+#: builtin/fast-export.c:984
 msgid "select handling of tags that tag filtered objects"
 msgstr ""
 "sélectionner la gestion des étiquettes qui pointent sur des objets filtrés"
 
-#: builtin/fast-export.c:681
+#: builtin/fast-export.c:987
 msgid "Dump marks to this file"
 msgstr "Enregistrer les marques dans ce fichier"
 
-#: builtin/fast-export.c:683
+#: builtin/fast-export.c:989
 msgid "Import marks from this file"
 msgstr "importer les marques depuis ce fichier"
 
-#: builtin/fast-export.c:685
+#: builtin/fast-export.c:991
 msgid "Fake a tagger when tags lack one"
 msgstr "falsifier un auteur d'étiquette si l'étiquette n'en présente pas"
 
-#: builtin/fast-export.c:687
+#: builtin/fast-export.c:993
 msgid "Output full tree for each commit"
 msgstr "Afficher l'arbre complet pour chaque commit"
 
-#: builtin/fast-export.c:689
+#: builtin/fast-export.c:995
 msgid "Use the done feature to terminate the stream"
 msgstr "Utiliser la fonction \"done\" pour terminer le flux"
 
-#: builtin/fast-export.c:690
+#: builtin/fast-export.c:996
 msgid "Skip output of blob data"
 msgstr "Sauter l'affichage de données de blob"
 
+#: builtin/fast-export.c:997
+msgid "refspec"
+msgstr "spécificateur de référence"
+
+#: builtin/fast-export.c:998
+msgid "Apply refspec to exported refs"
+msgstr "Appliquer le spécificateur de référence aux références exportées"
+
+#: builtin/fast-export.c:999
+msgid "anonymize output"
+msgstr "anonymise la sortie"
+
 #: builtin/fetch.c:20
 msgid "git fetch [<options>] [<repository> [<refspec>...]]"
 msgstr "git fetch [<options>] [<dépôt> [<spécification-de-référence>...]]"
@@ -5078,156 +5281,164 @@
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<options>]"
 
-#: builtin/fetch.c:75
+#: builtin/fetch.c:90
 msgid "fetch from all remotes"
 msgstr "récupérer depuis tous le dépôts distants"
 
-#: builtin/fetch.c:77
+#: builtin/fetch.c:92
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "ajouter à .git/FETCH_HEAD au lieu de l'écraser"
 
-#: builtin/fetch.c:79
+#: builtin/fetch.c:94
 msgid "path to upload pack on remote end"
 msgstr "chemin vers lequel télécharger le paquet sur le poste distant"
 
-#: builtin/fetch.c:80
+#: builtin/fetch.c:95
 msgid "force overwrite of local branch"
 msgstr "forcer l'écrasement de la branche locale"
 
-#: builtin/fetch.c:82
+#: builtin/fetch.c:97
 msgid "fetch from multiple remotes"
 msgstr "récupérer depuis plusieurs dépôts distants"
 
-#: builtin/fetch.c:84
+#: builtin/fetch.c:99
 msgid "fetch all tags and associated objects"
 msgstr "récupérer toutes les étiquettes et leurs objets associés"
 
-#: builtin/fetch.c:86
+#: builtin/fetch.c:101
 msgid "do not fetch all tags (--no-tags)"
 msgstr "ne pas récupérer toutes les étiquettes (--no-tags)"
 
-#: builtin/fetch.c:88
+#: builtin/fetch.c:103
 msgid "prune remote-tracking branches no longer on remote"
 msgstr ""
 "éliminer les branches de suivi distant si la branche n'existe plus dans le "
 "dépôt distant"
 
-#: builtin/fetch.c:89
+#: builtin/fetch.c:104
 msgid "on-demand"
 msgstr "à la demande"
 
-#: builtin/fetch.c:90
+#: builtin/fetch.c:105
 msgid "control recursive fetching of submodules"
 msgstr "contrôler la récupération récursive dans les sous-modules"
 
-#: builtin/fetch.c:94
+#: builtin/fetch.c:109
 msgid "keep downloaded pack"
 msgstr "conserver le paquet téléchargé"
 
-#: builtin/fetch.c:96
+#: builtin/fetch.c:111
 msgid "allow updating of HEAD ref"
 msgstr "permettre la mise à jour de la référence HEAD"
 
-#: builtin/fetch.c:99
+#: builtin/fetch.c:114
 msgid "deepen history of shallow clone"
 msgstr "approfondir l'historique d'un clone superficiel"
 
-#: builtin/fetch.c:101
+#: builtin/fetch.c:116
 msgid "convert to a complete repository"
 msgstr "convertir en un dépôt complet"
 
-#: builtin/fetch.c:103 builtin/log.c:1197
+#: builtin/fetch.c:118 builtin/log.c:1208
 msgid "dir"
 msgstr "dir"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:119
 msgid "prepend this to submodule path output"
 msgstr "préfixer ceci à la sortie du chemin du sous-module"
 
-#: builtin/fetch.c:107
+#: builtin/fetch.c:122
 msgid "default mode for recursion"
 msgstr "mode par défaut pour la récursion"
 
-#: builtin/fetch.c:109
+#: builtin/fetch.c:124
 msgid "accept refs that update .git/shallow"
 msgstr "accepter les références qui mettent à jour .git/shallow"
 
-#: builtin/fetch.c:347
+#: builtin/fetch.c:125
+msgid "refmap"
+msgstr "correspondance de référence"
+
+#: builtin/fetch.c:126
+msgid "specify fetch refmap"
+msgstr "spécifier une correspondance de référence pour la récupération"
+
+#: builtin/fetch.c:376
 msgid "Couldn't find remote ref HEAD"
 msgstr "impossible de trouver la référence HEAD distante"
 
-#: builtin/fetch.c:411
+#: builtin/fetch.c:454
 #, c-format
 msgid "object %s not found"
 msgstr "objet %s non trouvé"
 
-#: builtin/fetch.c:416
+#: builtin/fetch.c:459
 msgid "[up to date]"
 msgstr "[à jour]"
 
-#: builtin/fetch.c:430
+#: builtin/fetch.c:473
 #, c-format
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr "! %-*s %-*s -> %s  (impossible de récupérer la branche actuelle)"
 
-#: builtin/fetch.c:431 builtin/fetch.c:517
+#: builtin/fetch.c:474 builtin/fetch.c:560
 msgid "[rejected]"
 msgstr "[rejeté]"
 
-#: builtin/fetch.c:442
+#: builtin/fetch.c:485
 msgid "[tag update]"
 msgstr "[mise à jour de l'étiquette]"
 
-#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497
+#: builtin/fetch.c:487 builtin/fetch.c:522 builtin/fetch.c:540
 msgid "  (unable to update local ref)"
 msgstr "  (impossible de mettre à jour la référence locale)"
 
-#: builtin/fetch.c:462
+#: builtin/fetch.c:505
 msgid "[new tag]"
 msgstr "[nouvelle étiquette]"
 
-#: builtin/fetch.c:465
+#: builtin/fetch.c:508
 msgid "[new branch]"
 msgstr "[nouvelle branche]"
 
-#: builtin/fetch.c:468
+#: builtin/fetch.c:511
 msgid "[new ref]"
 msgstr "[nouvelle référence]"
 
-#: builtin/fetch.c:513
+#: builtin/fetch.c:556
 msgid "unable to update local ref"
 msgstr "impossible de mettre à jour la référence locale"
 
-#: builtin/fetch.c:513
+#: builtin/fetch.c:556
 msgid "forced update"
 msgstr "mise à jour forcée"
 
-#: builtin/fetch.c:519
+#: builtin/fetch.c:562
 msgid "(non-fast-forward)"
 msgstr "(pas d'avance rapide)"
 
-#: builtin/fetch.c:552 builtin/fetch.c:785
+#: builtin/fetch.c:595 builtin/fetch.c:828
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "impossible d'ouvrir %s : %s\n"
 
-#: builtin/fetch.c:561
+#: builtin/fetch.c:604
 #, 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:579
+#: builtin/fetch.c:622
 #, 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:667 builtin/fetch.c:750
+#: builtin/fetch.c:710 builtin/fetch.c:793
 #, c-format
 msgid "From %.*s\n"
 msgstr "Depuis %.*s\n"
 
-#: builtin/fetch.c:678
+#: builtin/fetch.c:721
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -5236,55 +5447,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:730
+#: builtin/fetch.c:773
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s sera en suspens)"
 
-#: builtin/fetch.c:731
+#: builtin/fetch.c:774
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s est devenu en suspens)"
 
-#: builtin/fetch.c:755
+#: builtin/fetch.c:798
 msgid "[deleted]"
 msgstr "[supprimé]"
 
-#: builtin/fetch.c:756 builtin/remote.c:1050
+#: builtin/fetch.c:799 builtin/remote.c:1063
 msgid "(none)"
 msgstr "(aucun(e))"
 
-#: builtin/fetch.c:775
+#: builtin/fetch.c:818
 #, 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:794
+#: builtin/fetch.c:837
 #, 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:797
+#: builtin/fetch.c:840
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "L'option \"%s\" est ignorée pour %s\n"
 
-#: builtin/fetch.c:853
+#: builtin/fetch.c:896
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Je ne sais pas récupérer depuis %s"
 
-#: builtin/fetch.c:1015
+#: builtin/fetch.c:1058
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Récupération de %s\n"
 
-#: builtin/fetch.c:1017 builtin/remote.c:90
+#: builtin/fetch.c:1060 builtin/remote.c:90
 #, c-format
 msgid "Could not fetch %s"
 msgstr "Impossible de récupérer %s"
 
-#: builtin/fetch.c:1035
+#: builtin/fetch.c:1078
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -5292,32 +5503,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:1059
+#: builtin/fetch.c:1101
 msgid "You need to specify a tag name."
 msgstr "Vous devez spécifier un nom d'étiquette."
 
-#: builtin/fetch.c:1107
+#: builtin/fetch.c:1143
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth et --unshallow ne peuvent pas être utilisés ensemble"
 
-#: builtin/fetch.c:1109
+#: builtin/fetch.c:1145
 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:1132
+#: builtin/fetch.c:1168
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all n'accepte pas d'argument de dépôt"
 
-#: builtin/fetch.c:1134
+#: builtin/fetch.c:1170
 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:1145
+#: builtin/fetch.c:1181
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "distant ou groupe distant inexistant : %s"
 
-#: builtin/fetch.c:1153
+#: builtin/fetch.c:1189
 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 "
@@ -5328,9 +5539,9 @@
 msgstr ""
 "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <fichier>]"
 
-#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700
-#: builtin/merge.c:196 builtin/repack.c:175 builtin/repack.c:179
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:501
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:698
+#: builtin/merge.c:197 builtin/repack.c:179 builtin/repack.c:183
+#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:590
 #: parse-options.h:132 parse-options.h:239
 msgid "n"
 msgstr "n"
@@ -5355,100 +5566,104 @@
 msgid "file to read from"
 msgstr "fichier d'où lire"
 
-#: builtin/for-each-ref.c:1063
+#: builtin/for-each-ref.c:676
+msgid "unable to parse format"
+msgstr "impossible d'analyser le format"
+
+#: builtin/for-each-ref.c:1057
 msgid "git for-each-ref [options] [<pattern>]"
 msgstr "git for-each-ref [options] [<motif>]"
 
-#: builtin/for-each-ref.c:1078
+#: builtin/for-each-ref.c:1072
 msgid "quote placeholders suitably for shells"
 msgstr "échapper les champs réservés pour les interpréteurs de commandes"
 
-#: builtin/for-each-ref.c:1080
+#: builtin/for-each-ref.c:1074
 msgid "quote placeholders suitably for perl"
 msgstr "échapper les champs réservés pour perl"
 
-#: builtin/for-each-ref.c:1082
+#: builtin/for-each-ref.c:1076
 msgid "quote placeholders suitably for python"
 msgstr "échapper les champs réservés pour python"
 
-#: builtin/for-each-ref.c:1084
+#: builtin/for-each-ref.c:1078
 msgid "quote placeholders suitably for tcl"
 msgstr "échapper les champs réservés pour tcl"
 
-#: builtin/for-each-ref.c:1087
+#: builtin/for-each-ref.c:1081
 msgid "show only <n> matched refs"
 msgstr "n'afficher que <n> références correspondant"
 
-#: builtin/for-each-ref.c:1088 builtin/replace.c:177
+#: builtin/for-each-ref.c:1082 builtin/replace.c:438
 msgid "format"
 msgstr "format"
 
-#: builtin/for-each-ref.c:1088
+#: builtin/for-each-ref.c:1082
 msgid "format to use for the output"
 msgstr "format à utiliser pour la sortie"
 
-#: builtin/for-each-ref.c:1089
+#: builtin/for-each-ref.c:1083
 msgid "key"
 msgstr "clé"
 
-#: builtin/for-each-ref.c:1090
+#: builtin/for-each-ref.c:1084
 msgid "field name to sort on"
 msgstr "nom du champ servant à trier"
 
-#: builtin/fsck.c:147 builtin/prune.c:172
+#: builtin/fsck.c:147 builtin/prune.c:136
 msgid "Checking connectivity"
 msgstr "Vérification de la connectivité"
 
-#: builtin/fsck.c:544
+#: builtin/fsck.c:540
 msgid "Checking object directories"
 msgstr "Vérification des répertoires d'objet"
 
-#: builtin/fsck.c:607
+#: builtin/fsck.c:603
 msgid "git fsck [options] [<object>...]"
 msgstr "git fsck [options] [<objet>...]"
 
-#: builtin/fsck.c:613
+#: builtin/fsck.c:609
 msgid "show unreachable objects"
 msgstr "afficher les objets inaccessibles"
 
-#: builtin/fsck.c:614
+#: builtin/fsck.c:610
 msgid "show dangling objects"
 msgstr "afficher les objets en suspens"
 
-#: builtin/fsck.c:615
+#: builtin/fsck.c:611
 msgid "report tags"
 msgstr "afficher les étiquettes"
 
-#: builtin/fsck.c:616
+#: builtin/fsck.c:612
 msgid "report root nodes"
 msgstr "signaler les nœuds racines"
 
-#: builtin/fsck.c:617
+#: builtin/fsck.c:613
 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:618
+#: builtin/fsck.c:614
 msgid "make reflogs head nodes (default)"
 msgstr "considérer les reflogs comme nœuds tête (par défaut)"
 
-#: builtin/fsck.c:619
+#: builtin/fsck.c:615
 msgid "also consider packs and alternate objects"
 msgstr "inspecter aussi les objets pack et alternatifs"
 
-#: builtin/fsck.c:620
+#: builtin/fsck.c:616
 msgid "enable more strict checking"
 msgstr "activer une vérification plus strict"
 
-#: builtin/fsck.c:622
+#: builtin/fsck.c:618
 msgid "write dangling objects in .git/lost-found"
 msgstr "écrire les objets en suspens dans .git/lost-found"
 
-#: builtin/fsck.c:623 builtin/prune.c:144
+#: builtin/fsck.c:619 builtin/prune.c:108
 msgid "show progress"
 msgstr "afficher la progression"
 
-#: builtin/fsck.c:673
+#: builtin/fsck.c:669
 msgid "Checking objects"
 msgstr "Vérification des objets"
 
@@ -5456,50 +5671,52 @@
 msgid "git gc [options]"
 msgstr "git gc [options]"
 
-#: builtin/gc.c:90
+#: builtin/gc.c:79
 #, c-format
-msgid "Invalid %s: '%s'"
-msgstr "%s invalide : '%s'"
+msgid "Invalid gc.pruneexpire: '%s'"
+msgstr "gc.pruneexpire invalide : '%s'"
 
-#: builtin/gc.c:117
+#: builtin/gc.c:107
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "objet répertoire démentiellement long %.*s"
 
-#: builtin/gc.c:273
+#: builtin/gc.c:276
 msgid "prune unreferenced objects"
 msgstr "éliminer les objets non référencés"
 
-#: builtin/gc.c:275
+#: builtin/gc.c:278
 msgid "be more thorough (increased runtime)"
 msgstr "être plus consciencieux (durée de traitement allongée)"
 
-#: builtin/gc.c:276
+#: builtin/gc.c:279
 msgid "enable auto-gc mode"
 msgstr "activer le mode auto-gc"
 
-#: builtin/gc.c:277
+#: builtin/gc.c:280
 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:318
+#: builtin/gc.c:321
 #, 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"
+msgstr ""
+"Compression automatique du dépôt en tâche de fond pour optimiser les "
+"performances.\n"
 
-#: builtin/gc.c:320
+#: builtin/gc.c:323
 #, 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:321
+#: builtin/gc.c:324
 #, 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:342
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5507,7 +5724,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:361
+#: builtin/gc.c:364
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -5523,237 +5740,232 @@
 msgid "grep: failed to create thread: %s"
 msgstr "grep : échec de création du fil: %s"
 
-#: builtin/grep.c:365
-#, c-format
-msgid "Failed to chdir: %s"
-msgstr "Échec de chdir: %s"
-
-#: builtin/grep.c:443 builtin/grep.c:478
+#: builtin/grep.c:441 builtin/grep.c:476
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "impossible de lire l'arbre (%s)"
 
-#: builtin/grep.c:493
+#: builtin/grep.c:491
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "impossible de faire un grep sur un objet de type %s"
 
-#: builtin/grep.c:549
+#: builtin/grep.c:547
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "l'option '%c' attend un valeur numérique"
 
-#: builtin/grep.c:566
+#: builtin/grep.c:564
 #, c-format
 msgid "cannot open '%s'"
 msgstr "impossible d'ouvrir '%s'"
 
-#: builtin/grep.c:640
+#: builtin/grep.c:638
 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:642
+#: builtin/grep.c:640
 msgid "find in contents not managed by git"
 msgstr "rechercher dans les contenus non gérés par git"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:642
 msgid "search in both tracked and untracked files"
 msgstr "rechercher dans les fichiers suivis et non-suivis"
 
-#: builtin/grep.c:646
+#: builtin/grep.c:644
 msgid "search also in ignored files"
 msgstr "rechercher aussi dans les fichiers ignorés"
 
-#: builtin/grep.c:649
+#: builtin/grep.c:647
 msgid "show non-matching lines"
 msgstr "afficher les lignes qui ne correspondent pas"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:649
 msgid "case insensitive matching"
 msgstr "correspondance insensible à la casse"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:651
 msgid "match patterns only at word boundaries"
 msgstr "rechercher les motifs aux séparateurs de mots"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:653
 msgid "process binary files as text"
 msgstr "traiter les fichiers binaires comme texte"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:655
 msgid "don't match patterns in binary files"
 msgstr "ne pas chercher les motifs dans les fichiers binaires"
 
-#: builtin/grep.c:660
+#: builtin/grep.c:658
 msgid "process binary files with textconv filters"
 msgstr "traiter les fichiers binaires avec les filtres textconv"
 
-#: builtin/grep.c:662
+#: builtin/grep.c:660
 msgid "descend at most <depth> levels"
 msgstr "descendre au plus de <profondeur> dans l'arborescence"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:664
 msgid "use extended POSIX regular expressions"
 msgstr "utiliser des expressions régulières étendues POSIX"
 
-#: builtin/grep.c:669
+#: builtin/grep.c:667
 msgid "use basic POSIX regular expressions (default)"
 msgstr "utiliser des expressions régulières basiques POSIX (par défaut)"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:670
 msgid "interpret patterns as fixed strings"
 msgstr "interpréter les motifs comme de chaînes fixes"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:673
 msgid "use Perl-compatible regular expressions"
 msgstr "utiliser des expressions régulières compatibles avec Perl"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:676
 msgid "show line numbers"
 msgstr "afficher les numéros de ligne"
 
-#: builtin/grep.c:679
+#: builtin/grep.c:677
 msgid "don't show filenames"
 msgstr "ne pas pas afficher les noms de fichier"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:678
 msgid "show filenames"
 msgstr "afficher les noms de fichier"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:680
 msgid "show filenames relative to top directory"
 msgstr "afficher les noms de fichiers relativement au répertoire de base"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:682
 msgid "show only filenames instead of matching lines"
 msgstr "n'afficher que les noms de fichiers au lieu des lignes correspondant"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:684
 msgid "synonym for --files-with-matches"
 msgstr "synonyme pour --files-with-matches"
 
-#: builtin/grep.c:689
+#: builtin/grep.c:687
 msgid "show only the names of files without match"
 msgstr "n'afficher que les noms des fichiers sans correspondance"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:689
 msgid "print NUL after filenames"
 msgstr "imprimer une caractère NUL après le noms de fichier"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:691
 msgid "show the number of matches instead of matching lines"
 msgstr "afficher le nombre de correspondances au lieu des lignes correspondant"
 
-#: builtin/grep.c:694
+#: builtin/grep.c:692
 msgid "highlight matches"
 msgstr "mettre en évidence les correspondances"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:694
 msgid "print empty line between matches from different files"
 msgstr ""
 "imprimer une ligne vide entre les correspondances de fichiers différents"
 
-#: builtin/grep.c:698
+#: builtin/grep.c:696
 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:701
+#: builtin/grep.c:699
 msgid "show <n> context lines before and after matches"
 msgstr "afficher <n> lignes de contexte avant et après les correspondances"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:702
 msgid "show <n> context lines before matches"
 msgstr "afficher <n> lignes de contexte avant les correspondances"
 
-#: builtin/grep.c:706
+#: builtin/grep.c:704
 msgid "show <n> context lines after matches"
 msgstr "afficher <n> lignes de contexte après les correspondances"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:705
 msgid "shortcut for -C NUM"
 msgstr "raccourci pour -C NUM"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:708
 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:712
+#: builtin/grep.c:710
 msgid "show the surrounding function"
 msgstr "afficher la fonction contenante"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:713
 msgid "read patterns from file"
 msgstr "lire les motifs depuis fichier"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:715
 msgid "match <pattern>"
 msgstr "rechercher <motif>"
 
-#: builtin/grep.c:719
+#: builtin/grep.c:717
 msgid "combine patterns specified with -e"
 msgstr "combiner les motifs spécifiés par -e"
 
-#: builtin/grep.c:731
+#: builtin/grep.c:729
 msgid "indicate hit with exit status without output"
 msgstr ""
 "indiquer des correspondances avec le code de sortie mais sans rien afficher"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:731
 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:735
+#: builtin/grep.c:733
 msgid "show parse tree for grep expression"
 msgstr "afficher l'arbre d'analyse pour le motif grep"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:737
 msgid "pager"
 msgstr "pagineur"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:737
 msgid "show matching files in the pager"
 msgstr "afficher les fichiers correspondant dans le pagineur"
 
-#: builtin/grep.c:742
+#: builtin/grep.c:740
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "permettre l'appel de grep(1) (ignoré par ce build)"
 
-#: builtin/grep.c:743 builtin/show-ref.c:187
+#: builtin/grep.c:741 builtin/show-ref.c:187
 msgid "show usage"
 msgstr "afficher l'usage"
 
-#: builtin/grep.c:810
+#: builtin/grep.c:808
 msgid "no pattern given."
 msgstr "aucun motif fourni."
 
-#: builtin/grep.c:868
+#: builtin/grep.c:866
 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:891
+#: builtin/grep.c:892
 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:896
+#: builtin/grep.c:897
 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:899
+#: builtin/grep.c:900
 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:907
+#: builtin/grep.c:908
 msgid "both --cached and trees are given."
 msgstr "--cached et des arbres sont fournis en même temps."
 
-#: builtin/hash-object.c:60
+#: builtin/hash-object.c:82
 msgid ""
 "git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] "
 "<file>..."
@@ -5761,31 +5973,36 @@
 "git hash-object [-t <type>] [-w] [--path=<fichier>|--no-filters] [--stdin] "
 "[--] <fichier>..."
 
-#: builtin/hash-object.c:61
+#: builtin/hash-object.c:83
 msgid "git hash-object  --stdin-paths < <list-of-paths>"
 msgstr "git hash-object  --stdin-paths < <liste-de-chemins>"
 
-#: builtin/hash-object.c:72 builtin/tag.c:521
+#: builtin/hash-object.c:94 builtin/tag.c:610
 msgid "type"
 msgstr "type"
 
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr "type d'objet"
 
-#: builtin/hash-object.c:73
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr "écrire l'objet dans la base de donnée d'objets"
 
-#: builtin/hash-object.c:74
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr "lire l'objet depuis l'entrée standard"
 
-#: builtin/hash-object.c:76
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr "stocker le fichier tel quel sans filtrage"
 
-#: builtin/hash-object.c:77
+#: builtin/hash-object.c:100
+msgid ""
+"just hash any random garbage to create corrupt objects for debugging Git"
+msgstr "juste hasher n'importe quel contenu pour créer des objets corrompus pour debugger Git"
+
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr "traiter le fichier comme s'il venait de ce chemin"
 
@@ -5818,25 +6035,25 @@
 msgid "unrecognized help format '%s'"
 msgstr "format d'aide non reconnu '%s'"
 
-#: builtin/help.c:92
+#: builtin/help.c:91
 msgid "Failed to start emacsclient."
 msgstr "échec de démarrage d'emacsclient."
 
-#: builtin/help.c:105
+#: builtin/help.c:104
 msgid "Failed to parse emacsclient version."
 msgstr "échec d'analyse de la version d'emacsclient."
 
-#: builtin/help.c:113
+#: builtin/help.c:112
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "la version d'emacsclient '%d' est trop ancienne (<22)."
 
-#: builtin/help.c:131 builtin/help.c:159 builtin/help.c:168 builtin/help.c:176
+#: builtin/help.c:130 builtin/help.c:158 builtin/help.c:167 builtin/help.c:175
 #, c-format
 msgid "failed to exec '%s': %s"
 msgstr "échec de l'exécution de '%s' : %s"
 
-#: builtin/help.c:216
+#: builtin/help.c:215
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -5845,7 +6062,7 @@
 "'%s' : chemin pour l'utilitaire de visualisation de manuel non supporté.\n"
 "Veuillez utiliser plutôt 'man.<outil>.cmd'."
 
-#: builtin/help.c:228
+#: builtin/help.c:227
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -5854,23 +6071,27 @@
 "'%s' : chemin pour l'utilitaire de visualisation de manuel supporté.\n"
 "Veuillez utiliser plutôt 'man.<outil>.cmd'."
 
-#: builtin/help.c:353
+#: builtin/help.c:352
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "'%s' : visualiseur de manuel inconnu."
 
-#: builtin/help.c:370
+#: builtin/help.c:369
 msgid "no man viewer handled the request"
 msgstr "aucun visualiseur de manuel n'a pris en charge la demande"
 
-#: builtin/help.c:378
+#: builtin/help.c:377
 msgid "no info viewer handled the request"
 msgstr "aucun visualiseur de 'info' n'a pris en charge la demande"
 
-#: builtin/help.c:424
+#: builtin/help.c:423
 msgid "Defining attributes per path"
 msgstr "Définition des attributs par chemin"
 
+#: builtin/help.c:424
+msgid "Everyday Git With 20 Commands Or So"
+msgstr "Git de tous les jours avec à peu près 20 commandes"
+
 #: builtin/help.c:425
 msgid "A Git glossary"
 msgstr "Un glossaire Git"
@@ -5910,281 +6131,292 @@
 msgid "`git %s' is aliased to `%s'"
 msgstr "`git %s\" est un alias de `%s'"
 
-#: builtin/index-pack.c:184
+#: builtin/index-pack.c:150
+#, c-format
+msgid "unable to open %s"
+msgstr "impossible d'ouvrir %s"
+
+#: builtin/index-pack.c:200
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "type d'objet non correspondant à %s"
 
-#: builtin/index-pack.c:204
-msgid "object of unexpected type"
-msgstr "objet de type inattendu"
+#: builtin/index-pack.c:220
+#, c-format
+msgid "did not receive expected object %s"
+msgstr "objet attendu non reçu %s"
 
-#: builtin/index-pack.c:244
+#: builtin/index-pack.c:223
+#, c-format
+msgid "object %s: expected type %s, found %s"
+msgstr "objet %s : type attendu %s, reçu %s"
+
+#: builtin/index-pack.c:265
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "impossible de remplir %d octet"
 msgstr[1] "impossible de remplir %d octets"
 
-#: builtin/index-pack.c:254
+#: builtin/index-pack.c:275
 msgid "early EOF"
 msgstr "fin de fichier prématurée"
 
-#: builtin/index-pack.c:255
+#: builtin/index-pack.c:276
 msgid "read error on input"
 msgstr "erreur de lecture sur l'entrée"
 
-#: builtin/index-pack.c:267
+#: builtin/index-pack.c:288
 msgid "used more bytes than were available"
 msgstr "plus d'octets utilisés que disponibles"
 
-#: builtin/index-pack.c:274
+#: builtin/index-pack.c:295
 msgid "pack too large for current definition of off_t"
 msgstr "le paquet est trop grand pour la définition actuelle de off_t"
 
-#: builtin/index-pack.c:290
+#: builtin/index-pack.c:311
 #, c-format
 msgid "unable to create '%s'"
 msgstr "impossible de créer '%s'"
 
-#: builtin/index-pack.c:295
+#: builtin/index-pack.c:316
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "impossible d'ouvrir le fichier paquet '%s'"
 
-#: builtin/index-pack.c:309
+#: builtin/index-pack.c:330
 msgid "pack signature mismatch"
 msgstr "la signature du paquet ne correspond pas"
 
-#: builtin/index-pack.c:311
+#: builtin/index-pack.c:332
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "la version de paquet %<PRIu32> non supportée"
 
-#: builtin/index-pack.c:329
+#: builtin/index-pack.c:350
 #, c-format
 msgid "pack has bad object at offset %lu: %s"
 msgstr "le paquet a un mauvais objet à l'offset %lu: %s"
 
-#: builtin/index-pack.c:451
+#: builtin/index-pack.c:471
 #, c-format
 msgid "inflate returned %d"
 msgstr "la décompression (inflate) a retourné %d"
 
-#: builtin/index-pack.c:500
+#: builtin/index-pack.c:520
 msgid "offset value overflow for delta base object"
 msgstr "dépassement de la valeur d'offset pour l'objet delta de base"
 
-#: builtin/index-pack.c:508
+#: builtin/index-pack.c:528
 msgid "delta base offset is out of bound"
 msgstr "l'objet delta de base est hors limite"
 
-#: builtin/index-pack.c:516
+#: builtin/index-pack.c:536
 #, c-format
 msgid "unknown object type %d"
 msgstr "type d'objet inconnu %d"
 
-#: builtin/index-pack.c:547
+#: builtin/index-pack.c:567
 msgid "cannot pread pack file"
 msgstr "impossible de lire (pread) le fichier paquet"
 
-#: builtin/index-pack.c:549
+#: builtin/index-pack.c:569
 #, c-format
 msgid "premature end of pack file, %lu byte missing"
 msgid_plural "premature end of pack file, %lu bytes missing"
 msgstr[0] "fin prématurée du fichier paquet, %lu octet lu"
 msgstr[1] "fin prématurée du fichier paquet, %lu octets lus"
 
-#: builtin/index-pack.c:575
+#: builtin/index-pack.c:595
 msgid "serious inflate inconsistency"
 msgstr "grave incohérence dans la décompression (inflate)"
 
-#: builtin/index-pack.c:666 builtin/index-pack.c:672 builtin/index-pack.c:695
-#: builtin/index-pack.c:729 builtin/index-pack.c:738
+#: builtin/index-pack.c:686 builtin/index-pack.c:692 builtin/index-pack.c:715
+#: builtin/index-pack.c:749 builtin/index-pack.c:758
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "COLLISION SHA1 TROUVÉE AVEC %s !"
 
-#: builtin/index-pack.c:669 builtin/pack-objects.c:162
-#: builtin/pack-objects.c:254
+#: builtin/index-pack.c:689 builtin/pack-objects.c:164
+#: builtin/pack-objects.c:256
 #, c-format
 msgid "unable to read %s"
 msgstr "impossible de lire %s"
 
-#: builtin/index-pack.c:735
+#: builtin/index-pack.c:755
 #, c-format
 msgid "cannot read existing object %s"
 msgstr "impossible de lire l'objet existant %s"
 
-#: builtin/index-pack.c:749
+#: builtin/index-pack.c:769
 #, c-format
 msgid "invalid blob object %s"
 msgstr "objet blob invalide %s"
 
-#: builtin/index-pack.c:763
+#: builtin/index-pack.c:783
 #, c-format
 msgid "invalid %s"
 msgstr "%s invalide"
 
-#: builtin/index-pack.c:766
+#: builtin/index-pack.c:787
 msgid "Error in object"
 msgstr "Erreur dans l'objet"
 
-#: builtin/index-pack.c:768
+#: builtin/index-pack.c:789
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "Tous les objets enfants de %s ne sont pas accessibles"
 
-#: builtin/index-pack.c:839 builtin/index-pack.c:869
+#: builtin/index-pack.c:861 builtin/index-pack.c:890
 msgid "failed to apply delta"
 msgstr "échec d'application du delta"
 
-#: builtin/index-pack.c:1010
+#: builtin/index-pack.c:1055
 msgid "Receiving objects"
 msgstr "Réception d'objets"
 
-#: builtin/index-pack.c:1010
+#: builtin/index-pack.c:1055
 msgid "Indexing objects"
 msgstr "Indexation d'objets"
 
-#: builtin/index-pack.c:1036
+#: builtin/index-pack.c:1081
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "le paquet est corrompu (SHA1 ne correspond pas)"
 
-#: builtin/index-pack.c:1041
+#: builtin/index-pack.c:1086
 msgid "cannot fstat packfile"
 msgstr "impossible d'obtenir le statut (fstat) du fichier paquet"
 
-#: builtin/index-pack.c:1044
+#: builtin/index-pack.c:1089
 msgid "pack has junk at the end"
 msgstr "le paquet est invalide à la fin"
 
-#: builtin/index-pack.c:1055
+#: builtin/index-pack.c:1100
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "confusion extrême dans parse_pack_objects()"
 
-#: builtin/index-pack.c:1078
+#: builtin/index-pack.c:1123
 msgid "Resolving deltas"
 msgstr "Résolution des deltas"
 
-#: builtin/index-pack.c:1088
+#: builtin/index-pack.c:1133
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "impossible de créer le fil : %s"
 
-#: builtin/index-pack.c:1130
+#: builtin/index-pack.c:1175
 msgid "confusion beyond insanity"
 msgstr "confusion extrême"
 
-#: builtin/index-pack.c:1138
+#: builtin/index-pack.c:1181
 #, c-format
 msgid "completed with %d local objects"
 msgstr "complété avec %d objets locaux"
 
-#: builtin/index-pack.c:1148
+#: builtin/index-pack.c:1191
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr ""
 "Somme de contrôle de fin inattendue pour %s (corruption sur le disque ?)"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1195
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "le paquet a %d delta non résolu"
 msgstr[1] "le paquet a %d deltas non résolus"
 
-#: builtin/index-pack.c:1177
+#: builtin/index-pack.c:1220
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "impossible de compresser l'objet ajouté (%d)"
 
-#: builtin/index-pack.c:1256
+#: builtin/index-pack.c:1299
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "l'objet local %s est corrompu"
 
-#: builtin/index-pack.c:1280
+#: builtin/index-pack.c:1323
 msgid "error while closing pack file"
 msgstr "erreur en fermeture du fichier paquet"
 
-#: builtin/index-pack.c:1293
+#: builtin/index-pack.c:1336
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "impossible d'écrire le fichier \"keep\" '%s'"
 
-#: builtin/index-pack.c:1301
+#: builtin/index-pack.c:1344
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "impossible de fermer le fichier \"keep\" '%s'"
 
-#: builtin/index-pack.c:1314
+#: builtin/index-pack.c:1357
 msgid "cannot store pack file"
 msgstr "impossible de stocker le fichier paquet"
 
-#: builtin/index-pack.c:1325
+#: builtin/index-pack.c:1368
 msgid "cannot store index file"
 msgstr "impossible de stocker le fichier d'index"
 
-#: builtin/index-pack.c:1358
+#: builtin/index-pack.c:1401
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "mauvais pack.indexversion=%<PRIu32>"
 
-#: builtin/index-pack.c:1364
+#: builtin/index-pack.c:1407
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "nombre de fils spécifié invalide (%d)"
 
-#: builtin/index-pack.c:1368 builtin/index-pack.c:1546
+#: builtin/index-pack.c:1411 builtin/index-pack.c:1590
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "pas de support des fils, ignore %s"
 
-#: builtin/index-pack.c:1426
+#: builtin/index-pack.c:1469
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Impossible d'ouvrir le fichier paquet existant '%s'"
 
-#: builtin/index-pack.c:1428
+#: builtin/index-pack.c:1471
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "Impossible d'ouvrir le fichier paquet d'index existant pour '%s'"
 
-#: builtin/index-pack.c:1475
+#: builtin/index-pack.c:1518
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "pas un delta : %d objet"
 msgstr[1] "pas un delta : %d objets"
 
-#: builtin/index-pack.c:1482
+#: builtin/index-pack.c:1525
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "longueur chaînée = %d : %lu objet"
 msgstr[1] "longueur chaînée = %d : %lu objets"
 
-#: builtin/index-pack.c:1510
+#: builtin/index-pack.c:1554
 msgid "Cannot come back to cwd"
 msgstr "Impossible de revenir au répertoire de travail courant"
 
-#: builtin/index-pack.c:1558 builtin/index-pack.c:1561
-#: builtin/index-pack.c:1573 builtin/index-pack.c:1577
+#: builtin/index-pack.c:1602 builtin/index-pack.c:1605
+#: builtin/index-pack.c:1617 builtin/index-pack.c:1621
 #, c-format
 msgid "bad %s"
 msgstr "mauvais %s"
 
-#: builtin/index-pack.c:1591
+#: builtin/index-pack.c:1635
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin ne peut pas être utilisé sans --stdin"
 
-#: builtin/index-pack.c:1595 builtin/index-pack.c:1605
+#: builtin/index-pack.c:1639 builtin/index-pack.c:1648
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "le nom de fichier paquet '%s' ne se termine pas par '.pack'"
 
-#: builtin/index-pack.c:1614
+#: builtin/index-pack.c:1656
 msgid "--verify with no packfile name given"
 msgstr "--verify sans nom de fichier paquet donné"
 
@@ -6294,11 +6526,7 @@
 msgid " shared"
 msgstr " partagé"
 
-#: builtin/init-db.c:439
-msgid "cannot tell cwd"
-msgstr "impossible de déterminer le répertoire de travail courant"
-
-#: builtin/init-db.c:465
+#: builtin/init-db.c:467
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [directory]"
@@ -6306,29 +6534,29 @@
 "git init [-q | --quiet] [--bare] [--template=<répertoire-modèle>] [--"
 "shared[=<permissions>]] [répertoire]"
 
-#: builtin/init-db.c:488
+#: builtin/init-db.c:490
 msgid "permissions"
 msgstr "permissions"
 
-#: builtin/init-db.c:489
+#: builtin/init-db.c:491
 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:491 builtin/prune-packed.c:79 builtin/repack.c:168
+#: builtin/init-db.c:493 builtin/prune-packed.c:57 builtin/repack.c:172
 msgid "be quiet"
 msgstr "être silencieux"
 
-#: builtin/init-db.c:523 builtin/init-db.c:528
+#: builtin/init-db.c:525 builtin/init-db.c:530
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "impossible de créer le répertoire (mkdir) %s"
 
-#: builtin/init-db.c:532
+#: builtin/init-db.c:534
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "impossible de se déplacer vers le répertoire (chdir) %s"
 
-#: builtin/init-db.c:554
+#: builtin/init-db.c:555
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -6337,15 +6565,29 @@
 "%s (ou --work-tree=<répertoire>) n'est pas autorisé sans spécifier %s (ou --"
 "git-dir=<répertoire>)"
 
-#: builtin/init-db.c:578
-msgid "Cannot access current working directory"
-msgstr "Impossible d'accéder au répertoire de travail courant"
-
-#: builtin/init-db.c:585
+#: builtin/init-db.c:583
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Impossible d'accéder à l'arbre de travail '%s'"
 
+#: builtin/interpret-trailers.c:15
+msgid ""
+"git interpret-trailers [--trim-empty] [(--trailer <token>[(=|:)<value>])...] "
+"[<file>...]"
+msgstr "git interpret-trailers [--trim-empty] [(--trailer <symbole>[(=|:)<valeur>])...] [<fichier>...]"
+
+#: builtin/interpret-trailers.c:25
+msgid "trim empty trailers"
+msgstr "éliminer les lignes de fin vides"
+
+#: builtin/interpret-trailers.c:26
+msgid "trailer"
+msgstr "ligne de fin"
+
+#: builtin/interpret-trailers.c:27
+msgid "trailer(s) to add"
+msgstr "ligne(s) de fin à ajouter"
+
 #: builtin/log.c:41
 msgid "git log [<options>] [<revision range>] [[--] <path>...]\n"
 msgstr "git log [<options>] [<page de révisions>] [[--] <chemin>...]\n"
@@ -6354,33 +6596,47 @@
 msgid "   or: git show [options] <object>..."
 msgstr "   ou : git show [options] <objet>..."
 
-#: builtin/log.c:125
+#: builtin/log.c:81
+#, c-format
+msgid "invalid --decorate option: %s"
+msgstr "option --decorate invalide : %s"
+
+#: builtin/log.c:127
 msgid "suppress diff output"
 msgstr "supprimer la sortie des différences"
 
-#: builtin/log.c:126
+#: builtin/log.c:128
 msgid "show source"
 msgstr "afficher la source"
 
-#: builtin/log.c:127
+#: builtin/log.c:129
 msgid "Use mail map file"
 msgstr "Utiliser le fichier de correspondance de mail"
 
-#: builtin/log.c:128
+#: builtin/log.c:130
 msgid "decorate options"
 msgstr "décorer les options"
 
-#: builtin/log.c:231
+#: builtin/log.c:133
+msgid "Process line range n,m in file, counting from 1"
+msgstr "Traiter seulement l'intervalle de lignes n,m du fichier en commençant le compte à 1"
+
+#: builtin/log.c:229
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Sortie finale : %d %s\n"
 
-#: builtin/log.c:473 builtin/log.c:565
+#: builtin/log.c:458
+#, c-format
+msgid "git show %s: bad file"
+msgstr "git show %s : fichier incorrect"
+
+#: builtin/log.c:472 builtin/log.c:564
 #, c-format
 msgid "Could not read object %s"
 msgstr "Impossible de lire l'objet %s"
 
-#: builtin/log.c:589
+#: builtin/log.c:588
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Type inconnu : %d"
@@ -6389,214 +6645,223 @@
 msgid "format.headers without value"
 msgstr "format.headers sans valeur"
 
-#: builtin/log.c:771
+#: builtin/log.c:773
 msgid "name of output directory is too long"
 msgstr "le nom du répertoire de sortie est trop long"
 
-#: builtin/log.c:787
+#: builtin/log.c:789
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Impossible d'ouvrir le fichier correctif %s"
 
-#: builtin/log.c:801
+#: builtin/log.c:803
 msgid "Need exactly one range."
 msgstr "Exactement une plage nécessaire."
 
-#: builtin/log.c:809
+#: builtin/log.c:811
 msgid "Not a range."
 msgstr "Ceci n'est pas une plage."
 
-#: builtin/log.c:911
+#: builtin/log.c:919
 msgid "Cover letter needs email format"
 msgstr "La lettre de motivation doit être au format e-mail"
 
-#: builtin/log.c:987
+#: builtin/log.c:998
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "in-reply-to aberrant : %s"
 
-#: builtin/log.c:1015
+#: builtin/log.c:1026
 msgid "git format-patch [options] [<since> | <revision range>]"
 msgstr "git format-patch [options] [<depuis> | <plage de révisions>]"
 
-#: builtin/log.c:1060
+#: builtin/log.c:1071
 msgid "Two output directories?"
 msgstr "Deux répertoires de sortie ?"
 
-#: builtin/log.c:1175
+#: builtin/log.c:1186
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "utiliser [PATCH n/m] même avec un patch unique"
 
-#: builtin/log.c:1178
+#: builtin/log.c:1189
 msgid "use [PATCH] even with multiple patches"
 msgstr "utiliser [PATCH] même avec des patchs multiples"
 
-#: builtin/log.c:1182
+#: builtin/log.c:1193
 msgid "print patches to standard out"
 msgstr "afficher les patchs sur la sortie standard"
 
-#: builtin/log.c:1184
+#: builtin/log.c:1195
 msgid "generate a cover letter"
 msgstr "générer une lettre de motivation"
 
-#: builtin/log.c:1186
+#: builtin/log.c:1197
 msgid "use simple number sequence for output file names"
 msgstr ""
 "utiliser une séquence simple de nombres pour les nom des fichiers de sortie"
 
-#: builtin/log.c:1187
+#: builtin/log.c:1198
 msgid "sfx"
 msgstr "sfx"
 
-#: builtin/log.c:1188
+#: builtin/log.c:1199
 msgid "use <sfx> instead of '.patch'"
 msgstr "utiliser <sfx> au lieu de '.patch'"
 
-#: builtin/log.c:1190
+#: builtin/log.c:1201
 msgid "start numbering patches at <n> instead of 1"
 msgstr "démarrer la numérotation des patchs à <n> au lieu de 1"
 
-#: builtin/log.c:1192
+#: builtin/log.c:1203
 msgid "mark the series as Nth re-roll"
 msgstr "marquer la série comme une Nième réédition"
 
-#: builtin/log.c:1194
+#: builtin/log.c:1205
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "utiliser [<préfixe>] au lieu de [PATCH]"
 
-#: builtin/log.c:1197
+#: builtin/log.c:1208
 msgid "store resulting files in <dir>"
 msgstr "stocker les fichiers résultats dans <répertoire>"
 
-#: builtin/log.c:1200
+#: builtin/log.c:1211
 msgid "don't strip/add [PATCH]"
 msgstr "ne pas retirer/ajouter [PATCH]"
 
-#: builtin/log.c:1203
+#: builtin/log.c:1214
 msgid "don't output binary diffs"
 msgstr "ne pas imprimer les diffs binaires"
 
-#: builtin/log.c:1205
+#: builtin/log.c:1216
 msgid "don't include a patch matching a commit upstream"
 msgstr "ne pas inclure un patch correspondant à un commit amont"
 
-#: builtin/log.c:1207
+#: builtin/log.c:1218
 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:1209
+#: builtin/log.c:1220
 msgid "Messaging"
 msgstr "Communication"
 
-#: builtin/log.c:1210
+#: builtin/log.c:1221
 msgid "header"
 msgstr "en-tête"
 
-#: builtin/log.c:1211
+#: builtin/log.c:1222
 msgid "add email header"
 msgstr "ajouter l'en-tête d'e-mail"
 
-#: builtin/log.c:1212 builtin/log.c:1214
+#: builtin/log.c:1223 builtin/log.c:1225
 msgid "email"
 msgstr "e-mail"
 
-#: builtin/log.c:1212
+#: builtin/log.c:1223
 msgid "add To: header"
 msgstr "ajouter l'en-tête \"To:\""
 
-#: builtin/log.c:1214
+#: builtin/log.c:1225
 msgid "add Cc: header"
 msgstr "ajouter l'en-tête \"Cc:\""
 
-#: builtin/log.c:1216
+#: builtin/log.c:1227
 msgid "ident"
 msgstr "ident"
 
-#: builtin/log.c:1217
+#: builtin/log.c:1228
 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:1219
+#: builtin/log.c:1230
 msgid "message-id"
 msgstr "id-message"
 
-#: builtin/log.c:1220
+#: builtin/log.c:1231
 msgid "make first mail a reply to <message-id>"
 msgstr "répondre dans le premier message à <id-message>"
 
-#: builtin/log.c:1221 builtin/log.c:1224
+#: builtin/log.c:1232 builtin/log.c:1235
 msgid "boundary"
 msgstr "limite"
 
-#: builtin/log.c:1222
+#: builtin/log.c:1233
 msgid "attach the patch"
 msgstr "attacher le patch"
 
-#: builtin/log.c:1225
+#: builtin/log.c:1236
 msgid "inline the patch"
 msgstr "patch à l'intérieur"
 
-#: builtin/log.c:1229
+#: builtin/log.c:1240
 msgid "enable message threading, styles: shallow, deep"
 msgstr ""
 "activer l'enfilage de message, styles : shallow (superficiel), deep (profond)"
 
-#: builtin/log.c:1231
+#: builtin/log.c:1242
 msgid "signature"
 msgstr "signature"
 
-#: builtin/log.c:1232
+#: builtin/log.c:1243
 msgid "add a signature"
 msgstr "ajouter une signature"
 
-#: builtin/log.c:1233
+#: builtin/log.c:1245
+msgid "add a signature from a file"
+msgstr "ajouter une signature depuis un fichier"
+
+#: builtin/log.c:1246
 msgid "don't print the patch filenames"
 msgstr "ne pas afficher les noms de fichiers des patchs"
 
-#: builtin/log.c:1307
+#: builtin/log.c:1320
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "ligne d'identification invalide : %s"
 
-#: builtin/log.c:1322
+#: builtin/log.c:1335
 msgid "-n and -k are mutually exclusive."
 msgstr "-n et -k sont mutuellement exclusifs."
 
-#: builtin/log.c:1324
+#: builtin/log.c:1337
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "--subject-prefix et -k sont mutuellement exclusifs."
 
-#: builtin/log.c:1332
+#: builtin/log.c:1345
 msgid "--name-only does not make sense"
 msgstr "--name-only n'a pas de sens"
 
-#: builtin/log.c:1334
+#: builtin/log.c:1347
 msgid "--name-status does not make sense"
 msgstr "--name-status n'a pas de sens"
 
-#: builtin/log.c:1336
+#: builtin/log.c:1349
 msgid "--check does not make sense"
 msgstr "--check n'a pas de sens"
 
-#: builtin/log.c:1359
+#: builtin/log.c:1372
 msgid "standard output, or directory, which one?"
 msgstr "sortie standard, ou répertoire, lequel ?"
 
-#: builtin/log.c:1361
+#: builtin/log.c:1374
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Impossible de créer le répertoire '%s'"
 
-#: builtin/log.c:1509
+#: builtin/log.c:1472
+#, c-format
+msgid "unable to read signature file '%s'"
+msgstr "lecture du fichier de signature '%s' impossible"
+
+#: builtin/log.c:1535
 msgid "Failed to create output files"
 msgstr "Échec de création des fichiers en sortie"
 
-#: builtin/log.c:1558
+#: builtin/log.c:1583
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<branche_amont> [<head> [<limite>]]]"
 
-#: builtin/log.c:1613
+#: builtin/log.c:1638
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -6604,7 +6869,7 @@
 "Impossible de trouver une branche distante suivie, merci de spécifier "
 "<branche_amont> manuellement.\n"
 
-#: builtin/log.c:1626 builtin/log.c:1628 builtin/log.c:1640
+#: builtin/log.c:1651 builtin/log.c:1653 builtin/log.c:1665
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Commit inconnu %s"
@@ -6651,7 +6916,7 @@
 "afficher les fichiers du système de fichiers qui ont besoin d'être supprimés"
 
 #: builtin/ls-files.c:477
-msgid "show 'other' directories' name only"
+msgid "show 'other' directories' names only"
 msgstr "afficher seulement les noms des répertoires 'other'"
 
 #: builtin/ls-files.c:480
@@ -6742,101 +7007,101 @@
 "afficher l'arbre entier ; pas seulement le répertoire courant (implique --"
 "full-name)"
 
-#: builtin/merge.c:43
+#: builtin/merge.c:44
 msgid "git merge [options] [<commit>...]"
 msgstr "git merge [options] [<commit>...]"
 
-#: builtin/merge.c:44
+#: builtin/merge.c:45
 msgid "git merge [options] <msg> HEAD <commit>"
 msgstr "git merge [options] <message> HEAD <commit>"
 
-#: builtin/merge.c:45
+#: builtin/merge.c:46
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:98
+#: builtin/merge.c:99
 msgid "switch `m' requires a value"
 msgstr "le commutateur `m' a besoin d'une valeur"
 
-#: builtin/merge.c:135
+#: builtin/merge.c:136
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "Impossible de trouver la stratégie de fusion '%s'.\n"
 
-#: builtin/merge.c:136
+#: builtin/merge.c:137
 #, c-format
 msgid "Available strategies are:"
 msgstr "Les stratégies disponibles sont :"
 
-#: builtin/merge.c:141
+#: builtin/merge.c:142
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Les stratégies personnalisées sont :"
 
-#: builtin/merge.c:191
+#: builtin/merge.c:192
 msgid "do not show a diffstat at the end of the merge"
 msgstr "ne pas afficher un diffstat à la fin de la fusion"
 
-#: builtin/merge.c:194
+#: builtin/merge.c:195
 msgid "show a diffstat at the end of the merge"
 msgstr "afficher un diffstat à la fin de la fusion"
 
-#: builtin/merge.c:195
+#: builtin/merge.c:196
 msgid "(synonym to --stat)"
 msgstr "(synonyme de --stat)"
 
-#: builtin/merge.c:197
+#: builtin/merge.c:198
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 "ajouter (au plus <n>) éléments du journal court au message de validation de "
 "la fusion"
 
-#: builtin/merge.c:200
+#: builtin/merge.c:201
 msgid "create a single commit instead of doing a merge"
 msgstr "créer une validation unique au lieu de faire une fusion"
 
-#: builtin/merge.c:202
+#: builtin/merge.c:203
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "effectuer une validation si la fusion réussit (défaut)"
 
-#: builtin/merge.c:204
+#: builtin/merge.c:205
 msgid "edit message before committing"
 msgstr "éditer le message avant la validation"
 
-#: builtin/merge.c:205
+#: builtin/merge.c:206
 msgid "allow fast-forward (default)"
 msgstr "autoriser l'avance rapide (défaut)"
 
-#: builtin/merge.c:207
+#: builtin/merge.c:208
 msgid "abort if fast-forward is not possible"
 msgstr "abandonner si l'avance rapide n'est pas possible"
 
-#: builtin/merge.c:211
+#: builtin/merge.c:212
 msgid "Verify that the named commit has a valid GPG signature"
 msgstr "Vérifier que la validation a une signature GPG valide"
 
-#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
+#: builtin/merge.c:213 builtin/notes.c:741 builtin/revert.c:89
 msgid "strategy"
 msgstr "stratégie"
 
-#: builtin/merge.c:213
+#: builtin/merge.c:214
 msgid "merge strategy to use"
 msgstr "stratégie de fusion à utiliser"
 
-#: builtin/merge.c:214
+#: builtin/merge.c:215
 msgid "option=value"
 msgstr "option=valeur"
 
-#: builtin/merge.c:215
+#: builtin/merge.c:216
 msgid "option for selected merge strategy"
 msgstr "option pour la stratégie de fusion sélectionnée"
 
-#: builtin/merge.c:217
+#: builtin/merge.c:218
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr ""
 "message de validation de la fusion (pour une fusion sans avance rapide)"
 
-#: builtin/merge.c:221
+#: builtin/merge.c:222
 msgid "abort the current in-progress merge"
 msgstr "abandonner la fusion en cours"
 
@@ -6893,33 +7158,33 @@
 msgid "git write-tree failed to write a tree"
 msgstr "git write-tree a échoué à écrire un arbre"
 
-#: builtin/merge.c:681
+#: builtin/merge.c:677
 msgid "Not handling anything other than two heads merge."
 msgstr "Impossible de gérer autre chose que la fusion de deux têtes."
 
-#: builtin/merge.c:695
+#: builtin/merge.c:691
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Options inconnue pour merge-recursive : -X%s"
 
-#: builtin/merge.c:709
+#: builtin/merge.c:704
 #, c-format
 msgid "unable to write %s"
 msgstr "impossible d'écrire %s"
 
-#: builtin/merge.c:798
+#: builtin/merge.c:793
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "Impossible de lire depuis '%s'"
 
-#: builtin/merge.c:807
+#: builtin/merge.c:802
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 "Pas de validation de la fusion ; utilisez 'git commit' pour terminer la "
 "fusion.\n"
 
-#: builtin/merge.c:813
+#: builtin/merge.c:808
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -6936,164 +7201,164 @@
 "Les lignes commençant par '%c' seront ignorées, et un message vide\n"
 "abandonne la validation.\n"
 
-#: builtin/merge.c:837
+#: builtin/merge.c:832
 msgid "Empty commit message."
 msgstr "Message de validation vide."
 
-#: builtin/merge.c:849
+#: builtin/merge.c:844
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Merveilleux.\n"
 
-#: builtin/merge.c:914
+#: builtin/merge.c:907
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 "La fusion automatique a échoué ; réglez les conflits et validez le "
 "résultat.\n"
 
-#: builtin/merge.c:930
+#: builtin/merge.c:923
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "'%s' n'est pas une validation"
 
-#: builtin/merge.c:971
+#: builtin/merge.c:964
 msgid "No current branch."
 msgstr "Pas de branche courante."
 
-#: builtin/merge.c:973
+#: builtin/merge.c:966
 msgid "No remote for the current branch."
 msgstr "Pas de branche distante pour la branche courante."
 
-#: builtin/merge.c:975
+#: builtin/merge.c:968
 msgid "No default upstream defined for the current branch."
 msgstr "Pas de branche amont par défaut définie pour la branche courante."
 
-#: builtin/merge.c:980
+#: builtin/merge.c:973
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Pas de branche de suivi pour %s depuis %s"
 
-#: builtin/merge.c:1136
+#: builtin/merge.c:1129
 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:1152 git-pull.sh:31
+#: builtin/merge.c:1145
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
-"Please, commit your changes before you can merge."
+"Please, commit your changes before you merge."
 msgstr ""
 "Vous n'avez pas terminé votre fusion (MERGE_HEAD existe).\n"
-"Veuillez valider vos changements avant de pouvoir fusionner."
+"Veuillez valider vos modifications avant de pouvoir fusionner."
 
-#: builtin/merge.c:1155 git-pull.sh:34
+#: builtin/merge.c:1148 git-pull.sh:34
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Vous n'avez pas terminé votre fusion (MERGE_HEAD existe)."
 
-#: builtin/merge.c:1159
+#: builtin/merge.c:1152
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
-"Please, commit your changes before you can merge."
+"Please, commit your changes before you merge."
 msgstr ""
 "Vous n'avez pas terminé votre picorage (CHERRY_PICK_HEAD existe).\n"
-"Veuillez valider vos changements avant de pouvoir fusionner."
+"Veuillez valider vos modifications avant de pouvoir fusionner."
 
-#: builtin/merge.c:1162
+#: builtin/merge.c:1155
 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:1171
+#: builtin/merge.c:1164
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Vous ne pouvez pas combiner --squash avec --no-ff."
 
-#: builtin/merge.c:1180
+#: builtin/merge.c:1173
 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:1212
+#: builtin/merge.c:1205
 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:1215
+#: builtin/merge.c:1208
 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:1217
+#: builtin/merge.c:1210
 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:1222
+#: builtin/merge.c:1215
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - pas possible de fusionner ceci"
 
-#: builtin/merge.c:1273
+#: builtin/merge.c:1266
 #, 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:1276
+#: builtin/merge.c:1269
 #, 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:1279
+#: builtin/merge.c:1272
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "La validation %s n'a pas de signature GPG."
 
-#: builtin/merge.c:1282
+#: builtin/merge.c:1275
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "La validation %s a une signature GPG correcte par %s\n"
 
-#: builtin/merge.c:1366
+#: builtin/merge.c:1356
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Mise à jour %s..%s\n"
 
-#: builtin/merge.c:1405
+#: builtin/merge.c:1395
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Essai de fusion vraiment triviale dans l'index...\n"
 
-#: builtin/merge.c:1412
+#: builtin/merge.c:1402
 #, c-format
 msgid "Nope.\n"
 msgstr "Non.\n"
 
-#: builtin/merge.c:1444
+#: builtin/merge.c:1434
 msgid "Not possible to fast-forward, aborting."
 msgstr "Pas possible d'avancer rapidement, abandon."
 
-#: builtin/merge.c:1467 builtin/merge.c:1546
+#: builtin/merge.c:1457 builtin/merge.c:1536
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Retour de l'arbre à l'original...\n"
 
-#: builtin/merge.c:1471
+#: builtin/merge.c:1461
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Essai de la stratégie de fusion %s...\n"
 
-#: builtin/merge.c:1537
+#: builtin/merge.c:1527
 #, 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:1539
+#: builtin/merge.c:1529
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "La fusion avec la stratégie %s a échoué.\n"
 
-#: builtin/merge.c:1548
+#: builtin/merge.c:1538
 #, 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:1560
+#: builtin/merge.c:1550
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -7199,78 +7464,80 @@
 msgid "git mv [options] <source>... <destination>"
 msgstr "git mv [options] <source>... <destination>"
 
+#: builtin/mv.c:69
+#, c-format
+msgid "Directory %s is in index and no submodule?"
+msgstr "Le répertoire %s est dans l'index et pourtant aucun sous-module ?"
+
 #: builtin/mv.c:71
+msgid "Please stage your changes to .gitmodules or stash them to proceed"
+msgstr "Veuillez indexer vos modifications de .gitmodules ou les remiser pour continuer"
+
+#: builtin/mv.c:89
+#, c-format
+msgid "%.*s is in index"
+msgstr "%.*s est dans l'index"
+
+#: builtin/mv.c:111
 msgid "force move/rename even if target exists"
 msgstr "forcer le déplacement/renommage même si la cible existe"
 
-#: builtin/mv.c:72
+#: builtin/mv.c:112
 msgid "skip move/rename errors"
 msgstr "sauter les erreurs de déplacement/renommage"
 
-#: builtin/mv.c:122
+#: builtin/mv.c:151
+#, c-format
+msgid "destination '%s' is not a directory"
+msgstr "la destination '%s' n'est pas un répertoire"
+
+#: builtin/mv.c:162
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr "Vérification du renommage de '%s' en '%s'\n"
 
-#: builtin/mv.c:126
+#: builtin/mv.c:166
 msgid "bad source"
 msgstr "mauvaise source"
 
-#: builtin/mv.c:129
+#: builtin/mv.c:169
 msgid "can not move directory into itself"
 msgstr "impossible de déplacer un répertoire dans lui-même"
 
-#: builtin/mv.c:132
+#: builtin/mv.c:172
 msgid "cannot move directory over file"
 msgstr "impossible de déplacer un répertoire sur un fichier"
 
-#: builtin/mv.c:138
-#, c-format
-msgid "Huh? Directory %s is in index and no submodule?"
-msgstr ""
-"Hein ? Le répertoire %s est dans l'index et pourtant aucun sous-module ?"
-
-#: builtin/mv.c:140 builtin/rm.c:318
-msgid "Please, stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-"Veuillez indexer vos modifications de .gitmodules ou remisez-les pour "
-"continuer"
-
-#: builtin/mv.c:156
-#, c-format
-msgid "Huh? %.*s is in index?"
-msgstr "Hein ? %.*s est dans l'index ?"
-
-#: builtin/mv.c:169
+#: builtin/mv.c:181
 msgid "source directory is empty"
 msgstr "le répertoire source est vide"
 
-#: builtin/mv.c:205
+#: builtin/mv.c:206
 msgid "not under version control"
 msgstr "pas sous le contrôle de version"
 
-#: builtin/mv.c:207
+#: builtin/mv.c:209
 msgid "destination exists"
 msgstr "la destination existe"
 
-#: builtin/mv.c:215
+#: builtin/mv.c:217
 #, c-format
 msgid "overwriting '%s'"
 msgstr "écrasement de '%s'"
 
-#: builtin/mv.c:218
+#: builtin/mv.c:220
 msgid "Cannot overwrite"
 msgstr "Impossible d'écraser"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:223
 msgid "multiple sources for the same target"
 msgstr "multiples sources pour la même destination"
 
-#: builtin/mv.c:223
+#: builtin/mv.c:225
 msgid "destination directory does not exist"
 msgstr "le répertoire de destination n'existe pas"
 
-#: builtin/mv.c:243
+#: builtin/mv.c:232
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, source=%s, destination=%s"
@@ -7280,49 +7547,49 @@
 msgid "Renaming %s to %s\n"
 msgstr "Renommage de %s en %s\n"
 
-#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:358
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "le renommage de '%s' a échoué"
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:255
 msgid "git name-rev [options] <commit>..."
 msgstr "git name-rev [options] <validation>..."
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:256
 msgid "git name-rev [options] --all"
 msgstr "git name-rev [options] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:257
 msgid "git name-rev [options] --stdin"
 msgstr "git name-rev [options] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:309
 msgid "print only names (no SHA-1)"
 msgstr "afficher seulement les noms (pas de SHA-1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:310
 msgid "only use tags to name the commits"
 msgstr "utiliser seulement les étiquettes pour nommer les validations"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:312
 msgid "only use refs matching <pattern>"
 msgstr "utiliser seulement les références correspondant à <motif>"
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:314
 msgid "list all commits reachable from all refs"
 msgstr ""
 "afficher toutes les validations accessibles depuis toutes les références"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:315
 msgid "read from stdin"
 msgstr "lire depuis l'entrée standard"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:316
 msgid "allow to print `undefined` names (default)"
 msgstr "autoriser l'affichage des noms `non définis` (par défaut)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:322
 msgid "dereference tags in the input (internal use)"
 msgstr "déréférencer les étiquettes en entrée (usage interne)"
 
@@ -7438,118 +7705,118 @@
 msgid "git notes get-ref"
 msgstr "git notes get-ref"
 
-#: builtin/notes.c:137
+#: builtin/notes.c:136
 #, c-format
 msgid "unable to start 'show' for object '%s'"
 msgstr "impossible de démarrer 'show' pour l'objet '%s'"
 
-#: builtin/notes.c:141
+#: builtin/notes.c:140
 msgid "could not read 'show' output"
 msgstr "impossible de lire la sortie de 'show'"
 
-#: builtin/notes.c:149
+#: builtin/notes.c:148
 #, c-format
 msgid "failed to finish 'show' for object '%s'"
 msgstr "impossible de finir 'show' pour l'objet '%s'"
 
-#: builtin/notes.c:167 builtin/tag.c:373
+#: builtin/notes.c:166 builtin/tag.c:477
 #, c-format
 msgid "could not create file '%s'"
 msgstr "impossible de créer le fichier '%s'"
 
-#: builtin/notes.c:186
+#: builtin/notes.c:185
 msgid "Please supply the note contents using either -m or -F option"
 msgstr "Veuillez fournir le contenu de la note en utilisant l'option -m ou -F"
 
-#: builtin/notes.c:207 builtin/notes.c:848
+#: builtin/notes.c:206 builtin/notes.c:847
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Suppression de la note pour l'objet %s\n"
 
-#: builtin/notes.c:212
+#: builtin/notes.c:211
 msgid "unable to write note object"
 msgstr "impossible d'écrire l'objet note"
 
-#: builtin/notes.c:214
+#: builtin/notes.c:213
 #, c-format
-msgid "The note contents has been left in %s"
+msgid "The note contents have been left in %s"
 msgstr "Le contenu de la note a été laissé dans %s"
 
-#: builtin/notes.c:248 builtin/tag.c:604
+#: builtin/notes.c:247 builtin/tag.c:693
 #, c-format
 msgid "cannot read '%s'"
 msgstr "impossible de lire '%s'"
 
-#: builtin/notes.c:250 builtin/tag.c:607
+#: builtin/notes.c:249 builtin/tag.c:696
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "impossible d'ouvrir ou lire '%s'"
 
-#: builtin/notes.c:269 builtin/notes.c:320 builtin/notes.c:322
-#: builtin/notes.c:382 builtin/notes.c:436 builtin/notes.c:519
-#: builtin/notes.c:524 builtin/notes.c:599 builtin/notes.c:641
-#: builtin/notes.c:843 builtin/tag.c:620
+#: builtin/notes.c:268 builtin/notes.c:319 builtin/notes.c:321
+#: builtin/notes.c:381 builtin/notes.c:435 builtin/notes.c:518
+#: builtin/notes.c:523 builtin/notes.c:598 builtin/notes.c:640
+#: builtin/notes.c:842 builtin/tag.c:709
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Impossible de résoudre '%s' comme une référence valide."
 
-#: builtin/notes.c:272
+#: builtin/notes.c:271
 #, c-format
 msgid "Failed to read object '%s'."
 msgstr "Impossible de lire l'objet '%s'."
 
-#: builtin/notes.c:276
+#: builtin/notes.c:275
 #, c-format
 msgid "Cannot read note data from non-blob object '%s'."
 msgstr "Impossible de lire les informations de note d'un objet non-blob '%s'."
 
-#: builtin/notes.c:316
+#: builtin/notes.c:315
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "Ligne en entrée malformée : '%s'."
 
-#: builtin/notes.c:331
+#: builtin/notes.c:330
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "Impossible de copier les notes de '%s' vers '%s'"
 
-#: builtin/notes.c:375 builtin/notes.c:429 builtin/notes.c:502
-#: builtin/notes.c:514 builtin/notes.c:587 builtin/notes.c:634
-#: builtin/notes.c:908
+#: builtin/notes.c:374 builtin/notes.c:428 builtin/notes.c:501
+#: builtin/notes.c:513 builtin/notes.c:586 builtin/notes.c:633
+#: builtin/notes.c:907
 msgid "too many parameters"
 msgstr "trop de paramètres"
 
-#: builtin/notes.c:388 builtin/notes.c:647
+#: builtin/notes.c:387 builtin/notes.c:646
 #, c-format
 msgid "No note found for object %s."
 msgstr "Pas de note trouvée pour l'objet %s."
 
-#: builtin/notes.c:410 builtin/notes.c:567
+#: builtin/notes.c:409 builtin/notes.c:566
 msgid "note contents as a string"
 msgstr "contenu de la note sous forme de chaîne"
 
-#: builtin/notes.c:413 builtin/notes.c:570
+#: builtin/notes.c:412 builtin/notes.c:569
 msgid "note contents in a file"
 msgstr "contenu de la note dans un fichier"
 
-#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
-#: builtin/notes.c:575 builtin/tag.c:539
+#: builtin/notes.c:414 builtin/notes.c:417 builtin/notes.c:571
+#: builtin/notes.c:574 builtin/tag.c:628
 msgid "object"
 msgstr "objet"
 
-#: builtin/notes.c:416 builtin/notes.c:573
+#: builtin/notes.c:415 builtin/notes.c:572
 msgid "reuse and edit specified note object"
 msgstr "réutiliser et éditer l'objet de note spécifié"
 
-#: builtin/notes.c:419 builtin/notes.c:576
+#: builtin/notes.c:418 builtin/notes.c:575
 msgid "reuse specified note object"
 msgstr "réutiliser l'objet de note spécifié"
 
-#: builtin/notes.c:421 builtin/notes.c:489
+#: builtin/notes.c:420 builtin/notes.c:488
 msgid "replace existing notes"
 msgstr "remplacer les notes existantes"
 
-#: builtin/notes.c:455
+#: builtin/notes.c:454
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7558,25 +7825,25 @@
 "Impossible d'ajouter des notes. Des notes ont été trouvées pour l'objet %s. "
 "Utilisez '-f' pour écraser les notes existantes"
 
-#: builtin/notes.c:460 builtin/notes.c:537
+#: builtin/notes.c:459 builtin/notes.c:536
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Écrasement des notes existantes pour l'objet %s\n"
 
-#: builtin/notes.c:490
+#: builtin/notes.c:489
 msgid "read objects from stdin"
 msgstr "lire les objets depuis l'entrée standard"
 
-#: builtin/notes.c:492
+#: builtin/notes.c:491
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr ""
 "charger la configuration de réécriture pour <commande> (implique --stdin)"
 
-#: builtin/notes.c:510
+#: builtin/notes.c:509
 msgid "too few parameters"
 msgstr "pas assez de paramètres"
 
-#: builtin/notes.c:531
+#: builtin/notes.c:530
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7585,12 +7852,12 @@
 "Impossible de copier des notes. Des notes ont été trouvées pour l'objet %s. "
 "Utilisez '-f' pour écraser les notes existantes"
 
-#: builtin/notes.c:543
+#: builtin/notes.c:542
 #, c-format
 msgid "Missing notes on source object %s. Cannot copy."
 msgstr "Notes manquantes sur l'objet source %s. Impossible de copier."
 
-#: builtin/notes.c:592
+#: builtin/notes.c:591
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -7599,15 +7866,15 @@
 "Les options -m/-F/-c/-C sont obsolètes pour la sous-commande 'edit'.\n"
 "Veuillez utiliser 'git notes add -f -m/-F/-c/-C' à la place.\n"
 
-#: builtin/notes.c:739
+#: builtin/notes.c:738
 msgid "General options"
 msgstr "Options générales"
 
-#: builtin/notes.c:741
+#: builtin/notes.c:740
 msgid "Merge options"
 msgstr "Options de fusion"
 
-#: builtin/notes.c:743
+#: builtin/notes.c:742
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -7615,231 +7882,239 @@
 "résoudre les conflits de notes en utilisant la stratégie donnée (manual/ours/"
 "theirs/union/cat_sort_uniq)"
 
-#: builtin/notes.c:745
+#: builtin/notes.c:744
 msgid "Committing unmerged notes"
 msgstr "Validation des notes non fusionnées"
 
-#: builtin/notes.c:747
+#: builtin/notes.c:746
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "finaliser la fusion de notes en validant les notes non fusionnées"
 
-#: builtin/notes.c:749
+#: builtin/notes.c:748
 msgid "Aborting notes merge resolution"
 msgstr "Abandon de la résolution de fusion des notes"
 
-#: builtin/notes.c:751
+#: builtin/notes.c:750
 msgid "abort notes merge"
 msgstr "abandonner la fusion de notes"
 
-#: builtin/notes.c:846
+#: builtin/notes.c:845
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "L'objet %s n'a pas de note\n"
 
-#: builtin/notes.c:858
+#: builtin/notes.c:857
 msgid "attempt to remove non-existent note is not an error"
 msgstr ""
 "la tentative de suppression d'une note non existante n'est pas une erreur"
 
-#: builtin/notes.c:861
+#: builtin/notes.c:860
 msgid "read object names from the standard input"
 msgstr "lire les noms d'objet depuis l'entrée standard"
 
-#: builtin/notes.c:942
+#: builtin/notes.c:941
 msgid "notes-ref"
 msgstr "références-notes"
 
-#: builtin/notes.c:943
+#: builtin/notes.c:942
 msgid "use notes from <notes_ref>"
 msgstr "utiliser les notes depuis <références_notes>"
 
-#: builtin/notes.c:978 builtin/remote.c:1593
+#: builtin/notes.c:977 builtin/remote.c:1624
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Sous-commande inconnue : %s"
 
-#: builtin/pack-objects.c:25
+#: builtin/pack-objects.c:28
 msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
 msgstr ""
 "git pack-objects --stdout [options...] [< liste-références | < liste-objets]"
 
-#: builtin/pack-objects.c:26
+#: builtin/pack-objects.c:29
 msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
 msgstr ""
 "git pack-objects [options...] base-name [< liste-références | < liste-objets]"
 
-#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
+#: builtin/pack-objects.c:177 builtin/pack-objects.c:180
 #, c-format
 msgid "deflate error (%d)"
 msgstr "erreur de compression (%d)"
 
-#: builtin/pack-objects.c:771
+#: builtin/pack-objects.c:773
 msgid "Writing objects"
 msgstr "Écriture des objets"
 
-#: builtin/pack-objects.c:1012
+#: builtin/pack-objects.c:1015
 msgid "disabling bitmap writing, as some objects are not being packed"
-msgstr "désactivation de l'écriture en bitmap car certains objets ne sont pas compressés"
+msgstr ""
+"désactivation de l'écriture en bitmap car certains objets ne sont pas "
+"compressés"
 
-#: builtin/pack-objects.c:2174
+#: builtin/pack-objects.c:2175
 msgid "Compressing objects"
 msgstr "Compression des objets"
 
-#: builtin/pack-objects.c:2530
+#: builtin/pack-objects.c:2572
 #, c-format
 msgid "unsupported index version %s"
 msgstr "version d'index non supportée %s"
 
-#: builtin/pack-objects.c:2534
+#: builtin/pack-objects.c:2576
 #, c-format
 msgid "bad index version '%s'"
 msgstr "mauvaise version d'index '%s'"
 
-#: builtin/pack-objects.c:2557
+#: builtin/pack-objects.c:2599
 #, c-format
 msgid "option %s does not accept negative form"
 msgstr "l'option %s n'accepte pas de valeur négative"
 
-#: builtin/pack-objects.c:2561
+#: builtin/pack-objects.c:2603
 #, c-format
 msgid "unable to parse value '%s' for option %s"
 msgstr "impossible d'analyser la valeur '%s' pour l'option %s"
 
-#: builtin/pack-objects.c:2580
+#: builtin/pack-objects.c:2622
 msgid "do not show progress meter"
 msgstr "ne pas afficher la barre de progression"
 
-#: builtin/pack-objects.c:2582
+#: builtin/pack-objects.c:2624
 msgid "show progress meter"
 msgstr "afficher la barre de progression"
 
-#: builtin/pack-objects.c:2584
+#: builtin/pack-objects.c:2626
 msgid "show progress meter during object writing phase"
 msgstr "afficher la barre de progression durant la phase d'écrite des objets"
 
-#: builtin/pack-objects.c:2587
+#: builtin/pack-objects.c:2629
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "similaire à --all-progress quand la barre de progression est affichée"
 
-#: builtin/pack-objects.c:2588
+#: builtin/pack-objects.c:2630
 msgid "version[,offset]"
 msgstr "version[,offset]"
 
-#: builtin/pack-objects.c:2589
+#: builtin/pack-objects.c:2631
 msgid "write the pack index file in the specified idx format version"
 msgstr ""
 "écrire le fichier d'index du paquet dans le format d'index de version "
 "spécifié"
 
-#: builtin/pack-objects.c:2592
+#: builtin/pack-objects.c:2634
 msgid "maximum size of each output pack file"
 msgstr "taille maximum de chaque fichier paquet en sortie"
 
-#: builtin/pack-objects.c:2594
+#: builtin/pack-objects.c:2636
 msgid "ignore borrowed objects from alternate object store"
 msgstr "ignorer les objets empruntés à un autre magasin d'objets"
 
-#: builtin/pack-objects.c:2596
+#: builtin/pack-objects.c:2638
 msgid "ignore packed objects"
 msgstr "ignorer les objets empaquetés"
 
-#: builtin/pack-objects.c:2598
+#: builtin/pack-objects.c:2640
 msgid "limit pack window by objects"
 msgstr "limiter la fenêtre d'empaquetage par objets"
 
-#: builtin/pack-objects.c:2600
+#: builtin/pack-objects.c:2642
 msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 "limiter la fenêtre d'empaquetage par mémoire en plus de la limite d'objets"
 
-#: builtin/pack-objects.c:2602
+#: builtin/pack-objects.c:2644
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr ""
 "longueur maximum de la chaîne de delta autorisée dans le paquet résultant"
 
-#: builtin/pack-objects.c:2604
+#: builtin/pack-objects.c:2646
 msgid "reuse existing deltas"
 msgstr "réutiliser les deltas existants"
 
-#: builtin/pack-objects.c:2606
+#: builtin/pack-objects.c:2648
 msgid "reuse existing objects"
 msgstr "réutiliser les objets existants"
 
-#: builtin/pack-objects.c:2608
+#: builtin/pack-objects.c:2650
 msgid "use OFS_DELTA objects"
 msgstr "utiliser les objets OFS_DELTA"
 
-#: builtin/pack-objects.c:2610
+#: builtin/pack-objects.c:2652
 msgid "use threads when searching for best delta matches"
 msgstr ""
 "utiliser des fils lors de la recherche pour une meilleurs correspondance des "
 "deltas"
 
-#: builtin/pack-objects.c:2612
+#: builtin/pack-objects.c:2654
 msgid "do not create an empty pack output"
 msgstr "ne pas créer un paquet vide"
 
-#: builtin/pack-objects.c:2614
+#: builtin/pack-objects.c:2656
 msgid "read revision arguments from standard input"
 msgstr "lire les paramètres de révision depuis l'entrée standard"
 
-#: builtin/pack-objects.c:2616
+#: builtin/pack-objects.c:2658
 msgid "limit the objects to those that are not yet packed"
 msgstr "limiter les objets à ceux qui ne sont pas encore empaquetés"
 
-#: builtin/pack-objects.c:2619
+#: builtin/pack-objects.c:2661
 msgid "include objects reachable from any reference"
 msgstr "inclure les objets accessibles depuis toute référence"
 
-#: builtin/pack-objects.c:2622
+#: builtin/pack-objects.c:2664
 msgid "include objects referred by reflog entries"
 msgstr "inclure les objets référencés par les éléments de reflog"
 
-#: builtin/pack-objects.c:2625
+#: builtin/pack-objects.c:2667
+msgid "include objects referred to by the index"
+msgstr "inclure les objets référencés par l'index"
+
+#: builtin/pack-objects.c:2670
 msgid "output pack to stdout"
 msgstr "afficher l'empaquetage sur la sortie standard"
 
-#: builtin/pack-objects.c:2627
+#: builtin/pack-objects.c:2672
 msgid "include tag objects that refer to objects to be packed"
 msgstr "inclure les objets d'étiquettes qui réfèrent à des objets à empaqueter"
 
-#: builtin/pack-objects.c:2629
+#: builtin/pack-objects.c:2674
 msgid "keep unreachable objects"
 msgstr "garder les objets inaccessibles"
 
-#: builtin/pack-objects.c:2630 parse-options.h:140
+#: builtin/pack-objects.c:2675 parse-options.h:140
 msgid "time"
 msgstr "heure"
 
-#: builtin/pack-objects.c:2631
+#: builtin/pack-objects.c:2676
 msgid "unpack unreachable objects newer than <time>"
 msgstr "dépaqueter les objets inaccessibles plus récents que <heure>"
 
-#: builtin/pack-objects.c:2634
+#: builtin/pack-objects.c:2679
 msgid "create thin packs"
 msgstr "créer des paquets légers"
 
-#: builtin/pack-objects.c:2636
+#: builtin/pack-objects.c:2681
 msgid "ignore packs that have companion .keep file"
 msgstr "ignorer les paquets qui ont un fichier .keep"
 
-#: builtin/pack-objects.c:2638
+#: builtin/pack-objects.c:2683
 msgid "pack compression level"
 msgstr "niveau de compression du paquet"
 
-#: builtin/pack-objects.c:2640
+#: builtin/pack-objects.c:2685
 msgid "do not hide commits by grafts"
 msgstr "ne pas cacher les validations par greffes"
 
-#: builtin/pack-objects.c:2642
+#: builtin/pack-objects.c:2687
 msgid "use a bitmap index if available to speed up counting objects"
-msgstr "utiliser un index en bitmap si disponible pour accélerer le décompte des objets"
+msgstr ""
+"utiliser un index en bitmap si disponible pour accélerer le décompte des "
+"objets"
 
-#: builtin/pack-objects.c:2644
+#: builtin/pack-objects.c:2689
 msgid "write a bitmap index together with the pack index"
 msgstr "écrire un index en bitmap associé à l'index de paquet"
 
-#: builtin/pack-objects.c:2723
+#: builtin/pack-objects.c:2778
 msgid "Counting objects"
 msgstr "Décompte des objets"
 
@@ -7859,7 +8134,7 @@
 msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
 msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]"
 
-#: builtin/prune-packed.c:49
+#: builtin/prune-packed.c:40
 msgid "Removing duplicate objects"
 msgstr "Suppression des objets dupliqués"
 
@@ -7867,15 +8142,15 @@
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <heure>] [--] [<head>...]"
 
-#: builtin/prune.c:142
+#: builtin/prune.c:106
 msgid "do not remove, show only"
 msgstr "ne pas supprimer, afficher seulement"
 
-#: builtin/prune.c:143
+#: builtin/prune.c:107
 msgid "report pruned objects"
 msgstr "afficher les objets éliminés"
 
-#: builtin/prune.c:146
+#: builtin/prune.c:110
 msgid "expire objects older than <time>"
 msgstr "faire expirer les objets plus vieux que <heure>"
 
@@ -7891,7 +8166,7 @@
 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:139
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -7900,7 +8175,7 @@
 "Pour choisir l'option de manière permanente, voir push.default dans 'git "
 "help config'."
 
-#: builtin/push.c:143
+#: builtin/push.c:142
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -7925,7 +8200,7 @@
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:158
+#: builtin/push.c:157
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -7940,7 +8215,7 @@
 "\n"
 "    git push %s HEAD:<nom-de-la-branche-amont>\n"
 
-#: builtin/push.c:172
+#: builtin/push.c:171
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -7954,13 +8229,13 @@
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:180
+#: builtin/push.c:179
 #, 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:182
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -7971,7 +8246,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:205
 msgid ""
 "push.default is unset; its implicit value has changed in\n"
 "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
@@ -7997,33 +8272,39 @@
 msgstr ""
 "push.default n'est pas défini ; sa valeur implicite a changé dans Git 2.0\n"
 "de 'matching' vers 'simple'. Pour supprimer ce message et maintenir\n"
-"le comportement actuel après la modification de la valeur de défaut, utilisez :\n"
+"le comportement actuel après la modification de la valeur de défaut, "
+"utilisez :\n"
 "\n"
 "  git config --global push.default matching\n"
 "\n"
-"Pour supprimer ce message et adopter le nouveau comportement maintenant, utilisez :\n"
+"Pour supprimer ce message et adopter le nouveau comportement maintenant, "
+"utilisez :\n"
 "\n"
 "  git config --global push.default simple\n"
 "\n"
 "Quand push.default vaudra 'matching', git poussera les branches locales\n"
 "sur les branches distantes qui existent déjà avec le même nom.\n"
 "\n"
-"Depuis Git 2.0, Git utilise par défaut le comportement plus conservatif 'simple'\n"
-"qui ne pousse la branche courante que vers la branche distante correspondante\n"
+"Depuis Git 2.0, Git utilise par défaut le comportement plus conservatif "
+"'simple'\n"
+"qui ne pousse la branche courante que vers la branche distante "
+"correspondante\n"
 "que 'git pull' utilise pour mettre à jour la branche courante.\n"
 " \n"
 "Voir 'git help config' et chercher 'push.default' pour plus d'information.\n"
-"(le mode 'simple' a été introduit dans Git 1.7.11. Utilisez le mode similaire\n"
-"'current' au lieu de 'simple' si vous utilisez de temps en temps d'anciennes versions de Git)"
+"(le mode 'simple' a été introduit dans Git 1.7.11. Utilisez le mode "
+"similaire\n"
+"'current' au lieu de 'simple' si vous utilisez de temps en temps d'anciennes "
+"versions de Git)"
 
-#: builtin/push.c:273
+#: builtin/push.c:272
 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:279
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -8038,7 +8319,7 @@
 "Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus "
 "d'information."
 
-#: builtin/push.c:286
+#: builtin/push.c:285
 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"
@@ -8053,7 +8334,7 @@
 "Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus "
 "d'information."
 
-#: builtin/push.c:292
+#: builtin/push.c:291
 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"
@@ -8071,13 +8352,13 @@
 "Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus "
 "d'information."
 
-#: builtin/push.c:299
+#: builtin/push.c:298
 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:301
 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"
@@ -8089,22 +8370,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:360
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Poussée vers %s\n"
 
-#: builtin/push.c:365
+#: builtin/push.c:364
 #, 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:394
 #, c-format
 msgid "bad repository '%s'"
 msgstr "mauvais dépôt '%s'"
 
-#: builtin/push.c:396
+#: builtin/push.c:395
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -8126,100 +8407,104 @@
 "\n"
 "    git push <nom>\n"
 
-#: builtin/push.c:411
+#: builtin/push.c:410
 msgid "--all and --tags are incompatible"
 msgstr "--all et --tags sont incompatibles"
 
-#: builtin/push.c:412
+#: builtin/push.c:411
 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:416
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror et --tags sont incompatibles"
 
-#: builtin/push.c:418
+#: builtin/push.c:417
 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:422
 msgid "--all and --mirror are incompatible"
 msgstr "--all et --mirror sont incompatibles"
 
-#: builtin/push.c:483
+#: builtin/push.c:493
 msgid "repository"
 msgstr "dépôt"
 
-#: builtin/push.c:484
+#: builtin/push.c:494
 msgid "push all refs"
 msgstr "pousser toutes les références"
 
-#: builtin/push.c:485
+#: builtin/push.c:495
 msgid "mirror all refs"
 msgstr "refléter toutes les références"
 
-#: builtin/push.c:487
+#: builtin/push.c:497
 msgid "delete refs"
 msgstr "supprimer les références"
 
-#: builtin/push.c:488
+#: builtin/push.c:498
 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:491
+#: builtin/push.c:501
 msgid "force updates"
 msgstr "forcer les mises à jour"
 
-#: builtin/push.c:493
+#: builtin/push.c:503
 msgid "refname>:<expect"
 msgstr "nom de référence>:<attendu"
 
-#: builtin/push.c:494
+#: builtin/push.c:504
 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:496
+#: builtin/push.c:506
 msgid "check"
 msgstr "check"
 
-#: builtin/push.c:497
+#: builtin/push.c:507
 msgid "control recursive pushing of submodules"
 msgstr "contrôler la poussée récursive des sous-modules"
 
-#: builtin/push.c:499
+#: builtin/push.c:509
 msgid "use thin pack"
 msgstr "utiliser un empaquetage léger"
 
-#: builtin/push.c:500 builtin/push.c:501
+#: builtin/push.c:510 builtin/push.c:511
 msgid "receive pack program"
 msgstr "recevoir le programme d'empaquetage"
 
-#: builtin/push.c:502
+#: builtin/push.c:512
 msgid "set upstream for git pull/status"
 msgstr "définir la branche amont pour git pull/status"
 
-#: builtin/push.c:505
+#: builtin/push.c:515
 msgid "prune locally removed refs"
 msgstr "éliminer les références locales supprimées"
 
-#: builtin/push.c:507
+#: builtin/push.c:517
 msgid "bypass pre-push hook"
 msgstr "éviter d'utiliser le crochet pre-push"
 
-#: builtin/push.c:508
+#: builtin/push.c:518
 msgid "push missing but relevant tags"
 msgstr "pousser les étiquettes manquantes mais pertinentes"
 
-#: builtin/push.c:518
+#: builtin/push.c:520
+msgid "GPG sign the push"
+msgstr "signer la poussée avec GPG"
+
+#: builtin/push.c:529
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete est incompatible avec --all, --mirror et --tags"
 
-#: builtin/push.c:520
+#: builtin/push.c:531
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete n'a pas de sens sans aucune référence"
 
-#: builtin/read-tree.c:36
+#: builtin/read-tree.c:37
 msgid ""
 "git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] "
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
@@ -8230,67 +8515,67 @@
 "sparse-checkout] [--index-output=<fichier>] (--empty | <arbre ou apparenté "
 "1> [<arbre ou apparenté 2> [<arbre ou apparenté 3>]])"
 
-#: builtin/read-tree.c:109
+#: builtin/read-tree.c:110
 msgid "write resulting index to <file>"
 msgstr "écrire l'index résultant dans <fichier>"
 
-#: builtin/read-tree.c:112
+#: builtin/read-tree.c:113
 msgid "only empty the index"
 msgstr "juste vider l'index"
 
-#: builtin/read-tree.c:114
+#: builtin/read-tree.c:115
 msgid "Merging"
 msgstr "Fusion"
 
-#: builtin/read-tree.c:116
+#: builtin/read-tree.c:117
 msgid "perform a merge in addition to a read"
 msgstr "effectuer une fusion en plus d'une lecture"
 
-#: builtin/read-tree.c:118
+#: builtin/read-tree.c:119
 msgid "3-way merge if no file level merging required"
 msgstr "fusion à 3 points si aucune fusion de niveau fichier n'est requise"
 
-#: builtin/read-tree.c:120
+#: builtin/read-tree.c:121
 msgid "3-way merge in presence of adds and removes"
 msgstr "fusion à 3 points en présence d'ajouts et suppressions"
 
-#: builtin/read-tree.c:122
+#: builtin/read-tree.c:123
 msgid "same as -m, but discard unmerged entries"
 msgstr "comme -m, mais annule les éléments non fusionnés"
 
-#: builtin/read-tree.c:123
+#: builtin/read-tree.c:124
 msgid "<subdirectory>/"
 msgstr "<sous-répertoire>/"
 
-#: builtin/read-tree.c:124
+#: builtin/read-tree.c:125
 msgid "read the tree into the index under <subdirectory>/"
 msgstr "lire l'arbre dans l'index dans <sous-répertoire>/"
 
-#: builtin/read-tree.c:127
+#: builtin/read-tree.c:128
 msgid "update working tree with merge result"
 msgstr "mettre à jour la copie de travail avec le résultat de la fusion"
 
-#: builtin/read-tree.c:129
+#: builtin/read-tree.c:130
 msgid "gitignore"
 msgstr "gitignore"
 
-#: builtin/read-tree.c:130
+#: builtin/read-tree.c:131
 msgid "allow explicitly ignored files to be overwritten"
 msgstr "autoriser explicitement les fichiers ignorés à être écrasés"
 
-#: builtin/read-tree.c:133
+#: builtin/read-tree.c:134
 msgid "don't check the working tree after merging"
 msgstr "ne pas vérifier la copie de travail après la fusion"
 
-#: builtin/read-tree.c:134
+#: builtin/read-tree.c:135
 msgid "don't update the index or the work tree"
 msgstr "ne pas mettre à jour l'index ou la copie de travail"
 
-#: builtin/read-tree.c:136
+#: builtin/read-tree.c:137
 msgid "skip applying sparse checkout filter"
 msgstr "sauter l'application du filtre d'extraction creuse"
 
-#: builtin/read-tree.c:138
+#: builtin/read-tree.c:139
 msgid "debug unpack-trees"
 msgstr "déboguer unpack-trees"
 
@@ -8460,23 +8745,18 @@
 msgid "Could not setup master '%s'"
 msgstr "Impossible de paramétrer la maîtresse '%s'"
 
-#: builtin/remote.c:289
-#, c-format
-msgid "more than one %s"
-msgstr "plus d'un %s"
-
-#: builtin/remote.c:334
+#: builtin/remote.c:333
 #, 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:435 builtin/remote.c:443
+#: builtin/remote.c:434 builtin/remote.c:442
 msgid "(matching)"
 msgstr "(correspond)"
 
-#: builtin/remote.c:447
+#: builtin/remote.c:446
 msgid "(delete)"
 msgstr "(supprimer)"
 
@@ -8485,7 +8765,7 @@
 msgid "Could not append '%s' to '%s'"
 msgstr "Impossible d'ajouter '%s' à '%s'"
 
-#: builtin/remote.c:634 builtin/remote.c:787 builtin/remote.c:885
+#: builtin/remote.c:634 builtin/remote.c:798 builtin/remote.c:898
 #, c-format
 msgid "No such remote: %s"
 msgstr "Distante inconnue : %s"
@@ -8495,7 +8775,7 @@
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "Impossible de renommer la section de configuration '%s' en '%s'"
 
-#: builtin/remote.c:657 builtin/remote.c:794
+#: builtin/remote.c:657 builtin/remote.c:850
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Impossible de supprimer la section de configuration '%s'"
@@ -8531,12 +8811,12 @@
 msgid "creating '%s' failed"
 msgstr "échec de création de '%s'"
 
-#: builtin/remote.c:759
+#: builtin/remote.c:769
 #, c-format
 msgid "Could not remove branch %s"
 msgstr "Impossible de supprimer la branche %s"
 
-#: builtin/remote.c:829
+#: builtin/remote.c:836
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -8551,120 +8831,120 @@
 "supprimées ;\n"
 "pour les supprimer, utilisez :"
 
-#: builtin/remote.c:938
+#: builtin/remote.c:951
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " nouveau (le prochain rapatriement (fetch) stockera dans remotes/%s)"
 
-#: builtin/remote.c:941
+#: builtin/remote.c:954
 msgid " tracked"
 msgstr " suivi"
 
-#: builtin/remote.c:943
+#: builtin/remote.c:956
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " dépassé (utilisez 'git remote prune' pour supprimer)"
 
-#: builtin/remote.c:945
+#: builtin/remote.c:958
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:986
+#: builtin/remote.c:999
 #, 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:993
+#: builtin/remote.c:1006
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "rebase sur la distante %s"
 
-#: builtin/remote.c:996
+#: builtin/remote.c:1009
 #, c-format
 msgid " merges with remote %s"
 msgstr " fusionne avec la distante %s"
 
-#: builtin/remote.c:997
+#: builtin/remote.c:1010
 msgid "    and with remote"
 msgstr "    et avec la distante"
 
-#: builtin/remote.c:999
+#: builtin/remote.c:1012
 #, c-format
 msgid "merges with remote %s"
 msgstr "fusionne avec la distante %s"
 
-#: builtin/remote.c:1000
+#: builtin/remote.c:1013
 msgid "   and with remote"
 msgstr "   et avec la distante"
 
-#: builtin/remote.c:1046
+#: builtin/remote.c:1059
 msgid "create"
 msgstr "créer"
 
-#: builtin/remote.c:1049
+#: builtin/remote.c:1062
 msgid "delete"
 msgstr "supprimer"
 
-#: builtin/remote.c:1053
+#: builtin/remote.c:1066
 msgid "up to date"
 msgstr "à jour"
 
-#: builtin/remote.c:1056
+#: builtin/remote.c:1069
 msgid "fast-forwardable"
 msgstr "peut être mis à jour en avance rapide"
 
-#: builtin/remote.c:1059
+#: builtin/remote.c:1072
 msgid "local out of date"
 msgstr "le local n'est pas à jour"
 
-#: builtin/remote.c:1066
+#: builtin/remote.c:1079
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s force vers %-*s (%s)"
 
-#: builtin/remote.c:1069
+#: builtin/remote.c:1082
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s pousse vers %-*s (%s)"
 
-#: builtin/remote.c:1073
+#: builtin/remote.c:1086
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s force vers %s"
 
-#: builtin/remote.c:1076
+#: builtin/remote.c:1089
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s pousse vers %s"
 
-#: builtin/remote.c:1144
+#: builtin/remote.c:1157
 msgid "do not query remotes"
 msgstr "ne pas interroger les distantes"
 
-#: builtin/remote.c:1171
+#: builtin/remote.c:1184
 #, c-format
 msgid "* remote %s"
 msgstr "* distante %s"
 
-#: builtin/remote.c:1172
+#: builtin/remote.c:1185
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL de rapatriement : %s"
 
-#: builtin/remote.c:1173 builtin/remote.c:1318
+#: builtin/remote.c:1186 builtin/remote.c:1333
 msgid "(no URL)"
 msgstr "(pas d'URL)"
 
-#: builtin/remote.c:1182 builtin/remote.c:1184
+#: builtin/remote.c:1195 builtin/remote.c:1197
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  URL push : %s"
 
-#: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190
+#: builtin/remote.c:1199 builtin/remote.c:1201 builtin/remote.c:1203
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Branche HEAD : %s"
 
-#: builtin/remote.c:1192
+#: builtin/remote.c:1205
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
@@ -8672,247 +8952,305 @@
 "  Branche HEAD (la HEAD distante est ambiguë, peut être l'une des "
 "suivantes) :\n"
 
-#: builtin/remote.c:1204
+#: builtin/remote.c:1217
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Branche distante :%s"
 msgstr[1] "  Branches distantes :%s"
 
-#: builtin/remote.c:1207 builtin/remote.c:1234
+#: builtin/remote.c:1220 builtin/remote.c:1247
 msgid " (status not queried)"
 msgstr " (statut non demandé)"
 
-#: builtin/remote.c:1216
+#: builtin/remote.c:1229
 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:1224
+#: builtin/remote.c:1237
 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:1231
+#: builtin/remote.c:1244
 #, 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:1252
+#: builtin/remote.c:1265
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "définir refs/remotes/<nom>/HEAD selon la distante"
 
-#: builtin/remote.c:1254
+#: builtin/remote.c:1267
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "supprimer refs/remotes/<nom>/HEAD"
 
-#: builtin/remote.c:1269
+#: builtin/remote.c:1282
 msgid "Cannot determine remote HEAD"
 msgstr "Impossible de déterminer la HEAD distante"
 
-#: builtin/remote.c:1271
+#: builtin/remote.c:1284
 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:1281
+#: builtin/remote.c:1294
 #, c-format
 msgid "Could not delete %s"
 msgstr "Impossible de supprimer %s"
 
-#: builtin/remote.c:1289
+#: builtin/remote.c:1302
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Référence non valide : %s"
 
-#: builtin/remote.c:1291
+#: builtin/remote.c:1304
 #, c-format
 msgid "Could not setup %s"
 msgstr "Impossible de paramétrer %s"
 
-#: builtin/remote.c:1307
+#: builtin/remote.c:1322
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s se retrouvera en suspens !"
 
-#: builtin/remote.c:1308
+#: builtin/remote.c:1323
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s se retrouve en suspens !"
 
-#: builtin/remote.c:1314
+#: builtin/remote.c:1329
 #, c-format
 msgid "Pruning %s"
 msgstr "Élimination de %s"
 
-#: builtin/remote.c:1315
+#: builtin/remote.c:1330
 #, c-format
 msgid "URL: %s"
 msgstr "URL : %s"
 
-#: builtin/remote.c:1328
+#: builtin/remote.c:1357
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [serait éliminé] %s"
 
-#: builtin/remote.c:1331
+#: builtin/remote.c:1360
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [éliminé] %s"
 
-#: builtin/remote.c:1374
+#: builtin/remote.c:1405
 msgid "prune remotes after fetching"
 msgstr "éliminer les distants après le rapatriement"
 
-#: builtin/remote.c:1440 builtin/remote.c:1514
+#: builtin/remote.c:1471 builtin/remote.c:1545
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Pas de serveur remote '%s'"
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1491
 msgid "add branch"
 msgstr "ajouter une branche"
 
-#: builtin/remote.c:1467
+#: builtin/remote.c:1498
 msgid "no remote specified"
 msgstr "pas de serveur distant spécifié"
 
-#: builtin/remote.c:1489
+#: builtin/remote.c:1520
 msgid "manipulate push URLs"
 msgstr "manipuler les URLs push"
 
-#: builtin/remote.c:1491
+#: builtin/remote.c:1522
 msgid "add URL"
 msgstr "ajouter une URL"
 
-#: builtin/remote.c:1493
+#: builtin/remote.c:1524
 msgid "delete URLs"
 msgstr "supprimer des URLs"
 
-#: builtin/remote.c:1500
+#: builtin/remote.c:1531
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete n'a aucun sens"
 
-#: builtin/remote.c:1540
+#: builtin/remote.c:1571
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Motif d'URL ancien invalide : %s"
 
-#: builtin/remote.c:1548
+#: builtin/remote.c:1579
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Pas d'URL trouvée : %s"
 
-#: builtin/remote.c:1550
+#: builtin/remote.c:1581
 msgid "Will not delete all non-push URLs"
 msgstr "Pas de suppression de toutes les URLs non-push"
 
-#: builtin/remote.c:1564
+#: builtin/remote.c:1595
 msgid "be verbose; must be placed before a subcommand"
 msgstr "être verbeux : doit être placé avant une sous-commande"
 
-#: builtin/repack.c:16
+#: builtin/repack.c:17
 msgid "git repack [options]"
 msgstr "git repack [options]"
 
-#: builtin/repack.c:156
+#: builtin/repack.c:160
 msgid "pack everything in a single pack"
 msgstr "empaqueter tout dans un seul paquet"
 
-#: builtin/repack.c:158
+#: builtin/repack.c:162
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "identique à -a et transformer les objets inaccessibles en suspens"
 
-#: builtin/repack.c:161
+#: builtin/repack.c:165
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "supprimer les paquets redondants et lancer git-prune-packed"
 
-#: builtin/repack.c:163
+#: builtin/repack.c:167
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "passer --no-reuse-delta à git-pack-objects"
 
-#: builtin/repack.c:165
+#: builtin/repack.c:169
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "passer --no-reuse-object à git-pack-objects"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:171
 msgid "do not run git-update-server-info"
 msgstr "ne pas lancer git update-server-info"
 
-#: builtin/repack.c:170
+#: builtin/repack.c:174
 msgid "pass --local to git-pack-objects"
 msgstr "passer --local à git-pack-objects"
 
-#: builtin/repack.c:172
+#: builtin/repack.c:176
 msgid "write bitmap index"
 msgstr "écrire un index en bitmap"
 
-#: builtin/repack.c:173
+#: builtin/repack.c:177
 msgid "approxidate"
 msgstr "date approximative"
 
-#: builtin/repack.c:174
+#: builtin/repack.c:178
 msgid "with -A, do not loosen objects older than this"
 msgstr "avec -A, ne pas suspendre les objets plus vieux que celui-ci"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:180
 msgid "size of the window used for delta compression"
 msgstr "taille de la fenêtre utilisée pour la compression des deltas"
 
-#: builtin/repack.c:177 builtin/repack.c:181
+#: builtin/repack.c:181 builtin/repack.c:185
 msgid "bytes"
 msgstr "octets"
 
-#: builtin/repack.c:178
+#: builtin/repack.c:182
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr ""
 "idem ci-dessus, mais limiter la taille mémoire au lieu du nombre d'éléments"
 
-#: builtin/repack.c:180
+#: builtin/repack.c:184
 msgid "limits the maximum delta depth"
 msgstr "limite la profondeur maximale des deltas"
 
-#: builtin/repack.c:182
+#: builtin/repack.c:186
 msgid "maximum size of each packfile"
 msgstr "taille maximum de chaque fichier paquet"
 
-#: builtin/repack.c:184
+#: builtin/repack.c:188
 msgid "repack objects in packs marked with .keep"
 msgstr "réempaqueter les objets dans des paquets marqués avec .keep"
 
-#: builtin/repack.c:371
+#: builtin/repack.c:374
 #, c-format
 msgid "removing '%s' failed"
 msgstr "la suppression de '%s' a échoué"
 
-#: builtin/replace.c:17
+#: builtin/replace.c:19
 msgid "git replace [-f] <object> <replacement>"
 msgstr "git replace [-f] <objet> <remplacement>"
 
-#: builtin/replace.c:18
+#: builtin/replace.c:20
+msgid "git replace [-f] --edit <object>"
+msgstr "git replace [-f] --edit <objet>"
+
+#: builtin/replace.c:21
+msgid "git replace [-f] --graft <commit> [<parent>...]"
+msgstr "git replace [-f] --graft <commit> [<parent>...]"
+
+#: builtin/replace.c:22
 msgid "git replace -d <object>..."
 msgstr "git replace -d <objet>..."
 
-#: builtin/replace.c:19
+#: builtin/replace.c:23
 msgid "git replace [--format=<format>] [-l [<pattern>]]"
 msgstr "git replace [--format=<format>] [-l [<motif>]]"
 
-#: builtin/replace.c:174
+#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#, c-format
+msgid "Not a valid object name: '%s'"
+msgstr "Nom d'objet invalide : '%s'"
+
+#: builtin/replace.c:355
+#, c-format
+msgid "bad mergetag in commit '%s'"
+msgstr "mauvaise étiquette de fusion dans le commit '%s'"
+
+#: builtin/replace.c:357
+#, c-format
+msgid "malformed mergetag in commit '%s'"
+msgstr "étiquette de fusion malformée dans le commit '%s'"
+
+#: builtin/replace.c:368
+#, c-format
+msgid ""
+"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
+"instead of --graft"
+msgstr ""
+"le commit original '%s' contient l'étiquette de fusion '%s' qui a disparu ; "
+"utilisez --edit au lieu de --graft"
+
+#: builtin/replace.c:401
+#, c-format
+msgid "the original commit '%s' has a gpg signature."
+msgstr "le commit original '%s' contient une signature GPG."
+
+#: builtin/replace.c:402
+msgid "the signature will be removed in the replacement commit!"
+msgstr "la signature sera éliminée dans la validation de remplacement !"
+
+#: builtin/replace.c:408
+#, c-format
+msgid "could not write replacement commit for: '%s'"
+msgstr "Impossible d'écrire le commit de remplacement pour '%s'"
+
+#: builtin/replace.c:432
 msgid "list replace refs"
 msgstr "afficher les références de remplacement"
 
-#: builtin/replace.c:175
+#: builtin/replace.c:433
 msgid "delete replace refs"
 msgstr "supprimer les références de remplacement"
 
-#: builtin/replace.c:176
+#: builtin/replace.c:434
+msgid "edit existing object"
+msgstr "éditer l'objet existant"
+
+#: builtin/replace.c:435
+msgid "change a commit's parents"
+msgstr "Modifier les parents d'un commit"
+
+#: builtin/replace.c:436
 msgid "replace the ref if it exists"
 msgstr "remplacer la référence si elle existe"
 
-#: builtin/replace.c:177
+#: builtin/replace.c:437
+msgid "do not pretty-print contents for --edit"
+msgstr "afficher sans mise en forme pour --edit"
+
+#: builtin/replace.c:438
 msgid "use this format"
 msgstr "utiliser ce format"
 
@@ -8924,156 +9262,158 @@
 msgid "register clean resolutions in index"
 msgstr "enregistrer des résolutions propres dans l'index"
 
-#: builtin/reset.c:25
+#: builtin/reset.c:26
 msgid ""
 "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
 msgstr ""
 "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
 
-#: builtin/reset.c:26
+#: builtin/reset.c:27
 msgid "git reset [-q] <tree-ish> [--] <paths>..."
 msgstr "git reset [-q] <arbre ou apparenté> [--] <chemins>..."
 
-#: builtin/reset.c:27
+#: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
 msgstr "git reset --patch [<arbre ou apparenté>] [--] [<chemins>...]"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "mixed"
 msgstr "mixed"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "soft"
 msgstr "soft"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "hard"
 msgstr "hard"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "merge"
 msgstr "merge"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "keep"
 msgstr "keep"
 
-#: builtin/reset.c:73
+#: builtin/reset.c:74
 msgid "You do not have a valid HEAD."
 msgstr "Vous n'avez pas une HEAD valide."
 
-#: builtin/reset.c:75
+#: builtin/reset.c:76
 msgid "Failed to find tree of HEAD."
 msgstr "Impossible de trouver l'arbre pour HEAD."
 
-#: builtin/reset.c:81
+#: builtin/reset.c:82
 #, c-format
 msgid "Failed to find tree of %s."
 msgstr "Impossible de trouver l'arbre pour %s."
 
-#: builtin/reset.c:99
+#: builtin/reset.c:100
 #, c-format
 msgid "HEAD is now at %s"
 msgstr "HEAD est maintenant à %s"
 
-#: builtin/reset.c:182
+#: builtin/reset.c:183
 #, c-format
 msgid "Cannot do a %s reset in the middle of a merge."
 msgstr "Impossible de faire un \"reset %s\" au milieu d'une fusion."
 
-#: builtin/reset.c:273
+#: builtin/reset.c:276
 msgid "be quiet, only report errors"
 msgstr "être silencieux, afficher seulement les erreurs"
 
-#: builtin/reset.c:275
+#: builtin/reset.c:278
 msgid "reset HEAD and index"
 msgstr "réinitialiser HEAD et l'index"
 
-#: builtin/reset.c:276
+#: builtin/reset.c:279
 msgid "reset only HEAD"
 msgstr "réinitialiser seulement HEAD"
 
-#: builtin/reset.c:278 builtin/reset.c:280
+#: builtin/reset.c:281 builtin/reset.c:283
 msgid "reset HEAD, index and working tree"
 msgstr "réinitialiser HEAD, l'index et la copie de travail"
 
-#: builtin/reset.c:282
+#: builtin/reset.c:285
 msgid "reset HEAD but keep local changes"
 msgstr "réinitialiser HEAD mais garder les changements locaux"
 
-#: builtin/reset.c:285
+#: builtin/reset.c:288
 msgid "record only the fact that removed paths will be added later"
-msgstr "enregistrer seulement le fait que les chemins effacés seront ajoutés plus tard"
+msgstr ""
+"enregistrer seulement le fait que les chemins effacés seront ajoutés plus "
+"tard"
 
-#: builtin/reset.c:302
+#: builtin/reset.c:305
 #, c-format
 msgid "Failed to resolve '%s' as a valid revision."
 msgstr "Échec de résolution de '%s' comme une révision valide."
 
-#: builtin/reset.c:305 builtin/reset.c:313
+#: builtin/reset.c:308 builtin/reset.c:316
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "Impossible d'analyser l'objet '%s'."
 
-#: builtin/reset.c:310
+#: builtin/reset.c:313
 #, c-format
 msgid "Failed to resolve '%s' as a valid tree."
 msgstr "Échec de résolution de '%s' comme un arbre valide."
 
-#: builtin/reset.c:319
+#: builtin/reset.c:322
 msgid "--patch is incompatible with --{hard,mixed,soft}"
 msgstr "--patch est incompatible avec --{hard,mixed,soft}"
 
-#: builtin/reset.c:328
+#: builtin/reset.c:331
 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
 msgstr ""
 "--mixed avec des chemins est obsolète ; utilisez 'git reset -- <paths>' à la "
 "place."
 
-#: builtin/reset.c:330
+#: builtin/reset.c:333
 #, c-format
 msgid "Cannot do %s reset with paths."
 msgstr "Impossible de faire un \"%s reset\" avec des chemins."
 
-#: builtin/reset.c:340
+#: builtin/reset.c:343
 #, c-format
 msgid "%s reset is not allowed in a bare repository"
 msgstr "Le \"%s reset\" n'est pas permis dans un dépôt nu"
 
-#: builtin/reset.c:344
+#: builtin/reset.c:347
 msgid "-N can only be used with --mixed"
 msgstr "-N ne peut être utilisé qu'avec --mixed"
 
-#: builtin/reset.c:361
+#: builtin/reset.c:364
 msgid "Unstaged changes after reset:"
 msgstr "Modifications non indexées après reset :"
 
-#: builtin/reset.c:367
+#: builtin/reset.c:370
 #, c-format
 msgid "Could not reset index file to revision '%s'."
 msgstr "Impossible de réinitialiser le fichier d'index à la révision '%s'."
 
-#: builtin/reset.c:372
+#: builtin/reset.c:374
 msgid "Could not write new index file."
 msgstr "Impossible d'écrire le nouveau fichier d'index."
 
-#: builtin/rev-parse.c:359
+#: builtin/rev-parse.c:361
 msgid "git rev-parse --parseopt [options] -- [<args>...]"
 msgstr "git rev-parse --parseopt [options] -- [<arguments>...]"
 
-#: builtin/rev-parse.c:364
+#: builtin/rev-parse.c:366
 msgid "keep the `--` passed as an arg"
 msgstr "garder le `--` passé en argument"
 
-#: builtin/rev-parse.c:366
+#: builtin/rev-parse.c:368
 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:369
+#: builtin/rev-parse.c:371
 msgid "output in stuck long form"
 msgstr "sortie en forme longue fixée"
 
-#: builtin/rev-parse.c:497
+#: builtin/rev-parse.c:499
 msgid ""
 "git rev-parse --parseopt [options] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -9186,13 +9526,13 @@
 "the following submodule (or one of its nested submodules)\n"
 "uses a .git directory:"
 msgid_plural ""
-"the following submodules (or one of its nested submodules)\n"
+"the following submodules (or one of their nested submodules)\n"
 "use a .git directory:"
 msgstr[0] ""
 "le sous-module suivant (ou un de ses sous-modules imbriqués)\n"
 "utilise un répertoire .git :"
 msgstr[1] ""
-"les sous-modules suivants (ou un de ses sous-modules imbriqués)\n"
+"les sous-modules suivants (ou un de leurs sous-modules imbriqués)\n"
 "utilisent un répertoire .git :"
 
 #: builtin/rm.c:71
@@ -9266,6 +9606,12 @@
 msgid "exit with a zero status even if nothing matched"
 msgstr "sortir avec un statut zéro même si rien ne correspondait"
 
+#: builtin/rm.c:318
+msgid "Please, stage your changes to .gitmodules or stash them to proceed"
+msgstr ""
+"Veuillez indexer vos modifications de .gitmodules ou remisez-les pour "
+"continuer"
+
 #: builtin/rm.c:336
 #, c-format
 msgid "not removing '%s' recursively without -r"
@@ -9459,11 +9805,11 @@
 msgid "shorten ref output"
 msgstr "raccourcir l'affichage de la référence"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
 msgid "reason"
 msgstr "raison"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
 msgid "reason of the update"
 msgstr "raison de la mise à jour"
 
@@ -9490,327 +9836,330 @@
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <nométiquette>..."
 
-#: builtin/tag.c:67
+#: builtin/tag.c:69
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "objet malformé à '%s'"
 
-#: builtin/tag.c:239
+#: builtin/tag.c:301
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "nom d'étiquette trop long : %.*s..."
 
-#: builtin/tag.c:244
+#: builtin/tag.c:306
 #, c-format
 msgid "tag '%s' not found."
 msgstr "étiquette '%s' non trouvée."
 
-#: builtin/tag.c:259
+#: builtin/tag.c:321
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
-msgstr "Étiquette '%s' supprimée (elle était %s)\n"
+msgstr "Étiquette '%s' supprimée (elle était sur %s)\n"
 
-#: builtin/tag.c:271
+#: builtin/tag.c:333
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "impossible de vérifier l'étiquette '%s'"
 
-#: builtin/tag.c:281
+#: builtin/tag.c:343
 #, c-format
 msgid ""
 "\n"
-"Write a tag message\n"
+"Write a message for tag:\n"
+"  %s\n"
 "Lines starting with '%c' will be ignored.\n"
 msgstr ""
 "\n"
-"Écrire un message pour l'étiquette\n"
+"Écrivez un message pour l'étiquette :\n"
+"  %s\n"
 "Les lignes commençant par '%c' seront ignorées.\n"
 
-#: builtin/tag.c:285
+#: builtin/tag.c:347
 #, c-format
 msgid ""
 "\n"
-"Write a tag message\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"
-"Écrire un message pour l'étiquette\n"
+"Écrivez un message pour l'étiquette :\n"
+"  %s\n"
 "Les lignes commençant par '%c' seront gardées ; vous pouvez les retirer vous-"
 "même si vous le souhaitez.\n"
 
-#: builtin/tag.c:324
+#: 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
 msgid "unable to sign the tag"
 msgstr "impossible de signer l'étiquette"
 
-#: builtin/tag.c:326
+#: builtin/tag.c:430
 msgid "unable to write tag file"
 msgstr "impossible d'écrire le fichier d'étiquettes"
 
-#: builtin/tag.c:351
+#: builtin/tag.c:455
 msgid "bad object type."
 msgstr "mauvais type d'objet."
 
-#: builtin/tag.c:364
+#: builtin/tag.c:468
 msgid "tag header too big."
 msgstr "en-tête d'étiquette trop gros."
 
-#: builtin/tag.c:400
+#: builtin/tag.c:504
 msgid "no tag message?"
 msgstr "pas de message pour l'étiquette ?"
 
-#: builtin/tag.c:406
+#: builtin/tag.c:510
 #, 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:455
+#: builtin/tag.c:559
 msgid "switch 'points-at' requires an object"
 msgstr "le commutateur 'points-at' a besoin d'un objet"
 
-#: builtin/tag.c:457
+#: builtin/tag.c:561
 #, c-format
 msgid "malformed object name '%s'"
 msgstr "nom d'objet malformé '%s'"
 
-#: builtin/tag.c:480
-#, c-format
-msgid "unsupported sort specification %s"
-msgstr "spécification de tri non supportée %s"
-
-#: builtin/tag.c:500
+#: builtin/tag.c:589
 msgid "list tag names"
 msgstr "afficher les noms des étiquettes"
 
-#: builtin/tag.c:502
+#: builtin/tag.c:591
 msgid "print <n> lines of each tag message"
 msgstr "affiche <n> lignes de chaque message d'étiquette"
 
-#: builtin/tag.c:504
+#: builtin/tag.c:593
 msgid "delete tags"
 msgstr "supprimer des étiquettes"
 
-#: builtin/tag.c:505
+#: builtin/tag.c:594
 msgid "verify tags"
 msgstr "vérifier des étiquettes"
 
-#: builtin/tag.c:507
+#: builtin/tag.c:596
 msgid "Tag creation options"
 msgstr "Options de création de l'étiquette"
 
-#: builtin/tag.c:509
+#: builtin/tag.c:598
 msgid "annotated tag, needs a message"
 msgstr "étiquette annotée, nécessite un message"
 
-#: builtin/tag.c:511
+#: builtin/tag.c:600
 msgid "tag message"
 msgstr "message pour l'étiquette"
 
-#: builtin/tag.c:513
+#: builtin/tag.c:602
 msgid "annotated and GPG-signed tag"
 msgstr "étiquette annotée et signée avec GPG"
 
-#: builtin/tag.c:517
+#: builtin/tag.c:606
 msgid "use another key to sign the tag"
 msgstr "utiliser une autre clé pour signer l'étiquette"
 
-#: builtin/tag.c:518
+#: builtin/tag.c:607
 msgid "replace the tag if exists"
 msgstr "remplacer l'étiquette si elle existe"
 
-#: builtin/tag.c:519
+#: builtin/tag.c:608
 msgid "show tag list in columns"
 msgstr "afficher la liste des étiquettes sous forme de colonnes"
 
-#: builtin/tag.c:521
+#: builtin/tag.c:610
 msgid "sort tags"
 msgstr "trier les étiquettes"
 
-#: builtin/tag.c:525
+#: builtin/tag.c:614
 msgid "Tag listing options"
 msgstr "Options d'affichage des étiquettes"
 
-#: builtin/tag.c:528 builtin/tag.c:534
+#: builtin/tag.c:617 builtin/tag.c:623
 msgid "print only tags that contain the commit"
 msgstr "afficher seulement les étiquettes qui contiennent la validation"
 
-#: builtin/tag.c:540
+#: builtin/tag.c:629
 msgid "print only tags of the object"
 msgstr "afficher seulement les étiquettes de l'objet"
 
-#: builtin/tag.c:566
+#: builtin/tag.c:655
 msgid "--column and -n are incompatible"
 msgstr "--column et -n sont incompatibles"
 
-#: builtin/tag.c:578
+#: builtin/tag.c:667
 msgid "--sort and -n are incompatible"
 msgstr "--sort et -n sont incompatibles"
 
-#: builtin/tag.c:585
+#: builtin/tag.c:674
 msgid "-n option is only allowed with -l."
 msgstr "l'option -n est autorisée seulement avec -l."
 
-#: builtin/tag.c:587
+#: builtin/tag.c:676
 msgid "--contains option is only allowed with -l."
 msgstr "l'option --contains est autorisée seulement avec -l."
 
-#: builtin/tag.c:589
+#: builtin/tag.c:678
 msgid "--points-at option is only allowed with -l."
 msgstr "l'option --points-at est autorisée seulement avec -l."
 
-#: builtin/tag.c:597
+#: builtin/tag.c:686
 msgid "only one -F or -m option is allowed."
 msgstr "une seule option -F ou -m est autorisée."
 
-#: builtin/tag.c:617
+#: builtin/tag.c:706
 msgid "too many params"
 msgstr "trop de paramètres"
 
-#: builtin/tag.c:623
+#: builtin/tag.c:712
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' n'est pas un nom d'étiquette valide."
 
-#: builtin/tag.c:628
+#: builtin/tag.c:717
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "l'étiquette '%s' existe déjà"
 
-#: builtin/tag.c:646
-#, c-format
-msgid "%s: cannot lock the ref"
-msgstr "%s : impossible de verrouiller la référence"
-
-#: builtin/tag.c:648
-#, c-format
-msgid "%s: cannot update the ref"
-msgstr "%s : impossible de mettre à jour la référence"
-
-#: builtin/tag.c:650
+#: builtin/tag.c:741
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
-msgstr "Étiquette '%s' mise à jour (elle était %s)\n"
+msgstr "Étiquette '%s' mise à jour (elle était sur %s)\n"
 
-#: builtin/unpack-objects.c:483
+#: builtin/unpack-objects.c:489
 msgid "Unpacking objects"
 msgstr "Dépaquetage des objets"
 
-#: builtin/update-index.c:399
+#: builtin/update-index.c:403
 msgid "git update-index [options] [--] [<file>...]"
 msgstr "git update-index [options] [--] [<fichier>...]"
 
-#: builtin/update-index.c:748
+#: builtin/update-index.c:756
 msgid "continue refresh even when index needs update"
 msgstr "continuer de rafraîchir même si l'index a besoin d'une mise à jour"
 
-#: builtin/update-index.c:751
+#: builtin/update-index.c:759
 msgid "refresh: ignore submodules"
 msgstr "rafraîchir : ignorer les sous-modules"
 
-#: builtin/update-index.c:754
+#: builtin/update-index.c:762
 msgid "do not ignore new files"
 msgstr "ne pas ignorer les nouveaux fichiers"
 
-#: builtin/update-index.c:756
+#: builtin/update-index.c:764
 msgid "let files replace directories and vice-versa"
 msgstr "laisser les fichiers remplacer des répertoires et vice-versa"
 
-#: builtin/update-index.c:758
+#: builtin/update-index.c:766
 msgid "notice files missing from worktree"
 msgstr "aviser des fichiers manquants dans la copie de travail"
 
-#: builtin/update-index.c:760
+#: builtin/update-index.c:768
 msgid "refresh even if index contains unmerged entries"
 msgstr "rafraîchir même si l'index contient des éléments non fusionnés"
 
-#: builtin/update-index.c:763
+#: builtin/update-index.c:771
 msgid "refresh stat information"
 msgstr "rafraîchir l'information de stat"
 
-#: builtin/update-index.c:767
+#: builtin/update-index.c:775
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "comme --refresh, mais en ignorant l'option assume-unchanged"
 
-#: builtin/update-index.c:771
+#: builtin/update-index.c:779
 msgid "<mode>,<object>,<path>"
 msgstr "<mode>, <objet>, <chemin>"
 
-#: builtin/update-index.c:772
+#: builtin/update-index.c:780
 msgid "add the specified entry to the index"
 msgstr "ajouter l'élément spécifié dans l'index"
 
-#: builtin/update-index.c:776
+#: builtin/update-index.c:784
 msgid "(+/-)x"
 msgstr "(+/-)x"
 
-#: builtin/update-index.c:777
+#: builtin/update-index.c:785
 msgid "override the executable bit of the listed files"
 msgstr "outrepasser le bit exécutable pour les fichiers listés"
 
-#: builtin/update-index.c:781
+#: builtin/update-index.c:789
 msgid "mark files as \"not changing\""
 msgstr "marquer les fichiers comme \"non changeants\""
 
-#: builtin/update-index.c:784
+#: builtin/update-index.c:792
 msgid "clear assumed-unchanged bit"
 msgstr "mettre à zéro le bit supposé-non-modifié"
 
-#: builtin/update-index.c:787
+#: builtin/update-index.c:795
 msgid "mark files as \"index-only\""
 msgstr "marquer les fichiers comme \"index seulement\""
 
-#: builtin/update-index.c:790
+#: builtin/update-index.c:798
 msgid "clear skip-worktree bit"
 msgstr "mettre à zéro le bit sauter-la-copie-de travail"
 
-#: builtin/update-index.c:793
+#: builtin/update-index.c:801
 msgid "add to index only; do not add content to object database"
 msgstr ""
 "ajouter seulement à l'index ; ne pas ajouter le contenu dans la base de "
 "données des objets"
 
-#: builtin/update-index.c:795
+#: builtin/update-index.c:803
 msgid "remove named paths even if present in worktree"
 msgstr ""
 "supprimer les chemins nommés même s'ils sont présents dans la copie de "
 "travail"
 
-#: builtin/update-index.c:797
+#: builtin/update-index.c:805
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "avec --stdin : les lignes en entrée sont terminées par des octets nuls"
 
-#: builtin/update-index.c:799
+#: builtin/update-index.c:807
 msgid "read list of paths to be updated from standard input"
 msgstr "lire la liste des chemins à mettre à jour depuis l'entrée standard"
 
-#: builtin/update-index.c:803
+#: builtin/update-index.c:811
 msgid "add entries from standard input to the index"
 msgstr "ajouter les éléments depuis l'entrée standard à l'index"
 
-#: builtin/update-index.c:807
+#: builtin/update-index.c:815
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr "repeupler les étapes n°2 et n°3 pour les chemins listés"
 
-#: builtin/update-index.c:811
+#: builtin/update-index.c:819
 msgid "only update entries that differ from HEAD"
 msgstr "mettre à jour seulement les éléments qui diffèrent de HEAD"
 
-#: builtin/update-index.c:815
+#: builtin/update-index.c:823
 msgid "ignore files missing from worktree"
 msgstr "ignorer les fichiers manquants dans la copie de travail"
 
-#: builtin/update-index.c:818
+#: builtin/update-index.c:826
 msgid "report actions to standard output"
 msgstr "afficher les actions sur la sortie standard"
 
-#: builtin/update-index.c:820
+#: builtin/update-index.c:828
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(pour porcelaines) oublier les conflits sauvés et non résolus"
 
-#: builtin/update-index.c:824
+#: builtin/update-index.c:832
 msgid "write index in this format"
 msgstr "écrire l'index dans ce format"
 
+#: builtin/update-index.c:834
+msgid "enable or disable split index"
+msgstr "activer ou désactiver l'index divisé"
+
 #: builtin/update-ref.c:9
 msgid "git update-ref [options] -d <refname> [<oldval>]"
 msgstr "git update-ref [options] -d <nomréférence> [<anciennevaleur>]"
@@ -9825,19 +10174,19 @@
 msgid "git update-ref [options] --stdin [-z]"
 msgstr "git update-ref [options] --stdin [-z]"
 
-#: builtin/update-ref.c:256
+#: builtin/update-ref.c:363
 msgid "delete the reference"
 msgstr "supprimer la référence"
 
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:365
 msgid "update <refname> not the one it points to"
 msgstr "mettre à jour <nomréférence> et non la référence pointée par lui"
 
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:366
 msgid "stdin has NUL-terminated arguments"
 msgstr "l'entrée standard a des arguments qui se terminent par NUL"
 
-#: builtin/update-ref.c:260
+#: builtin/update-ref.c:367
 msgid "read updates from stdin"
 msgstr "lire les mises à jour depuis l'entrée standard"
 
@@ -9849,15 +10198,23 @@
 msgid "update the info files from scratch"
 msgstr "mettre à jour les fichiers d'information à partir de zéro"
 
-#: builtin/verify-pack.c:56
+#: builtin/verify-commit.c:17
+msgid "git verify-commit [-v|--verbose] <commit>..."
+msgstr "git verify-commit [-v|--verbose] <commit>..."
+
+#: builtin/verify-commit.c:75
+msgid "print commit contents"
+msgstr "afficher le contenu du commit"
+
+#: builtin/verify-pack.c:54
 msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."
 msgstr "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."
 
-#: builtin/verify-pack.c:66
+#: builtin/verify-pack.c:64
 msgid "verbose"
 msgstr "verbeux"
 
-#: builtin/verify-pack.c:68
+#: builtin/verify-pack.c:66
 msgid "show statistics only"
 msgstr "afficher seulement les statistiques"
 
@@ -9885,36 +10242,20 @@
 msgid "only useful for debugging"
 msgstr "seulement utile pour le débogage"
 
+#: credential-cache--daemon.c:267
+msgid "print debugging messages to stderr"
+msgstr "afficher les messages de debug sur stderr"
+
 #: git.c:17
 msgid ""
-"'git help -a' and 'git help -g' lists available subcommands and some\n"
+"'git help -a' and 'git help -g' list available subcommands and some\n"
 "concept guides. See 'git help <command>' or 'git help <concept>'\n"
 "to read about a specific subcommand or concept."
 msgstr ""
 "'git help -a' et 'git help -g' listent les sous-commandes disponibles et\n"
-"quelques concepts. Voir 'git help <command>' ou 'git help <concept>'\n"
+"quelques concepts. Voir 'git help <commande>' ou 'git help <concept>'\n"
 "pour en lire plus à propos d'une commande spécifique ou d'un concept."
 
-#: parse-options.h:143
-msgid "expiry-date"
-msgstr "date-d'expiration"
-
-#: parse-options.h:158
-msgid "no-op (backward compatibility)"
-msgstr "sans action (rétrocompatibilité)"
-
-#: parse-options.h:232
-msgid "be more verbose"
-msgstr "être plus verbeux"
-
-#: parse-options.h:234
-msgid "be more quiet"
-msgstr "être plus silencieux"
-
-#: parse-options.h:240
-msgid "use <n> digits to display SHA-1s"
-msgstr "utiliser <n> chiffres pour afficher les SHA-1s"
-
 #: common-cmds.h:8
 msgid "Add file contents to the index"
 msgstr "Ajouter le contenu de fichiers dans l'index"
@@ -10003,6 +10344,30 @@
 msgstr ""
 "Créer, lister, supprimer ou vérifier un objet d'étiquette signé avec GPG"
 
+#: parse-options.h:143
+msgid "expiry-date"
+msgstr "date-d'expiration"
+
+#: parse-options.h:158
+msgid "no-op (backward compatibility)"
+msgstr "sans action (rétrocompatibilité)"
+
+#: parse-options.h:232
+msgid "be more verbose"
+msgstr "être plus verbeux"
+
+#: parse-options.h:234
+msgid "be more quiet"
+msgstr "être plus silencieux"
+
+#: parse-options.h:240
+msgid "use <n> digits to display SHA-1s"
+msgstr "utiliser <n> chiffres pour afficher les SHA-1s"
+
+#: rerere.h:27
+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-am.sh:52
 msgid "You need to set your committer info first"
 msgstr "Vous devez d'abord définir vos informations de validateur"
@@ -10264,7 +10629,7 @@
 
 #: git-bisect.sh:289
 msgid ""
-"You need to give me at least one good and one bad revisions.\n"
+"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.)"
 msgstr ""
 "Vous devez me donner au moins une bonne et une mauvaise révision.\n"
@@ -10273,7 +10638,7 @@
 #: git-bisect.sh:292
 msgid ""
 "You need to start by \"git bisect start\".\n"
-"You then need to give me at least one good and one bad revisions.\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.)"
 msgstr ""
 "Vous devez démarrer avec \"git bisect start\".\n"
@@ -10346,24 +10711,31 @@
 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, or use 'git commit -a'."
+"as appropriate to mark resolution and make a commit."
 msgstr ""
-"Le pull n'est pas possible car vous avez des fichiers non fusionnés.\n"
-"Veuillez les corriger dans votre copie de travail, et utilisez alors 'git "
-"add/rm <file>'\n"
-"si nécessaire pour marquer comme résolu, ou utilisez 'git commit -a'."
+"Le tirage n'est pas possible car vous avez des fichiers non fusionnés.\n"
+"Veuillez les corriger dans votre copie de travail, utiliser alors 'git add/rm <fichier>'\n"
+"si nécessaire pour marquer comme résolu et valider."
 
 #: git-pull.sh:25
 msgid "Pull is not possible because you have unmerged files."
 msgstr "Le pull n'est pas possible car vous avez des fichiers non fusionnés."
 
-#: git-pull.sh:247
+#: git-pull.sh:31
+msgid ""
+"You have not concluded your merge (MERGE_HEAD exists).\n"
+"Please, commit your changes before you can merge."
+msgstr ""
+"Vous n'avez pas terminé votre fusion (MERGE_HEAD existe).\n"
+"Veuillez valider vos changements avant de pouvoir fusionner."
+
+#: git-pull.sh:245
 msgid "updating an unborn branch with changes added to the index"
 msgstr ""
 "mise à jour d'une branche non encore créée avec les changements ajoutés dans "
 "l'index"
 
-#: git-pull.sh:271
+#: git-pull.sh:269
 #, sh-format
 msgid ""
 "Warning: fetch updated the current branch head.\n"
@@ -10374,11 +10746,11 @@
 "Attention : mise à jour en avance rapide de votre copie de travail\n"
 "Attention : depuis la validation $orig_head."
 
-#: git-pull.sh:296
+#: git-pull.sh:294
 msgid "Cannot merge multiple branches into empty head"
 msgstr "Impossible de fusionner de multiples branches sur une tête vide"
 
-#: git-pull.sh:300
+#: git-pull.sh:298
 msgid "Cannot rebase onto multiple branches"
 msgstr "Impossible de rebaser sur de multiples branches"
 
@@ -10394,16 +10766,16 @@
 "Pour extraire la branche d'origine et stopper le rebasage, lancez \"git "
 "rebase --abort\"."
 
-#: git-rebase.sh:164
+#: git-rebase.sh:165
 msgid "Applied autostash."
 msgstr "Autoremisage appliqué."
 
-#: git-rebase.sh:167
+#: git-rebase.sh:168
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Impossible de stocker $stash_sha1"
 
-#: git-rebase.sh:168
+#: git-rebase.sh:169
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
@@ -10413,33 +10785,33 @@
 "Vos  modifications sont à l'abri dans la remise.\n"
 "Vous pouvez lancer \"git stash pop\" ou \"git stash drop\" à tout moment.\n"
 
-#: git-rebase.sh:207
+#: git-rebase.sh:208
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Le crochet pre-rebase a refusé de rebaser."
 
-#: git-rebase.sh:212
+#: git-rebase.sh:213
 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:350
+#: git-rebase.sh:351
 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:355
+#: git-rebase.sh:356
 msgid "No rebase in progress?"
 msgstr "Pas de rebasage en cours ?"
 
-#: git-rebase.sh:366
+#: git-rebase.sh:367
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 "L'action --edit-todo peut seulement être utilisée lors d'un rebasage "
 "interactif."
 
-#: git-rebase.sh:373
+#: git-rebase.sh:374
 msgid "Cannot read HEAD"
 msgstr "Impossible de lire HEAD"
 
-#: git-rebase.sh:376
+#: git-rebase.sh:377
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -10447,12 +10819,12 @@
 "Vous devez éditer tous les conflits de fusion et\n"
 "les marquer comme résolus avec git add"
 
-#: git-rebase.sh:394
+#: git-rebase.sh:395
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Impossible de revenir à $head_name"
 
-#: git-rebase.sh:413
+#: git-rebase.sh:414
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -10474,65 +10846,65 @@
 "chose\n"
 "d'important ici."
 
-#: git-rebase.sh:464
+#: git-rebase.sh:465
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "invalide $upstream_name en amont"
 
-#: git-rebase.sh:488
+#: git-rebase.sh:489
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name : il y a plus d'une base de fusion"
 
-#: git-rebase.sh:491 git-rebase.sh:495
+#: git-rebase.sh:492 git-rebase.sh:496
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name : il n'y a pas de base de fusion"
 
-#: git-rebase.sh:500
+#: git-rebase.sh:501
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "Ne pointe pas sur une validation valide : $onto_name"
 
-#: git-rebase.sh:523
+#: git-rebase.sh:524
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "fatal : pas de branche : $branch_name"
 
-#: git-rebase.sh:556
+#: git-rebase.sh:557
 msgid "Cannot autostash"
 msgstr "Autoremisage impossible"
 
-#: git-rebase.sh:561
+#: git-rebase.sh:562
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Autoremisage créé : $stash_abbrev"
 
-#: git-rebase.sh:565
+#: git-rebase.sh:566
 msgid "Please commit or stash them."
 msgstr "Veuillez les valider ou les remiser."
 
-#: git-rebase.sh:585
+#: git-rebase.sh:586
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "La branche courante $branch_name est à jour."
 
-#: git-rebase.sh:589
+#: git-rebase.sh:590
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "La branche courante $branch_name est à jour, rebasage forcé."
 
-#: git-rebase.sh:600
+#: git-rebase.sh:601
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Changements de $mb sur $onto :"
 
-#: git-rebase.sh:609
+#: git-rebase.sh:610
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 "Premièrement, rembobinons head pour rejouer votre travail par-dessus..."
 
-#: git-rebase.sh:619
+#: git-rebase.sh:620
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "$branch_name mise à jour en avance rapide sur $onto_name."
@@ -10549,23 +10921,23 @@
 msgid "Cannot save the current index state"
 msgstr "Impossible de sauver l'état courant de l'index"
 
-#: git-stash.sh:123 git-stash.sh:136
+#: git-stash.sh:124 git-stash.sh:137
 msgid "Cannot save the current worktree state"
 msgstr "Impossible de sauver l'état courant de la copie de travail"
 
-#: git-stash.sh:140
+#: git-stash.sh:141
 msgid "No changes selected"
 msgstr "Aucun changement sélectionné"
 
-#: git-stash.sh:143
+#: git-stash.sh:144
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "Impossible de supprimer l'index temporaire (ne peut pas se produire)"
 
-#: git-stash.sh:156
+#: git-stash.sh:157
 msgid "Cannot record working tree state"
 msgstr "Impossible d'enregistrer l'état de la copie de travail"
 
-#: git-stash.sh:190
+#: git-stash.sh:191
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "Impossible de mettre à jour $ref_stash avec $w_commit"
@@ -10580,7 +10952,7 @@
 #. $ 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:237
+#: git-stash.sh:238
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -10589,85 +10961,85 @@
 "erreur: option inconnue pour 'stash save': $option\n"
 "        Pour fournir un message, utilisez git stash save -- '$option'"
 
-#: git-stash.sh:258
+#: git-stash.sh:259
 msgid "No local changes to save"
 msgstr "Pas de modifications locales à sauver"
 
-#: git-stash.sh:262
+#: git-stash.sh:263
 msgid "Cannot initialize stash"
 msgstr "Impossible d'initialiser le remisage"
 
-#: git-stash.sh:266
+#: git-stash.sh:267
 msgid "Cannot save the current status"
 msgstr "Impossible de sauver le statut courant"
 
-#: git-stash.sh:284
+#: git-stash.sh:285
 msgid "Cannot remove worktree changes"
 msgstr "Impossible de supprimer les changements de la copie de travail"
 
-#: git-stash.sh:383
+#: git-stash.sh:384
 msgid "No stash found."
 msgstr "Pas de remisage trouvé."
 
-#: git-stash.sh:390
+#: git-stash.sh:391
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Trop de révisions spécifiées : $REV"
 
-#: git-stash.sh:396
+#: git-stash.sh:397
 #, sh-format
-msgid "$reference is not valid reference"
+msgid "$reference is not a valid reference"
 msgstr "$reference n'est pas une référence valide"
 
-#: git-stash.sh:424
+#: git-stash.sh:425
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' n'est pas une validation de type remisage"
 
-#: git-stash.sh:435
+#: git-stash.sh:436
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' n'est pas une référence de remisage"
 
-#: git-stash.sh:443
+#: git-stash.sh:444
 msgid "unable to refresh index"
 msgstr "impossible de rafraîchir l'index"
 
-#: git-stash.sh:447
+#: git-stash.sh:448
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "Impossible d'appliquer un remisage en cours de fusion"
 
-#: git-stash.sh:455
+#: git-stash.sh:456
 msgid "Conflicts in index. Try without --index."
 msgstr "Conflits dans l'index. Essayez sans --index."
 
-#: git-stash.sh:457
+#: git-stash.sh:458
 msgid "Could not save index tree"
 msgstr "Impossible de sauvegarder l'arbre d'index"
 
-#: git-stash.sh:491
+#: git-stash.sh:492
 msgid "Cannot unstage modified files"
 msgstr "Impossible de désindexer les fichiers modifiés"
 
-#: git-stash.sh:506
+#: git-stash.sh:507
 msgid "Index was not unstashed."
 msgstr "L'index n'a pas été sorti de remise."
 
-#: git-stash.sh:529
+#: git-stash.sh:530
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "${REV} supprimé ($s)"
 
-#: git-stash.sh:530
+#: git-stash.sh:531
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Impossible de supprimer l'élément de stash"
 
-#: git-stash.sh:537
+#: git-stash.sh:539
 msgid "No branch name specified"
 msgstr "Aucune branche spécifiée"
 
-#: git-stash.sh:609
+#: git-stash.sh:611
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Pour les restaurer tapez \"git stash apply\")"
 
@@ -10688,30 +11060,30 @@
 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:299
+#: 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:409
+#: git-submodule.sh:406
 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:419
+#: git-submodule.sh:416
 #, 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:436
+#: git-submodule.sh:433
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' existe déjà dans l'index"
 
-#: git-submodule.sh:440
+#: git-submodule.sh:437
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -10722,24 +11094,24 @@
 "$sm_path\n"
 "Utilisez -f si vous voulez vraiment l'ajouter."
 
-#: git-submodule.sh:458
+#: git-submodule.sh:455
 #, 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:460
+#: git-submodule.sh:457
 #, 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:468
+#: git-submodule.sh:465
 #, 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:470
+#: git-submodule.sh:467
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
@@ -10747,7 +11119,7 @@
 "Si vous voulez réutiliser ce répertoire git local au lieu de cloner à "
 "nouveau depuis"
 
-#: git-submodule.sh:472
+#: git-submodule.sh:469
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
@@ -10755,7 +11127,7 @@
 "utilisez l'option '--force'. Si le répertoire local git n'est pas le dépôt "
 "correct"
 
-#: git-submodule.sh:473
+#: git-submodule.sh:470
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
@@ -10764,74 +11136,74 @@
 "ou vous ne savez pas ce que cela signifie de choisir un autre nom avec "
 "l'option '--name'."
 
-#: git-submodule.sh:475
+#: git-submodule.sh:472
 #, 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:487
+#: git-submodule.sh:484
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Impossible d'extraire le sous-module '$sm_path'"
 
-#: git-submodule.sh:492
+#: git-submodule.sh:489
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Échec d'ajout du sous-module '$sm_path'"
 
-#: git-submodule.sh:501
+#: git-submodule.sh:498
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Échec d'enregistrement du sous-module '$sm_path'"
 
-#: git-submodule.sh:545
+#: git-submodule.sh:542
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "Entrée dans '$prefix$displaypath'"
 
-#: git-submodule.sh:565
+#: git-submodule.sh:562
 #, 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:611
+#: git-submodule.sh:608
 #, 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:620
+#: git-submodule.sh:617
 #, 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:622
+#: git-submodule.sh:619
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr "Sous-module '$name' ($url) enregistré pour le chemin '$displaypath'"
 
-#: git-submodule.sh:639
+#: git-submodule.sh:636
 #, 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:677
+#: git-submodule.sh:674
 #, 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:694
+#: git-submodule.sh:691
 #, 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:695
+#: git-submodule.sh:692
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
@@ -10839,7 +11211,7 @@
 "(utilisez 'rm -rf' si vous voulez vraiment le supprimer en incluant tout son "
 "historique)"
 
-#: git-submodule.sh:701
+#: git-submodule.sh:698
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -10848,30 +11220,30 @@
 "La copie de travail du sous-module '$displaypath' contient des modifications "
 "locales ; utilisez '-f' pour les annuler"
 
-#: git-submodule.sh:704
+#: git-submodule.sh:701
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Répertoire '$displaypath' nettoyé"
 
-#: git-submodule.sh:705
+#: git-submodule.sh:702
 #, 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:708
+#: git-submodule.sh:705
 #, 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:717
+#: git-submodule.sh:714
 #, 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:833
+#: git-submodule.sh:830
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
@@ -10880,57 +11252,57 @@
 "Chemin de sous-module '$displaypath' non initialisé\n"
 "Peut-être souhaitez-vous utiliser 'update --init' ?"
 
-#: git-submodule.sh:846
+#: git-submodule.sh:843
 #, 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:855
+#: git-submodule.sh:852
 #, 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:879
+#: git-submodule.sh:876
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Impossible de rapatrier dans le chemin de sous-module '$displaypath'"
 
-#: git-submodule.sh:893
+#: git-submodule.sh:890
 #, 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:894
+#: git-submodule.sh:891
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Chemin de sous-module '$displaypath' : '$sha1' extrait"
 
-#: git-submodule.sh:898
+#: git-submodule.sh:895
 #, 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:899
+#: git-submodule.sh:896
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Chemin de sous-module '$displaypath' : rebasé dans '$sha1'"
 
-#: git-submodule.sh:904
+#: git-submodule.sh:901
 #, 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:905
+#: git-submodule.sh:902
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Chemin de sous-module '$displaypath' : fusionné dans '$sha1'"
 
-#: git-submodule.sh:910
+#: git-submodule.sh:907
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule  path '$prefix$sm_path'"
@@ -10938,56 +11310,92 @@
 "L'exécution de '$command $sha1' a échoué dans le chemin de sous-module "
 "'$prefix$sm_path'"
 
-#: git-submodule.sh:911
+#: git-submodule.sh:908
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr "Chemin de sous-module '$prefix$sm_path' : '$command $sha1'"
 
-#: git-submodule.sh:941
+#: git-submodule.sh:938
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Échec de parcours dans le chemin du sous-module '$displaypath'"
 
-#: git-submodule.sh:1049
+#: git-submodule.sh:1046
 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:1097
+#: git-submodule.sh:1098
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "mode $mod_dst inattendu"
 
-#: git-submodule.sh:1117
+#: git-submodule.sh:1118
 #, 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:1120
+#: git-submodule.sh:1121
 #, 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:1123
+#: git-submodule.sh:1124
 #, 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:1148
+#: git-submodule.sh:1149
 msgid "blob"
 msgstr "blob"
 
-#: git-submodule.sh:1262
+#: git-submodule.sh:1267
 #, 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:1326
+#: git-submodule.sh:1331
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Synchronisation de l'URL sous-module pour '$displaypath'"
 
+#~ msgid "Failed to lock ref for update"
+#~ msgstr "Échec du verrouillage de la référence pour mise à jour"
+
+#~ msgid "Failed to write ref"
+#~ msgstr "Échec de l'écriture de la référence"
+
+#~ msgid "Failed to lock HEAD during fast_forward_to"
+#~ msgstr "Échec du verrouillage de HEAD pendant l'avance rapide"
+
+#~ msgid "invalid commit: %s"
+#~ msgstr "commit invalide : %s"
+
+#~ msgid "cannot lock HEAD ref"
+#~ msgstr "impossible de verrouiller la référence HEAD"
+
+#~ msgid "cannot update HEAD ref"
+#~ msgstr "impossible de mettre à jour la référence HEAD"
+
+#~ msgid "Invalid %s: '%s'"
+#~ msgstr "%s invalide : '%s'"
+
+#~ msgid "cannot tell cwd"
+#~ msgstr "impossible de déterminer le répertoire de travail courant"
+
+#~ msgid "%s: cannot lock the ref"
+#~ msgstr "%s : impossible de verrouiller la référence"
+
+#~ msgid "%s: cannot update the ref"
+#~ msgstr "%s : impossible de mettre à jour la référence"
+
+#~ msgid "commit has empty message"
+#~ msgstr "le commit a un message vide"
+
+#~ msgid "Failed to chdir: %s"
+#~ msgstr "Échec de chdir: %s"
+
 #~ msgid "Tracking not set up: name too long: %s"
 #~ msgstr "Suivi de branche non paramétré : le nom est trop long : %s"
 
diff --git a/po/git.pot b/po/git.pot
index 1407f06..2d4608f 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: 2014-04-19 12:50+0800\n"
+"POT-Creation-Date: 2014-11-01 07:46+0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -23,105 +23,103 @@
 msgid "hint: %.*s\n"
 msgstr ""
 
-#: advice.c:85
+#: advice.c:88
 msgid ""
-"Fix them up in the work tree,\n"
-"and then use 'git add/rm <file>' as\n"
-"appropriate to mark resolution and make a commit,\n"
-"or use 'git commit -a'."
-msgstr ""
-
-#: archive.c:10
-msgid "git archive [options] <tree-ish> [<path>...]"
+"Fix them up in the work tree, and then use 'git add/rm <file>'\n"
+"as appropriate to mark resolution and make a commit."
 msgstr ""
 
 #: archive.c:11
-msgid "git archive --list"
+msgid "git archive [options] <tree-ish> [<path>...]"
 msgstr ""
 
 #: archive.c:12
+msgid "git archive --list"
+msgstr ""
+
+#: archive.c:13
 msgid ""
 "git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]"
 msgstr ""
 
-#: archive.c:13
+#: archive.c:14
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr ""
 
-#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
+#: archive.c:334 builtin/add.c:137 builtin/add.c:427 builtin/rm.c:328
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr ""
 
-#: archive.c:328
+#: archive.c:419
 msgid "fmt"
 msgstr ""
 
-#: archive.c:328
+#: archive.c:419
 msgid "archive format"
 msgstr ""
 
-#: archive.c:329 builtin/log.c:1193
+#: archive.c:420 builtin/log.c:1204
 msgid "prefix"
 msgstr ""
 
-#: archive.c:330
+#: archive.c:421
 msgid "prepend prefix to each pathname in the archive"
 msgstr ""
 
-#: archive.c:331 builtin/archive.c:88 builtin/blame.c:2258
-#: builtin/blame.c:2259 builtin/config.c:57 builtin/fast-export.c:680
-#: builtin/fast-export.c:682 builtin/grep.c:714 builtin/hash-object.c:77
-#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:412
-#: builtin/notes.c:569 builtin/read-tree.c:108 parse-options.h:151
+#: archive.c:422 builtin/archive.c:88 builtin/blame.c:2517
+#: builtin/blame.c:2518 builtin/config.c:57 builtin/fast-export.c:986
+#: builtin/fast-export.c:988 builtin/grep.c:712 builtin/hash-object.c:101
+#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:411
+#: builtin/notes.c:568 builtin/read-tree.c:109 parse-options.h:151
 msgid "file"
 msgstr ""
 
-#: archive.c:332 builtin/archive.c:89
+#: archive.c:423 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr ""
 
-#: archive.c:334
+#: archive.c:425
 msgid "read .gitattributes in working directory"
 msgstr ""
 
-#: archive.c:335
+#: archive.c:426
 msgid "report archived files on stderr"
 msgstr ""
 
-#: archive.c:336
+#: archive.c:427
 msgid "store only"
 msgstr ""
 
-#: archive.c:337
+#: archive.c:428
 msgid "compress faster"
 msgstr ""
 
-#: archive.c:345
+#: archive.c:436
 msgid "compress better"
 msgstr ""
 
-#: archive.c:348
+#: archive.c:439
 msgid "list supported archive formats"
 msgstr ""
 
-#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:441 builtin/archive.c:90 builtin/clone.c:85
 msgid "repo"
 msgstr ""
 
-#: archive.c:351 builtin/archive.c:91
+#: archive.c:442 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr ""
 
-#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
+#: archive.c:443 builtin/archive.c:92 builtin/notes.c:490
 msgid "command"
 msgstr ""
 
-#: archive.c:353 builtin/archive.c:93
+#: archive.c:444 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr ""
 
-#: attr.c:259
+#: attr.c:258
 msgid ""
 "Negative patterns are ignored in git attributes\n"
 "Use '\\!' for literal leading exclamation."
@@ -177,31 +175,31 @@
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr ""
 
-#: branch.c:178
+#: branch.c:162
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr ""
 
-#: branch.c:183
+#: branch.c:167
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr ""
 
-#: branch.c:191
+#: branch.c:175
 msgid "Cannot force update the current branch."
 msgstr ""
 
-#: branch.c:211
+#: branch.c:195
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr ""
 
-#: branch.c:213
+#: branch.c:197
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr ""
 
-#: branch.c:215
+#: branch.c:199
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -213,113 +211,111 @@
 "\"git push -u\" to set the upstream config as you push."
 msgstr ""
 
-#: branch.c:260
+#: branch.c:243
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr ""
 
-#: branch.c:280
+#: branch.c:263
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr ""
 
-#: branch.c:285
+#: branch.c:268
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr ""
 
-#: branch.c:291
-msgid "Failed to lock ref for update"
-msgstr ""
-
-#: branch.c:309
-msgid "Failed to write ref"
-msgstr ""
-
-#: bundle.c:33
+#: bundle.c:34
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
 msgstr ""
 
-#: bundle.c:60
+#: bundle.c:61
 #, c-format
 msgid "unrecognized header: %s%s (%d)"
 msgstr ""
 
-#: bundle.c:86 builtin/commit.c:706
+#: bundle.c:87 builtin/commit.c:788
 #, c-format
 msgid "could not open '%s'"
 msgstr ""
 
-#: bundle.c:138
+#: bundle.c:139
 msgid "Repository lacks these prerequisite commits:"
 msgstr ""
 
-#: bundle.c:162 sequencer.c:669 sequencer.c:1123 builtin/log.c:332
-#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357
+#: bundle.c:163 sequencer.c:641 sequencer.c:1096 builtin/blame.c:2706
+#: builtin/branch.c:652 builtin/commit.c:1085 builtin/log.c:330
+#: builtin/log.c:823 builtin/log.c:1432 builtin/log.c:1669 builtin/merge.c:357
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr ""
 
-#: bundle.c:184
+#: bundle.c:185
 #, c-format
 msgid "The bundle contains this ref:"
 msgid_plural "The bundle contains these %d refs:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: bundle.c:191
+#: bundle.c:192
 msgid "The bundle records a complete history."
 msgstr ""
 
-#: bundle.c:193
+#: bundle.c:194
 #, c-format
 msgid "The bundle requires this ref:"
 msgid_plural "The bundle requires these %d refs:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: bundle.c:293
+#: bundle.c:292
 msgid "rev-list died"
 msgstr ""
 
-#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:298 builtin/log.c:153 builtin/log.c:1342 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr ""
 
-#: bundle.c:334
+#: bundle.c:333
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr ""
 
-#: bundle.c:379
+#: bundle.c:378
 msgid "Refusing to create empty bundle."
 msgstr ""
 
-#: bundle.c:395
+#: bundle.c:393
 msgid "Could not spawn pack-objects"
 msgstr ""
 
-#: bundle.c:413
+#: bundle.c:411
 msgid "pack-objects died"
 msgstr ""
 
-#: bundle.c:416
+#: bundle.c:414
 #, c-format
 msgid "cannot create '%s'"
 msgstr ""
 
-#: bundle.c:438
+#: bundle.c:435
 msgid "index-pack died"
 msgstr ""
 
-#: commit.c:54
+#: color.c:157
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr ""
+
+#: commit.c:40
 #, c-format
 msgid "could not parse %s"
 msgstr ""
 
-#: commit.c:56
+#: commit.c:42
 #, c-format
 msgid "%s %s is not a commit!"
 msgstr ""
@@ -328,16 +324,69 @@
 msgid "memory exhausted"
 msgstr ""
 
-#: connected.c:70
+#: config.c:469 config.c:471
+#, c-format
+msgid "bad config file line %d in %s"
+msgstr ""
+
+#: config.c:587
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr ""
+
+#: config.c:589
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr ""
+
+#: config.c:674
+#, c-format
+msgid "failed to expand user dir in: '%s'"
+msgstr ""
+
+#: config.c:752 config.c:763
+#, c-format
+msgid "bad zlib compression level %d"
+msgstr ""
+
+#: config.c:885
+#, c-format
+msgid "invalid mode for object creation: %s"
+msgstr ""
+
+#: config.c:1201
+msgid "unable to parse command-line config"
+msgstr ""
+
+#: config.c:1262
+msgid "unknown error occured while reading the configuration files"
+msgstr ""
+
+#: config.c:1586
+#, c-format
+msgid "unable to parse '%s' from command-line config"
+msgstr ""
+
+#: config.c:1588
+#, c-format
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr ""
+
+#: config.c:1647
+#, c-format
+msgid "%s has multiple values"
+msgstr ""
+
+#: connected.c:69
 msgid "Could not run 'git rev-list'"
 msgstr ""
 
-#: connected.c:90
+#: connected.c:89
 #, c-format
 msgid "failed write to rev-list: %s"
 msgstr ""
 
-#: connected.c:98
+#: connected.c:97
 #, c-format
 msgid "failed to close rev-list's stdin: %s"
 msgstr ""
@@ -415,91 +464,100 @@
 msgid "failed to read orderfile '%s'"
 msgstr ""
 
-#: diffcore-rename.c:517
+#: diffcore-rename.c:516
 msgid "Performing inexact rename detection"
 msgstr ""
 
-#: diff.c:113
+#: diff.c:114
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr ""
 
-#: diff.c:118
+#: diff.c:119
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr ""
 
-#: diff.c:213
+#: diff.c:214
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr ""
 
-#: diff.c:263
+#: diff.c:266
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
 "%s"
 msgstr ""
 
-#: diff.c:3495
+#: diff.c:2957
+#, c-format
+msgid "external diff died, stopping at %s"
+msgstr ""
+
+#: diff.c:3352
+msgid "--follow requires exactly one pathspec"
+msgstr ""
+
+#: diff.c:3515
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
 "%s"
 msgstr ""
 
-#: diff.c:3509
+#: diff.c:3529
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr ""
 
-#: gpg-interface.c:59 gpg-interface.c:131
+#: gpg-interface.c:129 gpg-interface.c:200
 msgid "could not run gpg."
 msgstr ""
 
-#: gpg-interface.c:71
+#: gpg-interface.c:141
 msgid "gpg did not accept the data"
 msgstr ""
 
-#: gpg-interface.c:82
+#: gpg-interface.c:152
 msgid "gpg failed to sign the data"
 msgstr ""
 
-#: gpg-interface.c:115
+#: gpg-interface.c:185
 #, c-format
 msgid "could not create temporary file '%s': %s"
 msgstr ""
 
-#: gpg-interface.c:118
+#: gpg-interface.c:188
 #, c-format
 msgid "failed writing detached signature to '%s': %s"
 msgstr ""
 
-#: grep.c:1698
+#: grep.c:1718
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr ""
 
-#: grep.c:1715
+#: grep.c:1735
 #, c-format
 msgid "'%s': %s"
 msgstr ""
 
-#: grep.c:1726
+#: grep.c:1746
 #, c-format
 msgid "'%s': short read %s"
 msgstr ""
 
-#: help.c:209
+#: help.c:207
 #, c-format
 msgid "available git commands in '%s'"
 msgstr ""
 
-#: help.c:216
+#: help.c:214
 msgid "git commands available from elsewhere on your $PATH"
 msgstr ""
 
-#: help.c:232
+#: help.c:230
 msgid "The most commonly used git commands are:"
 msgstr ""
 
@@ -531,7 +589,7 @@
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr ""
 
-#: help.c:384 help.c:443
+#: help.c:384 help.c:444
 msgid ""
 "\n"
 "Did you mean this?"
@@ -541,312 +599,320 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: help.c:439
+#: help.c:440
 #, c-format
 msgid "%s: %s - %s"
 msgstr ""
 
-#: merge.c:56
+#: lockfile.c:275
+msgid "BUG: reopen a lockfile that is still open"
+msgstr ""
+
+#: lockfile.c:277
+msgid "BUG: reopen a lockfile that has been committed"
+msgstr ""
+
+#: merge.c:41
 msgid "failed to read the cache"
 msgstr ""
 
-#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
-#: builtin/clone.c:661
+#: merge.c:94 builtin/checkout.c:356 builtin/checkout.c:562
+#: builtin/clone.c:659
 msgid "unable to write new index file"
 msgstr ""
 
-#: merge-recursive.c:190
+#: merge-recursive.c:189
 #, c-format
 msgid "(bad commit)\n"
 msgstr ""
 
-#: merge-recursive.c:208
+#: merge-recursive.c:209
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr ""
 
-#: merge-recursive.c:271
+#: merge-recursive.c:270
 msgid "error building trees"
 msgstr ""
 
-#: merge-recursive.c:675
+#: merge-recursive.c:691
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr ""
 
-#: merge-recursive.c:686
+#: merge-recursive.c:702
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr ""
 
-#: merge-recursive.c:700 merge-recursive.c:721
+#: merge-recursive.c:716 merge-recursive.c:737
 msgid ": perhaps a D/F conflict?"
 msgstr ""
 
-#: merge-recursive.c:711
+#: merge-recursive.c:727
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr ""
 
-#: merge-recursive.c:751
+#: merge-recursive.c:767
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr ""
 
-#: merge-recursive.c:753
+#: merge-recursive.c:769
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr ""
 
-#: merge-recursive.c:776 builtin/clone.c:317
+#: merge-recursive.c:792 builtin/clone.c:318
 #, c-format
 msgid "failed to open '%s'"
 msgstr ""
 
-#: merge-recursive.c:784
+#: merge-recursive.c:800
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr ""
 
-#: merge-recursive.c:787
+#: merge-recursive.c:803
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr ""
 
-#: merge-recursive.c:925
+#: merge-recursive.c:941
 msgid "Failed to execute internal merge"
 msgstr ""
 
-#: merge-recursive.c:929
+#: merge-recursive.c:945
 #, c-format
 msgid "Unable to add %s to database"
 msgstr ""
 
-#: merge-recursive.c:945
+#: merge-recursive.c:961
 msgid "unsupported object type in the tree"
 msgstr ""
 
-#: merge-recursive.c:1024 merge-recursive.c:1038
+#: merge-recursive.c:1036 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."
 msgstr ""
 
-#: merge-recursive.c:1030 merge-recursive.c:1043
+#: merge-recursive.c:1042 merge-recursive.c:1055
 #, 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:1084
+#: merge-recursive.c:1096
 msgid "rename"
 msgstr ""
 
-#: merge-recursive.c:1084
+#: merge-recursive.c:1096
 msgid "renamed"
 msgstr ""
 
-#: merge-recursive.c:1140
+#: merge-recursive.c:1152
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr ""
 
-#: merge-recursive.c:1162
+#: merge-recursive.c:1174
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
 "\"->\"%s\" in \"%s\"%s"
 msgstr ""
 
-#: merge-recursive.c:1167
+#: merge-recursive.c:1179
 msgid " (left unresolved)"
 msgstr ""
 
-#: merge-recursive.c:1221
+#: merge-recursive.c:1233
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 
-#: merge-recursive.c:1251
+#: merge-recursive.c:1263
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr ""
 
-#: merge-recursive.c:1450
+#: merge-recursive.c:1462
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 
-#: merge-recursive.c:1460
+#: merge-recursive.c:1472
 #, c-format
 msgid "Adding merged %s"
 msgstr ""
 
-#: merge-recursive.c:1465 merge-recursive.c:1663
+#: merge-recursive.c:1477 merge-recursive.c:1675
 #, c-format
 msgid "Adding as %s instead"
 msgstr ""
 
-#: merge-recursive.c:1516
+#: merge-recursive.c:1528
 #, c-format
 msgid "cannot read object %s"
 msgstr ""
 
-#: merge-recursive.c:1519
+#: merge-recursive.c:1531
 #, c-format
 msgid "object %s is not a blob"
 msgstr ""
 
-#: merge-recursive.c:1567
+#: merge-recursive.c:1579
 msgid "modify"
 msgstr ""
 
-#: merge-recursive.c:1567
+#: merge-recursive.c:1579
 msgid "modified"
 msgstr ""
 
-#: merge-recursive.c:1577
+#: merge-recursive.c:1589
 msgid "content"
 msgstr ""
 
-#: merge-recursive.c:1584
+#: merge-recursive.c:1596
 msgid "add/add"
 msgstr ""
 
-#: merge-recursive.c:1618
+#: merge-recursive.c:1630
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr ""
 
-#: merge-recursive.c:1632
+#: merge-recursive.c:1644
 #, c-format
 msgid "Auto-merging %s"
 msgstr ""
 
-#: merge-recursive.c:1636 git-submodule.sh:1149
+#: merge-recursive.c:1648 git-submodule.sh:1150
 msgid "submodule"
 msgstr ""
 
-#: merge-recursive.c:1637
+#: merge-recursive.c:1649
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr ""
 
-#: merge-recursive.c:1727
+#: merge-recursive.c:1735
 #, c-format
 msgid "Removing %s"
 msgstr ""
 
-#: merge-recursive.c:1752
+#: merge-recursive.c:1760
 msgid "file/directory"
 msgstr ""
 
-#: merge-recursive.c:1758
+#: merge-recursive.c:1766
 msgid "directory/file"
 msgstr ""
 
-#: merge-recursive.c:1763
+#: merge-recursive.c:1771
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 
-#: merge-recursive.c:1773
+#: merge-recursive.c:1781
 #, c-format
 msgid "Adding %s"
 msgstr ""
 
-#: merge-recursive.c:1790
+#: merge-recursive.c:1798
 msgid "Fatal merge failure, shouldn't happen."
 msgstr ""
 
-#: merge-recursive.c:1809
+#: merge-recursive.c:1817
 msgid "Already up-to-date!"
 msgstr ""
 
-#: merge-recursive.c:1818
+#: merge-recursive.c:1826
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr ""
 
-#: merge-recursive.c:1848
+#: merge-recursive.c:1856
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr ""
 
-#: merge-recursive.c:1893
+#: merge-recursive.c:1901
 msgid "Merging:"
 msgstr ""
 
-#: merge-recursive.c:1906
+#: merge-recursive.c:1914
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: merge-recursive.c:1943
+#: merge-recursive.c:1951
 msgid "merge returned no commit"
 msgstr ""
 
-#: merge-recursive.c:2000
+#: merge-recursive.c:2008
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr ""
 
-#: merge-recursive.c:2012 builtin/merge.c:668
+#: merge-recursive.c:2019 builtin/merge.c:666
 msgid "Unable to write index."
 msgstr ""
 
-#: notes-utils.c:40
+#: notes-utils.c:41
 msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr ""
 
-#: notes-utils.c:81
+#: notes-utils.c:83
 #, c-format
 msgid "Bad notes.rewriteMode value: '%s'"
 msgstr ""
 
-#: notes-utils.c:91
+#: notes-utils.c:93
 #, c-format
 msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
 msgstr ""
 
 #. TRANSLATORS: The first %s is the name of the
 #. environment variable, the second %s is its value
-#: notes-utils.c:118
+#: notes-utils.c:120
 #, c-format
 msgid "Bad %s value: '%s'"
 msgstr ""
 
-#: object.c:229
+#: object.c:241
 #, c-format
 msgid "unable to parse object: %s"
 msgstr ""
 
-#: parse-options.c:532
+#: parse-options.c:546
 msgid "..."
 msgstr ""
 
-#: parse-options.c:550
+#: parse-options.c:564
 #, c-format
 msgid "usage: %s"
 msgstr ""
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:554
+#: parse-options.c:568
 #, c-format
 msgid "   or: %s"
 msgstr ""
 
-#: parse-options.c:557
+#: parse-options.c:571
 #, c-format
 msgid "    %s"
 msgstr ""
 
-#: parse-options.c:591
+#: parse-options.c:605
 msgid "-NUM"
 msgstr ""
 
@@ -899,80 +965,84 @@
 msgid "%s: pathspec magic not supported by this command: %s"
 msgstr ""
 
-#: pathspec.c:433
+#: pathspec.c:432
 #, c-format
 msgid "pathspec '%s' is beyond a symbolic link"
 msgstr ""
 
-#: pathspec.c:442
+#: pathspec.c:441
 msgid ""
 "There is nothing to exclude from by :(exclude) patterns.\n"
 "Perhaps you forgot to add either ':/' or '.' ?"
 msgstr ""
 
-#: progress.c:224
+#: pretty.c:968
+msgid "unable to parse --pretty format"
+msgstr ""
+
+#: progress.c:225
 msgid "done"
 msgstr ""
 
-#: read-cache.c:1238
+#: read-cache.c:1261
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
 "Using version %i"
 msgstr ""
 
-#: read-cache.c:1248
+#: read-cache.c:1271
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
 "Using version %i"
 msgstr ""
 
-#: remote.c:758
+#: remote.c:782
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr ""
 
-#: remote.c:762
+#: remote.c:786
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr ""
 
-#: remote.c:766
+#: remote.c:790
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr ""
 
-#: remote.c:774
+#: remote.c:798
 msgid "Internal error"
 msgstr ""
 
-#: remote.c:1948
+#: remote.c:1968
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr ""
 
-#: remote.c:1952
+#: remote.c:1972
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr ""
 
-#: remote.c:1955
+#: remote.c:1975
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr ""
 
-#: remote.c:1959
+#: remote.c:1979
 #, 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:1965
+#: remote.c:1985
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr ""
 
-#: remote.c:1968
+#: remote.c:1988
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -980,11 +1050,11 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: remote.c:1976
+#: remote.c:1996
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr ""
 
-#: remote.c:1979
+#: remote.c:1999
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -995,262 +1065,270 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: remote.c:1989
+#: remote.c:2009
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr ""
 
-#: run-command.c:80
+#: run-command.c:87
 msgid "open /dev/null failed"
 msgstr ""
 
-#: run-command.c:82
+#: run-command.c:89
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr ""
 
-#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
-#: builtin/merge.c:1009 builtin/merge.c:1019
+#: send-pack.c:265
+msgid "failed to sign the push certificate"
+msgstr ""
+
+#: send-pack.c:322
+msgid "the receiving end does not support --signed push"
+msgstr ""
+
+#: sequencer.c:172 builtin/merge.c:781 builtin/merge.c:892
+#: builtin/merge.c:1002 builtin/merge.c:1012
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr ""
 
-#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
-#: builtin/merge.c:1011 builtin/merge.c:1024
+#: sequencer.c:174 builtin/merge.c:343 builtin/merge.c:784
+#: builtin/merge.c:1004 builtin/merge.c:1017
 #, c-format
 msgid "Could not write to '%s'"
 msgstr ""
 
-#: sequencer.c:229
+#: sequencer.c:195
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'"
 msgstr ""
 
-#: sequencer.c:232
+#: sequencer.c:198
 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 ""
 
-#: sequencer.c:245 sequencer.c:879 sequencer.c:962
+#: sequencer.c:211 sequencer.c:852 sequencer.c:935
 #, c-format
 msgid "Could not write to %s"
 msgstr ""
 
-#: sequencer.c:248
+#: sequencer.c:214
 #, c-format
 msgid "Error wrapping up %s"
 msgstr ""
 
-#: sequencer.c:263
+#: sequencer.c:229
 msgid "Your local changes would be overwritten by cherry-pick."
 msgstr ""
 
-#: sequencer.c:265
+#: sequencer.c:231
 msgid "Your local changes would be overwritten by revert."
 msgstr ""
 
-#: sequencer.c:268
+#: sequencer.c:234
 msgid "Commit your changes or stash them to proceed."
 msgstr ""
 
 #. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:325
+#: sequencer.c:304
 #, c-format
 msgid "%s: Unable to write new index file"
 msgstr ""
 
-#: sequencer.c:356
+#: sequencer.c:335
 msgid "Could not resolve HEAD commit\n"
 msgstr ""
 
-#: sequencer.c:378
+#: sequencer.c:355
 msgid "Unable to update cache tree\n"
 msgstr ""
 
-#: sequencer.c:430
+#: sequencer.c:402
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr ""
 
-#: sequencer.c:435
+#: sequencer.c:407
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr ""
 
-#: sequencer.c:501
+#: sequencer.c:473
 msgid "Your index file is unmerged."
 msgstr ""
 
-#: sequencer.c:520
+#: sequencer.c:492
 #, c-format
 msgid "Commit %s is a merge but no -m option was given."
 msgstr ""
 
-#: sequencer.c:528
+#: sequencer.c:500
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr ""
 
-#: sequencer.c:532
+#: sequencer.c:504
 #, c-format
 msgid "Mainline was specified but commit %s is not a merge."
 msgstr ""
 
 #. TRANSLATORS: The first %s will be "revert" or
 #. "cherry-pick", the second %s a SHA1
-#: sequencer.c:545
+#: sequencer.c:517
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr ""
 
-#: sequencer.c:549
+#: sequencer.c:521
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr ""
 
-#: sequencer.c:635
+#: sequencer.c:607
 #, c-format
 msgid "could not revert %s... %s"
 msgstr ""
 
-#: sequencer.c:636
+#: sequencer.c:608
 #, c-format
 msgid "could not apply %s... %s"
 msgstr ""
 
-#: sequencer.c:672
+#: sequencer.c:644
 msgid "empty commit set passed"
 msgstr ""
 
-#: sequencer.c:680
+#: sequencer.c:652
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr ""
 
-#: sequencer.c:685
+#: sequencer.c:656
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr ""
 
-#: sequencer.c:743
+#: sequencer.c:716
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr ""
 
-#: sequencer.c:765
+#: sequencer.c:738
 #, c-format
 msgid "Could not parse line %d."
 msgstr ""
 
-#: sequencer.c:770
+#: sequencer.c:743
 msgid "No commits parsed."
 msgstr ""
 
-#: sequencer.c:783
+#: sequencer.c:756
 #, c-format
 msgid "Could not open %s"
 msgstr ""
 
-#: sequencer.c:787
+#: sequencer.c:760
 #, c-format
 msgid "Could not read %s."
 msgstr ""
 
-#: sequencer.c:794
+#: sequencer.c:767
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr ""
 
-#: sequencer.c:824
+#: sequencer.c:797
 #, c-format
 msgid "Invalid key: %s"
 msgstr ""
 
-#: sequencer.c:827
+#: sequencer.c:800
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr ""
 
-#: sequencer.c:839
+#: sequencer.c:812
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr ""
 
-#: sequencer.c:860
+#: sequencer.c:833
 msgid "a cherry-pick or revert is already in progress"
 msgstr ""
 
-#: sequencer.c:861
+#: sequencer.c:834
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr ""
 
-#: sequencer.c:865
+#: sequencer.c:838
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr ""
 
-#: sequencer.c:881 sequencer.c:966
+#: sequencer.c:854 sequencer.c:939
 #, c-format
 msgid "Error wrapping up %s."
 msgstr ""
 
-#: sequencer.c:900 sequencer.c:1036
+#: sequencer.c:873 sequencer.c:1009
 msgid "no cherry-pick or revert in progress"
 msgstr ""
 
-#: sequencer.c:902
+#: sequencer.c:875
 msgid "cannot resolve HEAD"
 msgstr ""
 
-#: sequencer.c:904
+#: sequencer.c:877
 msgid "cannot abort from a branch yet to be born"
 msgstr ""
 
-#: sequencer.c:926 builtin/apply.c:4061
+#: sequencer.c:899 builtin/apply.c:4128
 #, c-format
 msgid "cannot open %s: %s"
 msgstr ""
 
-#: sequencer.c:929
+#: sequencer.c:902
 #, c-format
 msgid "cannot read %s: %s"
 msgstr ""
 
-#: sequencer.c:930
+#: sequencer.c:903
 msgid "unexpected end of file"
 msgstr ""
 
-#: sequencer.c:936
+#: sequencer.c:909
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr ""
 
-#: sequencer.c:959
+#: sequencer.c:932
 #, c-format
 msgid "Could not format %s."
 msgstr ""
 
-#: sequencer.c:1104
+#: sequencer.c:1077
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr ""
 
-#: sequencer.c:1107
+#: sequencer.c:1080
 #, c-format
 msgid "%s: bad revision"
 msgstr ""
 
-#: sequencer.c:1141
+#: sequencer.c:1114
 msgid "Can't revert as initial commit"
 msgstr ""
 
-#: sequencer.c:1142
+#: sequencer.c:1115
 msgid "Can't cherry-pick into empty head"
 msgstr ""
 
-#: sha1_name.c:439
+#: sha1_name.c:440
 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"
@@ -1263,21 +1341,21 @@
 "running \"git config advice.objectNameWarning false\""
 msgstr ""
 
-#: sha1_name.c:1072
+#: sha1_name.c:1068
 msgid "HEAD does not point to a branch"
 msgstr ""
 
-#: sha1_name.c:1075
+#: sha1_name.c:1071
 #, c-format
 msgid "No such branch: '%s'"
 msgstr ""
 
-#: sha1_name.c:1077
+#: sha1_name.c:1073
 #, c-format
 msgid "No upstream configured for branch '%s'"
 msgstr ""
 
-#: sha1_name.c:1081
+#: sha1_name.c:1077
 #, c-format
 msgid "Upstream branch '%s' not stored as a remote-tracking branch"
 msgstr ""
@@ -1305,17 +1383,42 @@
 msgid "staging updated .gitmodules failed"
 msgstr ""
 
-#: submodule.c:1121 builtin/init-db.c:363
+#: submodule.c:1111 builtin/init-db.c:363
 #, c-format
 msgid "Could not create git link %s"
 msgstr ""
 
-#: submodule.c:1132
+#: submodule.c:1122
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr ""
 
-#: unpack-trees.c:206
+#: trailer.c:500 trailer.c:504 trailer.c:508 trailer.c:562 trailer.c:566
+#: trailer.c:570
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr ""
+
+#: trailer.c:552 trailer.c:557 builtin/remote.c:288
+#, c-format
+msgid "more than one %s"
+msgstr ""
+
+#: trailer.c:587
+#, c-format
+msgid "empty trailer token in trailer '%s'"
+msgstr ""
+
+#: trailer.c:706
+#, c-format
+msgid "could not read input file '%s'"
+msgstr ""
+
+#: trailer.c:709
+msgid "could not read from stdin"
+msgstr ""
+
+#: unpack-trees.c:202
 msgid "Checking out files"
 msgstr ""
 
@@ -1348,25 +1451,29 @@
 msgid "invalid '..' path segment"
 msgstr ""
 
-#: wrapper.c:422
+#: wrapper.c:509
 #, c-format
 msgid "unable to access '%s': %s"
 msgstr ""
 
-#: wrapper.c:443
+#: wrapper.c:530
 #, c-format
 msgid "unable to access '%s'"
 msgstr ""
 
-#: wrapper.c:454
+#: wrapper.c:541
 #, c-format
 msgid "unable to look up current user in the passwd file: %s"
 msgstr ""
 
-#: wrapper.c:455
+#: wrapper.c:542
 msgid "no such user"
 msgstr ""
 
+#: wrapper.c:550
+msgid "unable to get current working directory"
+msgstr ""
+
 #: wt-status.c:150
 msgid "Unmerged paths:"
 msgstr ""
@@ -1504,193 +1611,193 @@
 msgid "bug: unhandled diff status %c"
 msgstr ""
 
-#: wt-status.c:765
+#: wt-status.c:761
 msgid "Submodules changed but not updated:"
 msgstr ""
 
-#: wt-status.c:767
+#: wt-status.c:763
 msgid "Submodule changes to be committed:"
 msgstr ""
 
-#: wt-status.c:846
+#: wt-status.c:842
 msgid ""
 "Do not touch the line above.\n"
 "Everything below will be removed."
 msgstr ""
 
-#: wt-status.c:937
+#: wt-status.c:933
 msgid "You have unmerged paths."
 msgstr ""
 
-#: wt-status.c:940
+#: wt-status.c:936
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr ""
 
-#: wt-status.c:943
+#: wt-status.c:939
 msgid "All conflicts fixed but you are still merging."
 msgstr ""
 
-#: wt-status.c:946
+#: wt-status.c:942
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr ""
 
-#: wt-status.c:956
+#: wt-status.c:952
 msgid "You are in the middle of an am session."
 msgstr ""
 
-#: wt-status.c:959
+#: wt-status.c:955
 msgid "The current patch is empty."
 msgstr ""
 
-#: wt-status.c:963
+#: wt-status.c:959
 msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr ""
 
-#: wt-status.c:965
+#: wt-status.c:961
 msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr ""
 
-#: wt-status.c:967
+#: wt-status.c:963
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr ""
 
-#: wt-status.c:1027 wt-status.c:1044
+#: wt-status.c:1023 wt-status.c:1040
 #, c-format
 msgid "You are currently rebasing branch '%s' on '%s'."
 msgstr ""
 
-#: wt-status.c:1032 wt-status.c:1049
+#: wt-status.c:1028 wt-status.c:1045
 msgid "You are currently rebasing."
 msgstr ""
 
-#: wt-status.c:1035
+#: wt-status.c:1031
 msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr ""
 
-#: wt-status.c:1037
+#: wt-status.c:1033
 msgid "  (use \"git rebase --skip\" to skip this patch)"
 msgstr ""
 
-#: wt-status.c:1039
+#: wt-status.c:1035
 msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr ""
 
-#: wt-status.c:1052
+#: wt-status.c:1048
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr ""
 
-#: wt-status.c:1056
+#: wt-status.c:1052
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
 msgstr ""
 
-#: wt-status.c:1061
+#: wt-status.c:1057
 msgid "You are currently splitting a commit during a rebase."
 msgstr ""
 
-#: wt-status.c:1064
+#: wt-status.c:1060
 msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr ""
 
-#: wt-status.c:1068
+#: wt-status.c:1064
 #, c-format
 msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr ""
 
-#: wt-status.c:1073
+#: wt-status.c:1069
 msgid "You are currently editing a commit during a rebase."
 msgstr ""
 
-#: wt-status.c:1076
+#: wt-status.c:1072
 msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr ""
 
-#: wt-status.c:1078
+#: wt-status.c:1074
 msgid ""
 "  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr ""
 
-#: wt-status.c:1088
+#: wt-status.c:1084
 #, c-format
 msgid "You are currently cherry-picking commit %s."
 msgstr ""
 
-#: wt-status.c:1093
+#: wt-status.c:1089
 msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
 msgstr ""
 
-#: wt-status.c:1096
+#: wt-status.c:1092
 msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr ""
 
-#: wt-status.c:1098
+#: wt-status.c:1094
 msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr ""
 
-#: wt-status.c:1107
+#: wt-status.c:1103
 #, c-format
 msgid "You are currently reverting commit %s."
 msgstr ""
 
-#: wt-status.c:1112
+#: wt-status.c:1108
 msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr ""
 
-#: wt-status.c:1115
+#: wt-status.c:1111
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr ""
 
-#: wt-status.c:1117
+#: wt-status.c:1113
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr ""
 
-#: wt-status.c:1128
+#: wt-status.c:1124
 #, c-format
 msgid "You are currently bisecting, started from branch '%s'."
 msgstr ""
 
-#: wt-status.c:1132
+#: wt-status.c:1128
 msgid "You are currently bisecting."
 msgstr ""
 
-#: wt-status.c:1135
+#: wt-status.c:1131
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr ""
 
-#: wt-status.c:1310
+#: wt-status.c:1306
 msgid "On branch "
 msgstr ""
 
-#: wt-status.c:1317
+#: wt-status.c:1313
 msgid "rebase in progress; onto "
 msgstr ""
 
-#: wt-status.c:1324
+#: wt-status.c:1320
 msgid "HEAD detached at "
 msgstr ""
 
-#: wt-status.c:1326
+#: wt-status.c:1322
 msgid "HEAD detached from "
 msgstr ""
 
-#: wt-status.c:1329
+#: wt-status.c:1325
 msgid "Not currently on any branch."
 msgstr ""
 
-#: wt-status.c:1346
+#: wt-status.c:1342
 msgid "Initial commit"
 msgstr ""
 
-#: wt-status.c:1360
+#: wt-status.c:1356
 msgid "Untracked files"
 msgstr ""
 
-#: wt-status.c:1362
+#: wt-status.c:1358
 msgid "Ignored files"
 msgstr ""
 
-#: wt-status.c:1366
+#: wt-status.c:1362
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1698,123 +1805,123 @@
 "new files yourself (see 'git help status')."
 msgstr ""
 
-#: wt-status.c:1372
+#: wt-status.c:1368
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr ""
 
-#: wt-status.c:1374
+#: wt-status.c:1370
 msgid " (use -u option to show untracked files)"
 msgstr ""
 
-#: wt-status.c:1380
+#: wt-status.c:1376
 msgid "No changes"
 msgstr ""
 
-#: wt-status.c:1385
+#: wt-status.c:1381
 #, c-format
 msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr ""
 
-#: wt-status.c:1388
+#: wt-status.c:1384
 #, c-format
 msgid "no changes added to commit\n"
 msgstr ""
 
-#: wt-status.c:1391
+#: wt-status.c:1387
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
 "track)\n"
 msgstr ""
 
-#: wt-status.c:1394
+#: wt-status.c:1390
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
 msgstr ""
 
-#: wt-status.c:1397
+#: wt-status.c:1393
 #, c-format
 msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
 
-#: wt-status.c:1400 wt-status.c:1405
+#: wt-status.c:1396 wt-status.c:1401
 #, c-format
 msgid "nothing to commit\n"
 msgstr ""
 
-#: wt-status.c:1403
+#: wt-status.c:1399
 #, c-format
 msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
 
-#: wt-status.c:1407
+#: wt-status.c:1403
 #, c-format
 msgid "nothing to commit, working directory clean\n"
 msgstr ""
 
-#: wt-status.c:1516
+#: wt-status.c:1512
 msgid "HEAD (no branch)"
 msgstr ""
 
-#: wt-status.c:1522
+#: wt-status.c:1518
 msgid "Initial commit on "
 msgstr ""
 
-#: wt-status.c:1554
+#: wt-status.c:1550
 msgid "gone"
 msgstr ""
 
-#: wt-status.c:1556 wt-status.c:1564
+#: wt-status.c:1552 wt-status.c:1560
 msgid "behind "
 msgstr ""
 
-#: compat/precompose_utf8.c:55 builtin/clone.c:356
+#: compat/precompose_utf8.c:55 builtin/clone.c:357
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr ""
 
-#: builtin/add.c:21
+#: builtin/add.c:22
 msgid "git add [options] [--] <pathspec>..."
 msgstr ""
 
-#: builtin/add.c:64
+#: builtin/add.c:65
 #, c-format
 msgid "unexpected diff status %c"
 msgstr ""
 
-#: builtin/add.c:69 builtin/commit.c:261
+#: builtin/add.c:70 builtin/commit.c:275
 msgid "updating files failed"
 msgstr ""
 
-#: builtin/add.c:79
+#: builtin/add.c:80
 #, c-format
 msgid "remove '%s'\n"
 msgstr ""
 
-#: builtin/add.c:133
+#: builtin/add.c:134
 msgid "Unstaged changes after refreshing the index:"
 msgstr ""
 
-#: builtin/add.c:193
+#: builtin/add.c:194 builtin/rev-parse.c:785
 msgid "Could not read the index"
 msgstr ""
 
-#: builtin/add.c:204
+#: builtin/add.c:205
 #, c-format
 msgid "Could not open '%s' for writing."
 msgstr ""
 
-#: builtin/add.c:208
+#: builtin/add.c:209
 msgid "Could not write patch"
 msgstr ""
 
-#: builtin/add.c:213
+#: builtin/add.c:214
 #, c-format
 msgid "Could not stat '%s'"
 msgstr ""
 
-#: builtin/add.c:215
+#: builtin/add.c:216
 msgid "Empty patch. Aborted."
 msgstr ""
 
@@ -1827,15 +1934,15 @@
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr ""
 
-#: builtin/add.c:248 builtin/clean.c:876 builtin/fetch.c:93 builtin/mv.c:70
-#: builtin/prune-packed.c:77 builtin/push.c:489 builtin/remote.c:1344
+#: builtin/add.c:248 builtin/clean.c:875 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/prune-packed.c:55 builtin/push.c:499 builtin/remote.c:1375
 #: builtin/rm.c:269
 msgid "dry run"
 msgstr ""
 
-#: builtin/add.c:249 builtin/apply.c:4410 builtin/check-ignore.c:19
-#: builtin/commit.c:1256 builtin/count-objects.c:95 builtin/fsck.c:612
-#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113
+#: builtin/add.c:249 builtin/apply.c:4415 builtin/check-ignore.c:19
+#: builtin/commit.c:1362 builtin/count-objects.c:63 builtin/fsck.c:608
+#: builtin/log.c:1617 builtin/mv.c:109 builtin/read-tree.c:114
 msgid "be verbose"
 msgstr ""
 
@@ -1843,7 +1950,7 @@
 msgid "interactive picking"
 msgstr ""
 
-#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:286
 msgid "select hunks interactively"
 msgstr ""
 
@@ -1896,93 +2003,93 @@
 msgid "adding files failed"
 msgstr ""
 
-#: builtin/add.c:330
+#: builtin/add.c:329
 msgid "-A and -u are mutually incompatible"
 msgstr ""
 
-#: builtin/add.c:337
+#: builtin/add.c:336
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr ""
 
-#: builtin/add.c:358
+#: builtin/add.c:357
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr ""
 
-#: builtin/add.c:359
+#: builtin/add.c:358
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr ""
 
-#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:920
-#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:234 builtin/rm.c:299
+#: builtin/add.c:363 builtin/check-ignore.c:172 builtin/clean.c:919
+#: builtin/commit.c:333 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:299
 msgid "index file corrupt"
 msgstr ""
 
-#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
+#: builtin/add.c:446 builtin/apply.c:4510 builtin/mv.c:279 builtin/rm.c:431
 msgid "Unable to write new index file"
 msgstr ""
 
-#: builtin/apply.c:57
+#: builtin/apply.c:58
 msgid "git apply [options] [<patch>...]"
 msgstr ""
 
-#: builtin/apply.c:110
+#: builtin/apply.c:111
 #, c-format
 msgid "unrecognized whitespace option '%s'"
 msgstr ""
 
-#: builtin/apply.c:125
+#: builtin/apply.c:126
 #, c-format
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr ""
 
-#: builtin/apply.c:823
+#: builtin/apply.c:826
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr ""
 
-#: builtin/apply.c:832
+#: builtin/apply.c:835
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr ""
 
-#: builtin/apply.c:913
+#: builtin/apply.c:916
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr ""
 
-#: builtin/apply.c:945
+#: builtin/apply.c:948
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr ""
 
-#: builtin/apply.c:949
+#: builtin/apply.c:952
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr ""
 
-#: builtin/apply.c:950
+#: builtin/apply.c:953
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr ""
 
-#: builtin/apply.c:957
+#: builtin/apply.c:960
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr ""
 
-#: builtin/apply.c:1422
+#: builtin/apply.c:1423
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr ""
 
-#: builtin/apply.c:1479
+#: builtin/apply.c:1480
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr ""
 
-#: builtin/apply.c:1496
+#: builtin/apply.c:1497
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -1993,394 +2100,394 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/apply.c:1656
+#: builtin/apply.c:1657
 msgid "new file depends on old contents"
 msgstr ""
 
-#: builtin/apply.c:1658
+#: builtin/apply.c:1659
 msgid "deleted file still has contents"
 msgstr ""
 
-#: builtin/apply.c:1684
+#: builtin/apply.c:1685
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr ""
 
-#: builtin/apply.c:1720
+#: builtin/apply.c:1721
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr ""
 
-#: builtin/apply.c:1722
+#: builtin/apply.c:1723
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr ""
 
-#: builtin/apply.c:1725
+#: builtin/apply.c:1726
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr ""
 
-#: builtin/apply.c:1871
+#: builtin/apply.c:1872
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr ""
 
-#: builtin/apply.c:1900
+#: builtin/apply.c:1901
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr ""
 
-#: builtin/apply.c:1986
+#: builtin/apply.c:2052
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr ""
 
-#: builtin/apply.c:2076
+#: builtin/apply.c:2142
 #, c-format
 msgid "unable to read symlink %s"
 msgstr ""
 
-#: builtin/apply.c:2080
+#: builtin/apply.c:2146
 #, c-format
 msgid "unable to open or read %s"
 msgstr ""
 
-#: builtin/apply.c:2688
+#: builtin/apply.c:2754
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr ""
 
-#: builtin/apply.c:2806
+#: builtin/apply.c:2872
 #, 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:2818
+#: builtin/apply.c:2884
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr ""
 
-#: builtin/apply.c:2824
+#: builtin/apply.c:2890
 #, c-format
 msgid ""
 "while searching for:\n"
 "%.*s"
 msgstr ""
 
-#: builtin/apply.c:2843
+#: builtin/apply.c:2909
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr ""
 
-#: builtin/apply.c:2946
+#: builtin/apply.c:3010
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr ""
 
-#: builtin/apply.c:2952
+#: builtin/apply.c:3016
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr ""
 
-#: builtin/apply.c:2973
+#: builtin/apply.c:3037
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr ""
 
-#: builtin/apply.c:3095
+#: builtin/apply.c:3161
 #, c-format
 msgid "cannot checkout %s"
 msgstr ""
 
-#: builtin/apply.c:3140 builtin/apply.c:3149 builtin/apply.c:3194
+#: builtin/apply.c:3206 builtin/apply.c:3215 builtin/apply.c:3260
 #, c-format
 msgid "read of %s failed"
 msgstr ""
 
-#: builtin/apply.c:3174 builtin/apply.c:3396
+#: builtin/apply.c:3240 builtin/apply.c:3462
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr ""
 
-#: builtin/apply.c:3255 builtin/apply.c:3410
+#: builtin/apply.c:3321 builtin/apply.c:3476
 #, c-format
 msgid "%s: does not exist in index"
 msgstr ""
 
-#: builtin/apply.c:3259 builtin/apply.c:3402 builtin/apply.c:3424
+#: builtin/apply.c:3325 builtin/apply.c:3468 builtin/apply.c:3490
 #, c-format
 msgid "%s: %s"
 msgstr ""
 
-#: builtin/apply.c:3264 builtin/apply.c:3418
+#: builtin/apply.c:3330 builtin/apply.c:3484
 #, c-format
 msgid "%s: does not match index"
 msgstr ""
 
-#: builtin/apply.c:3366
+#: builtin/apply.c:3432
 msgid "removal patch leaves file contents"
 msgstr ""
 
-#: builtin/apply.c:3435
+#: builtin/apply.c:3501
 #, c-format
 msgid "%s: wrong type"
 msgstr ""
 
-#: builtin/apply.c:3437
+#: builtin/apply.c:3503
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr ""
 
-#: builtin/apply.c:3538
+#: builtin/apply.c:3604
 #, c-format
 msgid "%s: already exists in index"
 msgstr ""
 
-#: builtin/apply.c:3541
+#: builtin/apply.c:3607
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr ""
 
-#: builtin/apply.c:3561
+#: builtin/apply.c:3627
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr ""
 
-#: builtin/apply.c:3566
+#: builtin/apply.c:3632
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr ""
 
-#: builtin/apply.c:3574
+#: builtin/apply.c:3640
 #, c-format
 msgid "%s: patch does not apply"
 msgstr ""
 
-#: builtin/apply.c:3587
+#: builtin/apply.c:3653
 #, c-format
 msgid "Checking patch %s..."
 msgstr ""
 
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
+#: builtin/apply.c:3746 builtin/checkout.c:213 builtin/reset.c:135
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr ""
 
-#: builtin/apply.c:3823
+#: builtin/apply.c:3889
 #, c-format
 msgid "unable to remove %s from index"
 msgstr ""
 
-#: builtin/apply.c:3851
+#: builtin/apply.c:3918
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr ""
 
-#: builtin/apply.c:3855
+#: builtin/apply.c:3922
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr ""
 
-#: builtin/apply.c:3860
+#: builtin/apply.c:3927
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr ""
 
-#: builtin/apply.c:3863 builtin/apply.c:3971
+#: builtin/apply.c:3930 builtin/apply.c:4038
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr ""
 
-#: builtin/apply.c:3896
+#: builtin/apply.c:3963
 #, c-format
 msgid "closing file '%s'"
 msgstr ""
 
-#: builtin/apply.c:3945
+#: builtin/apply.c:4012
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr ""
 
-#: builtin/apply.c:4032
+#: builtin/apply.c:4099
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr ""
 
-#: builtin/apply.c:4040
+#: builtin/apply.c:4107
 msgid "internal error"
 msgstr ""
 
-#: builtin/apply.c:4043
+#: builtin/apply.c:4110
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/apply.c:4053
+#: builtin/apply.c:4120
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr ""
 
-#: builtin/apply.c:4074
+#: builtin/apply.c:4141
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr ""
 
-#: builtin/apply.c:4077
+#: builtin/apply.c:4144
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr ""
 
-#: builtin/apply.c:4227
+#: builtin/apply.c:4234
 msgid "unrecognized input"
 msgstr ""
 
-#: builtin/apply.c:4238
+#: builtin/apply.c:4245
 msgid "unable to read index file"
 msgstr ""
 
-#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90
-#: builtin/fetch.c:78
+#: builtin/apply.c:4362 builtin/apply.c:4365 builtin/clone.c:91
+#: builtin/fetch.c:93
 msgid "path"
 msgstr ""
 
-#: builtin/apply.c:4358
+#: builtin/apply.c:4363
 msgid "don't apply changes matching the given path"
 msgstr ""
 
-#: builtin/apply.c:4361
+#: builtin/apply.c:4366
 msgid "apply changes matching the given path"
 msgstr ""
 
-#: builtin/apply.c:4363
+#: builtin/apply.c:4368
 msgid "num"
 msgstr ""
 
-#: builtin/apply.c:4364
+#: builtin/apply.c:4369
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr ""
 
-#: builtin/apply.c:4367
+#: builtin/apply.c:4372
 msgid "ignore additions made by the patch"
 msgstr ""
 
-#: builtin/apply.c:4369
+#: builtin/apply.c:4374
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr ""
 
-#: builtin/apply.c:4373
+#: builtin/apply.c:4378
 msgid "show number of added and deleted lines in decimal notation"
 msgstr ""
 
-#: builtin/apply.c:4375
+#: builtin/apply.c:4380
 msgid "instead of applying the patch, output a summary for the input"
 msgstr ""
 
-#: builtin/apply.c:4377
+#: builtin/apply.c:4382
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr ""
 
-#: builtin/apply.c:4379
+#: builtin/apply.c:4384
 msgid "make sure the patch is applicable to the current index"
 msgstr ""
 
-#: builtin/apply.c:4381
+#: builtin/apply.c:4386
 msgid "apply a patch without touching the working tree"
 msgstr ""
 
-#: builtin/apply.c:4383
+#: builtin/apply.c:4388
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr ""
 
-#: builtin/apply.c:4385
+#: builtin/apply.c:4390
 msgid "attempt three-way merge if a patch does not apply"
 msgstr ""
 
-#: builtin/apply.c:4387
+#: builtin/apply.c:4392
 msgid "build a temporary index based on embedded index information"
 msgstr ""
 
-#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
+#: builtin/apply.c:4394 builtin/checkout-index.c:198 builtin/ls-files.c:455
 msgid "paths are separated with NUL character"
 msgstr ""
 
-#: builtin/apply.c:4392
+#: builtin/apply.c:4397
 msgid "ensure at least <n> lines of context match"
 msgstr ""
 
-#: builtin/apply.c:4393
+#: builtin/apply.c:4398
 msgid "action"
 msgstr ""
 
-#: builtin/apply.c:4394
+#: builtin/apply.c:4399
 msgid "detect new or modified lines that have whitespace errors"
 msgstr ""
 
-#: builtin/apply.c:4397 builtin/apply.c:4400
+#: builtin/apply.c:4402 builtin/apply.c:4405
 msgid "ignore changes in whitespace when finding context"
 msgstr ""
 
-#: builtin/apply.c:4403
+#: builtin/apply.c:4408
 msgid "apply the patch in reverse"
 msgstr ""
 
-#: builtin/apply.c:4405
+#: builtin/apply.c:4410
 msgid "don't expect at least one line of context"
 msgstr ""
 
-#: builtin/apply.c:4407
+#: builtin/apply.c:4412
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr ""
 
-#: builtin/apply.c:4409
+#: builtin/apply.c:4414
 msgid "allow overlapping hunks"
 msgstr ""
 
-#: builtin/apply.c:4412
+#: builtin/apply.c:4417
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr ""
 
-#: builtin/apply.c:4415
+#: builtin/apply.c:4420
 msgid "do not trust the line counts in the hunk headers"
 msgstr ""
 
-#: builtin/apply.c:4417
+#: builtin/apply.c:4422
 msgid "root"
 msgstr ""
 
-#: builtin/apply.c:4418
+#: builtin/apply.c:4423
 msgid "prepend <root> to all filenames"
 msgstr ""
 
-#: builtin/apply.c:4440
+#: builtin/apply.c:4445
 msgid "--3way outside a repository"
 msgstr ""
 
-#: builtin/apply.c:4448
+#: builtin/apply.c:4453
 msgid "--index outside a repository"
 msgstr ""
 
-#: builtin/apply.c:4451
+#: builtin/apply.c:4456
 msgid "--cached outside a repository"
 msgstr ""
 
-#: builtin/apply.c:4467
+#: builtin/apply.c:4472
 #, c-format
 msgid "can't open patch '%s'"
 msgstr ""
 
-#: builtin/apply.c:4481
+#: builtin/apply.c:4486
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/apply.c:4487 builtin/apply.c:4497
+#: builtin/apply.c:4492 builtin/apply.c:4502
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -2434,106 +2541,116 @@
 msgid "update BISECT_HEAD instead of checking out the current commit"
 msgstr ""
 
-#: builtin/blame.c:27
+#: builtin/blame.c:30
 msgid "git blame [options] [rev-opts] [rev] [--] file"
 msgstr ""
 
-#: builtin/blame.c:32
+#: builtin/blame.c:35
 msgid "[rev-opts] are documented in git-rev-list(1)"
 msgstr ""
 
-#: builtin/blame.c:2242
+#: builtin/blame.c:2501
 msgid "Show blame entries as we find them, incrementally"
 msgstr ""
 
-#: builtin/blame.c:2243
+#: builtin/blame.c:2502
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2244
+#: builtin/blame.c:2503
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2245
+#: builtin/blame.c:2504
 msgid "Show work cost statistics"
 msgstr ""
 
-#: builtin/blame.c:2246
+#: builtin/blame.c:2505
 msgid "Show output score for blame entries"
 msgstr ""
 
-#: builtin/blame.c:2247
+#: builtin/blame.c:2506
 msgid "Show original filename (Default: auto)"
 msgstr ""
 
-#: builtin/blame.c:2248
+#: builtin/blame.c:2507
 msgid "Show original linenumber (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2249
+#: builtin/blame.c:2508
 msgid "Show in a format designed for machine consumption"
 msgstr ""
 
-#: builtin/blame.c:2250
+#: builtin/blame.c:2509
 msgid "Show porcelain format with per-line commit information"
 msgstr ""
 
-#: builtin/blame.c:2251
+#: builtin/blame.c:2510
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2252
+#: builtin/blame.c:2511
 msgid "Show raw timestamp (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2253
+#: builtin/blame.c:2512
 msgid "Show long commit SHA1 (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2254
+#: builtin/blame.c:2513
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2255
+#: builtin/blame.c:2514
 msgid "Show author email instead of name (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2256
+#: builtin/blame.c:2515
 msgid "Ignore whitespace differences"
 msgstr ""
 
-#: builtin/blame.c:2257
+#: builtin/blame.c:2516
 msgid "Spend extra cycles to find better match"
 msgstr ""
 
-#: builtin/blame.c:2258
+#: builtin/blame.c:2517
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr ""
 
-#: builtin/blame.c:2259
+#: builtin/blame.c:2518
 msgid "Use <file>'s contents as the final image"
 msgstr ""
 
-#: builtin/blame.c:2260 builtin/blame.c:2261
+#: builtin/blame.c:2519 builtin/blame.c:2520
 msgid "score"
 msgstr ""
 
-#: builtin/blame.c:2260
+#: builtin/blame.c:2519
 msgid "Find line copies within and across files"
 msgstr ""
 
-#: builtin/blame.c:2261
+#: builtin/blame.c:2520
 msgid "Find line movements within and across files"
 msgstr ""
 
-#: builtin/blame.c:2262
+#: builtin/blame.c:2521
 msgid "n,m"
 msgstr ""
 
-#: builtin/blame.c:2262
+#: builtin/blame.c:2521
 msgid "Process only line range n,m, counting from 1"
 msgstr ""
 
+#. TRANSLATORS: This string is used to tell us the maximum
+#. display width for a relative timestamp in "git blame"
+#. output.  For C locale, "4 years, 11 months ago", which
+#. takes 22 places, is the longest among various forms of
+#. relative timestamps, but your language may need more or
+#. fewer display columns.
+#: builtin/blame.c:2602
+msgid "4 years, 11 months ago"
+msgstr ""
+
 #: builtin/branch.c:24
 msgid "git branch [options] [-r | -a] [--merged | --no-merged]"
 msgstr ""
@@ -2550,371 +2667,371 @@
 msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>"
 msgstr ""
 
-#: builtin/branch.c:150
+#: builtin/branch.c:152
 #, 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:156
 #, 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:170
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr ""
 
-#: builtin/branch.c:172
+#: builtin/branch.c:174
 #, 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:187
 msgid "Update of config-file failed"
 msgstr ""
 
-#: builtin/branch.c:213
+#: builtin/branch.c:215
 msgid "cannot use -a with -d"
 msgstr ""
 
-#: builtin/branch.c:219
+#: builtin/branch.c:221
 msgid "Couldn't look up commit object for HEAD"
 msgstr ""
 
-#: builtin/branch.c:227
+#: builtin/branch.c:229
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
 msgstr ""
 
-#: builtin/branch.c:240
+#: builtin/branch.c:245
 #, c-format
 msgid "remote branch '%s' not found."
 msgstr ""
 
-#: builtin/branch.c:241
+#: builtin/branch.c:246
 #, c-format
 msgid "branch '%s' not found."
 msgstr ""
 
-#: builtin/branch.c:255
+#: builtin/branch.c:260
 #, c-format
 msgid "Error deleting remote branch '%s'"
 msgstr ""
 
-#: builtin/branch.c:256
+#: builtin/branch.c:261
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr ""
 
-#: builtin/branch.c:263
+#: builtin/branch.c:268
 #, c-format
 msgid "Deleted remote branch %s (was %s).\n"
 msgstr ""
 
-#: builtin/branch.c:264
+#: builtin/branch.c:269
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr ""
 
-#: builtin/branch.c:366
+#: builtin/branch.c:370
 #, c-format
 msgid "branch '%s' does not point at a commit"
 msgstr ""
 
-#: builtin/branch.c:454
+#: builtin/branch.c:459
 #, c-format
 msgid "[%s: gone]"
 msgstr ""
 
-#: builtin/branch.c:459
+#: builtin/branch.c:464
 #, c-format
 msgid "[%s]"
 msgstr ""
 
-#: builtin/branch.c:464
+#: builtin/branch.c:469
 #, c-format
 msgid "[%s: behind %d]"
 msgstr ""
 
-#: builtin/branch.c:466
+#: builtin/branch.c:471
 #, c-format
 msgid "[behind %d]"
 msgstr ""
 
-#: builtin/branch.c:470
+#: builtin/branch.c:475
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr ""
 
-#: builtin/branch.c:472
+#: builtin/branch.c:477
 #, c-format
 msgid "[ahead %d]"
 msgstr ""
 
-#: builtin/branch.c:475
+#: builtin/branch.c:480
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr ""
 
-#: builtin/branch.c:478
+#: builtin/branch.c:483
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr ""
 
-#: builtin/branch.c:502
+#: builtin/branch.c:496
 msgid " **** invalid ref ****"
 msgstr ""
 
-#: builtin/branch.c:594
+#: builtin/branch.c:587
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr ""
 
-#: builtin/branch.c:597
+#: builtin/branch.c:590
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr ""
 
-#: builtin/branch.c:600
+#: builtin/branch.c:593
 #, c-format
 msgid "(detached from %s)"
 msgstr ""
 
-#: builtin/branch.c:603
+#: builtin/branch.c:596
 msgid "(no branch)"
 msgstr ""
 
-#: builtin/branch.c:649
+#: builtin/branch.c:643
 #, c-format
 msgid "object '%s' does not point to a commit"
 msgstr ""
 
-#: builtin/branch.c:681
+#: builtin/branch.c:691
 msgid "some refs could not be read"
 msgstr ""
 
-#: builtin/branch.c:694
+#: builtin/branch.c:704
 msgid "cannot rename the current branch while not on any."
 msgstr ""
 
-#: builtin/branch.c:704
+#: builtin/branch.c:714
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr ""
 
-#: builtin/branch.c:719
+#: builtin/branch.c:729
 msgid "Branch rename failed"
 msgstr ""
 
-#: builtin/branch.c:723
+#: builtin/branch.c:733
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr ""
 
-#: builtin/branch.c:727
+#: builtin/branch.c:737
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr ""
 
-#: builtin/branch.c:734
+#: builtin/branch.c:744
 msgid "Branch is renamed, but update of config-file failed"
 msgstr ""
 
-#: builtin/branch.c:749
+#: builtin/branch.c:759
 #, c-format
 msgid "malformed object name %s"
 msgstr ""
 
-#: builtin/branch.c:773
+#: builtin/branch.c:783
 #, c-format
 msgid "could not write branch description template: %s"
 msgstr ""
 
-#: builtin/branch.c:803
+#: builtin/branch.c:813
 msgid "Generic options"
 msgstr ""
 
-#: builtin/branch.c:805
+#: builtin/branch.c:815
 msgid "show hash and subject, give twice for upstream branch"
 msgstr ""
 
-#: builtin/branch.c:806
+#: builtin/branch.c:816
 msgid "suppress informational messages"
 msgstr ""
 
-#: builtin/branch.c:807
+#: builtin/branch.c:817
 msgid "set up tracking mode (see git-pull(1))"
 msgstr ""
 
-#: builtin/branch.c:809
+#: builtin/branch.c:819
 msgid "change upstream info"
 msgstr ""
 
-#: builtin/branch.c:813
+#: builtin/branch.c:823
 msgid "use colored output"
 msgstr ""
 
-#: builtin/branch.c:814
+#: builtin/branch.c:824
 msgid "act on remote-tracking branches"
 msgstr ""
 
-#: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844
-#: builtin/branch.c:850 builtin/commit.c:1494 builtin/commit.c:1495
-#: builtin/commit.c:1496 builtin/commit.c:1497 builtin/tag.c:527
-#: builtin/tag.c:533
+#: builtin/branch.c:827 builtin/branch.c:833 builtin/branch.c:854
+#: builtin/branch.c:860 builtin/commit.c:1622 builtin/commit.c:1623
+#: builtin/commit.c:1624 builtin/commit.c:1625 builtin/tag.c:616
+#: builtin/tag.c:622
 msgid "commit"
 msgstr ""
 
-#: builtin/branch.c:818 builtin/branch.c:824
+#: builtin/branch.c:828 builtin/branch.c:834
 msgid "print only branches that contain the commit"
 msgstr ""
 
-#: builtin/branch.c:830
+#: builtin/branch.c:840
 msgid "Specific git-branch actions:"
 msgstr ""
 
-#: builtin/branch.c:831
+#: builtin/branch.c:841
 msgid "list both remote-tracking and local branches"
 msgstr ""
 
-#: builtin/branch.c:833
+#: builtin/branch.c:843
 msgid "delete fully merged branch"
 msgstr ""
 
-#: builtin/branch.c:834
+#: builtin/branch.c:844
 msgid "delete branch (even if not merged)"
 msgstr ""
 
-#: builtin/branch.c:835
+#: builtin/branch.c:845
 msgid "move/rename a branch and its reflog"
 msgstr ""
 
-#: builtin/branch.c:836
+#: builtin/branch.c:846
 msgid "move/rename a branch, even if target exists"
 msgstr ""
 
-#: builtin/branch.c:837
+#: builtin/branch.c:847
 msgid "list branch names"
 msgstr ""
 
-#: builtin/branch.c:838
+#: builtin/branch.c:848
 msgid "create the branch's reflog"
 msgstr ""
 
-#: builtin/branch.c:840
+#: builtin/branch.c:850
 msgid "edit the description for the branch"
 msgstr ""
 
-#: builtin/branch.c:841
+#: builtin/branch.c:851
 msgid "force creation (when already exists)"
 msgstr ""
 
-#: builtin/branch.c:844
+#: builtin/branch.c:854
 msgid "print only not merged branches"
 msgstr ""
 
-#: builtin/branch.c:850
+#: builtin/branch.c:860
 msgid "print only merged branches"
 msgstr ""
 
-#: builtin/branch.c:854
+#: builtin/branch.c:864
 msgid "list branches in columns"
 msgstr ""
 
-#: builtin/branch.c:867
+#: builtin/branch.c:877
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr ""
 
-#: builtin/branch.c:872 builtin/clone.c:635
+#: builtin/branch.c:881 builtin/clone.c:634
 msgid "HEAD not found below refs/heads!"
 msgstr ""
 
-#: builtin/branch.c:896
+#: builtin/branch.c:903
 msgid "--column and --verbose are incompatible"
 msgstr ""
 
-#: builtin/branch.c:902 builtin/branch.c:941
+#: builtin/branch.c:909 builtin/branch.c:948
 msgid "branch name required"
 msgstr ""
 
-#: builtin/branch.c:917
+#: builtin/branch.c:924
 msgid "Cannot give description to detached HEAD"
 msgstr ""
 
-#: builtin/branch.c:922
+#: builtin/branch.c:929
 msgid "cannot edit description of more than one branch"
 msgstr ""
 
-#: builtin/branch.c:929
+#: builtin/branch.c:936
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr ""
 
-#: builtin/branch.c:932
+#: builtin/branch.c:939
 #, c-format
 msgid "No branch named '%s'."
 msgstr ""
 
-#: builtin/branch.c:947
+#: builtin/branch.c:954
 msgid "too many branches for a rename operation"
 msgstr ""
 
-#: builtin/branch.c:952
+#: builtin/branch.c:959
 msgid "too many branches to set new upstream"
 msgstr ""
 
-#: builtin/branch.c:956
+#: builtin/branch.c:963
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
 msgstr ""
 
-#: builtin/branch.c:959 builtin/branch.c:981 builtin/branch.c:1002
+#: builtin/branch.c:966 builtin/branch.c:988 builtin/branch.c:1009
 #, c-format
 msgid "no such branch '%s'"
 msgstr ""
 
-#: builtin/branch.c:963
+#: builtin/branch.c:970
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr ""
 
-#: builtin/branch.c:975
+#: builtin/branch.c:982
 msgid "too many branches to unset upstream"
 msgstr ""
 
-#: builtin/branch.c:979
+#: builtin/branch.c:986
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 
-#: builtin/branch.c:985
+#: builtin/branch.c:992
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr ""
 
-#: builtin/branch.c:999
+#: builtin/branch.c:1006
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr ""
 
-#: builtin/branch.c:1005
+#: builtin/branch.c:1012
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 
-#: builtin/branch.c:1008
+#: builtin/branch.c:1015
 #, 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:1025
+#: builtin/branch.c:1032
 #, c-format
 msgid ""
 "\n"
@@ -2922,12 +3039,12 @@
 "\n"
 msgstr ""
 
-#: builtin/branch.c:1026
+#: builtin/branch.c:1033
 #, c-format
 msgid "    git branch -d %s\n"
 msgstr ""
 
-#: builtin/branch.c:1027
+#: builtin/branch.c:1034
 #, c-format
 msgid "    git branch --set-upstream-to %s\n"
 msgstr ""
@@ -2945,43 +3062,43 @@
 msgid "Need a repository to unbundle."
 msgstr ""
 
-#: builtin/cat-file.c:331
+#: builtin/cat-file.c:332
 msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
 msgstr ""
 
-#: builtin/cat-file.c:332
+#: builtin/cat-file.c:333
 msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
 msgstr ""
 
-#: builtin/cat-file.c:369
+#: builtin/cat-file.c:370
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr ""
 
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:371
 msgid "show object type"
 msgstr ""
 
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:372
 msgid "show object size"
 msgstr ""
 
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:374
 msgid "exit with zero when there's no error"
 msgstr ""
 
-#: builtin/cat-file.c:374
+#: builtin/cat-file.c:375
 msgid "pretty-print object's content"
 msgstr ""
 
-#: builtin/cat-file.c:376
+#: builtin/cat-file.c:377
 msgid "for blob objects, run textconv on object's content"
 msgstr ""
 
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:379
 msgid "show info and content of objects fed from the standard input"
 msgstr ""
 
-#: builtin/cat-file.c:381
+#: builtin/cat-file.c:382
 msgid "show info about objects fed from the standard input"
 msgstr ""
 
@@ -3001,7 +3118,7 @@
 msgid "use .gitattributes only from the index"
 msgstr ""
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:75
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr ""
 
@@ -3009,7 +3126,7 @@
 msgid "terminate input and output records by a NUL character"
 msgstr ""
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:274
 msgid "suppress progress reporting"
 msgstr ""
 
@@ -3066,43 +3183,43 @@
 msgid "git checkout-index [options] [--] [<file>...]"
 msgstr ""
 
-#: builtin/checkout-index.c:187
+#: builtin/checkout-index.c:188
 msgid "check out all files in the index"
 msgstr ""
 
-#: builtin/checkout-index.c:188
+#: builtin/checkout-index.c:189
 msgid "force overwrite of existing files"
 msgstr ""
 
-#: builtin/checkout-index.c:190
+#: builtin/checkout-index.c:191
 msgid "no warning for existing files and files not in index"
 msgstr ""
 
-#: builtin/checkout-index.c:192
+#: builtin/checkout-index.c:193
 msgid "don't checkout new files"
 msgstr ""
 
-#: builtin/checkout-index.c:194
+#: builtin/checkout-index.c:195
 msgid "update stat information in the index file"
 msgstr ""
 
-#: builtin/checkout-index.c:200
+#: builtin/checkout-index.c:201
 msgid "read list of paths from the standard input"
 msgstr ""
 
-#: builtin/checkout-index.c:202
+#: builtin/checkout-index.c:203
 msgid "write the content to temporary files"
 msgstr ""
 
-#: builtin/checkout-index.c:203 builtin/column.c:30
+#: builtin/checkout-index.c:204 builtin/column.c:30
 msgid "string"
 msgstr ""
 
-#: builtin/checkout-index.c:204
+#: builtin/checkout-index.c:205
 msgid "when creating files, prepend <string>"
 msgstr ""
 
-#: builtin/checkout-index.c:207
+#: builtin/checkout-index.c:208
 msgid "copy out the files from named stage"
 msgstr ""
 
@@ -3144,65 +3261,65 @@
 msgid "Unable to add merge result for '%s'"
 msgstr ""
 
-#: builtin/checkout.c:232 builtin/checkout.c:235 builtin/checkout.c:238
-#: builtin/checkout.c:241
+#: builtin/checkout.c:231 builtin/checkout.c:234 builtin/checkout.c:237
+#: builtin/checkout.c:240
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr ""
 
-#: builtin/checkout.c:244 builtin/checkout.c:247
+#: builtin/checkout.c:243 builtin/checkout.c:246
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr ""
 
-#: builtin/checkout.c:250
+#: builtin/checkout.c:249
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
 
-#: builtin/checkout.c:261 builtin/checkout.c:450
+#: builtin/checkout.c:260 builtin/checkout.c:449
 msgid "corrupt index file"
 msgstr ""
 
-#: builtin/checkout.c:321 builtin/checkout.c:328
+#: builtin/checkout.c:320 builtin/checkout.c:327
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr ""
 
-#: builtin/checkout.c:472
+#: builtin/checkout.c:471
 msgid "you need to resolve your current index first"
 msgstr ""
 
-#: builtin/checkout.c:593
+#: builtin/checkout.c:597
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:631
+#: builtin/checkout.c:635
 msgid "HEAD is now at"
 msgstr ""
 
-#: builtin/checkout.c:638
+#: builtin/checkout.c:642
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:641
+#: builtin/checkout.c:645
 #, c-format
 msgid "Already on '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:645
+#: builtin/checkout.c:649
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:647 builtin/checkout.c:1032
+#: builtin/checkout.c:651 builtin/checkout.c:1032
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:649
+#: builtin/checkout.c:653
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr ""
@@ -3284,7 +3401,7 @@
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr ""
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:89
 #: builtin/remote.c:159 builtin/remote.c:161
 msgid "branch"
 msgstr ""
@@ -3333,11 +3450,11 @@
 msgid "perform a 3-way merge with the new branch"
 msgstr ""
 
-#: builtin/checkout.c:1105 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:226
 msgid "update ignored files (default)"
 msgstr ""
 
-#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
+#: builtin/checkout.c:1106 builtin/log.c:1239 parse-options.h:245
 msgid "style"
 msgstr ""
 
@@ -3361,27 +3478,27 @@
 msgid "--track needs a branch name"
 msgstr ""
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1157
 msgid "Missing branch name; try -b"
 msgstr ""
 
-#: builtin/checkout.c:1196
+#: builtin/checkout.c:1194
 msgid "invalid path specification"
 msgstr ""
 
-#: builtin/checkout.c:1203
+#: builtin/checkout.c:1201
 #, 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:1208
+#: builtin/checkout.c:1206
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr ""
 
-#: builtin/checkout.c:1212
+#: builtin/checkout.c:1210
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -3442,30 +3559,30 @@
 msgid "Huh (%s)?"
 msgstr ""
 
-#: builtin/clean.c:660
+#: builtin/clean.c:659
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr ""
 
-#: builtin/clean.c:697
+#: builtin/clean.c:696
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr ""
 
-#: builtin/clean.c:718
+#: builtin/clean.c:717
 msgid "Select items to delete"
 msgstr ""
 
-#: builtin/clean.c:758
+#: builtin/clean.c:757
 #, c-format
 msgid "remove %s? "
 msgstr ""
 
-#: builtin/clean.c:783
+#: builtin/clean.c:782
 msgid "Bye."
 msgstr ""
 
-#: builtin/clean.c:791
+#: builtin/clean.c:790
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -3476,212 +3593,212 @@
 "?                   - help for prompt selection"
 msgstr ""
 
-#: builtin/clean.c:818
+#: builtin/clean.c:817
 msgid "*** Commands ***"
 msgstr ""
 
-#: builtin/clean.c:819
+#: builtin/clean.c:818
 msgid "What now"
 msgstr ""
 
-#: builtin/clean.c:827
+#: builtin/clean.c:826
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/clean.c:844
+#: builtin/clean.c:843
 msgid "No more files to clean, exiting."
 msgstr ""
 
-#: builtin/clean.c:875
+#: builtin/clean.c:874
 msgid "do not print names of files removed"
 msgstr ""
 
-#: builtin/clean.c:877
+#: builtin/clean.c:876
 msgid "force"
 msgstr ""
 
-#: builtin/clean.c:878
+#: builtin/clean.c:877
 msgid "interactive cleaning"
 msgstr ""
 
-#: builtin/clean.c:880
+#: builtin/clean.c:879
 msgid "remove whole directories"
 msgstr ""
 
-#: builtin/clean.c:881 builtin/describe.c:415 builtin/grep.c:716
-#: builtin/ls-files.c:486 builtin/name-rev.c:314 builtin/show-ref.c:185
+#: builtin/clean.c:880 builtin/describe.c:407 builtin/grep.c:714
+#: builtin/ls-files.c:486 builtin/name-rev.c:311 builtin/show-ref.c:185
 msgid "pattern"
 msgstr ""
 
-#: builtin/clean.c:882
+#: builtin/clean.c:881
 msgid "add <pattern> to ignore rules"
 msgstr ""
 
-#: builtin/clean.c:883
+#: builtin/clean.c:882
 msgid "remove ignored files, too"
 msgstr ""
 
-#: builtin/clean.c:885
+#: builtin/clean.c:884
 msgid "remove only ignored files"
 msgstr ""
 
-#: builtin/clean.c:903
+#: builtin/clean.c:902
 msgid "-x and -X cannot be used together"
 msgstr ""
 
-#: builtin/clean.c:907
+#: builtin/clean.c:906
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
 msgstr ""
 
-#: builtin/clean.c:910
+#: builtin/clean.c:909
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
 msgstr ""
 
-#: builtin/clone.c:36
+#: builtin/clone.c:37
 msgid "git clone [options] [--] <repo> [<dir>]"
 msgstr ""
 
-#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:504
+#: builtin/clone.c:65 builtin/fetch.c:112 builtin/merge.c:223
+#: builtin/push.c:514
 msgid "force progress reporting"
 msgstr ""
 
-#: builtin/clone.c:66
+#: builtin/clone.c:67
 msgid "don't create a checkout"
 msgstr ""
 
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
+#: builtin/clone.c:68 builtin/clone.c:70 builtin/init-db.c:488
 msgid "create a bare repository"
 msgstr ""
 
-#: builtin/clone.c:71
+#: builtin/clone.c:72
 msgid "create a mirror repository (implies bare)"
 msgstr ""
 
-#: builtin/clone.c:73
+#: builtin/clone.c:74
 msgid "to clone from a local repository"
 msgstr ""
 
-#: builtin/clone.c:75
+#: builtin/clone.c:76
 msgid "don't use local hardlinks, always copy"
 msgstr ""
 
-#: builtin/clone.c:77
+#: builtin/clone.c:78
 msgid "setup as shared repository"
 msgstr ""
 
-#: builtin/clone.c:79 builtin/clone.c:81
+#: builtin/clone.c:80 builtin/clone.c:82
 msgid "initialize submodules in the clone"
 msgstr ""
 
-#: builtin/clone.c:82 builtin/init-db.c:483
+#: builtin/clone.c:83 builtin/init-db.c:485
 msgid "template-directory"
 msgstr ""
 
-#: builtin/clone.c:83 builtin/init-db.c:484
+#: builtin/clone.c:84 builtin/init-db.c:486
 msgid "directory from which templates will be used"
 msgstr ""
 
-#: builtin/clone.c:85
+#: builtin/clone.c:86
 msgid "reference repository"
 msgstr ""
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44
 msgid "name"
 msgstr ""
 
-#: builtin/clone.c:87
+#: builtin/clone.c:88
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr ""
 
-#: builtin/clone.c:89
+#: builtin/clone.c:90
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr ""
 
-#: builtin/clone.c:91
+#: builtin/clone.c:92
 msgid "path to git-upload-pack on the remote"
 msgstr ""
 
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
+#: builtin/clone.c:93 builtin/fetch.c:113 builtin/grep.c:659
 msgid "depth"
 msgstr ""
 
-#: builtin/clone.c:93
+#: builtin/clone.c:94
 msgid "create a shallow clone of that depth"
 msgstr ""
 
-#: builtin/clone.c:95
+#: builtin/clone.c:96
 msgid "clone only one branch, HEAD or --branch"
 msgstr ""
 
-#: builtin/clone.c:96 builtin/init-db.c:492
+#: builtin/clone.c:97 builtin/init-db.c:494
 msgid "gitdir"
 msgstr ""
 
-#: builtin/clone.c:97 builtin/init-db.c:493
+#: builtin/clone.c:98 builtin/init-db.c:495
 msgid "separate git dir from working tree"
 msgstr ""
 
-#: builtin/clone.c:98
+#: builtin/clone.c:99
 msgid "key=value"
 msgstr ""
 
-#: builtin/clone.c:99
+#: builtin/clone.c:100
 msgid "set config inside the new repository"
 msgstr ""
 
-#: builtin/clone.c:252
+#: builtin/clone.c:253
 #, c-format
 msgid "reference repository '%s' is not a local repository."
 msgstr ""
 
-#: builtin/clone.c:256
+#: builtin/clone.c:257
 #, c-format
 msgid "reference repository '%s' is shallow"
 msgstr ""
 
-#: builtin/clone.c:259
+#: builtin/clone.c:260
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr ""
 
-#: builtin/clone.c:321
+#: builtin/clone.c:322
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr ""
 
-#: builtin/clone.c:323 builtin/diff.c:83
+#: builtin/clone.c:324 builtin/diff.c:84
 #, c-format
 msgid "failed to stat '%s'"
 msgstr ""
 
-#: builtin/clone.c:325
+#: builtin/clone.c:326
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr ""
 
-#: builtin/clone.c:339
+#: builtin/clone.c:340
 #, c-format
 msgid "failed to stat %s\n"
 msgstr ""
 
-#: builtin/clone.c:361
+#: builtin/clone.c:362
 #, c-format
 msgid "failed to create link '%s'"
 msgstr ""
 
-#: builtin/clone.c:365
+#: builtin/clone.c:366
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr ""
 
-#: builtin/clone.c:388 builtin/clone.c:565
+#: builtin/clone.c:389 builtin/clone.c:563
 #, c-format
 msgid "done.\n"
 msgstr ""
@@ -3693,25 +3810,25 @@
 "and retry the checkout with 'git checkout -f HEAD'\n"
 msgstr ""
 
-#: builtin/clone.c:480
+#: builtin/clone.c:478
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr ""
 
-#: builtin/clone.c:560
+#: builtin/clone.c:558
 #, c-format
 msgid "Checking connectivity... "
 msgstr ""
 
-#: builtin/clone.c:563
+#: builtin/clone.c:561
 msgid "remote did not send all necessary objects"
 msgstr ""
 
-#: builtin/clone.c:626
+#: builtin/clone.c:625
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 
-#: builtin/clone.c:657
+#: builtin/clone.c:656
 msgid "unable to checkout working tree"
 msgstr ""
 
@@ -3737,64 +3854,64 @@
 msgid "repository '%s' does not exist"
 msgstr ""
 
-#: builtin/clone.c:802
-msgid "--depth is ignored in local clones; use file:// instead."
-msgstr ""
-
-#: builtin/clone.c:805
-msgid "source repository is shallow, ignoring --local"
-msgstr ""
-
-#: builtin/clone.c:810
-msgid "--local is ignored"
-msgstr ""
-
-#: builtin/clone.c:814 builtin/fetch.c:1119
+#: builtin/clone.c:802 builtin/fetch.c:1155
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr ""
 
-#: builtin/clone.c:824
+#: builtin/clone.c:812
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr ""
 
-#: builtin/clone.c:834
+#: builtin/clone.c:822
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr ""
 
-#: builtin/clone.c:847 builtin/clone.c:859
+#: builtin/clone.c:835 builtin/clone.c:847
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr ""
 
-#: builtin/clone.c:850
+#: builtin/clone.c:838
 #, c-format
 msgid "could not create work tree dir '%s'."
 msgstr ""
 
-#: builtin/clone.c:869
+#: builtin/clone.c:857
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr ""
 
-#: builtin/clone.c:871
+#: builtin/clone.c:859
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr ""
 
-#: builtin/clone.c:906
+#: builtin/clone.c:895
+msgid "--depth is ignored in local clones; use file:// instead."
+msgstr ""
+
+#: builtin/clone.c:898
+msgid "source repository is shallow, ignoring --local"
+msgstr ""
+
+#: builtin/clone.c:903
+msgid "--local is ignored"
+msgstr ""
+
+#: builtin/clone.c:907
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr ""
 
-#: builtin/clone.c:957 builtin/clone.c:965
+#: builtin/clone.c:958 builtin/clone.c:966
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr ""
 
-#: builtin/clone.c:968
+#: builtin/clone.c:969
 msgid "You appear to have cloned an empty repository."
 msgstr ""
 
@@ -3830,15 +3947,30 @@
 msgid "--command must be the first argument"
 msgstr ""
 
-#: builtin/commit.c:36
+#: builtin/commit.c:37
 msgid "git commit [options] [--] <pathspec>..."
 msgstr ""
 
-#: builtin/commit.c:41
+#: builtin/commit.c:42
 msgid "git status [options] [--] <pathspec>..."
 msgstr ""
 
-#: builtin/commit.c:46
+#: builtin/commit.c:47
+msgid ""
+"Your name and email address were configured automatically based\n"
+"on your username and hostname. Please check that they are accurate.\n"
+"You can suppress this message by setting them explicitly. Run the\n"
+"following command and follow the instructions in your editor to edit\n"
+"your configuration file:\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"After doing this, you may fix the identity used for this commit with:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+msgstr ""
+
+#: builtin/commit.c:60
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -3852,14 +3984,14 @@
 "    git commit --amend --reset-author\n"
 msgstr ""
 
-#: builtin/commit.c:58
+#: builtin/commit.c:72
 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:63
+#: builtin/commit.c:77
 msgid ""
 "The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
 "If you wish to commit it anyway, use:\n"
@@ -3868,11 +4000,11 @@
 "\n"
 msgstr ""
 
-#: builtin/commit.c:70
+#: builtin/commit.c:84
 msgid "Otherwise, please use 'git reset'\n"
 msgstr ""
 
-#: builtin/commit.c:73
+#: builtin/commit.c:87
 msgid ""
 "If you wish to skip this commit, use:\n"
 "\n"
@@ -3882,93 +4014,117 @@
 "the remaining commits.\n"
 msgstr ""
 
-#: builtin/commit.c:288
+#: builtin/commit.c:302
 msgid "failed to unpack HEAD tree object"
 msgstr ""
 
-#: builtin/commit.c:330
+#: builtin/commit.c:342
 msgid "unable to create temporary index"
 msgstr ""
 
-#: builtin/commit.c:336
+#: builtin/commit.c:348
 msgid "interactive add failed"
 msgstr ""
 
-#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
+#: builtin/commit.c:359
+msgid "unable to write index file"
+msgstr ""
+
+#: builtin/commit.c:361
+msgid "unable to update temporary index"
+msgstr ""
+
+#: builtin/commit.c:363
+msgid "Failed to update main cache tree"
+msgstr ""
+
+#: builtin/commit.c:387 builtin/commit.c:412 builtin/commit.c:461
 msgid "unable to write new_index file"
 msgstr ""
 
-#: builtin/commit.c:421
+#: builtin/commit.c:443
 msgid "cannot do a partial commit during a merge."
 msgstr ""
 
-#: builtin/commit.c:423
+#: builtin/commit.c:445
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr ""
 
-#: builtin/commit.c:433
+#: builtin/commit.c:454
 msgid "cannot read the index"
 msgstr ""
 
-#: builtin/commit.c:453
+#: builtin/commit.c:473
 msgid "unable to write temporary index file"
 msgstr ""
 
-#: builtin/commit.c:544 builtin/commit.c:550
-#, c-format
-msgid "invalid commit: %s"
-msgstr ""
-
-#: builtin/commit.c:572
-msgid "malformed --author parameter"
-msgstr ""
-
 #: builtin/commit.c:592
 #, c-format
+msgid "commit '%s' lacks author header"
+msgstr ""
+
+#: builtin/commit.c:594
+#, c-format
+msgid "commit '%s' has malformed author line"
+msgstr ""
+
+#: builtin/commit.c:613
+msgid "malformed --author parameter"
+msgstr ""
+
+#: builtin/commit.c:621
+#, c-format
+msgid "invalid date format: %s"
+msgstr ""
+
+#: builtin/commit.c:642
+#, c-format
 msgid "Malformed ident string: '%s'"
 msgstr ""
 
-#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
+#: builtin/commit.c:675
+msgid ""
+"unable to select a comment character that is not used\n"
+"in the current commit message"
+msgstr ""
+
+#: builtin/commit.c:712 builtin/commit.c:745 builtin/commit.c:1120
 #, c-format
 msgid "could not lookup commit %s"
 msgstr ""
 
-#: builtin/commit.c:641 builtin/shortlog.c:273
+#: builtin/commit.c:724 builtin/shortlog.c:273
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr ""
 
-#: builtin/commit.c:643
+#: builtin/commit.c:726
 msgid "could not read log from standard input"
 msgstr ""
 
-#: builtin/commit.c:647
+#: builtin/commit.c:730
 #, c-format
 msgid "could not read log file '%s'"
 msgstr ""
 
-#: builtin/commit.c:654
-msgid "commit has empty message"
-msgstr ""
-
-#: builtin/commit.c:670
+#: builtin/commit.c:752
 msgid "could not read MERGE_MSG"
 msgstr ""
 
-#: builtin/commit.c:674
+#: builtin/commit.c:756
 msgid "could not read SQUASH_MSG"
 msgstr ""
 
-#: builtin/commit.c:678
+#: builtin/commit.c:760
 #, c-format
 msgid "could not read '%s'"
 msgstr ""
 
-#: builtin/commit.c:749
+#: builtin/commit.c:831
 msgid "could not write commit template"
 msgstr ""
 
-#: builtin/commit.c:764
+#: builtin/commit.c:849
 #, c-format
 msgid ""
 "\n"
@@ -3978,7 +4134,7 @@
 "and try again.\n"
 msgstr ""
 
-#: builtin/commit.c:769
+#: builtin/commit.c:854
 #, c-format
 msgid ""
 "\n"
@@ -3988,14 +4144,14 @@
 "and try again.\n"
 msgstr ""
 
-#: builtin/commit.c:782
+#: builtin/commit.c:867
 #, 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:789
+#: builtin/commit.c:874
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4003,354 +4159,351 @@
 "An empty message aborts the commit.\n"
 msgstr ""
 
-#: builtin/commit.c:802
+#: builtin/commit.c:888
 #, c-format
-msgid "%sAuthor:    %s"
+msgid "%sAuthor:    %.*s <%.*s>"
 msgstr ""
 
-#: builtin/commit.c:809
+#: builtin/commit.c:896
 #, c-format
-msgid "%sCommitter: %s"
+msgid "%sDate:      %s"
 msgstr ""
 
-#: builtin/commit.c:829
+#: builtin/commit.c:903
+#, c-format
+msgid "%sCommitter: %.*s <%.*s>"
+msgstr ""
+
+#: builtin/commit.c:921
 msgid "Cannot read index"
 msgstr ""
 
-#: builtin/commit.c:872
+#: builtin/commit.c:978
 msgid "Error building trees"
 msgstr ""
 
-#: builtin/commit.c:887 builtin/tag.c:391
+#: builtin/commit.c:993 builtin/tag.c:495
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr ""
 
-#: builtin/commit.c:989
+#: builtin/commit.c:1095
 #, c-format
 msgid "No existing author found with '%s'"
 msgstr ""
 
-#: builtin/commit.c:1004 builtin/commit.c:1244
+#: builtin/commit.c:1110 builtin/commit.c:1350
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr ""
 
-#: builtin/commit.c:1041
+#: builtin/commit.c:1147
 msgid "--long and -z are incompatible"
 msgstr ""
 
-#: builtin/commit.c:1071
+#: builtin/commit.c:1177
 msgid "Using both --reset-author and --author does not make sense"
 msgstr ""
 
-#: builtin/commit.c:1080
+#: builtin/commit.c:1186
 msgid "You have nothing to amend."
 msgstr ""
 
-#: builtin/commit.c:1083
+#: builtin/commit.c:1189
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr ""
 
-#: builtin/commit.c:1085
+#: builtin/commit.c:1191
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr ""
 
-#: builtin/commit.c:1088
+#: builtin/commit.c:1194
 msgid "Options --squash and --fixup cannot be used together"
 msgstr ""
 
-#: builtin/commit.c:1098
+#: builtin/commit.c:1204
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr ""
 
-#: builtin/commit.c:1100
+#: builtin/commit.c:1206
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr ""
 
-#: builtin/commit.c:1108
+#: builtin/commit.c:1214
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr ""
 
-#: builtin/commit.c:1125
+#: builtin/commit.c:1231
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 
-#: builtin/commit.c:1127
+#: builtin/commit.c:1233
 msgid "No paths with --include/--only does not make sense."
 msgstr ""
 
-#: builtin/commit.c:1129
+#: builtin/commit.c:1235
 msgid "Clever... amending the last one with dirty index."
 msgstr ""
 
-#: builtin/commit.c:1131
+#: builtin/commit.c:1237
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr ""
 
-#: builtin/commit.c:1143 builtin/tag.c:639
+#: builtin/commit.c:1249 builtin/tag.c:728
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr ""
 
-#: builtin/commit.c:1148
+#: builtin/commit.c:1254
 msgid "Paths with -a does not make sense."
 msgstr ""
 
-#: builtin/commit.c:1258 builtin/commit.c:1516
+#: builtin/commit.c:1364 builtin/commit.c:1644
 msgid "show status concisely"
 msgstr ""
 
-#: builtin/commit.c:1260 builtin/commit.c:1518
+#: builtin/commit.c:1366 builtin/commit.c:1646
 msgid "show branch information"
 msgstr ""
 
-#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
+#: builtin/commit.c:1368 builtin/commit.c:1648 builtin/push.c:500
 msgid "machine-readable output"
 msgstr ""
 
-#: builtin/commit.c:1265 builtin/commit.c:1522
+#: builtin/commit.c:1371 builtin/commit.c:1650
 msgid "show status in long format (default)"
 msgstr ""
 
-#: builtin/commit.c:1268 builtin/commit.c:1525
+#: builtin/commit.c:1374 builtin/commit.c:1653
 msgid "terminate entries with NUL"
 msgstr ""
 
-#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:514
+#: builtin/commit.c:1376 builtin/commit.c:1656 builtin/fast-export.c:980
+#: builtin/fast-export.c:983 builtin/tag.c:603
 msgid "mode"
 msgstr ""
 
-#: builtin/commit.c:1271 builtin/commit.c:1528
+#: builtin/commit.c:1377 builtin/commit.c:1656
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 
-#: builtin/commit.c:1274
+#: builtin/commit.c:1380
 msgid "show ignored files"
 msgstr ""
 
-#: builtin/commit.c:1275 parse-options.h:153
+#: builtin/commit.c:1381 parse-options.h:153
 msgid "when"
 msgstr ""
 
-#: builtin/commit.c:1276
+#: builtin/commit.c:1382
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
 msgstr ""
 
-#: builtin/commit.c:1278
+#: builtin/commit.c:1384
 msgid "list untracked files in columns"
 msgstr ""
 
-#: builtin/commit.c:1347
+#: builtin/commit.c:1471
 msgid "couldn't look up newly created commit"
 msgstr ""
 
-#: builtin/commit.c:1349
+#: builtin/commit.c:1473
 msgid "could not parse newly created commit"
 msgstr ""
 
-#: builtin/commit.c:1390
+#: builtin/commit.c:1518
 msgid "detached HEAD"
 msgstr ""
 
-#: builtin/commit.c:1392
+#: builtin/commit.c:1521
 msgid " (root-commit)"
 msgstr ""
 
-#: builtin/commit.c:1486
+#: builtin/commit.c:1614
 msgid "suppress summary after successful commit"
 msgstr ""
 
-#: builtin/commit.c:1487
+#: builtin/commit.c:1615
 msgid "show diff in commit message template"
 msgstr ""
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1617
 msgid "Commit message options"
 msgstr ""
 
-#: builtin/commit.c:1490 builtin/tag.c:512
+#: builtin/commit.c:1618 builtin/tag.c:601
 msgid "read message from file"
 msgstr ""
 
-#: builtin/commit.c:1491
+#: builtin/commit.c:1619
 msgid "author"
 msgstr ""
 
-#: builtin/commit.c:1491
+#: builtin/commit.c:1619
 msgid "override author for commit"
 msgstr ""
 
-#: builtin/commit.c:1492 builtin/gc.c:272
+#: builtin/commit.c:1620 builtin/gc.c:275
 msgid "date"
 msgstr ""
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1620
 msgid "override date for commit"
 msgstr ""
 
-#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
-#: builtin/notes.c:566 builtin/tag.c:510
+#: builtin/commit.c:1621 builtin/merge.c:217 builtin/notes.c:408
+#: builtin/notes.c:565 builtin/tag.c:599
 msgid "message"
 msgstr ""
 
-#: builtin/commit.c:1493
+#: builtin/commit.c:1621
 msgid "commit message"
 msgstr ""
 
-#: builtin/commit.c:1494
+#: builtin/commit.c:1622
 msgid "reuse and edit message from specified commit"
 msgstr ""
 
-#: builtin/commit.c:1495
+#: builtin/commit.c:1623
 msgid "reuse message from specified commit"
 msgstr ""
 
-#: builtin/commit.c:1496
+#: builtin/commit.c:1624
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 
-#: builtin/commit.c:1497
+#: builtin/commit.c:1625
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 
-#: builtin/commit.c:1498
+#: builtin/commit.c:1626
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr ""
 
-#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1627 builtin/log.c:1191 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr ""
 
-#: builtin/commit.c:1500
+#: builtin/commit.c:1628
 msgid "use specified template file"
 msgstr ""
 
-#: builtin/commit.c:1501
+#: builtin/commit.c:1629
 msgid "force edit of commit"
 msgstr ""
 
-#: builtin/commit.c:1502
+#: builtin/commit.c:1630
 msgid "default"
 msgstr ""
 
-#: builtin/commit.c:1502 builtin/tag.c:515
+#: builtin/commit.c:1630 builtin/tag.c:604
 msgid "how to strip spaces and #comments from message"
 msgstr ""
 
-#: builtin/commit.c:1503
+#: builtin/commit.c:1631
 msgid "include status in commit message template"
 msgstr ""
 
-#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
-#: builtin/tag.c:516
+#: builtin/commit.c:1632 builtin/merge.c:224 builtin/revert.c:92
+#: builtin/tag.c:605
 msgid "key-id"
 msgstr ""
 
-#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
+#: builtin/commit.c:1633 builtin/merge.c:225 builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr ""
 
-#: builtin/commit.c:1508
+#: builtin/commit.c:1636
 msgid "Commit contents options"
 msgstr ""
 
-#: builtin/commit.c:1509
+#: builtin/commit.c:1637
 msgid "commit all changed files"
 msgstr ""
 
-#: builtin/commit.c:1510
+#: builtin/commit.c:1638
 msgid "add specified files to index for commit"
 msgstr ""
 
-#: builtin/commit.c:1511
+#: builtin/commit.c:1639
 msgid "interactively add files"
 msgstr ""
 
-#: builtin/commit.c:1512
+#: builtin/commit.c:1640
 msgid "interactively add changes"
 msgstr ""
 
-#: builtin/commit.c:1513
+#: builtin/commit.c:1641
 msgid "commit only specified files"
 msgstr ""
 
-#: builtin/commit.c:1514
+#: builtin/commit.c:1642
 msgid "bypass pre-commit hook"
 msgstr ""
 
-#: builtin/commit.c:1515
+#: builtin/commit.c:1643
 msgid "show what would be committed"
 msgstr ""
 
-#: builtin/commit.c:1526
+#: builtin/commit.c:1654
 msgid "amend previous commit"
 msgstr ""
 
-#: builtin/commit.c:1527
+#: builtin/commit.c:1655
 msgid "bypass post-rewrite hook"
 msgstr ""
 
-#: builtin/commit.c:1532
+#: builtin/commit.c:1660
 msgid "ok to record an empty change"
 msgstr ""
 
-#: builtin/commit.c:1534
+#: builtin/commit.c:1662
 msgid "ok to record a change with an empty message"
 msgstr ""
 
-#: builtin/commit.c:1562
+#: builtin/commit.c:1691
 msgid "could not parse HEAD commit"
 msgstr ""
 
-#: builtin/commit.c:1601 builtin/merge.c:518
+#: builtin/commit.c:1730 builtin/merge.c:518
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr ""
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1737
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr ""
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1744
 msgid "could not read MERGE_MODE"
 msgstr ""
 
-#: builtin/commit.c:1634
+#: builtin/commit.c:1763
 #, c-format
 msgid "could not read commit message: %s"
 msgstr ""
 
-#: builtin/commit.c:1645
+#: builtin/commit.c:1774
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr ""
 
-#: builtin/commit.c:1650
+#: builtin/commit.c:1779
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr ""
 
-#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
+#: builtin/commit.c:1794 builtin/merge.c:850 builtin/merge.c:875
 msgid "failed to write commit object"
 msgstr ""
 
-#: builtin/commit.c:1686
-msgid "cannot lock HEAD ref"
-msgstr ""
-
-#: builtin/commit.c:1690
-msgid "cannot update HEAD ref"
-msgstr ""
-
-#: builtin/commit.c:1701
+#: builtin/commit.c:1827
 msgid ""
 "Repository has been updated, but unable to write\n"
-"new_index file. Check that disk is not full or quota is\n"
+"new_index file. Check that disk is not full and quota is\n"
 "not exceeded, and then \"git reset HEAD\" to recover."
 msgstr ""
 
@@ -4482,217 +4635,248 @@
 msgid "respect include directives on lookup"
 msgstr ""
 
-#: builtin/count-objects.c:82
+#: builtin/config.c:315
+msgid "unable to parse default color value"
+msgstr ""
+
+#: builtin/config.c:455
+#, c-format
+msgid ""
+"# This is Git's per-user configuration file.\n"
+"[core]\n"
+"# Please adapt and uncomment the following lines:\n"
+"#\tuser = %s\n"
+"#\temail = %s\n"
+msgstr ""
+
+#: builtin/config.c:590
+#, c-format
+msgid "cannot create configuration file %s"
+msgstr ""
+
+#: builtin/count-objects.c:55
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr ""
 
-#: builtin/count-objects.c:97
+#: builtin/count-objects.c:65
 msgid "print sizes in human readable format"
 msgstr ""
 
-#: builtin/describe.c:16
+#: builtin/describe.c:17
 msgid "git describe [options] <commit-ish>*"
 msgstr ""
 
-#: builtin/describe.c:17
+#: builtin/describe.c:18
 msgid "git describe [options] --dirty"
 msgstr ""
 
-#: builtin/describe.c:225
+#: builtin/describe.c:217
 #, c-format
 msgid "annotated tag %s not available"
 msgstr ""
 
-#: builtin/describe.c:229
+#: builtin/describe.c:221
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr ""
 
-#: builtin/describe.c:231
+#: builtin/describe.c:223
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr ""
 
-#: builtin/describe.c:258
+#: builtin/describe.c:250 builtin/log.c:452
 #, c-format
 msgid "Not a valid object name %s"
 msgstr ""
 
-#: builtin/describe.c:261
+#: builtin/describe.c:253
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr ""
 
-#: builtin/describe.c:278
+#: builtin/describe.c:270
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr ""
 
-#: builtin/describe.c:280
+#: builtin/describe.c:272
 #, c-format
 msgid "searching to describe %s\n"
 msgstr ""
 
-#: builtin/describe.c:327
+#: builtin/describe.c:319
 #, c-format
 msgid "finished search at %s\n"
 msgstr ""
 
-#: builtin/describe.c:354
+#: builtin/describe.c:346
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
 "However, there were unannotated tags: try --tags."
 msgstr ""
 
-#: builtin/describe.c:358
+#: builtin/describe.c:350
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
 "Try --always, or create some tags."
 msgstr ""
 
-#: builtin/describe.c:379
+#: builtin/describe.c:371
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr ""
 
-#: builtin/describe.c:382
+#: builtin/describe.c:374
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
 "gave up search at %s\n"
 msgstr ""
 
-#: builtin/describe.c:404
+#: builtin/describe.c:396
 msgid "find the tag that comes after the commit"
 msgstr ""
 
-#: builtin/describe.c:405
+#: builtin/describe.c:397
 msgid "debug search strategy on stderr"
 msgstr ""
 
-#: builtin/describe.c:406
+#: builtin/describe.c:398
 msgid "use any ref"
 msgstr ""
 
-#: builtin/describe.c:407
+#: builtin/describe.c:399
 msgid "use any tag, even unannotated"
 msgstr ""
 
-#: builtin/describe.c:408
+#: builtin/describe.c:400
 msgid "always use long format"
 msgstr ""
 
-#: builtin/describe.c:409
+#: builtin/describe.c:401
 msgid "only follow first parent"
 msgstr ""
 
-#: builtin/describe.c:412
+#: builtin/describe.c:404
 msgid "only output exact matches"
 msgstr ""
 
-#: builtin/describe.c:414
+#: builtin/describe.c:406
 msgid "consider <n> most recent tags (default: 10)"
 msgstr ""
 
-#: builtin/describe.c:416
+#: builtin/describe.c:408
 msgid "only consider tags matching <pattern>"
 msgstr ""
 
-#: builtin/describe.c:418 builtin/name-rev.c:321
+#: builtin/describe.c:410 builtin/name-rev.c:318
 msgid "show abbreviated commit object as fallback"
 msgstr ""
 
-#: builtin/describe.c:419
+#: builtin/describe.c:411
 msgid "mark"
 msgstr ""
 
-#: builtin/describe.c:420
+#: builtin/describe.c:412
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr ""
 
-#: builtin/describe.c:438
+#: builtin/describe.c:430
 msgid "--long is incompatible with --abbrev=0"
 msgstr ""
 
-#: builtin/describe.c:464
+#: builtin/describe.c:456
 msgid "No names found, cannot describe anything."
 msgstr ""
 
-#: builtin/describe.c:484
+#: builtin/describe.c:476
 msgid "--dirty is incompatible with commit-ishes"
 msgstr ""
 
-#: builtin/diff.c:85
+#: builtin/diff.c:86
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr ""
 
-#: builtin/diff.c:236
+#: builtin/diff.c:237
 #, c-format
 msgid "invalid option: %s"
 msgstr ""
 
-#: builtin/diff.c:357
+#: builtin/diff.c:358
 msgid "Not a git repository"
 msgstr ""
 
-#: builtin/diff.c:400
+#: builtin/diff.c:401
 #, c-format
 msgid "invalid object '%s' given."
 msgstr ""
 
-#: builtin/diff.c:409
+#: builtin/diff.c:410
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr ""
 
-#: builtin/diff.c:416
+#: builtin/diff.c:417
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr ""
 
-#: builtin/fast-export.c:22
+#: builtin/fast-export.c:24
 msgid "git fast-export [rev-list-opts]"
 msgstr ""
 
-#: builtin/fast-export.c:673
+#: builtin/fast-export.c:979
 msgid "show progress after <n> objects"
 msgstr ""
 
-#: builtin/fast-export.c:675
+#: builtin/fast-export.c:981
 msgid "select handling of signed tags"
 msgstr ""
 
-#: builtin/fast-export.c:678
+#: builtin/fast-export.c:984
 msgid "select handling of tags that tag filtered objects"
 msgstr ""
 
-#: builtin/fast-export.c:681
+#: builtin/fast-export.c:987
 msgid "Dump marks to this file"
 msgstr ""
 
-#: builtin/fast-export.c:683
+#: builtin/fast-export.c:989
 msgid "Import marks from this file"
 msgstr ""
 
-#: builtin/fast-export.c:685
+#: builtin/fast-export.c:991
 msgid "Fake a tagger when tags lack one"
 msgstr ""
 
-#: builtin/fast-export.c:687
+#: builtin/fast-export.c:993
 msgid "Output full tree for each commit"
 msgstr ""
 
-#: builtin/fast-export.c:689
+#: builtin/fast-export.c:995
 msgid "Use the done feature to terminate the stream"
 msgstr ""
 
-#: builtin/fast-export.c:690
+#: builtin/fast-export.c:996
 msgid "Skip output of blob data"
 msgstr ""
 
+#: builtin/fast-export.c:997
+msgid "refspec"
+msgstr ""
+
+#: builtin/fast-export.c:998
+msgid "Apply refspec to exported refs"
+msgstr ""
+
+#: builtin/fast-export.c:999
+msgid "anonymize output"
+msgstr ""
+
 #: builtin/fetch.c:20
 msgid "git fetch [<options>] [<repository> [<refspec>...]]"
 msgstr ""
@@ -4709,239 +4893,247 @@
 msgid "git fetch --all [<options>]"
 msgstr ""
 
-#: builtin/fetch.c:75
+#: builtin/fetch.c:90
 msgid "fetch from all remotes"
 msgstr ""
 
-#: builtin/fetch.c:77
+#: builtin/fetch.c:92
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr ""
 
-#: builtin/fetch.c:79
+#: builtin/fetch.c:94
 msgid "path to upload pack on remote end"
 msgstr ""
 
-#: builtin/fetch.c:80
+#: builtin/fetch.c:95
 msgid "force overwrite of local branch"
 msgstr ""
 
-#: builtin/fetch.c:82
+#: builtin/fetch.c:97
 msgid "fetch from multiple remotes"
 msgstr ""
 
-#: builtin/fetch.c:84
+#: builtin/fetch.c:99
 msgid "fetch all tags and associated objects"
 msgstr ""
 
-#: builtin/fetch.c:86
+#: builtin/fetch.c:101
 msgid "do not fetch all tags (--no-tags)"
 msgstr ""
 
-#: builtin/fetch.c:88
+#: builtin/fetch.c:103
 msgid "prune remote-tracking branches no longer on remote"
 msgstr ""
 
-#: builtin/fetch.c:89
+#: builtin/fetch.c:104
 msgid "on-demand"
 msgstr ""
 
-#: builtin/fetch.c:90
+#: builtin/fetch.c:105
 msgid "control recursive fetching of submodules"
 msgstr ""
 
-#: builtin/fetch.c:94
+#: builtin/fetch.c:109
 msgid "keep downloaded pack"
 msgstr ""
 
-#: builtin/fetch.c:96
+#: builtin/fetch.c:111
 msgid "allow updating of HEAD ref"
 msgstr ""
 
-#: builtin/fetch.c:99
+#: builtin/fetch.c:114
 msgid "deepen history of shallow clone"
 msgstr ""
 
-#: builtin/fetch.c:101
+#: builtin/fetch.c:116
 msgid "convert to a complete repository"
 msgstr ""
 
-#: builtin/fetch.c:103 builtin/log.c:1197
+#: builtin/fetch.c:118 builtin/log.c:1208
 msgid "dir"
 msgstr ""
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:119
 msgid "prepend this to submodule path output"
 msgstr ""
 
-#: builtin/fetch.c:107
+#: builtin/fetch.c:122
 msgid "default mode for recursion"
 msgstr ""
 
-#: builtin/fetch.c:109
+#: builtin/fetch.c:124
 msgid "accept refs that update .git/shallow"
 msgstr ""
 
-#: builtin/fetch.c:347
+#: builtin/fetch.c:125
+msgid "refmap"
+msgstr ""
+
+#: builtin/fetch.c:126
+msgid "specify fetch refmap"
+msgstr ""
+
+#: builtin/fetch.c:376
 msgid "Couldn't find remote ref HEAD"
 msgstr ""
 
-#: builtin/fetch.c:411
+#: builtin/fetch.c:454
 #, c-format
 msgid "object %s not found"
 msgstr ""
 
-#: builtin/fetch.c:416
+#: builtin/fetch.c:459
 msgid "[up to date]"
 msgstr ""
 
-#: builtin/fetch.c:430
+#: builtin/fetch.c:473
 #, c-format
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr ""
 
-#: builtin/fetch.c:431 builtin/fetch.c:517
+#: builtin/fetch.c:474 builtin/fetch.c:560
 msgid "[rejected]"
 msgstr ""
 
-#: builtin/fetch.c:442
+#: builtin/fetch.c:485
 msgid "[tag update]"
 msgstr ""
 
-#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497
+#: builtin/fetch.c:487 builtin/fetch.c:522 builtin/fetch.c:540
 msgid "  (unable to update local ref)"
 msgstr ""
 
-#: builtin/fetch.c:462
+#: builtin/fetch.c:505
 msgid "[new tag]"
 msgstr ""
 
-#: builtin/fetch.c:465
+#: builtin/fetch.c:508
 msgid "[new branch]"
 msgstr ""
 
-#: builtin/fetch.c:468
+#: builtin/fetch.c:511
 msgid "[new ref]"
 msgstr ""
 
-#: builtin/fetch.c:513
+#: builtin/fetch.c:556
 msgid "unable to update local ref"
 msgstr ""
 
-#: builtin/fetch.c:513
+#: builtin/fetch.c:556
 msgid "forced update"
 msgstr ""
 
-#: builtin/fetch.c:519
+#: builtin/fetch.c:562
 msgid "(non-fast-forward)"
 msgstr ""
 
-#: builtin/fetch.c:552 builtin/fetch.c:785
+#: builtin/fetch.c:595 builtin/fetch.c:828
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr ""
 
-#: builtin/fetch.c:561
+#: builtin/fetch.c:604
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr ""
 
-#: builtin/fetch.c:579
+#: builtin/fetch.c:622
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 
-#: builtin/fetch.c:667 builtin/fetch.c:750
+#: builtin/fetch.c:710 builtin/fetch.c:793
 #, c-format
 msgid "From %.*s\n"
 msgstr ""
 
-#: builtin/fetch.c:678
+#: builtin/fetch.c:721
 #, 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:730
+#: builtin/fetch.c:773
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr ""
 
-#: builtin/fetch.c:731
+#: builtin/fetch.c:774
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr ""
 
-#: builtin/fetch.c:755
+#: builtin/fetch.c:798
 msgid "[deleted]"
 msgstr ""
 
-#: builtin/fetch.c:756 builtin/remote.c:1050
+#: builtin/fetch.c:799 builtin/remote.c:1063
 msgid "(none)"
 msgstr ""
 
-#: builtin/fetch.c:775
+#: builtin/fetch.c:818
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr ""
 
-#: builtin/fetch.c:794
+#: builtin/fetch.c:837
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr ""
 
-#: builtin/fetch.c:797
+#: builtin/fetch.c:840
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr ""
 
-#: builtin/fetch.c:853
+#: builtin/fetch.c:896
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr ""
 
-#: builtin/fetch.c:1015
+#: builtin/fetch.c:1058
 #, c-format
 msgid "Fetching %s\n"
 msgstr ""
 
-#: builtin/fetch.c:1017 builtin/remote.c:90
+#: builtin/fetch.c:1060 builtin/remote.c:90
 #, c-format
 msgid "Could not fetch %s"
 msgstr ""
 
-#: builtin/fetch.c:1035
+#: builtin/fetch.c:1078
 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:1059
+#: builtin/fetch.c:1101
 msgid "You need to specify a tag name."
 msgstr ""
 
-#: builtin/fetch.c:1107
+#: builtin/fetch.c:1143
 msgid "--depth and --unshallow cannot be used together"
 msgstr ""
 
-#: builtin/fetch.c:1109
+#: builtin/fetch.c:1145
 msgid "--unshallow on a complete repository does not make sense"
 msgstr ""
 
-#: builtin/fetch.c:1132
+#: builtin/fetch.c:1168
 msgid "fetch --all does not take a repository argument"
 msgstr ""
 
-#: builtin/fetch.c:1134
+#: builtin/fetch.c:1170
 msgid "fetch --all does not make sense with refspecs"
 msgstr ""
 
-#: builtin/fetch.c:1145
+#: builtin/fetch.c:1181
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr ""
 
-#: builtin/fetch.c:1153
+#: builtin/fetch.c:1189
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr ""
 
@@ -4949,9 +5141,9 @@
 msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700
-#: builtin/merge.c:196 builtin/repack.c:175 builtin/repack.c:179
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:501
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:698
+#: builtin/merge.c:197 builtin/repack.c:179 builtin/repack.c:183
+#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:590
 #: parse-options.h:132 parse-options.h:239
 msgid "n"
 msgstr ""
@@ -4976,99 +5168,103 @@
 msgid "file to read from"
 msgstr ""
 
-#: builtin/for-each-ref.c:1063
+#: builtin/for-each-ref.c:676
+msgid "unable to parse format"
+msgstr ""
+
+#: builtin/for-each-ref.c:1057
 msgid "git for-each-ref [options] [<pattern>]"
 msgstr ""
 
-#: builtin/for-each-ref.c:1078
+#: builtin/for-each-ref.c:1072
 msgid "quote placeholders suitably for shells"
 msgstr ""
 
-#: builtin/for-each-ref.c:1080
+#: builtin/for-each-ref.c:1074
 msgid "quote placeholders suitably for perl"
 msgstr ""
 
-#: builtin/for-each-ref.c:1082
+#: builtin/for-each-ref.c:1076
 msgid "quote placeholders suitably for python"
 msgstr ""
 
-#: builtin/for-each-ref.c:1084
+#: builtin/for-each-ref.c:1078
 msgid "quote placeholders suitably for tcl"
 msgstr ""
 
-#: builtin/for-each-ref.c:1087
+#: builtin/for-each-ref.c:1081
 msgid "show only <n> matched refs"
 msgstr ""
 
-#: builtin/for-each-ref.c:1088 builtin/replace.c:177
+#: builtin/for-each-ref.c:1082 builtin/replace.c:438
 msgid "format"
 msgstr ""
 
-#: builtin/for-each-ref.c:1088
+#: builtin/for-each-ref.c:1082
 msgid "format to use for the output"
 msgstr ""
 
-#: builtin/for-each-ref.c:1089
+#: builtin/for-each-ref.c:1083
 msgid "key"
 msgstr ""
 
-#: builtin/for-each-ref.c:1090
+#: builtin/for-each-ref.c:1084
 msgid "field name to sort on"
 msgstr ""
 
-#: builtin/fsck.c:147 builtin/prune.c:172
+#: builtin/fsck.c:147 builtin/prune.c:136
 msgid "Checking connectivity"
 msgstr ""
 
-#: builtin/fsck.c:544
+#: builtin/fsck.c:540
 msgid "Checking object directories"
 msgstr ""
 
-#: builtin/fsck.c:607
+#: builtin/fsck.c:603
 msgid "git fsck [options] [<object>...]"
 msgstr ""
 
-#: builtin/fsck.c:613
+#: builtin/fsck.c:609
 msgid "show unreachable objects"
 msgstr ""
 
-#: builtin/fsck.c:614
+#: builtin/fsck.c:610
 msgid "show dangling objects"
 msgstr ""
 
-#: builtin/fsck.c:615
+#: builtin/fsck.c:611
 msgid "report tags"
 msgstr ""
 
-#: builtin/fsck.c:616
+#: builtin/fsck.c:612
 msgid "report root nodes"
 msgstr ""
 
-#: builtin/fsck.c:617
+#: builtin/fsck.c:613
 msgid "make index objects head nodes"
 msgstr ""
 
-#: builtin/fsck.c:618
+#: builtin/fsck.c:614
 msgid "make reflogs head nodes (default)"
 msgstr ""
 
-#: builtin/fsck.c:619
+#: builtin/fsck.c:615
 msgid "also consider packs and alternate objects"
 msgstr ""
 
-#: builtin/fsck.c:620
+#: builtin/fsck.c:616
 msgid "enable more strict checking"
 msgstr ""
 
-#: builtin/fsck.c:622
+#: builtin/fsck.c:618
 msgid "write dangling objects in .git/lost-found"
 msgstr ""
 
-#: builtin/fsck.c:623 builtin/prune.c:144
+#: builtin/fsck.c:619 builtin/prune.c:108
 msgid "show progress"
 msgstr ""
 
-#: builtin/fsck.c:673
+#: builtin/fsck.c:669
 msgid "Checking objects"
 msgstr ""
 
@@ -5076,54 +5272,54 @@
 msgid "git gc [options]"
 msgstr ""
 
-#: builtin/gc.c:90
+#: builtin/gc.c:79
 #, c-format
-msgid "Invalid %s: '%s'"
+msgid "Invalid gc.pruneexpire: '%s'"
 msgstr ""
 
-#: builtin/gc.c:117
+#: builtin/gc.c:107
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr ""
 
-#: builtin/gc.c:273
+#: builtin/gc.c:276
 msgid "prune unreferenced objects"
 msgstr ""
 
-#: builtin/gc.c:275
+#: builtin/gc.c:278
 msgid "be more thorough (increased runtime)"
 msgstr ""
 
-#: builtin/gc.c:276
+#: builtin/gc.c:279
 msgid "enable auto-gc mode"
 msgstr ""
 
-#: builtin/gc.c:277
+#: builtin/gc.c:280
 msgid "force running gc even if there may be another gc running"
 msgstr ""
 
-#: builtin/gc.c:318
-#, c-format
-msgid "Auto packing the repository in background for optimum performance.\n"
-msgstr ""
-
-#: builtin/gc.c:320
-#, c-format
-msgid "Auto packing the repository for optimum performance.\n"
-msgstr ""
-
 #: builtin/gc.c:321
 #, c-format
+msgid "Auto packing the repository in background for optimum performance.\n"
+msgstr ""
+
+#: builtin/gc.c:323
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
+msgstr ""
+
+#: builtin/gc.c:324
+#, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr ""
 
-#: builtin/gc.c:336
+#: builtin/gc.c:342
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
 msgstr ""
 
-#: builtin/gc.c:361
+#: builtin/gc.c:364
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -5137,258 +5333,258 @@
 msgid "grep: failed to create thread: %s"
 msgstr ""
 
-#: builtin/grep.c:365
-#, c-format
-msgid "Failed to chdir: %s"
-msgstr ""
-
-#: builtin/grep.c:443 builtin/grep.c:478
+#: builtin/grep.c:441 builtin/grep.c:476
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr ""
 
-#: builtin/grep.c:493
+#: builtin/grep.c:491
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr ""
 
-#: builtin/grep.c:549
+#: builtin/grep.c:547
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr ""
 
-#: builtin/grep.c:566
+#: builtin/grep.c:564
 #, c-format
 msgid "cannot open '%s'"
 msgstr ""
 
-#: builtin/grep.c:640
+#: builtin/grep.c:638
 msgid "search in index instead of in the work tree"
 msgstr ""
 
-#: builtin/grep.c:642
+#: builtin/grep.c:640
 msgid "find in contents not managed by git"
 msgstr ""
 
-#: builtin/grep.c:644
+#: builtin/grep.c:642
 msgid "search in both tracked and untracked files"
 msgstr ""
 
-#: builtin/grep.c:646
+#: builtin/grep.c:644
 msgid "search also in ignored files"
 msgstr ""
 
-#: builtin/grep.c:649
+#: builtin/grep.c:647
 msgid "show non-matching lines"
 msgstr ""
 
-#: builtin/grep.c:651
+#: builtin/grep.c:649
 msgid "case insensitive matching"
 msgstr ""
 
-#: builtin/grep.c:653
+#: builtin/grep.c:651
 msgid "match patterns only at word boundaries"
 msgstr ""
 
-#: builtin/grep.c:655
+#: builtin/grep.c:653
 msgid "process binary files as text"
 msgstr ""
 
-#: builtin/grep.c:657
+#: builtin/grep.c:655
 msgid "don't match patterns in binary files"
 msgstr ""
 
-#: builtin/grep.c:660
+#: builtin/grep.c:658
 msgid "process binary files with textconv filters"
 msgstr ""
 
-#: builtin/grep.c:662
+#: builtin/grep.c:660
 msgid "descend at most <depth> levels"
 msgstr ""
 
-#: builtin/grep.c:666
+#: builtin/grep.c:664
 msgid "use extended POSIX regular expressions"
 msgstr ""
 
-#: builtin/grep.c:669
+#: builtin/grep.c:667
 msgid "use basic POSIX regular expressions (default)"
 msgstr ""
 
-#: builtin/grep.c:672
+#: builtin/grep.c:670
 msgid "interpret patterns as fixed strings"
 msgstr ""
 
-#: builtin/grep.c:675
+#: builtin/grep.c:673
 msgid "use Perl-compatible regular expressions"
 msgstr ""
 
-#: builtin/grep.c:678
+#: builtin/grep.c:676
 msgid "show line numbers"
 msgstr ""
 
-#: builtin/grep.c:679
+#: builtin/grep.c:677
 msgid "don't show filenames"
 msgstr ""
 
-#: builtin/grep.c:680
+#: builtin/grep.c:678
 msgid "show filenames"
 msgstr ""
 
-#: builtin/grep.c:682
+#: builtin/grep.c:680
 msgid "show filenames relative to top directory"
 msgstr ""
 
-#: builtin/grep.c:684
+#: builtin/grep.c:682
 msgid "show only filenames instead of matching lines"
 msgstr ""
 
-#: builtin/grep.c:686
+#: builtin/grep.c:684
 msgid "synonym for --files-with-matches"
 msgstr ""
 
-#: builtin/grep.c:689
+#: builtin/grep.c:687
 msgid "show only the names of files without match"
 msgstr ""
 
-#: builtin/grep.c:691
+#: builtin/grep.c:689
 msgid "print NUL after filenames"
 msgstr ""
 
-#: builtin/grep.c:693
+#: builtin/grep.c:691
 msgid "show the number of matches instead of matching lines"
 msgstr ""
 
-#: builtin/grep.c:694
+#: builtin/grep.c:692
 msgid "highlight matches"
 msgstr ""
 
-#: builtin/grep.c:696
+#: builtin/grep.c:694
 msgid "print empty line between matches from different files"
 msgstr ""
 
-#: builtin/grep.c:698
+#: builtin/grep.c:696
 msgid "show filename only once above matches from same file"
 msgstr ""
 
-#: builtin/grep.c:701
+#: builtin/grep.c:699
 msgid "show <n> context lines before and after matches"
 msgstr ""
 
-#: builtin/grep.c:704
+#: builtin/grep.c:702
 msgid "show <n> context lines before matches"
 msgstr ""
 
-#: builtin/grep.c:706
+#: builtin/grep.c:704
 msgid "show <n> context lines after matches"
 msgstr ""
 
-#: builtin/grep.c:707
+#: builtin/grep.c:705
 msgid "shortcut for -C NUM"
 msgstr ""
 
-#: builtin/grep.c:710
+#: builtin/grep.c:708
 msgid "show a line with the function name before matches"
 msgstr ""
 
-#: builtin/grep.c:712
+#: builtin/grep.c:710
 msgid "show the surrounding function"
 msgstr ""
 
-#: builtin/grep.c:715
+#: builtin/grep.c:713
 msgid "read patterns from file"
 msgstr ""
 
-#: builtin/grep.c:717
+#: builtin/grep.c:715
 msgid "match <pattern>"
 msgstr ""
 
-#: builtin/grep.c:719
+#: builtin/grep.c:717
 msgid "combine patterns specified with -e"
 msgstr ""
 
-#: builtin/grep.c:731
+#: builtin/grep.c:729
 msgid "indicate hit with exit status without output"
 msgstr ""
 
-#: builtin/grep.c:733
+#: builtin/grep.c:731
 msgid "show only matches from files that match all patterns"
 msgstr ""
 
-#: builtin/grep.c:735
+#: builtin/grep.c:733
 msgid "show parse tree for grep expression"
 msgstr ""
 
-#: builtin/grep.c:739
+#: builtin/grep.c:737
 msgid "pager"
 msgstr ""
 
-#: builtin/grep.c:739
+#: builtin/grep.c:737
 msgid "show matching files in the pager"
 msgstr ""
 
-#: builtin/grep.c:742
+#: builtin/grep.c:740
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr ""
 
-#: builtin/grep.c:743 builtin/show-ref.c:187
+#: builtin/grep.c:741 builtin/show-ref.c:187
 msgid "show usage"
 msgstr ""
 
-#: builtin/grep.c:810
+#: builtin/grep.c:808
 msgid "no pattern given."
 msgstr ""
 
-#: builtin/grep.c:868
+#: builtin/grep.c:866
 msgid "--open-files-in-pager only works on the worktree"
 msgstr ""
 
-#: builtin/grep.c:891
+#: builtin/grep.c:892
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr ""
 
-#: builtin/grep.c:896
+#: builtin/grep.c:897
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr ""
 
-#: builtin/grep.c:899
+#: builtin/grep.c:900
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 
-#: builtin/grep.c:907
+#: builtin/grep.c:908
 msgid "both --cached and trees are given."
 msgstr ""
 
-#: builtin/hash-object.c:60
+#: builtin/hash-object.c:82
 msgid ""
 "git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] "
 "<file>..."
 msgstr ""
 
-#: builtin/hash-object.c:61
+#: builtin/hash-object.c:83
 msgid "git hash-object  --stdin-paths < <list-of-paths>"
 msgstr ""
 
-#: builtin/hash-object.c:72 builtin/tag.c:521
+#: builtin/hash-object.c:94 builtin/tag.c:610
 msgid "type"
 msgstr ""
 
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr ""
 
-#: builtin/hash-object.c:73
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr ""
 
-#: builtin/hash-object.c:74
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr ""
 
-#: builtin/hash-object.c:76
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr ""
 
-#: builtin/hash-object.c:77
+#: builtin/hash-object.c:100
+msgid ""
+"just hash any random garbage to create corrupt objects for debugging Git"
+msgstr ""
+
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr ""
 
@@ -5421,55 +5617,59 @@
 msgid "unrecognized help format '%s'"
 msgstr ""
 
-#: builtin/help.c:92
+#: builtin/help.c:91
 msgid "Failed to start emacsclient."
 msgstr ""
 
-#: builtin/help.c:105
+#: builtin/help.c:104
 msgid "Failed to parse emacsclient version."
 msgstr ""
 
-#: builtin/help.c:113
+#: builtin/help.c:112
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr ""
 
-#: builtin/help.c:131 builtin/help.c:159 builtin/help.c:168 builtin/help.c:176
+#: builtin/help.c:130 builtin/help.c:158 builtin/help.c:167 builtin/help.c:175
 #, c-format
 msgid "failed to exec '%s': %s"
 msgstr ""
 
-#: builtin/help.c:216
+#: builtin/help.c:215
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
 "Please consider using 'man.<tool>.cmd' instead."
 msgstr ""
 
-#: builtin/help.c:228
+#: builtin/help.c:227
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
 "Please consider using 'man.<tool>.path' instead."
 msgstr ""
 
-#: builtin/help.c:353
+#: builtin/help.c:352
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr ""
 
-#: builtin/help.c:370
+#: builtin/help.c:369
 msgid "no man viewer handled the request"
 msgstr ""
 
-#: builtin/help.c:378
+#: builtin/help.c:377
 msgid "no info viewer handled the request"
 msgstr ""
 
-#: builtin/help.c:424
+#: builtin/help.c:423
 msgid "Defining attributes per path"
 msgstr ""
 
+#: builtin/help.c:424
+msgid "Everyday Git With 20 Commands Or So"
+msgstr ""
+
 #: builtin/help.c:425
 msgid "A Git glossary"
 msgstr ""
@@ -5508,280 +5708,291 @@
 msgid "`git %s' is aliased to `%s'"
 msgstr ""
 
-#: builtin/index-pack.c:184
+#: builtin/index-pack.c:150
+#, c-format
+msgid "unable to open %s"
+msgstr ""
+
+#: builtin/index-pack.c:200
 #, c-format
 msgid "object type mismatch at %s"
 msgstr ""
 
-#: builtin/index-pack.c:204
-msgid "object of unexpected type"
+#: builtin/index-pack.c:220
+#, c-format
+msgid "did not receive expected object %s"
 msgstr ""
 
-#: builtin/index-pack.c:244
+#: builtin/index-pack.c:223
+#, c-format
+msgid "object %s: expected type %s, found %s"
+msgstr ""
+
+#: builtin/index-pack.c:265
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/index-pack.c:254
+#: builtin/index-pack.c:275
 msgid "early EOF"
 msgstr ""
 
-#: builtin/index-pack.c:255
+#: builtin/index-pack.c:276
 msgid "read error on input"
 msgstr ""
 
-#: builtin/index-pack.c:267
+#: builtin/index-pack.c:288
 msgid "used more bytes than were available"
 msgstr ""
 
-#: builtin/index-pack.c:274
-msgid "pack too large for current definition of off_t"
-msgstr ""
-
-#: builtin/index-pack.c:290
-#, c-format
-msgid "unable to create '%s'"
-msgstr ""
-
 #: builtin/index-pack.c:295
-#, c-format
-msgid "cannot open packfile '%s'"
-msgstr ""
-
-#: builtin/index-pack.c:309
-msgid "pack signature mismatch"
+msgid "pack too large for current definition of off_t"
 msgstr ""
 
 #: builtin/index-pack.c:311
 #, c-format
+msgid "unable to create '%s'"
+msgstr ""
+
+#: builtin/index-pack.c:316
+#, c-format
+msgid "cannot open packfile '%s'"
+msgstr ""
+
+#: builtin/index-pack.c:330
+msgid "pack signature mismatch"
+msgstr ""
+
+#: builtin/index-pack.c:332
+#, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr ""
 
-#: builtin/index-pack.c:329
+#: builtin/index-pack.c:350
 #, c-format
 msgid "pack has bad object at offset %lu: %s"
 msgstr ""
 
-#: builtin/index-pack.c:451
+#: builtin/index-pack.c:471
 #, c-format
 msgid "inflate returned %d"
 msgstr ""
 
-#: builtin/index-pack.c:500
+#: builtin/index-pack.c:520
 msgid "offset value overflow for delta base object"
 msgstr ""
 
-#: builtin/index-pack.c:508
+#: builtin/index-pack.c:528
 msgid "delta base offset is out of bound"
 msgstr ""
 
-#: builtin/index-pack.c:516
+#: builtin/index-pack.c:536
 #, c-format
 msgid "unknown object type %d"
 msgstr ""
 
-#: builtin/index-pack.c:547
+#: builtin/index-pack.c:567
 msgid "cannot pread pack file"
 msgstr ""
 
-#: builtin/index-pack.c:549
+#: builtin/index-pack.c:569
 #, c-format
 msgid "premature end of pack file, %lu byte missing"
 msgid_plural "premature end of pack file, %lu bytes missing"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/index-pack.c:575
+#: builtin/index-pack.c:595
 msgid "serious inflate inconsistency"
 msgstr ""
 
-#: builtin/index-pack.c:666 builtin/index-pack.c:672 builtin/index-pack.c:695
-#: builtin/index-pack.c:729 builtin/index-pack.c:738
+#: builtin/index-pack.c:686 builtin/index-pack.c:692 builtin/index-pack.c:715
+#: builtin/index-pack.c:749 builtin/index-pack.c:758
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr ""
 
-#: builtin/index-pack.c:669 builtin/pack-objects.c:162
-#: builtin/pack-objects.c:254
+#: builtin/index-pack.c:689 builtin/pack-objects.c:164
+#: builtin/pack-objects.c:256
 #, c-format
 msgid "unable to read %s"
 msgstr ""
 
-#: builtin/index-pack.c:735
+#: builtin/index-pack.c:755
 #, c-format
 msgid "cannot read existing object %s"
 msgstr ""
 
-#: builtin/index-pack.c:749
+#: builtin/index-pack.c:769
 #, c-format
 msgid "invalid blob object %s"
 msgstr ""
 
-#: builtin/index-pack.c:763
+#: builtin/index-pack.c:783
 #, c-format
 msgid "invalid %s"
 msgstr ""
 
-#: builtin/index-pack.c:766
+#: builtin/index-pack.c:787
 msgid "Error in object"
 msgstr ""
 
-#: builtin/index-pack.c:768
+#: builtin/index-pack.c:789
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr ""
 
-#: builtin/index-pack.c:839 builtin/index-pack.c:869
+#: builtin/index-pack.c:861 builtin/index-pack.c:890
 msgid "failed to apply delta"
 msgstr ""
 
-#: builtin/index-pack.c:1010
+#: builtin/index-pack.c:1055
 msgid "Receiving objects"
 msgstr ""
 
-#: builtin/index-pack.c:1010
+#: builtin/index-pack.c:1055
 msgid "Indexing objects"
 msgstr ""
 
-#: builtin/index-pack.c:1036
+#: builtin/index-pack.c:1081
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr ""
 
-#: builtin/index-pack.c:1041
+#: builtin/index-pack.c:1086
 msgid "cannot fstat packfile"
 msgstr ""
 
-#: builtin/index-pack.c:1044
+#: builtin/index-pack.c:1089
 msgid "pack has junk at the end"
 msgstr ""
 
-#: builtin/index-pack.c:1055
+#: builtin/index-pack.c:1100
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr ""
 
-#: builtin/index-pack.c:1078
+#: builtin/index-pack.c:1123
 msgid "Resolving deltas"
 msgstr ""
 
-#: builtin/index-pack.c:1088
+#: builtin/index-pack.c:1133
 #, c-format
 msgid "unable to create thread: %s"
 msgstr ""
 
-#: builtin/index-pack.c:1130
+#: builtin/index-pack.c:1175
 msgid "confusion beyond insanity"
 msgstr ""
 
-#: builtin/index-pack.c:1138
+#: builtin/index-pack.c:1181
 #, c-format
 msgid "completed with %d local objects"
 msgstr ""
 
-#: builtin/index-pack.c:1148
+#: builtin/index-pack.c:1191
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr ""
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1195
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/index-pack.c:1177
+#: builtin/index-pack.c:1220
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr ""
 
-#: builtin/index-pack.c:1256
+#: builtin/index-pack.c:1299
 #, c-format
 msgid "local object %s is corrupt"
 msgstr ""
 
-#: builtin/index-pack.c:1280
+#: builtin/index-pack.c:1323
 msgid "error while closing pack file"
 msgstr ""
 
-#: builtin/index-pack.c:1293
+#: builtin/index-pack.c:1336
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr ""
 
-#: builtin/index-pack.c:1301
+#: builtin/index-pack.c:1344
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr ""
 
-#: builtin/index-pack.c:1314
+#: builtin/index-pack.c:1357
 msgid "cannot store pack file"
 msgstr ""
 
-#: builtin/index-pack.c:1325
+#: builtin/index-pack.c:1368
 msgid "cannot store index file"
 msgstr ""
 
-#: builtin/index-pack.c:1358
+#: builtin/index-pack.c:1401
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr ""
 
-#: builtin/index-pack.c:1364
+#: builtin/index-pack.c:1407
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr ""
 
-#: builtin/index-pack.c:1368 builtin/index-pack.c:1546
+#: builtin/index-pack.c:1411 builtin/index-pack.c:1590
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr ""
 
-#: builtin/index-pack.c:1426
+#: builtin/index-pack.c:1469
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr ""
 
-#: builtin/index-pack.c:1428
+#: builtin/index-pack.c:1471
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr ""
 
-#: builtin/index-pack.c:1475
+#: builtin/index-pack.c:1518
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/index-pack.c:1482
+#: builtin/index-pack.c:1525
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/index-pack.c:1510
+#: builtin/index-pack.c:1554
 msgid "Cannot come back to cwd"
 msgstr ""
 
-#: builtin/index-pack.c:1558 builtin/index-pack.c:1561
-#: builtin/index-pack.c:1573 builtin/index-pack.c:1577
+#: builtin/index-pack.c:1602 builtin/index-pack.c:1605
+#: builtin/index-pack.c:1617 builtin/index-pack.c:1621
 #, c-format
 msgid "bad %s"
 msgstr ""
 
-#: builtin/index-pack.c:1591
+#: builtin/index-pack.c:1635
 msgid "--fix-thin cannot be used without --stdin"
 msgstr ""
 
-#: builtin/index-pack.c:1595 builtin/index-pack.c:1605
+#: builtin/index-pack.c:1639 builtin/index-pack.c:1648
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr ""
 
-#: builtin/index-pack.c:1614
+#: builtin/index-pack.c:1656
 msgid "--verify with no packfile name given"
 msgstr ""
 
@@ -5890,54 +6101,64 @@
 msgid " shared"
 msgstr ""
 
-#: builtin/init-db.c:439
-msgid "cannot tell cwd"
-msgstr ""
-
-#: builtin/init-db.c:465
+#: builtin/init-db.c:467
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [directory]"
 msgstr ""
 
-#: builtin/init-db.c:488
+#: builtin/init-db.c:490
 msgid "permissions"
 msgstr ""
 
-#: builtin/init-db.c:489
+#: builtin/init-db.c:491
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr ""
 
-#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
+#: builtin/init-db.c:493 builtin/prune-packed.c:57 builtin/repack.c:172
 msgid "be quiet"
 msgstr ""
 
-#: builtin/init-db.c:523 builtin/init-db.c:528
+#: builtin/init-db.c:525 builtin/init-db.c:530
 #, c-format
 msgid "cannot mkdir %s"
 msgstr ""
 
-#: builtin/init-db.c:532
+#: builtin/init-db.c:534
 #, c-format
 msgid "cannot chdir to %s"
 msgstr ""
 
-#: builtin/init-db.c:554
+#: builtin/init-db.c:555
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
 "dir=<directory>)"
 msgstr ""
 
-#: builtin/init-db.c:578
-msgid "Cannot access current working directory"
-msgstr ""
-
-#: builtin/init-db.c:585
+#: builtin/init-db.c:583
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr ""
 
+#: builtin/interpret-trailers.c:15
+msgid ""
+"git interpret-trailers [--trim-empty] [(--trailer <token>[(=|:)<value>])...] "
+"[<file>...]"
+msgstr ""
+
+#: 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:41
 msgid "git log [<options>] [<revision range>] [[--] <path>...]\n"
 msgstr ""
@@ -5946,33 +6167,47 @@
 msgid "   or: git show [options] <object>..."
 msgstr ""
 
-#: builtin/log.c:125
-msgid "suppress diff output"
-msgstr ""
-
-#: builtin/log.c:126
-msgid "show source"
+#: builtin/log.c:81
+#, c-format
+msgid "invalid --decorate option: %s"
 msgstr ""
 
 #: builtin/log.c:127
-msgid "Use mail map file"
+msgid "suppress diff output"
 msgstr ""
 
 #: builtin/log.c:128
+msgid "show source"
+msgstr ""
+
+#: builtin/log.c:129
+msgid "Use mail map file"
+msgstr ""
+
+#: builtin/log.c:130
 msgid "decorate options"
 msgstr ""
 
-#: builtin/log.c:231
+#: builtin/log.c:133
+msgid "Process line range n,m in file, counting from 1"
+msgstr ""
+
+#: builtin/log.c:229
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr ""
 
-#: builtin/log.c:473 builtin/log.c:565
+#: builtin/log.c:458
+#, c-format
+msgid "git show %s: bad file"
+msgstr ""
+
+#: builtin/log.c:472 builtin/log.c:564
 #, c-format
 msgid "Could not read object %s"
 msgstr ""
 
-#: builtin/log.c:589
+#: builtin/log.c:588
 #, c-format
 msgid "Unknown type: %d"
 msgstr ""
@@ -5981,217 +6216,226 @@
 msgid "format.headers without value"
 msgstr ""
 
-#: builtin/log.c:771
+#: builtin/log.c:773
 msgid "name of output directory is too long"
 msgstr ""
 
-#: builtin/log.c:787
+#: builtin/log.c:789
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr ""
 
-#: builtin/log.c:801
+#: builtin/log.c:803
 msgid "Need exactly one range."
 msgstr ""
 
-#: builtin/log.c:809
+#: builtin/log.c:811
 msgid "Not a range."
 msgstr ""
 
-#: builtin/log.c:911
+#: builtin/log.c:919
 msgid "Cover letter needs email format"
 msgstr ""
 
-#: builtin/log.c:987
+#: builtin/log.c:998
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr ""
 
-#: builtin/log.c:1015
+#: builtin/log.c:1026
 msgid "git format-patch [options] [<since> | <revision range>]"
 msgstr ""
 
-#: builtin/log.c:1060
+#: builtin/log.c:1071
 msgid "Two output directories?"
 msgstr ""
 
-#: builtin/log.c:1175
+#: builtin/log.c:1186
 msgid "use [PATCH n/m] even with a single patch"
 msgstr ""
 
-#: builtin/log.c:1178
+#: builtin/log.c:1189
 msgid "use [PATCH] even with multiple patches"
 msgstr ""
 
-#: builtin/log.c:1182
+#: builtin/log.c:1193
 msgid "print patches to standard out"
 msgstr ""
 
-#: builtin/log.c:1184
+#: builtin/log.c:1195
 msgid "generate a cover letter"
 msgstr ""
 
-#: builtin/log.c:1186
+#: builtin/log.c:1197
 msgid "use simple number sequence for output file names"
 msgstr ""
 
-#: builtin/log.c:1187
+#: builtin/log.c:1198
 msgid "sfx"
 msgstr ""
 
-#: builtin/log.c:1188
+#: builtin/log.c:1199
 msgid "use <sfx> instead of '.patch'"
 msgstr ""
 
-#: builtin/log.c:1190
+#: builtin/log.c:1201
 msgid "start numbering patches at <n> instead of 1"
 msgstr ""
 
-#: builtin/log.c:1192
+#: builtin/log.c:1203
 msgid "mark the series as Nth re-roll"
 msgstr ""
 
-#: builtin/log.c:1194
+#: builtin/log.c:1205
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr ""
 
-#: builtin/log.c:1197
+#: builtin/log.c:1208
 msgid "store resulting files in <dir>"
 msgstr ""
 
-#: builtin/log.c:1200
+#: builtin/log.c:1211
 msgid "don't strip/add [PATCH]"
 msgstr ""
 
-#: builtin/log.c:1203
+#: builtin/log.c:1214
 msgid "don't output binary diffs"
 msgstr ""
 
-#: builtin/log.c:1205
+#: builtin/log.c:1216
 msgid "don't include a patch matching a commit upstream"
 msgstr ""
 
-#: builtin/log.c:1207
+#: builtin/log.c:1218
 msgid "show patch format instead of default (patch + stat)"
 msgstr ""
 
-#: builtin/log.c:1209
+#: builtin/log.c:1220
 msgid "Messaging"
 msgstr ""
 
-#: builtin/log.c:1210
+#: builtin/log.c:1221
 msgid "header"
 msgstr ""
 
-#: builtin/log.c:1211
+#: builtin/log.c:1222
 msgid "add email header"
 msgstr ""
 
-#: builtin/log.c:1212 builtin/log.c:1214
+#: builtin/log.c:1223 builtin/log.c:1225
 msgid "email"
 msgstr ""
 
-#: builtin/log.c:1212
+#: builtin/log.c:1223
 msgid "add To: header"
 msgstr ""
 
-#: builtin/log.c:1214
+#: builtin/log.c:1225
 msgid "add Cc: header"
 msgstr ""
 
-#: builtin/log.c:1216
+#: builtin/log.c:1227
 msgid "ident"
 msgstr ""
 
-#: builtin/log.c:1217
+#: builtin/log.c:1228
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 
-#: builtin/log.c:1219
+#: builtin/log.c:1230
 msgid "message-id"
 msgstr ""
 
-#: builtin/log.c:1220
+#: builtin/log.c:1231
 msgid "make first mail a reply to <message-id>"
 msgstr ""
 
-#: builtin/log.c:1221 builtin/log.c:1224
+#: builtin/log.c:1232 builtin/log.c:1235
 msgid "boundary"
 msgstr ""
 
-#: builtin/log.c:1222
+#: builtin/log.c:1233
 msgid "attach the patch"
 msgstr ""
 
-#: builtin/log.c:1225
+#: builtin/log.c:1236
 msgid "inline the patch"
 msgstr ""
 
-#: builtin/log.c:1229
+#: builtin/log.c:1240
 msgid "enable message threading, styles: shallow, deep"
 msgstr ""
 
-#: builtin/log.c:1231
+#: builtin/log.c:1242
 msgid "signature"
 msgstr ""
 
-#: builtin/log.c:1232
+#: builtin/log.c:1243
 msgid "add a signature"
 msgstr ""
 
-#: builtin/log.c:1233
+#: builtin/log.c:1245
+msgid "add a signature from a file"
+msgstr ""
+
+#: builtin/log.c:1246
 msgid "don't print the patch filenames"
 msgstr ""
 
-#: builtin/log.c:1307
+#: builtin/log.c:1320
 #, c-format
 msgid "invalid ident line: %s"
 msgstr ""
 
-#: builtin/log.c:1322
+#: builtin/log.c:1335
 msgid "-n and -k are mutually exclusive."
 msgstr ""
 
-#: builtin/log.c:1324
+#: builtin/log.c:1337
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr ""
 
-#: builtin/log.c:1332
+#: builtin/log.c:1345
 msgid "--name-only does not make sense"
 msgstr ""
 
-#: builtin/log.c:1334
+#: builtin/log.c:1347
 msgid "--name-status does not make sense"
 msgstr ""
 
-#: builtin/log.c:1336
+#: builtin/log.c:1349
 msgid "--check does not make sense"
 msgstr ""
 
-#: builtin/log.c:1359
+#: builtin/log.c:1372
 msgid "standard output, or directory, which one?"
 msgstr ""
 
-#: builtin/log.c:1361
+#: builtin/log.c:1374
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr ""
 
-#: builtin/log.c:1509
+#: builtin/log.c:1472
+#, c-format
+msgid "unable to read signature file '%s'"
+msgstr ""
+
+#: builtin/log.c:1535
 msgid "Failed to create output files"
 msgstr ""
 
-#: builtin/log.c:1558
+#: builtin/log.c:1583
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr ""
 
-#: builtin/log.c:1613
+#: builtin/log.c:1638
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
 msgstr ""
 
-#: builtin/log.c:1626 builtin/log.c:1628 builtin/log.c:1640
+#: builtin/log.c:1651 builtin/log.c:1653 builtin/log.c:1665
 #, c-format
 msgid "Unknown commit %s"
 msgstr ""
@@ -6237,7 +6481,7 @@
 msgstr ""
 
 #: builtin/ls-files.c:477
-msgid "show 'other' directories' name only"
+msgid "show 'other' directories' names only"
 msgstr ""
 
 #: builtin/ls-files.c:480
@@ -6324,98 +6568,98 @@
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr ""
 
-#: builtin/merge.c:43
+#: builtin/merge.c:44
 msgid "git merge [options] [<commit>...]"
 msgstr ""
 
-#: builtin/merge.c:44
+#: builtin/merge.c:45
 msgid "git merge [options] <msg> HEAD <commit>"
 msgstr ""
 
-#: builtin/merge.c:45
+#: builtin/merge.c:46
 msgid "git merge --abort"
 msgstr ""
 
-#: builtin/merge.c:98
+#: builtin/merge.c:99
 msgid "switch `m' requires a value"
 msgstr ""
 
-#: builtin/merge.c:135
-#, c-format
-msgid "Could not find merge strategy '%s'.\n"
-msgstr ""
-
 #: builtin/merge.c:136
 #, c-format
+msgid "Could not find merge strategy '%s'.\n"
+msgstr ""
+
+#: builtin/merge.c:137
+#, c-format
 msgid "Available strategies are:"
 msgstr ""
 
-#: builtin/merge.c:141
+#: builtin/merge.c:142
 #, c-format
 msgid "Available custom strategies are:"
 msgstr ""
 
-#: builtin/merge.c:191
+#: builtin/merge.c:192
 msgid "do not show a diffstat at the end of the merge"
 msgstr ""
 
-#: builtin/merge.c:194
+#: builtin/merge.c:195
 msgid "show a diffstat at the end of the merge"
 msgstr ""
 
-#: builtin/merge.c:195
+#: builtin/merge.c:196
 msgid "(synonym to --stat)"
 msgstr ""
 
-#: builtin/merge.c:197
+#: builtin/merge.c:198
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 
-#: builtin/merge.c:200
+#: builtin/merge.c:201
 msgid "create a single commit instead of doing a merge"
 msgstr ""
 
-#: builtin/merge.c:202
+#: builtin/merge.c:203
 msgid "perform a commit if the merge succeeds (default)"
 msgstr ""
 
-#: builtin/merge.c:204
+#: builtin/merge.c:205
 msgid "edit message before committing"
 msgstr ""
 
-#: builtin/merge.c:205
+#: builtin/merge.c:206
 msgid "allow fast-forward (default)"
 msgstr ""
 
-#: builtin/merge.c:207
+#: builtin/merge.c:208
 msgid "abort if fast-forward is not possible"
 msgstr ""
 
-#: builtin/merge.c:211
+#: builtin/merge.c:212
 msgid "Verify that the named commit has a valid GPG signature"
 msgstr ""
 
-#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
+#: builtin/merge.c:213 builtin/notes.c:741 builtin/revert.c:89
 msgid "strategy"
 msgstr ""
 
-#: builtin/merge.c:213
+#: builtin/merge.c:214
 msgid "merge strategy to use"
 msgstr ""
 
-#: builtin/merge.c:214
+#: builtin/merge.c:215
 msgid "option=value"
 msgstr ""
 
-#: builtin/merge.c:215
+#: builtin/merge.c:216
 msgid "option for selected merge strategy"
 msgstr ""
 
-#: builtin/merge.c:217
+#: builtin/merge.c:218
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr ""
 
-#: builtin/merge.c:221
+#: builtin/merge.c:222
 msgid "abort the current in-progress merge"
 msgstr ""
 
@@ -6472,31 +6716,31 @@
 msgid "git write-tree failed to write a tree"
 msgstr ""
 
-#: builtin/merge.c:681
+#: builtin/merge.c:677
 msgid "Not handling anything other than two heads merge."
 msgstr ""
 
-#: builtin/merge.c:695
+#: builtin/merge.c:691
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr ""
 
-#: builtin/merge.c:709
+#: builtin/merge.c:704
 #, c-format
 msgid "unable to write %s"
 msgstr ""
 
-#: builtin/merge.c:798
+#: builtin/merge.c:793
 #, c-format
 msgid "Could not read from '%s'"
 msgstr ""
 
-#: builtin/merge.c:807
+#: builtin/merge.c:802
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 
-#: builtin/merge.c:813
+#: builtin/merge.c:808
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -6506,156 +6750,156 @@
 "the commit.\n"
 msgstr ""
 
-#: builtin/merge.c:837
+#: builtin/merge.c:832
 msgid "Empty commit message."
 msgstr ""
 
-#: builtin/merge.c:849
+#: builtin/merge.c:844
 #, c-format
 msgid "Wonderful.\n"
 msgstr ""
 
-#: builtin/merge.c:914
+#: builtin/merge.c:907
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 
-#: builtin/merge.c:930
+#: builtin/merge.c:923
 #, c-format
 msgid "'%s' is not a commit"
 msgstr ""
 
-#: builtin/merge.c:971
+#: builtin/merge.c:964
 msgid "No current branch."
 msgstr ""
 
-#: builtin/merge.c:973
+#: builtin/merge.c:966
 msgid "No remote for the current branch."
 msgstr ""
 
-#: builtin/merge.c:975
+#: builtin/merge.c:968
 msgid "No default upstream defined for the current branch."
 msgstr ""
 
-#: builtin/merge.c:980
+#: builtin/merge.c:973
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr ""
 
-#: builtin/merge.c:1136
+#: builtin/merge.c:1129
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr ""
 
-#: builtin/merge.c:1152 git-pull.sh:31
+#: builtin/merge.c:1145
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
-"Please, commit your changes before you can merge."
+"Please, commit your changes before you merge."
 msgstr ""
 
-#: builtin/merge.c:1155 git-pull.sh:34
+#: builtin/merge.c:1148 git-pull.sh:34
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr ""
 
-#: builtin/merge.c:1159
+#: builtin/merge.c:1152
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
-"Please, commit your changes before you can merge."
+"Please, commit your changes before you merge."
 msgstr ""
 
-#: builtin/merge.c:1162
+#: builtin/merge.c:1155
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr ""
 
-#: builtin/merge.c:1171
+#: builtin/merge.c:1164
 msgid "You cannot combine --squash with --no-ff."
 msgstr ""
 
-#: builtin/merge.c:1180
+#: builtin/merge.c:1173
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr ""
 
-#: builtin/merge.c:1212
+#: builtin/merge.c:1205
 msgid "Can merge only exactly one commit into empty head"
 msgstr ""
 
-#: builtin/merge.c:1215
+#: builtin/merge.c:1208
 msgid "Squash commit into empty head not supported yet"
 msgstr ""
 
-#: builtin/merge.c:1217
+#: builtin/merge.c:1210
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
 
-#: builtin/merge.c:1222
+#: builtin/merge.c:1215
 #, c-format
 msgid "%s - not something we can merge"
 msgstr ""
 
-#: builtin/merge.c:1273
+#: builtin/merge.c:1266
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 
-#: builtin/merge.c:1276
+#: builtin/merge.c:1269
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr ""
 
-#: builtin/merge.c:1279
+#: builtin/merge.c:1272
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr ""
 
-#: builtin/merge.c:1282
+#: builtin/merge.c:1275
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr ""
 
-#: builtin/merge.c:1366
+#: builtin/merge.c:1356
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr ""
 
-#: builtin/merge.c:1405
+#: builtin/merge.c:1395
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr ""
 
-#: builtin/merge.c:1412
+#: builtin/merge.c:1402
 #, c-format
 msgid "Nope.\n"
 msgstr ""
 
-#: builtin/merge.c:1444
+#: builtin/merge.c:1434
 msgid "Not possible to fast-forward, aborting."
 msgstr ""
 
-#: builtin/merge.c:1467 builtin/merge.c:1546
+#: builtin/merge.c:1457 builtin/merge.c:1536
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr ""
 
-#: builtin/merge.c:1471
+#: builtin/merge.c:1461
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr ""
 
-#: builtin/merge.c:1537
+#: builtin/merge.c:1527
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr ""
 
-#: builtin/merge.c:1539
+#: builtin/merge.c:1529
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr ""
 
-#: builtin/merge.c:1548
+#: builtin/merge.c:1538
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr ""
 
-#: builtin/merge.c:1560
+#: builtin/merge.c:1550
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -6758,75 +7002,80 @@
 msgid "git mv [options] <source>... <destination>"
 msgstr ""
 
+#: builtin/mv.c:69
+#, c-format
+msgid "Directory %s is in index and no submodule?"
+msgstr ""
+
 #: builtin/mv.c:71
+msgid "Please stage your changes to .gitmodules or stash them to proceed"
+msgstr ""
+
+#: builtin/mv.c:89
+#, c-format
+msgid "%.*s is in index"
+msgstr ""
+
+#: builtin/mv.c:111
 msgid "force move/rename even if target exists"
 msgstr ""
 
-#: builtin/mv.c:72
+#: builtin/mv.c:112
 msgid "skip move/rename errors"
 msgstr ""
 
-#: builtin/mv.c:122
+#: builtin/mv.c:151
+#, c-format
+msgid "destination '%s' is not a directory"
+msgstr ""
+
+#: builtin/mv.c:162
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr ""
 
-#: builtin/mv.c:126
+#: builtin/mv.c:166
 msgid "bad source"
 msgstr ""
 
-#: builtin/mv.c:129
+#: builtin/mv.c:169
 msgid "can not move directory into itself"
 msgstr ""
 
-#: builtin/mv.c:132
+#: builtin/mv.c:172
 msgid "cannot move directory over file"
 msgstr ""
 
-#: builtin/mv.c:138
-#, c-format
-msgid "Huh? Directory %s is in index and no submodule?"
-msgstr ""
-
-#: builtin/mv.c:140 builtin/rm.c:318
-msgid "Please, stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-
-#: builtin/mv.c:156
-#, c-format
-msgid "Huh? %.*s is in index?"
-msgstr ""
-
-#: builtin/mv.c:169
+#: builtin/mv.c:181
 msgid "source directory is empty"
 msgstr ""
 
-#: builtin/mv.c:205
+#: builtin/mv.c:206
 msgid "not under version control"
 msgstr ""
 
-#: builtin/mv.c:207
+#: builtin/mv.c:209
 msgid "destination exists"
 msgstr ""
 
-#: builtin/mv.c:215
+#: builtin/mv.c:217
 #, c-format
 msgid "overwriting '%s'"
 msgstr ""
 
-#: builtin/mv.c:218
+#: builtin/mv.c:220
 msgid "Cannot overwrite"
 msgstr ""
 
-#: builtin/mv.c:221
+#: builtin/mv.c:223
 msgid "multiple sources for the same target"
 msgstr ""
 
-#: builtin/mv.c:223
+#: builtin/mv.c:225
 msgid "destination directory does not exist"
 msgstr ""
 
-#: builtin/mv.c:243
+#: builtin/mv.c:232
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr ""
@@ -6836,48 +7085,48 @@
 msgid "Renaming %s to %s\n"
 msgstr ""
 
-#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:358
 #, c-format
 msgid "renaming '%s' failed"
 msgstr ""
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:255
 msgid "git name-rev [options] <commit>..."
 msgstr ""
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:256
 msgid "git name-rev [options] --all"
 msgstr ""
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:257
 msgid "git name-rev [options] --stdin"
 msgstr ""
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:309
 msgid "print only names (no SHA-1)"
 msgstr ""
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:310
 msgid "only use tags to name the commits"
 msgstr ""
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:312
 msgid "only use refs matching <pattern>"
 msgstr ""
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:314
 msgid "list all commits reachable from all refs"
 msgstr ""
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:315
 msgid "read from stdin"
 msgstr ""
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:316
 msgid "allow to print `undefined` names (default)"
 msgstr ""
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:322
 msgid "dereference tags in the input (internal use)"
 msgstr ""
 
@@ -6986,390 +7235,394 @@
 msgid "git notes get-ref"
 msgstr ""
 
-#: builtin/notes.c:137
+#: builtin/notes.c:136
 #, c-format
 msgid "unable to start 'show' for object '%s'"
 msgstr ""
 
-#: builtin/notes.c:141
+#: builtin/notes.c:140
 msgid "could not read 'show' output"
 msgstr ""
 
-#: builtin/notes.c:149
+#: builtin/notes.c:148
 #, c-format
 msgid "failed to finish 'show' for object '%s'"
 msgstr ""
 
-#: builtin/notes.c:167 builtin/tag.c:373
+#: builtin/notes.c:166 builtin/tag.c:477
 #, c-format
 msgid "could not create file '%s'"
 msgstr ""
 
-#: builtin/notes.c:186
+#: builtin/notes.c:185
 msgid "Please supply the note contents using either -m or -F option"
 msgstr ""
 
-#: builtin/notes.c:207 builtin/notes.c:848
+#: builtin/notes.c:206 builtin/notes.c:847
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr ""
 
-#: builtin/notes.c:212
+#: builtin/notes.c:211
 msgid "unable to write note object"
 msgstr ""
 
-#: builtin/notes.c:214
+#: builtin/notes.c:213
 #, c-format
-msgid "The note contents has been left in %s"
+msgid "The note contents have been left in %s"
 msgstr ""
 
-#: builtin/notes.c:248 builtin/tag.c:604
+#: builtin/notes.c:247 builtin/tag.c:693
 #, c-format
 msgid "cannot read '%s'"
 msgstr ""
 
-#: builtin/notes.c:250 builtin/tag.c:607
+#: builtin/notes.c:249 builtin/tag.c:696
 #, c-format
 msgid "could not open or read '%s'"
 msgstr ""
 
-#: builtin/notes.c:269 builtin/notes.c:320 builtin/notes.c:322
-#: builtin/notes.c:382 builtin/notes.c:436 builtin/notes.c:519
-#: builtin/notes.c:524 builtin/notes.c:599 builtin/notes.c:641
-#: builtin/notes.c:843 builtin/tag.c:620
+#: builtin/notes.c:268 builtin/notes.c:319 builtin/notes.c:321
+#: builtin/notes.c:381 builtin/notes.c:435 builtin/notes.c:518
+#: builtin/notes.c:523 builtin/notes.c:598 builtin/notes.c:640
+#: builtin/notes.c:842 builtin/tag.c:709
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr ""
 
-#: builtin/notes.c:272
+#: builtin/notes.c:271
 #, c-format
 msgid "Failed to read object '%s'."
 msgstr ""
 
-#: builtin/notes.c:276
+#: builtin/notes.c:275
 #, c-format
 msgid "Cannot read note data from non-blob object '%s'."
 msgstr ""
 
-#: builtin/notes.c:316
+#: builtin/notes.c:315
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr ""
 
-#: builtin/notes.c:331
+#: builtin/notes.c:330
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr ""
 
-#: builtin/notes.c:375 builtin/notes.c:429 builtin/notes.c:502
-#: builtin/notes.c:514 builtin/notes.c:587 builtin/notes.c:634
-#: builtin/notes.c:908
+#: builtin/notes.c:374 builtin/notes.c:428 builtin/notes.c:501
+#: builtin/notes.c:513 builtin/notes.c:586 builtin/notes.c:633
+#: builtin/notes.c:907
 msgid "too many parameters"
 msgstr ""
 
-#: builtin/notes.c:388 builtin/notes.c:647
+#: builtin/notes.c:387 builtin/notes.c:646
 #, c-format
 msgid "No note found for object %s."
 msgstr ""
 
-#: builtin/notes.c:410 builtin/notes.c:567
+#: builtin/notes.c:409 builtin/notes.c:566
 msgid "note contents as a string"
 msgstr ""
 
-#: builtin/notes.c:413 builtin/notes.c:570
+#: builtin/notes.c:412 builtin/notes.c:569
 msgid "note contents in a file"
 msgstr ""
 
-#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
-#: builtin/notes.c:575 builtin/tag.c:539
+#: builtin/notes.c:414 builtin/notes.c:417 builtin/notes.c:571
+#: builtin/notes.c:574 builtin/tag.c:628
 msgid "object"
 msgstr ""
 
-#: builtin/notes.c:416 builtin/notes.c:573
+#: builtin/notes.c:415 builtin/notes.c:572
 msgid "reuse and edit specified note object"
 msgstr ""
 
-#: builtin/notes.c:419 builtin/notes.c:576
+#: builtin/notes.c:418 builtin/notes.c:575
 msgid "reuse specified note object"
 msgstr ""
 
-#: builtin/notes.c:421 builtin/notes.c:489
+#: builtin/notes.c:420 builtin/notes.c:488
 msgid "replace existing notes"
 msgstr ""
 
-#: builtin/notes.c:455
+#: builtin/notes.c:454
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr ""
 
-#: builtin/notes.c:460 builtin/notes.c:537
+#: builtin/notes.c:459 builtin/notes.c:536
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr ""
 
-#: builtin/notes.c:490
+#: builtin/notes.c:489
 msgid "read objects from stdin"
 msgstr ""
 
-#: builtin/notes.c:492
+#: builtin/notes.c:491
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr ""
 
-#: builtin/notes.c:510
+#: builtin/notes.c:509
 msgid "too few parameters"
 msgstr ""
 
-#: builtin/notes.c:531
+#: builtin/notes.c:530
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr ""
 
-#: builtin/notes.c:543
+#: builtin/notes.c:542
 #, c-format
 msgid "Missing notes on source object %s. Cannot copy."
 msgstr ""
 
-#: builtin/notes.c:592
+#: builtin/notes.c:591
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
 "Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
 msgstr ""
 
-#: builtin/notes.c:739
+#: builtin/notes.c:738
 msgid "General options"
 msgstr ""
 
-#: builtin/notes.c:741
+#: builtin/notes.c:740
 msgid "Merge options"
 msgstr ""
 
-#: builtin/notes.c:743
+#: builtin/notes.c:742
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
 msgstr ""
 
-#: builtin/notes.c:745
+#: builtin/notes.c:744
 msgid "Committing unmerged notes"
 msgstr ""
 
-#: builtin/notes.c:747
+#: builtin/notes.c:746
 msgid "finalize notes merge by committing unmerged notes"
 msgstr ""
 
-#: builtin/notes.c:749
+#: builtin/notes.c:748
 msgid "Aborting notes merge resolution"
 msgstr ""
 
-#: builtin/notes.c:751
+#: builtin/notes.c:750
 msgid "abort notes merge"
 msgstr ""
 
-#: builtin/notes.c:846
+#: builtin/notes.c:845
 #, c-format
 msgid "Object %s has no note\n"
 msgstr ""
 
-#: builtin/notes.c:858
+#: builtin/notes.c:857
 msgid "attempt to remove non-existent note is not an error"
 msgstr ""
 
-#: builtin/notes.c:861
+#: builtin/notes.c:860
 msgid "read object names from the standard input"
 msgstr ""
 
-#: builtin/notes.c:942
+#: builtin/notes.c:941
 msgid "notes-ref"
 msgstr ""
 
-#: builtin/notes.c:943
+#: builtin/notes.c:942
 msgid "use notes from <notes_ref>"
 msgstr ""
 
-#: builtin/notes.c:978 builtin/remote.c:1593
+#: builtin/notes.c:977 builtin/remote.c:1624
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr ""
 
-#: builtin/pack-objects.c:25
+#: builtin/pack-objects.c:28
 msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
 msgstr ""
 
-#: builtin/pack-objects.c:26
+#: builtin/pack-objects.c:29
 msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
 msgstr ""
 
-#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
+#: builtin/pack-objects.c:177 builtin/pack-objects.c:180
 #, c-format
 msgid "deflate error (%d)"
 msgstr ""
 
-#: builtin/pack-objects.c:771
+#: builtin/pack-objects.c:773
 msgid "Writing objects"
 msgstr ""
 
-#: builtin/pack-objects.c:1012
+#: builtin/pack-objects.c:1015
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
 
-#: builtin/pack-objects.c:2174
+#: builtin/pack-objects.c:2175
 msgid "Compressing objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2530
+#: builtin/pack-objects.c:2572
 #, c-format
 msgid "unsupported index version %s"
 msgstr ""
 
-#: builtin/pack-objects.c:2534
+#: builtin/pack-objects.c:2576
 #, c-format
 msgid "bad index version '%s'"
 msgstr ""
 
-#: builtin/pack-objects.c:2557
+#: builtin/pack-objects.c:2599
 #, c-format
 msgid "option %s does not accept negative form"
 msgstr ""
 
-#: builtin/pack-objects.c:2561
+#: builtin/pack-objects.c:2603
 #, c-format
 msgid "unable to parse value '%s' for option %s"
 msgstr ""
 
-#: builtin/pack-objects.c:2580
+#: builtin/pack-objects.c:2622
 msgid "do not show progress meter"
 msgstr ""
 
-#: builtin/pack-objects.c:2582
+#: builtin/pack-objects.c:2624
 msgid "show progress meter"
 msgstr ""
 
-#: builtin/pack-objects.c:2584
+#: builtin/pack-objects.c:2626
 msgid "show progress meter during object writing phase"
 msgstr ""
 
-#: builtin/pack-objects.c:2587
+#: builtin/pack-objects.c:2629
 msgid "similar to --all-progress when progress meter is shown"
 msgstr ""
 
-#: builtin/pack-objects.c:2588
+#: builtin/pack-objects.c:2630
 msgid "version[,offset]"
 msgstr ""
 
-#: builtin/pack-objects.c:2589
+#: builtin/pack-objects.c:2631
 msgid "write the pack index file in the specified idx format version"
 msgstr ""
 
-#: builtin/pack-objects.c:2592
+#: builtin/pack-objects.c:2634
 msgid "maximum size of each output pack file"
 msgstr ""
 
-#: builtin/pack-objects.c:2594
+#: builtin/pack-objects.c:2636
 msgid "ignore borrowed objects from alternate object store"
 msgstr ""
 
-#: builtin/pack-objects.c:2596
+#: builtin/pack-objects.c:2638
 msgid "ignore packed objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2598
+#: builtin/pack-objects.c:2640
 msgid "limit pack window by objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2600
+#: builtin/pack-objects.c:2642
 msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 
-#: builtin/pack-objects.c:2602
+#: builtin/pack-objects.c:2644
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr ""
 
-#: builtin/pack-objects.c:2604
+#: builtin/pack-objects.c:2646
 msgid "reuse existing deltas"
 msgstr ""
 
-#: builtin/pack-objects.c:2606
+#: builtin/pack-objects.c:2648
 msgid "reuse existing objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2608
+#: builtin/pack-objects.c:2650
 msgid "use OFS_DELTA objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2610
+#: builtin/pack-objects.c:2652
 msgid "use threads when searching for best delta matches"
 msgstr ""
 
-#: builtin/pack-objects.c:2612
+#: builtin/pack-objects.c:2654
 msgid "do not create an empty pack output"
 msgstr ""
 
-#: builtin/pack-objects.c:2614
+#: builtin/pack-objects.c:2656
 msgid "read revision arguments from standard input"
 msgstr ""
 
-#: builtin/pack-objects.c:2616
+#: builtin/pack-objects.c:2658
 msgid "limit the objects to those that are not yet packed"
 msgstr ""
 
-#: builtin/pack-objects.c:2619
+#: builtin/pack-objects.c:2661
 msgid "include objects reachable from any reference"
 msgstr ""
 
-#: builtin/pack-objects.c:2622
+#: builtin/pack-objects.c:2664
 msgid "include objects referred by reflog entries"
 msgstr ""
 
-#: builtin/pack-objects.c:2625
+#: builtin/pack-objects.c:2667
+msgid "include objects referred to by the index"
+msgstr ""
+
+#: builtin/pack-objects.c:2670
 msgid "output pack to stdout"
 msgstr ""
 
-#: builtin/pack-objects.c:2627
+#: builtin/pack-objects.c:2672
 msgid "include tag objects that refer to objects to be packed"
 msgstr ""
 
-#: builtin/pack-objects.c:2629
+#: builtin/pack-objects.c:2674
 msgid "keep unreachable objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2630 parse-options.h:140
+#: builtin/pack-objects.c:2675 parse-options.h:140
 msgid "time"
 msgstr ""
 
-#: builtin/pack-objects.c:2631
+#: builtin/pack-objects.c:2676
 msgid "unpack unreachable objects newer than <time>"
 msgstr ""
 
-#: builtin/pack-objects.c:2634
+#: builtin/pack-objects.c:2679
 msgid "create thin packs"
 msgstr ""
 
-#: builtin/pack-objects.c:2636
+#: builtin/pack-objects.c:2681
 msgid "ignore packs that have companion .keep file"
 msgstr ""
 
-#: builtin/pack-objects.c:2638
+#: builtin/pack-objects.c:2683
 msgid "pack compression level"
 msgstr ""
 
-#: builtin/pack-objects.c:2640
+#: builtin/pack-objects.c:2685
 msgid "do not hide commits by grafts"
 msgstr ""
 
-#: builtin/pack-objects.c:2642
+#: builtin/pack-objects.c:2687
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2644
+#: builtin/pack-objects.c:2689
 msgid "write a bitmap index together with the pack index"
 msgstr ""
 
-#: builtin/pack-objects.c:2723
+#: builtin/pack-objects.c:2778
 msgid "Counting objects"
 msgstr ""
 
@@ -7389,7 +7642,7 @@
 msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
 msgstr ""
 
-#: builtin/prune-packed.c:49
+#: builtin/prune-packed.c:40
 msgid "Removing duplicate objects"
 msgstr ""
 
@@ -7397,15 +7650,15 @@
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr ""
 
-#: builtin/prune.c:142
+#: builtin/prune.c:106
 msgid "do not remove, show only"
 msgstr ""
 
-#: builtin/prune.c:143
+#: builtin/prune.c:107
 msgid "report pruned objects"
 msgstr ""
 
-#: builtin/prune.c:146
+#: builtin/prune.c:110
 msgid "expire objects older than <time>"
 msgstr ""
 
@@ -7421,13 +7674,13 @@
 msgid "--delete only accepts plain target ref names"
 msgstr ""
 
-#: builtin/push.c:140
+#: builtin/push.c:139
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
 msgstr ""
 
-#: builtin/push.c:143
+#: builtin/push.c:142
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -7442,7 +7695,7 @@
 "%s"
 msgstr ""
 
-#: builtin/push.c:158
+#: builtin/push.c:157
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -7452,7 +7705,7 @@
 "    git push %s HEAD:<name-of-remote-branch>\n"
 msgstr ""
 
-#: builtin/push.c:172
+#: builtin/push.c:171
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -7461,12 +7714,12 @@
 "    git push --set-upstream %s %s\n"
 msgstr ""
 
-#: builtin/push.c:180
+#: builtin/push.c:179
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr ""
 
-#: builtin/push.c:183
+#: builtin/push.c:182
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -7474,7 +7727,7 @@
 "to update which remote branch."
 msgstr ""
 
-#: builtin/push.c:206
+#: builtin/push.c:205
 msgid ""
 "push.default is unset; its implicit value has changed in\n"
 "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
@@ -7499,12 +7752,12 @@
 "'current' instead of 'simple' if you sometimes use older versions of Git)"
 msgstr ""
 
-#: builtin/push.c:273
+#: builtin/push.c:272
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 
-#: builtin/push.c:280
+#: builtin/push.c:279
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -7512,7 +7765,7 @@
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 
-#: builtin/push.c:286
+#: builtin/push.c:285
 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"
@@ -7520,7 +7773,7 @@
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 
-#: builtin/push.c:292
+#: builtin/push.c:291
 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"
@@ -7529,33 +7782,33 @@
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 
-#: builtin/push.c:299
+#: builtin/push.c:298
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr ""
 
-#: builtin/push.c:302
+#: builtin/push.c:301
 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:360
 #, c-format
 msgid "Pushing to %s\n"
 msgstr ""
 
-#: builtin/push.c:365
+#: builtin/push.c:364
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr ""
 
-#: builtin/push.c:395
+#: builtin/push.c:394
 #, c-format
 msgid "bad repository '%s'"
 msgstr ""
 
-#: builtin/push.c:396
+#: builtin/push.c:395
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -7568,166 +7821,170 @@
 "    git push <name>\n"
 msgstr ""
 
-#: builtin/push.c:411
+#: builtin/push.c:410
 msgid "--all and --tags are incompatible"
 msgstr ""
 
-#: builtin/push.c:412
+#: builtin/push.c:411
 msgid "--all can't be combined with refspecs"
 msgstr ""
 
-#: builtin/push.c:417
+#: builtin/push.c:416
 msgid "--mirror and --tags are incompatible"
 msgstr ""
 
-#: builtin/push.c:418
+#: builtin/push.c:417
 msgid "--mirror can't be combined with refspecs"
 msgstr ""
 
-#: builtin/push.c:423
+#: builtin/push.c:422
 msgid "--all and --mirror are incompatible"
 msgstr ""
 
-#: builtin/push.c:483
+#: builtin/push.c:493
 msgid "repository"
 msgstr ""
 
-#: builtin/push.c:484
+#: builtin/push.c:494
 msgid "push all refs"
 msgstr ""
 
-#: builtin/push.c:485
+#: builtin/push.c:495
 msgid "mirror all refs"
 msgstr ""
 
-#: builtin/push.c:487
+#: builtin/push.c:497
 msgid "delete refs"
 msgstr ""
 
-#: builtin/push.c:488
+#: builtin/push.c:498
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr ""
 
-#: builtin/push.c:491
+#: builtin/push.c:501
 msgid "force updates"
 msgstr ""
 
-#: builtin/push.c:493
+#: builtin/push.c:503
 msgid "refname>:<expect"
 msgstr ""
 
-#: builtin/push.c:494
+#: builtin/push.c:504
 msgid "require old value of ref to be at this value"
 msgstr ""
 
-#: builtin/push.c:496
+#: builtin/push.c:506
 msgid "check"
 msgstr ""
 
-#: builtin/push.c:497
+#: builtin/push.c:507
 msgid "control recursive pushing of submodules"
 msgstr ""
 
-#: builtin/push.c:499
+#: builtin/push.c:509
 msgid "use thin pack"
 msgstr ""
 
-#: builtin/push.c:500 builtin/push.c:501
+#: builtin/push.c:510 builtin/push.c:511
 msgid "receive pack program"
 msgstr ""
 
-#: builtin/push.c:502
+#: builtin/push.c:512
 msgid "set upstream for git pull/status"
 msgstr ""
 
-#: builtin/push.c:505
+#: builtin/push.c:515
 msgid "prune locally removed refs"
 msgstr ""
 
-#: builtin/push.c:507
+#: builtin/push.c:517
 msgid "bypass pre-push hook"
 msgstr ""
 
-#: builtin/push.c:508
+#: builtin/push.c:518
 msgid "push missing but relevant tags"
 msgstr ""
 
-#: builtin/push.c:518
+#: builtin/push.c:520
+msgid "GPG sign the push"
+msgstr ""
+
+#: builtin/push.c:529
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr ""
 
-#: builtin/push.c:520
+#: builtin/push.c:531
 msgid "--delete doesn't make sense without any refs"
 msgstr ""
 
-#: builtin/read-tree.c:36
+#: builtin/read-tree.c:37
 msgid ""
 "git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] "
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
 "index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"
 msgstr ""
 
-#: builtin/read-tree.c:109
+#: builtin/read-tree.c:110
 msgid "write resulting index to <file>"
 msgstr ""
 
-#: builtin/read-tree.c:112
+#: builtin/read-tree.c:113
 msgid "only empty the index"
 msgstr ""
 
-#: builtin/read-tree.c:114
+#: builtin/read-tree.c:115
 msgid "Merging"
 msgstr ""
 
-#: builtin/read-tree.c:116
+#: builtin/read-tree.c:117
 msgid "perform a merge in addition to a read"
 msgstr ""
 
-#: builtin/read-tree.c:118
+#: builtin/read-tree.c:119
 msgid "3-way merge if no file level merging required"
 msgstr ""
 
-#: builtin/read-tree.c:120
+#: builtin/read-tree.c:121
 msgid "3-way merge in presence of adds and removes"
 msgstr ""
 
-#: builtin/read-tree.c:122
+#: builtin/read-tree.c:123
 msgid "same as -m, but discard unmerged entries"
 msgstr ""
 
-#: builtin/read-tree.c:123
+#: builtin/read-tree.c:124
 msgid "<subdirectory>/"
 msgstr ""
 
-#: builtin/read-tree.c:124
+#: builtin/read-tree.c:125
 msgid "read the tree into the index under <subdirectory>/"
 msgstr ""
 
-#: builtin/read-tree.c:127
+#: builtin/read-tree.c:128
 msgid "update working tree with merge result"
 msgstr ""
 
-#: builtin/read-tree.c:129
+#: builtin/read-tree.c:130
 msgid "gitignore"
 msgstr ""
 
-#: builtin/read-tree.c:130
+#: builtin/read-tree.c:131
 msgid "allow explicitly ignored files to be overwritten"
 msgstr ""
 
-#: builtin/read-tree.c:133
+#: builtin/read-tree.c:134
 msgid "don't check the working tree after merging"
 msgstr ""
 
-#: builtin/read-tree.c:134
+#: builtin/read-tree.c:135
 msgid "don't update the index or the work tree"
 msgstr ""
 
-#: builtin/read-tree.c:136
+#: builtin/read-tree.c:137
 msgid "skip applying sparse checkout filter"
 msgstr ""
 
-#: builtin/read-tree.c:138
+#: builtin/read-tree.c:139
 msgid "debug unpack-trees"
 msgstr ""
 
@@ -7887,21 +8144,16 @@
 msgid "Could not setup master '%s'"
 msgstr ""
 
-#: builtin/remote.c:289
-#, c-format
-msgid "more than one %s"
-msgstr ""
-
-#: builtin/remote.c:334
+#: builtin/remote.c:333
 #, c-format
 msgid "Could not get fetch map for refspec %s"
 msgstr ""
 
-#: builtin/remote.c:435 builtin/remote.c:443
+#: builtin/remote.c:434 builtin/remote.c:442
 msgid "(matching)"
 msgstr ""
 
-#: builtin/remote.c:447
+#: builtin/remote.c:446
 msgid "(delete)"
 msgstr ""
 
@@ -7910,7 +8162,7 @@
 msgid "Could not append '%s' to '%s'"
 msgstr ""
 
-#: builtin/remote.c:634 builtin/remote.c:787 builtin/remote.c:885
+#: builtin/remote.c:634 builtin/remote.c:798 builtin/remote.c:898
 #, c-format
 msgid "No such remote: %s"
 msgstr ""
@@ -7920,7 +8172,7 @@
 msgid "Could not rename config section '%s' to '%s'"
 msgstr ""
 
-#: builtin/remote.c:657 builtin/remote.c:794
+#: builtin/remote.c:657 builtin/remote.c:850
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr ""
@@ -7953,12 +8205,12 @@
 msgid "creating '%s' failed"
 msgstr ""
 
-#: builtin/remote.c:759
+#: builtin/remote.c:769
 #, c-format
 msgid "Could not remove branch %s"
 msgstr ""
 
-#: builtin/remote.c:829
+#: builtin/remote.c:836
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -7968,363 +8220,419 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/remote.c:938
+#: builtin/remote.c:951
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr ""
 
-#: builtin/remote.c:941
+#: builtin/remote.c:954
 msgid " tracked"
 msgstr ""
 
-#: builtin/remote.c:943
+#: builtin/remote.c:956
 msgid " stale (use 'git remote prune' to remove)"
 msgstr ""
 
-#: builtin/remote.c:945
+#: builtin/remote.c:958
 msgid " ???"
 msgstr ""
 
-#: builtin/remote.c:986
-#, c-format
-msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
-msgstr ""
-
-#: builtin/remote.c:993
-#, c-format
-msgid "rebases onto remote %s"
-msgstr ""
-
-#: builtin/remote.c:996
-#, c-format
-msgid " merges with remote %s"
-msgstr ""
-
-#: builtin/remote.c:997
-msgid "    and with remote"
-msgstr ""
-
 #: builtin/remote.c:999
 #, c-format
+msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
+msgstr ""
+
+#: builtin/remote.c:1006
+#, c-format
+msgid "rebases onto remote %s"
+msgstr ""
+
+#: builtin/remote.c:1009
+#, c-format
+msgid " merges with remote %s"
+msgstr ""
+
+#: builtin/remote.c:1010
+msgid "    and with remote"
+msgstr ""
+
+#: builtin/remote.c:1012
+#, c-format
 msgid "merges with remote %s"
 msgstr ""
 
-#: builtin/remote.c:1000
+#: builtin/remote.c:1013
 msgid "   and with remote"
 msgstr ""
 
-#: builtin/remote.c:1046
+#: builtin/remote.c:1059
 msgid "create"
 msgstr ""
 
-#: builtin/remote.c:1049
+#: builtin/remote.c:1062
 msgid "delete"
 msgstr ""
 
-#: builtin/remote.c:1053
+#: builtin/remote.c:1066
 msgid "up to date"
 msgstr ""
 
-#: builtin/remote.c:1056
+#: builtin/remote.c:1069
 msgid "fast-forwardable"
 msgstr ""
 
-#: builtin/remote.c:1059
+#: builtin/remote.c:1072
 msgid "local out of date"
 msgstr ""
 
-#: builtin/remote.c:1066
+#: builtin/remote.c:1079
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr ""
 
-#: builtin/remote.c:1069
+#: builtin/remote.c:1082
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr ""
 
-#: builtin/remote.c:1073
+#: builtin/remote.c:1086
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr ""
 
-#: builtin/remote.c:1076
+#: builtin/remote.c:1089
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr ""
 
-#: builtin/remote.c:1144
+#: builtin/remote.c:1157
 msgid "do not query remotes"
 msgstr ""
 
-#: builtin/remote.c:1171
+#: builtin/remote.c:1184
 #, c-format
 msgid "* remote %s"
 msgstr ""
 
-#: builtin/remote.c:1172
+#: builtin/remote.c:1185
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr ""
 
-#: builtin/remote.c:1173 builtin/remote.c:1318
+#: builtin/remote.c:1186 builtin/remote.c:1333
 msgid "(no URL)"
 msgstr ""
 
-#: builtin/remote.c:1182 builtin/remote.c:1184
+#: builtin/remote.c:1195 builtin/remote.c:1197
 #, c-format
 msgid "  Push  URL: %s"
 msgstr ""
 
-#: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190
+#: builtin/remote.c:1199 builtin/remote.c:1201 builtin/remote.c:1203
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr ""
 
-#: builtin/remote.c:1192
+#: builtin/remote.c:1205
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr ""
 
-#: builtin/remote.c:1204
+#: builtin/remote.c:1217
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/remote.c:1207 builtin/remote.c:1234
+#: builtin/remote.c:1220 builtin/remote.c:1247
 msgid " (status not queried)"
 msgstr ""
 
-#: builtin/remote.c:1216
+#: builtin/remote.c:1229
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/remote.c:1224
+#: builtin/remote.c:1237
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr ""
 
-#: builtin/remote.c:1231
+#: builtin/remote.c:1244
 #, 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:1252
+#: builtin/remote.c:1265
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr ""
 
-#: builtin/remote.c:1254
+#: builtin/remote.c:1267
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr ""
 
-#: builtin/remote.c:1269
+#: builtin/remote.c:1282
 msgid "Cannot determine remote HEAD"
 msgstr ""
 
-#: builtin/remote.c:1271
+#: builtin/remote.c:1284
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
 
-#: builtin/remote.c:1281
+#: builtin/remote.c:1294
 #, c-format
 msgid "Could not delete %s"
 msgstr ""
 
-#: builtin/remote.c:1289
+#: builtin/remote.c:1302
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr ""
 
-#: builtin/remote.c:1291
+#: builtin/remote.c:1304
 #, c-format
 msgid "Could not setup %s"
 msgstr ""
 
-#: builtin/remote.c:1307
+#: builtin/remote.c:1322
 #, c-format
 msgid " %s will become dangling!"
 msgstr ""
 
-#: builtin/remote.c:1308
+#: builtin/remote.c:1323
 #, c-format
 msgid " %s has become dangling!"
 msgstr ""
 
-#: builtin/remote.c:1314
+#: builtin/remote.c:1329
 #, c-format
 msgid "Pruning %s"
 msgstr ""
 
-#: builtin/remote.c:1315
+#: builtin/remote.c:1330
 #, c-format
 msgid "URL: %s"
 msgstr ""
 
-#: builtin/remote.c:1328
+#: builtin/remote.c:1357
 #, c-format
 msgid " * [would prune] %s"
 msgstr ""
 
-#: builtin/remote.c:1331
+#: builtin/remote.c:1360
 #, c-format
 msgid " * [pruned] %s"
 msgstr ""
 
-#: builtin/remote.c:1374
+#: builtin/remote.c:1405
 msgid "prune remotes after fetching"
 msgstr ""
 
-#: builtin/remote.c:1440 builtin/remote.c:1514
+#: builtin/remote.c:1471 builtin/remote.c:1545
 #, c-format
 msgid "No such remote '%s'"
 msgstr ""
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1491
 msgid "add branch"
 msgstr ""
 
-#: builtin/remote.c:1467
+#: builtin/remote.c:1498
 msgid "no remote specified"
 msgstr ""
 
-#: builtin/remote.c:1489
+#: builtin/remote.c:1520
 msgid "manipulate push URLs"
 msgstr ""
 
-#: builtin/remote.c:1491
+#: builtin/remote.c:1522
 msgid "add URL"
 msgstr ""
 
-#: builtin/remote.c:1493
+#: builtin/remote.c:1524
 msgid "delete URLs"
 msgstr ""
 
-#: builtin/remote.c:1500
+#: builtin/remote.c:1531
 msgid "--add --delete doesn't make sense"
 msgstr ""
 
-#: builtin/remote.c:1540
+#: builtin/remote.c:1571
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr ""
 
-#: builtin/remote.c:1548
+#: builtin/remote.c:1579
 #, c-format
 msgid "No such URL found: %s"
 msgstr ""
 
-#: builtin/remote.c:1550
+#: builtin/remote.c:1581
 msgid "Will not delete all non-push URLs"
 msgstr ""
 
-#: builtin/remote.c:1564
+#: builtin/remote.c:1595
 msgid "be verbose; must be placed before a subcommand"
 msgstr ""
 
-#: builtin/repack.c:16
+#: builtin/repack.c:17
 msgid "git repack [options]"
 msgstr ""
 
-#: builtin/repack.c:156
+#: builtin/repack.c:160
 msgid "pack everything in a single pack"
 msgstr ""
 
-#: builtin/repack.c:158
+#: builtin/repack.c:162
 msgid "same as -a, and turn unreachable objects loose"
 msgstr ""
 
-#: builtin/repack.c:161
+#: builtin/repack.c:165
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr ""
 
-#: builtin/repack.c:163
+#: builtin/repack.c:167
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr ""
 
-#: builtin/repack.c:165
+#: builtin/repack.c:169
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr ""
 
-#: builtin/repack.c:167
+#: builtin/repack.c:171
 msgid "do not run git-update-server-info"
 msgstr ""
 
-#: builtin/repack.c:170
+#: builtin/repack.c:174
 msgid "pass --local to git-pack-objects"
 msgstr ""
 
-#: builtin/repack.c:172
+#: builtin/repack.c:176
 msgid "write bitmap index"
 msgstr ""
 
-#: builtin/repack.c:173
+#: builtin/repack.c:177
 msgid "approxidate"
 msgstr ""
 
-#: builtin/repack.c:174
+#: builtin/repack.c:178
 msgid "with -A, do not loosen objects older than this"
 msgstr ""
 
-#: builtin/repack.c:176
+#: builtin/repack.c:180
 msgid "size of the window used for delta compression"
 msgstr ""
 
-#: builtin/repack.c:177 builtin/repack.c:181
+#: builtin/repack.c:181 builtin/repack.c:185
 msgid "bytes"
 msgstr ""
 
-#: builtin/repack.c:178
+#: builtin/repack.c:182
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr ""
 
-#: builtin/repack.c:180
+#: builtin/repack.c:184
 msgid "limits the maximum delta depth"
 msgstr ""
 
-#: builtin/repack.c:182
+#: builtin/repack.c:186
 msgid "maximum size of each packfile"
 msgstr ""
 
-#: builtin/repack.c:184
+#: builtin/repack.c:188
 msgid "repack objects in packs marked with .keep"
 msgstr ""
 
-#: builtin/repack.c:371
+#: builtin/repack.c:374
 #, c-format
 msgid "removing '%s' failed"
 msgstr ""
 
-#: builtin/replace.c:17
+#: builtin/replace.c:19
 msgid "git replace [-f] <object> <replacement>"
 msgstr ""
 
-#: builtin/replace.c:18
+#: builtin/replace.c:20
+msgid "git replace [-f] --edit <object>"
+msgstr ""
+
+#: builtin/replace.c:21
+msgid "git replace [-f] --graft <commit> [<parent>...]"
+msgstr ""
+
+#: builtin/replace.c:22
 msgid "git replace -d <object>..."
 msgstr ""
 
-#: builtin/replace.c:19
+#: builtin/replace.c:23
 msgid "git replace [--format=<format>] [-l [<pattern>]]"
 msgstr ""
 
-#: builtin/replace.c:174
+#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#, c-format
+msgid "Not a valid object name: '%s'"
+msgstr ""
+
+#: builtin/replace.c:355
+#, c-format
+msgid "bad mergetag in commit '%s'"
+msgstr ""
+
+#: builtin/replace.c:357
+#, c-format
+msgid "malformed mergetag in commit '%s'"
+msgstr ""
+
+#: builtin/replace.c:368
+#, c-format
+msgid ""
+"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
+"instead of --graft"
+msgstr ""
+
+#: builtin/replace.c:401
+#, c-format
+msgid "the original commit '%s' has a gpg signature."
+msgstr ""
+
+#: builtin/replace.c:402
+msgid "the signature will be removed in the replacement commit!"
+msgstr ""
+
+#: builtin/replace.c:408
+#, c-format
+msgid "could not write replacement commit for: '%s'"
+msgstr ""
+
+#: builtin/replace.c:432
 msgid "list replace refs"
 msgstr ""
 
-#: builtin/replace.c:175
+#: builtin/replace.c:433
 msgid "delete replace refs"
 msgstr ""
 
-#: builtin/replace.c:176
+#: 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:177
+#: builtin/replace.c:437
+msgid "do not pretty-print contents for --edit"
+msgstr ""
+
+#: builtin/replace.c:438
 msgid "use this format"
 msgstr ""
 
@@ -8336,153 +8644,153 @@
 msgid "register clean resolutions in index"
 msgstr ""
 
-#: builtin/reset.c:25
+#: builtin/reset.c:26
 msgid ""
 "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
 msgstr ""
 
-#: builtin/reset.c:26
+#: builtin/reset.c:27
 msgid "git reset [-q] <tree-ish> [--] <paths>..."
 msgstr ""
 
-#: builtin/reset.c:27
+#: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
 msgstr ""
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "mixed"
 msgstr ""
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "soft"
 msgstr ""
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "hard"
 msgstr ""
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "merge"
 msgstr ""
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "keep"
 msgstr ""
 
-#: builtin/reset.c:73
+#: builtin/reset.c:74
 msgid "You do not have a valid HEAD."
 msgstr ""
 
-#: builtin/reset.c:75
+#: builtin/reset.c:76
 msgid "Failed to find tree of HEAD."
 msgstr ""
 
-#: builtin/reset.c:81
+#: builtin/reset.c:82
 #, c-format
 msgid "Failed to find tree of %s."
 msgstr ""
 
-#: builtin/reset.c:99
+#: builtin/reset.c:100
 #, c-format
 msgid "HEAD is now at %s"
 msgstr ""
 
-#: builtin/reset.c:182
+#: builtin/reset.c:183
 #, c-format
 msgid "Cannot do a %s reset in the middle of a merge."
 msgstr ""
 
-#: builtin/reset.c:273
+#: builtin/reset.c:276
 msgid "be quiet, only report errors"
 msgstr ""
 
-#: builtin/reset.c:275
+#: builtin/reset.c:278
 msgid "reset HEAD and index"
 msgstr ""
 
-#: builtin/reset.c:276
+#: builtin/reset.c:279
 msgid "reset only HEAD"
 msgstr ""
 
-#: builtin/reset.c:278 builtin/reset.c:280
+#: builtin/reset.c:281 builtin/reset.c:283
 msgid "reset HEAD, index and working tree"
 msgstr ""
 
-#: builtin/reset.c:282
+#: builtin/reset.c:285
 msgid "reset HEAD but keep local changes"
 msgstr ""
 
-#: builtin/reset.c:285
+#: builtin/reset.c:288
 msgid "record only the fact that removed paths will be added later"
 msgstr ""
 
-#: builtin/reset.c:302
+#: builtin/reset.c:305
 #, c-format
 msgid "Failed to resolve '%s' as a valid revision."
 msgstr ""
 
-#: builtin/reset.c:305 builtin/reset.c:313
+#: builtin/reset.c:308 builtin/reset.c:316
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr ""
 
-#: builtin/reset.c:310
+#: builtin/reset.c:313
 #, c-format
 msgid "Failed to resolve '%s' as a valid tree."
 msgstr ""
 
-#: builtin/reset.c:319
+#: builtin/reset.c:322
 msgid "--patch is incompatible with --{hard,mixed,soft}"
 msgstr ""
 
-#: builtin/reset.c:328
+#: builtin/reset.c:331
 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
 msgstr ""
 
-#: builtin/reset.c:330
+#: builtin/reset.c:333
 #, c-format
 msgid "Cannot do %s reset with paths."
 msgstr ""
 
-#: builtin/reset.c:340
+#: builtin/reset.c:343
 #, c-format
 msgid "%s reset is not allowed in a bare repository"
 msgstr ""
 
-#: builtin/reset.c:344
+#: builtin/reset.c:347
 msgid "-N can only be used with --mixed"
 msgstr ""
 
-#: builtin/reset.c:361
+#: builtin/reset.c:364
 msgid "Unstaged changes after reset:"
 msgstr ""
 
-#: builtin/reset.c:367
+#: builtin/reset.c:370
 #, c-format
 msgid "Could not reset index file to revision '%s'."
 msgstr ""
 
-#: builtin/reset.c:372
+#: builtin/reset.c:374
 msgid "Could not write new index file."
 msgstr ""
 
-#: builtin/rev-parse.c:359
+#: builtin/rev-parse.c:361
 msgid "git rev-parse --parseopt [options] -- [<args>...]"
 msgstr ""
 
-#: builtin/rev-parse.c:364
+#: builtin/rev-parse.c:366
 msgid "keep the `--` passed as an arg"
 msgstr ""
 
-#: builtin/rev-parse.c:366
+#: builtin/rev-parse.c:368
 msgid "stop parsing after the first non-option argument"
 msgstr ""
 
-#: builtin/rev-parse.c:369
+#: builtin/rev-parse.c:371
 msgid "output in stuck long form"
 msgstr ""
 
-#: builtin/rev-parse.c:497
+#: builtin/rev-parse.c:499
 msgid ""
 "git rev-parse --parseopt [options] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -8589,7 +8897,7 @@
 "the following submodule (or one of its nested submodules)\n"
 "uses a .git directory:"
 msgid_plural ""
-"the following submodules (or one of its nested submodules)\n"
+"the following submodules (or one of their nested submodules)\n"
 "use a .git directory:"
 msgstr[0] ""
 msgstr[1] ""
@@ -8654,6 +8962,10 @@
 msgid "exit with a zero status even if nothing matched"
 msgstr ""
 
+#: builtin/rm.c:318
+msgid "Please, stage your changes to .gitmodules or stash them to proceed"
+msgstr ""
+
 #: builtin/rm.c:336
 #, c-format
 msgid "not removing '%s' recursively without -r"
@@ -8831,11 +9143,11 @@
 msgid "shorten ref output"
 msgstr ""
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
 msgid "reason"
 msgstr ""
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
 msgid "reason of the update"
 msgstr ""
 
@@ -8858,316 +9170,317 @@
 msgid "git tag -v <tagname>..."
 msgstr ""
 
-#: builtin/tag.c:67
+#: builtin/tag.c:69
 #, c-format
 msgid "malformed object at '%s'"
 msgstr ""
 
-#: builtin/tag.c:239
+#: builtin/tag.c:301
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr ""
 
-#: builtin/tag.c:244
+#: builtin/tag.c:306
 #, c-format
 msgid "tag '%s' not found."
 msgstr ""
 
-#: builtin/tag.c:259
+#: builtin/tag.c:321
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr ""
 
-#: builtin/tag.c:271
+#: builtin/tag.c:333
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr ""
 
-#: builtin/tag.c:281
+#: builtin/tag.c:343
 #, c-format
 msgid ""
 "\n"
-"Write a tag message\n"
+"Write a message for tag:\n"
+"  %s\n"
 "Lines starting with '%c' will be ignored.\n"
 msgstr ""
 
-#: builtin/tag.c:285
+#: builtin/tag.c:347
 #, c-format
 msgid ""
 "\n"
-"Write a tag message\n"
+"Write a message for tag:\n"
+"  %s\n"
 "Lines starting with '%c' will be kept; you may remove them yourself if you "
 "want to.\n"
 msgstr ""
 
-#: builtin/tag.c:324
+#: 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
 msgid "unable to sign the tag"
 msgstr ""
 
-#: builtin/tag.c:326
+#: builtin/tag.c:430
 msgid "unable to write tag file"
 msgstr ""
 
-#: builtin/tag.c:351
+#: builtin/tag.c:455
 msgid "bad object type."
 msgstr ""
 
-#: builtin/tag.c:364
+#: builtin/tag.c:468
 msgid "tag header too big."
 msgstr ""
 
-#: builtin/tag.c:400
+#: builtin/tag.c:504
 msgid "no tag message?"
 msgstr ""
 
-#: builtin/tag.c:406
+#: builtin/tag.c:510
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr ""
 
-#: builtin/tag.c:455
+#: builtin/tag.c:559
 msgid "switch 'points-at' requires an object"
 msgstr ""
 
-#: builtin/tag.c:457
+#: builtin/tag.c:561
 #, c-format
 msgid "malformed object name '%s'"
 msgstr ""
 
-#: builtin/tag.c:480
-#, c-format
-msgid "unsupported sort specification %s"
-msgstr ""
-
-#: builtin/tag.c:500
+#: builtin/tag.c:589
 msgid "list tag names"
 msgstr ""
 
-#: builtin/tag.c:502
+#: builtin/tag.c:591
 msgid "print <n> lines of each tag message"
 msgstr ""
 
-#: builtin/tag.c:504
+#: builtin/tag.c:593
 msgid "delete tags"
 msgstr ""
 
-#: builtin/tag.c:505
+#: builtin/tag.c:594
 msgid "verify tags"
 msgstr ""
 
-#: builtin/tag.c:507
+#: builtin/tag.c:596
 msgid "Tag creation options"
 msgstr ""
 
-#: builtin/tag.c:509
+#: builtin/tag.c:598
 msgid "annotated tag, needs a message"
 msgstr ""
 
-#: builtin/tag.c:511
+#: builtin/tag.c:600
 msgid "tag message"
 msgstr ""
 
-#: builtin/tag.c:513
+#: builtin/tag.c:602
 msgid "annotated and GPG-signed tag"
 msgstr ""
 
-#: builtin/tag.c:517
+#: builtin/tag.c:606
 msgid "use another key to sign the tag"
 msgstr ""
 
-#: builtin/tag.c:518
+#: builtin/tag.c:607
 msgid "replace the tag if exists"
 msgstr ""
 
-#: builtin/tag.c:519
+#: builtin/tag.c:608
 msgid "show tag list in columns"
 msgstr ""
 
-#: builtin/tag.c:521
+#: builtin/tag.c:610
 msgid "sort tags"
 msgstr ""
 
-#: builtin/tag.c:525
+#: builtin/tag.c:614
 msgid "Tag listing options"
 msgstr ""
 
-#: builtin/tag.c:528 builtin/tag.c:534
+#: builtin/tag.c:617 builtin/tag.c:623
 msgid "print only tags that contain the commit"
 msgstr ""
 
-#: builtin/tag.c:540
+#: builtin/tag.c:629
 msgid "print only tags of the object"
 msgstr ""
 
-#: builtin/tag.c:566
+#: builtin/tag.c:655
 msgid "--column and -n are incompatible"
 msgstr ""
 
-#: builtin/tag.c:578
+#: builtin/tag.c:667
 msgid "--sort and -n are incompatible"
 msgstr ""
 
-#: builtin/tag.c:585
+#: builtin/tag.c:674
 msgid "-n option is only allowed with -l."
 msgstr ""
 
-#: builtin/tag.c:587
+#: builtin/tag.c:676
 msgid "--contains option is only allowed with -l."
 msgstr ""
 
-#: builtin/tag.c:589
+#: builtin/tag.c:678
 msgid "--points-at option is only allowed with -l."
 msgstr ""
 
-#: builtin/tag.c:597
+#: builtin/tag.c:686
 msgid "only one -F or -m option is allowed."
 msgstr ""
 
-#: builtin/tag.c:617
+#: builtin/tag.c:706
 msgid "too many params"
 msgstr ""
 
-#: builtin/tag.c:623
+#: builtin/tag.c:712
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr ""
 
-#: builtin/tag.c:628
+#: builtin/tag.c:717
 #, c-format
 msgid "tag '%s' already exists"
 msgstr ""
 
-#: builtin/tag.c:646
-#, c-format
-msgid "%s: cannot lock the ref"
-msgstr ""
-
-#: builtin/tag.c:648
-#, c-format
-msgid "%s: cannot update the ref"
-msgstr ""
-
-#: builtin/tag.c:650
+#: builtin/tag.c:741
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr ""
 
-#: builtin/unpack-objects.c:483
+#: builtin/unpack-objects.c:489
 msgid "Unpacking objects"
 msgstr ""
 
-#: builtin/update-index.c:399
+#: builtin/update-index.c:403
 msgid "git update-index [options] [--] [<file>...]"
 msgstr ""
 
-#: builtin/update-index.c:748
+#: builtin/update-index.c:756
 msgid "continue refresh even when index needs update"
 msgstr ""
 
-#: builtin/update-index.c:751
+#: builtin/update-index.c:759
 msgid "refresh: ignore submodules"
 msgstr ""
 
-#: builtin/update-index.c:754
+#: builtin/update-index.c:762
 msgid "do not ignore new files"
 msgstr ""
 
-#: builtin/update-index.c:756
+#: builtin/update-index.c:764
 msgid "let files replace directories and vice-versa"
 msgstr ""
 
-#: builtin/update-index.c:758
+#: builtin/update-index.c:766
 msgid "notice files missing from worktree"
 msgstr ""
 
-#: builtin/update-index.c:760
+#: builtin/update-index.c:768
 msgid "refresh even if index contains unmerged entries"
 msgstr ""
 
-#: builtin/update-index.c:763
+#: builtin/update-index.c:771
 msgid "refresh stat information"
 msgstr ""
 
-#: builtin/update-index.c:767
+#: builtin/update-index.c:775
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr ""
 
-#: builtin/update-index.c:771
+#: builtin/update-index.c:779
 msgid "<mode>,<object>,<path>"
 msgstr ""
 
-#: builtin/update-index.c:772
+#: builtin/update-index.c:780
 msgid "add the specified entry to the index"
 msgstr ""
 
-#: builtin/update-index.c:776
+#: builtin/update-index.c:784
 msgid "(+/-)x"
 msgstr ""
 
-#: builtin/update-index.c:777
+#: builtin/update-index.c:785
 msgid "override the executable bit of the listed files"
 msgstr ""
 
-#: builtin/update-index.c:781
+#: builtin/update-index.c:789
 msgid "mark files as \"not changing\""
 msgstr ""
 
-#: builtin/update-index.c:784
+#: builtin/update-index.c:792
 msgid "clear assumed-unchanged bit"
 msgstr ""
 
-#: builtin/update-index.c:787
+#: builtin/update-index.c:795
 msgid "mark files as \"index-only\""
 msgstr ""
 
-#: builtin/update-index.c:790
+#: builtin/update-index.c:798
 msgid "clear skip-worktree bit"
 msgstr ""
 
-#: builtin/update-index.c:793
+#: builtin/update-index.c:801
 msgid "add to index only; do not add content to object database"
 msgstr ""
 
-#: builtin/update-index.c:795
+#: builtin/update-index.c:803
 msgid "remove named paths even if present in worktree"
 msgstr ""
 
-#: builtin/update-index.c:797
+#: builtin/update-index.c:805
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr ""
 
-#: builtin/update-index.c:799
+#: builtin/update-index.c:807
 msgid "read list of paths to be updated from standard input"
 msgstr ""
 
-#: builtin/update-index.c:803
+#: builtin/update-index.c:811
 msgid "add entries from standard input to the index"
 msgstr ""
 
-#: builtin/update-index.c:807
+#: builtin/update-index.c:815
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr ""
 
-#: builtin/update-index.c:811
+#: builtin/update-index.c:819
 msgid "only update entries that differ from HEAD"
 msgstr ""
 
-#: builtin/update-index.c:815
+#: builtin/update-index.c:823
 msgid "ignore files missing from worktree"
 msgstr ""
 
-#: builtin/update-index.c:818
+#: builtin/update-index.c:826
 msgid "report actions to standard output"
 msgstr ""
 
-#: builtin/update-index.c:820
+#: builtin/update-index.c:828
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr ""
 
-#: builtin/update-index.c:824
+#: builtin/update-index.c:832
 msgid "write index in this format"
 msgstr ""
 
+#: builtin/update-index.c:834
+msgid "enable or disable split index"
+msgstr ""
+
 #: builtin/update-ref.c:9
 msgid "git update-ref [options] -d <refname> [<oldval>]"
 msgstr ""
@@ -9180,19 +9493,19 @@
 msgid "git update-ref [options] --stdin [-z]"
 msgstr ""
 
-#: builtin/update-ref.c:256
+#: builtin/update-ref.c:363
 msgid "delete the reference"
 msgstr ""
 
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:365
 msgid "update <refname> not the one it points to"
 msgstr ""
 
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:366
 msgid "stdin has NUL-terminated arguments"
 msgstr ""
 
-#: builtin/update-ref.c:260
+#: builtin/update-ref.c:367
 msgid "read updates from stdin"
 msgstr ""
 
@@ -9204,15 +9517,23 @@
 msgid "update the info files from scratch"
 msgstr ""
 
-#: builtin/verify-pack.c:56
+#: builtin/verify-commit.c:17
+msgid "git verify-commit [-v|--verbose] <commit>..."
+msgstr ""
+
+#: builtin/verify-commit.c:75
+msgid "print commit contents"
+msgstr ""
+
+#: builtin/verify-pack.c:54
 msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."
 msgstr ""
 
-#: builtin/verify-pack.c:66
+#: builtin/verify-pack.c:64
 msgid "verbose"
 msgstr ""
 
-#: builtin/verify-pack.c:68
+#: builtin/verify-pack.c:66
 msgid "show statistics only"
 msgstr ""
 
@@ -9240,33 +9561,17 @@
 msgid "only useful for debugging"
 msgstr ""
 
+#: credential-cache--daemon.c:267
+msgid "print debugging messages to stderr"
+msgstr ""
+
 #: git.c:17
 msgid ""
-"'git help -a' and 'git help -g' lists available subcommands and some\n"
+"'git help -a' and 'git help -g' list available subcommands and some\n"
 "concept guides. See 'git help <command>' or 'git help <concept>'\n"
 "to read about a specific subcommand or concept."
 msgstr ""
 
-#: parse-options.h:143
-msgid "expiry-date"
-msgstr ""
-
-#: parse-options.h:158
-msgid "no-op (backward compatibility)"
-msgstr ""
-
-#: parse-options.h:232
-msgid "be more verbose"
-msgstr ""
-
-#: parse-options.h:234
-msgid "be more quiet"
-msgstr ""
-
-#: parse-options.h:240
-msgid "use <n> digits to display SHA-1s"
-msgstr ""
-
 #: common-cmds.h:8
 msgid "Add file contents to the index"
 msgstr ""
@@ -9351,6 +9656,30 @@
 msgid "Create, list, delete or verify a tag object signed with GPG"
 msgstr ""
 
+#: parse-options.h:143
+msgid "expiry-date"
+msgstr ""
+
+#: parse-options.h:158
+msgid "no-op (backward compatibility)"
+msgstr ""
+
+#: parse-options.h:232
+msgid "be more verbose"
+msgstr ""
+
+#: parse-options.h:234
+msgid "be more quiet"
+msgstr ""
+
+#: parse-options.h:240
+msgid "use <n> digits to display SHA-1s"
+msgstr ""
+
+#: rerere.h:27
+msgid "update the index with reused conflict resolution if possible"
+msgstr ""
+
 #: git-am.sh:52
 msgid "You need to set your committer info first"
 msgstr ""
@@ -9579,14 +9908,14 @@
 
 #: git-bisect.sh:289
 msgid ""
-"You need to give me at least one good and one bad revisions.\n"
+"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.)"
 msgstr ""
 
 #: git-bisect.sh:292
 msgid ""
 "You need to start by \"git bisect start\".\n"
-"You then need to give me at least one good and one bad revisions.\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.)"
 msgstr ""
 
@@ -9650,18 +9979,24 @@
 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, or use 'git commit -a'."
+"as appropriate to mark resolution and make a commit."
 msgstr ""
 
 #: git-pull.sh:25
 msgid "Pull is not possible because you have unmerged files."
 msgstr ""
 
-#: git-pull.sh:247
+#: git-pull.sh:31
+msgid ""
+"You have not concluded your merge (MERGE_HEAD exists).\n"
+"Please, commit your changes before you can merge."
+msgstr ""
+
+#: git-pull.sh:245
 msgid "updating an unborn branch with changes added to the index"
 msgstr ""
 
-#: git-pull.sh:271
+#: git-pull.sh:269
 #, sh-format
 msgid ""
 "Warning: fetch updated the current branch head.\n"
@@ -9669,11 +10004,11 @@
 "Warning: commit $orig_head."
 msgstr ""
 
-#: git-pull.sh:296
+#: git-pull.sh:294
 msgid "Cannot merge multiple branches into empty head"
 msgstr ""
 
-#: git-pull.sh:300
+#: git-pull.sh:298
 msgid "Cannot rebase onto multiple branches"
 msgstr ""
 
@@ -9685,58 +10020,58 @@
 "\"."
 msgstr ""
 
-#: git-rebase.sh:164
+#: git-rebase.sh:165
 msgid "Applied autostash."
 msgstr ""
 
-#: git-rebase.sh:167
+#: git-rebase.sh:168
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr ""
 
-#: git-rebase.sh:168
+#: 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 ""
 
-#: git-rebase.sh:207
+#: git-rebase.sh:208
 msgid "The pre-rebase hook refused to rebase."
 msgstr ""
 
-#: git-rebase.sh:212
+#: git-rebase.sh:213
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr ""
 
-#: git-rebase.sh:350
+#: git-rebase.sh:351
 msgid "The --exec option must be used with the --interactive option"
 msgstr ""
 
-#: git-rebase.sh:355
+#: git-rebase.sh:356
 msgid "No rebase in progress?"
 msgstr ""
 
-#: git-rebase.sh:366
+#: git-rebase.sh:367
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 
-#: git-rebase.sh:373
+#: git-rebase.sh:374
 msgid "Cannot read HEAD"
 msgstr ""
 
-#: git-rebase.sh:376
+#: git-rebase.sh:377
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
 msgstr ""
 
-#: git-rebase.sh:394
+#: git-rebase.sh:395
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr ""
 
-#: git-rebase.sh:413
+#: git-rebase.sh:414
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -9749,64 +10084,64 @@
 "valuable there."
 msgstr ""
 
-#: git-rebase.sh:464
+#: git-rebase.sh:465
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr ""
 
-#: git-rebase.sh:488
+#: git-rebase.sh:489
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr ""
 
-#: git-rebase.sh:491 git-rebase.sh:495
+#: git-rebase.sh:492 git-rebase.sh:496
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr ""
 
-#: git-rebase.sh:500
+#: git-rebase.sh:501
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr ""
 
-#: git-rebase.sh:523
+#: git-rebase.sh:524
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr ""
 
-#: git-rebase.sh:556
+#: git-rebase.sh:557
 msgid "Cannot autostash"
 msgstr ""
 
-#: git-rebase.sh:561
+#: git-rebase.sh:562
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr ""
 
-#: git-rebase.sh:565
+#: git-rebase.sh:566
 msgid "Please commit or stash them."
 msgstr ""
 
-#: git-rebase.sh:585
+#: git-rebase.sh:586
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr ""
 
-#: git-rebase.sh:589
+#: git-rebase.sh:590
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr ""
 
-#: git-rebase.sh:600
+#: git-rebase.sh:601
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr ""
 
-#: git-rebase.sh:609
+#: git-rebase.sh:610
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 
-#: git-rebase.sh:619
+#: git-rebase.sh:620
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr ""
@@ -9823,23 +10158,23 @@
 msgid "Cannot save the current index state"
 msgstr ""
 
-#: git-stash.sh:123 git-stash.sh:136
+#: git-stash.sh:124 git-stash.sh:137
 msgid "Cannot save the current worktree state"
 msgstr ""
 
-#: git-stash.sh:140
+#: git-stash.sh:141
 msgid "No changes selected"
 msgstr ""
 
-#: git-stash.sh:143
+#: git-stash.sh:144
 msgid "Cannot remove temporary index (can't happen)"
 msgstr ""
 
-#: git-stash.sh:156
+#: git-stash.sh:157
 msgid "Cannot record working tree state"
 msgstr ""
 
-#: git-stash.sh:190
+#: git-stash.sh:191
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr ""
@@ -9854,92 +10189,92 @@
 #. $ 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:237
+#: git-stash.sh:238
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
 "       To provide a message, use git stash save -- '$option'"
 msgstr ""
 
-#: git-stash.sh:258
+#: git-stash.sh:259
 msgid "No local changes to save"
 msgstr ""
 
-#: git-stash.sh:262
+#: git-stash.sh:263
 msgid "Cannot initialize stash"
 msgstr ""
 
-#: git-stash.sh:266
+#: git-stash.sh:267
 msgid "Cannot save the current status"
 msgstr ""
 
-#: git-stash.sh:284
+#: git-stash.sh:285
 msgid "Cannot remove worktree changes"
 msgstr ""
 
-#: git-stash.sh:383
+#: git-stash.sh:384
 msgid "No stash found."
 msgstr ""
 
-#: git-stash.sh:390
+#: git-stash.sh:391
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr ""
 
-#: git-stash.sh:396
+#: git-stash.sh:397
 #, sh-format
-msgid "$reference is not valid reference"
+msgid "$reference is not a valid reference"
 msgstr ""
 
-#: git-stash.sh:424
+#: git-stash.sh:425
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr ""
 
-#: git-stash.sh:435
+#: git-stash.sh:436
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr ""
 
-#: git-stash.sh:443
+#: git-stash.sh:444
 msgid "unable to refresh index"
 msgstr ""
 
-#: git-stash.sh:447
+#: git-stash.sh:448
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr ""
 
-#: git-stash.sh:455
+#: git-stash.sh:456
 msgid "Conflicts in index. Try without --index."
 msgstr ""
 
-#: git-stash.sh:457
+#: git-stash.sh:458
 msgid "Could not save index tree"
 msgstr ""
 
-#: git-stash.sh:491
+#: git-stash.sh:492
 msgid "Cannot unstage modified files"
 msgstr ""
 
-#: git-stash.sh:506
+#: git-stash.sh:507
 msgid "Index was not unstashed."
 msgstr ""
 
-#: git-stash.sh:529
-#, sh-format
-msgid "Dropped ${REV} ($s)"
-msgstr ""
-
 #: git-stash.sh:530
 #, sh-format
+msgid "Dropped ${REV} ($s)"
+msgstr ""
+
+#: git-stash.sh:531
+#, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr ""
 
-#: git-stash.sh:537
+#: git-stash.sh:539
 msgid "No branch name specified"
 msgstr ""
 
-#: git-stash.sh:609
+#: git-stash.sh:611
 msgid "(To restore them type \"git stash apply\")"
 msgstr ""
 
@@ -9958,26 +10293,26 @@
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
 msgstr ""
 
-#: git-submodule.sh:299
+#: git-submodule.sh:296
 #, sh-format
 msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
 msgstr ""
 
-#: git-submodule.sh:409
+#: git-submodule.sh:406
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 
-#: git-submodule.sh:419
+#: git-submodule.sh:416
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr ""
 
-#: git-submodule.sh:436
+#: git-submodule.sh:433
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr ""
 
-#: git-submodule.sh:440
+#: git-submodule.sh:437
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -9985,235 +10320,235 @@
 "Use -f if you really want to add it."
 msgstr ""
 
-#: git-submodule.sh:458
+#: git-submodule.sh:455
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr ""
 
-#: git-submodule.sh:460
+#: git-submodule.sh:457
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr ""
 
-#: git-submodule.sh:468
+#: git-submodule.sh:465
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 
-#: git-submodule.sh:470
+#: git-submodule.sh:467
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
 msgstr ""
 
-#: git-submodule.sh:472
+#: git-submodule.sh:469
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
 msgstr ""
 
-#: git-submodule.sh:473
+#: git-submodule.sh:470
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
 "option."
 msgstr ""
 
-#: git-submodule.sh:475
+#: git-submodule.sh:472
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr ""
 
-#: git-submodule.sh:487
+#: git-submodule.sh:484
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:492
+#: git-submodule.sh:489
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:501
+#: git-submodule.sh:498
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:545
+#: git-submodule.sh:542
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:565
+#: git-submodule.sh:562
 #, sh-format
 msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
 msgstr ""
 
-#: git-submodule.sh:611
+#: git-submodule.sh:608
 #, sh-format
 msgid "No url found for submodule path '$displaypath' in .gitmodules"
 msgstr ""
 
-#: git-submodule.sh:620
+#: git-submodule.sh:617
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:622
+#: git-submodule.sh:619
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:639
+#: git-submodule.sh:636
 #, sh-format
 msgid "Failed to register update mode for submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:677
+#: git-submodule.sh:674
 #, sh-format
 msgid "Use '.' if you really want to deinitialize all submodules"
 msgstr ""
 
-#: git-submodule.sh:694
+#: git-submodule.sh:691
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr ""
 
-#: git-submodule.sh:695
+#: git-submodule.sh:692
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr ""
 
-#: git-submodule.sh:701
+#: git-submodule.sh:698
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
 "discard them"
 msgstr ""
 
-#: git-submodule.sh:704
+#: git-submodule.sh:701
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:705
+#: git-submodule.sh:702
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:708
+#: git-submodule.sh:705
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:717
+#: git-submodule.sh:714
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:833
+#: git-submodule.sh:830
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
 "Maybe you want to use 'update --init'?"
 msgstr ""
 
-#: git-submodule.sh:846
+#: git-submodule.sh:843
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:855
+#: git-submodule.sh:852
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:879
+#: git-submodule.sh:876
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:893
+#: git-submodule.sh:890
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:894
+#: git-submodule.sh:891
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr ""
 
-#: git-submodule.sh:898
+#: git-submodule.sh:895
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:899
+#: git-submodule.sh:896
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr ""
 
-#: git-submodule.sh:904
+#: git-submodule.sh:901
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:905
+#: git-submodule.sh:902
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr ""
 
-#: git-submodule.sh:910
+#: git-submodule.sh:907
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule  path '$prefix$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:911
+#: git-submodule.sh:908
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr ""
 
-#: git-submodule.sh:941
+#: git-submodule.sh:938
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:1049
+#: git-submodule.sh:1046
 msgid "The --cached option cannot be used with the --files option"
 msgstr ""
 
-#: git-submodule.sh:1097
+#: git-submodule.sh:1098
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr ""
 
-#: git-submodule.sh:1117
+#: git-submodule.sh:1118
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr ""
 
-#: git-submodule.sh:1120
+#: git-submodule.sh:1121
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr ""
 
-#: git-submodule.sh:1123
+#: git-submodule.sh:1124
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 
-#: git-submodule.sh:1148
+#: git-submodule.sh:1149
 msgid "blob"
 msgstr ""
 
-#: git-submodule.sh:1262
+#: git-submodule.sh:1267
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:1326
+#: git-submodule.sh:1331
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr ""
diff --git a/po/sv.po b/po/sv.po
index f1658aa..443f00b 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,8 +7,8 @@
 msgstr ""
 "Project-Id-Version: git 2.0.0\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-04-19 12:50+0800\n"
-"PO-Revision-Date: 2014-05-07 07:04+0100\n"
+"POT-Creation-Date: 2014-11-01 07:46+0800\n"
+"PO-Revision-Date: 2014-11-01 20:10+0100\n"
 "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
 "Language: sv\n"
@@ -22,111 +22,107 @@
 msgid "hint: %.*s\n"
 msgstr "tips: %.*s\n"
 
-#: advice.c:85
+#: advice.c:88
 msgid ""
-"Fix them up in the work tree,\n"
-"and then use 'git add/rm <file>' as\n"
-"appropriate to mark resolution and make a commit,\n"
-"or use 'git commit -a'."
+"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 ""
-"Rätta dem i din arbetskatalog,\n"
-"och använd sedan \"git add/rm <fil>\" som\n"
-"lämpligt för att ange lösning och checka in,\n"
-"eller använd \"git commit -a\"."
+"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."
 
-#: archive.c:10
+#: archive.c:11
 msgid "git archive [options] <tree-ish> [<path>...]"
 msgstr "git archive [flaggor] <träd-igt> [<sökväg>...]"
 
-#: archive.c:11
+#: archive.c:12
 msgid "git archive --list"
 msgstr "git archive --list"
 
-#: archive.c:12
+#: archive.c:13
 msgid ""
 "git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]"
 msgstr ""
 "git archive --remote <arkiv> [--exec <kmd>] [flaggor] <träd-igt> "
 "[<sökväg>...]"
 
-#: archive.c:13
+#: archive.c:14
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <arkiv> [--exec <kmd>] --list"
 
-#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
+#: archive.c:334 builtin/add.c:137 builtin/add.c:427 builtin/rm.c:328
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "sökvägsangivelsen \"%s\" motsvarade inte några filer"
 
-#: archive.c:328
+#: archive.c:419
 msgid "fmt"
 msgstr "fmt"
 
-#: archive.c:328
+#: archive.c:419
 msgid "archive format"
 msgstr "arkivformat"
 
-#: archive.c:329 builtin/log.c:1193
+#: archive.c:420 builtin/log.c:1204
 msgid "prefix"
 msgstr "prefix"
 
-#: archive.c:330
+#: archive.c:421
 msgid "prepend prefix to each pathname in the archive"
 msgstr "lägg till prefix till varje sökväg i arkivet"
 
-#: archive.c:331 builtin/archive.c:88 builtin/blame.c:2258
-#: builtin/blame.c:2259 builtin/config.c:57 builtin/fast-export.c:680
-#: builtin/fast-export.c:682 builtin/grep.c:714 builtin/hash-object.c:77
-#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:412
-#: builtin/notes.c:569 builtin/read-tree.c:108 parse-options.h:151
+#: archive.c:422 builtin/archive.c:88 builtin/blame.c:2517
+#: builtin/blame.c:2518 builtin/config.c:57 builtin/fast-export.c:986
+#: builtin/fast-export.c:988 builtin/grep.c:712 builtin/hash-object.c:101
+#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:411
+#: builtin/notes.c:568 builtin/read-tree.c:109 parse-options.h:151
 msgid "file"
 msgstr "fil"
 
-#: archive.c:332 builtin/archive.c:89
+#: archive.c:423 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr "skriv arkivet till filen"
 
-#: archive.c:334
+#: archive.c:425
 msgid "read .gitattributes in working directory"
 msgstr "läs .gitattributes i arbetskatalogen"
 
-#: archive.c:335
+#: archive.c:426
 msgid "report archived files on stderr"
 msgstr "rapportera arkiverade filer på standard fel"
 
-#: archive.c:336
+#: archive.c:427
 msgid "store only"
 msgstr "endast spara"
 
-#: archive.c:337
+#: archive.c:428
 msgid "compress faster"
 msgstr "komprimera snabbare"
 
-#: archive.c:345
+#: archive.c:436
 msgid "compress better"
 msgstr "komprimera bättre"
 
-#: archive.c:348
+#: archive.c:439
 msgid "list supported archive formats"
 msgstr "visa understödda arkivformat"
 
-#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:441 builtin/archive.c:90 builtin/clone.c:85
 msgid "repo"
 msgstr "arkiv"
 
-#: archive.c:351 builtin/archive.c:91
+#: archive.c:442 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "hämta arkivet från fjärrarkivet <arkiv>"
 
-#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
+#: archive.c:443 builtin/archive.c:92 builtin/notes.c:490
 msgid "command"
 msgstr "kommando"
 
-#: archive.c:353 builtin/archive.c:93
+#: archive.c:444 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"
 
-#: attr.c:259
+#: attr.c:258
 msgid ""
 "Negative patterns are ignored in git attributes\n"
 "Use '\\!' for literal leading exclamation."
@@ -186,31 +182,31 @@
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr "Spårar inte: tvetydig information för referensen %s"
 
-#: branch.c:178
+#: branch.c:162
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "\"%s\" är inte ett giltigt grennamn."
 
-#: branch.c:183
+#: branch.c:167
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "Det finns redan en gren som heter \"%s\""
 
-#: branch.c:191
+#: branch.c:175
 msgid "Cannot force update the current branch."
 msgstr "Kan inte tvinga uppdatering av aktuell gren."
 
-#: branch.c:211
+#: branch.c:195
 #, 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:213
+#: branch.c:197
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "den efterfrågade uppströmsgrenen \"%s\" finns inte"
 
-#: branch.c:215
+#: branch.c:199
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -230,113 +226,111 @@
 "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:260
+#: branch.c:243
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "Objektnamnet är inte giltigt: \"%s\"."
 
-#: branch.c:280
+#: branch.c:263
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "Objektnamnet är tvetydigt: \"%s\"."
 
-#: branch.c:285
+#: branch.c:268
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "Avgreningspunkten är inte giltig: \"%s\""
 
-#: branch.c:291
-msgid "Failed to lock ref for update"
-msgstr "Misslyckades låsa referens för uppdatering"
-
-#: branch.c:309
-msgid "Failed to write ref"
-msgstr "Misslyckades skriva referens"
-
-#: bundle.c:33
+#: bundle.c:34
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
 msgstr "'%s' ser inte ut som en v2-bundle-fil"
 
-#: bundle.c:60
+#: bundle.c:61
 #, c-format
 msgid "unrecognized header: %s%s (%d)"
 msgstr "okänt huvud: %s%s (%d)"
 
-#: bundle.c:86 builtin/commit.c:706
+#: bundle.c:87 builtin/commit.c:788
 #, c-format
 msgid "could not open '%s'"
 msgstr "kunde inte öppna \"%s\""
 
-#: bundle.c:138
+#: bundle.c:139
 msgid "Repository lacks these prerequisite commits:"
 msgstr "Arkivet saknar dessa nödvändiga incheckningar:"
 
-#: bundle.c:162 sequencer.c:669 sequencer.c:1123 builtin/log.c:332
-#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357
+#: bundle.c:163 sequencer.c:641 sequencer.c:1096 builtin/blame.c:2706
+#: builtin/branch.c:652 builtin/commit.c:1085 builtin/log.c:330
+#: builtin/log.c:823 builtin/log.c:1432 builtin/log.c:1669 builtin/merge.c:357
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "misslyckades skapa revisionstraversering"
 
-#: bundle.c:184
+#: bundle.c:185
 #, c-format
 msgid "The bundle contains this ref:"
 msgid_plural "The bundle contains these %d refs:"
 msgstr[0] "Paketet (bundlen) innehåller denna referens:"
 msgstr[1] "Paketet (bundlen) innehåller dessa %d referenser:"
 
-#: bundle.c:191
+#: bundle.c:192
 msgid "The bundle records a complete history."
 msgstr "Paketet (bundlen) beskriver en komplett historik."
 
-#: bundle.c:193
+#: bundle.c:194
 #, c-format
 msgid "The bundle requires this ref:"
 msgid_plural "The bundle requires these %d refs:"
 msgstr[0] "Paketet (bundlen) kräver denna referens:"
 msgstr[1] "Paketet (bundlen) kräver dessa %d referenser:"
 
-#: bundle.c:293
+#: bundle.c:292
 msgid "rev-list died"
 msgstr "rev-list dog"
 
-#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:298 builtin/log.c:153 builtin/log.c:1342 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "okänt argument: %s"
 
-#: bundle.c:334
+#: bundle.c:333
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "referensen \"%s\" exkluderas av argumenten till rev-list"
 
-#: bundle.c:379
+#: bundle.c:378
 msgid "Refusing to create empty bundle."
 msgstr "Vägrar skapa ett tomt paket (bundle)."
 
-#: bundle.c:395
+#: bundle.c:393
 msgid "Could not spawn pack-objects"
 msgstr "Kunde inte starta pack-objects"
 
-#: bundle.c:413
+#: bundle.c:411
 msgid "pack-objects died"
 msgstr "pack-objects misslyckades"
 
-#: bundle.c:416
+#: bundle.c:414
 #, c-format
 msgid "cannot create '%s'"
 msgstr "kan inte skapa \"%s\""
 
-#: bundle.c:438
+#: bundle.c:435
 msgid "index-pack died"
 msgstr "index-pack dog"
 
-#: commit.c:54
+#: color.c:157
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr "felaktigt färgvärde: %.*s"
+
+#: commit.c:40
 #, c-format
 msgid "could not parse %s"
 msgstr "kunde inte tolka %s"
 
-#: commit.c:56
+#: commit.c:42
 #, c-format
 msgid "%s %s is not a commit!"
 msgstr "%s %s är inte en incheckning!"
@@ -345,16 +339,69 @@
 msgid "memory exhausted"
 msgstr "minnet slut"
 
-#: connected.c:70
+#: config.c:469 config.c:471
+#, c-format
+msgid "bad config file line %d in %s"
+msgstr "felaktig konfigurationsfil rad %d i %s"
+
+#: config.c:587
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i %s: %s"
+
+#: config.c:589
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\": %s"
+
+#: config.c:674
+#, c-format
+msgid "failed to expand user dir in: '%s'"
+msgstr "misslyckades expandera användarkatalog i: \"%s\""
+
+#: config.c:752 config.c:763
+#, c-format
+msgid "bad zlib compression level %d"
+msgstr "felaktigt zlib-komprimeringsgrad %d"
+
+#: config.c:885
+#, c-format
+msgid "invalid mode for object creation: %s"
+msgstr "felaktigt läge för skapande av objekt: %s"
+
+#: config.c:1201
+msgid "unable to parse command-line config"
+msgstr "kan inte tolka kommandoradskonfiguration"
+
+#: config.c:1262
+msgid "unknown error occured while reading the configuration files"
+msgstr "okänt fel uppstod vid läsning av konfigurationsfilerna"
+
+#: config.c:1586
+#, c-format
+msgid "unable to parse '%s' from command-line config"
+msgstr "kunde inte tolka värdet \"%s\" från kommandoradskonfiguration"
+
+#: config.c:1588
+#, c-format
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "felaktig konfigurationsvariabel \"%s\" i filen \"%s\" på rad %d"
+
+#: config.c:1647
+#, c-format
+msgid "%s has multiple values"
+msgstr "%s har flera värden"
+
+#: connected.c:69
 msgid "Could not run 'git rev-list'"
 msgstr "Kunde inte köra \"git rev-list\""
 
-#: connected.c:90
+#: connected.c:89
 #, c-format
 msgid "failed write to rev-list: %s"
 msgstr "kunde inte skriva till rev-list: %s"
 
-#: connected.c:98
+#: connected.c:97
 #, c-format
 msgid "failed to close rev-list's stdin: %s"
 msgstr "kunde inte stänga rev-list:s standard in: %s"
@@ -432,26 +479,26 @@
 msgid "failed to read orderfile '%s'"
 msgstr "kunde inte läsa orderfilen \"%s\""
 
-#: diffcore-rename.c:517
+#: diffcore-rename.c:516
 msgid "Performing inexact rename detection"
 msgstr "Utför onöjaktig namnbytesdetektering"
 
-#: diff.c:113
+#: diff.c:114
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr "  Misslyckades tolka dirstat-avskärningsprocentandel \"%s\"\n"
 
-#: diff.c:118
+#: diff.c:119
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Okänd dirstat-parameter \"%s\"\n"
 
-#: diff.c:213
+#: diff.c:214
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "Okänt värde för konfigurationsvariabeln \"diff.submodule\": \"%s\""
 
-#: diff.c:263
+#: diff.c:266
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -460,7 +507,16 @@
 "Hittade fel i konfigurationsvariabeln \"diff.dirstat\":\n"
 "%s"
 
-#: diff.c:3495
+#: diff.c:2957
+#, c-format
+msgid "external diff died, stopping at %s"
+msgstr "extern diff dog, stannar vid %s"
+
+#: diff.c:3352
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow kräver exakt en sökvägsangivelse"
+
+#: diff.c:3515
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -469,58 +525,58 @@
 "Misslyckades tolka argument till flaggan --dirstat/-X;\n"
 "%s"
 
-#: diff.c:3509
+#: diff.c:3529
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Misslyckades tolka argument till flaggan --submodule: \"%s\""
 
-#: gpg-interface.c:59 gpg-interface.c:131
+#: gpg-interface.c:129 gpg-interface.c:200
 msgid "could not run gpg."
 msgstr "kunde inte köra gpg."
 
-#: gpg-interface.c:71
+#: gpg-interface.c:141
 msgid "gpg did not accept the data"
 msgstr "gpg godtog inte data"
 
-#: gpg-interface.c:82
+#: gpg-interface.c:152
 msgid "gpg failed to sign the data"
 msgstr "gpg misslyckades signera data"
 
-#: gpg-interface.c:115
+#: gpg-interface.c:185
 #, c-format
 msgid "could not create temporary file '%s': %s"
 msgstr "kunde inte skapa temporära filen \"%s\": %s"
 
-#: gpg-interface.c:118
+#: gpg-interface.c:188
 #, c-format
 msgid "failed writing detached signature to '%s': %s"
 msgstr "misslyckades skriva fristående signatur till \"%s\": %s"
 
-#: grep.c:1698
+#: grep.c:1718
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "\"%s\" kunde inte läsa %s"
 
-#: grep.c:1715
+#: grep.c:1735
 #, c-format
 msgid "'%s': %s"
 msgstr "\"%s\": %s"
 
-#: grep.c:1726
+#: grep.c:1746
 #, c-format
 msgid "'%s': short read %s"
 msgstr "\"%s\": kort läsning %s"
 
-#: help.c:209
+#: help.c:207
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "git-kommandon tillgängliga i \"%s\""
 
-#: help.c:216
+#: help.c:214
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "git-kommandon från andra platser i din $PATH"
 
-#: help.c:232
+#: help.c:230
 msgid "The most commonly used git commands are:"
 msgstr "De mest använda git-kommandona är:"
 
@@ -556,7 +612,7 @@
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git: \"%s\" är inte ett git-kommando. Se \"git --help\"."
 
-#: help.c:384 help.c:443
+#: help.c:384 help.c:444
 msgid ""
 "\n"
 "Did you mean this?"
@@ -570,92 +626,100 @@
 "\n"
 "Menade du ett av dessa?"
 
-#: help.c:439
+#: help.c:440
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %s - %s"
 
-#: merge.c:56
-msgid "failed to read the cache"
-msgstr "misslyckads läsa cachen"
+#: lockfile.c:275
+msgid "BUG: reopen a lockfile that is still open"
+msgstr "FEL: återöppna en låsfil som fortfarande är öppen"
 
-#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
-#: builtin/clone.c:661
+#: lockfile.c:277
+msgid "BUG: reopen a lockfile that has been committed"
+msgstr "FEL: återöppna en låsfil som har överlämnats"
+
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "misslyckades läsa cachen"
+
+#: merge.c:94 builtin/checkout.c:356 builtin/checkout.c:562
+#: builtin/clone.c:659
 msgid "unable to write new index file"
 msgstr "kunde inte skriva ny indexfil"
 
-#: merge-recursive.c:190
+#: merge-recursive.c:189
 #, c-format
 msgid "(bad commit)\n"
 msgstr "(felaktig incheckning)\n"
 
-#: merge-recursive.c:208
+#: merge-recursive.c:209
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "addinfo_cache misslyckades för sökvägen \"%s\""
 
-#: merge-recursive.c:271
+#: merge-recursive.c:270
 msgid "error building trees"
 msgstr "fel vid byggande av träd"
 
-#: merge-recursive.c:675
+#: merge-recursive.c:691
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "misslyckades skapa sökvägen \"%s\"%s"
 
-#: merge-recursive.c:686
+#: merge-recursive.c:702
 #, 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:700 merge-recursive.c:721
+#: merge-recursive.c:716 merge-recursive.c:737
 msgid ": perhaps a D/F conflict?"
 msgstr ": kanske en K/F-konflikt?"
 
-#: merge-recursive.c:711
+#: merge-recursive.c:727
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "vägrar förlora ospårad fil vid \"%s\""
 
-#: merge-recursive.c:751
+#: merge-recursive.c:767
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "kan inte läsa objektet %s: \"%s\""
 
-#: merge-recursive.c:753
+#: merge-recursive.c:769
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "blob förväntades för %s \"%s\""
 
-#: merge-recursive.c:776 builtin/clone.c:317
+#: merge-recursive.c:792 builtin/clone.c:318
 #, c-format
 msgid "failed to open '%s'"
 msgstr "misslyckades öppna \"%s\""
 
-#: merge-recursive.c:784
+#: merge-recursive.c:800
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "misslyckades skapa symboliska länken \"%s\""
 
-#: merge-recursive.c:787
+#: merge-recursive.c:803
 #, 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:925
+#: merge-recursive.c:941
 msgid "Failed to execute internal merge"
 msgstr "Misslyckades exekvera intern sammanslagning"
 
-#: merge-recursive.c:929
+#: merge-recursive.c:945
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Kunde inte lägga till %s till databasen"
 
-#: merge-recursive.c:945
+#: merge-recursive.c:961
 msgid "unsupported object type in the tree"
 msgstr "objekttyp som ej stöds upptäcktes i trädet"
 
-#: merge-recursive.c:1024 merge-recursive.c:1038
+#: merge-recursive.c:1036 merge-recursive.c:1050
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -664,7 +728,7 @@
 "KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad "
 "i trädet."
 
-#: merge-recursive.c:1030 merge-recursive.c:1043
+#: merge-recursive.c:1042 merge-recursive.c:1055
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -673,20 +737,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:1084
+#: merge-recursive.c:1096
 msgid "rename"
 msgstr "namnbyte"
 
-#: merge-recursive.c:1084
+#: merge-recursive.c:1096
 msgid "renamed"
 msgstr "namnbytt"
 
-#: merge-recursive.c:1140
+#: merge-recursive.c:1152
 #, 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:1162
+#: merge-recursive.c:1174
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -695,195 +759,195 @@
 "KONFLIKT (namnbyte/namnbyte): Namnbyte \"%s\"->\"%s\" på grenen \"%s\" "
 "namnbyte \"%s\"->\"%s\" i \"%s\"%s"
 
-#: merge-recursive.c:1167
+#: merge-recursive.c:1179
 msgid " (left unresolved)"
 msgstr " (lämnad olöst)"
 
-#: merge-recursive.c:1221
+#: merge-recursive.c:1233
 #, 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:1251
+#: merge-recursive.c:1263
 #, 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:1450
+#: merge-recursive.c:1462
 #, 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:1460
+#: merge-recursive.c:1472
 #, c-format
 msgid "Adding merged %s"
 msgstr "Lägger till sammanslagen %s"
 
-#: merge-recursive.c:1465 merge-recursive.c:1663
+#: merge-recursive.c:1477 merge-recursive.c:1675
 #, c-format
 msgid "Adding as %s instead"
-msgstr "Lägger till som %s iställer"
+msgstr "Lägger till som %s istället"
 
-#: merge-recursive.c:1516
+#: merge-recursive.c:1528
 #, c-format
 msgid "cannot read object %s"
 msgstr "kan inte läsa objektet %s"
 
-#: merge-recursive.c:1519
+#: merge-recursive.c:1531
 #, c-format
 msgid "object %s is not a blob"
 msgstr "objektet %s är inte en blob"
 
-#: merge-recursive.c:1567
+#: merge-recursive.c:1579
 msgid "modify"
 msgstr "ändra"
 
-#: merge-recursive.c:1567
+#: merge-recursive.c:1579
 msgid "modified"
 msgstr "ändrad"
 
-#: merge-recursive.c:1577
+#: merge-recursive.c:1589
 msgid "content"
 msgstr "innehåll"
 
-#: merge-recursive.c:1584
+#: merge-recursive.c:1596
 msgid "add/add"
 msgstr "tillägg/tillägg"
 
-#: merge-recursive.c:1618
+#: merge-recursive.c:1630
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "Hoppade över %s (sammanslagen samma som befintlig)"
 
-#: merge-recursive.c:1632
+#: merge-recursive.c:1644
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Slår ihop %s automatiskt"
 
-#: merge-recursive.c:1636 git-submodule.sh:1149
+#: merge-recursive.c:1648 git-submodule.sh:1150
 msgid "submodule"
 msgstr "undermodul"
 
-#: merge-recursive.c:1637
+#: merge-recursive.c:1649
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "KONFLIKT (%s): Sammanslagningskonflikt i %s"
 
-#: merge-recursive.c:1727
+#: merge-recursive.c:1735
 #, c-format
 msgid "Removing %s"
 msgstr "Tar bort %s"
 
-#: merge-recursive.c:1752
+#: merge-recursive.c:1760
 msgid "file/directory"
 msgstr "fil/katalog"
 
-#: merge-recursive.c:1758
+#: merge-recursive.c:1766
 msgid "directory/file"
 msgstr "katalog/fil"
 
-#: merge-recursive.c:1763
+#: merge-recursive.c:1771
 #, 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:1773
+#: merge-recursive.c:1781
 #, c-format
 msgid "Adding %s"
 msgstr "Lägger till %s"
 
-#: merge-recursive.c:1790
+#: merge-recursive.c:1798
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Ödesdigert sammanslagningsfel, borde inte inträffa."
 
-#: merge-recursive.c:1809
+#: merge-recursive.c:1817
 msgid "Already up-to-date!"
 msgstr "Redan à jour!"
 
-#: merge-recursive.c:1818
+#: merge-recursive.c:1826
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "sammanslagning av träden %s och %s misslyckades"
 
-#: merge-recursive.c:1848
+#: merge-recursive.c:1856
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "Obehandlad sökväg??? %s"
 
-#: merge-recursive.c:1893
+#: merge-recursive.c:1901
 msgid "Merging:"
 msgstr "Slår ihop:"
 
-#: merge-recursive.c:1906
+#: merge-recursive.c:1914
 #, 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:1943
+#: merge-recursive.c:1951
 msgid "merge returned no commit"
 msgstr "sammanslagningen returnerade ingen incheckning"
 
-#: merge-recursive.c:2000
+#: merge-recursive.c:2008
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Kunde inte tolka objektet \"%s\""
 
-#: merge-recursive.c:2012 builtin/merge.c:668
+#: merge-recursive.c:2019 builtin/merge.c:666
 msgid "Unable to write index."
 msgstr "Kunde inte skriva indexet."
 
-#: notes-utils.c:40
+#: notes-utils.c:41
 msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr "Kan inte checka in oinitierat/orefererat anteckningsträd"
 
-#: notes-utils.c:81
+#: notes-utils.c:83
 #, c-format
 msgid "Bad notes.rewriteMode value: '%s'"
 msgstr "Felaktigt värde för notes.rewriteMode: '%s'"
 
-#: notes-utils.c:91
+#: notes-utils.c:93
 #, c-format
 msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
 msgstr "Vägrar skriva över anteckningar i %s (utanför refs/notes/)"
 
 #. TRANSLATORS: The first %s is the name of the
 #. environment variable, the second %s is its value
-#: notes-utils.c:118
+#: notes-utils.c:120
 #, c-format
 msgid "Bad %s value: '%s'"
 msgstr "Felaktigt värde på %s: \"%s\""
 
-#: object.c:229
+#: object.c:241
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "kunde inte tolka objektet: %s"
 
-#: parse-options.c:532
+#: parse-options.c:546
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:550
+#: parse-options.c:564
 #, 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:554
+#: parse-options.c:568
 #, c-format
 msgid "   or: %s"
 msgstr "     eller: %s"
 
-#: parse-options.c:557
+#: parse-options.c:571
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:591
+#: parse-options.c:605
 msgid "-NUM"
 msgstr "-TAL"
 
@@ -939,12 +1003,12 @@
 msgid "%s: pathspec magic not supported by this command: %s"
 msgstr "%s: sökvägsuttrycket hanteras inte av det här kommandot: %s"
 
-#: pathspec.c:433
+#: pathspec.c:432
 #, c-format
 msgid "pathspec '%s' is beyond a symbolic link"
 msgstr "sökvägsangivelsen \"%s\" är på andra sidan av en symbolisk länk"
 
-#: pathspec.c:442
+#: pathspec.c:441
 msgid ""
 "There is nothing to exclude from by :(exclude) patterns.\n"
 "Perhaps you forgot to add either ':/' or '.' ?"
@@ -952,11 +1016,15 @@
 "Ingenting att exkludera från med :(exkludera)-mönster.\n"
 "Glömde du kanske att antingen lägga till \":/\" eller \".\"?"
 
-#: progress.c:224
+#: pretty.c:968
+msgid "unable to parse --pretty format"
+msgstr "kunde inte tolka format för --pretty"
+
+#: progress.c:225
 msgid "done"
 msgstr "klart"
 
-#: read-cache.c:1238
+#: read-cache.c:1261
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -965,7 +1033,7 @@
 "index.version satt, men värdet är ogiltigt.\n"
 "Använder version %i"
 
-#: read-cache.c:1248
+#: read-cache.c:1271
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -974,51 +1042,51 @@
 "GIT_INDEX_VERSION satt, men värdet är ogiltigt.\n"
 "Använder version %i"
 
-#: remote.c:758
+#: remote.c:782
 #, 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:762
+#: remote.c:786
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s spårar vanligtvis %s, inte %s"
 
-#: remote.c:766
+#: remote.c:790
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s spårar både %s och %s"
 
-#: remote.c:774
+#: remote.c:798
 msgid "Internal error"
 msgstr "Internt fel"
 
-#: remote.c:1948
+#: remote.c:1968
 #, 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:1952
+#: remote.c:1972
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (använd \"git branch --unset-upstream\" för att rätta)\n"
 
-#: remote.c:1955
+#: remote.c:1975
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "Din gren är à jour med \"%s\".\n"
 
-#: remote.c:1959
+#: remote.c:1979
 #, 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:1965
+#: remote.c:1985
 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:1968
+#: remote.c:1988
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1028,11 +1096,11 @@
 msgstr[1] ""
 "Din gren ligger efter \"%s\" med %d incheckningar, och kan snabbspolas.\n"
 
-#: remote.c:1976
+#: remote.c:1996
 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:1979
+#: remote.c:1999
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1047,32 +1115,40 @@
 "Din gren och \"%s\" har divergerat,\n"
 "och har %d respektive %d olika incheckningar.\n"
 
-#: remote.c:1989
+#: remote.c:2009
 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"
 
-#: run-command.c:80
+#: run-command.c:87
 msgid "open /dev/null failed"
 msgstr "misslyckades öppna /dev/null"
 
-#: run-command.c:82
+#: run-command.c:89
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "dup2(%d,%d) misslyckades"
 
-#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
-#: builtin/merge.c:1009 builtin/merge.c:1019
+#: send-pack.c:265
+msgid "failed to sign the push certificate"
+msgstr "misslyckades underteckna push-certifikatet"
+
+#: send-pack.c:322
+msgid "the receiving end does not support --signed push"
+msgstr "mottagarsidan stöder inte push med --signed"
+
+#: sequencer.c:172 builtin/merge.c:781 builtin/merge.c:892
+#: builtin/merge.c:1002 builtin/merge.c:1012
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "Kunde inte öppna \"%s\" för skrivning"
 
-#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
-#: builtin/merge.c:1011 builtin/merge.c:1024
+#: sequencer.c:174 builtin/merge.c:343 builtin/merge.c:784
+#: builtin/merge.c:1004 builtin/merge.c:1017
 #, c-format
 msgid "Could not write to '%s'"
 msgstr "Kunde inte skriva till \"%s\""
 
-#: sequencer.c:229
+#: sequencer.c:195
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'"
@@ -1080,7 +1156,7 @@
 "efter att ha löst konflikterna, markera de rättade sökvägarna\n"
 "med \"git add <sökvägar>\" eller \"git rm <sökvägar>\""
 
-#: sequencer.c:232
+#: sequencer.c:198
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'\n"
@@ -1090,224 +1166,224 @@
 "med \"git add <sökvägar>\" eller \"git rm <sökvägar>\"\n"
 "och checka in resultatet med \"git commit\""
 
-#: sequencer.c:245 sequencer.c:879 sequencer.c:962
+#: sequencer.c:211 sequencer.c:852 sequencer.c:935
 #, c-format
 msgid "Could not write to %s"
 msgstr "Kunde inte skriva till %s"
 
-#: sequencer.c:248
+#: sequencer.c:214
 #, c-format
 msgid "Error wrapping up %s"
 msgstr "Fel vid ombrytning av %s"
 
-#: sequencer.c:263
+#: sequencer.c:229
 msgid "Your local changes would be overwritten by cherry-pick."
 msgstr "Dina lokala ändringar skulle skrivas över av \"cherry-pick\"."
 
-#: sequencer.c:265
+#: sequencer.c:231
 msgid "Your local changes would be overwritten by revert."
 msgstr "Dina lokala ändringar skulle skrivas över av \"revert\"."
 
-#: sequencer.c:268
+#: sequencer.c:234
 msgid "Commit your changes or stash them to proceed."
 msgstr "Checka in dina ändringar eller använd \"stash\" för att fortsätta."
 
 #. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:325
+#: sequencer.c:304
 #, c-format
 msgid "%s: Unable to write new index file"
 msgstr "%s: Kunde inte skriva ny indexfil"
 
-#: sequencer.c:356
+#: sequencer.c:335
 msgid "Could not resolve HEAD commit\n"
 msgstr "Kunde inte bestämma HEAD:s incheckning\n"
 
-#: sequencer.c:378
+#: sequencer.c:355
 msgid "Unable to update cache tree\n"
 msgstr "Kan inte uppdatera cacheträd\n"
 
-#: sequencer.c:430
+#: sequencer.c:402
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr "Kunde inte tolka incheckningen %s\n"
 
-#: sequencer.c:435
+#: sequencer.c:407
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr "Kunde inte tolka föräldraincheckningen %s\n"
 
-#: sequencer.c:501
+#: sequencer.c:473
 msgid "Your index file is unmerged."
 msgstr "Din indexfil har inte slagits ihop."
 
-#: sequencer.c:520
+#: sequencer.c:492
 #, c-format
 msgid "Commit %s is a merge but no -m option was given."
 msgstr "Incheckning %s är en sammanslagning, men flaggan -m angavs inte."
 
-#: sequencer.c:528
+#: sequencer.c:500
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr "Incheckning %s har inte förälder %d"
 
-#: sequencer.c:532
+#: sequencer.c:504
 #, c-format
 msgid "Mainline was specified but commit %s is not a merge."
 msgstr "Huvudlinje angavs, men incheckningen %s är inte en sammanslagning"
 
 #. TRANSLATORS: The first %s will be "revert" or
 #. "cherry-pick", the second %s a SHA1
-#: sequencer.c:545
+#: sequencer.c:517
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s: kan inte tolka föräldraincheckningen %s"
 
-#: sequencer.c:549
+#: sequencer.c:521
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr "Kan inte hämta incheckningsmeddelande för %s"
 
-#: sequencer.c:635
+#: sequencer.c:607
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "kunde inte ångra %s... %s"
 
-#: sequencer.c:636
+#: sequencer.c:608
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "kunde inte tillämpa %s... %s"
 
-#: sequencer.c:672
+#: sequencer.c:644
 msgid "empty commit set passed"
 msgstr "den angivna uppsättningen incheckningar är tom"
 
-#: sequencer.c:680
+#: sequencer.c:652
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s: misslyckades läsa indexet"
 
-#: sequencer.c:685
+#: sequencer.c:656
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s: misslyckades uppdatera indexet"
 
-#: sequencer.c:743
+#: sequencer.c:716
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr "kan inte %s under en %s"
 
-#: sequencer.c:765
+#: sequencer.c:738
 #, c-format
 msgid "Could not parse line %d."
 msgstr "Kan inte tolka rad %d."
 
-#: sequencer.c:770
+#: sequencer.c:743
 msgid "No commits parsed."
 msgstr "Inga incheckningar lästes."
 
-#: sequencer.c:783
+#: sequencer.c:756
 #, c-format
 msgid "Could not open %s"
 msgstr "Kunde inte öppna %s"
 
-#: sequencer.c:787
+#: sequencer.c:760
 #, c-format
 msgid "Could not read %s."
 msgstr "kunde inte läsa %s."
 
-#: sequencer.c:794
+#: sequencer.c:767
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr "Oanvändbart manus: %s"
 
-#: sequencer.c:824
+#: sequencer.c:797
 #, c-format
 msgid "Invalid key: %s"
 msgstr "Felaktig nyckel: %s"
 
-#: sequencer.c:827
+#: sequencer.c:800
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr "Felaktigt värde för %s: %s"
 
-#: sequencer.c:839
+#: sequencer.c:812
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr "Trasigt manus: %s"
 
-#: sequencer.c:860
+#: sequencer.c:833
 msgid "a cherry-pick or revert is already in progress"
 msgstr "en \"cherry-pick\" eller \"revert\" pågår redan"
 
-#: sequencer.c:861
+#: sequencer.c:834
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr "testa \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: sequencer.c:865
+#: sequencer.c:838
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr "Kunde inte skapa \"sequencer\"-katalogen \"%s\""
 
-#: sequencer.c:881 sequencer.c:966
+#: sequencer.c:854 sequencer.c:939
 #, c-format
 msgid "Error wrapping up %s."
 msgstr "Fel vid ombrytning av %s."
 
-#: sequencer.c:900 sequencer.c:1036
+#: sequencer.c:873 sequencer.c:1009
 msgid "no cherry-pick or revert in progress"
 msgstr "ingen \"cherry-pick\" eller \"revert\" pågår"
 
-#: sequencer.c:902
+#: sequencer.c:875
 msgid "cannot resolve HEAD"
 msgstr "kan inte bestämma HEAD"
 
-#: sequencer.c:904
+#: sequencer.c:877
 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:926 builtin/apply.c:4061
+#: sequencer.c:899 builtin/apply.c:4128
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "kan inte öppna %s: %s"
 
-#: sequencer.c:929
+#: sequencer.c:902
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "kan inte läsa %s: %s"
 
-#: sequencer.c:930
+#: sequencer.c:903
 msgid "unexpected end of file"
 msgstr "oväntat filslut"
 
-#: sequencer.c:936
+#: sequencer.c:909
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr "sparad HEAD-fil från före \"cherry-pick\", \"%s\", är trasig"
 
-#: sequencer.c:959
+#: sequencer.c:932
 #, c-format
 msgid "Could not format %s."
 msgstr "Kunde inte formatera %s."
 
-#: sequencer.c:1104
+#: sequencer.c:1077
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr "%s: kan inte göra \"cherry-pick\" på typen \"%s\""
 
-#: sequencer.c:1107
+#: sequencer.c:1080
 #, c-format
 msgid "%s: bad revision"
 msgstr "%s: felaktig revision"
 
-#: sequencer.c:1141
+#: sequencer.c:1114
 msgid "Can't revert as initial commit"
 msgstr "Kan inte ångra som första incheckning"
 
-#: sequencer.c:1142
+#: sequencer.c:1115
 msgid "Can't cherry-pick into empty head"
 msgstr "Kan inte göra \"cherry-pick\" i ett tomt huvud"
 
-#: sha1_name.c:439
+#: sha1_name.c:440
 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"
@@ -1329,21 +1405,21 @@
 "Undersök referenserna och ta kanske bort dem. Stäng av meddelandet\n"
 "genom att köra \"git config advice.objectNameWarning false\""
 
-#: sha1_name.c:1072
+#: sha1_name.c:1068
 msgid "HEAD does not point to a branch"
 msgstr "HEAD pekar inte på en gren"
 
-#: sha1_name.c:1075
+#: sha1_name.c:1071
 #, c-format
 msgid "No such branch: '%s'"
 msgstr "Okänd gren: \"%s\""
 
-#: sha1_name.c:1077
+#: sha1_name.c:1073
 #, c-format
 msgid "No upstream configured for branch '%s'"
 msgstr "Ingen standarduppström angiven för grenen \"%s\""
 
-#: sha1_name.c:1081
+#: sha1_name.c:1077
 #, 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"
@@ -1373,17 +1449,42 @@
 msgid "staging updated .gitmodules failed"
 msgstr "misslyckades köa uppdaterad .gitmodules"
 
-#: submodule.c:1121 builtin/init-db.c:363
+#: submodule.c:1111 builtin/init-db.c:363
 #, c-format
 msgid "Could not create git link %s"
 msgstr "Kunde inte skapa gitlänk %s"
 
-#: submodule.c:1132
+#: submodule.c:1122
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "Kunde inte sätta core.worktree i %s"
 
-#: unpack-trees.c:206
+#: trailer.c:500 trailer.c:504 trailer.c:508 trailer.c:562 trailer.c:566
+#: trailer.c:570
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "okänt värde \"%s\" för nyckeln \"%s\""
+
+#: trailer.c:552 trailer.c:557 builtin/remote.c:288
+#, c-format
+msgid "more than one %s"
+msgstr "mer än en %s"
+
+#: trailer.c:587
+#, c-format
+msgid "empty trailer token in trailer '%s'"
+msgstr "tom släpradssymbol i släpraden \"%s\""
+
+#: trailer.c:706
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "kunde inte läsa indatafilen \"%s\""
+
+#: trailer.c:709
+msgid "could not read from stdin"
+msgstr "Kunde inte läsa från standard in"
+
+#: unpack-trees.c:202
 msgid "Checking out files"
 msgstr "Checkar ut filer"
 
@@ -1414,27 +1515,31 @@
 
 #: urlmatch.c:322
 msgid "invalid '..' path segment"
-msgstr "felaktit \"..\"-sökvägssegment"
+msgstr "felaktigt \"..\"-sökvägssegment"
 
-#: wrapper.c:422
+#: wrapper.c:509
 #, c-format
 msgid "unable to access '%s': %s"
 msgstr "kan inte komma åt \"%s\": %s"
 
-#: wrapper.c:443
+#: wrapper.c:530
 #, c-format
 msgid "unable to access '%s'"
 msgstr "kan inte komma åt \"%s\""
 
-#: wrapper.c:454
+#: wrapper.c:541
 #, 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:455
+#: wrapper.c:542
 msgid "no such user"
 msgstr "okänd användare"
 
+#: wrapper.c:550
+msgid "unable to get current working directory"
+msgstr "kan inte hämta aktuell arbetskatalog"
+
 #: wt-status.c:150
 msgid "Unmerged paths:"
 msgstr "Ej sammanslagna sökvägar:"
@@ -1578,15 +1683,15 @@
 msgid "bug: unhandled diff status %c"
 msgstr "programfel: diff-status %c ej hanterad"
 
-#: wt-status.c:765
+#: wt-status.c:761
 msgid "Submodules changed but not updated:"
 msgstr "Undermoduler ändrade men inte uppdaterade:"
 
-#: wt-status.c:767
+#: wt-status.c:763
 msgid "Submodule changes to be committed:"
 msgstr "Undermodulers ändringar att checka in:"
 
-#: wt-status.c:846
+#: wt-status.c:842
 msgid ""
 "Do not touch the line above.\n"
 "Everything below will be removed."
@@ -1594,68 +1699,68 @@
 "Rör inte raden ovan.\n"
 "Allt nedan kommer tas bort."
 
-#: wt-status.c:937
+#: wt-status.c:933
 msgid "You have unmerged paths."
 msgstr "Du har ej sammanslagna sökvägar."
 
-#: wt-status.c:940
+#: wt-status.c:936
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr "  (rätta konflikter och kör \"git commit\")"
 
-#: wt-status.c:943
+#: wt-status.c:939
 msgid "All conflicts fixed but you are still merging."
 msgstr "Alla konflikter har rättats men du är fortfarande i en sammanslagning."
 
-#: wt-status.c:946
+#: wt-status.c:942
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr "  (använd \"git commit\" för att slutföra sammanslagningen)"
 
-#: wt-status.c:956
+#: wt-status.c:952
 msgid "You are in the middle of an am session."
 msgstr "Du är i mitten av en körning av \"git am\"."
 
-#: wt-status.c:959
+#: wt-status.c:955
 msgid "The current patch is empty."
 msgstr "Aktuell patch är tom."
 
-#: wt-status.c:963
+#: wt-status.c:959
 msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr "  (rätta konflikter och kör sedan \"git am --continue\")"
 
-#: wt-status.c:965
+#: wt-status.c:961
 msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr "  (använd \"git am --skip\" för att hoppa över patchen)"
 
-#: wt-status.c:967
+#: wt-status.c:963
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr "  (använd \"git am --abort\" för att återställa ursprungsgrenen)"
 
-#: wt-status.c:1027 wt-status.c:1044
+#: wt-status.c:1023 wt-status.c:1040
 #, c-format
 msgid "You are currently rebasing branch '%s' on '%s'."
 msgstr "Du håller på att ombasera grenen \"%s\" ovanpå \"%s\"."
 
-#: wt-status.c:1032 wt-status.c:1049
+#: wt-status.c:1028 wt-status.c:1045
 msgid "You are currently rebasing."
 msgstr "Du håller på med en ombasering."
 
-#: wt-status.c:1035
+#: wt-status.c:1031
 msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr "  (rätta konflikter och kör sedan \"git rebase --continue\")"
 
-#: wt-status.c:1037
+#: wt-status.c:1033
 msgid "  (use \"git rebase --skip\" to skip this patch)"
 msgstr "  (använd \"git rebase --skip\" för att hoppa över patchen)"
 
-#: wt-status.c:1039
+#: wt-status.c:1035
 msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr "  (använd \"git rebase --abort\" för att checka ut ursprungsgrenen)"
 
-#: wt-status.c:1052
+#: wt-status.c:1048
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr "  (alla konflikter rättade: kör \"git rebase --continue\")"
 
-#: wt-status.c:1056
+#: wt-status.c:1052
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
@@ -1663,118 +1768,118 @@
 "Du håller på att dela upp en incheckning medan du ombaserar grenen \"%s\" "
 "ovanpå \"%s\"."
 
-#: wt-status.c:1061
+#: wt-status.c:1057
 msgid "You are currently splitting a commit during a rebase."
 msgstr "Du håller på att dela upp en incheckning i en ombasering."
 
-#: wt-status.c:1064
+#: wt-status.c:1060
 msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr "  (Så fort din arbetskatalog är ren, kör \"git rebase --continue\")"
 
-#: wt-status.c:1068
+#: wt-status.c:1064
 #, c-format
 msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr ""
 "Du håller på att redigera en incheckning medan du ombaserar grenen \"%s\" "
 "ovanpå \"%s\"."
 
-#: wt-status.c:1073
+#: wt-status.c:1069
 msgid "You are currently editing a commit during a rebase."
 msgstr "Du håller på att redigera en incheckning under en ombasering."
 
-#: wt-status.c:1076
+#: wt-status.c:1072
 msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr ""
 "  (använd \"git commit --amend\" för att lägga till på aktuell incheckning)"
 
-#: wt-status.c:1078
+#: wt-status.c:1074
 msgid ""
 "  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr "  (använd \"git rebase --continue\" när du är nöjd med dina ändringar)"
 
-#: wt-status.c:1088
+#: wt-status.c:1084
 #, c-format
 msgid "You are currently cherry-picking commit %s."
 msgstr "Du håller på med en \"cherry-pick\" av incheckningen %s."
 
-#: wt-status.c:1093
+#: wt-status.c:1089
 msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
 msgstr "  (rätta konflikter och kör sedan \"git cherry-pick --continue\")"
 
-#: wt-status.c:1096
+#: wt-status.c:1092
 msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr "  (alla konflikter rättade: kör \"git cherry-pick --continue\")"
 
-#: wt-status.c:1098
+#: wt-status.c:1094
 msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr ""
 "  (använd \"git cherry-pick --abort\" för att avbryta \"cherry-pick\"-"
 "operationen)"
 
-#: wt-status.c:1107
+#: wt-status.c:1103
 #, c-format
 msgid "You are currently reverting commit %s."
 msgstr "Du håller på med att ångra incheckningen %s."
 
-#: wt-status.c:1112
+#: wt-status.c:1108
 msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr "  (rätta konflikter och kör sedan \"git revert --continue\")"
 
-#: wt-status.c:1115
+#: wt-status.c:1111
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr "  (alla konflikter rättade: kör \"git revert --continue\")"
 
-#: wt-status.c:1117
+#: wt-status.c:1113
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr "  (använd \"git revert --abort\" för att avbryta ångrandet)"
 
-#: wt-status.c:1128
+#: wt-status.c:1124
 #, c-format
 msgid "You are currently bisecting, started from branch '%s'."
 msgstr "Du håller på med en \"bisect\", startad från grenen \"%s\"."
 
-#: wt-status.c:1132
+#: wt-status.c:1128
 msgid "You are currently bisecting."
 msgstr "Du håller på med en \"bisect\"."
 
-#: wt-status.c:1135
+#: wt-status.c:1131
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr ""
 "  (använd \"git bisect reset\" för att komma tillbaka till ursprungsgrenen)"
 
-#: wt-status.c:1310
+#: wt-status.c:1306
 msgid "On branch "
 msgstr "På grenen "
 
-#: wt-status.c:1317
+#: wt-status.c:1313
 msgid "rebase in progress; onto "
 msgstr "ombasering pågår; ovanpå"
 
-#: wt-status.c:1324
+#: wt-status.c:1320
 msgid "HEAD detached at "
 msgstr "HEAD frånkopplad vid "
 
-#: wt-status.c:1326
+#: wt-status.c:1322
 msgid "HEAD detached from "
 msgstr "HEAD frånkopplad från "
 
-#: wt-status.c:1329
+#: wt-status.c:1325
 msgid "Not currently on any branch."
 msgstr "Inte på någon gren för närvarande."
 
-#: wt-status.c:1346
+#: wt-status.c:1342
 msgid "Initial commit"
 msgstr "Första incheckning"
 
-#: wt-status.c:1360
+#: wt-status.c:1356
 msgid "Untracked files"
 msgstr "Ospårade filer"
 
-#: wt-status.c:1362
+#: wt-status.c:1358
 msgid "Ignored files"
 msgstr "Ignorerade filer"
 
-#: wt-status.c:1366
+#: wt-status.c:1362
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1786,32 +1891,32 @@
 "lägga till nya filer själv (se \"git help status\")."
 
 # %s är nästa sträng eller tom.
-#: wt-status.c:1372
+#: wt-status.c:1368
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr "Ospårade filer visas ej%s"
 
-#: wt-status.c:1374
+#: wt-status.c:1370
 msgid " (use -u option to show untracked files)"
 msgstr " (använd flaggan -u för att visa ospårade filer)"
 
-#: wt-status.c:1380
+#: wt-status.c:1376
 msgid "No changes"
 msgstr "Inga ändringar"
 
-#: wt-status.c:1385
+#: wt-status.c:1381
 #, c-format
 msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr ""
 "inga ändringar att checka in (använd \"git add\" och/eller \"git commit -a"
 "\")\n"
 
-#: wt-status.c:1388
+#: wt-status.c:1384
 #, c-format
 msgid "no changes added to commit\n"
 msgstr "inga ändringar att checka in\n"
 
-#: wt-status.c:1391
+#: wt-status.c:1387
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
@@ -1820,93 +1925,93 @@
 "inget köat för incheckning, men ospårade filer finns (spåra med \"git add"
 "\")\n"
 
-#: wt-status.c:1394
+#: wt-status.c:1390
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
 msgstr "inget köat för incheckning, men ospårade filer finns\n"
 
-#: wt-status.c:1397
+#: wt-status.c:1393
 #, c-format
 msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr "inget att checka in (skapa/kopiera filer och spåra med \"git add\")\n"
 
-#: wt-status.c:1400 wt-status.c:1405
+#: wt-status.c:1396 wt-status.c:1401
 #, c-format
 msgid "nothing to commit\n"
 msgstr "inget att checka in\n"
 
-#: wt-status.c:1403
+#: wt-status.c:1399
 #, c-format
 msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr "inget att checka in (använd -u för att visa ospårade filer)\n"
 
-#: wt-status.c:1407
+#: wt-status.c:1403
 #, c-format
 msgid "nothing to commit, working directory clean\n"
 msgstr "inget att checka in, arbetskatalogen ren\n"
 
-#: wt-status.c:1516
+#: wt-status.c:1512
 msgid "HEAD (no branch)"
 msgstr "HEAD (ingen gren)"
 
-#: wt-status.c:1522
+#: wt-status.c:1518
 msgid "Initial commit on "
 msgstr "Första incheckning på "
 
-#: wt-status.c:1554
+#: wt-status.c:1550
 msgid "gone"
 msgstr "försvunnen"
 
-#: wt-status.c:1556 wt-status.c:1564
+#: wt-status.c:1552 wt-status.c:1560
 msgid "behind "
 msgstr "efter "
 
-#: compat/precompose_utf8.c:55 builtin/clone.c:356
+#: compat/precompose_utf8.c:55 builtin/clone.c:357
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "misslyckades ta bort länken \"%s\""
 
-#: builtin/add.c:21
+#: builtin/add.c:22
 msgid "git add [options] [--] <pathspec>..."
 msgstr "git add [flaggor] [--] <sökväg>..."
 
-#: builtin/add.c:64
+#: builtin/add.c:65
 #, c-format
 msgid "unexpected diff status %c"
 msgstr "diff-status %c förväntades inte"
 
-#: builtin/add.c:69 builtin/commit.c:261
+#: builtin/add.c:70 builtin/commit.c:275
 msgid "updating files failed"
 msgstr "misslyckades uppdatera filer"
 
-#: builtin/add.c:79
+#: builtin/add.c:80
 #, c-format
 msgid "remove '%s'\n"
 msgstr "ta bort \"%s\"\n"
 
-#: builtin/add.c:133
+#: builtin/add.c:134
 msgid "Unstaged changes after refreshing the index:"
 msgstr "Ospårade ändringar efter att ha uppdaterat indexet:"
 
-#: builtin/add.c:193
+#: builtin/add.c:194 builtin/rev-parse.c:785
 msgid "Could not read the index"
 msgstr "Kunde inte läsa indexet"
 
-#: builtin/add.c:204
+#: builtin/add.c:205
 #, c-format
 msgid "Could not open '%s' for writing."
 msgstr "Kunde inte öppna \"%s\" för skrivning"
 
-#: builtin/add.c:208
+#: builtin/add.c:209
 msgid "Could not write patch"
 msgstr "Kunde inte skriva patch"
 
-#: builtin/add.c:213
+#: builtin/add.c:214
 #, c-format
 msgid "Could not stat '%s'"
 msgstr "Kunde inte ta status på \"%s\""
 
-#: builtin/add.c:215
+#: builtin/add.c:216
 msgid "Empty patch. Aborted."
 msgstr "Tom patch. Avbryter."
 
@@ -1919,15 +2024,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:248 builtin/clean.c:876 builtin/fetch.c:93 builtin/mv.c:70
-#: builtin/prune-packed.c:77 builtin/push.c:489 builtin/remote.c:1344
+#: builtin/add.c:248 builtin/clean.c:875 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/prune-packed.c:55 builtin/push.c:499 builtin/remote.c:1375
 #: builtin/rm.c:269
 msgid "dry run"
 msgstr "testkörning"
 
-#: builtin/add.c:249 builtin/apply.c:4410 builtin/check-ignore.c:19
-#: builtin/commit.c:1256 builtin/count-objects.c:95 builtin/fsck.c:612
-#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113
+#: builtin/add.c:249 builtin/apply.c:4415 builtin/check-ignore.c:19
+#: builtin/commit.c:1362 builtin/count-objects.c:63 builtin/fsck.c:608
+#: builtin/log.c:1617 builtin/mv.c:109 builtin/read-tree.c:114
 msgid "be verbose"
 msgstr "var pratsam"
 
@@ -1935,7 +2040,7 @@
 msgid "interactive picking"
 msgstr "plocka interaktivt"
 
-#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:286
 msgid "select hunks interactively"
 msgstr "välj stycken interaktivt"
 
@@ -1988,93 +2093,93 @@
 msgid "adding files failed"
 msgstr "misslyckades lägga till filer"
 
-#: builtin/add.c:330
+#: builtin/add.c:329
 msgid "-A and -u are mutually incompatible"
 msgstr "-A och -u är ömsesidigt inkompatibla"
 
-#: builtin/add.c:337
+#: builtin/add.c:336
 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:357
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Inget angivet, inget tillagt.\n"
 
-#: builtin/add.c:359
+#: builtin/add.c:358
 #, 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:920
-#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:234 builtin/rm.c:299
+#: builtin/add.c:363 builtin/check-ignore.c:172 builtin/clean.c:919
+#: builtin/commit.c:333 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:299
 msgid "index file corrupt"
 msgstr "indexfilen trasig"
 
-#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
+#: builtin/add.c:446 builtin/apply.c:4510 builtin/mv.c:279 builtin/rm.c:431
 msgid "Unable to write new index file"
 msgstr "Kunde inte skriva ny indexfil"
 
-#: builtin/apply.c:57
+#: builtin/apply.c:58
 msgid "git apply [options] [<patch>...]"
 msgstr "git apply [flaggor] [<patch>...]"
 
-#: builtin/apply.c:110
+#: builtin/apply.c:111
 #, c-format
 msgid "unrecognized whitespace option '%s'"
 msgstr "okänt alternativ för whitespace: \"%s\""
 
-#: builtin/apply.c:125
+#: builtin/apply.c:126
 #, c-format
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "okänt alternativ för ignore-whitespace: \"%s\""
 
-#: builtin/apply.c:823
+#: builtin/apply.c:826
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr "Kan inte förbereda reguljärt uttryck för tidsstämpeln %s"
 
-#: builtin/apply.c:832
+#: builtin/apply.c:835
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr "regexec returnerade %d för indata: %s"
 
-#: builtin/apply.c:913
+#: builtin/apply.c:916
 #, 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:945
+#: builtin/apply.c:948
 #, 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:949
+#: builtin/apply.c:952
 #, 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:950
+#: builtin/apply.c:953
 #, 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:957
+#: builtin/apply.c:960
 #, 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:1422
+#: builtin/apply.c:1423
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "recount: förväntade rad: %.*s"
 
-#: builtin/apply.c:1479
+#: builtin/apply.c:1480
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr "patch-fragment utan huvud på rad %d: %.*s"
 
-#: builtin/apply.c:1496
+#: builtin/apply.c:1497
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -2090,77 +2195,77 @@
 "sökvägskomponenter\n"
 "tas bort (rad %d)"
 
-#: builtin/apply.c:1656
+#: builtin/apply.c:1657
 msgid "new file depends on old contents"
 msgstr "ny fil beror på gammalt innehåll"
 
-#: builtin/apply.c:1658
+#: builtin/apply.c:1659
 msgid "deleted file still has contents"
 msgstr "borttagen fil har fortfarande innehåll"
 
-#: builtin/apply.c:1684
+#: builtin/apply.c:1685
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "trasig patch på rad %d"
 
-#: builtin/apply.c:1720
+#: builtin/apply.c:1721
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "nya filen %s beror på gammalt innehåll"
 
-#: builtin/apply.c:1722
+#: builtin/apply.c:1723
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "borttagna filen %s har fortfarande innehåll"
 
-#: builtin/apply.c:1725
+#: builtin/apply.c:1726
 #, 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:1871
+#: builtin/apply.c:1872
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "trasig binärpatch på rad %d: %.*s"
 
-#: builtin/apply.c:1900
+#: builtin/apply.c:1901
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "binärpatchen på rad %d känns inte igen"
 
-#: builtin/apply.c:1986
+#: builtin/apply.c:2052
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "patch med bara skräp på rad %d"
 
-#: builtin/apply.c:2076
+#: builtin/apply.c:2142
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "kunde inte läsa symboliska länken %s"
 
-#: builtin/apply.c:2080
+#: builtin/apply.c:2146
 #, c-format
 msgid "unable to open or read %s"
 msgstr "kunde inte öppna eller läsa %s"
 
-#: builtin/apply.c:2688
+#: builtin/apply.c:2754
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "felaktig inledning på rad: \"%c\""
 
-#: builtin/apply.c:2806
+#: builtin/apply.c:2872
 #, 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:2818
+#: builtin/apply.c:2884
 #, 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:2824
+#: builtin/apply.c:2890
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -2169,317 +2274,317 @@
 "vid sökning efter:\n"
 "%.*s"
 
-#: builtin/apply.c:2843
+#: builtin/apply.c:2909
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "saknar binära patchdata för \"%s\""
 
-#: builtin/apply.c:2946
+#: builtin/apply.c:3010
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "binärpatchen kan inte tillämpas på \"%s\""
 
-#: builtin/apply.c:2952
+#: builtin/apply.c:3016
 #, 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:2973
+#: builtin/apply.c:3037
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "patch misslyckades: %s:%ld"
 
-#: builtin/apply.c:3095
+#: builtin/apply.c:3161
 #, c-format
 msgid "cannot checkout %s"
 msgstr "kan inte checka ut %s"
 
-#: builtin/apply.c:3140 builtin/apply.c:3149 builtin/apply.c:3194
+#: builtin/apply.c:3206 builtin/apply.c:3215 builtin/apply.c:3260
 #, c-format
 msgid "read of %s failed"
 msgstr "misslyckades läsa %s"
 
-#: builtin/apply.c:3174 builtin/apply.c:3396
+#: builtin/apply.c:3240 builtin/apply.c:3462
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "sökvägen %s har ändrat namn/tagits bort"
 
-#: builtin/apply.c:3255 builtin/apply.c:3410
+#: builtin/apply.c:3321 builtin/apply.c:3476
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "%s: finns inte i indexet"
 
-#: builtin/apply.c:3259 builtin/apply.c:3402 builtin/apply.c:3424
+#: builtin/apply.c:3325 builtin/apply.c:3468 builtin/apply.c:3490
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: builtin/apply.c:3264 builtin/apply.c:3418
+#: builtin/apply.c:3330 builtin/apply.c:3484
 #, c-format
 msgid "%s: does not match index"
 msgstr "%s: motsvarar inte indexet"
 
-#: builtin/apply.c:3366
+#: builtin/apply.c:3432
 msgid "removal patch leaves file contents"
 msgstr "patch för borttagning lämnar kvar filinnehåll"
 
-#: builtin/apply.c:3435
+#: builtin/apply.c:3501
 #, c-format
 msgid "%s: wrong type"
 msgstr "%s: fel typ"
 
-#: builtin/apply.c:3437
+#: builtin/apply.c:3503
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "%s har typen %o, förväntade %o"
 
-#: builtin/apply.c:3538
+#: builtin/apply.c:3604
 #, c-format
 msgid "%s: already exists in index"
 msgstr "%s: finns redan i indexet"
 
-#: builtin/apply.c:3541
+#: builtin/apply.c:3607
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "%s: finns redan i arbetskatalogen"
 
-#: builtin/apply.c:3561
+#: builtin/apply.c:3627
 #, 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:3566
+#: builtin/apply.c:3632
 #, 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:3574
+#: builtin/apply.c:3640
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "%s: patchen kan inte tillämpas"
 
-#: builtin/apply.c:3587
+#: builtin/apply.c:3653
 #, c-format
 msgid "Checking patch %s..."
 msgstr "Kontrollerar patchen %s..."
 
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
+#: builtin/apply.c:3746 builtin/checkout.c:213 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:3823
+#: builtin/apply.c:3889
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "kan inte ta bort %s från indexet"
 
-#: builtin/apply.c:3851
+#: builtin/apply.c:3918
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr "trasig patch för undermodulen %s"
 
-#: builtin/apply.c:3855
+#: builtin/apply.c:3922
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr "kan inte ta status på nyligen skapade filen \"%s\""
 
-#: builtin/apply.c:3860
+#: builtin/apply.c:3927
 #, 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:3863 builtin/apply.c:3971
+#: builtin/apply.c:3930 builtin/apply.c:4038
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "kan inte lägga till cachepost för %s"
 
-#: builtin/apply.c:3896
+#: builtin/apply.c:3963
 #, c-format
 msgid "closing file '%s'"
 msgstr "stänger filen \"%s\""
 
-#: builtin/apply.c:3945
+#: builtin/apply.c:4012
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "kan inte skriva filen \"%s\" läge %o"
 
-#: builtin/apply.c:4032
+#: builtin/apply.c:4099
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "Tillämpade patchen %s rent."
 
-#: builtin/apply.c:4040
+#: builtin/apply.c:4107
 msgid "internal error"
 msgstr "internt fel"
 
-#: builtin/apply.c:4043
+#: builtin/apply.c:4110
 #, 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:4053
+#: builtin/apply.c:4120
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "trunkerar .rej-filnamnet till %.*s.rej"
 
-#: builtin/apply.c:4074
+#: builtin/apply.c:4141
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "Stycke %d tillämpades rent."
 
-#: builtin/apply.c:4077
+#: builtin/apply.c:4144
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "Refuserar stycke %d."
 
-#: builtin/apply.c:4227
+#: builtin/apply.c:4234
 msgid "unrecognized input"
 msgstr "indata känns inte igen"
 
-#: builtin/apply.c:4238
+#: builtin/apply.c:4245
 msgid "unable to read index file"
 msgstr "kan inte läsa indexfilen"
 
-#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90
-#: builtin/fetch.c:78
+#: builtin/apply.c:4362 builtin/apply.c:4365 builtin/clone.c:91
+#: builtin/fetch.c:93
 msgid "path"
 msgstr "sökväg"
 
-#: builtin/apply.c:4358
+#: builtin/apply.c:4363
 msgid "don't apply changes matching the given path"
 msgstr "tillämpa inte ändringar som motsvarar given sökväg"
 
-#: builtin/apply.c:4361
+#: builtin/apply.c:4366
 msgid "apply changes matching the given path"
 msgstr "tillämpa ändringar som motsvarar given sökväg"
 
-#: builtin/apply.c:4363
+#: builtin/apply.c:4368
 msgid "num"
 msgstr "antal"
 
-#: builtin/apply.c:4364
+#: builtin/apply.c:4369
 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:4367
+#: builtin/apply.c:4372
 msgid "ignore additions made by the patch"
 msgstr "ignorera tillägg gjorda av patchen"
 
-#: builtin/apply.c:4369
+#: builtin/apply.c:4374
 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:4373
+#: builtin/apply.c:4378
 msgid "show number of added and deleted lines in decimal notation"
 msgstr "visa antal tillagda och borttagna rader decimalt"
 
-#: builtin/apply.c:4375
+#: builtin/apply.c:4380
 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:4377
+#: builtin/apply.c:4382
 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:4379
+#: builtin/apply.c:4384
 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:4381
+#: builtin/apply.c:4386
 msgid "apply a patch without touching the working tree"
 msgstr "tillämpa en patch utan att röra arbetskatalogen"
 
-#: builtin/apply.c:4383
+#: builtin/apply.c:4388
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr "tillämpa också patchen (använd med --stat/--summary/--check)"
 
-#: builtin/apply.c:4385
+#: builtin/apply.c:4390
 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:4387
+#: builtin/apply.c:4392
 msgid "build a temporary index based on embedded index information"
 msgstr "bygg ett temporärt index baserat på inbyggd indexinformation"
 
-#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
+#: builtin/apply.c:4394 builtin/checkout-index.c:198 builtin/ls-files.c:455
 msgid "paths are separated with NUL character"
 msgstr "sökvägar avdelas med NUL-tecken"
 
-#: builtin/apply.c:4392
+#: builtin/apply.c:4397
 msgid "ensure at least <n> lines of context match"
 msgstr "se till att åtminstone <n> rader sammanhang är lika"
 
-#: builtin/apply.c:4393
+#: builtin/apply.c:4398
 msgid "action"
 msgstr "åtgärd"
 
-#: builtin/apply.c:4394
+#: builtin/apply.c:4399
 msgid "detect new or modified lines that have whitespace errors"
 msgstr "detektera nya eller ändrade rader som har fel i blanktecken"
 
-#: builtin/apply.c:4397 builtin/apply.c:4400
+#: builtin/apply.c:4402 builtin/apply.c:4405
 msgid "ignore changes in whitespace when finding context"
 msgstr "ignorera ändringar i blanktecken för sammanhang"
 
-#: builtin/apply.c:4403
+#: builtin/apply.c:4408
 msgid "apply the patch in reverse"
 msgstr "tillämpa patchen baklänges"
 
-#: builtin/apply.c:4405
+#: builtin/apply.c:4410
 msgid "don't expect at least one line of context"
 msgstr "förvänta inte minst en rad sammanhang"
 
-#: builtin/apply.c:4407
+#: builtin/apply.c:4412
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr "lämna refuserade stycken i motsvarande *.rej-filer"
 
-#: builtin/apply.c:4409
+#: builtin/apply.c:4414
 msgid "allow overlapping hunks"
 msgstr "tillåt överlappande stycken"
 
-#: builtin/apply.c:4412
+#: builtin/apply.c:4417
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr "tolerera felaktigt detekterade saknade nyradstecken vid filslut"
 
-#: builtin/apply.c:4415
+#: builtin/apply.c:4420
 msgid "do not trust the line counts in the hunk headers"
 msgstr "lite inte på antalet linjer i styckehuvuden"
 
-#: builtin/apply.c:4417
+#: builtin/apply.c:4422
 msgid "root"
 msgstr "rot"
 
-#: builtin/apply.c:4418
+#: builtin/apply.c:4423
 msgid "prepend <root> to all filenames"
 msgstr "lägg till <rot> i alla filnamn"
 
-#: builtin/apply.c:4440
+#: builtin/apply.c:4445
 msgid "--3way outside a repository"
 msgstr "--3way utanför arkiv"
 
-#: builtin/apply.c:4448
+#: builtin/apply.c:4453
 msgid "--index outside a repository"
 msgstr "--index utanför arkiv"
 
-#: builtin/apply.c:4451
+#: builtin/apply.c:4456
 msgid "--cached outside a repository"
 msgstr "--cached utanför arkiv"
 
-#: builtin/apply.c:4467
+#: builtin/apply.c:4472
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "kan inte öppna patchen \"%s\""
 
-#: builtin/apply.c:4481
+#: builtin/apply.c:4486
 #, 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:4487 builtin/apply.c:4497
+#: builtin/apply.c:4492 builtin/apply.c:4502
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -2533,106 +2638,116 @@
 msgid "update BISECT_HEAD instead of checking out the current commit"
 msgstr "uppdatera BISECT_HEAD istället för att checka ut aktuell incheckning"
 
-#: builtin/blame.c:27
+#: builtin/blame.c:30
 msgid "git blame [options] [rev-opts] [rev] [--] file"
 msgstr "git blame [flaggor] [rev-flaggor] [rev] [--] fil"
 
-#: builtin/blame.c:32
+#: builtin/blame.c:35
 msgid "[rev-opts] are documented in git-rev-list(1)"
 msgstr "[rev-flaggor] dokumenteras i git-rev-list(1)"
 
-#: builtin/blame.c:2242
+#: builtin/blame.c:2501
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Visa klandringsposter när vi hittar dem, interaktivt"
 
-#: builtin/blame.c:2243
+#: builtin/blame.c:2502
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "Visa blank SHA-1 för gränsincheckningar (Standard: av)"
 
-#: builtin/blame.c:2244
+#: builtin/blame.c:2503
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Behandla inte rotincheckningar som gränser (Standard: av)"
 
-#: builtin/blame.c:2245
+#: builtin/blame.c:2504
 msgid "Show work cost statistics"
 msgstr "Visa statistik över arbetskostnad"
 
-#: builtin/blame.c:2246
+#: builtin/blame.c:2505
 msgid "Show output score for blame entries"
 msgstr "Visa utdatapoäng för klandringsposter"
 
-#: builtin/blame.c:2247
+#: builtin/blame.c:2506
 msgid "Show original filename (Default: auto)"
 msgstr "Visa originalfilnamn (Standard: auto)"
 
-#: builtin/blame.c:2248
+#: builtin/blame.c:2507
 msgid "Show original linenumber (Default: off)"
 msgstr "Visa ursprungligt radnummer (Standard: av)"
 
-#: builtin/blame.c:2249
+#: builtin/blame.c:2508
 msgid "Show in a format designed for machine consumption"
 msgstr "Visa i ett format avsett för maskinkonsumtion"
 
-#: builtin/blame.c:2250
+#: builtin/blame.c:2509
 msgid "Show porcelain format with per-line commit information"
 msgstr "Visa porslinsformat med per-rad-incheckningsinformation"
 
-#: builtin/blame.c:2251
+#: builtin/blame.c:2510
 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:2252
+#: builtin/blame.c:2511
 msgid "Show raw timestamp (Default: off)"
 msgstr "Visa rå tidsstämpel (Standard: av)"
 
-#: builtin/blame.c:2253
+#: builtin/blame.c:2512
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Visa lång inchecknings-SHA1 (Standard: av)"
 
-#: builtin/blame.c:2254
+#: builtin/blame.c:2513
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Undertryck författarnamn och tidsstämpel (Standard: av)"
 
-#: builtin/blame.c:2255
+#: builtin/blame.c:2514
 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:2256
+#: builtin/blame.c:2515
 msgid "Ignore whitespace differences"
 msgstr "Ignorera ändringar i blanksteg"
 
-#: builtin/blame.c:2257
+#: builtin/blame.c:2516
 msgid "Spend extra cycles to find better match"
 msgstr "Slösa extra cykler med att hitta bättre träff"
 
-#: builtin/blame.c:2258
+#: builtin/blame.c:2517
 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:2259
+#: builtin/blame.c:2518
 msgid "Use <file>'s contents as the final image"
 msgstr "Använd <fil>s innehåll som slutgiltig bild"
 
-#: builtin/blame.c:2260 builtin/blame.c:2261
+#: builtin/blame.c:2519 builtin/blame.c:2520
 msgid "score"
 msgstr "poäng"
 
-#: builtin/blame.c:2260
+#: builtin/blame.c:2519
 msgid "Find line copies within and across files"
 msgstr "Hitta kopierade rader inuti och mellan filer"
 
-#: builtin/blame.c:2261
+#: builtin/blame.c:2520
 msgid "Find line movements within and across files"
 msgstr "Hitta flyttade rader inuti och mellan filer"
 
-#: builtin/blame.c:2262
+#: builtin/blame.c:2521
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2262
+#: builtin/blame.c:2521
 msgid "Process only line range n,m, counting from 1"
 msgstr "Behandla endast radintervallet n,m, med början på 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:2602
+msgid "4 years, 11 months ago"
+msgstr "4 år, 11 månader sedan"
+
 #: builtin/branch.c:24
 msgid "git branch [options] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [flaggor] [-r | -a] [--merged | --no-merged]"
@@ -2649,7 +2764,7 @@
 msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>"
 msgstr "git branch [flaggor] (-m | -M) [<gammal_gren>] <ny_gren>"
 
-#: builtin/branch.c:150
+#: builtin/branch.c:152
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -2658,7 +2773,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:156
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -2667,12 +2782,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:170
 #, 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:174
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -2681,343 +2796,343 @@
 "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:187
 msgid "Update of config-file failed"
 msgstr "Misslyckades uppdatera konfigurationsfil"
 
-#: builtin/branch.c:213
+#: builtin/branch.c:215
 msgid "cannot use -a with -d"
 msgstr "kan inte ange -a med -d"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:221
 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:229
 #, 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:240
+#: builtin/branch.c:245
 #, c-format
 msgid "remote branch '%s' not found."
 msgstr "fjärrgrenen \"%s\" hittades inte."
 
-#: builtin/branch.c:241
+#: builtin/branch.c:246
 #, c-format
 msgid "branch '%s' not found."
 msgstr "grenen \"%s\" hittades inte."
 
-#: builtin/branch.c:255
+#: builtin/branch.c:260
 #, c-format
 msgid "Error deleting remote branch '%s'"
 msgstr "Fel vid borttagning av fjärrgrenen \"%s\""
 
-#: builtin/branch.c:256
+#: builtin/branch.c:261
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Fel vid borttagning av grenen \"%s\""
 
-#: builtin/branch.c:263
+#: builtin/branch.c:268
 #, c-format
 msgid "Deleted remote branch %s (was %s).\n"
 msgstr "Tog bort fjärrgrenen %s (var %s).\n"
 
-#: builtin/branch.c:264
+#: builtin/branch.c:269
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Tog bort grenen %s (var %s).\n"
 
-#: builtin/branch.c:366
+#: builtin/branch.c:370
 #, c-format
 msgid "branch '%s' does not point at a commit"
 msgstr "grenen \"%s\" pekar inte på en incheckning"
 
-#: builtin/branch.c:454
+#: builtin/branch.c:459
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: försvunnen]"
 
-#: builtin/branch.c:459
+#: builtin/branch.c:464
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:464
+#: builtin/branch.c:469
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: bakom %d] "
 
-#: builtin/branch.c:466
+#: builtin/branch.c:471
 #, c-format
 msgid "[behind %d]"
 msgstr "[bakom %d] "
 
-#: builtin/branch.c:470
+#: builtin/branch.c:475
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: före %d] "
 
-#: builtin/branch.c:472
+#: builtin/branch.c:477
 #, c-format
 msgid "[ahead %d]"
 msgstr "[före %d] "
 
-#: builtin/branch.c:475
+#: builtin/branch.c:480
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: före %d, bakom %d] "
 
-#: builtin/branch.c:478
+#: builtin/branch.c:483
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[före %d, bakom %d] "
 
-#: builtin/branch.c:502
+#: builtin/branch.c:496
 msgid " **** invalid ref ****"
 msgstr " **** ogiltig ref ****"
 
-#: builtin/branch.c:594
+#: builtin/branch.c:587
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(ingen gren, ombaserar %s)"
 
-#: builtin/branch.c:597
+#: builtin/branch.c:590
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(ingen gren, \"bisect\" startad på %s)"
 
-#: builtin/branch.c:600
+#: builtin/branch.c:593
 #, c-format
 msgid "(detached from %s)"
 msgstr "(frånkopplad från %s)"
 
-#: builtin/branch.c:603
+#: builtin/branch.c:596
 msgid "(no branch)"
 msgstr "(ingen gren)"
 
-#: builtin/branch.c:649
+#: 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:681
+#: builtin/branch.c:691
 msgid "some refs could not be read"
 msgstr "vissa referenser kunde inte läsas"
 
-#: builtin/branch.c:694
+#: builtin/branch.c:704
 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:704
+#: builtin/branch.c:714
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Felaktigt namn på gren: \"%s\""
 
-#: builtin/branch.c:719
+#: builtin/branch.c:729
 msgid "Branch rename failed"
 msgstr "Misslyckades byta namn på gren"
 
-#: builtin/branch.c:723
+#: builtin/branch.c:733
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "Bytte bort namn på en felaktigt namngiven gren \"%s\""
 
-#: builtin/branch.c:727
+#: builtin/branch.c:737
 #, 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:734
+#: builtin/branch.c:744
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "Grenen namnbytt, men misslyckades uppdatera konfigurationsfilen"
 
-#: builtin/branch.c:749
+#: builtin/branch.c:759
 #, c-format
 msgid "malformed object name %s"
 msgstr "felformat objektnamn %s"
 
-#: builtin/branch.c:773
+#: builtin/branch.c:783
 #, c-format
 msgid "could not write branch description template: %s"
 msgstr "kunde inte skriva grenbeskrivningsmall: %s"
 
-#: builtin/branch.c:803
+#: builtin/branch.c:813
 msgid "Generic options"
 msgstr "Allmänna flaggor"
 
-#: builtin/branch.c:805
+#: builtin/branch.c:815
 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:806
+#: builtin/branch.c:816
 msgid "suppress informational messages"
 msgstr "undertryck informationsmeddelanden"
 
-#: builtin/branch.c:807
+#: builtin/branch.c:817
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "ställ in spårningsläge (se git-pull(1))"
 
-#: builtin/branch.c:809
+#: builtin/branch.c:819
 msgid "change upstream info"
 msgstr "ändra uppströmsinformation"
 
-#: builtin/branch.c:813
+#: builtin/branch.c:823
 msgid "use colored output"
 msgstr "använd färgad utdata"
 
-#: builtin/branch.c:814
+#: builtin/branch.c:824
 msgid "act on remote-tracking branches"
 msgstr "arbeta på fjärrspårande grenar"
 
-#: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844
-#: builtin/branch.c:850 builtin/commit.c:1494 builtin/commit.c:1495
-#: builtin/commit.c:1496 builtin/commit.c:1497 builtin/tag.c:527
-#: builtin/tag.c:533
+#: builtin/branch.c:827 builtin/branch.c:833 builtin/branch.c:854
+#: builtin/branch.c:860 builtin/commit.c:1622 builtin/commit.c:1623
+#: builtin/commit.c:1624 builtin/commit.c:1625 builtin/tag.c:616
+#: builtin/tag.c:622
 msgid "commit"
 msgstr "incheckning"
 
-#: builtin/branch.c:818 builtin/branch.c:824
+#: builtin/branch.c:828 builtin/branch.c:834
 msgid "print only branches that contain the commit"
 msgstr "visa endast grenar som innehåller incheckningen"
 
-#: builtin/branch.c:830
+#: builtin/branch.c:840
 msgid "Specific git-branch actions:"
 msgstr "Specifika git-branch-åtgärder:"
 
-#: builtin/branch.c:831
+#: builtin/branch.c:841
 msgid "list both remote-tracking and local branches"
 msgstr "visa både fjärrspårande och lokala grenar"
 
-#: builtin/branch.c:833
+#: builtin/branch.c:843
 msgid "delete fully merged branch"
 msgstr "ta bort helt sammanslagen gren"
 
-#: builtin/branch.c:834
+#: builtin/branch.c:844
 msgid "delete branch (even if not merged)"
 msgstr "ta bort gren (även om inte helt sammanslagen)"
 
-#: builtin/branch.c:835
+#: builtin/branch.c:845
 msgid "move/rename a branch and its reflog"
 msgstr "flytta/ta bort en gren och dess reflogg"
 
-#: builtin/branch.c:836
+#: builtin/branch.c:846
 msgid "move/rename a branch, even if target exists"
 msgstr "flytta/ta bort en gren, även om målet finns"
 
-#: builtin/branch.c:837
+#: builtin/branch.c:847
 msgid "list branch names"
 msgstr "lista namn på grenar"
 
-#: builtin/branch.c:838
+#: builtin/branch.c:848
 msgid "create the branch's reflog"
 msgstr "skapa grenens reflogg"
 
-#: builtin/branch.c:840
+#: builtin/branch.c:850
 msgid "edit the description for the branch"
 msgstr "redigera beskrivning för grenen"
 
-#: builtin/branch.c:841
+#: builtin/branch.c:851
 msgid "force creation (when already exists)"
 msgstr "tvinga skapande (när den redan finns)"
 
-#: builtin/branch.c:844
+#: builtin/branch.c:854
 msgid "print only not merged branches"
 msgstr "visa endast ej sammanslagna grenar"
 
-#: builtin/branch.c:850
+#: builtin/branch.c:860
 msgid "print only merged branches"
 msgstr "visa endast sammanslagna grenar"
 
-#: builtin/branch.c:854
+#: builtin/branch.c:864
 msgid "list branches in columns"
 msgstr "visa grenar i spalter"
 
-#: builtin/branch.c:867
+#: builtin/branch.c:877
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Misslyckades slå upp HEAD som giltig referens"
 
-#: builtin/branch.c:872 builtin/clone.c:635
+#: builtin/branch.c:881 builtin/clone.c:634
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD hittades inte under refs/heads!"
 
-#: builtin/branch.c:896
+#: builtin/branch.c:903
 msgid "--column and --verbose are incompatible"
 msgstr "--column och --verbose är inkompatibla"
 
-#: builtin/branch.c:902 builtin/branch.c:941
+#: builtin/branch.c:909 builtin/branch.c:948
 msgid "branch name required"
 msgstr "grennamn krävs"
 
-#: builtin/branch.c:917
+#: builtin/branch.c:924
 msgid "Cannot give description to detached HEAD"
 msgstr "Kan inte beskriva frånkopplad HEAD"
 
-#: builtin/branch.c:922
+#: builtin/branch.c:929
 msgid "cannot edit description of more than one branch"
 msgstr "kan inte redigera beskrivning för mer än en gren"
 
-#: builtin/branch.c:929
+#: builtin/branch.c:936
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Inga incheckningar på grenen \"%s\" ännu"
 
-#: builtin/branch.c:932
+#: builtin/branch.c:939
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Ingen gren vid namnet \"%s\"."
 
-#: builtin/branch.c:947
+#: builtin/branch.c:954
 msgid "too many branches for a rename operation"
 msgstr "för många grenar för namnbyte"
 
-#: builtin/branch.c:952
+#: builtin/branch.c:959
 msgid "too many branches to set new upstream"
 msgstr "för många grenar för att byta uppström"
 
-#: builtin/branch.c:956
+#: builtin/branch.c:963
 #, 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:959 builtin/branch.c:981 builtin/branch.c:1002
+#: builtin/branch.c:966 builtin/branch.c:988 builtin/branch.c:1009
 #, c-format
 msgid "no such branch '%s'"
 msgstr "okänd gren \"%s\""
 
-#: builtin/branch.c:963
+#: builtin/branch.c:970
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "grenen \"%s\" finns inte"
 
-#: builtin/branch.c:975
+#: builtin/branch.c:982
 msgid "too many branches to unset upstream"
 msgstr "för många grenar för att ta bort uppström"
 
-#: builtin/branch.c:979
+#: builtin/branch.c:986
 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:985
+#: builtin/branch.c:992
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "Grenen \"%s\" har ingen uppströmsinformation"
 
-#: builtin/branch.c:999
+#: builtin/branch.c:1006
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "kan inte skapa \"HEAD\" manuellt"
 
-#: builtin/branch.c:1005
+#: builtin/branch.c:1012
 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:1008
+#: builtin/branch.c:1015
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -3026,7 +3141,7 @@
 "Flaggan --set-upstream rekommenderas ej och kommer tas bort. Använd --track "
 "eller --set-upstream-to\n"
 
-#: builtin/branch.c:1025
+#: builtin/branch.c:1032
 #, c-format
 msgid ""
 "\n"
@@ -3037,12 +3152,12 @@
 "Om du vill göra så att \"%s\" spårar \"%s\" gör du så här:\n"
 "\n"
 
-#: builtin/branch.c:1026
+#: builtin/branch.c:1033
 #, c-format
 msgid "    git branch -d %s\n"
 msgstr "    git branch -d %s\n"
 
-#: builtin/branch.c:1027
+#: builtin/branch.c:1034
 #, c-format
 msgid "    git branch --set-upstream-to %s\n"
 msgstr "    git branch --set-upstream-to %s\n"
@@ -3060,43 +3175,43 @@
 msgid "Need a repository to unbundle."
 msgstr "Behöver ett arkiv för att packa upp ett paket (bundle)."
 
-#: builtin/cat-file.c:331
+#: builtin/cat-file.c:332
 msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
 msgstr "git cat-file (-t|-s|-e|-p|<typ>|--textconv) <objekt>"
 
-#: builtin/cat-file.c:332
+#: builtin/cat-file.c:333
 msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
 msgstr "git cat-file (--batch|--batch-check) < <objektlista>"
 
-#: builtin/cat-file.c:369
+#: builtin/cat-file.c:370
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<typ> kan vara en av: blob, tree, commit, tag"
 
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:371
 msgid "show object type"
 msgstr "visa objekttyp"
 
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:372
 msgid "show object size"
 msgstr "visa objektstorlek"
 
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:374
 msgid "exit with zero when there's no error"
 msgstr "avsluta med noll när det inte uppstått något fel"
 
-#: builtin/cat-file.c:374
+#: builtin/cat-file.c:375
 msgid "pretty-print object's content"
 msgstr "visa objektets innehåll snyggt"
 
-#: builtin/cat-file.c:376
+#: builtin/cat-file.c:377
 msgid "for blob objects, run textconv on object's content"
 msgstr "för blob-objekt, kör textconv på objektets innehåll"
 
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:379
 msgid "show info and content of objects fed from the standard input"
 msgstr "visa information och innehåll för objekt som listas på standard in"
 
-#: builtin/cat-file.c:381
+#: builtin/cat-file.c:382
 msgid "show info about objects fed from the standard input"
 msgstr "visa information för objekt som listas på standard in"
 
@@ -3116,7 +3231,7 @@
 msgid "use .gitattributes only from the index"
 msgstr "använd .gitattributes endast från indexet"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:75
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "läs filnamn från standard in"
 
@@ -3124,7 +3239,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:1089 builtin/gc.c:271
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:274
 msgid "suppress progress reporting"
 msgstr "undertryck förloppsrapportering"
 
@@ -3181,43 +3296,43 @@
 msgid "git checkout-index [options] [--] [<file>...]"
 msgstr "git checkout-index [flaggor] [--] [<fil>...]"
 
-#: builtin/checkout-index.c:187
+#: builtin/checkout-index.c:188
 msgid "check out all files in the index"
 msgstr "checka ut alla filer i indexet"
 
-#: builtin/checkout-index.c:188
+#: builtin/checkout-index.c:189
 msgid "force overwrite of existing files"
 msgstr "tvinga överskrivning av befintliga filer"
 
-#: builtin/checkout-index.c:190
+#: builtin/checkout-index.c:191
 msgid "no warning for existing files and files not in index"
 msgstr "ingen varning för existerande filer och filer ej i indexet"
 
-#: builtin/checkout-index.c:192
+#: builtin/checkout-index.c:193
 msgid "don't checkout new files"
 msgstr "checka inte ut nya filer"
 
-#: builtin/checkout-index.c:194
+#: builtin/checkout-index.c:195
 msgid "update stat information in the index file"
 msgstr "uppdatera stat-information i indexfilen"
 
-#: builtin/checkout-index.c:200
+#: builtin/checkout-index.c:201
 msgid "read list of paths from the standard input"
 msgstr "läs listan över sökvägar från standard in"
 
-#: builtin/checkout-index.c:202
+#: builtin/checkout-index.c:203
 msgid "write the content to temporary files"
 msgstr "skriv innehåll till temporära filer"
 
-#: builtin/checkout-index.c:203 builtin/column.c:30
+#: builtin/checkout-index.c:204 builtin/column.c:30
 msgid "string"
 msgstr "sträng"
 
-#: builtin/checkout-index.c:204
+#: builtin/checkout-index.c:205
 msgid "when creating files, prepend <string>"
 msgstr "när filer skapas, lägg till <sträng> först"
 
-#: builtin/checkout-index.c:207
+#: builtin/checkout-index.c:208
 msgid "copy out the files from named stage"
 msgstr "kopiera ut filer från namngiven etapp"
 
@@ -3259,65 +3374,65 @@
 msgid "Unable to add merge result for '%s'"
 msgstr "Kunde inte lägga till sammanslagningsresultat för \"%s\""
 
-#: builtin/checkout.c:232 builtin/checkout.c:235 builtin/checkout.c:238
-#: builtin/checkout.c:241
+#: builtin/checkout.c:231 builtin/checkout.c:234 builtin/checkout.c:237
+#: builtin/checkout.c:240
 #, 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:244 builtin/checkout.c:247
+#: builtin/checkout.c:243 builtin/checkout.c:246
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "\"%s\" kan inte användas med %s"
 
-#: builtin/checkout.c:250
+#: builtin/checkout.c:249
 #, 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:261 builtin/checkout.c:450
+#: builtin/checkout.c:260 builtin/checkout.c:449
 msgid "corrupt index file"
 msgstr "indexfilen är trasig"
 
-#: builtin/checkout.c:321 builtin/checkout.c:328
+#: builtin/checkout.c:320 builtin/checkout.c:327
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "sökvägen \"%s\" har inte slagits ihop"
 
-#: builtin/checkout.c:472
+#: builtin/checkout.c:471
 msgid "you need to resolve your current index first"
 msgstr "du måste lösa ditt befintliga index först"
 
-#: builtin/checkout.c:593
+#: builtin/checkout.c:597
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr "Kan inte skapa referenslog för \"%s\"\n"
 
-#: builtin/checkout.c:631
+#: builtin/checkout.c:635
 msgid "HEAD is now at"
 msgstr "HEAD är nu på"
 
-#: builtin/checkout.c:638
+#: builtin/checkout.c:642
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Återställ gren \"%s\"\n"
 
-#: builtin/checkout.c:641
+#: builtin/checkout.c:645
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Redan på \"%s\"\n"
 
-#: builtin/checkout.c:645
+#: builtin/checkout.c:649
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Växlade till och nollställde grenen \"%s\"\n"
 
-#: builtin/checkout.c:647 builtin/checkout.c:1032
+#: builtin/checkout.c:651 builtin/checkout.c:1032
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Växlade till en ny gren \"%s\"\n"
 
-#: builtin/checkout.c:649
+#: builtin/checkout.c:653
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Växlade till grenen \"%s\"\n"
@@ -3412,7 +3527,7 @@
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Kan inte växla gren till icke-incheckningen \"%s\""
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:89
 #: builtin/remote.c:159 builtin/remote.c:161
 msgid "branch"
 msgstr "gren"
@@ -3461,11 +3576,11 @@
 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:1105 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:226
 msgid "update ignored files (default)"
 msgstr "uppdatera ignorerade filer (standard)"
 
-#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
+#: builtin/checkout.c:1106 builtin/log.c:1239 parse-options.h:245
 msgid "style"
 msgstr "stil"
 
@@ -3489,15 +3604,15 @@
 msgid "--track needs a branch name"
 msgstr "--track behöver ett namn på en gren"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1157
 msgid "Missing branch name; try -b"
 msgstr "Grennamn saknas; försök med -b"
 
-#: builtin/checkout.c:1196
+#: builtin/checkout.c:1194
 msgid "invalid path specification"
 msgstr "felaktig sökvägsangivelse"
 
-#: builtin/checkout.c:1203
+#: builtin/checkout.c:1201
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3506,12 +3621,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:1208
+#: builtin/checkout.c:1206
 #, 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:1212
+#: builtin/checkout.c:1210
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -3588,30 +3703,30 @@
 msgid "Huh (%s)?"
 msgstr "Vadå (%s)?"
 
-#: builtin/clean.c:660
+#: builtin/clean.c:659
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Ange ignoreringsmönster>>"
 
-#: builtin/clean.c:697
+#: builtin/clean.c:696
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "VARNING: Hittar inte poster som motsvarar: %s"
 
-#: builtin/clean.c:718
+#: builtin/clean.c:717
 msgid "Select items to delete"
 msgstr "Välj poster att ta bort"
 
-#: builtin/clean.c:758
+#: builtin/clean.c:757
 #, c-format
 msgid "remove %s? "
 msgstr "ta bort %s?"
 
-#: builtin/clean.c:783
+#: builtin/clean.c:782
 msgid "Bye."
 msgstr "Hej då."
 
-#: builtin/clean.c:791
+#: builtin/clean.c:790
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -3629,62 +3744,62 @@
 "help                - denna skärm\n"
 "?                   - hjälp för kommandoval"
 
-#: builtin/clean.c:818
+#: builtin/clean.c:817
 msgid "*** Commands ***"
 msgstr "*** Kommandon ***"
 
-#: builtin/clean.c:819
+#: builtin/clean.c:818
 msgid "What now"
 msgstr "Vad nu"
 
-#: builtin/clean.c:827
+#: builtin/clean.c:826
 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:844
+#: builtin/clean.c:843
 msgid "No more files to clean, exiting."
 msgstr "Inga fler filer att städa, avslutar."
 
-#: builtin/clean.c:875
+#: builtin/clean.c:874
 msgid "do not print names of files removed"
 msgstr "skriv inte ut namn på borttagna filer"
 
-#: builtin/clean.c:877
+#: builtin/clean.c:876
 msgid "force"
 msgstr "tvinga"
 
-#: builtin/clean.c:878
+#: builtin/clean.c:877
 msgid "interactive cleaning"
 msgstr "städa interaktivt"
 
-#: builtin/clean.c:880
+#: builtin/clean.c:879
 msgid "remove whole directories"
 msgstr "ta bort hela kataloger"
 
-#: builtin/clean.c:881 builtin/describe.c:415 builtin/grep.c:716
-#: builtin/ls-files.c:486 builtin/name-rev.c:314 builtin/show-ref.c:185
+#: builtin/clean.c:880 builtin/describe.c:407 builtin/grep.c:714
+#: builtin/ls-files.c:486 builtin/name-rev.c:311 builtin/show-ref.c:185
 msgid "pattern"
 msgstr "mönster"
 
-#: builtin/clean.c:882
+#: builtin/clean.c:881
 msgid "add <pattern> to ignore rules"
 msgstr "lägg till <mönster> till ignoreringsregler"
 
-#: builtin/clean.c:883
+#: builtin/clean.c:882
 msgid "remove ignored files, too"
 msgstr "ta även bort ignorerade filer"
 
-#: builtin/clean.c:885
+#: builtin/clean.c:884
 msgid "remove only ignored files"
 msgstr "ta endast bort ignorerade filer"
 
-#: builtin/clean.c:903
+#: builtin/clean.c:902
 msgid "-x and -X cannot be used together"
 msgstr "-x och -X kan inte användas samtidigt"
 
-#: builtin/clean.c:907
+#: builtin/clean.c:906
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
@@ -3692,7 +3807,7 @@
 "clean.requireForce satt till true, men varken -i, -n eller -f angavs; vägrar "
 "städa"
 
-#: builtin/clean.c:910
+#: builtin/clean.c:909
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -3700,145 +3815,145 @@
 "clean.requireForce har standardvärdet true och varken -i, -n eller -f "
 "angavs; vägrar städa"
 
-#: builtin/clone.c:36
+#: builtin/clone.c:37
 msgid "git clone [options] [--] <repo> [<dir>]"
 msgstr "git clone [flaggor] [--] <arkiv> [<kat>]"
 
-#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:504
+#: builtin/clone.c:65 builtin/fetch.c:112 builtin/merge.c:223
+#: builtin/push.c:514
 msgid "force progress reporting"
 msgstr "tvinga förloppsrapportering"
 
-#: builtin/clone.c:66
+#: builtin/clone.c:67
 msgid "don't create a checkout"
 msgstr "skapa inte någon utcheckning"
 
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
+#: builtin/clone.c:68 builtin/clone.c:70 builtin/init-db.c:488
 msgid "create a bare repository"
 msgstr "skapa ett naket (\"bare\") arkiv"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:72
 msgid "create a mirror repository (implies bare)"
 msgstr "skapa ett spegelarkiv (implicerar \"bare\")"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:74
 msgid "to clone from a local repository"
 msgstr "för att klona från ett lokalt arkiv"
 
-#: builtin/clone.c:75
+#: builtin/clone.c:76
 msgid "don't use local hardlinks, always copy"
 msgstr "skapa inte lokala hårda länkar, kopiera alltid"
 
-#: builtin/clone.c:77
+#: builtin/clone.c:78
 msgid "setup as shared repository"
 msgstr "skapa som ett delat arkiv"
 
-#: builtin/clone.c:79 builtin/clone.c:81
+#: builtin/clone.c:80 builtin/clone.c:82
 msgid "initialize submodules in the clone"
 msgstr "initiera undermoduler i klonen"
 
-#: builtin/clone.c:82 builtin/init-db.c:483
+#: builtin/clone.c:83 builtin/init-db.c:485
 msgid "template-directory"
 msgstr "mallkatalog"
 
-#: builtin/clone.c:83 builtin/init-db.c:484
+#: builtin/clone.c:84 builtin/init-db.c:486
 msgid "directory from which templates will be used"
 msgstr "katalog att använda mallar från"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:86
 msgid "reference repository"
 msgstr "referensarkiv"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44
 msgid "name"
 msgstr "namn"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:88
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "använd <namn> istället för \"origin\" för att spåra uppströms"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:90
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "checka ut <gren> istället för fjärrens HEAD"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:92
 msgid "path to git-upload-pack on the remote"
 msgstr "sökväg till git-upload-pack på fjärren"
 
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
+#: builtin/clone.c:93 builtin/fetch.c:113 builtin/grep.c:659
 msgid "depth"
 msgstr "djup"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:94
 msgid "create a shallow clone of that depth"
 msgstr "skapa en grund klon på detta djup"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:96
 msgid "clone only one branch, HEAD or --branch"
 msgstr "klona endast en gren, HEAD eller --branch"
 
-#: builtin/clone.c:96 builtin/init-db.c:492
+#: builtin/clone.c:97 builtin/init-db.c:494
 msgid "gitdir"
 msgstr "gitkat"
 
-#: builtin/clone.c:97 builtin/init-db.c:493
+#: builtin/clone.c:98 builtin/init-db.c:495
 msgid "separate git dir from working tree"
 msgstr "separera gitkatalogen från arbetskatalogen"
 
-#: builtin/clone.c:98
+#: builtin/clone.c:99
 msgid "key=value"
 msgstr "nyckel=värde"
 
-#: builtin/clone.c:99
+#: builtin/clone.c:100
 msgid "set config inside the new repository"
 msgstr "ställ in konfiguration i det nya arkivet"
 
-#: builtin/clone.c:252
+#: builtin/clone.c:253
 #, c-format
 msgid "reference repository '%s' is not a local repository."
 msgstr "referensarkivet \"%s\" är inte ett lokalt arkiv."
 
-#: builtin/clone.c:256
+#: builtin/clone.c:257
 #, c-format
 msgid "reference repository '%s' is shallow"
 msgstr "referensarkivet \"%s\" är grunt"
 
-#: builtin/clone.c:259
+#: builtin/clone.c:260
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr "referensarkivet \"%s\" är ympat"
 
-#: builtin/clone.c:321
+#: builtin/clone.c:322
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr "misslyckades skapa katalogen \"%s\""
 
-#: builtin/clone.c:323 builtin/diff.c:83
+#: builtin/clone.c:324 builtin/diff.c:84
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "misslyckades ta status på \"%s\""
 
-#: builtin/clone.c:325
+#: builtin/clone.c:326
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s finns och är ingen katalog"
 
-#: builtin/clone.c:339
+#: builtin/clone.c:340
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "misslyckades ta status på %s\n"
 
-#: builtin/clone.c:361
+#: builtin/clone.c:362
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "misslyckades skapa länken \"%s\""
 
-#: builtin/clone.c:365
+#: builtin/clone.c:366
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "misslyckades kopiera filen till \"%s\""
 
-#: builtin/clone.c:388 builtin/clone.c:565
+#: builtin/clone.c:389 builtin/clone.c:563
 #, c-format
 msgid "done.\n"
 msgstr "klart.\n"
@@ -3853,26 +3968,28 @@
 "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:480
+#: builtin/clone.c:478
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Kunde inte hitta fjärrgrenen %s för att klona."
 
-#: builtin/clone.c:560
+# Vague original, not networking-related, but rather related to the actual
+# objects in the database.
+#: builtin/clone.c:558
 #, c-format
 msgid "Checking connectivity... "
-msgstr "Kontrollerar anslutning..."
+msgstr "Kontrollerar konnektivitet..."
 
-#: builtin/clone.c:563
+#: builtin/clone.c:561
 msgid "remote did not send all necessary objects"
 msgstr "fjärren sände inte alla nödvändiga objekt"
 
-#: builtin/clone.c:626
+#: builtin/clone.c:625
 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:657
+#: builtin/clone.c:656
 msgid "unable to checkout working tree"
 msgstr "kunde inte checka ut arbetskatalogen"
 
@@ -3898,64 +4015,64 @@
 msgid "repository '%s' does not exist"
 msgstr "arkivet \"%s\" finns inte"
 
-#: builtin/clone.c:802
-msgid "--depth is ignored in local clones; use file:// instead."
-msgstr "--depth ignoreras i lokala kloningar; använd file:// istället"
-
-#: builtin/clone.c:805
-msgid "source repository is shallow, ignoring --local"
-msgstr "källarkivet är grunt, ignorerar --local"
-
-#: builtin/clone.c:810
-msgid "--local is ignored"
-msgstr "--local ignoreras"
-
-#: builtin/clone.c:814 builtin/fetch.c:1119
+#: builtin/clone.c:802 builtin/fetch.c:1155
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "djupet %s är inte ett positivt tal"
 
-#: builtin/clone.c:824
+#: builtin/clone.c:812
 #, 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:834
+#: builtin/clone.c:822
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "arbetsträdet \"%s\" finns redan."
 
-#: builtin/clone.c:847 builtin/clone.c:859
+#: builtin/clone.c:835 builtin/clone.c:847
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "kunde inte skapa inledande kataloger för \"%s\""
 
-#: builtin/clone.c:850
+#: builtin/clone.c:838
 #, c-format
 msgid "could not create work tree dir '%s'."
 msgstr "kunde inte skapa arbetskatalogen \"%s\""
 
-#: builtin/clone.c:869
+#: builtin/clone.c:857
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Klonar till ett naket arkiv \"%s\"...\n"
 
-#: builtin/clone.c:871
+#: builtin/clone.c:859
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Klonar till \"%s\"...\n"
 
-#: builtin/clone.c:906
+#: builtin/clone.c:895
+msgid "--depth is ignored in local clones; use file:// instead."
+msgstr "--depth ignoreras i lokala kloningar; använd file:// istället"
+
+#: builtin/clone.c:898
+msgid "source repository is shallow, ignoring --local"
+msgstr "källarkivet är grunt, ignorerar --local"
+
+#: builtin/clone.c:903
+msgid "--local is ignored"
+msgstr "--local ignoreras"
+
+#: builtin/clone.c:907
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Vet inte hur man klonar %s"
 
-#: builtin/clone.c:957 builtin/clone.c:965
+#: builtin/clone.c:958 builtin/clone.c:966
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Fjärrgrenen %s hittades inte i uppströmsarkivet %s"
 
-#: builtin/clone.c:968
+#: builtin/clone.c:969
 msgid "You appear to have cloned an empty repository."
 msgstr "Du verkar ha klonat ett tomt arkiv."
 
@@ -3991,15 +4108,42 @@
 msgid "--command must be the first argument"
 msgstr "--command måste vara första argument"
 
-#: builtin/commit.c:36
+#: builtin/commit.c:37
 msgid "git commit [options] [--] <pathspec>..."
 msgstr "git commit [flaggor] [--] <sökväg>..."
 
-#: builtin/commit.c:41
+#: builtin/commit.c:42
 msgid "git status [options] [--] <pathspec>..."
 msgstr "git status [flaggor] [--] <sökväg>..."
 
-#: builtin/commit.c:46
+#: builtin/commit.c:47
+msgid ""
+"Your name and email address were configured automatically based\n"
+"on your username and hostname. Please check that they are accurate.\n"
+"You can suppress this message by setting them explicitly. Run the\n"
+"following command and follow the instructions in your editor to edit\n"
+"your configuration file:\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"After doing this, you may fix the identity used for this commit with:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+msgstr ""
+"Ditt namn och e-postadress konfigurerades automatiskt baserat på\n"
+"ditt användar-id och värdnamn. Kontrollera att de är riktiga. Du\n"
+"kan förhindra det här meddelandet genom att ställa dem explicit.\n"
+"Kör följande kommandon och följ instruktionerna i textredigeraren\n"
+"för att redigera din konfigurationsfil:\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"När du gjort det kan du rätta identiteten som användes för den här\n"
+"incheckningen med:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+
+#: builtin/commit.c:60
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4024,7 +4168,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:58
+#: builtin/commit.c:72
 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"
@@ -4034,7 +4178,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:63
+#: builtin/commit.c:77
 msgid ""
 "The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
 "If you wish to commit it anyway, use:\n"
@@ -4048,11 +4192,11 @@
 "    git commit --allow-empty\n"
 "\n"
 
-#: builtin/commit.c:70
+#: builtin/commit.c:84
 msgid "Otherwise, please use 'git reset'\n"
 msgstr "Använd annars \"git reset\"\n"
 
-#: builtin/commit.c:73
+#: builtin/commit.c:87
 msgid ""
 "If you wish to skip this commit, use:\n"
 "\n"
@@ -4068,93 +4212,119 @@
 "\"git cherry-pick --continue\" kommer därefter att återuppta\n"
 "cherry-pick för återstående incheckningar.\n"
 
-#: builtin/commit.c:288
+#: builtin/commit.c:302
 msgid "failed to unpack HEAD tree object"
 msgstr "misslyckades packa upp HEAD:s trädobjekt"
 
-#: builtin/commit.c:330
+#: builtin/commit.c:342
 msgid "unable to create temporary index"
 msgstr "kunde inte skapa temporär indexfil"
 
-#: builtin/commit.c:336
+#: builtin/commit.c:348
 msgid "interactive add failed"
 msgstr "interaktiv tilläggning misslyckades"
 
-#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
+#: builtin/commit.c:359
+msgid "unable to write index file"
+msgstr "kan inte skriva indexfil"
+
+#: builtin/commit.c:361
+msgid "unable to update temporary index"
+msgstr "kan inte uppdatera temporärt index"
+
+#: builtin/commit.c:363
+msgid "Failed to update main cache tree"
+msgstr "Misslyckades uppdatera huvud-cacheträdet"
+
+#: builtin/commit.c:387 builtin/commit.c:412 builtin/commit.c:461
 msgid "unable to write new_index file"
 msgstr "kunde inte skriva filen new_index"
 
-#: builtin/commit.c:421
+#: builtin/commit.c:443
 msgid "cannot do a partial commit during a merge."
 msgstr "kan inte utföra en delvis incheckning under en sammanslagning."
 
-#: builtin/commit.c:423
+#: builtin/commit.c:445
 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:433
+#: builtin/commit.c:454
 msgid "cannot read the index"
 msgstr "kan inte läsa indexet"
 
-#: builtin/commit.c:453
+#: builtin/commit.c:473
 msgid "unable to write temporary index file"
 msgstr "kunde inte skriva temporär indexfil"
 
-#: builtin/commit.c:544 builtin/commit.c:550
+#: builtin/commit.c:592
 #, c-format
-msgid "invalid commit: %s"
-msgstr "felaktig incheckning: %s"
+msgid "commit '%s' lacks author header"
+msgstr "incheckningen \"%s\" saknar författarhuvud"
 
-#: builtin/commit.c:572
+#: builtin/commit.c:594
+#, c-format
+msgid "commit '%s' has malformed author line"
+msgstr "incheckningen \"%s\" har felformaterat författarhuvud"
+
+#: builtin/commit.c:613
 msgid "malformed --author parameter"
 msgstr "felformad \"--author\"-flagga"
 
-#: builtin/commit.c:592
+#: builtin/commit.c:621
+#, c-format
+msgid "invalid date format: %s"
+msgstr "felaktigt datumformat: %s"
+
+#: builtin/commit.c:642
 #, c-format
 msgid "Malformed ident string: '%s'"
 msgstr "Felaktig indragningssträng: \"%s\""
 
-#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
+#: builtin/commit.c:675
+msgid ""
+"unable to select a comment character that is not used\n"
+"in the current commit message"
+msgstr ""
+"kunde inte välja ett kommentarstecken som inte använts\n"
+"i det befintliga incheckningsmeddelandet"
+
+#: builtin/commit.c:712 builtin/commit.c:745 builtin/commit.c:1120
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "kunde inte slå upp incheckningen %s"
 
-#: builtin/commit.c:641 builtin/shortlog.c:273
+#: builtin/commit.c:724 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:643
+#: builtin/commit.c:726
 msgid "could not read log from standard input"
 msgstr "kunde inte läsa logg från standard in"
 
-#: builtin/commit.c:647
+#: builtin/commit.c:730
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "kunde inte läsa loggfilen \"%s\""
 
-#: builtin/commit.c:654
-msgid "commit has empty message"
-msgstr "incheckningen har ett tomt meddelande"
-
-#: builtin/commit.c:670
+#: builtin/commit.c:752
 msgid "could not read MERGE_MSG"
 msgstr "kunde inte läsa MERGE_MSG"
 
-#: builtin/commit.c:674
+#: builtin/commit.c:756
 msgid "could not read SQUASH_MSG"
 msgstr "kunde inte läsa SQUASH_MSG"
 
-#: builtin/commit.c:678
+#: builtin/commit.c:760
 #, c-format
 msgid "could not read '%s'"
 msgstr "kunde inte läsa \"%s\""
 
-#: builtin/commit.c:749
+#: builtin/commit.c:831
 msgid "could not write commit template"
 msgstr "kunde inte skriva incheckningsmall"
 
-#: builtin/commit.c:764
+#: builtin/commit.c:849
 #, c-format
 msgid ""
 "\n"
@@ -4169,7 +4339,7 @@
 "\t%s\n"
 "och försöker igen.\n"
 
-#: builtin/commit.c:769
+#: builtin/commit.c:854
 #, c-format
 msgid ""
 "\n"
@@ -4184,7 +4354,7 @@
 "\t%s\n"
 "och försöker igen.\n"
 
-#: builtin/commit.c:782
+#: builtin/commit.c:867
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4194,7 +4364,7 @@
 "med \"%c\" kommer ignoreras, och ett tomt meddelande avbryter "
 "incheckningen.\n"
 
-#: builtin/commit.c:789
+#: builtin/commit.c:874
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4205,139 +4375,144 @@
 "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:802
+#: builtin/commit.c:888
 #, c-format
-msgid "%sAuthor:    %s"
-msgstr "%sFörfattare: %s"
+msgid "%sAuthor:    %.*s <%.*s>"
+msgstr "%sFörfattare: %.*s <%.*s>"
 
-#: builtin/commit.c:809
+#: builtin/commit.c:896
 #, c-format
-msgid "%sCommitter: %s"
-msgstr "%sIncheckare: %s"
+msgid "%sDate:      %s"
+msgstr "%sDatum:      %s"
 
-#: builtin/commit.c:829
+#: builtin/commit.c:903
+#, c-format
+msgid "%sCommitter: %.*s <%.*s>"
+msgstr "%sIncheckare: %.*s <%.*s>"
+
+#: builtin/commit.c:921
 msgid "Cannot read index"
 msgstr "Kan inte läsa indexet"
 
-#: builtin/commit.c:872
+#: builtin/commit.c:978
 msgid "Error building trees"
 msgstr "Fel vid byggande av träd"
 
-#: builtin/commit.c:887 builtin/tag.c:391
+#: builtin/commit.c:993 builtin/tag.c:495
 #, 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:989
+#: builtin/commit.c:1095
 #, c-format
 msgid "No existing author found with '%s'"
 msgstr "Hittade ingen befintlig författare med \"%s\""
 
-#: builtin/commit.c:1004 builtin/commit.c:1244
+#: builtin/commit.c:1110 builtin/commit.c:1350
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Ogiltigt läge för ospårade filer: \"%s\""
 
-#: builtin/commit.c:1041
+#: builtin/commit.c:1147
 msgid "--long and -z are incompatible"
 msgstr "--long och -z är inkompatibla"
 
-#: builtin/commit.c:1071
+#: builtin/commit.c:1177
 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:1080
+#: builtin/commit.c:1186
 msgid "You have nothing to amend."
 msgstr "Du har inget att utöka."
 
-#: builtin/commit.c:1083
+#: builtin/commit.c:1189
 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:1085
+#: builtin/commit.c:1191
 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:1088
+#: builtin/commit.c:1194
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Flaggorna --squash och --fixup kan inte användas samtidigt"
 
-#: builtin/commit.c:1098
+#: builtin/commit.c:1204
 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:1100
+#: builtin/commit.c:1206
 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:1108
+#: builtin/commit.c:1214
 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:1125
+#: builtin/commit.c:1231
 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:1127
+#: builtin/commit.c:1233
 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:1129
+#: builtin/commit.c:1235
 msgid "Clever... amending the last one with dirty index."
 msgstr "Smart... utöka den senaste med smutsigt index."
 
-#: builtin/commit.c:1131
+#: builtin/commit.c:1237
 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:1143 builtin/tag.c:639
+#: builtin/commit.c:1249 builtin/tag.c:728
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Felaktigt städningsläge %s"
 
-#: builtin/commit.c:1148
+#: builtin/commit.c:1254
 msgid "Paths with -a does not make sense."
 msgstr "Kan inte ange sökvägar med -a."
 
-#: builtin/commit.c:1258 builtin/commit.c:1516
+#: builtin/commit.c:1364 builtin/commit.c:1644
 msgid "show status concisely"
 msgstr "visa koncis status"
 
-#: builtin/commit.c:1260 builtin/commit.c:1518
+#: builtin/commit.c:1366 builtin/commit.c:1646
 msgid "show branch information"
 msgstr "visa information om gren"
 
-#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
+#: builtin/commit.c:1368 builtin/commit.c:1648 builtin/push.c:500
 msgid "machine-readable output"
 msgstr "maskinläsbar utdata"
 
-#: builtin/commit.c:1265 builtin/commit.c:1522
+#: builtin/commit.c:1371 builtin/commit.c:1650
 msgid "show status in long format (default)"
 msgstr "visa status i långt format (standard)"
 
-#: builtin/commit.c:1268 builtin/commit.c:1525
+#: builtin/commit.c:1374 builtin/commit.c:1653
 msgid "terminate entries with NUL"
 msgstr "terminera poster med NUL"
 
-#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:514
+#: builtin/commit.c:1376 builtin/commit.c:1656 builtin/fast-export.c:980
+#: builtin/fast-export.c:983 builtin/tag.c:603
 msgid "mode"
 msgstr "läge"
 
-#: builtin/commit.c:1271 builtin/commit.c:1528
+#: builtin/commit.c:1377 builtin/commit.c:1656
 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:1274
+#: builtin/commit.c:1380
 msgid "show ignored files"
 msgstr "visa ignorerade filer"
 
-#: builtin/commit.c:1275 parse-options.h:153
+#: builtin/commit.c:1381 parse-options.h:153
 msgid "when"
 msgstr "när"
 
-#: builtin/commit.c:1276
+#: builtin/commit.c:1382
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -4345,220 +4520,212 @@
 "ignorera ändringar i undermoduler, valfritt när: all, dirty, untracked. "
 "(Default: all)"
 
-#: builtin/commit.c:1278
+#: builtin/commit.c:1384
 msgid "list untracked files in columns"
 msgstr "visa ospårade filer i spalter"
 
-#: builtin/commit.c:1347
+#: builtin/commit.c:1471
 msgid "couldn't look up newly created commit"
 msgstr "kunde inte slå upp en precis skapad incheckning"
 
-#: builtin/commit.c:1349
+#: builtin/commit.c:1473
 msgid "could not parse newly created commit"
 msgstr "kunde inte tolka en precis skapad incheckning"
 
-#: builtin/commit.c:1390
+#: builtin/commit.c:1518
 msgid "detached HEAD"
 msgstr "frånkopplad HEAD"
 
-#: builtin/commit.c:1392
+#: builtin/commit.c:1521
 msgid " (root-commit)"
 msgstr " (rotincheckning)"
 
-#: builtin/commit.c:1486
+#: builtin/commit.c:1614
 msgid "suppress summary after successful commit"
 msgstr "undertryck sammanfattning efter framgångsrik incheckning"
 
-#: builtin/commit.c:1487
+#: builtin/commit.c:1615
 msgid "show diff in commit message template"
 msgstr "visa diff i mallen för incheckningsmeddelandet"
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1617
 msgid "Commit message options"
 msgstr "Alternativ för incheckningsmeddelande"
 
-#: builtin/commit.c:1490 builtin/tag.c:512
+#: builtin/commit.c:1618 builtin/tag.c:601
 msgid "read message from file"
 msgstr "läs meddelande från fil"
 
-#: builtin/commit.c:1491
+#: builtin/commit.c:1619
 msgid "author"
 msgstr "författare"
 
-#: builtin/commit.c:1491
+#: builtin/commit.c:1619
 msgid "override author for commit"
 msgstr "överstyr författare för incheckningen"
 
-#: builtin/commit.c:1492 builtin/gc.c:272
+#: builtin/commit.c:1620 builtin/gc.c:275
 msgid "date"
 msgstr "datum"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1620
 msgid "override date for commit"
-msgstr "överstyr datum för inchecknignen"
+msgstr "överstyr datum för incheckningen"
 
-#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
-#: builtin/notes.c:566 builtin/tag.c:510
+#: builtin/commit.c:1621 builtin/merge.c:217 builtin/notes.c:408
+#: builtin/notes.c:565 builtin/tag.c:599
 msgid "message"
 msgstr "meddelande"
 
-#: builtin/commit.c:1493
+#: builtin/commit.c:1621
 msgid "commit message"
 msgstr "incheckningsmeddelande"
 
-#: builtin/commit.c:1494
+#: builtin/commit.c:1622
 msgid "reuse and edit message from specified commit"
 msgstr "återanvänd och redigera meddelande från angiven incheckning"
 
-#: builtin/commit.c:1495
+#: builtin/commit.c:1623
 msgid "reuse message from specified commit"
 msgstr "återanvänd meddelande från angiven incheckning"
 
-#: builtin/commit.c:1496
+#: builtin/commit.c:1624
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "använd autosquash-formaterat meddelande för att fixa angiven incheckning"
 
-#: builtin/commit.c:1497
+#: builtin/commit.c:1625
 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:1498
+#: builtin/commit.c:1626
 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:1499 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1627 builtin/log.c:1191 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "lägg till Signed-off-by:"
 
-#: builtin/commit.c:1500
+#: builtin/commit.c:1628
 msgid "use specified template file"
 msgstr "använd angiven mallfil"
 
-#: builtin/commit.c:1501
+#: builtin/commit.c:1629
 msgid "force edit of commit"
 msgstr "tvinga redigering av incheckning"
 
-#: builtin/commit.c:1502
+#: builtin/commit.c:1630
 msgid "default"
 msgstr "standard"
 
-#: builtin/commit.c:1502 builtin/tag.c:515
+#: builtin/commit.c:1630 builtin/tag.c:604
 msgid "how to strip spaces and #comments from message"
 msgstr "hur blanksteg och #kommentarer skall tas bort från meddelande"
 
-#: builtin/commit.c:1503
+#: builtin/commit.c:1631
 msgid "include status in commit message template"
 msgstr "inkludera status i mallen för incheckningsmeddelandet"
 
-#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
-#: builtin/tag.c:516
+#: builtin/commit.c:1632 builtin/merge.c:224 builtin/revert.c:92
+#: builtin/tag.c:605
 msgid "key-id"
 msgstr "nyckel-id"
 
-#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
+#: builtin/commit.c:1633 builtin/merge.c:225 builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "GPG-signera incheckning"
 
-#: builtin/commit.c:1508
+#: builtin/commit.c:1636
 msgid "Commit contents options"
 msgstr "Alternativ för incheckningens innehåll"
 
-#: builtin/commit.c:1509
+#: builtin/commit.c:1637
 msgid "commit all changed files"
 msgstr "checka in alla ändrade filer"
 
-#: builtin/commit.c:1510
+#: builtin/commit.c:1638
 msgid "add specified files to index for commit"
 msgstr "lägg till angivna filer till indexet för incheckning"
 
-#: builtin/commit.c:1511
+#: builtin/commit.c:1639
 msgid "interactively add files"
 msgstr "lägg till filer interaktivt"
 
-#: builtin/commit.c:1512
+#: builtin/commit.c:1640
 msgid "interactively add changes"
 msgstr "lägg till ändringar interaktivt"
 
-#: builtin/commit.c:1513
+#: builtin/commit.c:1641
 msgid "commit only specified files"
 msgstr "checka endast in angivna filer"
 
-#: builtin/commit.c:1514
+#: builtin/commit.c:1642
 msgid "bypass pre-commit hook"
 msgstr "förbigå pre-commit-krok"
 
-#: builtin/commit.c:1515
+#: builtin/commit.c:1643
 msgid "show what would be committed"
 msgstr "visa vad som skulle checkas in"
 
-#: builtin/commit.c:1526
+#: builtin/commit.c:1654
 msgid "amend previous commit"
 msgstr "lägg till föregående incheckning"
 
-#: builtin/commit.c:1527
+#: builtin/commit.c:1655
 msgid "bypass post-rewrite hook"
 msgstr "förbigå post-rewrite-krok"
 
-#: builtin/commit.c:1532
+#: builtin/commit.c:1660
 msgid "ok to record an empty change"
 msgstr "ok att registrera en tom ändring"
 
-#: builtin/commit.c:1534
+#: builtin/commit.c:1662
 msgid "ok to record a change with an empty message"
 msgstr "ok att registrera en ändring med tomt meddelande"
 
-#: builtin/commit.c:1562
+#: builtin/commit.c:1691
 msgid "could not parse HEAD commit"
 msgstr "kunde inte tolka HEAD:s incheckning"
 
-#: builtin/commit.c:1601 builtin/merge.c:518
+#: builtin/commit.c:1730 builtin/merge.c:518
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "kunde inte öppna \"%s\" för läsning"
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1737
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Trasig MERGE_HEAD-fil (%s)"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1744
 msgid "could not read MERGE_MODE"
 msgstr "kunde inte läsa MERGE_MODE"
 
-#: builtin/commit.c:1634
+#: builtin/commit.c:1763
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "kunde inte läsa incheckningsmeddelande: %s"
 
-#: builtin/commit.c:1645
+#: builtin/commit.c:1774
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Avbryter incheckning; meddelandet inte redigerat.\n"
 
-#: builtin/commit.c:1650
+#: builtin/commit.c:1779
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Avbryter på grund av tomt incheckningsmeddelande.\n"
 
-#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
+#: builtin/commit.c:1794 builtin/merge.c:850 builtin/merge.c:875
 msgid "failed to write commit object"
 msgstr "kunde inte skriva incheckningsobjekt"
 
-#: builtin/commit.c:1686
-msgid "cannot lock HEAD ref"
-msgstr "kunde inte låsa HEAD-referens"
-
-#: builtin/commit.c:1690
-msgid "cannot update HEAD ref"
-msgstr "kunde inte uppdatera HEAD-referens"
-
-#: builtin/commit.c:1701
+#: builtin/commit.c:1827
 msgid ""
 "Repository has been updated, but unable to write\n"
-"new_index file. Check that disk is not full or quota is\n"
+"new_index file. Check that disk is not full and quota is\n"
 "not exceeded, and then \"git reset HEAD\" to recover."
 msgstr ""
 "Arkivet har uppdaterats, men kunde inte skriva filen\n"
@@ -4588,7 +4755,7 @@
 
 #: builtin/config.c:57
 msgid "use given config file"
-msgstr "använd angiven konfigurationsil"
+msgstr "använd angiven konfigurationsfil"
 
 #: builtin/config.c:58
 msgid "blob-id"
@@ -4694,63 +4861,87 @@
 msgid "respect include directives on lookup"
 msgstr "respektera inkluderingsdirektiv vid uppslag"
 
-#: builtin/count-objects.c:82
+#: builtin/config.c:315
+msgid "unable to parse default color value"
+msgstr "kan inte tolka standardfärgvärde"
+
+#: builtin/config.c:455
+#, c-format
+msgid ""
+"# This is Git's per-user configuration file.\n"
+"[core]\n"
+"# Please adapt and uncomment the following lines:\n"
+"#\tuser = %s\n"
+"#\temail = %s\n"
+msgstr ""
+"# Detta är Gits användarspecifika konfigurationsfil\n"
+"[core]\n"
+"# Justera och ta bort kommenteringsmärket från följande rader:\n"
+"#\tuser = %s\n"
+"#\temail = %s\n"
+
+#: builtin/config.c:590
+#, c-format
+msgid "cannot create configuration file %s"
+msgstr "kan inte skapa konfigurationsfilen \"%s\""
+
+#: builtin/count-objects.c:55
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:97
+#: builtin/count-objects.c:65
 msgid "print sizes in human readable format"
 msgstr "skriv storlekar i människoläsbart format"
 
-#: builtin/describe.c:16
+#: builtin/describe.c:17
 msgid "git describe [options] <commit-ish>*"
 msgstr "git describe [flaggor] <incheckning-igt>*"
 
-#: builtin/describe.c:17
+#: builtin/describe.c:18
 msgid "git describe [options] --dirty"
 msgstr "git describe [flaggor] --dirty"
 
-#: builtin/describe.c:225
+#: builtin/describe.c:217
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "den annoterade taggen %s inte tillgänglig"
 
-#: builtin/describe.c:229
+#: builtin/describe.c:221
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr "den annoterade taggen %s har inget inbäddat namn"
 
-#: builtin/describe.c:231
+#: builtin/describe.c:223
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "taggen \"%s\" är i verkligheten \"%s\" här"
 
-#: builtin/describe.c:258
+#: builtin/describe.c:250 builtin/log.c:452
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "Objektnamnet är inte giltigt: %s"
 
-#: builtin/describe.c:261
+#: builtin/describe.c:253
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr "%s är inte ett giltigt \"%s\"-objekt"
 
-#: builtin/describe.c:278
+#: builtin/describe.c:270
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr "ingen tagg motsvarar \"%s\" exakt"
 
-#: builtin/describe.c:280
+#: builtin/describe.c:272
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "söker för att beskriva %s\n"
 
-#: builtin/describe.c:327
+#: builtin/describe.c:319
 #, c-format
 msgid "finished search at %s\n"
 msgstr "avslutade sökning på %s\n"
 
-#: builtin/describe.c:354
+#: builtin/describe.c:346
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -4759,7 +4950,7 @@
 "Inga annoterade taggar kan beskriva \"%s\".\n"
 "Det finns dock oannoterade taggar: testa --tags."
 
-#: builtin/describe.c:358
+#: builtin/describe.c:350
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -4768,12 +4959,12 @@
 "Inga taggar kan beskriva \"%s\".\n"
 "Testa --always, eller skapa några taggar."
 
-#: builtin/describe.c:379
+#: builtin/describe.c:371
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "traverserade %lu incheckningar\n"
 
-#: builtin/describe.c:382
+#: builtin/describe.c:374
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
@@ -4782,135 +4973,147 @@
 "mer än %i taggar hittades; listar de %i senaste\n"
 "gav upp sökningen vid %s\n"
 
-#: builtin/describe.c:404
+#: builtin/describe.c:396
 msgid "find the tag that comes after the commit"
 msgstr "hitta taggen som kommer efter incheckningen"
 
-#: builtin/describe.c:405
+#: builtin/describe.c:397
 msgid "debug search strategy on stderr"
 msgstr "felsök sökstrategin på standard fel"
 
-#: builtin/describe.c:406
+#: builtin/describe.c:398
 msgid "use any ref"
 msgstr "använd alla referenser"
 
-#: builtin/describe.c:407
+#: builtin/describe.c:399
 msgid "use any tag, even unannotated"
 msgstr "använd alla taggar, även oannoterade"
 
-#: builtin/describe.c:408
+#: builtin/describe.c:400
 msgid "always use long format"
 msgstr "använd alltid långt format"
 
-#: builtin/describe.c:409
+#: builtin/describe.c:401
 msgid "only follow first parent"
 msgstr "följ endast första föräldern"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:404
 msgid "only output exact matches"
 msgstr "skriv endast ut exakta träffar"
 
-#: builtin/describe.c:414
+#: builtin/describe.c:406
 msgid "consider <n> most recent tags (default: 10)"
 msgstr "överväg de <n> nyaste taggarna (standard: 10)"
 
-#: builtin/describe.c:416
+#: builtin/describe.c:408
 msgid "only consider tags matching <pattern>"
 msgstr "överväg endast taggar som motsvarar <mönster>"
 
-#: builtin/describe.c:418 builtin/name-rev.c:321
+#: builtin/describe.c:410 builtin/name-rev.c:318
 msgid "show abbreviated commit object as fallback"
 msgstr "visa förkortade incheckningsobjekt som standard"
 
-#: builtin/describe.c:419
+#: builtin/describe.c:411
 msgid "mark"
 msgstr "märke"
 
-#: builtin/describe.c:420
+#: builtin/describe.c:412
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr "lägg till <märke> på lortigt arbetsträd (standard: \"-dirty\")"
 
-#: builtin/describe.c:438
+#: builtin/describe.c:430
 msgid "--long is incompatible with --abbrev=0"
 msgstr "--long är inkompatibel med --abbrev=0"
 
-#: builtin/describe.c:464
+#: builtin/describe.c:456
 msgid "No names found, cannot describe anything."
 msgstr "Inga namn hittades, kan inte beskriva något."
 
-#: builtin/describe.c:484
+#: builtin/describe.c:476
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "--dirty är inkompatibelt med \"commit-ish\"-värden"
 
-#: builtin/diff.c:85
+#: builtin/diff.c:86
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "\"%s\": inte en normal fil eller symbolisk länk"
 
-#: builtin/diff.c:236
+#: builtin/diff.c:237
 #, c-format
 msgid "invalid option: %s"
 msgstr "ogiltig flagga: %s"
 
-#: builtin/diff.c:357
+#: builtin/diff.c:358
 msgid "Not a git repository"
 msgstr "Inte ett git-arkiv"
 
-#: builtin/diff.c:400
+#: builtin/diff.c:401
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "objektet \"%s\" som angavs är felaktigt."
 
-#: builtin/diff.c:409
+#: builtin/diff.c:410
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "mer än två blobbar angavs: \"%s\""
 
-#: builtin/diff.c:416
+#: builtin/diff.c:417
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "ej hanterat objekt \"%s\" angavs."
 
-#: builtin/fast-export.c:22
+#: builtin/fast-export.c:24
 msgid "git fast-export [rev-list-opts]"
 msgstr "git fast-export [rev-list-flaggor]"
 
-#: builtin/fast-export.c:673
+#: builtin/fast-export.c:979
 msgid "show progress after <n> objects"
 msgstr "visa förlopp efter <n> objekt"
 
-#: builtin/fast-export.c:675
+#: builtin/fast-export.c:981
 msgid "select handling of signed tags"
 msgstr "välj hantering av signerade taggar"
 
-#: builtin/fast-export.c:678
+#: builtin/fast-export.c:984
 msgid "select handling of tags that tag filtered objects"
 msgstr "välj hantering av taggar som har taggfiltrerade objekt"
 
-#: builtin/fast-export.c:681
+#: builtin/fast-export.c:987
 msgid "Dump marks to this file"
 msgstr "Dump märken till filen"
 
-#: builtin/fast-export.c:683
+#: builtin/fast-export.c:989
 msgid "Import marks from this file"
 msgstr "Importera märken från filen"
 
-#: builtin/fast-export.c:685
+#: builtin/fast-export.c:991
 msgid "Fake a tagger when tags lack one"
 msgstr "Fejka taggare när taggen saknar en"
 
-#: builtin/fast-export.c:687
+#: builtin/fast-export.c:993
 msgid "Output full tree for each commit"
 msgstr "Skriv ut hela trädet för varje incheckning"
 
-#: builtin/fast-export.c:689
+#: builtin/fast-export.c:995
 msgid "Use the done feature to terminate the stream"
 msgstr "Använd done-funktionen för att avsluta strömmen"
 
-#: builtin/fast-export.c:690
+#: builtin/fast-export.c:996
 msgid "Skip output of blob data"
 msgstr "Hoppa över skrivning av blob-data"
 
+#: builtin/fast-export.c:997
+msgid "refspec"
+msgstr "referensspecifikation"
+
+#: builtin/fast-export.c:998
+msgid "Apply refspec to exported refs"
+msgstr "Applicera referensspecifikation på exporterade referenser"
+
+#: builtin/fast-export.c:999
+msgid "anonymize output"
+msgstr "anonymisera utdata"
+
 #: builtin/fetch.c:20
 msgid "git fetch [<options>] [<repository> [<refspec>...]]"
 msgstr "git fetch [<flaggor>] [<arkiv> [<refspec>...]]"
@@ -4927,153 +5130,161 @@
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<flaggor>]"
 
-#: builtin/fetch.c:75
+#: builtin/fetch.c:90
 msgid "fetch from all remotes"
 msgstr "hämta från alla fjärrar"
 
-#: builtin/fetch.c:77
+#: builtin/fetch.c:92
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "lägg till i .git/FETCH_HEAD istället för att skriva över"
 
-#: builtin/fetch.c:79
+#: builtin/fetch.c:94
 msgid "path to upload pack on remote end"
 msgstr "sökväg till upload pack på fjärren"
 
-#: builtin/fetch.c:80
+#: builtin/fetch.c:95
 msgid "force overwrite of local branch"
 msgstr "tvinga överskrivning av lokal gren"
 
-#: builtin/fetch.c:82
+#: builtin/fetch.c:97
 msgid "fetch from multiple remotes"
 msgstr "hämta från flera fjärrar"
 
-#: builtin/fetch.c:84
+#: builtin/fetch.c:99
 msgid "fetch all tags and associated objects"
 msgstr "hämta alla taggar och associerade objekt"
 
-#: builtin/fetch.c:86
+#: builtin/fetch.c:101
 msgid "do not fetch all tags (--no-tags)"
 msgstr "hämta inte alla taggar (--no-tags)"
 
-#: builtin/fetch.c:88
+#: builtin/fetch.c:103
 msgid "prune remote-tracking branches no longer on remote"
 msgstr "rensa fjärrspårande grenar ej längre på fjärren"
 
-#: builtin/fetch.c:89
+#: builtin/fetch.c:104
 msgid "on-demand"
 msgstr "on-demand"
 
-#: builtin/fetch.c:90
+#: builtin/fetch.c:105
 msgid "control recursive fetching of submodules"
 msgstr "styr rekursiv hämtning av undermoduler"
 
-#: builtin/fetch.c:94
+#: builtin/fetch.c:109
 msgid "keep downloaded pack"
 msgstr "behåll hämtade paket"
 
-#: builtin/fetch.c:96
+#: builtin/fetch.c:111
 msgid "allow updating of HEAD ref"
 msgstr "tillåt uppdatering av HEAD-referens"
 
-#: builtin/fetch.c:99
+#: builtin/fetch.c:114
 msgid "deepen history of shallow clone"
 msgstr "fördjupa historik för grund klon"
 
-#: builtin/fetch.c:101
+#: builtin/fetch.c:116
 msgid "convert to a complete repository"
 msgstr "konvertera till komplett arkiv"
 
-#: builtin/fetch.c:103 builtin/log.c:1197
+#: builtin/fetch.c:118 builtin/log.c:1208
 msgid "dir"
 msgstr "kat"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:119
 msgid "prepend this to submodule path output"
 msgstr "lägg till i början av undermodulens sökvägsutdata"
 
-#: builtin/fetch.c:107
+#: builtin/fetch.c:122
 msgid "default mode for recursion"
 msgstr "standardläge för rekursion"
 
-#: builtin/fetch.c:109
+#: builtin/fetch.c:124
 msgid "accept refs that update .git/shallow"
 msgstr "tar emot referenser som uppdaterar .git/shallow"
 
-#: builtin/fetch.c:347
+#: builtin/fetch.c:125
+msgid "refmap"
+msgstr "referenskarta"
+
+#: builtin/fetch.c:126
+msgid "specify fetch refmap"
+msgstr "ange referenskarta för \"fetch\""
+
+#: builtin/fetch.c:376
 msgid "Couldn't find remote ref HEAD"
 msgstr "Kunde inte hitta fjärr-referensen HEAD"
 
-#: builtin/fetch.c:411
+#: builtin/fetch.c:454
 #, c-format
 msgid "object %s not found"
 msgstr "objektet %s hittades inte"
 
-#: builtin/fetch.c:416
+#: builtin/fetch.c:459
 msgid "[up to date]"
 msgstr "[àjour]"
 
-#: builtin/fetch.c:430
+#: builtin/fetch.c:473
 #, c-format
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr "! %-*s %-*s -> %s  (kan inte hämta i aktuell gren)"
 
-#: builtin/fetch.c:431 builtin/fetch.c:517
+#: builtin/fetch.c:474 builtin/fetch.c:560
 msgid "[rejected]"
 msgstr "[refuserad]"
 
-#: builtin/fetch.c:442
+#: builtin/fetch.c:485
 msgid "[tag update]"
 msgstr "[uppdaterad tagg]"
 
-#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497
+#: builtin/fetch.c:487 builtin/fetch.c:522 builtin/fetch.c:540
 msgid "  (unable to update local ref)"
 msgstr "  (kunde inte uppdatera lokal ref)"
 
-#: builtin/fetch.c:462
+#: builtin/fetch.c:505
 msgid "[new tag]"
 msgstr "[ny tagg]"
 
-#: builtin/fetch.c:465
+#: builtin/fetch.c:508
 msgid "[new branch]"
 msgstr "[ny gren]"
 
-#: builtin/fetch.c:468
+#: builtin/fetch.c:511
 msgid "[new ref]"
 msgstr "[ny ref]"
 
-#: builtin/fetch.c:513
+#: builtin/fetch.c:556
 msgid "unable to update local ref"
 msgstr "kunde inte uppdatera lokal ref"
 
-#: builtin/fetch.c:513
+#: builtin/fetch.c:556
 msgid "forced update"
 msgstr "tvingad uppdatering"
 
-#: builtin/fetch.c:519
+#: builtin/fetch.c:562
 msgid "(non-fast-forward)"
 msgstr "(ej snabbspolad)"
 
-#: builtin/fetch.c:552 builtin/fetch.c:785
+#: builtin/fetch.c:595 builtin/fetch.c:828
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "kan inte öppna %s: %s\n"
 
-#: builtin/fetch.c:561
+#: builtin/fetch.c:604
 #, 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:579
+#: builtin/fetch.c:622
 #, 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:667 builtin/fetch.c:750
+#: builtin/fetch.c:710 builtin/fetch.c:793
 #, c-format
 msgid "From %.*s\n"
 msgstr "Från %.*s\n"
 
-#: builtin/fetch.c:678
+#: builtin/fetch.c:721
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -5082,55 +5293,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:730
+#: builtin/fetch.c:773
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s kommer bli dinglande)"
 
-#: builtin/fetch.c:731
+#: builtin/fetch.c:774
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s har blivit dinglande)"
 
-#: builtin/fetch.c:755
+#: builtin/fetch.c:798
 msgid "[deleted]"
 msgstr "[borttagen]"
 
-#: builtin/fetch.c:756 builtin/remote.c:1050
+#: builtin/fetch.c:799 builtin/remote.c:1063
 msgid "(none)"
 msgstr "(ingen)"
 
-#: builtin/fetch.c:775
+#: builtin/fetch.c:818
 #, 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:794
+#: builtin/fetch.c:837
 #, 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:797
+#: builtin/fetch.c:840
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Flaggan \"%s\" ignoreras för %s\n"
 
-#: builtin/fetch.c:853
+#: builtin/fetch.c:896
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Vet inte hur man hämtar från %s"
 
-#: builtin/fetch.c:1015
+#: builtin/fetch.c:1058
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Hämtar %s\n"
 
-#: builtin/fetch.c:1017 builtin/remote.c:90
+#: builtin/fetch.c:1060 builtin/remote.c:90
 #, c-format
 msgid "Could not fetch %s"
 msgstr "Kunde inte hämta %s"
 
-#: builtin/fetch.c:1035
+#: builtin/fetch.c:1078
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -5138,32 +5349,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:1059
+#: builtin/fetch.c:1101
 msgid "You need to specify a tag name."
 msgstr "Du måste ange namnet på en tagg."
 
-#: builtin/fetch.c:1107
+#: builtin/fetch.c:1143
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth och --unshallow kan inte användas samtidigt"
 
-#: builtin/fetch.c:1109
+#: builtin/fetch.c:1145
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "--unshallow kan inte användas på ett komplett arkiv"
 
-#: builtin/fetch.c:1132
+#: builtin/fetch.c:1168
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all tar inte namnet på ett arkiv som argument"
 
-#: builtin/fetch.c:1134
+#: builtin/fetch.c:1170
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all kan inte anges med referensspecifikationer"
 
-#: builtin/fetch.c:1145
+#: builtin/fetch.c:1181
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Fjärren eller fjärrgruppen finns inte: %s"
 
-#: builtin/fetch.c:1153
+#: builtin/fetch.c:1189
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Kan inte hämta från grupp och ange referensspecifikationer"
 
@@ -5172,9 +5383,9 @@
 msgstr ""
 "git fmt-merge-msg [-m <meddelande>] [--log[=<n>]|--no-log] [--file <fil>]"
 
-#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700
-#: builtin/merge.c:196 builtin/repack.c:175 builtin/repack.c:179
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:501
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:698
+#: builtin/merge.c:197 builtin/repack.c:179 builtin/repack.c:183
+#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:590
 #: parse-options.h:132 parse-options.h:239
 msgid "n"
 msgstr "n"
@@ -5199,99 +5410,105 @@
 msgid "file to read from"
 msgstr "fil att läsa från"
 
-#: builtin/for-each-ref.c:1063
+#: builtin/for-each-ref.c:676
+msgid "unable to parse format"
+msgstr "kan inte tolka formatet"
+
+#: builtin/for-each-ref.c:1057
 msgid "git for-each-ref [options] [<pattern>]"
 msgstr "git for-each-ref [flaggor] [<mönster>]"
 
-#: builtin/for-each-ref.c:1078
+#: builtin/for-each-ref.c:1072
 msgid "quote placeholders suitably for shells"
 msgstr "citera platshållare passande för skal"
 
-#: builtin/for-each-ref.c:1080
+#: builtin/for-each-ref.c:1074
 msgid "quote placeholders suitably for perl"
 msgstr "citera platshållare passande för perl"
 
-#: builtin/for-each-ref.c:1082
+#: builtin/for-each-ref.c:1076
 msgid "quote placeholders suitably for python"
 msgstr "citera platshållare passande för python"
 
-#: builtin/for-each-ref.c:1084
+#: builtin/for-each-ref.c:1078
 msgid "quote placeholders suitably for tcl"
 msgstr "citera platshållare passande för tcl"
 
-#: builtin/for-each-ref.c:1087
+#: builtin/for-each-ref.c:1081
 msgid "show only <n> matched refs"
 msgstr "visa endast <n> träffade refs"
 
-#: builtin/for-each-ref.c:1088 builtin/replace.c:177
+#: builtin/for-each-ref.c:1082 builtin/replace.c:438
 msgid "format"
 msgstr "format"
 
-#: builtin/for-each-ref.c:1088
+#: builtin/for-each-ref.c:1082
 msgid "format to use for the output"
 msgstr "format att använda för utdata"
 
-#: builtin/for-each-ref.c:1089
+#: builtin/for-each-ref.c:1083
 msgid "key"
 msgstr "nyckel"
 
-#: builtin/for-each-ref.c:1090
+#: builtin/for-each-ref.c:1084
 msgid "field name to sort on"
 msgstr "fältnamn att sortera på"
 
-#: builtin/fsck.c:147 builtin/prune.c:172
+# Vague original, not networking-related, but rather related to the actual
+# objects in the database.
+#: builtin/fsck.c:147 builtin/prune.c:136
 msgid "Checking connectivity"
 msgstr "Kontrollerar konnektivitet"
 
-#: builtin/fsck.c:544
+#: builtin/fsck.c:540
 msgid "Checking object directories"
 msgstr "Kontrollerar objektkataloger"
 
-#: builtin/fsck.c:607
+#: builtin/fsck.c:603
 msgid "git fsck [options] [<object>...]"
 msgstr "git fsck [flaggor] [<objekt>...]"
 
-#: builtin/fsck.c:613
+#: builtin/fsck.c:609
 msgid "show unreachable objects"
 msgstr "visa onåbara objekt"
 
-#: builtin/fsck.c:614
+#: builtin/fsck.c:610
 msgid "show dangling objects"
 msgstr "visa dinglande objekt"
 
-#: builtin/fsck.c:615
+#: builtin/fsck.c:611
 msgid "report tags"
 msgstr "rapportera taggar"
 
-#: builtin/fsck.c:616
+#: builtin/fsck.c:612
 msgid "report root nodes"
 msgstr "rapportera rotnoder"
 
-#: builtin/fsck.c:617
+#: builtin/fsck.c:613
 msgid "make index objects head nodes"
 msgstr "gör indexojekt till huvudnoder"
 
-#: builtin/fsck.c:618
+#: builtin/fsck.c:614
 msgid "make reflogs head nodes (default)"
 msgstr "gör refloggar till huvudnoder (standard)"
 
-#: builtin/fsck.c:619
+#: builtin/fsck.c:615
 msgid "also consider packs and alternate objects"
 msgstr "ta även hänsyn till paket och alternativa objekt"
 
-#: builtin/fsck.c:620
+#: builtin/fsck.c:616
 msgid "enable more strict checking"
 msgstr "aktivera striktare kontroll"
 
-#: builtin/fsck.c:622
+#: builtin/fsck.c:618
 msgid "write dangling objects in .git/lost-found"
 msgstr "skriv dinglande objekt i .git/lost-found"
 
-#: builtin/fsck.c:623 builtin/prune.c:144
+#: builtin/fsck.c:619 builtin/prune.c:108
 msgid "show progress"
 msgstr "visa förlopp"
 
-#: builtin/fsck.c:673
+#: builtin/fsck.c:669
 msgid "Checking objects"
 msgstr "Kontrollerar objekt"
 
@@ -5299,48 +5516,48 @@
 msgid "git gc [options]"
 msgstr "git gc [flaggor]"
 
-#: builtin/gc.c:90
+#: builtin/gc.c:79
 #, c-format
-msgid "Invalid %s: '%s'"
-msgstr "Felaktigt %s: \"%s\""
+msgid "Invalid gc.pruneexpire: '%s'"
+msgstr "Ogiltig gc.pruneexpire: '%s'"
 
-#: builtin/gc.c:117
+#: builtin/gc.c:107
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "tokigt lång objektkatalog %.*s"
 
-#: builtin/gc.c:273
+#: builtin/gc.c:276
 msgid "prune unreferenced objects"
 msgstr "rensa ej refererade objekt"
 
-#: builtin/gc.c:275
+#: builtin/gc.c:278
 msgid "be more thorough (increased runtime)"
 msgstr "var mer grundlig (ökar körtiden)"
 
-#: builtin/gc.c:276
+#: builtin/gc.c:279
 msgid "enable auto-gc mode"
 msgstr "aktivera auto-gc-läge"
 
-#: builtin/gc.c:277
+#: builtin/gc.c:280
 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:318
+#: builtin/gc.c:321
 #, 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:320
+#: builtin/gc.c:323
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "Packar arkivet automatiskt för optimal prestanda.\n"
 
-#: builtin/gc.c:321
+#: builtin/gc.c:324
 #, 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:342
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5348,7 +5565,7 @@
 "gc körs redan på maskinen \"%s\" pid %<PRIuMAX> (använd --force om så inte "
 "är fallet)"
 
-#: builtin/gc.c:361
+#: builtin/gc.c:364
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -5364,228 +5581,223 @@
 msgid "grep: failed to create thread: %s"
 msgstr "grep: misslyckades skapa tråd. %s"
 
-#: builtin/grep.c:365
-#, c-format
-msgid "Failed to chdir: %s"
-msgstr "Kunde inte byta katalog (chdir): %s"
-
-#: builtin/grep.c:443 builtin/grep.c:478
+#: builtin/grep.c:441 builtin/grep.c:476
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "kunde inte läsa träd (%s)"
 
-#: builtin/grep.c:493
+#: builtin/grep.c:491
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "Kunde inte \"grep\" från objekt av typen %s"
 
-#: builtin/grep.c:549
+#: builtin/grep.c:547
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "flaggan \"%c\" antar ett numeriskt värde"
 
-#: builtin/grep.c:566
+#: builtin/grep.c:564
 #, c-format
 msgid "cannot open '%s'"
 msgstr "kan inte öppna \"%s\""
 
-#: builtin/grep.c:640
+#: builtin/grep.c:638
 msgid "search in index instead of in the work tree"
 msgstr "sök i indexet istället för i arbetskatalogen"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:640
 msgid "find in contents not managed by git"
-msgstr "sök i innehål som inte hanteras av git"
+msgstr "sök i innehåll som inte hanteras av git"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:642
 msgid "search in both tracked and untracked files"
 msgstr "sök i både spårade och ospårade filer"
 
-#: builtin/grep.c:646
+#: builtin/grep.c:644
 msgid "search also in ignored files"
 msgstr "sök även i ignorerade filer"
 
-#: builtin/grep.c:649
+#: builtin/grep.c:647
 msgid "show non-matching lines"
 msgstr "visa rader som inte träffas"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:649
 msgid "case insensitive matching"
 msgstr "skiftlägesokänslig sökning"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:651
 msgid "match patterns only at word boundaries"
 msgstr "matcha endast mönster vid ordgränser"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:653
 msgid "process binary files as text"
 msgstr "hantera binärfiler som text"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:655
 msgid "don't match patterns in binary files"
 msgstr "träffa inte mönster i binärfiler"
 
-#: builtin/grep.c:660
+#: builtin/grep.c:658
 msgid "process binary files with textconv filters"
 msgstr "hantera binärfiler med textconv-filter"
 
-#: builtin/grep.c:662
+#: builtin/grep.c:660
 msgid "descend at most <depth> levels"
 msgstr "gå som mest ned <djup> nivåer"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:664
 msgid "use extended POSIX regular expressions"
 msgstr "använd utökade POSIX-reguljära uttryck"
 
-#: builtin/grep.c:669
+#: builtin/grep.c:667
 msgid "use basic POSIX regular expressions (default)"
 msgstr "använd grundläggande POSIX-reguljära uttryck (standard)"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:670
 msgid "interpret patterns as fixed strings"
 msgstr "tolka mönster som fixerade strängar"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:673
 msgid "use Perl-compatible regular expressions"
 msgstr "använd Perlkompatibla reguljära uttryck"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:676
 msgid "show line numbers"
 msgstr "visa radnummer"
 
-#: builtin/grep.c:679
+#: builtin/grep.c:677
 msgid "don't show filenames"
 msgstr "visa inte filnamn"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:678
 msgid "show filenames"
 msgstr "visa filnamn"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:680
 msgid "show filenames relative to top directory"
 msgstr "visa filnamn relativa till toppkatalogen"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:682
 msgid "show only filenames instead of matching lines"
 msgstr "visa endast filnamn istället för träffade rader"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:684
 msgid "synonym for --files-with-matches"
 msgstr "synonym för --files-with-matches"
 
-#: builtin/grep.c:689
+#: builtin/grep.c:687
 msgid "show only the names of files without match"
 msgstr "visa endast namn på filer utan träffar"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:689
 msgid "print NUL after filenames"
 msgstr "skriv NUL efter filnamn"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:691
 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:694
+#: builtin/grep.c:692
 msgid "highlight matches"
 msgstr "ljusmarkera träffar"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:694
 msgid "print empty line between matches from different files"
 msgstr "skriv tomma rader mellan träffar från olika filer"
 
-#: builtin/grep.c:698
+#: builtin/grep.c:696
 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:701
+#: builtin/grep.c:699
 msgid "show <n> context lines before and after matches"
 msgstr "visa <n> rader sammanhang före och efter träffar"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:702
 msgid "show <n> context lines before matches"
 msgstr "visa <n> rader sammanhang före träffar"
 
-#: builtin/grep.c:706
+#: builtin/grep.c:704
 msgid "show <n> context lines after matches"
 msgstr "visa <n> rader sammanhang efter träffar"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:705
 msgid "shortcut for -C NUM"
 msgstr "genväg för -C NUM"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:708
 msgid "show a line with the function name before matches"
 msgstr "visa en rad med funktionsnamnet före träffen"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:710
 msgid "show the surrounding function"
 msgstr "visa den omkringliggande funktionen"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:713
 msgid "read patterns from file"
 msgstr "läs mönster från fil"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:715
 msgid "match <pattern>"
 msgstr "träffa <mönster>"
 
-#: builtin/grep.c:719
+#: builtin/grep.c:717
 msgid "combine patterns specified with -e"
 msgstr "kombinera mönster som anges med -e"
 
-#: builtin/grep.c:731
+#: builtin/grep.c:729
 msgid "indicate hit with exit status without output"
 msgstr "ange träff med slutstatuskod utan utdata"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:731
 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:735
+#: builtin/grep.c:733
 msgid "show parse tree for grep expression"
 msgstr "visa analysträd för grep-uttryck"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:737
 msgid "pager"
 msgstr "bläddrare"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:737
 msgid "show matching files in the pager"
 msgstr "visa träffade filer i filbläddraren"
 
-#: builtin/grep.c:742
+#: builtin/grep.c:740
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "tillåt anropa grep(1) (ignoreras av detta bygge)"
 
-#: builtin/grep.c:743 builtin/show-ref.c:187
+#: builtin/grep.c:741 builtin/show-ref.c:187
 msgid "show usage"
 msgstr "visa användning"
 
-#: builtin/grep.c:810
+#: builtin/grep.c:808
 msgid "no pattern given."
 msgstr "inget mönster angavs."
 
-#: builtin/grep.c:868
+#: builtin/grep.c:866
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager fungerar endast i arbetskatalogen"
 
-#: builtin/grep.c:891
+#: builtin/grep.c:892
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached och --untracked kan inte användas med --no-index."
 
-#: builtin/grep.c:896
+#: builtin/grep.c:897
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index och --untracked kan inte användas med revisioner."
 
-#: builtin/grep.c:899
+#: builtin/grep.c:900
 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:907
+#: builtin/grep.c:908
 msgid "both --cached and trees are given."
 msgstr "både --cached och träd angavs."
 
-#: builtin/hash-object.c:60
+#: builtin/hash-object.c:82
 msgid ""
 "git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] "
 "<file>..."
@@ -5593,31 +5805,37 @@
 "git hash-object [-t <typ>] [-w] [--path=<fil>|--no-filters] [--stdin] [--] "
 "<fil>..."
 
-#: builtin/hash-object.c:61
+#: builtin/hash-object.c:83
 msgid "git hash-object  --stdin-paths < <list-of-paths>"
 msgstr "git hash-object  --stdin-paths < <sökvägslista>"
 
-#: builtin/hash-object.c:72 builtin/tag.c:521
+#: builtin/hash-object.c:94 builtin/tag.c:610
 msgid "type"
 msgstr "typ"
 
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr "objekttyp"
 
-#: builtin/hash-object.c:73
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr "skriv objektet till objektdatabasen"
 
-#: builtin/hash-object.c:74
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr "läs objektet från standard in"
 
-#: builtin/hash-object.c:76
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr "spara filen som den är utan filer"
 
-#: builtin/hash-object.c:77
+#: builtin/hash-object.c:100
+msgid ""
+"just hash any random garbage to create corrupt objects for debugging Git"
+msgstr ""
+"hasha slumpmässigt skräp för att skapa korrupta objekt för felsökning av Git"
+
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr "hantera filen som om den kom från sökvägen"
 
@@ -5650,25 +5868,25 @@
 msgid "unrecognized help format '%s'"
 msgstr "okänt hjälpformat: %s"
 
-#: builtin/help.c:92
+#: builtin/help.c:91
 msgid "Failed to start emacsclient."
 msgstr "Misslyckades starta emacsclient."
 
-#: builtin/help.c:105
+#: builtin/help.c:104
 msgid "Failed to parse emacsclient version."
 msgstr "Kunde inte tolka emacsclient-version."
 
-#: builtin/help.c:113
+#: builtin/help.c:112
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "emacsclient version \"%d\" för gammal (< 22)."
 
-#: builtin/help.c:131 builtin/help.c:159 builtin/help.c:168 builtin/help.c:176
+#: builtin/help.c:130 builtin/help.c:158 builtin/help.c:167 builtin/help.c:175
 #, c-format
 msgid "failed to exec '%s': %s"
 msgstr "exec misslyckades för \"%s\": %s"
 
-#: builtin/help.c:216
+#: builtin/help.c:215
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -5677,7 +5895,7 @@
 "\"%s\": sökväg för man-visare som ej stöds.\n"
 "Använd \"man.<verktyg>.cmd\" istället."
 
-#: builtin/help.c:228
+#: builtin/help.c:227
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -5686,23 +5904,27 @@
 "\"%s\": kommando för man-visare som stöds.\n"
 "Använd \"man.<verktyg>.path\" istället."
 
-#: builtin/help.c:353
+#: builtin/help.c:352
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "\"%s\": okänd man-visare."
 
-#: builtin/help.c:370
+#: builtin/help.c:369
 msgid "no man viewer handled the request"
 msgstr "ingen man-visare hanterade förfrågan"
 
-#: builtin/help.c:378
+#: builtin/help.c:377
 msgid "no info viewer handled the request"
 msgstr "ingen info-visare hanterade förfrågan"
 
-#: builtin/help.c:424
+#: builtin/help.c:423
 msgid "Defining attributes per path"
 msgstr "Definierar attribut per sökväg"
 
+#: builtin/help.c:424
+msgid "Everyday Git With 20 Commands Or So"
+msgstr "Git för dagligt bruk i ungefär 20 kommandon"
+
 #: builtin/help.c:425
 msgid "A Git glossary"
 msgstr "En Git-ordlista"
@@ -5741,280 +5963,291 @@
 msgid "`git %s' is aliased to `%s'"
 msgstr "\"git %s\" är ett alias för \"%s\""
 
-#: builtin/index-pack.c:184
+#: builtin/index-pack.c:150
+#, c-format
+msgid "unable to open %s"
+msgstr "kunde inte öppna %s"
+
+#: builtin/index-pack.c:200
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "objekttyp stämmer inte överens vid %s"
 
-#: builtin/index-pack.c:204
-msgid "object of unexpected type"
-msgstr "objekt av oväntad typ"
+#: builtin/index-pack.c:220
+#, c-format
+msgid "did not receive expected object %s"
+msgstr "emottog inte det förväntade objektet %s"
 
-#: builtin/index-pack.c:244
+#: builtin/index-pack.c:223
+#, c-format
+msgid "object %s: expected type %s, found %s"
+msgstr "objektet %s: förväntad typ %s, såg %s"
+
+#: builtin/index-pack.c:265
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "kan inte fylla %d byte"
 msgstr[1] "kan inte fylla %d byte"
 
-#: builtin/index-pack.c:254
+#: builtin/index-pack.c:275
 msgid "early EOF"
 msgstr "tidigt filslut"
 
-#: builtin/index-pack.c:255
+#: builtin/index-pack.c:276
 msgid "read error on input"
 msgstr "indataläsfel"
 
-#: builtin/index-pack.c:267
+#: builtin/index-pack.c:288
 msgid "used more bytes than were available"
 msgstr "använde fler byte än tillgängligt"
 
-#: builtin/index-pack.c:274
+#: builtin/index-pack.c:295
 msgid "pack too large for current definition of off_t"
 msgstr "paket för stort för nuvarande definition av off_t"
 
-#: builtin/index-pack.c:290
+#: builtin/index-pack.c:311
 #, c-format
 msgid "unable to create '%s'"
 msgstr "kunde inte skapa \"%s\""
 
-#: builtin/index-pack.c:295
+#: builtin/index-pack.c:316
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "kan inte öppna paketfilen \"%s\""
 
-#: builtin/index-pack.c:309
+#: builtin/index-pack.c:330
 msgid "pack signature mismatch"
 msgstr "paketsignatur stämmer inte överens"
 
-#: builtin/index-pack.c:311
+#: builtin/index-pack.c:332
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "paketversion %<PRIu32> stöds ej"
 
-#: builtin/index-pack.c:329
+#: builtin/index-pack.c:350
 #, c-format
 msgid "pack has bad object at offset %lu: %s"
 msgstr "paketet har felaktigt objekt vid index %lu: %s"
 
-#: builtin/index-pack.c:451
+#: builtin/index-pack.c:471
 #, c-format
 msgid "inflate returned %d"
 msgstr "inflate returnerade %d"
 
-#: builtin/index-pack.c:500
+#: builtin/index-pack.c:520
 msgid "offset value overflow for delta base object"
 msgstr "indexvärdespill för deltabasobjekt"
 
-#: builtin/index-pack.c:508
+#: builtin/index-pack.c:528
 msgid "delta base offset is out of bound"
 msgstr "deltabasindex utanför gränsen"
 
-#: builtin/index-pack.c:516
+#: builtin/index-pack.c:536
 #, c-format
 msgid "unknown object type %d"
 msgstr "okänd objekttyp %d"
 
-#: builtin/index-pack.c:547
+#: builtin/index-pack.c:567
 msgid "cannot pread pack file"
 msgstr "kan inte utföra \"pread\" på paketfil"
 
-#: builtin/index-pack.c:549
+#: builtin/index-pack.c:569
 #, c-format
 msgid "premature end of pack file, %lu byte missing"
 msgid_plural "premature end of pack file, %lu bytes missing"
 msgstr[0] "för tidigt slut på paketfilen, %lu byte saknas"
 msgstr[1] "för tidigt slut på paketfilen, %lu byte saknas"
 
-#: builtin/index-pack.c:575
+#: builtin/index-pack.c:595
 msgid "serious inflate inconsistency"
 msgstr "allvarlig inflate-inkonsekvens"
 
-#: builtin/index-pack.c:666 builtin/index-pack.c:672 builtin/index-pack.c:695
-#: builtin/index-pack.c:729 builtin/index-pack.c:738
+#: builtin/index-pack.c:686 builtin/index-pack.c:692 builtin/index-pack.c:715
+#: builtin/index-pack.c:749 builtin/index-pack.c:758
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "SHA1-KOLLISION UPPTÄCKT VID %s !"
 
-#: builtin/index-pack.c:669 builtin/pack-objects.c:162
-#: builtin/pack-objects.c:254
+#: builtin/index-pack.c:689 builtin/pack-objects.c:164
+#: builtin/pack-objects.c:256
 #, c-format
 msgid "unable to read %s"
 msgstr "kunde inte läsa %s"
 
-#: builtin/index-pack.c:735
+#: builtin/index-pack.c:755
 #, c-format
 msgid "cannot read existing object %s"
 msgstr "kan inte läsa befintligt objekt %s"
 
-#: builtin/index-pack.c:749
+#: builtin/index-pack.c:769
 #, c-format
 msgid "invalid blob object %s"
 msgstr "ogiltigt blob-objekt %s"
 
-#: builtin/index-pack.c:763
+#: builtin/index-pack.c:783
 #, c-format
 msgid "invalid %s"
 msgstr "ogiltigt %s"
 
-#: builtin/index-pack.c:766
+#: builtin/index-pack.c:787
 msgid "Error in object"
 msgstr "Fel i objekt"
 
-#: builtin/index-pack.c:768
+#: builtin/index-pack.c:789
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "Inte alla barnobjekt för %s kan nås"
 
-#: builtin/index-pack.c:839 builtin/index-pack.c:869
+#: builtin/index-pack.c:861 builtin/index-pack.c:890
 msgid "failed to apply delta"
 msgstr "misslyckades tillämpa delta"
 
-#: builtin/index-pack.c:1010
+#: builtin/index-pack.c:1055
 msgid "Receiving objects"
 msgstr "Tar emot objekt"
 
-#: builtin/index-pack.c:1010
+#: builtin/index-pack.c:1055
 msgid "Indexing objects"
 msgstr "Skapar index för objekt"
 
-#: builtin/index-pack.c:1036
+#: builtin/index-pack.c:1081
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "paketet är trasigt (SHA1 stämmer inte)"
 
-#: builtin/index-pack.c:1041
+#: builtin/index-pack.c:1086
 msgid "cannot fstat packfile"
 msgstr "kan inte utföra \"fstat\" på paketfil"
 
-#: builtin/index-pack.c:1044
+#: builtin/index-pack.c:1089
 msgid "pack has junk at the end"
 msgstr "paket har skräp i slutet"
 
-#: builtin/index-pack.c:1055
+#: builtin/index-pack.c:1100
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "förvirrad bortom vanvett i parse_pack_objects()"
 
-#: builtin/index-pack.c:1078
+#: builtin/index-pack.c:1123
 msgid "Resolving deltas"
 msgstr "Analyserar delta"
 
-#: builtin/index-pack.c:1088
+#: builtin/index-pack.c:1133
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "kunde inte skapa tråd: %s"
 
-#: builtin/index-pack.c:1130
+#: builtin/index-pack.c:1175
 msgid "confusion beyond insanity"
 msgstr "förvirrad bortom vanvett"
 
-#: builtin/index-pack.c:1138
+#: builtin/index-pack.c:1181
 #, c-format
 msgid "completed with %d local objects"
 msgstr "slutfördes med %d lokala objekt"
 
-#: builtin/index-pack.c:1148
+#: builtin/index-pack.c:1191
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "Oväntad svanschecksumma för %s (trasig disk?)"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1195
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "paketet har %d oanalyserat delta"
 msgstr[1] "paketet har %d oanalyserade delta"
 
-#: builtin/index-pack.c:1177
+#: builtin/index-pack.c:1220
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "kunde inte utföra \"deflate\" på tillagt objekt (%d)"
 
-#: builtin/index-pack.c:1256
+#: builtin/index-pack.c:1299
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "lokalt objekt %s är trasigt"
 
-#: builtin/index-pack.c:1280
+#: builtin/index-pack.c:1323
 msgid "error while closing pack file"
 msgstr "fel vid stängning av paketfil"
 
-#: builtin/index-pack.c:1293
+#: builtin/index-pack.c:1336
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "kan inte ta skriva \"keep\"-fil \"%s\""
 
-#: builtin/index-pack.c:1301
+#: builtin/index-pack.c:1344
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "akn inte stänga skriven \"keep\"-fil \"%s\""
 
-#: builtin/index-pack.c:1314
+#: builtin/index-pack.c:1357
 msgid "cannot store pack file"
 msgstr "kan inte spara paketfil"
 
-#: builtin/index-pack.c:1325
+#: builtin/index-pack.c:1368
 msgid "cannot store index file"
 msgstr "kan inte spara indexfil"
 
-#: builtin/index-pack.c:1358
+#: builtin/index-pack.c:1401
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "felaktig pack.indexversion=%<PRIu32>"
 
-#: builtin/index-pack.c:1364
+#: builtin/index-pack.c:1407
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "felaktigt antal trådar angivet (%d)"
 
-#: builtin/index-pack.c:1368 builtin/index-pack.c:1546
+#: builtin/index-pack.c:1411 builtin/index-pack.c:1590
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "trådstöd saknas, ignorerar %s"
 
-#: builtin/index-pack.c:1426
+#: builtin/index-pack.c:1469
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Kan inte öppna befintlig paketfil \"%s\""
 
-#: builtin/index-pack.c:1428
+#: builtin/index-pack.c:1471
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
-msgstr "Kan inte öppna befintligt paket-idx-fil för \"%s\""
+msgstr "Kan inte öppna befintlig paket-idx-fil för \"%s\""
 
-#: builtin/index-pack.c:1475
+#: builtin/index-pack.c:1518
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "icke-delta: %d objekt"
 msgstr[1] "icke-delta: %d objekt"
 
-#: builtin/index-pack.c:1482
+#: builtin/index-pack.c:1525
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "kedjelängd = %d: %lu objekt"
 msgstr[1] "kedjelängd = %d: %lu objekt"
 
-#: builtin/index-pack.c:1510
+#: builtin/index-pack.c:1554
 msgid "Cannot come back to cwd"
 msgstr "Kan inte gå tillbaka till arbetskatalogen (cwd)"
 
-#: builtin/index-pack.c:1558 builtin/index-pack.c:1561
-#: builtin/index-pack.c:1573 builtin/index-pack.c:1577
+#: builtin/index-pack.c:1602 builtin/index-pack.c:1605
+#: builtin/index-pack.c:1617 builtin/index-pack.c:1621
 #, c-format
 msgid "bad %s"
 msgstr "felaktig %s"
 
-#: builtin/index-pack.c:1591
+#: builtin/index-pack.c:1635
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin kan inte användas med --stdin"
 
-#: builtin/index-pack.c:1595 builtin/index-pack.c:1605
+#: builtin/index-pack.c:1639 builtin/index-pack.c:1648
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "paketfilnamnet \"%s\" slutar inte med \".pack\""
 
-#: builtin/index-pack.c:1614
+#: builtin/index-pack.c:1656
 msgid "--verify with no packfile name given"
 msgstr "--verify angavs utan paketfilnamn"
 
@@ -6123,11 +6356,7 @@
 msgid " shared"
 msgstr " delat"
 
-#: builtin/init-db.c:439
-msgid "cannot tell cwd"
-msgstr "kan inte läsa aktuell katalog (cwd)"
-
-#: builtin/init-db.c:465
+#: builtin/init-db.c:467
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared"
 "[=<permissions>]] [directory]"
@@ -6135,29 +6364,29 @@
 "git init [-q | --quiet] [--bare] [--template=<mallkatalog>] [--shared"
 "[=<behörigheter>]] [katalog]"
 
-#: builtin/init-db.c:488
+#: builtin/init-db.c:490
 msgid "permissions"
 msgstr "behörigheter"
 
-#: builtin/init-db.c:489
+#: builtin/init-db.c:491
 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:491 builtin/prune-packed.c:79 builtin/repack.c:168
+#: builtin/init-db.c:493 builtin/prune-packed.c:57 builtin/repack.c:172
 msgid "be quiet"
 msgstr "var tyst"
 
-#: builtin/init-db.c:523 builtin/init-db.c:528
+#: builtin/init-db.c:525 builtin/init-db.c:530
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "kan inte skapa katalogen (mkdir) %s"
 
-#: builtin/init-db.c:532
+#: builtin/init-db.c:534
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "kan inte byta katalog (chdir) till %s"
 
-#: builtin/init-db.c:554
+#: builtin/init-db.c:555
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -6166,15 +6395,31 @@
 "%s (eller --work-tree=<katalog>) inte tillåtet utan att ange %s (eller --git-"
 "dir=<katalog>)"
 
-#: builtin/init-db.c:578
-msgid "Cannot access current working directory"
-msgstr "Kan inte komma åt aktuell arbetskatalog"
-
-#: builtin/init-db.c:585
+#: builtin/init-db.c:583
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Kan inte komma åt arbetskatalogen \"%s\""
 
+#: builtin/interpret-trailers.c:15
+msgid ""
+"git interpret-trailers [--trim-empty] [(--trailer <token>[(=|:)<value>])...] "
+"[<file>...]"
+msgstr ""
+"git interpret-trailers [--trim-empty] [(--trailer <symbol>[(=|:)"
+"<värde>])...] [<fil>...]"
+
+#: builtin/interpret-trailers.c:25
+msgid "trim empty trailers"
+msgstr "ta bort tomma släprader"
+
+#: builtin/interpret-trailers.c:26
+msgid "trailer"
+msgstr "släprad"
+
+#: builtin/interpret-trailers.c:27
+msgid "trailer(s) to add"
+msgstr "släprad(er) att lägga till"
+
 #: builtin/log.c:41
 msgid "git log [<options>] [<revision range>] [[--] <path>...]\n"
 msgstr "git log [<flaggor>] [<versionsintervall>] [[--] <sökväg>...]\n"
@@ -6183,33 +6428,47 @@
 msgid "   or: git show [options] <object>..."
 msgstr "     eller: git show [flaggor] <objekt>..."
 
-#: builtin/log.c:125
+#: builtin/log.c:81
+#, c-format
+msgid "invalid --decorate option: %s"
+msgstr "ogiltig flagga för --decorate: %s"
+
+#: builtin/log.c:127
 msgid "suppress diff output"
 msgstr "undertryck diff-utdata"
 
-#: builtin/log.c:126
+#: builtin/log.c:128
 msgid "show source"
 msgstr "visa källkod"
 
-#: builtin/log.c:127
+#: builtin/log.c:129
 msgid "Use mail map file"
 msgstr "Använd e-postmappningsfil"
 
-#: builtin/log.c:128
+#: builtin/log.c:130
 msgid "decorate options"
 msgstr "dekoreringsflaggor"
 
-#: builtin/log.c:231
+#: builtin/log.c:133
+msgid "Process line range n,m in file, counting from 1"
+msgstr "Behandla radintervallet n,m i filen, med början på 1"
+
+#: builtin/log.c:229
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Slututdata: %d %s\n"
 
-#: builtin/log.c:473 builtin/log.c:565
+#: builtin/log.c:458
+#, c-format
+msgid "git show %s: bad file"
+msgstr "git show %s: felaktig fil"
+
+#: builtin/log.c:472 builtin/log.c:564
 #, c-format
 msgid "Could not read object %s"
 msgstr "Kunde inte läsa objektet %s"
 
-#: builtin/log.c:589
+#: builtin/log.c:588
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Okänd typ: %d"
@@ -6218,217 +6477,226 @@
 msgid "format.headers without value"
 msgstr "format.headers utan värde"
 
-#: builtin/log.c:771
+#: builtin/log.c:773
 msgid "name of output directory is too long"
 msgstr "namnet på utdatakatalogen är för långt"
 
-#: builtin/log.c:787
+#: builtin/log.c:789
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Kan inte öppna patchfilen %s"
 
-#: builtin/log.c:801
+#: builtin/log.c:803
 msgid "Need exactly one range."
 msgstr "Behöver precis ett intervall."
 
-#: builtin/log.c:809
+#: builtin/log.c:811
 msgid "Not a range."
 msgstr "Inte ett intervall."
 
-#: builtin/log.c:911
+#: builtin/log.c:919
 msgid "Cover letter needs email format"
 msgstr "Omslagsbrevet behöver e-postformat"
 
-#: builtin/log.c:987
+#: builtin/log.c:998
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "tokigt in-reply-to: %s"
 
-#: builtin/log.c:1015
+#: builtin/log.c:1026
 msgid "git format-patch [options] [<since> | <revision range>]"
 msgstr "git format-patch [flaggor] [<sedan> | <revisionsintervall>]"
 
-#: builtin/log.c:1060
+#: builtin/log.c:1071
 msgid "Two output directories?"
 msgstr "Två utdatakataloger?"
 
-#: builtin/log.c:1175
+#: builtin/log.c:1186
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "använd [PATCH n/m] även för en ensam patch"
 
-#: builtin/log.c:1178
+#: builtin/log.c:1189
 msgid "use [PATCH] even with multiple patches"
 msgstr "använd [PATCH] även för flera patchar"
 
-#: builtin/log.c:1182
+#: builtin/log.c:1193
 msgid "print patches to standard out"
-msgstr "skriv patcharna på stnadard ut"
+msgstr "skriv patcharna på standard ut"
 
-#: builtin/log.c:1184
+#: builtin/log.c:1195
 msgid "generate a cover letter"
 msgstr "generera ett följebrev"
 
-#: builtin/log.c:1186
+#: builtin/log.c:1197
 msgid "use simple number sequence for output file names"
 msgstr "använd enkel nummersekvens för utdatafilnamn"
 
-#: builtin/log.c:1187
+#: builtin/log.c:1198
 msgid "sfx"
 msgstr "sfx"
 
-#: builtin/log.c:1188
+#: builtin/log.c:1199
 msgid "use <sfx> instead of '.patch'"
 msgstr "använd <sfx> istället för \".patch\""
 
-#: builtin/log.c:1190
+#: builtin/log.c:1201
 msgid "start numbering patches at <n> instead of 1"
 msgstr "börja numrera patchar på <n> istället för 1"
 
-#: builtin/log.c:1192
+#: builtin/log.c:1203
 msgid "mark the series as Nth re-roll"
 msgstr "markera serien som N:te försök"
 
-#: builtin/log.c:1194
+#: builtin/log.c:1205
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "Använd [<prefix>] istället för [PATCH]"
 
-#: builtin/log.c:1197
+#: builtin/log.c:1208
 msgid "store resulting files in <dir>"
 msgstr "spara filerna i <katalog>"
 
-#: builtin/log.c:1200
+#: builtin/log.c:1211
 msgid "don't strip/add [PATCH]"
 msgstr "ta inte bort eller lägg till [PATCH]"
 
-#: builtin/log.c:1203
+#: builtin/log.c:1214
 msgid "don't output binary diffs"
 msgstr "skriv inte binära diffar"
 
-#: builtin/log.c:1205
+#: builtin/log.c:1216
 msgid "don't include a patch matching a commit upstream"
 msgstr "ta inte med patchar som motsvarar en uppströmsincheckning"
 
-#: builtin/log.c:1207
+#: builtin/log.c:1218
 msgid "show patch format instead of default (patch + stat)"
 msgstr "visa patchformat istället för standard (patch + stat)"
 
-#: builtin/log.c:1209
+#: builtin/log.c:1220
 msgid "Messaging"
 msgstr "E-post"
 
-#: builtin/log.c:1210
+#: builtin/log.c:1221
 msgid "header"
 msgstr "huvud"
 
-#: builtin/log.c:1211
+#: builtin/log.c:1222
 msgid "add email header"
 msgstr "lägg till e-posthuvud"
 
-#: builtin/log.c:1212 builtin/log.c:1214
+#: builtin/log.c:1223 builtin/log.c:1225
 msgid "email"
 msgstr "epost"
 
-#: builtin/log.c:1212
+#: builtin/log.c:1223
 msgid "add To: header"
 msgstr "Lägg till mottagarhuvud (\"To:\")"
 
-#: builtin/log.c:1214
+#: builtin/log.c:1225
 msgid "add Cc: header"
 msgstr "Lägg till kopiehuvud (\"Cc:\")"
 
-#: builtin/log.c:1216
+#: builtin/log.c:1227
 msgid "ident"
 msgstr "ident"
 
-#: builtin/log.c:1217
+#: builtin/log.c:1228
 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:1219
+#: builtin/log.c:1230
 msgid "message-id"
 msgstr "meddelande-id"
 
-#: builtin/log.c:1220
+#: builtin/log.c:1231
 msgid "make first mail a reply to <message-id>"
 msgstr "Gör det första brevet ett svar till <meddelande-id>"
 
-#: builtin/log.c:1221 builtin/log.c:1224
+#: builtin/log.c:1232 builtin/log.c:1235
 msgid "boundary"
 msgstr "gräns"
 
-#: builtin/log.c:1222
+#: builtin/log.c:1233
 msgid "attach the patch"
 msgstr "bifoga patchen"
 
-#: builtin/log.c:1225
+#: builtin/log.c:1236
 msgid "inline the patch"
 msgstr "gör patchen ett inline-objekt"
 
-#: builtin/log.c:1229
+#: builtin/log.c:1240
 msgid "enable message threading, styles: shallow, deep"
 msgstr "aktivera brevtrådning, typer: shallow, deep"
 
-#: builtin/log.c:1231
+#: builtin/log.c:1242
 msgid "signature"
 msgstr "signatur"
 
-#: builtin/log.c:1232
+#: builtin/log.c:1243
 msgid "add a signature"
 msgstr "lägg till signatur"
 
-#: builtin/log.c:1233
+#: builtin/log.c:1245
+msgid "add a signature from a file"
+msgstr "lägg till signatur från fil"
+
+#: builtin/log.c:1246
 msgid "don't print the patch filenames"
 msgstr "visa inte filnamn för patchar"
 
-#: builtin/log.c:1307
+#: builtin/log.c:1320
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "ogiltig ident-rad: %s"
 
-#: builtin/log.c:1322
+#: builtin/log.c:1335
 msgid "-n and -k are mutually exclusive."
 msgstr "-n och -k kan inte användas samtidigt."
 
-#: builtin/log.c:1324
+#: builtin/log.c:1337
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "--subject-prefix och -k kan inte användas samtidigt."
 
-#: builtin/log.c:1332
+#: builtin/log.c:1345
 msgid "--name-only does not make sense"
 msgstr "kan inte använda --name-only"
 
-#: builtin/log.c:1334
+#: builtin/log.c:1347
 msgid "--name-status does not make sense"
 msgstr "kan inte använda --name-status"
 
-#: builtin/log.c:1336
+#: builtin/log.c:1349
 msgid "--check does not make sense"
 msgstr "kan inte använda --check"
 
-#: builtin/log.c:1359
+#: builtin/log.c:1372
 msgid "standard output, or directory, which one?"
 msgstr "standard ut, eller katalog, vilken skall det vara?"
 
-#: builtin/log.c:1361
+#: builtin/log.c:1374
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Kunde inte skapa katalogen \"%s\""
 
-#: builtin/log.c:1509
+#: builtin/log.c:1472
+#, c-format
+msgid "unable to read signature file '%s'"
+msgstr "kunde inte läsa signaturfil \"%s\""
+
+#: builtin/log.c:1535
 msgid "Failed to create output files"
 msgstr "Misslyckades skapa utdatafiler"
 
-#: builtin/log.c:1558
+#: builtin/log.c:1583
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<uppström> [<huvud> [<gräns>]]]"
 
-#: builtin/log.c:1613
+#: builtin/log.c:1638
 #, 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:1626 builtin/log.c:1628 builtin/log.c:1640
+#: builtin/log.c:1651 builtin/log.c:1653 builtin/log.c:1665
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Okänd incheckning %s"
@@ -6474,7 +6742,7 @@
 msgstr "visa filer i filsystemet som behöver tas bort"
 
 #: builtin/ls-files.c:477
-msgid "show 'other' directories' name only"
+msgid "show 'other' directories' names only"
 msgstr "visa endast namn för \"andra\" kataloger"
 
 #: builtin/ls-files.c:480
@@ -6561,99 +6829,99 @@
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr "visa hela trädet; inte bara aktuell katalog (implicerar --full-name)"
 
-#: builtin/merge.c:43
+#: builtin/merge.c:44
 msgid "git merge [options] [<commit>...]"
 msgstr "git merge [flaggor] [<incheckning>...]"
 
-#: builtin/merge.c:44
+#: builtin/merge.c:45
 msgid "git merge [options] <msg> HEAD <commit>"
 msgstr "git merge [flaggor] <meddelande> HEAD <incheckning>"
 
-#: builtin/merge.c:45
+#: builtin/merge.c:46
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:98
+#: builtin/merge.c:99
 msgid "switch `m' requires a value"
 msgstr "flaggan \"m\" behöver ett värde"
 
-#: builtin/merge.c:135
+#: builtin/merge.c:136
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "Kunde inte hitta sammanslagningsstrategin \"%s\".\n"
 
-#: builtin/merge.c:136
+#: builtin/merge.c:137
 #, c-format
 msgid "Available strategies are:"
 msgstr "Tillgängliga strategier är:"
 
-#: builtin/merge.c:141
+#: builtin/merge.c:142
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Tillgängliga skräddarsydda strategier är:"
 
-#: builtin/merge.c:191
+#: builtin/merge.c:192
 msgid "do not show a diffstat at the end of the merge"
 msgstr "visa inte en diffstat när sammanslagningen är färdig"
 
-#: builtin/merge.c:194
+#: builtin/merge.c:195
 msgid "show a diffstat at the end of the merge"
 msgstr "visa en diffstat när sammanslagningen är färdig"
 
-#: builtin/merge.c:195
+#: builtin/merge.c:196
 msgid "(synonym to --stat)"
 msgstr "(synonym till --stat)"
 
-#: builtin/merge.c:197
+#: builtin/merge.c:198
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 "lägg till (som mest <n>) poster från shortlog till incheckningsmeddelandet"
 
-#: builtin/merge.c:200
+#: builtin/merge.c:201
 msgid "create a single commit instead of doing a merge"
 msgstr "skapa en ensam incheckning istället för en sammanslagning"
 
-#: builtin/merge.c:202
+#: builtin/merge.c:203
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "utför en incheckning om sammanslagningen lyckades (standard)"
 
-#: builtin/merge.c:204
+#: builtin/merge.c:205
 msgid "edit message before committing"
 msgstr "redigera meddelande innan incheckning"
 
-#: builtin/merge.c:205
+#: builtin/merge.c:206
 msgid "allow fast-forward (default)"
 msgstr "tillåt snabbspolning (standard)"
 
-#: builtin/merge.c:207
+#: builtin/merge.c:208
 msgid "abort if fast-forward is not possible"
 msgstr "avbryt om snabbspolning inte är möjlig"
 
-#: builtin/merge.c:211
+#: builtin/merge.c:212
 msgid "Verify that the named commit has a valid GPG signature"
 msgstr "Bekräfta att den namngivna incheckningen har en giltig GPG-signatur"
 
-#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
+#: builtin/merge.c:213 builtin/notes.c:741 builtin/revert.c:89
 msgid "strategy"
 msgstr "strategi"
 
-#: builtin/merge.c:213
-msgid "merge strategy to use"
-msgstr "sammanslagninsstrategi att använda"
-
 #: builtin/merge.c:214
+msgid "merge strategy to use"
+msgstr "sammanslagningsstrategi att använda"
+
+#: builtin/merge.c:215
 msgid "option=value"
 msgstr "alternativ=värde"
 
-#: builtin/merge.c:215
+#: builtin/merge.c:216
 msgid "option for selected merge strategy"
 msgstr "alternativ för vald sammanslagningsstrategi"
 
-#: builtin/merge.c:217
+#: builtin/merge.c:218
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr "incheckningsmeddelande för (icke snabbspolande) sammanslagning"
 
-#: builtin/merge.c:221
+#: builtin/merge.c:222
 msgid "abort the current in-progress merge"
 msgstr "avbryt den pågående sammanslagningen"
 
@@ -6710,33 +6978,33 @@
 msgid "git write-tree failed to write a tree"
 msgstr "git write-tree misslyckades skriva ett träd"
 
-#: builtin/merge.c:681
+#: builtin/merge.c:677
 msgid "Not handling anything other than two heads merge."
 msgstr "Hanterar inte något annat än en sammanslagning av två huvuden."
 
-#: builtin/merge.c:695
+#: builtin/merge.c:691
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Felaktig flagga för merge-recursive: -X%s"
 
-#: builtin/merge.c:709
+#: builtin/merge.c:704
 #, c-format
 msgid "unable to write %s"
 msgstr "kunde inte skriva %s"
 
-#: builtin/merge.c:798
+#: builtin/merge.c:793
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "Kunde inte läsa från \"%s\""
 
-#: builtin/merge.c:807
+#: builtin/merge.c:802
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 "Checkar inte in sammanslagningen; använd \"git commit\" för att slutföra "
 "den.\n"
 
-#: builtin/merge.c:813
+#: builtin/merge.c:808
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -6752,163 +7020,163 @@
 "Rader som inleds med \"%c\" kommer ignoreras, och ett tomt meddelande\n"
 "avbryter incheckningen.\n"
 
-#: builtin/merge.c:837
+#: builtin/merge.c:832
 msgid "Empty commit message."
 msgstr "Tomt incheckningsmeddelande."
 
-#: builtin/merge.c:849
+#: builtin/merge.c:844
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Underbart.\n"
 
-#: builtin/merge.c:914
+#: builtin/merge.c:907
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 "Kunde inte slå ihop automatiskt; fixa konflikter och checka in resultatet.\n"
 
-#: builtin/merge.c:930
+#: builtin/merge.c:923
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "\"%s\" är inte en incheckning"
 
-#: builtin/merge.c:971
+#: builtin/merge.c:964
 msgid "No current branch."
 msgstr "Inte på någon gren."
 
-#: builtin/merge.c:973
+#: builtin/merge.c:966
 msgid "No remote for the current branch."
 msgstr "Ingen fjärr för aktuell gren."
 
-#: builtin/merge.c:975
+#: builtin/merge.c:968
 msgid "No default upstream defined for the current branch."
 msgstr "Ingen standarduppström angiven för aktuell gren."
 
-#: builtin/merge.c:980
+#: builtin/merge.c:973
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Ingen fjärrspårande gren för %s från %s"
 
-#: builtin/merge.c:1136
+#: builtin/merge.c:1129
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Det finns ingen sammanslagning att avbryta (MERGE_HEAD saknas)."
 
-#: builtin/merge.c:1152 git-pull.sh:31
+#: builtin/merge.c:1145
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
-"Please, commit your changes before you can merge."
+"Please, commit your changes before you merge."
 msgstr ""
 "Du har inte avslutat sammanslagningen (MERGE_HEAD finns).\n"
-"Checka in dina ändringar innan du kan slå ihop."
+"Checka in dina ändringar innan du slår ihop."
 
-#: builtin/merge.c:1155 git-pull.sh:34
+#: builtin/merge.c:1148 git-pull.sh:34
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Du har inte avslutat sammanslagningen (MERGE_HEAD finns)."
 
-#: builtin/merge.c:1159
+#: builtin/merge.c:1152
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
-"Please, commit your changes before you can merge."
+"Please, commit your changes before you merge."
 msgstr ""
 "Du har inte avslutat din \"cherry-pick\" (CHERRY_PICK_HEAD finns).\n"
-"Checka in dina ändringar innan du kan slå ihop."
+"Checka in dina ändringar innan du slår ihop."
 
-#: builtin/merge.c:1162
+#: builtin/merge.c:1155
 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:1171
+#: builtin/merge.c:1164
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Du kan inte kombinera --squash med --no-ff."
 
-#: builtin/merge.c:1180
+#: builtin/merge.c:1173
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Ingen incheckning angiven och merge.defaultToUpstream är ej satt."
 
-#: builtin/merge.c:1212
+#: builtin/merge.c:1205
 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:1215
+#: builtin/merge.c:1208
 msgid "Squash commit into empty head not supported yet"
 msgstr "Stöder inte en tillplattningsincheckning på ett tomt huvud ännu"
 
-#: builtin/merge.c:1217
+#: builtin/merge.c:1210
 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:1222
+#: builtin/merge.c:1215
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - inte något vi kan slå ihop"
 
-#: builtin/merge.c:1273
+#: builtin/merge.c:1266
 #, 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:1276
+#: builtin/merge.c:1269
 #, 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:1279
+#: builtin/merge.c:1272
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Incheckning %s har inte någon GPG-signatur."
 
-#: builtin/merge.c:1282
+#: builtin/merge.c:1275
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "Incheckningen %s har en korrekt GPG-signatur av %s\n"
 
-#: builtin/merge.c:1366
+#: builtin/merge.c:1356
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Uppdaterar %s..%s\n"
 
-#: builtin/merge.c:1405
+#: builtin/merge.c:1395
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Försöker riktigt enkel sammanslagning i indexet...\n"
 
-#: builtin/merge.c:1412
+#: builtin/merge.c:1402
 #, c-format
 msgid "Nope.\n"
 msgstr "Nej.\n"
 
-#: builtin/merge.c:1444
+#: builtin/merge.c:1434
 msgid "Not possible to fast-forward, aborting."
 msgstr "Kan inte snabbspola, avbryter."
 
-#: builtin/merge.c:1467 builtin/merge.c:1546
+#: builtin/merge.c:1457 builtin/merge.c:1536
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Återspolar trädet till orört...\n"
 
-#: builtin/merge.c:1471
+#: builtin/merge.c:1461
 #, c-format
 msgid "Trying merge strategy %s...\n"
-msgstr "Försöker sammanslagninsstrategin %s...\n"
+msgstr "Försöker sammanslagningsstrategin %s...\n"
 
-#: builtin/merge.c:1537
+#: builtin/merge.c:1527
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Ingen sammanslagningsstrategi hanterade sammanslagningen.\n"
 
-#: builtin/merge.c:1539
+#: builtin/merge.c:1529
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Sammanslagning med strategin %s misslyckades.\n"
 
-#: builtin/merge.c:1548
+#: builtin/merge.c:1538
 #, 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:1560
+#: builtin/merge.c:1550
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -7013,76 +7281,81 @@
 msgid "git mv [options] <source>... <destination>"
 msgstr "git mv [flaggor] <källa>... <mål>"
 
+#: builtin/mv.c:69
+#, c-format
+msgid "Directory %s is in index and no submodule?"
+msgstr "Katalogen %s är i indexet och inte en undermodul?"
+
 #: builtin/mv.c:71
+msgid "Please stage your changes to .gitmodules or stash them to proceed"
+msgstr ""
+"Köa dina ändringar i .gitmodules eller använd \"stash\" för att fortsätta"
+
+#: builtin/mv.c:89
+#, c-format
+msgid "%.*s is in index"
+msgstr "%.*s är i indexet"
+
+#: builtin/mv.c:111
 msgid "force move/rename even if target exists"
 msgstr "tvinga flytta/ändra namn även om målet finns"
 
-#: builtin/mv.c:72
+#: builtin/mv.c:112
 msgid "skip move/rename errors"
 msgstr "hoppa över fel vid flytt/namnändring"
 
-#: builtin/mv.c:122
+#: builtin/mv.c:151
+#, c-format
+msgid "destination '%s' is not a directory"
+msgstr "destinationen \"%s\" är ingen katalog"
+
+#: builtin/mv.c:162
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr "Kontrollerar namnbyte av \"%s\" till \"%s\"\n"
 
-#: builtin/mv.c:126
+#: builtin/mv.c:166
 msgid "bad source"
 msgstr "felaktig källa"
 
-#: builtin/mv.c:129
+#: builtin/mv.c:169
 msgid "can not move directory into itself"
 msgstr "kan inte flytta katalog till sig själv"
 
-#: builtin/mv.c:132
+#: builtin/mv.c:172
 msgid "cannot move directory over file"
 msgstr "kan inte flytta katalog över fil"
 
-#: builtin/mv.c:138
-#, c-format
-msgid "Huh? Directory %s is in index and no submodule?"
-msgstr "Vad? Katalogen %s är i indexet och inte en undermodul?"
-
-#: builtin/mv.c:140 builtin/rm.c:318
-msgid "Please, stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-"Köa dina ändringar i .gitmodules eller använd \"stash\" för att fortsätta"
-
-#: builtin/mv.c:156
-#, c-format
-msgid "Huh? %.*s is in index?"
-msgstr "Vad? %.*s är i indexet?"
-
-#: builtin/mv.c:169
+#: builtin/mv.c:181
 msgid "source directory is empty"
 msgstr "källkatalogen är tom"
 
-#: builtin/mv.c:205
+#: builtin/mv.c:206
 msgid "not under version control"
 msgstr "inte versionshanterad"
 
-#: builtin/mv.c:207
+#: builtin/mv.c:209
 msgid "destination exists"
 msgstr "destinationen finns"
 
-#: builtin/mv.c:215
+#: builtin/mv.c:217
 #, c-format
 msgid "overwriting '%s'"
 msgstr "skriver över \"%s\""
 
-#: builtin/mv.c:218
+#: builtin/mv.c:220
 msgid "Cannot overwrite"
 msgstr "Kan inte skriva över"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:223
 msgid "multiple sources for the same target"
 msgstr "flera källor för samma mål"
 
-#: builtin/mv.c:223
+#: builtin/mv.c:225
 msgid "destination directory does not exist"
 msgstr "destinationskatalogen finns inte"
 
-#: builtin/mv.c:243
+#: builtin/mv.c:232
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, källa=%s, mål=%s"
@@ -7092,48 +7365,48 @@
 msgid "Renaming %s to %s\n"
 msgstr "Byter namn på %s till %s\n"
 
-#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:358
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "misslyckades byta namn på \"%s\""
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:255
 msgid "git name-rev [options] <commit>..."
 msgstr "git name-rev [flaggor] <incheckning>..."
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:256
 msgid "git name-rev [options] --all"
 msgstr "git name-rev [flaggor] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:257
 msgid "git name-rev [options] --stdin"
 msgstr "git name-rev [flaggor] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:309
 msgid "print only names (no SHA-1)"
 msgstr "skriv endast namn (ingen SHA-1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:310
 msgid "only use tags to name the commits"
 msgstr "använd endast taggar för att namnge incheckningar"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:312
 msgid "only use refs matching <pattern>"
 msgstr "använd endast referenser som motsvarar <mönster>"
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:314
 msgid "list all commits reachable from all refs"
 msgstr "lista alla incheckningar som kan nås alla referenser"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:315
 msgid "read from stdin"
 msgstr "läs från standard in"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:316
 msgid "allow to print `undefined` names (default)"
 msgstr "tillåt att skriva \"odefinierade\" namn (standard)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:322
 msgid "dereference tags in the input (internal use)"
 msgstr "avreferera taggar i indata (används internt)"
 
@@ -7249,118 +7522,118 @@
 msgid "git notes get-ref"
 msgstr "git notes get-ref"
 
-#: builtin/notes.c:137
+#: builtin/notes.c:136
 #, c-format
 msgid "unable to start 'show' for object '%s'"
 msgstr "kunde inte starta \"show\" för objektet \"%s\""
 
-#: builtin/notes.c:141
+#: builtin/notes.c:140
 msgid "could not read 'show' output"
 msgstr "kunde inte läsa utdata från \"show\""
 
-#: builtin/notes.c:149
+#: builtin/notes.c:148
 #, c-format
 msgid "failed to finish 'show' for object '%s'"
 msgstr "kunde inte avsluta \"show\" för objektet \"%s\""
 
-#: builtin/notes.c:167 builtin/tag.c:373
+#: builtin/notes.c:166 builtin/tag.c:477
 #, c-format
 msgid "could not create file '%s'"
 msgstr "kunde inte skapa filen \"%s\""
 
-#: builtin/notes.c:186
+#: builtin/notes.c:185
 msgid "Please supply the note contents using either -m or -F option"
 msgstr "Ange innehåll för anteckningen med antingen -m eller -F"
 
-#: builtin/notes.c:207 builtin/notes.c:848
+#: builtin/notes.c:206 builtin/notes.c:847
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Tar bort anteckning för objektet %s\n"
 
-#: builtin/notes.c:212
+#: builtin/notes.c:211
 msgid "unable to write note object"
 msgstr "kunde inte skriva anteckningsobjekt"
 
-#: builtin/notes.c:214
+#: builtin/notes.c:213
 #, c-format
-msgid "The note contents has been left in %s"
+msgid "The note contents have been left in %s"
 msgstr "Anteckningens innehåll har lämnats kvar i %s"
 
-#: builtin/notes.c:248 builtin/tag.c:604
+#: builtin/notes.c:247 builtin/tag.c:693
 #, c-format
 msgid "cannot read '%s'"
 msgstr "kunde inte läsa \"%s\""
 
-#: builtin/notes.c:250 builtin/tag.c:607
+#: builtin/notes.c:249 builtin/tag.c:696
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "kunde inte öppna eller läsa \"%s\""
 
-#: builtin/notes.c:269 builtin/notes.c:320 builtin/notes.c:322
-#: builtin/notes.c:382 builtin/notes.c:436 builtin/notes.c:519
-#: builtin/notes.c:524 builtin/notes.c:599 builtin/notes.c:641
-#: builtin/notes.c:843 builtin/tag.c:620
+#: builtin/notes.c:268 builtin/notes.c:319 builtin/notes.c:321
+#: builtin/notes.c:381 builtin/notes.c:435 builtin/notes.c:518
+#: builtin/notes.c:523 builtin/notes.c:598 builtin/notes.c:640
+#: builtin/notes.c:842 builtin/tag.c:709
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Kunde inte slå upp \"%s\" som en giltig referens."
 
-#: builtin/notes.c:272
+#: builtin/notes.c:271
 #, c-format
 msgid "Failed to read object '%s'."
 msgstr "Kunde inte läsa objektet \"%s\"."
 
-#: builtin/notes.c:276
+#: builtin/notes.c:275
 #, c-format
 msgid "Cannot read note data from non-blob object '%s'."
 msgstr "kan inte läsa anteckningsdata från icke-blob-objektet \"%s\"."
 
-#: builtin/notes.c:316
+#: builtin/notes.c:315
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "Felaktig indatarad: \"%s\"."
 
-#: builtin/notes.c:331
+#: builtin/notes.c:330
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "Misslyckades kopiera anteckningar från \"%s\" till \"%s\""
 
-#: builtin/notes.c:375 builtin/notes.c:429 builtin/notes.c:502
-#: builtin/notes.c:514 builtin/notes.c:587 builtin/notes.c:634
-#: builtin/notes.c:908
+#: builtin/notes.c:374 builtin/notes.c:428 builtin/notes.c:501
+#: builtin/notes.c:513 builtin/notes.c:586 builtin/notes.c:633
+#: builtin/notes.c:907
 msgid "too many parameters"
 msgstr "för många parametrar"
 
-#: builtin/notes.c:388 builtin/notes.c:647
+#: builtin/notes.c:387 builtin/notes.c:646
 #, c-format
 msgid "No note found for object %s."
 msgstr "Inga anteckningar hittades för objektet %s."
 
-#: builtin/notes.c:410 builtin/notes.c:567
+#: builtin/notes.c:409 builtin/notes.c:566
 msgid "note contents as a string"
 msgstr "anteckningsinnehåll som sträng"
 
-#: builtin/notes.c:413 builtin/notes.c:570
+#: builtin/notes.c:412 builtin/notes.c:569
 msgid "note contents in a file"
 msgstr "anteckningsinnehåll i en fil"
 
-#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
-#: builtin/notes.c:575 builtin/tag.c:539
+#: builtin/notes.c:414 builtin/notes.c:417 builtin/notes.c:571
+#: builtin/notes.c:574 builtin/tag.c:628
 msgid "object"
 msgstr "objekt"
 
-#: builtin/notes.c:416 builtin/notes.c:573
+#: builtin/notes.c:415 builtin/notes.c:572
 msgid "reuse and edit specified note object"
 msgstr "återanvänd och redigera angivet anteckningsobjekt"
 
-#: builtin/notes.c:419 builtin/notes.c:576
+#: builtin/notes.c:418 builtin/notes.c:575
 msgid "reuse specified note object"
 msgstr "återanvänd angivet anteckningsobjekt"
 
-#: builtin/notes.c:421 builtin/notes.c:489
+#: builtin/notes.c:420 builtin/notes.c:488
 msgid "replace existing notes"
 msgstr "ersätt befintliga anteckningar"
 
-#: builtin/notes.c:455
+#: builtin/notes.c:454
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7369,24 +7642,24 @@
 "Kan inte lägga till anteckningar. Hittade befintliga anteckningar för "
 "objektet %s. Använd \"-f\" för att skriva över befintliga anteckningar"
 
-#: builtin/notes.c:460 builtin/notes.c:537
+#: builtin/notes.c:459 builtin/notes.c:536
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Skriver över befintliga anteckningar för objektet %s\n"
 
-#: builtin/notes.c:490
+#: builtin/notes.c:489
 msgid "read objects from stdin"
 msgstr "läs objekt från standard in"
 
-#: builtin/notes.c:492
+#: builtin/notes.c:491
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr "läs omskrivningsinställning för <kommando> (implicerar --stdin)"
 
-#: builtin/notes.c:510
+#: builtin/notes.c:509
 msgid "too few parameters"
 msgstr "för få parametrar"
 
-#: builtin/notes.c:531
+#: builtin/notes.c:530
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7395,12 +7668,12 @@
 "Kan inte kopiera anteckningar. Hittade befintliga anteckningar för objektet "
 "%s. Använd \"-f\" för att skriva över befintliga anteckningar"
 
-#: builtin/notes.c:543
+#: builtin/notes.c:542
 #, c-format
 msgid "Missing notes on source object %s. Cannot copy."
 msgstr "Anteckningar på källobjektet %s saknas. Kan inte kopiera."
 
-#: builtin/notes.c:592
+#: builtin/notes.c:591
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -7409,15 +7682,15 @@
 "Flaggorna -m/-F/-c/-C rekommenderas inte för underkommandot \"edit\".\n"
 "Använd \"git notes add -f -m/-F/-c/-C\" istället.\n"
 
-#: builtin/notes.c:739
+#: builtin/notes.c:738
 msgid "General options"
 msgstr "Allmänna flaggor"
 
-#: builtin/notes.c:741
+#: builtin/notes.c:740
 msgid "Merge options"
 msgstr "Flaggor för sammanslagning"
 
-#: builtin/notes.c:743
+#: builtin/notes.c:742
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -7425,224 +7698,228 @@
 "läs konflikter i anteckningar med angiven strategi (manual/ours/theirs/union/"
 "cat_sort_uniq)"
 
-#: builtin/notes.c:745
+#: builtin/notes.c:744
 msgid "Committing unmerged notes"
 msgstr "Checkar in ej sammanslagna anteckningar"
 
-#: builtin/notes.c:747
+#: builtin/notes.c:746
 msgid "finalize notes merge by committing unmerged notes"
 msgstr ""
 "färdigställ sammanslagning av anteckningar genom att checka in ej "
 "sammanslagna anteckningar"
 
-#: builtin/notes.c:749
+#: builtin/notes.c:748
 msgid "Aborting notes merge resolution"
 msgstr "Avbryt lösning av sammanslagning av anteckningar"
 
-#: builtin/notes.c:751
+#: builtin/notes.c:750
 msgid "abort notes merge"
 msgstr "avbryt sammanslagning av anteckningar"
 
-#: builtin/notes.c:846
+#: builtin/notes.c:845
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "Objektet %s har ingen anteckning\n"
 
-#: builtin/notes.c:858
+#: builtin/notes.c:857
 msgid "attempt to remove non-existent note is not an error"
 msgstr "försök att ta bort icke-existerande anteckningar är inte ett fel"
 
-#: builtin/notes.c:861
+#: builtin/notes.c:860
 msgid "read object names from the standard input"
 msgstr "läs objektnamn från standard in"
 
-#: builtin/notes.c:942
+#: builtin/notes.c:941
 msgid "notes-ref"
 msgstr "anteckningar-ref"
 
-#: builtin/notes.c:943
+#: builtin/notes.c:942
 msgid "use notes from <notes_ref>"
 msgstr "använd anteckningar från <anteckningsref>"
 
-#: builtin/notes.c:978 builtin/remote.c:1593
+#: builtin/notes.c:977 builtin/remote.c:1624
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Okänt underkommando: %s"
 
-#: builtin/pack-objects.c:25
+#: builtin/pack-objects.c:28
 msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
 msgstr "git pack-objects --stdout [flaggor...] [< reflista | < objektlista]"
 
-#: builtin/pack-objects.c:26
+#: builtin/pack-objects.c:29
 msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
 msgstr "git pack-objects [flaggor...] basnamn [< reflista | < objektlista]"
 
-#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
+#: builtin/pack-objects.c:177 builtin/pack-objects.c:180
 #, c-format
 msgid "deflate error (%d)"
 msgstr "fel i deflate (%d)"
 
-#: builtin/pack-objects.c:771
+#: builtin/pack-objects.c:773
 msgid "Writing objects"
 msgstr "Skriver objekt"
 
-#: builtin/pack-objects.c:1012
+#: builtin/pack-objects.c:1015
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr "inaktiverar skrivning av bitkarta då några objekt inte packas"
 
-#: builtin/pack-objects.c:2174
+#: builtin/pack-objects.c:2175
 msgid "Compressing objects"
 msgstr "Komprimerar objekt"
 
-#: builtin/pack-objects.c:2530
+#: builtin/pack-objects.c:2572
 #, c-format
 msgid "unsupported index version %s"
 msgstr "indexversionen %s stöds ej"
 
-#: builtin/pack-objects.c:2534
+#: builtin/pack-objects.c:2576
 #, c-format
 msgid "bad index version '%s'"
 msgstr "felaktig indexversion \"%s\""
 
-#: builtin/pack-objects.c:2557
+#: builtin/pack-objects.c:2599
 #, c-format
 msgid "option %s does not accept negative form"
 msgstr "flaggan %s godtar inte negativ form"
 
-#: builtin/pack-objects.c:2561
+#: builtin/pack-objects.c:2603
 #, c-format
 msgid "unable to parse value '%s' for option %s"
 msgstr "kunde inte tolka värdet \"%s\" för flaggan %s"
 
-#: builtin/pack-objects.c:2580
+#: builtin/pack-objects.c:2622
 msgid "do not show progress meter"
 msgstr "visa inte förloppsindikator"
 
-#: builtin/pack-objects.c:2582
+#: builtin/pack-objects.c:2624
 msgid "show progress meter"
 msgstr "visa förloppsindikator"
 
-#: builtin/pack-objects.c:2584
+#: builtin/pack-objects.c:2626
 msgid "show progress meter during object writing phase"
 msgstr "visa förloppsindikator under objektskrivningsfasen"
 
-#: builtin/pack-objects.c:2587
+#: builtin/pack-objects.c:2629
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "som --all-progress när förloppsmätaren visas"
 
-#: builtin/pack-objects.c:2588
+#: builtin/pack-objects.c:2630
 msgid "version[,offset]"
 msgstr "version[,offset]"
 
-#: builtin/pack-objects.c:2589
+#: builtin/pack-objects.c:2631
 msgid "write the pack index file in the specified idx format version"
 msgstr "skriv paketindexfilen i angiven indexformatversion"
 
-#: builtin/pack-objects.c:2592
+#: builtin/pack-objects.c:2634
 msgid "maximum size of each output pack file"
 msgstr "maximal storlek på varje utdatapaketfil"
 
-#: builtin/pack-objects.c:2594
+#: builtin/pack-objects.c:2636
 msgid "ignore borrowed objects from alternate object store"
 msgstr "ignorera lånade objekt från alternativa objektlager"
 
-#: builtin/pack-objects.c:2596
+#: builtin/pack-objects.c:2638
 msgid "ignore packed objects"
 msgstr "ignorera packade objekt"
 
-#: builtin/pack-objects.c:2598
+#: builtin/pack-objects.c:2640
 msgid "limit pack window by objects"
 msgstr "begränsa paketfönster efter objekt"
 
-#: builtin/pack-objects.c:2600
+#: builtin/pack-objects.c:2642
 msgid "limit pack window by memory in addition to object limit"
 msgstr "begränsa paketfönster efter minne förutom objektgräns"
 
-#: builtin/pack-objects.c:2602
+#: builtin/pack-objects.c:2644
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr "maximal längd på deltakedja tillåten i slutligt paket"
 
-#: builtin/pack-objects.c:2604
+#: builtin/pack-objects.c:2646
 msgid "reuse existing deltas"
 msgstr "återanvänd befintliga delta"
 
-#: builtin/pack-objects.c:2606
+#: builtin/pack-objects.c:2648
 msgid "reuse existing objects"
 msgstr "återanvänd befintliga objekt"
 
-#: builtin/pack-objects.c:2608
+#: builtin/pack-objects.c:2650
 msgid "use OFS_DELTA objects"
 msgstr "använd OFS_DELTA-objekt"
 
-#: builtin/pack-objects.c:2610
+#: builtin/pack-objects.c:2652
 msgid "use threads when searching for best delta matches"
 msgstr "använd trådar vid sökning efter bästa deltaträffar"
 
-#: builtin/pack-objects.c:2612
+#: builtin/pack-objects.c:2654
 msgid "do not create an empty pack output"
 msgstr "försök inte skapa tom paketutdata"
 
-#: builtin/pack-objects.c:2614
+#: builtin/pack-objects.c:2656
 msgid "read revision arguments from standard input"
 msgstr "läs revisionsargument från standard in"
 
-#: builtin/pack-objects.c:2616
+#: builtin/pack-objects.c:2658
 msgid "limit the objects to those that are not yet packed"
 msgstr "begränsa objekt till de som ännu inte packats"
 
-#: builtin/pack-objects.c:2619
+#: builtin/pack-objects.c:2661
 msgid "include objects reachable from any reference"
 msgstr "inkludera objekt som kan nås från någon referens"
 
-#: builtin/pack-objects.c:2622
+#: builtin/pack-objects.c:2664
 msgid "include objects referred by reflog entries"
 msgstr "inkludera objekt som refereras från referensloggposter"
 
-#: builtin/pack-objects.c:2625
+#: builtin/pack-objects.c:2667
+msgid "include objects referred to by the index"
+msgstr "inkludera objekt som refereras från indexet"
+
+#: builtin/pack-objects.c:2670
 msgid "output pack to stdout"
 msgstr "skriv paket på standard ut"
 
-#: builtin/pack-objects.c:2627
+#: builtin/pack-objects.c:2672
 msgid "include tag objects that refer to objects to be packed"
 msgstr "inkludera taggobjekt som refererar objekt som skall packas"
 
-#: builtin/pack-objects.c:2629
+#: builtin/pack-objects.c:2674
 msgid "keep unreachable objects"
 msgstr "behåll onåbara objekt"
 
-#: builtin/pack-objects.c:2630 parse-options.h:140
+#: builtin/pack-objects.c:2675 parse-options.h:140
 msgid "time"
 msgstr "tid"
 
-#: builtin/pack-objects.c:2631
+#: builtin/pack-objects.c:2676
 msgid "unpack unreachable objects newer than <time>"
 msgstr "packa upp onåbara objekt nyare än <tid>"
 
-#: builtin/pack-objects.c:2634
+#: builtin/pack-objects.c:2679
 msgid "create thin packs"
 msgstr "skapa tunna paket"
 
-#: builtin/pack-objects.c:2636
+#: builtin/pack-objects.c:2681
 msgid "ignore packs that have companion .keep file"
 msgstr "ignorera paket som har tillhörande .keep-fil"
 
-#: builtin/pack-objects.c:2638
+#: builtin/pack-objects.c:2683
 msgid "pack compression level"
 msgstr "komprimeringsgrad för paket"
 
-#: builtin/pack-objects.c:2640
+#: builtin/pack-objects.c:2685
 msgid "do not hide commits by grafts"
 msgstr "göm inte incheckningar med ympningar (\"grafts\")"
 
-#: builtin/pack-objects.c:2642
+#: builtin/pack-objects.c:2687
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr "använd bitkartindex om tillgängligt för att räkna objekt snabbare"
 
-#: builtin/pack-objects.c:2644
+#: builtin/pack-objects.c:2689
 msgid "write a bitmap index together with the pack index"
 msgstr "använd bitkartindex tillsammans med packindexet"
 
-#: builtin/pack-objects.c:2723
+#: builtin/pack-objects.c:2778
 msgid "Counting objects"
 msgstr "Räknar objekt"
 
@@ -7662,7 +7939,7 @@
 msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
 msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]"
 
-#: builtin/prune-packed.c:49
+#: builtin/prune-packed.c:40
 msgid "Removing duplicate objects"
 msgstr "Tar bort duplicerade objekt"
 
@@ -7670,15 +7947,15 @@
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <tid>] [--] [<huvud>...]"
 
-#: builtin/prune.c:142
+#: builtin/prune.c:106
 msgid "do not remove, show only"
 msgstr "ta inte bort, bara visa"
 
-#: builtin/prune.c:143
+#: builtin/prune.c:107
 msgid "report pruned objects"
 msgstr "rapportera borttagna objekt"
 
-#: builtin/prune.c:146
+#: builtin/prune.c:110
 msgid "expire objects older than <time>"
 msgstr "låt tid gå ut för objekt äldre än <tid>"
 
@@ -7694,7 +7971,7 @@
 msgid "--delete only accepts plain target ref names"
 msgstr "--delete godtar endast enkla målreferensnamn"
 
-#: builtin/push.c:140
+#: builtin/push.c:139
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -7703,7 +7980,7 @@
 "För att välja ett av alternativen permanent, se push.default i \"git help "
 "config\"."
 
-#: builtin/push.c:143
+#: builtin/push.c:142
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -7728,7 +8005,7 @@
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:158
+#: builtin/push.c:157
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -7743,7 +8020,7 @@
 "\n"
 "    git push %s HEAD:<namn-på-fjärrgren>\n"
 
-#: builtin/push.c:172
+#: builtin/push.c:171
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -7756,12 +8033,12 @@
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:180
+#: builtin/push.c:179
 #, 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:182
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -7772,7 +8049,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:205
 msgid ""
 "push.default is unset; its implicit value has changed in\n"
 "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
@@ -7807,7 +8084,7 @@
 "\n"
 "  git config --global push.default simple\n"
 "\n"
-"Nör push.default är satt till \"matching\" kommer git att sända lokala "
+"När push.default är satt till \"matching\" kommer git att sända lokala "
 "grenar\n"
 "till fjärrgrenar som redan finns och som har samma namn.\n"
 "\n"
@@ -7820,14 +8097,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:272
 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:279
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -7839,7 +8116,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:285
 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"
@@ -7851,7 +8128,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:291
 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"
@@ -7865,11 +8142,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:298
 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:301
 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"
@@ -7880,22 +8157,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:360
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Sänder till %s\n"
 
-#: builtin/push.c:365
+#: builtin/push.c:364
 #, 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:394
 #, c-format
 msgid "bad repository '%s'"
 msgstr "felaktigt arkiv \"%s\""
 
-#: builtin/push.c:396
+#: builtin/push.c:395
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -7916,99 +8193,103 @@
 "\n"
 "    git push <namn>\n"
 
-#: builtin/push.c:411
+#: builtin/push.c:410
 msgid "--all and --tags are incompatible"
 msgstr "--all och --tags är inkompatibla"
 
-#: builtin/push.c:412
+#: builtin/push.c:411
 msgid "--all can't be combined with refspecs"
 msgstr "--all kan inte kombineras med referensspecifikationer"
 
-#: builtin/push.c:417
+#: builtin/push.c:416
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror och --tags är inkompatibla"
 
-#: builtin/push.c:418
+#: builtin/push.c:417
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror kan inte kombineras med referensspecifikationer"
 
-#: builtin/push.c:423
+#: builtin/push.c:422
 msgid "--all and --mirror are incompatible"
 msgstr "--all och --mirror är inkompatibla"
 
-#: builtin/push.c:483
+#: builtin/push.c:493
 msgid "repository"
 msgstr "arkiv"
 
-#: builtin/push.c:484
+#: builtin/push.c:494
 msgid "push all refs"
 msgstr "sänd alla referenser"
 
-#: builtin/push.c:485
+#: builtin/push.c:495
 msgid "mirror all refs"
 msgstr "spegla alla referenser"
 
-#: builtin/push.c:487
+#: builtin/push.c:497
 msgid "delete refs"
 msgstr "ta bort referenser"
 
-#: builtin/push.c:488
+#: builtin/push.c:498
 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:491
+#: builtin/push.c:501
 msgid "force updates"
 msgstr "tvinga uppdateringar"
 
-#: builtin/push.c:493
+#: builtin/push.c:503
 msgid "refname>:<expect"
 msgstr "refnamn>:<förvänta"
 
-#: builtin/push.c:494
+#: builtin/push.c:504
 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:496
+#: builtin/push.c:506
 msgid "check"
 msgstr "kontrollera"
 
-#: builtin/push.c:497
+#: builtin/push.c:507
 msgid "control recursive pushing of submodules"
 msgstr "styr rekursiv insändning av undermoduler"
 
-#: builtin/push.c:499
+#: builtin/push.c:509
 msgid "use thin pack"
 msgstr "använd tunna paket"
 
-#: builtin/push.c:500 builtin/push.c:501
+#: builtin/push.c:510 builtin/push.c:511
 msgid "receive pack program"
 msgstr "program för att ta emot paket"
 
-#: builtin/push.c:502
+#: builtin/push.c:512
 msgid "set upstream for git pull/status"
 msgstr "ställ in uppström för git pull/status"
 
-#: builtin/push.c:505
+#: builtin/push.c:515
 msgid "prune locally removed refs"
 msgstr "ta bort lokalt borttagna referenser"
 
-#: builtin/push.c:507
+#: builtin/push.c:517
 msgid "bypass pre-push hook"
 msgstr "förbigå pre-push-krok"
 
-#: builtin/push.c:508
+#: builtin/push.c:518
 msgid "push missing but relevant tags"
 msgstr "sänd in saknade men relevanta taggar"
 
-#: builtin/push.c:518
-msgid "--delete is incompatible with --all, --mirror and --tags"
-msgstr "--delete är imkompatibel med --all, --mirror och --tags"
-
 #: builtin/push.c:520
+msgid "GPG sign the push"
+msgstr "GPG-signera insändningen"
+
+#: builtin/push.c:529
+msgid "--delete is incompatible with --all, --mirror and --tags"
+msgstr "--delete är inkompatibel med --all, --mirror och --tags"
+
+#: builtin/push.c:531
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete kan inte användas utan referenser"
 
-#: builtin/read-tree.c:36
+#: builtin/read-tree.c:37
 msgid ""
 "git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] "
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
@@ -8018,67 +8299,67 @@
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
 "index-output=<fil>] (--empty | <träd-igt1> [<träd-igt2> [<träd-igt3>]])"
 
-#: builtin/read-tree.c:109
+#: builtin/read-tree.c:110
 msgid "write resulting index to <file>"
 msgstr "skriv resulterande index till <fil>"
 
-#: builtin/read-tree.c:112
+#: builtin/read-tree.c:113
 msgid "only empty the index"
 msgstr "töm bara indexet"
 
-#: builtin/read-tree.c:114
+#: builtin/read-tree.c:115
 msgid "Merging"
 msgstr "Sammanslagning"
 
-#: builtin/read-tree.c:116
+#: builtin/read-tree.c:117
 msgid "perform a merge in addition to a read"
 msgstr "utför en sammanslagning i tillägg till en läsning"
 
-#: builtin/read-tree.c:118
+#: builtin/read-tree.c:119
 msgid "3-way merge if no file level merging required"
 msgstr "3-vägssammanslagning om sammanslagning på filnivå ej krävs"
 
-#: builtin/read-tree.c:120
+#: builtin/read-tree.c:121
 msgid "3-way merge in presence of adds and removes"
 msgstr "3-vägssammanslagning när det finns tillägg och borttagningar"
 
-#: builtin/read-tree.c:122
+#: builtin/read-tree.c:123
 msgid "same as -m, but discard unmerged entries"
 msgstr "som -m, men kasta bort ej sammanslagna poster"
 
-#: builtin/read-tree.c:123
+#: builtin/read-tree.c:124
 msgid "<subdirectory>/"
 msgstr "<underkatalog>/"
 
-#: builtin/read-tree.c:124
+#: builtin/read-tree.c:125
 msgid "read the tree into the index under <subdirectory>/"
 msgstr "läs in trädet i indexet under <underkatalog>/"
 
-#: builtin/read-tree.c:127
+#: builtin/read-tree.c:128
 msgid "update working tree with merge result"
 msgstr "uppdatera arbetskatalogen med resultatet från sammanslagningen"
 
-#: builtin/read-tree.c:129
+#: builtin/read-tree.c:130
 msgid "gitignore"
 msgstr "gitignore"
 
-#: builtin/read-tree.c:130
+#: builtin/read-tree.c:131
 msgid "allow explicitly ignored files to be overwritten"
 msgstr "tillåt explicit ignorerade filer att skrivas över"
 
-#: builtin/read-tree.c:133
+#: builtin/read-tree.c:134
 msgid "don't check the working tree after merging"
 msgstr "kontrollera inte arbetskatalogen efter sammanslagning"
 
-#: builtin/read-tree.c:134
+#: builtin/read-tree.c:135
 msgid "don't update the index or the work tree"
 msgstr "uppdatera inte indexet eller arbetskatalogen"
 
-#: builtin/read-tree.c:136
+#: builtin/read-tree.c:137
 msgid "skip applying sparse checkout filter"
 msgstr "hoppa över att applicera filter för gles utcheckning"
 
-#: builtin/read-tree.c:138
+#: builtin/read-tree.c:139
 msgid "debug unpack-trees"
 msgstr "felsök unpack-trees"
 
@@ -8243,21 +8524,16 @@
 msgid "Could not setup master '%s'"
 msgstr "Kunde inte skapa master \"%s\""
 
-#: builtin/remote.c:289
-#, c-format
-msgid "more than one %s"
-msgstr "mer än en %s"
-
-#: builtin/remote.c:334
+#: builtin/remote.c:333
 #, c-format
 msgid "Could not get fetch map for refspec %s"
 msgstr "Kunde inte hämta mappning för referensspecifikation %s"
 
-#: builtin/remote.c:435 builtin/remote.c:443
+#: builtin/remote.c:434 builtin/remote.c:442
 msgid "(matching)"
 msgstr "(matchande)"
 
-#: builtin/remote.c:447
+#: builtin/remote.c:446
 msgid "(delete)"
 msgstr "(ta bort)"
 
@@ -8266,7 +8542,7 @@
 msgid "Could not append '%s' to '%s'"
 msgstr "Kunde inte tillämpa \"%s\" på \"%s\""
 
-#: builtin/remote.c:634 builtin/remote.c:787 builtin/remote.c:885
+#: builtin/remote.c:634 builtin/remote.c:798 builtin/remote.c:898
 #, c-format
 msgid "No such remote: %s"
 msgstr "Inget sådant fjärrarkiv: %s"
@@ -8276,7 +8552,7 @@
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "Kunde inte byta namn på konfigurationssektionen \"%s\" till \"%s\""
 
-#: builtin/remote.c:657 builtin/remote.c:794
+#: builtin/remote.c:657 builtin/remote.c:850
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Kunde inte ta bort konfigurationssektionen \"%s\""
@@ -8312,12 +8588,12 @@
 msgid "creating '%s' failed"
 msgstr "misslyckades skapa \"%s\""
 
-#: builtin/remote.c:759
+#: builtin/remote.c:769
 #, c-format
 msgid "Could not remove branch %s"
 msgstr "Kunde inte ta bort grenen %s"
 
-#: builtin/remote.c:829
+#: builtin/remote.c:836
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -8331,363 +8607,421 @@
 "Observera: Några grenar utanför hierarkin refs/remotes/ togs inte bort;\n"
 "för att ta bort dem, använd:"
 
-#: builtin/remote.c:938
+#: builtin/remote.c:951
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " ny (nästa hämtning sparar i remotes/%s)"
 
-#: builtin/remote.c:941
+#: builtin/remote.c:954
 msgid " tracked"
 msgstr " spårad"
 
-#: builtin/remote.c:943
+#: builtin/remote.c:956
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " förlegad (använd \"git remote prune\" för att ta bort)"
 
-#: builtin/remote.c:945
+#: builtin/remote.c:958
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:986
+#: builtin/remote.c:999
 #, 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:993
+#: builtin/remote.c:1006
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "ombaseras på fjärren %s"
 
-#: builtin/remote.c:996
+#: builtin/remote.c:1009
 #, c-format
 msgid " merges with remote %s"
 msgstr " sammanslås med fjärren %s"
 
-#: builtin/remote.c:997
+#: builtin/remote.c:1010
 msgid "    and with remote"
 msgstr "    och med fjärren"
 
-#: builtin/remote.c:999
+#: builtin/remote.c:1012
 #, c-format
 msgid "merges with remote %s"
 msgstr "sammanslås med fjärren %s"
 
-#: builtin/remote.c:1000
+#: builtin/remote.c:1013
 msgid "   and with remote"
 msgstr "   och med fjärren"
 
-#: builtin/remote.c:1046
+#: builtin/remote.c:1059
 msgid "create"
 msgstr "skapa"
 
-#: builtin/remote.c:1049
+#: builtin/remote.c:1062
 msgid "delete"
 msgstr "ta bort"
 
-#: builtin/remote.c:1053
+#: builtin/remote.c:1066
 msgid "up to date"
 msgstr "àjour"
 
-#: builtin/remote.c:1056
+#: builtin/remote.c:1069
 msgid "fast-forwardable"
 msgstr "kan snabbspolas"
 
-#: builtin/remote.c:1059
+#: builtin/remote.c:1072
 msgid "local out of date"
 msgstr "lokal föråldrad"
 
-#: builtin/remote.c:1066
+#: builtin/remote.c:1079
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s tvingar till %-*s (%s)"
 
-#: builtin/remote.c:1069
+#: builtin/remote.c:1082
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s sänder till %-*s (%s)"
 
-#: builtin/remote.c:1073
+#: builtin/remote.c:1086
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s tvingar till %s"
 
-#: builtin/remote.c:1076
+#: builtin/remote.c:1089
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s sänder till %s"
 
-#: builtin/remote.c:1144
+#: builtin/remote.c:1157
 msgid "do not query remotes"
 msgstr "fråga inte fjärrar"
 
-#: builtin/remote.c:1171
+#: builtin/remote.c:1184
 #, c-format
 msgid "* remote %s"
 msgstr "* fjärr %s"
 
-#: builtin/remote.c:1172
+#: builtin/remote.c:1185
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  Hämt-URL: %s"
 
-#: builtin/remote.c:1173 builtin/remote.c:1318
+#: builtin/remote.c:1186 builtin/remote.c:1333
 msgid "(no URL)"
 msgstr "(ingen URL)"
 
-#: builtin/remote.c:1182 builtin/remote.c:1184
+#: builtin/remote.c:1195 builtin/remote.c:1197
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  Sänd-URL: %s"
 
-#: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190
+#: builtin/remote.c:1199 builtin/remote.c:1201 builtin/remote.c:1203
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  HEAD-gren: %s"
 
-#: builtin/remote.c:1192
+#: builtin/remote.c:1205
 #, 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:1204
+#: builtin/remote.c:1217
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Fjärrgren:%s"
 msgstr[1] "  Fjärrgrenar:%s"
 
-#: builtin/remote.c:1207 builtin/remote.c:1234
+#: builtin/remote.c:1220 builtin/remote.c:1247
 msgid " (status not queried)"
 msgstr " (status inte förfrågad)"
 
-#: builtin/remote.c:1216
+#: builtin/remote.c:1229
 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:1224
+#: builtin/remote.c:1237
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  Lokala referenser speglas av \"git push\""
 
-#: builtin/remote.c:1231
+#: builtin/remote.c:1244
 #, 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:1252
+#: builtin/remote.c:1265
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "sätt refs/remotes/<namn>/HEAD enligt fjärren"
 
-#: builtin/remote.c:1254
+#: builtin/remote.c:1267
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "ta bort refs/remotes/<namn>/HEAD"
 
-#: builtin/remote.c:1269
+#: builtin/remote.c:1282
 msgid "Cannot determine remote HEAD"
 msgstr "Kan inte bestämma HEAD på fjärren"
 
-#: builtin/remote.c:1271
+#: builtin/remote.c:1284
 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:1281
+#: builtin/remote.c:1294
 #, c-format
 msgid "Could not delete %s"
 msgstr "Kunde inte ta bort %s"
 
-#: builtin/remote.c:1289
+#: builtin/remote.c:1302
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Inte en giltig referens: %s"
 
-#: builtin/remote.c:1291
+#: builtin/remote.c:1304
 #, c-format
 msgid "Could not setup %s"
 msgstr "Kunde inte ställa in %s"
 
-#: builtin/remote.c:1307
+#: builtin/remote.c:1322
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s kommer bli dinglande!"
 
-#: builtin/remote.c:1308
+#: builtin/remote.c:1323
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s har blivit dinglande!"
 
-#: builtin/remote.c:1314
+#: builtin/remote.c:1329
 #, c-format
 msgid "Pruning %s"
 msgstr "Rensar %s"
 
-#: builtin/remote.c:1315
+#: builtin/remote.c:1330
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1328
+#: builtin/remote.c:1357
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [skulle rensa] %s"
 
-#: builtin/remote.c:1331
+#: builtin/remote.c:1360
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [rensad] %s"
 
-#: builtin/remote.c:1374
+#: builtin/remote.c:1405
 msgid "prune remotes after fetching"
 msgstr "rensa fjärrar efter hämtning"
 
-#: builtin/remote.c:1440 builtin/remote.c:1514
+#: builtin/remote.c:1471 builtin/remote.c:1545
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Ingen sådan fjärr \"%s\""
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1491
 msgid "add branch"
 msgstr "lägg till gren"
 
-#: builtin/remote.c:1467
+#: builtin/remote.c:1498
 msgid "no remote specified"
 msgstr "ingen fjärr angavs"
 
-#: builtin/remote.c:1489
+#: builtin/remote.c:1520
 msgid "manipulate push URLs"
 msgstr "manipulera URL:ar för sändning"
 
-#: builtin/remote.c:1491
+#: builtin/remote.c:1522
 msgid "add URL"
 msgstr "lägg till URL"
 
-#: builtin/remote.c:1493
+#: builtin/remote.c:1524
 msgid "delete URLs"
 msgstr "ta bort URL:ar"
 
-#: builtin/remote.c:1500
+#: builtin/remote.c:1531
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete ger ingen mening"
 
-#: builtin/remote.c:1540
+#: builtin/remote.c:1571
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Felaktig gammalt URL-mönster: %s"
 
-#: builtin/remote.c:1548
+#: builtin/remote.c:1579
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Ingen sådan URL hittades: %s"
 
-#: builtin/remote.c:1550
+#: builtin/remote.c:1581
 msgid "Will not delete all non-push URLs"
 msgstr "Kommer inte ta bort alla icke-sänd-URL:er"
 
-#: builtin/remote.c:1564
+#: builtin/remote.c:1595
 msgid "be verbose; must be placed before a subcommand"
 msgstr "var pratsam; måste skrivas före ett underkommando"
 
-#: builtin/repack.c:16
+#: builtin/repack.c:17
 msgid "git repack [options]"
 msgstr "git repack [flaggor]"
 
-#: builtin/repack.c:156
+#: builtin/repack.c:160
 msgid "pack everything in a single pack"
 msgstr "packa allt i ett enda paket"
 
-#: builtin/repack.c:158
+#: builtin/repack.c:162
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "samma som -a, och gör onåbara objekt lösa"
 
-#: builtin/repack.c:161
+#: builtin/repack.c:165
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "ta bort överflödiga paket, och kör git-prune-packed"
 
-#: builtin/repack.c:163
+#: builtin/repack.c:167
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "sänd --no-reuse-delta till git-pack-objects"
 
-#: builtin/repack.c:165
+#: builtin/repack.c:169
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "sänd --no-reuse-object till git-pack-objects"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:171
 msgid "do not run git-update-server-info"
 msgstr "kör inte git-update-server-info"
 
-#: builtin/repack.c:170
+#: builtin/repack.c:174
 msgid "pass --local to git-pack-objects"
 msgstr "sänd --local till git-pack-objects"
 
-#: builtin/repack.c:172
+#: builtin/repack.c:176
 msgid "write bitmap index"
 msgstr "skriv bitkartindex"
 
-#: builtin/repack.c:173
+#: builtin/repack.c:177
 msgid "approxidate"
 msgstr "cirkadatum"
 
-#: builtin/repack.c:174
+#: builtin/repack.c:178
 msgid "with -A, do not loosen objects older than this"
 msgstr "med -A, lös inte upp objekt äldre än detta"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:180
 msgid "size of the window used for delta compression"
 msgstr "storlek på fönster använt för deltakomprimering"
 
-#: builtin/repack.c:177 builtin/repack.c:181
+#: builtin/repack.c:181 builtin/repack.c:185
 msgid "bytes"
 msgstr "byte"
 
-#: builtin/repack.c:178
+#: builtin/repack.c:182
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr "samma som ovan, men begränsa minnesstorleken istället för postantal"
 
-#: builtin/repack.c:180
+#: builtin/repack.c:184
 msgid "limits the maximum delta depth"
 msgstr "begränsa maximalt deltadjup"
 
-#: builtin/repack.c:182
+#: builtin/repack.c:186
 msgid "maximum size of each packfile"
 msgstr "maximal storlek på varje paketfil"
 
-#: builtin/repack.c:184
+#: builtin/repack.c:188
 msgid "repack objects in packs marked with .keep"
 msgstr "packa om objekt i paket märkta med .keep"
 
-#: builtin/repack.c:371
+#: builtin/repack.c:374
 #, c-format
 msgid "removing '%s' failed"
 msgstr "misslyckades ta bort \"%s\""
 
-#: builtin/replace.c:17
+#: builtin/replace.c:19
 msgid "git replace [-f] <object> <replacement>"
 msgstr "git replace [-f] <objekt> <ersättning>"
 
-#: builtin/replace.c:18
+#: builtin/replace.c:20
+msgid "git replace [-f] --edit <object>"
+msgstr "git replace [-f] --edit <objekt>"
+
+#: builtin/replace.c:21
+msgid "git replace [-f] --graft <commit> [<parent>...]"
+msgstr "git replace [-f] --graft <incheckning> [<förälder>...]"
+
+#: builtin/replace.c:22
 msgid "git replace -d <object>..."
 msgstr "git replace -d <objekt>..."
 
-#: builtin/replace.c:19
+#: builtin/replace.c:23
 msgid "git replace [--format=<format>] [-l [<pattern>]]"
 msgstr "git replace [--format=<format>] [-l [<mönster>]]"
 
-#: builtin/replace.c:174
+#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#, c-format
+msgid "Not a valid object name: '%s'"
+msgstr "Objektnamnet är inte giltigt: \"%s\""
+
+#: builtin/replace.c:355
+#, c-format
+msgid "bad mergetag in commit '%s'"
+msgstr "felaktig sammanslagningstagg i incheckningen \"%s\""
+
+#: builtin/replace.c:357
+#, c-format
+msgid "malformed mergetag in commit '%s'"
+msgstr "felformad sammanslagningstagg i incheckningen \"%s\""
+
+#: builtin/replace.c:368
+#, c-format
+msgid ""
+"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
+"instead of --graft"
+msgstr ""
+"den ursprungliga incheckningen \"%s\" innehåller sammanslagningstaggen \"%s"
+"\" som har förkastats; använd --edit istället för --graft"
+
+#: builtin/replace.c:401
+#, c-format
+msgid "the original commit '%s' has a gpg signature."
+msgstr "den ursprungliga incheckningen \"%s\" har en gpg-signatur."
+
+#: builtin/replace.c:402
+msgid "the signature will be removed in the replacement commit!"
+msgstr "signaturen kommer att tas bort i ersättningsincheckningen!"
+
+#: builtin/replace.c:408
+#, c-format
+msgid "could not write replacement commit for: '%s'"
+msgstr "kunde inte skriva ersättningsincheckning för: \"%s\""
+
+#: builtin/replace.c:432
 msgid "list replace refs"
 msgstr "visa ersättningsreferenser"
 
-#: builtin/replace.c:175
+#: builtin/replace.c:433
 msgid "delete replace refs"
 msgstr "ta bort ersättningsreferenser"
 
-#: builtin/replace.c:176
+#: builtin/replace.c:434
+msgid "edit existing object"
+msgstr "redigera befintligt objekt"
+
+#: builtin/replace.c:435
+msgid "change a commit's parents"
+msgstr "ändra en inchecknings föräldrar"
+
+#: builtin/replace.c:436
 msgid "replace the ref if it exists"
 msgstr "ersätt referensen om den finns"
 
-#: builtin/replace.c:177
+#: builtin/replace.c:437
+msgid "do not pretty-print contents for --edit"
+msgstr "använd inte snygg visning av innehåll för --edit"
+
+#: builtin/replace.c:438
 msgid "use this format"
 msgstr "använd detta format"
 
@@ -8699,155 +9033,155 @@
 msgid "register clean resolutions in index"
 msgstr "registrera rena lösningar i indexet"
 
-#: builtin/reset.c:25
+#: builtin/reset.c:26
 msgid ""
 "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
 msgstr ""
 "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<incheckning>]"
 
-#: builtin/reset.c:26
+#: builtin/reset.c:27
 msgid "git reset [-q] <tree-ish> [--] <paths>..."
 msgstr "git reset [-q] <träd-igt> [--] <sökvägar>..."
 
-#: builtin/reset.c:27
+#: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
 msgstr "git reset --patch [<träd-igt>] [--] [<sökvägar>...]"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "mixed"
 msgstr "blandad"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "soft"
 msgstr "mjuk"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "hard"
 msgstr "hård"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "merge"
 msgstr "sammanslagning"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "keep"
 msgstr "behåll"
 
-#: builtin/reset.c:73
+#: builtin/reset.c:74
 msgid "You do not have a valid HEAD."
 msgstr "Du har inte en giltig HEAD."
 
-#: builtin/reset.c:75
+#: builtin/reset.c:76
 msgid "Failed to find tree of HEAD."
 msgstr "Kunde inte hitta träder för HEAD."
 
-#: builtin/reset.c:81
+#: builtin/reset.c:82
 #, c-format
 msgid "Failed to find tree of %s."
 msgstr "Kunde inte hitta träder för %s."
 
-#: builtin/reset.c:99
+#: builtin/reset.c:100
 #, c-format
 msgid "HEAD is now at %s"
 msgstr "HEAD är nu på %s"
 
-#: builtin/reset.c:182
+#: builtin/reset.c:183
 #, c-format
 msgid "Cannot do a %s reset in the middle of a merge."
 msgstr "Kan inte utföra en %s återställning mitt i en sammanslagning."
 
-#: builtin/reset.c:273
+#: builtin/reset.c:276
 msgid "be quiet, only report errors"
 msgstr "var tyst, rapportera endast fel"
 
-#: builtin/reset.c:275
+#: builtin/reset.c:278
 msgid "reset HEAD and index"
 msgstr "återställ HEAD och index"
 
-#: builtin/reset.c:276
+#: builtin/reset.c:279
 msgid "reset only HEAD"
 msgstr "återställ endast HEAD"
 
-#: builtin/reset.c:278 builtin/reset.c:280
+#: builtin/reset.c:281 builtin/reset.c:283
 msgid "reset HEAD, index and working tree"
 msgstr "återställ HEAD, index och arbetskatalog"
 
-#: builtin/reset.c:282
+#: builtin/reset.c:285
 msgid "reset HEAD but keep local changes"
 msgstr "återställ HEAD men behåll lokala ändringar"
 
-#: builtin/reset.c:285
+#: builtin/reset.c:288
 msgid "record only the fact that removed paths will be added later"
 msgstr "registrera endast att borttagna sökvägar kommer läggas till senare"
 
-#: builtin/reset.c:302
+#: builtin/reset.c:305
 #, c-format
 msgid "Failed to resolve '%s' as a valid revision."
 msgstr "Kunde inte slå upp \"%s\" som en giltig revision."
 
-#: builtin/reset.c:305 builtin/reset.c:313
+#: builtin/reset.c:308 builtin/reset.c:316
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "Kan inte tolka objektet \"%s\""
 
-#: builtin/reset.c:310
+#: builtin/reset.c:313
 #, c-format
 msgid "Failed to resolve '%s' as a valid tree."
 msgstr "Kunde inte slå upp \"%s\" som ett giltigt träd."
 
-#: builtin/reset.c:319
+#: builtin/reset.c:322
 msgid "--patch is incompatible with --{hard,mixed,soft}"
 msgstr "--patch är inkompatibel med --{hard,mixed,soft}"
 
-#: builtin/reset.c:328
+#: builtin/reset.c:331
 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
 msgstr ""
 "--mixed rekommenderas inte med sökvägar; använd \"git reset -- <sökvägar>\"."
 
-#: builtin/reset.c:330
+#: builtin/reset.c:333
 #, c-format
 msgid "Cannot do %s reset with paths."
 msgstr "Kan inte göra %s återställning med sökvägar."
 
-#: builtin/reset.c:340
+#: builtin/reset.c:343
 #, c-format
 msgid "%s reset is not allowed in a bare repository"
 msgstr "%s återställning tillåts inte i ett naket arkiv"
 
-#: builtin/reset.c:344
+#: builtin/reset.c:347
 msgid "-N can only be used with --mixed"
 msgstr "-N kan endast användas med --mixed"
 
-#: builtin/reset.c:361
+#: builtin/reset.c:364
 msgid "Unstaged changes after reset:"
 msgstr "Oköade ändringar efter återställning:"
 
-#: builtin/reset.c:367
+#: builtin/reset.c:370
 #, c-format
 msgid "Could not reset index file to revision '%s'."
 msgstr "Kunde inte återställa indexfilen till versionen \"%s\"."
 
-#: builtin/reset.c:372
+#: builtin/reset.c:374
 msgid "Could not write new index file."
 msgstr "Kunde inte skriva ny indexfil."
 
-#: builtin/rev-parse.c:359
+#: builtin/rev-parse.c:361
 msgid "git rev-parse --parseopt [options] -- [<args>...]"
 msgstr "git rev-parse --parseopt [options] -- [<argument>...]"
 
-#: builtin/rev-parse.c:364
+#: builtin/rev-parse.c:366
 msgid "keep the `--` passed as an arg"
 msgstr "behåll \"--\" sänt som argument"
 
-#: builtin/rev-parse.c:366
+#: builtin/rev-parse.c:368
 msgid "stop parsing after the first non-option argument"
 msgstr "sluta tolka efter första argument som inte är flagga"
 
-#: builtin/rev-parse.c:369
+#: builtin/rev-parse.c:371
 msgid "output in stuck long form"
 msgstr "utdata fast i lång form"
 
-#: builtin/rev-parse.c:497
+#: builtin/rev-parse.c:499
 msgid ""
 "git rev-parse --parseopt [options] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -8909,7 +9243,7 @@
 
 #: builtin/revert.c:89
 msgid "merge strategy"
-msgstr "sammanslagninsstrategi"
+msgstr "sammanslagningsstrategi"
 
 #: builtin/revert.c:90
 msgid "option"
@@ -8960,7 +9294,7 @@
 "the following submodule (or one of its nested submodules)\n"
 "uses a .git directory:"
 msgid_plural ""
-"the following submodules (or one of its nested submodules)\n"
+"the following submodules (or one of their nested submodules)\n"
 "use a .git directory:"
 msgstr[0] ""
 "följande undermodul (eller en av dess nästlade undermoduler)\n"
@@ -9037,6 +9371,11 @@
 msgid "exit with a zero status even if nothing matched"
 msgstr "avsluta med nollstatus även om inget träffades"
 
+#: builtin/rm.c:318
+msgid "Please, stage your changes to .gitmodules or stash them to proceed"
+msgstr ""
+"Köa dina ändringar i .gitmodules eller använd \"stash\" för att fortsätta"
+
 #: builtin/rm.c:336
 #, c-format
 msgid "not removing '%s' recursively without -r"
@@ -9126,7 +9465,7 @@
 
 #: builtin/show-branch.c:664
 msgid "show possible merge bases"
-msgstr "visa möjliga sammanslaningsbaser"
+msgstr "visa möjliga sammanslagningsbaser"
 
 #: builtin/show-branch.c:666
 msgid "show refs unreachable from any other ref"
@@ -9221,11 +9560,11 @@
 msgid "shorten ref output"
 msgstr "förkorta ref-utdata"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
 msgid "reason"
 msgstr "skäl"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
 msgid "reason of the update"
 msgstr "skäl till uppdateringen"
 
@@ -9251,323 +9590,326 @@
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <taggnamn>..."
 
-#: builtin/tag.c:67
+#: builtin/tag.c:69
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "felformat objekt vid \"%s\""
 
-#: builtin/tag.c:239
+#: builtin/tag.c:301
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "taggnamnet för långt: %.*s..."
 
-#: builtin/tag.c:244
+#: builtin/tag.c:306
 #, c-format
 msgid "tag '%s' not found."
 msgstr "taggen \"%s\" hittades inte."
 
-#: builtin/tag.c:259
+#: builtin/tag.c:321
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Tog bort tagg \"%s\" (var %s)\n"
 
-#: builtin/tag.c:271
+#: builtin/tag.c:333
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "kunde inte bekräfta taggen \"%s\""
 
-#: builtin/tag.c:281
+#: builtin/tag.c:343
 #, c-format
 msgid ""
 "\n"
-"Write a tag message\n"
+"Write a message for tag:\n"
+"  %s\n"
 "Lines starting with '%c' will be ignored.\n"
 msgstr ""
 "\n"
-"Skriv ett taggmeddelande\n"
+"Skriv ett meddelande för taggen:\n"
+"  %s\n"
 "Rader som inleds med \"%c\" ignoreras.\n"
 
-#: builtin/tag.c:285
+#: builtin/tag.c:347
 #, c-format
 msgid ""
 "\n"
-"Write a tag message\n"
+"Write a message for tag:\n"
+"  %s\n"
 "Lines starting with '%c' will be kept; you may remove them yourself if you "
 "want to.\n"
 msgstr ""
 "\n"
-"Skriv ett taggmeddelande\n"
+"Skriv ett meddelande för taggen:\n"
+"  %s\n"
 "Rader som inleds med \"%c\" kommer behållas; du kan själv ta bort dem om\n"
 "du vill.\n"
 
-#: builtin/tag.c:324
+#: 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
 msgid "unable to sign the tag"
 msgstr "kunde inte signera taggen"
 
-#: builtin/tag.c:326
+#: builtin/tag.c:430
 msgid "unable to write tag file"
 msgstr "kunde inte skriva tagg-filen"
 
-#: builtin/tag.c:351
+#: builtin/tag.c:455
 msgid "bad object type."
 msgstr "felaktig objekttyp"
 
-#: builtin/tag.c:364
+#: builtin/tag.c:468
 msgid "tag header too big."
 msgstr "tagghuvud för stort."
 
-#: builtin/tag.c:400
+#: builtin/tag.c:504
 msgid "no tag message?"
 msgstr "inget taggmeddelande?"
 
-#: builtin/tag.c:406
+#: builtin/tag.c:510
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "Taggmeddelandet har lämnats i %s\n"
 
-#: builtin/tag.c:455
+#: builtin/tag.c:559
 msgid "switch 'points-at' requires an object"
-msgstr "flaggan \"points-at\" behöver ett object"
+msgstr "flaggan \"points-at\" behöver ett objekt"
 
-#: builtin/tag.c:457
+#: builtin/tag.c:561
 #, c-format
 msgid "malformed object name '%s'"
 msgstr "felformat objektnamn \"%s\""
 
-#: builtin/tag.c:480
-#, c-format
-msgid "unsupported sort specification %s"
-msgstr "sorteringsangivelsen %s stöds ej"
-
-#: builtin/tag.c:500
+#: builtin/tag.c:589
 msgid "list tag names"
 msgstr "lista taggnamn"
 
-#: builtin/tag.c:502
+#: builtin/tag.c:591
 msgid "print <n> lines of each tag message"
 msgstr "visa <n> rader från varje taggmeddelande"
 
-#: builtin/tag.c:504
+#: builtin/tag.c:593
 msgid "delete tags"
 msgstr "ta bort taggar"
 
-#: builtin/tag.c:505
+#: builtin/tag.c:594
 msgid "verify tags"
 msgstr "verifiera taggar"
 
-#: builtin/tag.c:507
+#: builtin/tag.c:596
 msgid "Tag creation options"
 msgstr "Alternativ för att skapa taggar"
 
-#: builtin/tag.c:509
+#: builtin/tag.c:598
 msgid "annotated tag, needs a message"
 msgstr "annoterad tagg, behöver meddelande"
 
-#: builtin/tag.c:511
+#: builtin/tag.c:600
 msgid "tag message"
 msgstr "taggmeddelande"
 
-#: builtin/tag.c:513
+#: builtin/tag.c:602
 msgid "annotated and GPG-signed tag"
 msgstr "annoterad och GPG-signerad tagg"
 
-#: builtin/tag.c:517
+#: builtin/tag.c:606
 msgid "use another key to sign the tag"
 msgstr "använd annan nyckel för att signera taggen"
 
-#: builtin/tag.c:518
+#: builtin/tag.c:607
 msgid "replace the tag if exists"
 msgstr "ersätt taggen om den finns"
 
-#: builtin/tag.c:519
+#: builtin/tag.c:608
 msgid "show tag list in columns"
 msgstr "lista taggar i spalter"
 
-#: builtin/tag.c:521
+#: builtin/tag.c:610
 msgid "sort tags"
 msgstr "sortera taggar"
 
-#: builtin/tag.c:525
+#: builtin/tag.c:614
 msgid "Tag listing options"
 msgstr "Alternativ för listning av taggar"
 
-#: builtin/tag.c:528 builtin/tag.c:534
+#: builtin/tag.c:617 builtin/tag.c:623
 msgid "print only tags that contain the commit"
 msgstr "visa endast taggar som innehåller incheckningen"
 
-#: builtin/tag.c:540
+#: builtin/tag.c:629
 msgid "print only tags of the object"
 msgstr "visa endast taggar för objektet"
 
-#: builtin/tag.c:566
+#: builtin/tag.c:655
 msgid "--column and -n are incompatible"
 msgstr "--column och -n är inkompatibla"
 
-#: builtin/tag.c:578
+#: builtin/tag.c:667
 msgid "--sort and -n are incompatible"
 msgstr "--sort och -n är inkompatibla"
 
-#: builtin/tag.c:585
+#: builtin/tag.c:674
 msgid "-n option is only allowed with -l."
 msgstr "Flaggan -n är endast tillåten tillsammans med -l."
 
-#: builtin/tag.c:587
+#: builtin/tag.c:676
 msgid "--contains option is only allowed with -l."
 msgstr "Flaggan --contains är endast tillåten tillsammans med -l"
 
-#: builtin/tag.c:589
+#: builtin/tag.c:678
 msgid "--points-at option is only allowed with -l."
 msgstr "Flaggan --points-at är endast tillåten tillsammans med -l."
 
-#: builtin/tag.c:597
+#: builtin/tag.c:686
 msgid "only one -F or -m option is allowed."
 msgstr "endast en av flaggorna -F eller -m tillåts."
 
-#: builtin/tag.c:617
+#: builtin/tag.c:706
 msgid "too many params"
 msgstr "för många parametrar"
 
-#: builtin/tag.c:623
+#: builtin/tag.c:712
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "\"%s\" är inte ett giltigt taggnamn."
 
-#: builtin/tag.c:628
+#: builtin/tag.c:717
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "taggen \"%s\" finns redan"
 
-#: builtin/tag.c:646
-#, c-format
-msgid "%s: cannot lock the ref"
-msgstr "%s: kan inte låsa referensen"
-
-#: builtin/tag.c:648
-#, c-format
-msgid "%s: cannot update the ref"
-msgstr "%s: kan inte uppdatera referensen"
-
-#: builtin/tag.c:650
+#: builtin/tag.c:741
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Uppdaterad tagg \"%s\" (var %s)\n"
 
-#: builtin/unpack-objects.c:483
+#: builtin/unpack-objects.c:489
 msgid "Unpacking objects"
 msgstr "Packar upp objekt"
 
-#: builtin/update-index.c:399
+#: builtin/update-index.c:403
 msgid "git update-index [options] [--] [<file>...]"
 msgstr "git update-index [flaggor] [--] [<fil>...]"
 
-#: builtin/update-index.c:748
+#: builtin/update-index.c:756
 msgid "continue refresh even when index needs update"
 msgstr "fortsätt uppdatera även när index inte är àjour"
 
-#: builtin/update-index.c:751
+#: builtin/update-index.c:759
 msgid "refresh: ignore submodules"
 msgstr "refresh: ignorera undermoduler"
 
-#: builtin/update-index.c:754
+#: builtin/update-index.c:762
 msgid "do not ignore new files"
 msgstr "ignorera inte nya filer"
 
-#: builtin/update-index.c:756
+#: builtin/update-index.c:764
 msgid "let files replace directories and vice-versa"
 msgstr "låt filer ersätta kataloger och omvänt"
 
-#: builtin/update-index.c:758
+#: builtin/update-index.c:766
 msgid "notice files missing from worktree"
 msgstr "lägg märke till filer som saknas i arbetskatalogen"
 
-#: builtin/update-index.c:760
+#: builtin/update-index.c:768
 msgid "refresh even if index contains unmerged entries"
 msgstr "uppdatera även om indexet innehåller ej sammanslagna poster"
 
-#: builtin/update-index.c:763
+#: builtin/update-index.c:771
 msgid "refresh stat information"
 msgstr "uppdatera statusinformation"
 
-#: builtin/update-index.c:767
+#: builtin/update-index.c:775
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "som --refresh, men ignorera assume-unchanged-inställning"
 
-#: builtin/update-index.c:771
+#: builtin/update-index.c:779
 msgid "<mode>,<object>,<path>"
 msgstr "<läge>,<objekt>,<sökväg>"
 
-#: builtin/update-index.c:772
+#: builtin/update-index.c:780
 msgid "add the specified entry to the index"
 msgstr "lägg till angiven post i indexet"
 
-#: builtin/update-index.c:776
+#: builtin/update-index.c:784
 msgid "(+/-)x"
 msgstr "(+/-)x"
 
-#: builtin/update-index.c:777
+#: builtin/update-index.c:785
 msgid "override the executable bit of the listed files"
 msgstr "överstyr exekveringsbiten för angivna filer"
 
-#: builtin/update-index.c:781
+#: builtin/update-index.c:789
 msgid "mark files as \"not changing\""
 msgstr "markera filer som \"ändras inte\""
 
-#: builtin/update-index.c:784
+#: builtin/update-index.c:792
 msgid "clear assumed-unchanged bit"
 msgstr "rensa \"assume-unchanged\"-biten"
 
-#: builtin/update-index.c:787
+#: builtin/update-index.c:795
 msgid "mark files as \"index-only\""
 msgstr "markera filer som \"endast index\""
 
-#: builtin/update-index.c:790
+#: builtin/update-index.c:798
 msgid "clear skip-worktree bit"
 msgstr "töm \"skip-worktree\"-biten"
 
-#: builtin/update-index.c:793
+#: builtin/update-index.c:801
 msgid "add to index only; do not add content to object database"
 msgstr "lägg endast till indexet; lägg inte till innehållet i objektdatabasen"
 
-#: builtin/update-index.c:795
+#: builtin/update-index.c:803
 msgid "remove named paths even if present in worktree"
 msgstr "ta bort namngivna sökvägar även om de finns i arbetskatalogen"
 
-#: builtin/update-index.c:797
+#: builtin/update-index.c:805
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "med --stdin: indatarader termineras med null-byte"
 
-#: builtin/update-index.c:799
+#: builtin/update-index.c:807
 msgid "read list of paths to be updated from standard input"
 msgstr "läs lista över sökvägar att uppdatera från standard in"
 
-#: builtin/update-index.c:803
+#: builtin/update-index.c:811
 msgid "add entries from standard input to the index"
 msgstr "lägg poster från standard in till indexet"
 
-#: builtin/update-index.c:807
+#: builtin/update-index.c:815
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr "återfyll etapp 2 och 3 från angivna sökvägar"
 
-#: builtin/update-index.c:811
+#: builtin/update-index.c:819
 msgid "only update entries that differ from HEAD"
 msgstr "uppdatera endast poster som skiljer sig från HEAD"
 
-#: builtin/update-index.c:815
+#: builtin/update-index.c:823
 msgid "ignore files missing from worktree"
 msgstr "ignorera filer som saknas i arbetskatalogen"
 
-#: builtin/update-index.c:818
+#: builtin/update-index.c:826
 msgid "report actions to standard output"
-msgstr "raportera åtgärder på standard ut"
+msgstr "rapportera åtgärder på standard ut"
 
-#: builtin/update-index.c:820
+#: builtin/update-index.c:828
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(för porslin) glöm sparade olösta konflikter"
 
-#: builtin/update-index.c:824
+#: builtin/update-index.c:832
 msgid "write index in this format"
 msgstr "skriv index i detta format"
 
+#: builtin/update-index.c:834
+msgid "enable or disable split index"
+msgstr "aktivera eller inaktivera delat index"
+
 #: builtin/update-ref.c:9
 msgid "git update-ref [options] -d <refname> [<oldval>]"
 msgstr "git update-ref [flaggor] -d <refnamn> [<gammaltvärde>]"
@@ -9580,19 +9922,19 @@
 msgid "git update-ref [options] --stdin [-z]"
 msgstr "git update-ref [flaggor] --stdin [-z]"
 
-#: builtin/update-ref.c:256
+#: builtin/update-ref.c:363
 msgid "delete the reference"
 msgstr "ta bort referensen"
 
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:365
 msgid "update <refname> not the one it points to"
 msgstr "uppdatera <refnamn> inte det den pekar på"
 
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:366
 msgid "stdin has NUL-terminated arguments"
 msgstr "standard in har NUL-terminerade argument"
 
-#: builtin/update-ref.c:260
+#: builtin/update-ref.c:367
 msgid "read updates from stdin"
 msgstr "läs uppdateringar från standard in"
 
@@ -9604,15 +9946,23 @@
 msgid "update the info files from scratch"
 msgstr "uppdatera informationsfilerna från grunden"
 
-#: builtin/verify-pack.c:56
+#: builtin/verify-commit.c:17
+msgid "git verify-commit [-v|--verbose] <commit>..."
+msgstr "git verify-commit [-v|--verbose] <incheckning>..."
+
+#: builtin/verify-commit.c:75
+msgid "print commit contents"
+msgstr "visa innehåll för incheckning"
+
+#: builtin/verify-pack.c:54
 msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."
 msgstr "git verify-pack [-v|--verbose] [-s|--stat-only] <paket>..."
 
-#: builtin/verify-pack.c:66
+#: builtin/verify-pack.c:64
 msgid "verbose"
 msgstr "pratsam"
 
-#: builtin/verify-pack.c:68
+#: builtin/verify-pack.c:66
 msgid "show statistics only"
 msgstr "visa endast statistik"
 
@@ -9640,9 +9990,13 @@
 msgid "only useful for debugging"
 msgstr "endast användbart vid felsökning"
 
+#: credential-cache--daemon.c:267
+msgid "print debugging messages to stderr"
+msgstr "skriv felsökningsmeddelanden på standard fel"
+
 #: git.c:17
 msgid ""
-"'git help -a' and 'git help -g' lists available subcommands and some\n"
+"'git help -a' and 'git help -g' list available subcommands and some\n"
 "concept guides. See 'git help <command>' or 'git help <concept>'\n"
 "to read about a specific subcommand or concept."
 msgstr ""
@@ -9650,26 +10004,6 @@
 "några konceptvägledningar. Se \"git help <kommando>\" eller \"git help\n"
 "<koncept>\" för att läsa mer om specifika underkommandon och koncept."
 
-#: parse-options.h:143
-msgid "expiry-date"
-msgstr "giltig-till"
-
-#: parse-options.h:158
-msgid "no-op (backward compatibility)"
-msgstr "ingen funktion (bakåtkompatibilitet)"
-
-#: parse-options.h:232
-msgid "be more verbose"
-msgstr "var mer pratsam"
-
-#: parse-options.h:234
-msgid "be more quiet"
-msgstr "var mer tyst"
-
-#: parse-options.h:240
-msgid "use <n> digits to display SHA-1s"
-msgstr "använd <n> siffror för att visa SHA-1:or"
-
 #: common-cmds.h:8
 msgid "Add file contents to the index"
 msgstr "Lägg filinnehåll till indexet"
@@ -9754,6 +10088,30 @@
 msgid "Create, list, delete or verify a tag object signed with GPG"
 msgstr "Skapa, visa, ta bort eller verifiera GPG-signerat taggobjekt"
 
+#: parse-options.h:143
+msgid "expiry-date"
+msgstr "giltig-till"
+
+#: parse-options.h:158
+msgid "no-op (backward compatibility)"
+msgstr "ingen funktion (bakåtkompatibilitet)"
+
+#: parse-options.h:232
+msgid "be more verbose"
+msgstr "var mer pratsam"
+
+#: parse-options.h:234
+msgid "be more quiet"
+msgstr "var mer tyst"
+
+#: parse-options.h:240
+msgid "use <n> digits to display SHA-1s"
+msgstr "använd <n> siffror för att visa SHA-1:or"
+
+#: rerere.h:27
+msgid "update the index with reused conflict resolution if possible"
+msgstr "uppdatera indexet med återanvänd konfliktlösning om möjligt"
+
 #: git-am.sh:52
 msgid "You need to set your committer info first"
 msgstr "Du måste ställa in din incheckarinformation först"
@@ -9806,7 +10164,7 @@
 
 #: git-am.sh:181
 msgid "Failed to merge in the changes."
-msgstr "Misslyckads slå ihop ändringarna."
+msgstr "Misslyckades slå ihop ändringarna."
 
 #: git-am.sh:276
 msgid "Only one StGIT patch series can be applied at once"
@@ -10010,7 +10368,7 @@
 
 #: git-bisect.sh:289
 msgid ""
-"You need to give me at least one good and one bad revisions.\n"
+"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.)"
 msgstr ""
 "Du måste ange åtminstone en bra och en dålig version.\n"
@@ -10019,7 +10377,7 @@
 #: git-bisect.sh:292
 msgid ""
 "You need to start by \"git bisect start\".\n"
-"You then need to give me at least one good and one bad revisions.\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.)"
 msgstr ""
 "Du måste starta med \"git bisect start\".\n"
@@ -10092,21 +10450,29 @@
 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, or use 'git commit -a'."
+"as appropriate to mark resolution and make a commit."
 msgstr ""
 "Du kan inte göra en \"pull\" då du har ändringar som inte checkats in.\n"
 "Rätta dem i din arbetskatalog och använd sedan \"git add/rm <fil>\"\n"
-"där det är lämpligt för att ange lösning, eller använd \"git commit -a\"."
+"där det är lämpligt för att ange lösning och checka in."
 
 #: git-pull.sh:25
 msgid "Pull is not possible because you have unmerged files."
 msgstr "Du kan inte göra en \"pull\" då du har ändringar som inte checkats in."
 
-#: git-pull.sh:247
+#: git-pull.sh:31
+msgid ""
+"You have not concluded your merge (MERGE_HEAD exists).\n"
+"Please, commit your changes before you can merge."
+msgstr ""
+"Du har inte avslutat sammanslagningen (MERGE_HEAD finns).\n"
+"Checka in dina ändringar innan du kan slå ihop."
+
+#: git-pull.sh:245
 msgid "updating an unborn branch with changes added to the index"
 msgstr "uppdaterar en ofödd gren med ändringar som lagts till i indexet"
 
-#: git-pull.sh:271
+#: git-pull.sh:269
 #, sh-format
 msgid ""
 "Warning: fetch updated the current branch head.\n"
@@ -10117,11 +10483,11 @@
 "Varning: snabbspolar din arbetskatalog från\n"
 "Varning: incheckningen $orig_head."
 
-#: git-pull.sh:296
+#: git-pull.sh:294
 msgid "Cannot merge multiple branches into empty head"
 msgstr "Kan inte slå ihop flera grenar i ett tomt huvud."
 
-#: git-pull.sh:300
+#: git-pull.sh:298
 msgid "Cannot rebase onto multiple branches"
 msgstr "Kan inte utföra en \"rebase\" ovanpå flera grenar"
 
@@ -10136,16 +10502,16 @@
 "Om du vill hoppa över patchen kör du istället \"git rebase --skip\".\n"
 "För att återställa originalgrenen och avbryta kör du \"git rebase --abort\"."
 
-#: git-rebase.sh:164
+#: git-rebase.sh:165
 msgid "Applied autostash."
 msgstr "Tillämpade autostash."
 
-#: git-rebase.sh:167
+#: git-rebase.sh:168
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Kan inte spara $stash_sha1"
 
-#: git-rebase.sh:168
+#: git-rebase.sh:169
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
@@ -10155,31 +10521,31 @@
 "Dina ändringar är säkra i stashen.\n"
 "Du kan när som helst använda \"git stash pop\" eller \"git stash drop\".\n"
 
-#: git-rebase.sh:207
+#: git-rebase.sh:208
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Kroken pre-rebase vägrade ombaseringen."
 
-#: git-rebase.sh:212
+#: git-rebase.sh:213
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "Det verkar som en git-am körs. Kan inte ombasera."
 
-#: git-rebase.sh:350
+#: git-rebase.sh:351
 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:355
+#: git-rebase.sh:356
 msgid "No rebase in progress?"
 msgstr "Ingen ombasering pågår?"
 
-#: git-rebase.sh:366
+#: git-rebase.sh:367
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr "Åtgärden --edit-todo kan endast användas under interaktiv ombasering."
 
-#: git-rebase.sh:373
+#: git-rebase.sh:374
 msgid "Cannot read HEAD"
 msgstr "Kan inte läsa HEAD"
 
-#: git-rebase.sh:376
+#: git-rebase.sh:377
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -10187,12 +10553,12 @@
 "Du måste redigera alla sammanslagningskonflikter och\n"
 "därefter markera dem som lösta med git add"
 
-#: git-rebase.sh:394
+#: git-rebase.sh:395
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Kunde inte flytta tillbaka till $head_name"
 
-#: git-rebase.sh:413
+#: git-rebase.sh:414
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -10213,65 +10579,65 @@
 "och kör programmet igen. Jag avslutar ifall du fortfarande har\n"
 "något av värde där."
 
-#: git-rebase.sh:464
+#: git-rebase.sh:465
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "ogiltig uppström $upstream_name"
 
-#: git-rebase.sh:488
+#: git-rebase.sh:489
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: mer än en sammanslagningsbas finns"
 
-#: git-rebase.sh:491 git-rebase.sh:495
+#: git-rebase.sh:492 git-rebase.sh:496
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: ingen sammanslagningsbas finns"
 
-#: git-rebase.sh:500
+#: git-rebase.sh:501
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "Peka på en giltig incheckning: $onto_name"
 
-#: git-rebase.sh:523
+#: git-rebase.sh:524
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "ödesdigert: ingen sådan gren: $branch_name"
 
-#: git-rebase.sh:556
+#: git-rebase.sh:557
 msgid "Cannot autostash"
 msgstr "Kan inte utföra \"autostash\""
 
-#: git-rebase.sh:561
+#: git-rebase.sh:562
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Skapade autostash: $stash_abbrev"
 
-#: git-rebase.sh:565
+#: git-rebase.sh:566
 msgid "Please commit or stash them."
 msgstr "Checka in eller använd \"stash\" på dem."
 
-#: git-rebase.sh:585
+#: git-rebase.sh:586
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "Aktuell gren $branch_name är à jour."
 
-#: git-rebase.sh:589
+#: git-rebase.sh:590
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "Aktuell gren $branch_name är à jour, ombasering framtvingad."
 
-#: git-rebase.sh:600
+#: git-rebase.sh:601
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Ändringar från $mb till $onto:"
 
-#: git-rebase.sh:609
+#: git-rebase.sh:610
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 "Först, spolar tillbaka huvudet för att spela av ditt arbete ovanpå det..."
 
-#: git-rebase.sh:619
+#: git-rebase.sh:620
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "Snabbspolade $branch_name till $onto_name."
@@ -10288,23 +10654,23 @@
 msgid "Cannot save the current index state"
 msgstr "Kan inte spara aktuellt tillstånd för indexet"
 
-#: git-stash.sh:123 git-stash.sh:136
+#: git-stash.sh:124 git-stash.sh:137
 msgid "Cannot save the current worktree state"
 msgstr "Kan inte spara aktuellt tillstånd för arbetskatalogen"
 
-#: git-stash.sh:140
+#: git-stash.sh:141
 msgid "No changes selected"
 msgstr "Inga ändringar valda"
 
-#: git-stash.sh:143
+#: git-stash.sh:144
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "Kan inte ta bort temporärt index (kan inte inträffa)"
 
-#: git-stash.sh:156
+#: git-stash.sh:157
 msgid "Cannot record working tree state"
 msgstr "Kan inte registrera tillstånd för arbetskatalog"
 
-#: git-stash.sh:190
+#: git-stash.sh:191
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "Kan inte uppdatera $ref_stash med $w_commit"
@@ -10319,7 +10685,7 @@
 #. $ 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:237
+#: git-stash.sh:238
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -10328,85 +10694,85 @@
 "fel: felaktig flagga för \"stash save\": $option\n"
 "     För att ange ett meddelande, använd git stash save -- \"$option\""
 
-#: git-stash.sh:258
+#: git-stash.sh:259
 msgid "No local changes to save"
 msgstr "Inga lokala ändringar att spara"
 
-#: git-stash.sh:262
+#: git-stash.sh:263
 msgid "Cannot initialize stash"
 msgstr "Kan inte initiera \"stash\""
 
-#: git-stash.sh:266
+#: git-stash.sh:267
 msgid "Cannot save the current status"
 msgstr "Kan inte spara aktuell status"
 
-#: git-stash.sh:284
+#: git-stash.sh:285
 msgid "Cannot remove worktree changes"
 msgstr "Kan inte ta bort ändringar i arbetskatalogen"
 
-#: git-stash.sh:383
+#: git-stash.sh:384
 msgid "No stash found."
 msgstr "Ingen \"stash\" hittades."
 
-#: git-stash.sh:390
+#: git-stash.sh:391
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "För många revisioner angivna: $REV"
 
-#: git-stash.sh:396
+#: git-stash.sh:397
 #, sh-format
-msgid "$reference is not valid reference"
-msgstr "$reference är inte en giltig referens."
+msgid "$reference is not a valid reference"
+msgstr "$reference är inte en giltig referens"
 
-#: git-stash.sh:424
+#: git-stash.sh:425
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "\"$args\" är inte en \"stash\"-liknande incheckning"
 
-#: git-stash.sh:435
+#: git-stash.sh:436
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "\"$args\" är inte en \"stash\"-referens"
 
-#: git-stash.sh:443
+#: git-stash.sh:444
 msgid "unable to refresh index"
 msgstr "kan inte uppdatera indexet"
 
-#: git-stash.sh:447
+#: git-stash.sh:448
 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:455
+#: git-stash.sh:456
 msgid "Conflicts in index. Try without --index."
 msgstr "Konflikter i indexet. Testa utan --index."
 
-#: git-stash.sh:457
+#: git-stash.sh:458
 msgid "Could not save index tree"
 msgstr "Kunde inte spara indexträd"
 
-#: git-stash.sh:491
+#: git-stash.sh:492
 msgid "Cannot unstage modified files"
 msgstr "Kan inte ta bort ändrade filer ur kön"
 
-#: git-stash.sh:506
+#: git-stash.sh:507
 msgid "Index was not unstashed."
 msgstr "Indexet har inte tagits ur kön."
 
-#: git-stash.sh:529
+#: git-stash.sh:530
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Kastade ${REV} ($s)"
 
-#: git-stash.sh:530
+#: git-stash.sh:531
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Kunde inte kasta \"stash\"-post"
 
-#: git-stash.sh:537
+#: git-stash.sh:539
 msgid "No branch name specified"
 msgstr "Inget grennamn angavs"
 
-#: git-stash.sh:609
+#: git-stash.sh:611
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(För att återställa dem, skriv \"git stash apply\")"
 
@@ -10426,26 +10792,26 @@
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
 msgstr "Misslyckades klona \"$url\" till undermodulsökvägen \"$sm_path\""
 
-#: git-submodule.sh:299
+#: 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:409
+#: git-submodule.sh:406
 msgid "Relative path can only be used from the toplevel of the working tree"
-msgstr "Relativ sökväg kan enfast användas från arbetskatalogens toppnivå"
+msgstr "Relativ sökväg kan endast användas från arbetskatalogens toppnivå"
 
-#: git-submodule.sh:419
+#: git-submodule.sh:416
 #, 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:436
+#: git-submodule.sh:433
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "\"$sm_path\" finns redan i indexet"
 
-#: git-submodule.sh:440
+#: git-submodule.sh:437
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -10456,22 +10822,22 @@
 "$sm_path\n"
 "Använd -f om du verkligen vill lägga till den"
 
-#: git-submodule.sh:458
+#: git-submodule.sh:455
 #, 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:460
+#: git-submodule.sh:457
 #, 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:468
+#: git-submodule.sh:465
 #, 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:470
+#: git-submodule.sh:467
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
@@ -10479,14 +10845,14 @@
 "För att återanvända den lokala git-katalogen istället för att på nytt klona "
 "från"
 
-#: git-submodule.sh:472
+#: git-submodule.sh:469
 #, 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:473
+#: git-submodule.sh:470
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
@@ -10495,81 +10861,81 @@
 "eller om du är osäker på vad det innebär, välj nytt namn med flaggan \"--name"
 "\"."
 
-#: git-submodule.sh:475
+#: git-submodule.sh:472
 #, 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:487
+#: git-submodule.sh:484
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Kan inte checka ut undermodulen \"$sm_path\""
 
-#: git-submodule.sh:492
+#: git-submodule.sh:489
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Misslyckades lägga till undermodulen \"$sm_path\""
 
-#: git-submodule.sh:501
+#: git-submodule.sh:498
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Misslyckades registrera undermodulen \"$sm_path\""
 
-#: git-submodule.sh:545
+#: git-submodule.sh:542
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "Går in i \"$prefix$displaypath\""
 
-#: git-submodule.sh:565
+#: git-submodule.sh:562
 #, 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:611
+#: git-submodule.sh:608
 #, 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:620
+#: git-submodule.sh:617
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
 msgstr "Misslyckades registrera url för undermodulsökväg \"$displaypath\""
 
-#: git-submodule.sh:622
+#: git-submodule.sh:619
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr ""
 "Undermodulen \"$name\" ($url) registrerad för sökvägen \"$displaypath\""
 
-#: git-submodule.sh:639
+#: git-submodule.sh:636
 #, 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:677
+#: git-submodule.sh:674
 #, 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:694
+#: git-submodule.sh:691
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr ""
 "Undermodulens arbetskatalog \"$displaypath\" innehåller katalogen \".git\""
 
-#: git-submodule.sh:695
+#: git-submodule.sh:692
 #, 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:701
+#: git-submodule.sh:698
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -10578,28 +10944,28 @@
 "Undermodulens arbetskatalog \"$displaypath\" har lokala ändringar; \"-f\" "
 "kastar bort dem"
 
-#: git-submodule.sh:704
+#: git-submodule.sh:701
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Rensade katalogen \"$displaypath\""
 
-#: git-submodule.sh:705
+#: git-submodule.sh:702
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "Kunde inte ta bort undermodulens arbetskatalog \"$displaypath\""
 
-#: git-submodule.sh:708
+#: git-submodule.sh:705
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "Kunde inte skapa tom undermodulskatalog \"$displaypath\""
 
-#: git-submodule.sh:717
+#: git-submodule.sh:714
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 "Undermodulen \"$name\" ($url) avregistrerad för sökvägen \"$displaypath\""
 
-#: git-submodule.sh:833
+#: git-submodule.sh:830
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
@@ -10608,108 +10974,144 @@
 "Undermodulen \"$displaypath\" har inte initierats\n"
 "Kanske du vill köra \"update --init\"?"
 
-#: git-submodule.sh:846
+#: git-submodule.sh:843
 #, 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:855
+#: git-submodule.sh:852
 #, 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:879
+#: git-submodule.sh:876
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Kan inte hämta i undermodulsökväg \"$displaypath\""
 
-#: git-submodule.sh:893
+#: git-submodule.sh:890
 #, 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:894
+#: git-submodule.sh:891
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Undermodulsökvägen \"$displaypath\": checkade ut \"$sha1\""
 
-#: git-submodule.sh:898
+#: git-submodule.sh:895
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "Kan inte ombasera \"$sha1\" i undermodulsökvägen \"$displaypath\""
 
-#: git-submodule.sh:899
+#: git-submodule.sh:896
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Undermodulsökvägen \"$displaypath\": ombaserade in i \"$sha1\""
 
-#: git-submodule.sh:904
+#: git-submodule.sh:901
 #, 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:905
+#: git-submodule.sh:902
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Undermodulsökvägen \"$displaypath\": sammanslagen i \"$sha1\""
 
-#: git-submodule.sh:910
+#: git-submodule.sh:907
 #, 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:911
+#: git-submodule.sh:908
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr "Undermodulsökvägen \"$prefix$sm_path\": \"$command $sha1\""
 
-#: git-submodule.sh:941
+#: git-submodule.sh:938
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Misslyckades rekursera in i undermodulsökvägen \"$displaypath\""
 
-#: git-submodule.sh:1049
+#: git-submodule.sh:1046
 msgid "The --cached option cannot be used with the --files option"
 msgstr "Flaggan --cached kan inte användas med flaggan --files"
 
-#: git-submodule.sh:1097
+#: git-submodule.sh:1098
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "oväntat läge $mod_dst"
 
-#: git-submodule.sh:1117
+#: git-submodule.sh:1118
 #, 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:1120
+#: git-submodule.sh:1121
 #, 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:1123
+#: git-submodule.sh:1124
 #, 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:1148
+#: git-submodule.sh:1149
 msgid "blob"
 msgstr "blob"
 
-#: git-submodule.sh:1262
+#: git-submodule.sh:1267
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Misslyckades rekursera in i undermodulsökvägen \"$sm_path\""
 
-#: git-submodule.sh:1326
+#: git-submodule.sh:1331
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Synkroniserar undermodul-url för \"$displaypath\""
 
+#~ msgid "Failed to lock ref for update"
+#~ msgstr "Misslyckades låsa referens för uppdatering"
+
+#~ msgid "Failed to write ref"
+#~ msgstr "Misslyckades skriva referens"
+
+#~ msgid "Failed to lock HEAD during fast_forward_to"
+#~ msgstr "Misslyckades låsa HEAD under \"fast_forward_to\""
+
+#~ msgid "invalid commit: %s"
+#~ msgstr "felaktig incheckning: %s"
+
+#~ msgid "cannot lock HEAD ref"
+#~ msgstr "kunde inte låsa HEAD-referens"
+
+#~ msgid "cannot update HEAD ref"
+#~ msgstr "kunde inte uppdatera HEAD-referens"
+
+#~ msgid "Invalid %s: '%s'"
+#~ msgstr "Felaktigt %s: \"%s\""
+
+#~ msgid "cannot tell cwd"
+#~ msgstr "kan inte läsa aktuell katalog (cwd)"
+
+#~ msgid "%s: cannot lock the ref"
+#~ msgstr "%s: kan inte låsa referensen"
+
+#~ msgid "%s: cannot update the ref"
+#~ msgstr "%s: kan inte uppdatera referensen"
+
+#~ msgid "commit has empty message"
+#~ msgstr "incheckningen har ett tomt meddelande"
+
+#~ msgid "Failed to chdir: %s"
+#~ msgstr "Kunde inte byta katalog (chdir): %s"
+
 #~ msgid "Tracking not set up: name too long: %s"
 #~ msgstr "Spårning har inte ställts in: namnet för långt: %s"
 
diff --git a/po/vi.po b/po/vi.po
index f05974f..f4a7468 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -6,10 +6,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: git v2.0.0-rc0\n"
+"Project-Id-Version: git v2.2.0\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-04-19 12:50+0800\n"
-"PO-Revision-Date: 2014-04-20 15:20+0700\n"
+"POT-Creation-Date: 2014-11-01 07:46+0800\n"
+"PO-Revision-Date: 2014-11-01 09:05+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"
@@ -27,111 +27,108 @@
 msgid "hint: %.*s\n"
 msgstr "gợi ý: %.*s\n"
 
-#: advice.c:85
+#: advice.c:88
 msgid ""
-"Fix them up in the work tree,\n"
-"and then use 'git add/rm <file>' as\n"
-"appropriate to mark resolution and make a commit,\n"
-"or use 'git commit -a'."
+"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 ""
 "Sửa chúng trong cây làm việc,\n"
-"và sau đó dùng lệnh \"git add/rm <tập-tin>\" dành riêng\n"
-"cho việc đánh dấu tập tin cần giải quyết và tạo lần chuyển giao,\n"
-"hoặc là dùng lệnh \"git commit -a\"."
+"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."
 
-#: archive.c:10
+#: archive.c:11
 msgid "git archive [options] <tree-ish> [<path>...]"
 msgstr "git archive [các-tùy-chọn] <tree-ish> [<đường-dẫn>...]"
 
-#: archive.c:11
+#: archive.c:12
 msgid "git archive --list"
 msgstr "git archive --list"
 
-#: archive.c:12
+#: archive.c:13
 msgid ""
 "git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]"
 msgstr ""
 "git archive --remote <kho> [--exec <lệnh>] [các-tùy-chọn] <tree-ish> [<đường-"
 "dẫn>...]"
 
-#: archive.c:13
+#: archive.c:14
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <kho> [--exec <lệnh>] --list"
 
-#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
+#: archive.c:334 builtin/add.c:137 builtin/add.c:427 builtin/rm.c:328
 #, 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:328
+#: archive.c:419
 msgid "fmt"
 msgstr "định_dạng"
 
-#: archive.c:328
+#: archive.c:419
 msgid "archive format"
 msgstr "định dạng lưu trữ"
 
-#: archive.c:329 builtin/log.c:1193
+#: archive.c:420 builtin/log.c:1204
 msgid "prefix"
 msgstr "tiền_tố"
 
-#: archive.c:330
+#: archive.c:421
 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:331 builtin/archive.c:88 builtin/blame.c:2258
-#: builtin/blame.c:2259 builtin/config.c:57 builtin/fast-export.c:680
-#: builtin/fast-export.c:682 builtin/grep.c:714 builtin/hash-object.c:77
-#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:412
-#: builtin/notes.c:569 builtin/read-tree.c:108 parse-options.h:151
+#: archive.c:422 builtin/archive.c:88 builtin/blame.c:2517
+#: builtin/blame.c:2518 builtin/config.c:57 builtin/fast-export.c:986
+#: builtin/fast-export.c:988 builtin/grep.c:712 builtin/hash-object.c:101
+#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:411
+#: builtin/notes.c:568 builtin/read-tree.c:109 parse-options.h:151
 msgid "file"
-msgstr "tập-tin"
+msgstr "tập_tin"
 
-#: archive.c:332 builtin/archive.c:89
+#: archive.c:423 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:334
+#: archive.c:425
 msgid "read .gitattributes in working directory"
 msgstr "đọc .gitattributes trong thư mục làm việc"
 
-#: archive.c:335
+#: archive.c:426
 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:336
+#: archive.c:427
 msgid "store only"
 msgstr "chỉ lưu (không nén)"
 
-#: archive.c:337
+#: archive.c:428
 msgid "compress faster"
 msgstr "nén nhanh hơn"
 
-#: archive.c:345
+#: archive.c:436
 msgid "compress better"
 msgstr "nén nhỏ hơn"
 
-#: archive.c:348
+#: archive.c:439
 msgid "list supported archive formats"
 msgstr "liệt kê các kiểu nén được hỗ trợ"
 
-#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:441 builtin/archive.c:90 builtin/clone.c:85
 msgid "repo"
 msgstr "kho"
 
-#: archive.c:351 builtin/archive.c:91
+#: archive.c:442 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:352 builtin/archive.c:92 builtin/notes.c:491
+#: archive.c:443 builtin/archive.c:92 builtin/notes.c:490
 msgid "command"
 msgstr "lệnh"
 
-#: archive.c:353 builtin/archive.c:93
+#: archive.c:444 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ủ"
 
-#: attr.c:259
+#: attr.c:258
 msgid ""
 "Negative patterns are ignored in git attributes\n"
 "Use '\\!' for literal leading exclamation."
@@ -190,33 +187,33 @@
 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:178
+#: branch.c:162
 #, 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:183
+#: branch.c:167
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "Đã có nhánh mang tên “%s”."
 
-#: branch.c:191
+#: branch.c:175
 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:211
+#: branch.c:195
 #, 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:213
+#: branch.c:197
 #, 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:215
+#: branch.c:199
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -236,131 +233,182 @@
 "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:260
+#: branch.c:243
 #, 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:280
+#: branch.c:263
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "Tên đối tượng chưa rõ ràng: “%s”."
 
-#: branch.c:285
+#: branch.c:268
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "Nhánh không hợp lệ: “%s”."
 
-#: branch.c:291
-msgid "Failed to lock ref for update"
-msgstr "Gặp lỗi khi khóa tham chiếu (ref) để cập nhật"
-
-#: branch.c:309
-msgid "Failed to write ref"
-msgstr "Gặp lỗi khi ghi tham chiếu (ref)"
-
-#: bundle.c:33
+#: bundle.c:34
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
 msgstr "“%s” không giống như tập tin v2 bundle (định dạng dump của git)"
 
-#: bundle.c:60
+#: bundle.c:61
 #, c-format
 msgid "unrecognized header: %s%s (%d)"
 msgstr "phần đầu không được thừa nhận: %s%s (%d)"
 
-#: bundle.c:86 builtin/commit.c:706
+#: bundle.c:87 builtin/commit.c:788
 #, c-format
 msgid "could not open '%s'"
 msgstr "không thể mở “%s”"
 
-#: bundle.c:138
+#: bundle.c:139
 msgid "Repository lacks these prerequisite commits:"
 msgstr "Kho chứa thiếu những lần chuyển giao tiên quyết này:"
 
-#: bundle.c:162 sequencer.c:669 sequencer.c:1123 builtin/log.c:332
-#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357
+#: bundle.c:163 sequencer.c:641 sequencer.c:1096 builtin/blame.c:2706
+#: builtin/branch.c:652 builtin/commit.c:1085 builtin/log.c:330
+#: builtin/log.c:823 builtin/log.c:1432 builtin/log.c:1669 builtin/merge.c:357
 #: 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"
 
-#: bundle.c:184
+#: bundle.c:185
 #, c-format
 msgid "The bundle contains this ref:"
 msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "Bundle chứa tham chiếu (ref) này:"
-msgstr[1] "Bundle chứa %d tham chiếu (ref):"
+msgstr[0] "Bundle chứa tham chiếu này:"
+msgstr[1] "Bundle chứa %d tham chiếu:"
 
-#: bundle.c:191
+#: bundle.c:192
 msgid "The bundle records a complete history."
 msgstr "Lệnh bundle ghi lại toàn bộ lịch sử."
 
-#: bundle.c:193
+#: bundle.c:194
 #, c-format
 msgid "The bundle requires this ref:"
 msgid_plural "The bundle requires these %d refs:"
 msgstr[0] "Lệnh bundle yêu cầu tham chiếu này:"
-msgstr[1] "Lệnh bundle yêu cầu %d tham chiếu (refs) này:"
+msgstr[1] "Lệnh bundle yêu cầu %d tham chiếu này:"
 
-#: bundle.c:293
+#: bundle.c:292
 msgid "rev-list died"
 msgstr "rev-list đã chết"
 
-#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:298 builtin/log.c:153 builtin/log.c:1342 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "đối số không được thừa nhận: %s"
 
-#: bundle.c:334
+#: bundle.c:333
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "th.chiếu “%s” bị loại trừ bởi các tùy chọn rev-list"
 
-#: bundle.c:379
+#: bundle.c:378
 msgid "Refusing to create empty bundle."
 msgstr "Từ chối tạo một bundle trống rỗng."
 
-#: bundle.c:395
+#: bundle.c:393
 msgid "Could not spawn pack-objects"
 msgstr "Không thể sản sinh đối tượng gói"
 
-#: bundle.c:413
+#: bundle.c:411
 msgid "pack-objects died"
-msgstr "pack-objects đã chết"
+msgstr "đối tượng gói đã chết"
 
-#: bundle.c:416
+#: bundle.c:414
 #, c-format
 msgid "cannot create '%s'"
 msgstr "không thể tạo “%s”"
 
-#: bundle.c:438
+#: bundle.c:435
 msgid "index-pack died"
-msgstr "index-pack đã chết"
+msgstr "mục lục gói đã chết"
 
-#: commit.c:54
+#: color.c:157
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr "giá trị màu không hợp lệ: %.*s"
+
+#: commit.c:40
 #, c-format
 msgid "could not parse %s"
 msgstr "không thể phân tích cú pháp %s"
 
-#: commit.c:56
+#: commit.c:42
 #, c-format
 msgid "%s %s is not a commit!"
-msgstr "%s %s không phải là một lần commit!"
+msgstr "%s %s không phải là một lần chuyển giao!"
 
 #: compat/obstack.c:406 compat/obstack.c:408
 msgid "memory exhausted"
 msgstr "hết bộ nhớ"
 
-#: connected.c:70
+#: config.c:469 config.c:471
+#, c-format
+msgid "bad config file line %d in %s"
+msgstr "tập tin cấu hình sai tại dòng %d trong %s"
+
+#: config.c:587
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "sai giá trị bằng số của cấu hình “%s” cho “%s” trong %s: %s"
+
+#: config.c:589
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "sai giá trị bằng số của cấu hình “%s” cho “%s”: %s"
+
+#: config.c:674
+#, c-format
+msgid "failed to expand user dir in: '%s'"
+msgstr "gặp lỗi mở rộng thư mục người dùng trong: “%s”"
+
+#: config.c:752 config.c:763
+#, c-format
+msgid "bad zlib compression level %d"
+msgstr "mức nén zlib %d là sai"
+
+#: config.c:885
+#, c-format
+msgid "invalid mode for object creation: %s"
+msgstr "chế độ không hợp lệ đối với việc tạo đối tượng: %s"
+
+#: config.c:1201
+msgid "unable to parse command-line config"
+msgstr "không thể phân tích cấu hình dòng lệnh"
+
+#: config.c:1262
+msgid "unknown error occured while reading the configuration files"
+msgstr "đã có lỗi chưa biết xảy ra trong khi đọc các tập tin cấu hình"
+
+#: config.c:1586
+#, c-format
+msgid "unable to parse '%s' from command-line config"
+msgstr "không thể phân tích “%s” từ cấu hình dòng lệnh"
+
+#: config.c:1588
+#, c-format
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "sai biến cấu hình “%s” trong tập tin “%s” tại dòng %d"
+
+#: config.c:1647
+#, c-format
+msgid "%s has multiple values"
+msgstr "%s có đa giá trị"
+
+#: connected.c:69
 msgid "Could not run 'git rev-list'"
 msgstr "Không thể chạy “git rev-list”"
 
-#: connected.c:90
+#: connected.c:89
 #, c-format
 msgid "failed write to rev-list: %s"
 msgstr "gặp lỗi khi ghi vào rev-list: %s"
 
-#: connected.c:98
+#: connected.c:97
 #, c-format
 msgid "failed to close rev-list's stdin: %s"
 msgstr "gặp lỗi khi đóng đầu vào chuẩn stdin của rev-list: %s"
@@ -438,26 +486,26 @@
 msgid "failed to read orderfile '%s'"
 msgstr "gặp lỗi khi đọc tập-tin-thứ-tự “%s”"
 
-#: diffcore-rename.c:517
+#: diffcore-rename.c:516
 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:113
+#: diff.c:114
 #, 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:118
+#: diff.c:119
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Không hiểu đối số dirstat “%s”\n"
 
-#: diff.c:213
+#: diff.c:214
 #, 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:263
+#: diff.c:266
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -466,7 +514,16 @@
 "Tìm thấy các lỗi trong biến cấu hình “diff.dirstat”:\n"
 "%s"
 
-#: diff.c:3495
+#: diff.c:2957
+#, 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:3352
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow cần chính xác một đặc tả đường dẫn"
+
+#: diff.c:3515
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -475,58 +532,58 @@
 "Gặp lỗi khi phân tích đối số tùy chọn --dirstat/-X:\n"
 "%s"
 
-#: diff.c:3509
+#: diff.c:3529
 #, 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”"
 
-#: gpg-interface.c:59 gpg-interface.c:131
+#: gpg-interface.c:129 gpg-interface.c:200
 msgid "could not run gpg."
 msgstr "không thể chạy gpg."
 
-#: gpg-interface.c:71
+#: gpg-interface.c:141
 msgid "gpg did not accept the data"
 msgstr "gpg đã không chấp nhận dữ liệu"
 
-#: gpg-interface.c:82
+#: gpg-interface.c:152
 msgid "gpg failed to sign the data"
 msgstr "gpg gặp lỗi khi ký dữ liệu"
 
-#: gpg-interface.c:115
+#: gpg-interface.c:185
 #, c-format
 msgid "could not create temporary file '%s': %s"
 msgstr "không thể tạo tập tin tạm thời “%s”: %s"
 
-#: gpg-interface.c:118
+#: gpg-interface.c:188
 #, c-format
 msgid "failed writing detached signature to '%s': %s"
 msgstr "gặp lỗi khi ghi chữ ký đính kèm vào “%s”: %s"
 
-#: grep.c:1698
+#: grep.c:1718
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "“%s”: không thể đọc %s"
 
-#: grep.c:1715
+#: grep.c:1735
 #, c-format
 msgid "'%s': %s"
 msgstr "“%s”: %s"
 
-#: grep.c:1726
+#: grep.c:1746
 #, c-format
 msgid "'%s': short read %s"
 msgstr "“%s”: đọc ngắn %s"
 
-#: help.c:209
+#: help.c:207
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "các lệnh git sẵn có trong thư mục “%s”:"
 
-#: help.c:216
+#: help.c:214
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "các lệnh git sẵn có từ một nơi khác trong $PATH của bạn"
 
-#: help.c:232
+#: help.c:230
 msgid "The most commonly used git commands are:"
 msgstr "Những lệnh git hay được dùng nhất là:"
 
@@ -562,7 +619,7 @@
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git: “%s” không phải là một lệnh của git. Xem “git --help”."
 
-#: help.c:384 help.c:443
+#: help.c:384 help.c:444
 msgid ""
 "\n"
 "Did you mean this?"
@@ -576,92 +633,100 @@
 "\n"
 "Có phải ý bạn là một trong số những cái này không?"
 
-#: help.c:439
+#: help.c:440
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %s - %s"
 
-#: merge.c:56
+#: lockfile.c:275
+msgid "BUG: reopen a lockfile that is still open"
+msgstr "LỖI: mở lại tập tin khóa mà nó lại đang được mở"
+
+#: lockfile.c:277
+msgid "BUG: reopen a lockfile that has been committed"
+msgstr "LỖI: mở lại tập tin khóa mà nó đã được chuyển giao"
+
+#: merge.c:41
 msgid "failed to read the cache"
 msgstr "gặp lỗi khi đọc bộ nhớ đệm"
 
-#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
-#: builtin/clone.c:661
+#: merge.c:94 builtin/checkout.c:356 builtin/checkout.c:562
+#: builtin/clone.c:659
 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"
 
-#: merge-recursive.c:190
+#: merge-recursive.c:189
 #, c-format
 msgid "(bad commit)\n"
 msgstr "(commit sai)\n"
 
-#: merge-recursive.c:208
+#: merge-recursive.c:209
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "addinfo_cache gặp lỗi đối với đường dẫn “%s”"
 
-#: merge-recursive.c:271
+#: merge-recursive.c:270
 msgid "error building trees"
 msgstr "gặp lỗi khi xây dựng cây"
 
-#: merge-recursive.c:675
+#: merge-recursive.c:691
 #, 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:686
+#: merge-recursive.c:702
 #, 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:700 merge-recursive.c:721
+#: merge-recursive.c:716 merge-recursive.c:737
 msgid ": perhaps a D/F conflict?"
 msgstr ": có lẽ là một xung đột D/F?"
 
-#: merge-recursive.c:711
+#: merge-recursive.c:727
 #, 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:751
+#: merge-recursive.c:767
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "không thể đọc đối tượng %s “%s”"
 
-#: merge-recursive.c:753
+#: merge-recursive.c:769
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "đối tượng blob được mong đợi cho %s “%s”"
 
-#: merge-recursive.c:776 builtin/clone.c:317
+#: merge-recursive.c:792 builtin/clone.c:318
 #, c-format
 msgid "failed to open '%s'"
 msgstr "gặp lỗi khi mở “%s”"
 
-#: merge-recursive.c:784
+#: merge-recursive.c:800
 #, 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:787
+#: merge-recursive.c:803
 #, 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:925
+#: merge-recursive.c:941
 msgid "Failed to execute internal merge"
 msgstr "Gặp lỗi khi thực hiện trộn nội bộ"
 
-#: merge-recursive.c:929
+#: merge-recursive.c:945
 #, 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:945
+#: merge-recursive.c:961
 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:1024 merge-recursive.c:1038
+#: merge-recursive.c:1036 merge-recursive.c:1050
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -670,7 +735,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:1030 merge-recursive.c:1043
+#: merge-recursive.c:1042 merge-recursive.c:1055
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -679,20 +744,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:1084
+#: merge-recursive.c:1096
 msgid "rename"
 msgstr "đổi tên"
 
-#: merge-recursive.c:1084
+#: merge-recursive.c:1096
 msgid "renamed"
 msgstr "đã đổi tên"
 
-#: merge-recursive.c:1140
+#: merge-recursive.c:1152
 #, 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:1162
+#: merge-recursive.c:1174
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -701,199 +766,199 @@
 "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:1167
+#: merge-recursive.c:1179
 msgid " (left unresolved)"
 msgstr " (cần giải quyết)"
 
-#: merge-recursive.c:1221
+#: merge-recursive.c:1233
 #, 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:1251
+#: merge-recursive.c:1263
 #, 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:1450
+#: merge-recursive.c:1462
 #, 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:1460
+#: merge-recursive.c:1472
 #, c-format
 msgid "Adding merged %s"
 msgstr "Thêm hòa trộn %s"
 
-#: merge-recursive.c:1465 merge-recursive.c:1663
+#: merge-recursive.c:1477 merge-recursive.c:1675
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Thay vào đó thêm vào %s"
 
-#: merge-recursive.c:1516
+#: merge-recursive.c:1528
 #, c-format
 msgid "cannot read object %s"
 msgstr "không thể đọc đối tượng %s"
 
-#: merge-recursive.c:1519
+#: merge-recursive.c:1531
 #, 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:1567
+#: merge-recursive.c:1579
 msgid "modify"
 msgstr "sửa đổi"
 
-#: merge-recursive.c:1567
+#: merge-recursive.c:1579
 msgid "modified"
 msgstr "đã sửa"
 
-#: merge-recursive.c:1577
+#: merge-recursive.c:1589
 msgid "content"
 msgstr "nội dung"
 
-#: merge-recursive.c:1584
+#: merge-recursive.c:1596
 msgid "add/add"
 msgstr "thêm/thêm"
 
-#: merge-recursive.c:1618
+#: merge-recursive.c:1630
 #, 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:1632
+#: merge-recursive.c:1644
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Tự-động-hòa-trộn %s"
 
-#: merge-recursive.c:1636 git-submodule.sh:1149
+#: merge-recursive.c:1648 git-submodule.sh:1150
 msgid "submodule"
 msgstr "mô-đun-con"
 
-#: merge-recursive.c:1637
+#: merge-recursive.c:1649
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "XUNG ĐỘT (%s): Xung đột hòa trộn trong %s"
 
-#: merge-recursive.c:1727
+#: merge-recursive.c:1735
 #, c-format
 msgid "Removing %s"
 msgstr "Đang xóa %s"
 
-#: merge-recursive.c:1752
+#: merge-recursive.c:1760
 msgid "file/directory"
 msgstr "tập-tin/thư-mục"
 
-#: merge-recursive.c:1758
+#: merge-recursive.c:1766
 msgid "directory/file"
 msgstr "thư-mục/tập tin"
 
-#: merge-recursive.c:1763
+#: merge-recursive.c:1771
 #, 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:1773
+#: merge-recursive.c:1781
 #, c-format
 msgid "Adding %s"
 msgstr "Thêm \"%s\""
 
-#: merge-recursive.c:1790
+#: merge-recursive.c:1798
 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:1809
+#: merge-recursive.c:1817
 msgid "Already up-to-date!"
 msgstr "Đã cập nhật rồi!"
 
-#: merge-recursive.c:1818
+#: merge-recursive.c:1826
 #, 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"
 
-#: merge-recursive.c:1848
+#: merge-recursive.c:1856
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "Đường dẫn chưa được xử lý??? %s"
 
-#: merge-recursive.c:1893
+#: merge-recursive.c:1901
 msgid "Merging:"
 msgstr "Đang trộn:"
 
-#: merge-recursive.c:1906
+#: merge-recursive.c:1914
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "tìm thấy %u tổ tiên chung:"
 msgstr[1] "tìm thấy %u tổ tiên chung:"
 
-#: merge-recursive.c:1943
+#: merge-recursive.c:1951
 msgid "merge returned no commit"
 msgstr "hòa trộn không trả về lần chuyển giao nào"
 
-#: merge-recursive.c:2000
+#: merge-recursive.c:2008
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Không thể phân tích đối tượng “%s”"
 
-#: merge-recursive.c:2012 builtin/merge.c:668
+#: merge-recursive.c:2019 builtin/merge.c:666
 msgid "Unable to write index."
 msgstr "Không thể ghi bảng mục lục"
 
-#: notes-utils.c:40
+#: notes-utils.c:41
 msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr ""
 "Không thể chuyển giao cây ghi chú chưa được khởi tạo hoặc không được tham "
 "chiếu"
 
-#: notes-utils.c:81
+#: notes-utils.c:83
 #, c-format
 msgid "Bad notes.rewriteMode value: '%s'"
 msgstr "Giá trị notes.rewriteMode sai: “%s”"
 
-#: notes-utils.c:91
+#: notes-utils.c:93
 #, c-format
 msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
 msgstr "Từ chối ghi đè ghi chú trong %s (nằm ngoài refs/notes/)"
 
 #. TRANSLATORS: The first %s is the name of the
 #. environment variable, the second %s is its value
-#: notes-utils.c:118
+#: notes-utils.c:120
 #, c-format
 msgid "Bad %s value: '%s'"
 msgstr "Giá trị %s sai: “%s”"
 
-#: object.c:229
+#: object.c:241
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "không thể phân tích đối tượng: “%s”"
 
-#: parse-options.c:532
+#: parse-options.c:546
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:550
+#: parse-options.c:564
 #, 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:554
+#: parse-options.c:568
 #, c-format
 msgid "   or: %s"
 msgstr "     hoặc: %s"
 
-#: parse-options.c:557
+#: parse-options.c:571
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:591
+#: parse-options.c:605
 msgid "-NUM"
 msgstr "-SỐ"
 
@@ -949,12 +1014,12 @@
 msgid "%s: pathspec magic not supported by this command: %s"
 msgstr "%s: số mầu nhiệm đặc tả đường dẫn chưa được hỗ trợ bởi lệnh này: %s"
 
-#: pathspec.c:433
+#: pathspec.c:432
 #, c-format
 msgid "pathspec '%s' is beyond a symbolic link"
 msgstr "đặc tả đường dẫn “%s” vượt ra ngoài liên kết mềm"
 
-#: pathspec.c:442
+#: pathspec.c:441
 msgid ""
 "There is nothing to exclude from by :(exclude) patterns.\n"
 "Perhaps you forgot to add either ':/' or '.' ?"
@@ -962,11 +1027,15 @@
 "Ở đây không có gì bị loại trừ bởi: các mẫu (loại trừ).\n"
 "Có lẽ bạn đã quên thêm hoặc là “:/” hoặc là “.”?"
 
-#: progress.c:224
+#: pretty.c:968
+msgid "unable to parse --pretty format"
+msgstr "không thể phân tích định dạng --pretty"
+
+#: progress.c:225
 msgid "done"
 msgstr "xong"
 
-#: read-cache.c:1238
+#: read-cache.c:1261
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -975,7 +1044,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:1248
+#: read-cache.c:1271
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -984,52 +1053,52 @@
 "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"
 
-#: remote.c:758
+#: remote.c:782
 #, 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:762
+#: remote.c:786
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s thường theo dõi %s, không phải %s"
 
-#: remote.c:766
+#: remote.c:790
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s theo dõi cả %s và %s"
 
-#: remote.c:774
+#: remote.c:798
 msgid "Internal error"
 msgstr "Lỗi nội bộ"
 
-#: remote.c:1948
+#: remote.c:1968
 #, 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:1952
+#: remote.c:1972
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "   (dùng \" git branch --unset-upstream\" để sửa)\n"
 
-#: remote.c:1955
+#: remote.c:1975
 #, 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:1959
+#: remote.c:1979
 #, 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 là đầu của “%s” bởi %d lần chuyển giao.\n"
-msgstr[1] "Nhánh của bạn là đầu của “%s” bởi %d lần chuyển giao.\n"
+msgstr[0] "Nhánh của bạn đứng trước “%s” %d lần chuyển giao.\n"
+msgstr[1] "Nhánh của bạn đứng trước “%s” %d lần chuyển giao.\n"
 
-#: remote.c:1965
+#: remote.c:1985
 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:1968
+#: remote.c:1988
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1041,11 +1110,11 @@
 "Nhánh của bạn ở đằng sau “%s” %d lần chuyển giao, và có thể được fast-"
 "forward.\n"
 
-#: remote.c:1976
+#: remote.c:1996
 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:1979
+#: remote.c:1999
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1058,37 +1127,46 @@
 "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"
 msgstr[1] ""
-"Your branch and “%s” have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
+"Nhánh của bạn và “%s” bị phân kỳ,\n"
+"và có %d và %d lần chuyển giao khác nhau cho từng cái,\n"
+"tương ứng với mỗi lần.\n"
 
-#: remote.c:1989
+#: remote.c:2009
 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"
 
-#: run-command.c:80
+#: run-command.c:87
 msgid "open /dev/null failed"
 msgstr "gặp lỗi khi mở “/dev/null”"
 
-#: run-command.c:82
+#: run-command.c:89
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "dup2(%d,%d) gặp lỗi"
 
-#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
-#: builtin/merge.c:1009 builtin/merge.c:1019
+#: send-pack.c:265
+msgid "failed to sign the push certificate"
+msgstr "gặp lỗi khi ký chứng thực đẩy"
+
+#: send-pack.c:322
+msgid "the receiving end does not support --signed push"
+msgstr "kết thúc nhận không hỗ trợ đẩy --signed"
+
+#: sequencer.c:172 builtin/merge.c:781 builtin/merge.c:892
+#: builtin/merge.c:1002 builtin/merge.c:1012
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "Không thể mở “%s” để ghi"
 
-#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
-#: builtin/merge.c:1011 builtin/merge.c:1024
+#: sequencer.c:174 builtin/merge.c:343 builtin/merge.c:784
+#: builtin/merge.c:1004 builtin/merge.c:1017
 #, c-format
 msgid "Could not write to '%s'"
 msgstr "Không thể ghi vào “%s”"
 
-#: sequencer.c:229
+#: sequencer.c:195
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'"
@@ -1096,7 +1174,7 @@
 "sau khi giải quyết các xung đột, đánh dấu đường dẫn đã sửa\n"
 "với lệnh “git add <đường_dẫn>” hoặc “git rm <đường_dẫn>”"
 
-#: sequencer.c:232
+#: sequencer.c:198
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'\n"
@@ -1106,67 +1184,67 @@
 "với lệnh “git add <đường_dẫn>” hoặc “git rm <đường_dẫn>”\n"
 "và chuyển giao kết quả bằng lệnh “git commit”"
 
-#: sequencer.c:245 sequencer.c:879 sequencer.c:962
+#: sequencer.c:211 sequencer.c:852 sequencer.c:935
 #, c-format
 msgid "Could not write to %s"
 msgstr "Không thể ghi vào %s"
 
-#: sequencer.c:248
+#: sequencer.c:214
 #, c-format
 msgid "Error wrapping up %s"
 msgstr "Lỗi bao bọc %s"
 
-#: sequencer.c:263
+#: sequencer.c:229
 msgid "Your local changes would be overwritten by cherry-pick."
 msgstr "Các thay đổi nội bộ của bạn có thể bị ghi đè bởi lệnh cherry-pick."
 
-#: sequencer.c:265
+#: sequencer.c:231
 msgid "Your local changes would be overwritten by revert."
 msgstr "Các thay đổi nội bộ của bạn có thể bị ghi đè bởi lệnh revert."
 
-#: sequencer.c:268
+#: sequencer.c:234
 msgid "Commit your changes or stash them to proceed."
 msgstr "Chuyển giao các thay đổi của bạn hay tạm cất (stash) chúng để xử lý."
 
 #. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:325
+#: sequencer.c:304
 #, c-format
 msgid "%s: Unable to write new index file"
 msgstr "%s: Không thể ghi tập tin lưu bảng mục lục mới"
 
-#: sequencer.c:356
+#: sequencer.c:335
 msgid "Could not resolve HEAD commit\n"
 msgstr "Không thể phân giải commit (lần chuyển giao) HEAD\n"
 
-#: sequencer.c:378
+#: sequencer.c:355
 msgid "Unable to update cache tree\n"
 msgstr "Không thể cập nhật cây bộ nhớ đệm\n"
 
-#: sequencer.c:430
+#: sequencer.c:402
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr "Không thể phân tích commit (lần chuyển giao) %s\n"
 
-#: sequencer.c:435
+#: sequencer.c:407
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr "Không thể phân tích lần chuyển giao cha mẹ “%s”\n"
 
-#: sequencer.c:501
+#: sequencer.c:473
 msgid "Your index file is unmerged."
 msgstr "Tập tin lưu mục lục của bạn không được hòa trộn."
 
-#: sequencer.c:520
+#: sequencer.c:492
 #, c-format
 msgid "Commit %s is a merge but no -m option was given."
 msgstr "Lần chuyển giao %s là một lần hòa trộn nhưng không đưa ra tùy chọn -m."
 
-#: sequencer.c:528
+#: sequencer.c:500
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr "Lần chuyển giao %s không có cha mẹ %d"
 
-#: sequencer.c:532
+#: sequencer.c:504
 #, c-format
 msgid "Mainline was specified but commit %s is not a merge."
 msgstr ""
@@ -1175,157 +1253,157 @@
 
 #. TRANSLATORS: The first %s will be "revert" or
 #. "cherry-pick", the second %s a SHA1
-#: sequencer.c:545
+#: sequencer.c:517
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s: không thể phân tích lần chuyển giao mẹ của %s"
 
-#: sequencer.c:549
+#: sequencer.c:521
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr "Không thể lấy ghi chú lần chuyển giao cho %s"
 
-#: sequencer.c:635
+#: sequencer.c:607
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "không thể revert %s... %s"
 
-#: sequencer.c:636
+#: sequencer.c:608
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "không thể apply (áp dụng miếng vá) %s... %s"
 
-#: sequencer.c:672
+#: sequencer.c:644
 msgid "empty commit set passed"
 msgstr "lần chuyển giao trống rỗng đặt là hợp quy cách"
 
-#: sequencer.c:680
+#: sequencer.c:652
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s: gặp lỗi đọc bảng mục lục"
 
-#: sequencer.c:685
+#: sequencer.c:656
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s: gặp lỗi khi làm tươi mới bảng mục lục"
 
-#: sequencer.c:743
+#: sequencer.c:716
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr "Không thể %s trong khi %s"
 
-#: sequencer.c:765
+#: sequencer.c:738
 #, c-format
 msgid "Could not parse line %d."
 msgstr "Không phân tích được dòng %d."
 
-#: sequencer.c:770
+#: sequencer.c:743
 msgid "No commits parsed."
 msgstr "Không có lần chuyển giao nào được phân tích."
 
-#: sequencer.c:783
+#: sequencer.c:756
 #, c-format
 msgid "Could not open %s"
 msgstr "Không thể mở %s"
 
-#: sequencer.c:787
+#: sequencer.c:760
 #, c-format
 msgid "Could not read %s."
 msgstr "Không thể đọc %s."
 
-#: sequencer.c:794
+#: sequencer.c:767
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr "Bảng chỉ thị không thể dùng được: %s"
 
-#: sequencer.c:824
+#: sequencer.c:797
 #, c-format
 msgid "Invalid key: %s"
 msgstr "Khóa không đúng: %s"
 
-#: sequencer.c:827
+#: sequencer.c:800
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr "Giá trị không hợp lệ %s: %s"
 
-#: sequencer.c:839
+#: sequencer.c:812
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr "Bảng tùy chọn dị hình: %s"
 
-#: sequencer.c:860
+#: sequencer.c:833
 msgid "a cherry-pick or revert is already in progress"
 msgstr "có một thao tác “cherry-pick” hoặc “revert” đang được thực hiện"
 
-#: sequencer.c:861
+#: sequencer.c:834
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr "hãy thử \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: sequencer.c:865
+#: sequencer.c:838
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr "Không thể tạo thư mục xếp dãy %s"
 
-#: sequencer.c:881 sequencer.c:966
+#: sequencer.c:854 sequencer.c:939
 #, c-format
 msgid "Error wrapping up %s."
 msgstr "Lỗi bao bọc %s."
 
-#: sequencer.c:900 sequencer.c:1036
+#: sequencer.c:873 sequencer.c:1009
 msgid "no cherry-pick or revert in progress"
 msgstr "không cherry-pick hay revert trong tiến trình"
 
-#: sequencer.c:902
+#: sequencer.c:875
 msgid "cannot resolve HEAD"
 msgstr "không thể phân giải HEAD"
 
-#: sequencer.c:904
+#: sequencer.c:877
 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:926 builtin/apply.c:4061
+#: sequencer.c:899 builtin/apply.c:4128
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "không thể mở %s: %s"
 
-#: sequencer.c:929
+#: sequencer.c:902
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "không thể đọc %s: %s"
 
-#: sequencer.c:930
+#: sequencer.c:903
 msgid "unexpected end of file"
 msgstr "gặp kết thúc tập tin đột xuất"
 
-#: sequencer.c:936
+#: sequencer.c:909
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr "tập tin HEAD “pre-cherry-pick” đã lưu “%s” bị hỏng"
 
-#: sequencer.c:959
+#: sequencer.c:932
 #, c-format
 msgid "Could not format %s."
 msgstr "Không thể định dạng “%s”."
 
-#: sequencer.c:1104
+#: sequencer.c:1077
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr "%s: không thể cherry-pick một %s"
 
-#: sequencer.c:1107
+#: sequencer.c:1080
 #, c-format
 msgid "%s: bad revision"
 msgstr "%s: điểm xét duyệt sai"
 
-#: sequencer.c:1141
+#: sequencer.c:1114
 msgid "Can't revert as initial commit"
 msgstr "Không thể revert một lần chuyển giao khởi tạo"
 
-#: sequencer.c:1142
+#: sequencer.c:1115
 msgid "Can't cherry-pick into empty head"
 msgstr "Không thể cherry-pick vào một đầu (head) trống rỗng"
 
-#: sha1_name.c:439
+#: sha1_name.c:440
 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"
@@ -1349,21 +1427,21 @@
 "này\n"
 "bằng cách chạy lệnh \"git config advice.objectNameWarning false\""
 
-#: sha1_name.c:1072
+#: sha1_name.c:1068
 msgid "HEAD does not point to a branch"
 msgstr "HEAD không chỉ đến một nhánh nào cả"
 
-#: sha1_name.c:1075
+#: sha1_name.c:1071
 #, c-format
 msgid "No such branch: '%s'"
 msgstr "Không có nhánh nào như thế: “%s”"
 
-#: sha1_name.c:1077
+#: sha1_name.c:1073
 #, 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”"
 
-#: sha1_name.c:1081
+#: sha1_name.c:1077
 #, c-format
 msgid "Upstream branch '%s' not stored as a remote-tracking branch"
 msgstr ""
@@ -1394,17 +1472,42 @@
 msgid "staging updated .gitmodules failed"
 msgstr "gặp lỗi khi tổ chức .gitmodules đã cập nhật"
 
-#: submodule.c:1121 builtin/init-db.c:363
+#: submodule.c:1111 builtin/init-db.c:363
 #, c-format
 msgid "Could not create git link %s"
 msgstr "Không thể tạo liên kết git “%s”"
 
-#: submodule.c:1132
+#: submodule.c:1122
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "Không thể đặt “core.worktree” trong “%s”."
 
-#: unpack-trees.c:206
+#: trailer.c:500 trailer.c:504 trailer.c:508 trailer.c:562 trailer.c:566
+#: trailer.c:570
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "không hiểu giá trị “%s” cho khóa “%s”"
+
+#: trailer.c:552 trailer.c:557 builtin/remote.c:288
+#, c-format
+msgid "more than one %s"
+msgstr "nhiều hơn một %s"
+
+#: trailer.c:587
+#, c-format
+msgid "empty trailer token in trailer '%s'"
+msgstr "thẻ thừa trống rỗng trong phần thừa “%s”"
+
+#: trailer.c:706
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "không đọc được tập tin đầu vào “%s”"
+
+#: trailer.c:709
+msgid "could not read from stdin"
+msgstr "không thể đọc từ đầu vào tiêu chuẩn"
+
+#: unpack-trees.c:202
 msgid "Checking out files"
 msgstr "Đang lấy ra các tập tin"
 
@@ -1437,25 +1540,29 @@
 msgid "invalid '..' path segment"
 msgstr "đoạn đường dẫn “..” không hợp lệ"
 
-#: wrapper.c:422
+#: wrapper.c:509
 #, c-format
 msgid "unable to access '%s': %s"
 msgstr "không thể truy cập “%s”: %s"
 
-#: wrapper.c:443
+#: wrapper.c:530
 #, c-format
 msgid "unable to access '%s'"
 msgstr "không thể truy cập “%s”"
 
-#: wrapper.c:454
+#: wrapper.c:541
 #, c-format
 msgid "unable to look up current user in the passwd file: %s"
 msgstr "không tìm thấy người dùng hiện tại trong tập tin passwd: %s"
 
-#: wrapper.c:455
+#: wrapper.c:542
 msgid "no such user"
 msgstr "không có người dùng như vậy"
 
+#: wrapper.c:550
+msgid "unable to get current working directory"
+msgstr "Không thể lấy thư mục làm việc hiện hành"
+
 #: wt-status.c:150
 msgid "Unmerged paths:"
 msgstr "Những đường dẫn chưa được hòa trộn:"
@@ -1601,15 +1708,15 @@
 msgid "bug: unhandled diff status %c"
 msgstr "lỗi: không thể tiếp nhận trạng thái lệnh diff %c"
 
-#: wt-status.c:765
+#: wt-status.c:761
 msgid "Submodules changed but not updated:"
 msgstr "Những mô-đun-con đã bị thay đổi nhưng chưa được cập nhật:"
 
-#: wt-status.c:767
+#: wt-status.c:763
 msgid "Submodule changes to be committed:"
 msgstr "Những mô-đun-con thay đổi đã được chuyển giao:"
 
-#: wt-status.c:846
+#: wt-status.c:842
 msgid ""
 "Do not touch the line above.\n"
 "Everything below will be removed."
@@ -1617,72 +1724,72 @@
 "Không động đến đường ở trên.\n"
 "Mọi thứ phía dưới sẽ được xóa bỏ."
 
-#: wt-status.c:937
+#: wt-status.c:933
 msgid "You have unmerged paths."
 msgstr "Bạn có những đường dẫn chưa được hòa trộn."
 
-#: wt-status.c:940
+#: wt-status.c:936
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr "  (sửa các xung đột rồi chạy \"git commit\")"
 
-#: wt-status.c:943
+#: wt-status.c:939
 msgid "All conflicts fixed but you are still merging."
 msgstr "Tất cả các xung đột đã được giải quyết nhưng bạn vẫn đang hòa trộn."
 
-#: wt-status.c:946
+#: wt-status.c:942
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr "  (dùng \"git commit\" để hoàn tất việc hòa trộn)"
 
-#: wt-status.c:956
+#: wt-status.c:952
 msgid "You are in the middle of an am session."
 msgstr "Bạn đang ở giữa của một phiên “am”."
 
-#: wt-status.c:959
+#: wt-status.c:955
 msgid "The current patch is empty."
 msgstr "Miếng vá hiện tại bị trống rỗng."
 
-#: wt-status.c:963
+#: wt-status.c:959
 msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr "  (sửa các xung đột và sau đó chạy lệnh \"git am --continue\")"
 
-#: wt-status.c:965
+#: wt-status.c:961
 msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr "  (dùng \"git am --skip\" để bỏ qua miếng vá này)"
 
-#: wt-status.c:967
+#: wt-status.c:963
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr "  (dùng \"git am --abort\" để phục hồi lại nhánh nguyên thủy)"
 
-#: wt-status.c:1027 wt-status.c:1044
+#: wt-status.c:1023 wt-status.c:1040
 #, c-format
 msgid "You are currently rebasing branch '%s' on '%s'."
 msgstr "Bạn hiện nay đang thực hiện việc “rebase” nhánh “%s” trên “%s”."
 
-#: wt-status.c:1032 wt-status.c:1049
+#: wt-status.c:1028 wt-status.c:1045
 msgid "You are currently rebasing."
 msgstr "Bạn hiện nay đang thực hiện việc “rebase” (“cải tổ”)."
 
-#: wt-status.c:1035
+#: wt-status.c:1031
 msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr ""
 "  (sửa các xung đột và sau đó chạy lệnh “cải tổ” \"git rebase --continue\")"
 
-#: wt-status.c:1037
+#: wt-status.c:1033
 msgid "  (use \"git rebase --skip\" to skip this patch)"
 msgstr "  (dùng lệnh “cải tổ” \"git rebase --skip\" để bỏ qua lần vá này)"
 
-#: wt-status.c:1039
+#: wt-status.c:1035
 msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr ""
 "  (dùng lệnh “cải tổ” \"git rebase --abort\" để check-out nhánh nguyên thủy)"
 
-#: wt-status.c:1052
+#: wt-status.c:1048
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr ""
 "  (khi tất cả các xung đột đã sửa xong: chạy lệnh “cải tổ” \"git rebase --"
 "continue\")"
 
-#: wt-status.c:1056
+#: wt-status.c:1052
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
@@ -1690,126 +1797,126 @@
 "Bạn hiện nay đang thực hiện việc chia tách một lần chuyển giao trong khi "
 "đang “rebase” nhánh “%s” trên “%s”."
 
-#: wt-status.c:1061
+#: wt-status.c:1057
 msgid "You are currently splitting a commit during a rebase."
 msgstr ""
 "Bạn hiện tại đang cắt đôi một lần chuyển giao trong khi đang thực hiện việc "
 "rebase."
 
-#: wt-status.c:1064
+#: wt-status.c:1060
 msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr ""
 "  (Một khi thư mục làm việc của bạn đã gọn gàng, chạy lệnh “cải tổ” \"git "
 "rebase --continue\")"
 
-#: wt-status.c:1068
+#: wt-status.c:1064
 #, c-format
 msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr ""
 "Bạn hiện nay đang thực hiện việc sửa chữa một lần chuyển giao trong khi đang "
 "rebase nhánh “%s” trên “%s”."
 
-#: wt-status.c:1073
+#: wt-status.c:1069
 msgid "You are currently editing a commit during a rebase."
 msgstr "Bạn hiện đang sửa một lần chuyển giao trong khi bạn thực hiện rebase."
 
-#: wt-status.c:1076
+#: wt-status.c:1072
 msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr "  (dùng \"git commit --amend\" để “tu bổ” lần chuyển giao hiện tại)"
 
-#: wt-status.c:1078
+#: wt-status.c:1074
 msgid ""
 "  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr ""
 "  (chạy lệnh “cải tổ” \"git rebase --continue\" một khi bạn cảm thấy hài "
 "lòng về những thay đổi của mình)"
 
-#: wt-status.c:1088
+#: wt-status.c:1084
 #, c-format
 msgid "You are currently cherry-picking commit %s."
 msgstr "Bạn hiện nay đang thực hiện việc cherry-pick lần chuyển giao %s."
 
-#: wt-status.c:1093
+#: wt-status.c:1089
 msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
 msgstr ""
 "  (sửa các xung đột và sau đó chạy lệnh \"git cherry-pick --continue\")"
 
-#: wt-status.c:1096
+#: wt-status.c:1092
 msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr ""
 "  (khi tất cả các xung đột đã sửa xong: chạy lệnh \"git cherry-pick --"
 "continue\")"
 
-#: wt-status.c:1098
+#: wt-status.c:1094
 msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr "  (dùng \"git cherry-pick --abort\" để hủy bỏ thao tác cherry-pick)"
 
-#: wt-status.c:1107
+#: wt-status.c:1103
 #, c-format
 msgid "You are currently reverting commit %s."
 msgstr "Bạn hiện nay đang thực hiện thao tác revert lần chuyển giao “%s”."
 
-#: wt-status.c:1112
+#: wt-status.c:1108
 msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr "  (sửa các xung đột và sau đó chạy lệnh \"git revert --continue\")"
 
-#: wt-status.c:1115
+#: wt-status.c:1111
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr ""
 "  (khi tất cả các xung đột đã sửa xong: chạy lệnh \"git revert --continue\")"
 
-#: wt-status.c:1117
+#: wt-status.c:1113
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr "  (dùng \"git revert --abort\" để hủy bỏ thao tác revert)"
 
-#: wt-status.c:1128
+#: wt-status.c:1124
 #, c-format
 msgid "You are currently bisecting, started from branch '%s'."
 msgstr ""
 "Bạn hiện nay đang thực hiện thao tác di chuyển nửa bước (bisect), bắt đầu từ "
 "nhánh “%s”."
 
-#: wt-status.c:1132
+#: wt-status.c:1128
 msgid "You are currently bisecting."
 msgstr "Bạn hiện tại đang thực hiện việc bisect (di chuyển nửa bước)."
 
-#: wt-status.c:1135
+#: wt-status.c:1131
 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:1310
+#: wt-status.c:1306
 msgid "On branch "
 msgstr "Trên nhánh "
 
-#: wt-status.c:1317
+#: wt-status.c:1313
 msgid "rebase in progress; onto "
 msgstr "rebase đang được thực hiện: lên trên "
 
-#: wt-status.c:1324
+#: wt-status.c:1320
 msgid "HEAD detached at "
 msgstr "HEAD được tách rời tại "
 
-#: wt-status.c:1326
+#: wt-status.c:1322
 msgid "HEAD detached from "
 msgstr "HEAD được tách rời từ "
 
-#: wt-status.c:1329
+#: wt-status.c:1325
 msgid "Not currently on any branch."
 msgstr "Hiện tại chẳng ở nhánh nào cả."
 
-#: wt-status.c:1346
+#: wt-status.c:1342
 msgid "Initial commit"
 msgstr "Lần chuyển giao khởi tạo"
 
-#: wt-status.c:1360
+#: wt-status.c:1356
 msgid "Untracked files"
 msgstr "Những tập tin chưa được theo dõi"
 
-#: wt-status.c:1362
+#: wt-status.c:1358
 msgid "Ignored files"
 msgstr "Những tập tin bị lờ đi"
 
-#: wt-status.c:1366
+#: wt-status.c:1362
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1821,32 +1928,32 @@
 "có lẽ làm nó nhanh hơn, nhưng bạn phải cẩn thận đừng quên mình phải\n"
 "tự thêm các tập tin mới (xem “git help status”.."
 
-#: wt-status.c:1372
+#: wt-status.c:1368
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr "Những tập tin chưa được theo dõi không được liệt kê ra %s"
 
-#: wt-status.c:1374
+#: wt-status.c:1370
 msgid " (use -u option to show untracked files)"
 msgstr " (dùng tùy chọn -u để hiển thị các tập tin chưa được theo dõi)"
 
-#: wt-status.c:1380
+#: wt-status.c:1376
 msgid "No changes"
 msgstr "Không có thay đổi nào"
 
-#: wt-status.c:1385
+#: wt-status.c:1381
 #, c-format
 msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr ""
 "không có thay đổi nào được thêm vào để chuyển giao (dùng \"git add\" và/hoặc "
 "\"git commit -a\")\n"
 
-#: wt-status.c:1388
+#: wt-status.c:1384
 #, c-format
 msgid "no changes added to commit\n"
 msgstr "không có thay đổi nào được thêm vào để chuyển giao\n"
 
-#: wt-status.c:1391
+#: wt-status.c:1387
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
@@ -1855,99 +1962,99 @@
 "không có gì được thêm vào lần chuyển giao nhưng có những tập tin chưa được "
 "theo dõi hiện diện (dùng \"git add\" để đưa vào theo dõi)\n"
 
-#: wt-status.c:1394
+#: wt-status.c:1390
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
 msgstr ""
 "không có gì được thêm vào lần chuyển giao nhưng có những tập tin chưa được "
 "theo dõi hiện diện\n"
 
-#: wt-status.c:1397
+#: wt-status.c:1393
 #, c-format
 msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
 "không có gì để chuyển giao (tạo/sao-chép các tập tin và dùng \"git add\" để "
 "đưa vào theo dõi)\n"
 
-#: wt-status.c:1400 wt-status.c:1405
+#: wt-status.c:1396 wt-status.c:1401
 #, c-format
 msgid "nothing to commit\n"
 msgstr "không có gì để chuyển giao\n"
 
-#: wt-status.c:1403
+#: wt-status.c:1399
 #, c-format
 msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
 "không có gì để chuyển giao (dùng -u xem các tập tin chưa được theo dõi)\n"
 
-#: wt-status.c:1407
+#: wt-status.c:1403
 #, c-format
 msgid "nothing to commit, working directory clean\n"
 msgstr "không có gì để chuyển giao, thư mục làm việc sạch sẽ\n"
 
-#: wt-status.c:1516
+#: wt-status.c:1512
 msgid "HEAD (no branch)"
 msgstr "HEAD (không nhánh)"
 
-#: wt-status.c:1522
+#: wt-status.c:1518
 msgid "Initial commit on "
 msgstr "Lần chuyển giao khởi tạo trên "
 
-#: wt-status.c:1554
+#: wt-status.c:1550
 msgid "gone"
 msgstr "đã ra đi"
 
-#: wt-status.c:1556 wt-status.c:1564
+#: wt-status.c:1552 wt-status.c:1560
 msgid "behind "
 msgstr "đằng sau "
 
-#: compat/precompose_utf8.c:55 builtin/clone.c:356
+#: compat/precompose_utf8.c:55 builtin/clone.c:357
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "gặp lỗi khi bỏ liên kết (unlink) “%s”"
 
-#: builtin/add.c:21
+#: builtin/add.c:22
 msgid "git add [options] [--] <pathspec>..."
 msgstr "git add [các-tùy-chọn] [--]  <pathspec>..."
 
-#: builtin/add.c:64
+#: builtin/add.c:65
 #, c-format
 msgid "unexpected diff status %c"
 msgstr "trạng thái lệnh diff không như mong đợi %c"
 
-#: builtin/add.c:69 builtin/commit.c:261
+#: builtin/add.c:70 builtin/commit.c:275
 msgid "updating files failed"
 msgstr "Cập nhật tập tin gặp lỗi"
 
-#: builtin/add.c:79
+#: builtin/add.c:80
 #, c-format
 msgid "remove '%s'\n"
 msgstr "gỡ bỏ “%s”\n"
 
-#: builtin/add.c:133
+#: builtin/add.c:134
 msgid "Unstaged changes after refreshing the index:"
 msgstr ""
 "Đưa ra khỏi bệ phóng các thay đổi sau khi làm tươi mới lại bảng mục lục:"
 
-#: builtin/add.c:193
+#: builtin/add.c:194 builtin/rev-parse.c:785
 msgid "Could not read the index"
 msgstr "Không thể đọc bảng mục lục"
 
-#: builtin/add.c:204
+#: builtin/add.c:205
 #, c-format
 msgid "Could not open '%s' for writing."
 msgstr "Không thể mở “%s” để ghi."
 
-#: builtin/add.c:208
+#: builtin/add.c:209
 msgid "Could not write patch"
 msgstr "Không thể ghi ra miếng vá"
 
-#: builtin/add.c:213
+#: builtin/add.c:214
 #, c-format
 msgid "Could not stat '%s'"
 msgstr "không thể lấy thông tin thống kê về “%s”"
 
-#: builtin/add.c:215
+#: builtin/add.c:216
 msgid "Empty patch. Aborted."
 msgstr "Miếng vá trống rỗng. Nên bỏ qua."
 
@@ -1962,15 +2069,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:248 builtin/clean.c:876 builtin/fetch.c:93 builtin/mv.c:70
-#: builtin/prune-packed.c:77 builtin/push.c:489 builtin/remote.c:1344
+#: builtin/add.c:248 builtin/clean.c:875 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/prune-packed.c:55 builtin/push.c:499 builtin/remote.c:1375
 #: builtin/rm.c:269
 msgid "dry run"
 msgstr "chạy thử"
 
-#: builtin/add.c:249 builtin/apply.c:4410 builtin/check-ignore.c:19
-#: builtin/commit.c:1256 builtin/count-objects.c:95 builtin/fsck.c:612
-#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113
+#: builtin/add.c:249 builtin/apply.c:4415 builtin/check-ignore.c:19
+#: builtin/commit.c:1362 builtin/count-objects.c:63 builtin/fsck.c:608
+#: builtin/log.c:1617 builtin/mv.c:109 builtin/read-tree.c:114
 msgid "be verbose"
 msgstr "chi tiết"
 
@@ -1978,7 +2085,7 @@
 msgid "interactive picking"
 msgstr "sửa bằng cách tương tác"
 
-#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:286
 msgid "select hunks interactively"
 msgstr "chọn “hunks” theo kiểu tương tác"
 
@@ -2035,96 +2142,96 @@
 msgid "adding files failed"
 msgstr "thêm tập tin gặp lỗi"
 
-#: builtin/add.c:330
+#: builtin/add.c:329
 msgid "-A and -u are mutually incompatible"
 msgstr "-A và -u xung khắc nhau"
 
-#: builtin/add.c:337
+#: builtin/add.c:336
 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:357
 #, 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:358
 #, 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:920
-#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:234 builtin/rm.c:299
+#: builtin/add.c:363 builtin/check-ignore.c:172 builtin/clean.c:919
+#: builtin/commit.c:333 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:299
 msgid "index file corrupt"
 msgstr "tập tin ghi bảng mục lục bị hỏng"
 
-#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
+#: builtin/add.c:446 builtin/apply.c:4510 builtin/mv.c:279 builtin/rm.c:431
 msgid "Unable to write new index file"
 msgstr "Không thể ghi tập tin lưu bảng mục lục mới"
 
-#: builtin/apply.c:57
+#: builtin/apply.c:58
 msgid "git apply [options] [<patch>...]"
 msgstr "git apply [các-tùy-chọn] [<miếng-vá>...]"
 
-#: builtin/apply.c:110
+#: 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:125
+#: 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:823
+#: builtin/apply.c:826
 #, 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:832
+#: builtin/apply.c:835
 #, 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:913
+#: builtin/apply.c:916
 #, 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:945
+#: builtin/apply.c:948
 #, 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:949
+#: builtin/apply.c:952
 #, 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:950
+#: builtin/apply.c:953
 #, 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:957
+#: builtin/apply.c:960
 #, 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:1422
+#: builtin/apply.c:1423
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "chi tiết: dòng không cần: %.*s"
 
-#: builtin/apply.c:1479
+#: builtin/apply.c:1480
 #, 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:1496
+#: builtin/apply.c:1497
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -2139,77 +2246,77 @@
 "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:1656
+#: builtin/apply.c:1657
 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:1658
+#: builtin/apply.c:1659
 msgid "deleted file still has contents"
 msgstr "tập tin đã xóa vẫn còn nội dung"
 
-#: builtin/apply.c:1684
+#: builtin/apply.c:1685
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "miếng vá hỏng tại dòng %d"
 
-#: builtin/apply.c:1720
+#: builtin/apply.c:1721
 #, 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:1722
+#: builtin/apply.c:1723
 #, 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:1725
+#: builtin/apply.c:1726
 #, 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:1871
+#: builtin/apply.c:1872
 #, 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:1900
+#: builtin/apply.c:1901
 #, 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:1986
+#: builtin/apply.c:2052
 #, 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:2076
+#: builtin/apply.c:2142
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "không thể đọc liên kết mềm %s"
 
-#: builtin/apply.c:2080
+#: builtin/apply.c:2146
 #, c-format
 msgid "unable to open or read %s"
 msgstr "không thể mở hay đọc %s"
 
-#: builtin/apply.c:2688
+#: builtin/apply.c:2754
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "sai khởi đầu dòng: “%c”"
 
-#: builtin/apply.c:2806
+#: builtin/apply.c:2872
 #, 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)."
 msgstr[1] "Khối dữ liệu #%d thành công tại %d (offset %d dòng)."
 
-#: builtin/apply.c:2818
+#: builtin/apply.c:2884
 #, 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:2824
+#: builtin/apply.c:2890
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -2218,324 +2325,324 @@
 "trong khi đang tìm kiếm cho:\n"
 "%.*s"
 
-#: builtin/apply.c:2843
+#: builtin/apply.c:2909
 #, 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:2946
+#: builtin/apply.c:3010
 #, 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:2952
+#: builtin/apply.c:3016
 #, 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:2973
+#: builtin/apply.c:3037
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "gặp lỗi khi vá: %s:%ld"
 
-#: builtin/apply.c:3095
+#: builtin/apply.c:3161
 #, c-format
 msgid "cannot checkout %s"
 msgstr "không thể lấy ra %s"
 
-#: builtin/apply.c:3140 builtin/apply.c:3149 builtin/apply.c:3194
+#: builtin/apply.c:3206 builtin/apply.c:3215 builtin/apply.c:3260
 #, c-format
 msgid "read of %s failed"
 msgstr "đọc %s gặp lỗi"
 
-#: builtin/apply.c:3174 builtin/apply.c:3396
+#: builtin/apply.c:3240 builtin/apply.c:3462
 #, 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:3255 builtin/apply.c:3410
+#: builtin/apply.c:3321 builtin/apply.c:3476
 #, 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:3259 builtin/apply.c:3402 builtin/apply.c:3424
+#: builtin/apply.c:3325 builtin/apply.c:3468 builtin/apply.c:3490
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: builtin/apply.c:3264 builtin/apply.c:3418
+#: builtin/apply.c:3330 builtin/apply.c:3484
 #, c-format
 msgid "%s: does not match index"
 msgstr "%s: không khớp trong mục lục"
 
-#: builtin/apply.c:3366
+#: builtin/apply.c:3432
 msgid "removal patch leaves file contents"
 msgstr "loại bỏ miếng vá để lại nội dung tập tin"
 
-#: builtin/apply.c:3435
+#: builtin/apply.c:3501
 #, c-format
 msgid "%s: wrong type"
 msgstr "%s: sai kiểu"
 
-#: builtin/apply.c:3437
+#: builtin/apply.c:3503
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "%s có kiểu %o, cần %o"
 
-#: builtin/apply.c:3538
+#: builtin/apply.c:3604
 #, c-format
 msgid "%s: already exists in index"
 msgstr "%s: đã có từ trước trong bảng mục lục"
 
-#: builtin/apply.c:3541
+#: builtin/apply.c:3607
 #, 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:3561
+#: builtin/apply.c:3627
 #, 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:3566
+#: builtin/apply.c:3632
 #, 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:3574
+#: builtin/apply.c:3640
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "%s: miếng vá không được áp dụng"
 
-#: builtin/apply.c:3587
+#: builtin/apply.c:3653
 #, c-format
 msgid "Checking patch %s..."
 msgstr "Đang kiểm tra miếng vá %s..."
 
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
+#: builtin/apply.c:3746 builtin/checkout.c:213 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:3823
+#: builtin/apply.c:3889
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "không thể gỡ bỏ %s từ mục lục"
 
-#: builtin/apply.c:3851
+#: builtin/apply.c:3918
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr "miếng vá sai hỏng cho mô-đun-con %s"
 
-#: builtin/apply.c:3855
+#: builtin/apply.c:3922
 #, 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:3860
+#: builtin/apply.c:3927
 #, 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:3863 builtin/apply.c:3971
+#: builtin/apply.c:3930 builtin/apply.c:4038
 #, 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:3896
+#: builtin/apply.c:3963
 #, c-format
 msgid "closing file '%s'"
 msgstr "đang đóng tập tin “%s”"
 
-#: builtin/apply.c:3945
+#: builtin/apply.c:4012
 #, 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:4032
+#: builtin/apply.c:4099
 #, 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:4040
+#: builtin/apply.c:4107
 msgid "internal error"
 msgstr "lỗi nội bộ"
 
-#: builtin/apply.c:4043
+#: builtin/apply.c:4110
 #, 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..."
 msgstr[1] "Đang áp dụng miếng vá %%s với %d lần từ chối..."
 
-#: builtin/apply.c:4053
+#: builtin/apply.c:4120
 #, 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:4074
+#: builtin/apply.c:4141
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "Khối nhớ #%d được áp dụng gọn gàng."
 
-#: builtin/apply.c:4077
+#: builtin/apply.c:4144
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "đoạn dữ liệu #%d bị từ chối."
 
-#: builtin/apply.c:4227
+#: builtin/apply.c:4234
 msgid "unrecognized input"
 msgstr "không thừa nhận đầu vào"
 
-#: builtin/apply.c:4238
+#: builtin/apply.c:4245
 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:4357 builtin/apply.c:4360 builtin/clone.c:90
-#: builtin/fetch.c:78
+#: builtin/apply.c:4362 builtin/apply.c:4365 builtin/clone.c:91
+#: builtin/fetch.c:93
 msgid "path"
 msgstr "đường-dẫn"
 
-#: builtin/apply.c:4358
+#: builtin/apply.c:4363
 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:4361
+#: builtin/apply.c:4366
 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:4363
+#: builtin/apply.c:4368
 msgid "num"
 msgstr "số"
 
-#: builtin/apply.c:4364
+#: builtin/apply.c:4369
 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:4367
+#: builtin/apply.c:4372
 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:4369
+#: builtin/apply.c:4374
 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:4373
+#: builtin/apply.c:4378
 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:4375
+#: builtin/apply.c:4380
 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:4377
+#: builtin/apply.c:4382
 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:4379
+#: builtin/apply.c:4384
 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:4381
+#: builtin/apply.c:4386
 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:4383
+#: builtin/apply.c:4388
 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:4385
+#: builtin/apply.c:4390
 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:4387
+#: builtin/apply.c:4392
 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:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
+#: builtin/apply.c:4394 builtin/checkout-index.c:198 builtin/ls-files.c:455
 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:4392
+#: builtin/apply.c:4397
 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:4393
+#: builtin/apply.c:4398
 msgid "action"
 msgstr "hành động"
 
-#: builtin/apply.c:4394
+#: builtin/apply.c:4399
 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:4397 builtin/apply.c:4400
+#: builtin/apply.c:4402 builtin/apply.c:4405
 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:4403
+#: builtin/apply.c:4408
 msgid "apply the patch in reverse"
 msgstr "áp dụng miếng vá theo chiều ngược"
 
-#: builtin/apply.c:4405
+#: builtin/apply.c:4410
 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:4407
+#: builtin/apply.c:4412
 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:4409
+#: builtin/apply.c:4414
 msgid "allow overlapping hunks"
 msgstr "cho phép chồng khối nhớ"
 
-#: builtin/apply.c:4412
+#: builtin/apply.c:4417
 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:4415
+#: builtin/apply.c:4420
 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:4417
+#: builtin/apply.c:4422
 msgid "root"
 msgstr "root"
 
-#: builtin/apply.c:4418
+#: builtin/apply.c:4423
 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:4440
+#: builtin/apply.c:4445
 msgid "--3way outside a repository"
 msgstr "--3way ở ngoài một kho chứa"
 
-#: builtin/apply.c:4448
+#: builtin/apply.c:4453
 msgid "--index outside a repository"
 msgstr "--index ở ngoài một kho chứa"
 
-#: builtin/apply.c:4451
+#: builtin/apply.c:4456
 msgid "--cached outside a repository"
 msgstr "--cached ở ngoài một kho chứa"
 
-#: builtin/apply.c:4467
+#: builtin/apply.c:4472
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "không thể mở miếng vá “%s”"
 
-#: builtin/apply.c:4481
+#: builtin/apply.c:4486
 #, 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"
 msgstr[1] "đã chấm dứt %d lỗi khoảng trắng"
 
-#: builtin/apply.c:4487 builtin/apply.c:4497
+#: builtin/apply.c:4492 builtin/apply.c:4502
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -2590,108 +2697,118 @@
 msgstr ""
 "cập nhật BISECT_HEAD thay vì lấy ra (checking out) lần chuyển giao hiện hành"
 
-#: builtin/blame.c:27
+#: builtin/blame.c:30
 msgid "git blame [options] [rev-opts] [rev] [--] file"
 msgstr "git blame [các-tùy-chọn] [rev-opts] [rev] [--] tập-tin"
 
-#: builtin/blame.c:32
+#: builtin/blame.c:35
 msgid "[rev-opts] are documented in git-rev-list(1)"
 msgstr "[rev-opts] được mô tả trong git-rev-list(1)"
 
-#: builtin/blame.c:2242
+#: builtin/blame.c:2501
 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:2243
+#: builtin/blame.c:2502
 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:2244
+#: builtin/blame.c:2503
 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:2245
+#: builtin/blame.c:2504
 msgid "Show work cost statistics"
 msgstr "Hiển thị thống kê công sức làm việc"
 
-#: builtin/blame.c:2246
+#: builtin/blame.c:2505
 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:2247
+#: builtin/blame.c:2506
 msgid "Show original filename (Default: auto)"
 msgstr "Hiển thị tên tập tin gốc (Mặc định: auto)"
 
-#: builtin/blame.c:2248
+#: builtin/blame.c:2507
 msgid "Show original linenumber (Default: off)"
 msgstr "Hiển thị số dòng gốc (Mặc định: off)"
 
-#: builtin/blame.c:2249
+#: builtin/blame.c:2508
 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:2250
+#: builtin/blame.c:2509
 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:2251
+#: builtin/blame.c:2510
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "Dùng cùng chế độ xuất ra vóigit-annotate (Mặc định: off)"
 
-#: builtin/blame.c:2252
+#: builtin/blame.c:2511
 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:2253
+#: builtin/blame.c:2512
 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:2254
+#: builtin/blame.c:2513
 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:2255
+#: builtin/blame.c:2514
 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:2256
+#: builtin/blame.c:2515
 msgid "Ignore whitespace differences"
 msgstr "Bỏ qua các khác biệt do khoảng trắng gây ra"
 
-#: builtin/blame.c:2257
+#: builtin/blame.c:2516
 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:2258
+#: builtin/blame.c:2517
 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:2259
+#: builtin/blame.c:2518
 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:2260 builtin/blame.c:2261
+#: builtin/blame.c:2519 builtin/blame.c:2520
 msgid "score"
 msgstr "điểm số"
 
-#: builtin/blame.c:2260
+#: builtin/blame.c:2519
 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:2261
+#: builtin/blame.c:2520
 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:2262
+#: builtin/blame.c:2521
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2262
+#: builtin/blame.c:2521
 msgid "Process only line range n,m, counting from 1"
 msgstr "Xử lý chỉ dòng vùng n,m, tính từ 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:2602
+msgid "4 years, 11 months ago"
+msgstr "4 năm, 11 tháng trước"
+
 #: builtin/branch.c:24
 msgid "git branch [options] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [các-tùy-chọn] [-r | -a] [--merged | --no-merged]"
@@ -2708,7 +2825,7 @@
 msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>"
 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:152
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -2717,7 +2834,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:156
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -2726,12 +2843,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:170
 #, 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:174
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -2740,301 +2857,301 @@
 "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:187
 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:215
 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:221
 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:229
 #, 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:240
+#: builtin/branch.c:245
 #, c-format
 msgid "remote branch '%s' not found."
 msgstr "không tìm thấy nhánh máy chủ “%s”."
 
-#: builtin/branch.c:241
+#: builtin/branch.c:246
 #, c-format
 msgid "branch '%s' not found."
 msgstr "không tìm thấy nhánh “%s”."
 
-#: builtin/branch.c:255
+#: builtin/branch.c:260
 #, c-format
 msgid "Error deleting remote branch '%s'"
 msgstr "Gặp lỗi khi đang xóa nhánh trên máy chủ “%s”"
 
-#: builtin/branch.c:256
+#: builtin/branch.c:261
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Gặp lỗi khi xoá bỏ nhánh “%s”"
 
-#: builtin/branch.c:263
+#: builtin/branch.c:268
 #, c-format
 msgid "Deleted remote branch %s (was %s).\n"
 msgstr "Nhánh trên máy chủ \"%s\" đã bị xóa (từng là %s).\n"
 
-#: builtin/branch.c:264
+#: builtin/branch.c:269
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Nhánh “%s” đã bị xóa (từng là %s)\n"
 
-#: builtin/branch.c:366
+#: builtin/branch.c:370
 #, 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:454
+#: builtin/branch.c:459
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: đã ra đi]"
 
-#: builtin/branch.c:459
+#: builtin/branch.c:464
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:464
+#: builtin/branch.c:469
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: đằng sau %d]"
 
-#: builtin/branch.c:466
+#: builtin/branch.c:471
 #, c-format
 msgid "[behind %d]"
 msgstr "[đằng sau %d]"
 
-#: builtin/branch.c:470
+#: builtin/branch.c:475
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: phía trước %d]"
 
-#: builtin/branch.c:472
+#: builtin/branch.c:477
 #, c-format
 msgid "[ahead %d]"
 msgstr "[phía trước %d]"
 
-#: builtin/branch.c:475
+#: builtin/branch.c:480
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: trước %d, sau %d]"
 
-#: builtin/branch.c:478
+#: builtin/branch.c:483
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[trước %d, sau %d]"
 
-#: builtin/branch.c:502
+#: builtin/branch.c:496
 msgid " **** invalid ref ****"
 msgstr " **** tham chiếu không hợp lệ ****"
 
-#: builtin/branch.c:594
+#: builtin/branch.c:587
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(không nhánh, đang cải tổ %s)"
 
-#: builtin/branch.c:597
+#: builtin/branch.c:590
 #, 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:600
+#: builtin/branch.c:593
 #, c-format
 msgid "(detached from %s)"
 msgstr "(được tách rời từ %s)"
 
-#: builtin/branch.c:603
+#: builtin/branch.c:596
 msgid "(no branch)"
 msgstr "(không nhánh)"
 
-#: builtin/branch.c:649
+#: 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:681
+#: 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:694
+#: builtin/branch.c:704
 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:704
+#: builtin/branch.c:714
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Tên nhánh không hợp lệ: “%s”"
 
-#: builtin/branch.c:719
+#: builtin/branch.c:729
 msgid "Branch rename failed"
 msgstr "Gặp lỗi khi đổi tên nhánh"
 
-#: builtin/branch.c:723
+#: builtin/branch.c:733
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "Đã đổi tên nhánh khuyết danh “%s” đi"
 
-#: builtin/branch.c:727
+#: builtin/branch.c:737
 #, 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:734
+#: builtin/branch.c:744
 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:749
+#: builtin/branch.c:759
 #, c-format
 msgid "malformed object name %s"
 msgstr "tên đối tượng dị hình %s"
 
-#: builtin/branch.c:773
+#: builtin/branch.c:783
 #, 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:803
+#: builtin/branch.c:813
 msgid "Generic options"
 msgstr "Tùy chọn chung"
 
-#: builtin/branch.c:805
+#: builtin/branch.c:815
 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:806
+#: builtin/branch.c:816
 msgid "suppress informational messages"
 msgstr "không xuất các thông tin"
 
-#: builtin/branch.c:807
+#: builtin/branch.c:817
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "cài đặt chế độ theo dõi (xem git-pull(1))"
 
-#: builtin/branch.c:809
+#: builtin/branch.c:819
 msgid "change upstream info"
 msgstr "thay đổi thông tin thượng nguồn"
 
-#: builtin/branch.c:813
+#: builtin/branch.c:823
 msgid "use colored output"
 msgstr "tô màu kết xuất"
 
-#: builtin/branch.c:814
+#: builtin/branch.c:824
 msgid "act on remote-tracking branches"
 msgstr "thao tác trên nhánh “remote-tracking”"
 
-#: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844
-#: builtin/branch.c:850 builtin/commit.c:1494 builtin/commit.c:1495
-#: builtin/commit.c:1496 builtin/commit.c:1497 builtin/tag.c:527
-#: builtin/tag.c:533
+#: builtin/branch.c:827 builtin/branch.c:833 builtin/branch.c:854
+#: builtin/branch.c:860 builtin/commit.c:1622 builtin/commit.c:1623
+#: builtin/commit.c:1624 builtin/commit.c:1625 builtin/tag.c:616
+#: builtin/tag.c:622
 msgid "commit"
 msgstr "lần_chuyển_giao"
 
-#: builtin/branch.c:818 builtin/branch.c:824
+#: builtin/branch.c:828 builtin/branch.c:834
 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:830
+#: builtin/branch.c:840
 msgid "Specific git-branch actions:"
 msgstr "Hành động git-branch:"
 
-#: builtin/branch.c:831
+#: builtin/branch.c:841
 msgid "list both remote-tracking and local branches"
 msgstr "liệt kê cả nhánh “remote-tracking” và nội bộ"
 
-#: builtin/branch.c:833
+#: builtin/branch.c:843
 msgid "delete fully merged branch"
 msgstr "xóa một toàn bộ nhánh đã hòa trộn"
 
-#: builtin/branch.c:834
+#: builtin/branch.c:844
 msgid "delete branch (even if not merged)"
 msgstr "xoá nhánh (cho dù là chưa được hòa trộn)"
 
-#: builtin/branch.c:835
+#: builtin/branch.c:845
 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:836
+#: builtin/branch.c:846
 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:837
+#: builtin/branch.c:847
 msgid "list branch names"
 msgstr "liệt kê các tên nhánh"
 
-#: builtin/branch.c:838
+#: builtin/branch.c:848
 msgid "create the branch's reflog"
 msgstr "tạo reflog của nhánh"
 
-#: builtin/branch.c:840
+#: builtin/branch.c:850
 msgid "edit the description for the branch"
 msgstr "sửa mô tả cho nhánh"
 
-#: builtin/branch.c:841
+#: builtin/branch.c:851
 msgid "force creation (when already exists)"
 msgstr "ép buộc tạo (khi đã có nhánh cùng tên)"
 
-#: builtin/branch.c:844
+#: builtin/branch.c:854
 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:850
+#: builtin/branch.c:860
 msgid "print only merged branches"
 msgstr "chỉ hiển thị các nhánh đã hòa trộn"
 
-#: builtin/branch.c:854
+#: builtin/branch.c:864
 msgid "list branches in columns"
 msgstr "liệt kê các nhánh trong các cột"
 
-#: builtin/branch.c:867
+#: builtin/branch.c:877
 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 (ref) hợp lệ."
+msgstr "Gặp lỗi khi phân giải HEAD như là một tham chiếu hợp lệ."
 
-#: builtin/branch.c:872 builtin/clone.c:635
+#: builtin/branch.c:881 builtin/clone.c:634
 msgid "HEAD not found below refs/heads!"
 msgstr "không tìm thấy HEAD ở dưới refs/heads!"
 
-#: builtin/branch.c:896
+#: builtin/branch.c:903
 msgid "--column and --verbose are incompatible"
 msgstr "tùy chọn --column và --verbose xung khắc nhau"
 
-#: builtin/branch.c:902 builtin/branch.c:941
+#: builtin/branch.c:909 builtin/branch.c:948
 msgid "branch name required"
 msgstr "cần chỉ ra tên nhánh"
 
-#: builtin/branch.c:917
+#: builtin/branch.c:924
 msgid "Cannot give description to detached HEAD"
 msgstr "Không thể đưa ra mô tả HEAD đã tách rời"
 
-#: builtin/branch.c:922
+#: builtin/branch.c:929
 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:929
+#: builtin/branch.c:936
 #, 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:932
+#: builtin/branch.c:939
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Không có nhánh nào có tên “%s”."
 
-#: builtin/branch.c:947
+#: builtin/branch.c:954
 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:952
+#: builtin/branch.c:959
 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:956
+#: builtin/branch.c:963
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -3042,40 +3159,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:959 builtin/branch.c:981 builtin/branch.c:1002
+#: builtin/branch.c:966 builtin/branch.c:988 builtin/branch.c:1009
 #, c-format
 msgid "no such branch '%s'"
 msgstr "không có nhánh nào như thế “%s”"
 
-#: builtin/branch.c:963
+#: builtin/branch.c:970
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "chưa có nhánh “%s”"
 
-#: builtin/branch.c:975
+#: builtin/branch.c:982
 msgid "too many branches to unset upstream"
 msgstr "quá nhiều nhánh để bỏ đặt thượng nguồn"
 
-#: builtin/branch.c:979
+#: builtin/branch.c:986
 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:985
+#: builtin/branch.c:992
 #, 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:999
+#: builtin/branch.c:1006
 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:1005
+#: builtin/branch.c:1012
 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:1008
+#: builtin/branch.c:1015
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -3084,7 +3201,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:1025
+#: builtin/branch.c:1032
 #, c-format
 msgid ""
 "\n"
@@ -3095,12 +3212,12 @@
 "Nếu bạn muốn “%s” theo dõi “%s”, thực hiện lệnh sau:\n"
 "\n"
 
-#: builtin/branch.c:1026
+#: builtin/branch.c:1033
 #, c-format
 msgid "    git branch -d %s\n"
 msgstr "    git branch -d %s\n"
 
-#: builtin/branch.c:1027
+#: builtin/branch.c:1034
 #, c-format
 msgid "    git branch --set-upstream-to %s\n"
 msgstr "    git branch --set-upstream-to %s\n"
@@ -3118,44 +3235,44 @@
 msgid "Need a repository to unbundle."
 msgstr "Cần một kho chứa để có thể giải nén một bundle."
 
-#: builtin/cat-file.c:331
+#: builtin/cat-file.c:332
 msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
 msgstr "git cat-file (-t|-s|-e|-p|<kiểu>|--textconv) <đối_tượng>"
 
-#: builtin/cat-file.c:332
+#: builtin/cat-file.c:333
 msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
 msgstr "git cat-file (--batch|--batch-check) < <danh-sách-đối-tượng>"
 
-#: builtin/cat-file.c:369
+#: builtin/cat-file.c:370
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<kiểu> là một trong số: blob, tree, commit hoặc tag"
 
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:371
 msgid "show object type"
 msgstr "hiển thị kiểu đối tượng"
 
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:372
 msgid "show object size"
 msgstr "hiển thị kích thước đối tượng"
 
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:374
 msgid "exit with zero when there's no error"
 msgstr "thoát với 0 khi không có lỗi"
 
-#: builtin/cat-file.c:374
+#: builtin/cat-file.c:375
 msgid "pretty-print object's content"
 msgstr "in nội dung đối tượng dạng dễ đọc"
 
-#: builtin/cat-file.c:376
+#: builtin/cat-file.c:377
 msgid "for blob objects, run textconv on object's content"
 msgstr "với đối tượng blob, chạy lệnh textconv trên nội dung của đối tượng"
 
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:379
 msgid "show info and content of objects fed from the standard input"
 msgstr ""
 "hiển thị thông tin và nội dung của các đối tượng lấy từ đầu vào tiêu chuẩn"
 
-#: builtin/cat-file.c:381
+#: builtin/cat-file.c:382
 msgid "show info about objects fed from the standard input"
 msgstr "hiển thị các thông tin về đối tượng fed  từ đầu vào tiêu chuẩn"
 
@@ -3176,7 +3293,7 @@
 msgid "use .gitattributes only from the index"
 msgstr "chỉ dùng .gitattributes từ bảng mục lục"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:75
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "đọc tên tập tin từ đầu vào tiêu chuẩn"
 
@@ -3184,7 +3301,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:1089 builtin/gc.c:271
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:274
 msgid "suppress progress reporting"
 msgstr "chặn các báo cáo tiến trình hoạt động"
 
@@ -3241,44 +3358,44 @@
 msgid "git checkout-index [options] [--] [<file>...]"
 msgstr "git checkout-index [các-tùy-chọn] [--] [<tập-tin>...]"
 
-#: builtin/checkout-index.c:187
+#: builtin/checkout-index.c:188
 msgid "check out all files in the index"
 msgstr "lấy ra toàn bộ các tập tin trong bảng mục lục"
 
-#: builtin/checkout-index.c:188
+#: builtin/checkout-index.c:189
 msgid "force overwrite of existing files"
 msgstr "ép buộc ghi đè lên tập tin đã sẵn có từ trước"
 
-#: builtin/checkout-index.c:190
+#: builtin/checkout-index.c:191
 msgid "no warning for existing files and files not in index"
 msgstr ""
 "không cảnh báo cho những tập tin tồn tại và không có trong bảng mục lục"
 
-#: builtin/checkout-index.c:192
+#: builtin/checkout-index.c:193
 msgid "don't checkout new files"
 msgstr "không checkout các tập tin mới"
 
-#: builtin/checkout-index.c:194
+#: builtin/checkout-index.c:195
 msgid "update stat information in the index file"
 msgstr "cập nhật thông tin thống kê trong tập tin lưu bảng mục lục mới"
 
-#: builtin/checkout-index.c:200
+#: builtin/checkout-index.c:201
 msgid "read list of paths from the standard input"
 msgstr "đọc danh sách đường dẫn từ đầu vào tiêu chuẩn"
 
-#: builtin/checkout-index.c:202
+#: builtin/checkout-index.c:203
 msgid "write the content to temporary files"
 msgstr "ghi nội dung vào tập tin tạm"
 
-#: builtin/checkout-index.c:203 builtin/column.c:30
+#: builtin/checkout-index.c:204 builtin/column.c:30
 msgid "string"
 msgstr "chuỗi"
 
-#: builtin/checkout-index.c:204
+#: builtin/checkout-index.c:205
 msgid "when creating files, prepend <string>"
 msgstr "khi tạo các tập tin, nối thêm <chuỗi>"
 
-#: builtin/checkout-index.c:207
+#: builtin/checkout-index.c:208
 msgid "copy out the files from named stage"
 msgstr "sao chép ra các tập tin từ bệ phóng có tên"
 
@@ -3320,66 +3437,66 @@
 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:232 builtin/checkout.c:235 builtin/checkout.c:238
-#: builtin/checkout.c:241
+#: builtin/checkout.c:231 builtin/checkout.c:234 builtin/checkout.c:237
+#: builtin/checkout.c:240
 #, 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:244 builtin/checkout.c:247
+#: builtin/checkout.c:243 builtin/checkout.c:246
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "không được dùng “%s” với %s"
 
-#: builtin/checkout.c:250
+#: builtin/checkout.c:249
 #, 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:261 builtin/checkout.c:450
+#: builtin/checkout.c:260 builtin/checkout.c:449
 msgid "corrupt index file"
 msgstr "tập tin ghi bảng mục lục bị hỏng"
 
-#: builtin/checkout.c:321 builtin/checkout.c:328
+#: builtin/checkout.c:320 builtin/checkout.c:327
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "đường dẫn “%s” không được hòa trộn"
 
-#: builtin/checkout.c:472
+#: builtin/checkout.c:471
 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:593
+#: builtin/checkout.c:597
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr "Không thể thực hiện reflog cho “%s”\n"
 
-#: builtin/checkout.c:631
+#: builtin/checkout.c:635
 msgid "HEAD is now at"
 msgstr "HEAD hiện giờ tại"
 
-#: builtin/checkout.c:638
+#: builtin/checkout.c:642
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Đặt lại nhánh “%s”\n"
 
-#: builtin/checkout.c:641
+#: builtin/checkout.c:645
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Đã sẵn sàng trên “%s”\n"
 
-#: builtin/checkout.c:645
+#: builtin/checkout.c:649
 #, 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:647 builtin/checkout.c:1032
+#: builtin/checkout.c:651 builtin/checkout.c:1032
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Đã chuyển đến nhánh mới “%s”\n"
 
-#: builtin/checkout.c:649
+#: builtin/checkout.c:653
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Đã chuyển đến nhánh “%s”\n"
@@ -3477,7 +3594,7 @@
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Không thể chuyển nhánh đến một non-commit “%s”"
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:89
 #: builtin/remote.c:159 builtin/remote.c:161
 msgid "branch"
 msgstr "nhánh"
@@ -3528,11 +3645,11 @@
 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:1105 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:226
 msgid "update ignored files (default)"
 msgstr "cập nhật các tập tin bị bỏ qua (mặc định)"
 
-#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
+#: builtin/checkout.c:1106 builtin/log.c:1239 parse-options.h:245
 msgid "style"
 msgstr "kiểu"
 
@@ -3556,15 +3673,15 @@
 msgid "--track needs a branch name"
 msgstr "--track cần tên một nhánh"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1157
 msgid "Missing branch name; try -b"
 msgstr "Thiếu tên nhánh; hãy thử -b"
 
-#: builtin/checkout.c:1196
+#: builtin/checkout.c:1194
 msgid "invalid path specification"
 msgstr "đường dẫn đã cho không hợp lệ"
 
-#: builtin/checkout.c:1203
+#: builtin/checkout.c:1201
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3574,12 +3691,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:1208
+#: builtin/checkout.c:1206
 #, 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:1212
+#: builtin/checkout.c:1210
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -3655,30 +3772,30 @@
 msgid "Huh (%s)?"
 msgstr "Hả (%s)?"
 
-#: builtin/clean.c:660
+#: builtin/clean.c:659
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Mẫu để lọc các tập tin đầu vào cần lờ đi>> "
 
-#: builtin/clean.c:697
+#: builtin/clean.c:696
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "CẢNH BÁO: Không tìm thấy các mục được khớp bởi: %s"
 
-#: builtin/clean.c:718
+#: builtin/clean.c:717
 msgid "Select items to delete"
 msgstr "Chọn mục muốn xóa"
 
-#: builtin/clean.c:758
+#: builtin/clean.c:757
 #, c-format
 msgid "remove %s? "
 msgstr "gỡ bỏ “%s”? "
 
-#: builtin/clean.c:783
+#: builtin/clean.c:782
 msgid "Bye."
 msgstr "Tạm biệt."
 
-#: builtin/clean.c:791
+#: builtin/clean.c:790
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -3696,62 +3813,62 @@
 "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:818
+#: builtin/clean.c:817
 msgid "*** Commands ***"
 msgstr "*** Lệnh ***"
 
-#: builtin/clean.c:819
+#: builtin/clean.c:818
 msgid "What now"
 msgstr "Giờ thì sao"
 
-#: builtin/clean.c:827
+#: builtin/clean.c:826
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Có muốn gỡ bỏ mục sau đây không:"
 msgstr[1] "Có muốn gỡ bỏ các mục sau đây không:"
 
-#: builtin/clean.c:844
+#: builtin/clean.c:843
 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:875
+#: builtin/clean.c:874
 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:877
+#: builtin/clean.c:876
 msgid "force"
 msgstr "ép buộc"
 
-#: builtin/clean.c:878
+#: builtin/clean.c:877
 msgid "interactive cleaning"
 msgstr "dọn bằng kiểu tương tác"
 
-#: builtin/clean.c:880
+#: builtin/clean.c:879
 msgid "remove whole directories"
 msgstr "gỡ bỏ toàn bộ thư mục"
 
-#: builtin/clean.c:881 builtin/describe.c:415 builtin/grep.c:716
-#: builtin/ls-files.c:486 builtin/name-rev.c:314 builtin/show-ref.c:185
+#: builtin/clean.c:880 builtin/describe.c:407 builtin/grep.c:714
+#: builtin/ls-files.c:486 builtin/name-rev.c:311 builtin/show-ref.c:185
 msgid "pattern"
 msgstr "mẫu"
 
-#: builtin/clean.c:882
+#: builtin/clean.c:881
 msgid "add <pattern> to ignore rules"
 msgstr "thêm <mẫu> vào trong qui tắc bỏ qua"
 
-#: builtin/clean.c:883
+#: builtin/clean.c:882
 msgid "remove ignored files, too"
 msgstr "đồng thời gỡ bỏ cả các tập tin bị bỏ qua"
 
-#: builtin/clean.c:885
+#: builtin/clean.c:884
 msgid "remove only ignored files"
 msgstr "chỉ gỡ bỏ những tập tin bị bỏ qua"
 
-#: builtin/clean.c:903
+#: builtin/clean.c:902
 msgid "-x and -X cannot be used together"
 msgstr "-x và -X không thể dùng cùng nhau"
 
-#: builtin/clean.c:907
+#: builtin/clean.c:906
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
@@ -3759,7 +3876,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:910
+#: builtin/clean.c:909
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -3767,145 +3884,145 @@
 "clean.requireForce mặc định được đặt là true và không đưa ra tùy chọn -i, -n "
 "mà cũng không -f; từ chối lệnh dọn dẹp (clean)"
 
-#: builtin/clone.c:36
+#: builtin/clone.c:37
 msgid "git clone [options] [--] <repo> [<dir>]"
 msgstr "git clone [các-tùy-chọn] [--] <kho> [<t.mục>]"
 
-#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:504
+#: builtin/clone.c:65 builtin/fetch.c:112 builtin/merge.c:223
+#: builtin/push.c:514
 msgid "force progress reporting"
 msgstr "ép buộc báo cáo tiến triển công việc"
 
-#: builtin/clone.c:66
+#: builtin/clone.c:67
 msgid "don't create a checkout"
 msgstr "không tạo một checkout"
 
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
+#: builtin/clone.c:68 builtin/clone.c:70 builtin/init-db.c:488
 msgid "create a bare repository"
 msgstr "tạo kho thuần"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:72
 msgid "create a mirror repository (implies bare)"
 msgstr "tạo kho bản sao (ý là kho thuần)"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:74
 msgid "to clone from a local repository"
 msgstr "để nhân bản từ kho nội bộ"
 
-#: builtin/clone.c:75
+#: builtin/clone.c:76
 msgid "don't use local hardlinks, always copy"
 msgstr "không sử dụng liên kết cứng nội bộ, luôn sao chép"
 
-#: builtin/clone.c:77
+#: builtin/clone.c:78
 msgid "setup as shared repository"
 msgstr "cài đặt đây là kho chia sẻ"
 
-#: builtin/clone.c:79 builtin/clone.c:81
+#: builtin/clone.c:80 builtin/clone.c:82
 msgid "initialize submodules in the clone"
 msgstr "khởi tạo mô-đun-con trong bản sao"
 
-#: builtin/clone.c:82 builtin/init-db.c:483
+#: builtin/clone.c:83 builtin/init-db.c:485
 msgid "template-directory"
 msgstr "thư-mục-mẫu"
 
-#: builtin/clone.c:83 builtin/init-db.c:484
+#: builtin/clone.c:84 builtin/init-db.c:486
 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:85
+#: builtin/clone.c:86
 msgid "reference repository"
 msgstr "kho tham chiếu"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44
 msgid "name"
 msgstr "tên"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:88
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "dùng <tên> thay cho “origin” để theo dõi thượng nguồn"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:90
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "lấy ra <nhánh> thay cho HEAD của máy chủ"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:92
 msgid "path to git-upload-pack on the remote"
 msgstr "đường dẫn đến git-upload-pack trên máy chủ"
 
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
+#: builtin/clone.c:93 builtin/fetch.c:113 builtin/grep.c:659
 msgid "depth"
 msgstr "độ-sâu"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:94
 msgid "create a shallow clone of that depth"
 msgstr "tạo bản sao không đầy đủ cho mức sâu đã cho"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:96
 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:96 builtin/init-db.c:492
+#: builtin/clone.c:97 builtin/init-db.c:494
 msgid "gitdir"
 msgstr "gitdir"
 
-#: builtin/clone.c:97 builtin/init-db.c:493
+#: builtin/clone.c:98 builtin/init-db.c:495
 msgid "separate git dir from working tree"
 msgstr "không dùng chung thư mục dành riêng cho git và thư mục làm việc"
 
-#: builtin/clone.c:98
+#: builtin/clone.c:99
 msgid "key=value"
 msgstr "khóa=giá_trị"
 
-#: builtin/clone.c:99
+#: builtin/clone.c:100
 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:252
+#: builtin/clone.c:253
 #, 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:256
+#: builtin/clone.c:257
 #, c-format
 msgid "reference repository '%s' is shallow"
 msgstr "kho tham chiếu “%s” là nông"
 
-#: builtin/clone.c:259
+#: builtin/clone.c:260
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr "kho tham chiếu “%s” bị cấy ghép"
 
-#: builtin/clone.c:321
+#: builtin/clone.c:322
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr "tạo thư mục \"%s\" gặp lỗi"
 
-#: builtin/clone.c:323 builtin/diff.c:83
+#: builtin/clone.c:324 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:325
+#: builtin/clone.c:326
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s tồn tại nhưng không phải là một thư mục"
 
-#: builtin/clone.c:339
+#: builtin/clone.c:340
 #, 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:361
+#: builtin/clone.c:362
 #, 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:365
+#: builtin/clone.c:366
 #, 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:388 builtin/clone.c:565
+#: builtin/clone.c:389 builtin/clone.c:563
 #, c-format
 msgid "done.\n"
 msgstr "hoàn tất.\n"
@@ -3920,25 +4037,25 @@
 "Bạn kiểm tra kỹ xem cái gì được lấy ra bằng lệnh “git status”\n"
 "và thử checkout với lệnh “git checkout -f HEAD”\n"
 
-#: builtin/clone.c:480
+#: builtin/clone.c:478
 #, 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:560
+#: builtin/clone.c:558
 #, c-format
 msgid "Checking connectivity... "
 msgstr "Đang kiểm tra kết nối... "
 
-#: builtin/clone.c:563
+#: builtin/clone.c:561
 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:626
+#: builtin/clone.c:625
 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:657
+#: builtin/clone.c:656
 msgid "unable to checkout working tree"
 msgstr "không thể lấy ra (checkout) cây làm việc"
 
@@ -3964,64 +4081,64 @@
 msgid "repository '%s' does not exist"
 msgstr "kho chứa “%s” chưa tồn tại"
 
-#: builtin/clone.c:802
-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:805
-msgid "source repository is shallow, ignoring --local"
-msgstr "kho nguồn là nông, nên bỏ qua --local"
-
-#: builtin/clone.c:810
-msgid "--local is ignored"
-msgstr "--local bị lờ đi"
-
-#: builtin/clone.c:814 builtin/fetch.c:1119
+#: builtin/clone.c:802 builtin/fetch.c:1155
 #, 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:824
+#: builtin/clone.c:812
 #, 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:834
+#: builtin/clone.c:822
 #, 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:847 builtin/clone.c:859
+#: builtin/clone.c:835 builtin/clone.c:847
 #, 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:850
+#: builtin/clone.c:838
 #, 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:869
+#: builtin/clone.c:857
 #, 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:871
+#: builtin/clone.c:859
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Đang nhân bản thành “%s”...\n"
 
-#: builtin/clone.c:906
+#: builtin/clone.c:895
+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:898
+msgid "source repository is shallow, ignoring --local"
+msgstr "kho nguồn là nông, nên bỏ qua --local"
+
+#: builtin/clone.c:903
+msgid "--local is ignored"
+msgstr "--local bị lờ đi"
+
+#: builtin/clone.c:907
 #, 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:957 builtin/clone.c:965
+#: builtin/clone.c:958 builtin/clone.c:966
 #, 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:968
+#: builtin/clone.c:969
 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."
 
@@ -4057,15 +4174,46 @@
 msgid "--command must be the first argument"
 msgstr "--command phải là đối số đầu tiên"
 
-#: builtin/commit.c:36
+#: builtin/commit.c:37
 msgid "git commit [options] [--] <pathspec>..."
 msgstr "git commit [các-tùy-chọn] [--] <pathspec>..."
 
-#: builtin/commit.c:41
+#: builtin/commit.c:42
 msgid "git status [options] [--] <pathspec>..."
 msgstr "git status [các-tùy-chọn] [--] <pathspec>..."
 
-#: builtin/commit.c:46
+#: builtin/commit.c:47
+msgid ""
+"Your name and email address were configured automatically based\n"
+"on your username and hostname. Please check that they are accurate.\n"
+"You can suppress this message by setting them explicitly. Run the\n"
+"following command and follow the instructions in your editor to edit\n"
+"your configuration file:\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"After doing this, you may fix the identity used for this commit with:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+msgstr ""
+"Tên và địa chỉ thư điện tử của bạn được cấu hình một cách tự động trên cơ "
+"sở\n"
+"tài khoản và địa chỉ máy chủ của bạn. Xin hãy kiểm tra xem chúng có chính "
+"xác không.\n"
+"Bạn có thể chặn những thông báo kiểu này bằng cách cài đặt các thông tin "
+"trên\n"
+"một cách rõ ràng. Chạy lệnh sau đây là theo các hướng dẫn trong bộ soạn "
+"thảo\n"
+"để chỉnh sửa tập tin cấu hình của mình:\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"Sau khi thực hiện xong, bạn có thể sửa chữa định danh được sử dụng cho\n"
+"lần chuyển giao này với lệnh:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+
+#: builtin/commit.c:60
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4093,7 +4241,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:58
+#: builtin/commit.c:72
 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"
@@ -4106,7 +4254,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:63
+#: builtin/commit.c:77
 msgid ""
 "The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
 "If you wish to commit it anyway, use:\n"
@@ -4121,11 +4269,11 @@
 "    git commit --allow-empty\n"
 "\n"
 
-#: builtin/commit.c:70
+#: builtin/commit.c:84
 msgid "Otherwise, please use 'git reset'\n"
 msgstr "Nếu không được thì dùng lệnh \"git reset\"\n"
 
-#: builtin/commit.c:73
+#: builtin/commit.c:87
 msgid ""
 "If you wish to skip this commit, use:\n"
 "\n"
@@ -4141,95 +4289,121 @@
 "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:288
+#: builtin/commit.c:302
 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:330
+#: builtin/commit.c:342
 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:336
+#: builtin/commit.c:348
 msgid "interactive add failed"
 msgstr "gặp lỗi khi thêm bằng cách tương"
 
-#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
+#: builtin/commit.c:359
+msgid "unable to write index file"
+msgstr "không thể ghi tập tin lưu mục lục"
+
+#: builtin/commit.c:361
+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:363
+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:387 builtin/commit.c:412 builtin/commit.c:461
 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:421
+#: builtin/commit.c:443
 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:423
+#: builtin/commit.c:445
 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:433
+#: builtin/commit.c:454
 msgid "cannot read the index"
 msgstr "không đọc được bảng mục lục"
 
-#: builtin/commit.c:453
+#: builtin/commit.c:473
 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:544 builtin/commit.c:550
+#: builtin/commit.c:592
 #, c-format
-msgid "invalid commit: %s"
-msgstr "lần chuyển giao không hợp lệ: %s"
+msgid "commit '%s' lacks author header"
+msgstr "lần chuyển giao “%s” thiếu phần tác giả ở đầu"
 
-#: builtin/commit.c:572
+#: builtin/commit.c:594
+#, 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:613
 msgid "malformed --author parameter"
 msgstr "đối số cho --author bị dị hình"
 
-#: builtin/commit.c:592
+#: builtin/commit.c:621
+#, c-format
+msgid "invalid date format: %s"
+msgstr "ngày tháng không hợp lệ: %s"
+
+#: builtin/commit.c:642
 #, c-format
 msgid "Malformed ident string: '%s'"
 msgstr "Chuỗi thụt lề đầu dòng dị hình: “%s”"
 
-#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
+#: builtin/commit.c:675
+msgid ""
+"unable to select a comment character that is not used\n"
+"in the current commit message"
+msgstr ""
+"không thể chọn một ký tự ghi chú cái mà không được dùng\n"
+"trong phần ghi chú hiện tại"
+
+#: builtin/commit.c:712 builtin/commit.c:745 builtin/commit.c:1120
 #, 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:641 builtin/shortlog.c:273
+#: builtin/commit.c:724 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:643
+#: builtin/commit.c:726
 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:647
+#: builtin/commit.c:730
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "không đọc được tệp nhật ký “%s”"
 
-#: builtin/commit.c:654
-msgid "commit has empty message"
-msgstr "lần chuyển giao có ghi chú trống rỗng"
-
-#: builtin/commit.c:670
+#: builtin/commit.c:752
 msgid "could not read MERGE_MSG"
 msgstr "không thể đọc MERGE_MSG"
 
-#: builtin/commit.c:674
+#: builtin/commit.c:756
 msgid "could not read SQUASH_MSG"
 msgstr "không thể đọc SQUASH_MSG"
 
-#: builtin/commit.c:678
+#: builtin/commit.c:760
 #, c-format
 msgid "could not read '%s'"
 msgstr "Không thể đọc “%s”."
 
-#: builtin/commit.c:749
+#: builtin/commit.c:831
 msgid "could not write commit template"
 msgstr "không thể ghi mẫu chuyển giao"
 
-#: builtin/commit.c:764
+#: builtin/commit.c:849
 #, c-format
 msgid ""
 "\n"
@@ -4244,7 +4418,7 @@
 "\t%s\n"
 "và thử lại.\n"
 
-#: builtin/commit.c:769
+#: builtin/commit.c:854
 #, c-format
 msgid ""
 "\n"
@@ -4259,7 +4433,7 @@
 "\t%s\n"
 "và thử lại.\n"
 
-#: builtin/commit.c:782
+#: builtin/commit.c:867
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4270,7 +4444,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:789
+#: builtin/commit.c:874
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4282,149 +4456,154 @@
 "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:802
+#: builtin/commit.c:888
 #, c-format
-msgid "%sAuthor:    %s"
-msgstr "%sTác giả:    %s"
+msgid "%sAuthor:    %.*s <%.*s>"
+msgstr "%sTác giả:           %.*s <%.*s>"
 
-#: builtin/commit.c:809
+#: builtin/commit.c:896
 #, c-format
-msgid "%sCommitter: %s"
-msgstr "%sNgười chuyển giao: %s"
+msgid "%sDate:      %s"
+msgstr "%sNgày tháng:        %s"
 
-#: builtin/commit.c:829
+#: builtin/commit.c:903
+#, c-format
+msgid "%sCommitter: %.*s <%.*s>"
+msgstr "%sNgười chuyển giao: %.*s <%.*s>"
+
+#: builtin/commit.c:921
 msgid "Cannot read index"
 msgstr "Không đọc được bảng mục lục"
 
-#: builtin/commit.c:872
+#: builtin/commit.c:978
 msgid "Error building trees"
 msgstr "Gặp lỗi khi xây dựng cây"
 
-#: builtin/commit.c:887 builtin/tag.c:391
+#: builtin/commit.c:993 builtin/tag.c:495
 #, 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:989
+#: builtin/commit.c:1095
 #, c-format
 msgid "No existing author found with '%s'"
 msgstr "Không tìm thấy tác giả có sẵn với “%s”"
 
-#: builtin/commit.c:1004 builtin/commit.c:1244
+#: builtin/commit.c:1110 builtin/commit.c:1350
 #, 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:1041
+#: builtin/commit.c:1147
 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:1071
+#: builtin/commit.c:1177
 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:1080
+#: builtin/commit.c:1186
 msgid "You have nothing to amend."
 msgstr "Không có gì để mà “tu bổ” cả."
 
-#: builtin/commit.c:1083
+#: builtin/commit.c:1189
 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:1085
+#: builtin/commit.c:1191
 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:1088
+#: builtin/commit.c:1194
 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:1098
+#: builtin/commit.c:1204
 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:1100
+#: builtin/commit.c:1206
 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:1108
+#: builtin/commit.c:1214
 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:1125
+#: builtin/commit.c:1231
 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:1127
+#: builtin/commit.c:1233
 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:1129
+#: builtin/commit.c:1235
 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:1131
+#: builtin/commit.c:1237
 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:1143 builtin/tag.c:639
+#: builtin/commit.c:1249 builtin/tag.c:728
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Chế độ dọn dẹp không hợp lệ %s"
 
-#: builtin/commit.c:1148
+#: builtin/commit.c:1254
 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:1258 builtin/commit.c:1516
+#: builtin/commit.c:1364 builtin/commit.c:1644
 msgid "show status concisely"
 msgstr "hiển thị trạng thái ở dạng súc tích"
 
-#: builtin/commit.c:1260 builtin/commit.c:1518
+#: builtin/commit.c:1366 builtin/commit.c:1646
 msgid "show branch information"
 msgstr "hiển thị thông tin nhánh"
 
-#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
+#: builtin/commit.c:1368 builtin/commit.c:1648 builtin/push.c:500
 msgid "machine-readable output"
 msgstr "kết xuất dạng máy-có-thể-đọc"
 
-#: builtin/commit.c:1265 builtin/commit.c:1522
+#: builtin/commit.c:1371 builtin/commit.c:1650
 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:1268 builtin/commit.c:1525
+#: builtin/commit.c:1374 builtin/commit.c:1653
 msgid "terminate entries with NUL"
 msgstr "chấm dứt các mục bằng NUL"
 
-#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:514
+#: builtin/commit.c:1376 builtin/commit.c:1656 builtin/fast-export.c:980
+#: builtin/fast-export.c:983 builtin/tag.c:603
 msgid "mode"
 msgstr "chế độ"
 
-#: builtin/commit.c:1271 builtin/commit.c:1528
+#: builtin/commit.c:1377 builtin/commit.c:1656
 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:1274
+#: builtin/commit.c:1380
 msgid "show ignored files"
 msgstr "hiển thị các tập tin ẩn"
 
-#: builtin/commit.c:1275 parse-options.h:153
+#: builtin/commit.c:1381 parse-options.h:153
 msgid "when"
 msgstr "khi"
 
-#: builtin/commit.c:1276
+#: builtin/commit.c:1382
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -4432,230 +4611,222 @@
 "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:1278
+#: builtin/commit.c:1384
 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:1347
+#: builtin/commit.c:1471
 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:1349
+#: builtin/commit.c:1473
 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:1390
+#: builtin/commit.c:1518
 msgid "detached HEAD"
 msgstr "đã rời khỏi HEAD"
 
-#: builtin/commit.c:1392
+#: builtin/commit.c:1521
 msgid " (root-commit)"
 msgstr " (root-commit)"
 
-#: builtin/commit.c:1486
+#: builtin/commit.c:1614
 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:1487
+#: builtin/commit.c:1615
 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:1489
+#: builtin/commit.c:1617
 msgid "Commit message options"
 msgstr "Các tùy chọn ghi chú commit"
 
-#: builtin/commit.c:1490 builtin/tag.c:512
+#: builtin/commit.c:1618 builtin/tag.c:601
 msgid "read message from file"
 msgstr "đọc chú thích từ tập tin"
 
-#: builtin/commit.c:1491
+#: builtin/commit.c:1619
 msgid "author"
 msgstr "tác giả"
 
-#: builtin/commit.c:1491
+#: builtin/commit.c:1619
 msgid "override author for commit"
 msgstr "ghi đè tác giả cho commit"
 
-#: builtin/commit.c:1492 builtin/gc.c:272
+#: builtin/commit.c:1620 builtin/gc.c:275
 msgid "date"
 msgstr "ngày tháng"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1620
 msgid "override date for commit"
 msgstr "ghi đè ngày tháng cho lần chuyển giao"
 
-#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
-#: builtin/notes.c:566 builtin/tag.c:510
+#: builtin/commit.c:1621 builtin/merge.c:217 builtin/notes.c:408
+#: builtin/notes.c:565 builtin/tag.c:599
 msgid "message"
 msgstr "chú thích"
 
-#: builtin/commit.c:1493
+#: builtin/commit.c:1621
 msgid "commit message"
 msgstr "chú thích của lần chuyển giao"
 
-#: builtin/commit.c:1494
+#: builtin/commit.c:1622
 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:1495
+#: builtin/commit.c:1623
 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:1496
+#: builtin/commit.c:1624
 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:1497
+#: builtin/commit.c:1625
 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:1498
+#: builtin/commit.c:1626
 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:1499 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1627 builtin/log.c:1191 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "(nên dùng) thêm dòng Signed-off-by:"
 
-#: builtin/commit.c:1500
+#: builtin/commit.c:1628
 msgid "use specified template file"
 msgstr "sử dụng tập tin mẫu đã cho"
 
-#: builtin/commit.c:1501
+#: builtin/commit.c:1629
 msgid "force edit of commit"
 msgstr "ép buộc sửa lần commit"
 
-#: builtin/commit.c:1502
+#: builtin/commit.c:1630
 msgid "default"
 msgstr "mặc định"
 
-#: builtin/commit.c:1502 builtin/tag.c:515
+#: builtin/commit.c:1630 builtin/tag.c:604
 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:1503
+#: builtin/commit.c:1631
 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:1504 builtin/merge.c:223 builtin/revert.c:92
-#: builtin/tag.c:516
+#: builtin/commit.c:1632 builtin/merge.c:224 builtin/revert.c:92
+#: builtin/tag.c:605
 msgid "key-id"
 msgstr "mã-số-khóa"
 
-#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
+#: builtin/commit.c:1633 builtin/merge.c:225 builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "ký lần chuyển giao dùng GPG"
 
-#: builtin/commit.c:1508
+#: builtin/commit.c:1636
 msgid "Commit contents options"
 msgstr "Các tùy nội dung ghi chú commit"
 
-#: builtin/commit.c:1509
+#: builtin/commit.c:1637
 msgid "commit all changed files"
 msgstr "chuyển giao tất cả các tập tin có thay đổi"
 
-#: builtin/commit.c:1510
+#: builtin/commit.c:1638
 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:1511
+#: builtin/commit.c:1639
 msgid "interactively add files"
 msgstr "thêm các tập-tin bằng tương tác"
 
-#: builtin/commit.c:1512
+#: builtin/commit.c:1640
 msgid "interactively add changes"
 msgstr "thêm các thay đổi bằng tương tác"
 
-#: builtin/commit.c:1513
+#: builtin/commit.c:1641
 msgid "commit only specified files"
 msgstr "chỉ chuyển giao các tập tin đã chỉ ra"
 
-#: builtin/commit.c:1514
+#: builtin/commit.c:1642
 msgid "bypass pre-commit hook"
 msgstr "vòng qua móc (hook) pre-commit"
 
-#: builtin/commit.c:1515
+#: builtin/commit.c:1643
 msgid "show what would be committed"
 msgstr "hiển thị xem cái gì có thể được chuyển giao"
 
-#: builtin/commit.c:1526
+#: builtin/commit.c:1654
 msgid "amend previous commit"
 msgstr "“tu bổ” (amend) lần commit trước"
 
-#: builtin/commit.c:1527
+#: builtin/commit.c:1655
 msgid "bypass post-rewrite hook"
 msgstr "vòng qua móc (hook) post-rewrite"
 
-#: builtin/commit.c:1532
+#: builtin/commit.c:1660
 msgid "ok to record an empty change"
 msgstr "ok để ghi lại một thay đổi trống rỗng"
 
-#: builtin/commit.c:1534
+#: builtin/commit.c:1662
 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:1562
+#: builtin/commit.c:1691
 msgid "could not parse HEAD commit"
 msgstr "không thể phân tích commit (lần chuyển giao) HEAD"
 
-#: builtin/commit.c:1601 builtin/merge.c:518
+#: builtin/commit.c:1730 builtin/merge.c:518
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "không thể mở “%s” để đọc"
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1737
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Tập tin MERGE_HEAD sai hỏng (%s)"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1744
 msgid "could not read MERGE_MODE"
 msgstr "không thể đọc MERGE_MODE"
 
-#: builtin/commit.c:1634
+#: builtin/commit.c:1763
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "không thể đọc phần chú thích (message) commit (lần chuyển giao): %s"
 
-#: builtin/commit.c:1645
+#: builtin/commit.c:1774
 #, 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:1650
+#: builtin/commit.c:1779
 #, 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:1665 builtin/merge.c:857 builtin/merge.c:882
+#: builtin/commit.c:1794 builtin/merge.c:850 builtin/merge.c:875
 msgid "failed to write commit object"
 msgstr "gặp lỗi khi ghi đối tượng chuyển giao"
 
-#: builtin/commit.c:1686
-msgid "cannot lock HEAD ref"
-msgstr "không thể khóa HEAD ref (tham chiếu)"
-
-#: builtin/commit.c:1690
-msgid "cannot update HEAD ref"
-msgstr "không thể cập nhật ref (tham chiếu) HEAD"
-
-#: builtin/commit.c:1701
+#: builtin/commit.c:1827
 msgid ""
 "Repository has been updated, but unable to write\n"
-"new_index file. Check that disk is not full or quota is\n"
+"new_index file. Check that disk is not full and quota is\n"
 "not exceeded, and then \"git reset HEAD\" to recover."
 msgstr ""
-"Kho chứa đã hoàn tất việc cập nhật, nhưng không thể ghi vào\n"
-"tập tin new_index (bảng mục lục mới). Hãy kiểm tra xem đĩa có bị đầy quá\n"
-"hay quota (hạn nghạch) bị vượt quá, và sau đó \"git reset HEAD\" để khắc "
-"phục."
+"Kho chứa đã được cập nhật, nhưng không thể ghi vào\n"
+"tập tin new_index (bảng mục lục mới). Hãy kiểm tra xem đĩa\n"
+"có bị đầy quá hay quota (hạn nghạch đĩa cứng) bị vượt quá,\n"
+"và sau đó \"git reset HEAD\" để khắc phục."
 
 #: builtin/config.c:8
 msgid "git config [options]"
@@ -4785,63 +4956,87 @@
 msgid "respect include directives on lookup"
 msgstr "tôn trọng kể cà các hướng trong tìm kiếm"
 
-#: builtin/count-objects.c:82
+#: builtin/config.c:315
+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:455
+#, c-format
+msgid ""
+"# This is Git's per-user configuration file.\n"
+"[core]\n"
+"# Please adapt and uncomment the following lines:\n"
+"#\tuser = %s\n"
+"#\temail = %s\n"
+msgstr ""
+"# Đây là tập tin cấu hình cho từng người dùng Git.\n"
+"[core]\n"
+"# Vui lòng sửa lại cho thích hợp và bỏ dấu ghi chú các dòng sau:\n"
+"#\tuser = %s\n"
+"#\temail = %s\n"
+
+#: builtin/config.c:590
+#, 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
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:97
+#: builtin/count-objects.c:65
 msgid "print sizes in human readable format"
 msgstr "hiển thị kích cỡ theo định dạng dành cho người đọc"
 
-#: builtin/describe.c:16
+#: builtin/describe.c:17
 msgid "git describe [options] <commit-ish>*"
 msgstr "git describe [các-tùy-chọn] <commit-ish>*"
 
-#: builtin/describe.c:17
+#: builtin/describe.c:18
 msgid "git describe [options] --dirty"
 msgstr "git describe [các-tùy-chọn] --dirty"
 
-#: builtin/describe.c:225
+#: builtin/describe.c:217
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "thẻ đã được ghi chú %s không sẵn để dùng"
 
-#: builtin/describe.c:229
+#: builtin/describe.c:221
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr "thẻ được chú giải %s không có tên nhúng"
 
-#: builtin/describe.c:231
+#: builtin/describe.c:223
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "thẻ “%s” đã thực sự ở đây “%s” rồi"
 
-#: builtin/describe.c:258
+#: builtin/describe.c:250 builtin/log.c:452
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "Không phải tên đối tượng %s hợp lệ"
 
-#: builtin/describe.c:261
+#: builtin/describe.c:253
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr "%s không phải là một đối tượng “%s” hợp lệ"
 
-#: builtin/describe.c:278
+#: builtin/describe.c:270
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr "không có thẻ nào khớp chính xác với “%s”"
 
-#: builtin/describe.c:280
+#: builtin/describe.c:272
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "Đang tìm kiếm để mô tả %s\n"
 
-#: builtin/describe.c:327
+#: builtin/describe.c:319
 #, c-format
 msgid "finished search at %s\n"
 msgstr "việc tìm kiếm đã kết thúc tại %s\n"
 
-#: builtin/describe.c:354
+#: builtin/describe.c:346
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -4850,7 +5045,7 @@
 "Không có thẻ được chú giải nào được mô tả là “%s”.\n"
 "Tuy nhiên, ở đây có những thẻ không được chú giải: hãy thử --tags."
 
-#: builtin/describe.c:358
+#: builtin/describe.c:350
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -4859,12 +5054,12 @@
 "Không có thẻ (tag) có thể mô tả “%s”.\n"
 "Hãy thử --always, hoặt tạo một số thẻ."
 
-#: builtin/describe.c:379
+#: builtin/describe.c:371
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "đã xuyên %lu qua lần chuyển giao\n"
 
-#: builtin/describe.c:382
+#: builtin/describe.c:374
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
@@ -4873,135 +5068,147 @@
 "tìm thấy nhiều hơn %i thẻ (tag); đã liệt kê %i gần đây nhất\n"
 "bỏ đi tìm kiếm tại %s\n"
 
-#: builtin/describe.c:404
+#: builtin/describe.c:396
 msgid "find the tag that comes after the commit"
 msgstr "tìm các thẻ mà nó đến trước lần chuyển giao"
 
-#: builtin/describe.c:405
+#: builtin/describe.c:397
 msgid "debug search strategy on stderr"
 msgstr "chiến lược tìm kiếm gỡ lỗi trên đầu ra lỗi chuẩn stderr"
 
-#: builtin/describe.c:406
+#: builtin/describe.c:398
 msgid "use any ref"
 msgstr "dùng ref bất kỳ"
 
-#: builtin/describe.c:407
+#: builtin/describe.c:399
 msgid "use any tag, even unannotated"
 msgstr "dùng thẻ bất kỳ, cả khi “unannotated”"
 
-#: builtin/describe.c:408
+#: builtin/describe.c:400
 msgid "always use long format"
 msgstr "luôn dùng định dạng dài"
 
-#: builtin/describe.c:409
+#: builtin/describe.c:401
 msgid "only follow first parent"
 msgstr "chỉ theo cha mẹ đầu tiên"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:404
 msgid "only output exact matches"
 msgstr "chỉ xuất những gì khớp chính xác"
 
-#: builtin/describe.c:414
+#: builtin/describe.c:406
 msgid "consider <n> most recent tags (default: 10)"
 msgstr "coi như  <n> thẻ gần đây nhất (mặc định: 10)"
 
-#: builtin/describe.c:416
+#: builtin/describe.c:408
 msgid "only consider tags matching <pattern>"
 msgstr "chỉ cân nhắc đến những thẻ khớp với <mẫu>"
 
-#: builtin/describe.c:418 builtin/name-rev.c:321
+#: builtin/describe.c:410 builtin/name-rev.c:318
 msgid "show abbreviated commit object as fallback"
 msgstr "hiển thị đối tượng chuyển giao vắn tắt như là fallback"
 
-#: builtin/describe.c:419
+#: builtin/describe.c:411
 msgid "mark"
 msgstr "dấu"
 
-#: builtin/describe.c:420
+#: builtin/describe.c:412
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr "thêm <dấu> trên cây thư mục làm việc bẩn (mặc định \"-dirty\")"
 
-#: builtin/describe.c:438
+#: builtin/describe.c:430
 msgid "--long is incompatible with --abbrev=0"
 msgstr "--long là xung khắc với tùy chọn --abbrev=0"
 
-#: builtin/describe.c:464
+#: builtin/describe.c:456
 msgid "No names found, cannot describe anything."
 msgstr "Không tìm thấy các tên, không thể mô tả gì cả."
 
-#: builtin/describe.c:484
+#: builtin/describe.c:476
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "--dirty là xung khắc với các tùy chọn commit-ish"
 
-#: builtin/diff.c:85
+#: builtin/diff.c:86
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "“%s”: không phải tập tin bình thường hay liên kết mềm"
 
-#: builtin/diff.c:236
+#: builtin/diff.c:237
 #, c-format
 msgid "invalid option: %s"
 msgstr "tùy chọn không hợp lệ: %s"
 
-#: builtin/diff.c:357
+#: builtin/diff.c:358
 msgid "Not a git repository"
 msgstr "Không phải là kho git"
 
-#: builtin/diff.c:400
+#: builtin/diff.c:401
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "đối tượng đã cho “%s” không hợp lệ."
 
-#: builtin/diff.c:409
+#: builtin/diff.c:410
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "đã cho nhiều hơn hai đối tượng blob: “%s”"
 
-#: builtin/diff.c:416
+#: builtin/diff.c:417
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "đã cho đối tượng không thể nắm giữ “%s”."
 
-#: builtin/fast-export.c:22
+#: builtin/fast-export.c:24
 msgid "git fast-export [rev-list-opts]"
 msgstr "git fast-export [rev-list-opts]"
 
-#: builtin/fast-export.c:673
+#: builtin/fast-export.c:979
 msgid "show progress after <n> objects"
 msgstr "hiển thị tiến triển sau <n> đối tượng"
 
-#: builtin/fast-export.c:675
+#: builtin/fast-export.c:981
 msgid "select handling of signed tags"
 msgstr "chọn điều khiển của thẻ đã ký"
 
-#: builtin/fast-export.c:678
+#: builtin/fast-export.c:984
 msgid "select handling of tags that tag filtered objects"
 msgstr "chọn sự xử lý của các thẻ, cái mà đánh thẻ các đối tượng được lọc ra"
 
-#: builtin/fast-export.c:681
+#: builtin/fast-export.c:987
 msgid "Dump marks to this file"
 msgstr "Đổ các đánh dấu này vào tập-tin"
 
-#: builtin/fast-export.c:683
+#: builtin/fast-export.c:989
 msgid "Import marks from this file"
 msgstr "nhập vào đánh dấu từ tập tin này"
 
-#: builtin/fast-export.c:685
+#: builtin/fast-export.c:991
 msgid "Fake a tagger when tags lack one"
 msgstr "Làm giả một cái thẻ khi thẻ bị thiếu một cái"
 
-#: builtin/fast-export.c:687
+#: builtin/fast-export.c:993
 msgid "Output full tree for each commit"
 msgstr "Xuất ra toàn bộ cây cho mỗi lần chuyển giao"
 
-#: builtin/fast-export.c:689
+#: builtin/fast-export.c:995
 msgid "Use the done feature to terminate the stream"
 msgstr "Sử dụng tính năng done để chấm dứt luồng dữ liệu"
 
-#: builtin/fast-export.c:690
+#: builtin/fast-export.c:996
 msgid "Skip output of blob data"
 msgstr "Bỏ qua kết xuất của dữ liệu blob"
 
+#: builtin/fast-export.c:997
+msgid "refspec"
+msgstr "refspec"
+
+#: builtin/fast-export.c:998
+msgid "Apply refspec to exported refs"
+msgstr "Áp dụng refspec cho refs đã xuất"
+
+#: builtin/fast-export.c:999
+msgid "anonymize output"
+msgstr "kết xuất anonymize"
+
 #: builtin/fetch.c:20
 msgid "git fetch [<options>] [<repository> [<refspec>...]]"
 msgstr "git fetch [<các-tùy-chọn>] [<kho-chứa> [<refspec>...]]"
@@ -5018,214 +5225,222 @@
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<các-tùy-chọn>]"
 
-#: builtin/fetch.c:75
+#: builtin/fetch.c:90
 msgid "fetch from all remotes"
 msgstr "lấy về từ tất cả các máy chủ"
 
-#: builtin/fetch.c:77
+#: builtin/fetch.c:92
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "nối thêm vào .git/FETCH_HEAD thay vì ghi đè lên nó"
 
-#: builtin/fetch.c:79
+#: builtin/fetch.c:94
 msgid "path to upload pack on remote end"
-msgstr "đường dẫn đến gói (pack) tải lên trên máy chủ cuối"
+msgstr "đường dẫn đến gói tải lên trên máy chủ cuối"
 
-#: builtin/fetch.c:80
+#: builtin/fetch.c:95
 msgid "force overwrite of local branch"
 msgstr "ép buộc ghi đè lên nhánh nội bộ"
 
-#: builtin/fetch.c:82
+#: builtin/fetch.c:97
 msgid "fetch from multiple remotes"
 msgstr "lấy từ nhiều máy chủ cùng lúc"
 
-#: builtin/fetch.c:84
+#: builtin/fetch.c:99
 msgid "fetch all tags and associated objects"
 msgstr "lấy tất cả các thẻ cùng với các đối tượng liên quan đến nó"
 
-#: builtin/fetch.c:86
+#: builtin/fetch.c:101
 msgid "do not fetch all tags (--no-tags)"
 msgstr "không lấy tất cả các thẻ (--no-tags)"
 
-#: builtin/fetch.c:88
+#: builtin/fetch.c:103
 msgid "prune remote-tracking branches no longer on remote"
 msgstr ""
 "cắt cụt (prune) các nhánh “remote-tracking” không còn tồn tại trên máy chủ "
 "nữa"
 
-#: builtin/fetch.c:89
+#: builtin/fetch.c:104
 msgid "on-demand"
 msgstr "khi-cần"
 
-#: builtin/fetch.c:90
+#: builtin/fetch.c:105
 msgid "control recursive fetching of submodules"
 msgstr "điều khiển việc lấy về đệ quy trong các mô-đun-con"
 
-#: builtin/fetch.c:94
+#: builtin/fetch.c:109
 msgid "keep downloaded pack"
-msgstr "giữ các gói đã tải về"
+msgstr "giữ lại gói đã tải về"
 
-#: builtin/fetch.c:96
+#: builtin/fetch.c:111
 msgid "allow updating of HEAD ref"
 msgstr "cho phép cập nhật th.chiếu HEAD"
 
-#: builtin/fetch.c:99
+#: builtin/fetch.c:114
 msgid "deepen history of shallow clone"
 msgstr "làm sâu hơn lịch sử của bản sao"
 
-#: builtin/fetch.c:101
+#: builtin/fetch.c:116
 msgid "convert to a complete repository"
 msgstr "chuyển đổi hoàn toàn sang kho git"
 
-#: builtin/fetch.c:103 builtin/log.c:1197
+#: builtin/fetch.c:118 builtin/log.c:1208
 msgid "dir"
 msgstr "tmục"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:119
 msgid "prepend this to submodule path output"
 msgstr "soạn sẵn cái này cho kết xuất đường dẫn mô-đun-con"
 
-#: builtin/fetch.c:107
+#: builtin/fetch.c:122
 msgid "default mode for recursion"
 msgstr "chế độ mặc định cho đệ qui"
 
-#: builtin/fetch.c:109
+#: builtin/fetch.c:124
 msgid "accept refs that update .git/shallow"
 msgstr "chấp nhận tham chiếu cập nhật .git/shallow"
 
-#: builtin/fetch.c:347
+#: builtin/fetch.c:125
+msgid "refmap"
+msgstr "refmap"
+
+#: builtin/fetch.c:126
+msgid "specify fetch refmap"
+msgstr "chỉ ra refmap cần lấy về"
+
+#: builtin/fetch.c:376
 msgid "Couldn't find remote ref HEAD"
 msgstr "Không thể tìm thấy máy chủ cho tham chiếu HEAD"
 
-#: builtin/fetch.c:411
+#: builtin/fetch.c:454
 #, c-format
 msgid "object %s not found"
 msgstr "Không tìm thấy đối tượng %s"
 
-#: builtin/fetch.c:416
+#: builtin/fetch.c:459
 msgid "[up to date]"
 msgstr "[đã cập nhật]"
 
-#: builtin/fetch.c:430
+#: builtin/fetch.c:473
 #, c-format
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr "! %-*s %-*s -> %s  (không thể fetch (lấy) về nhánh hiện hành)"
 
-#: builtin/fetch.c:431 builtin/fetch.c:517
+#: builtin/fetch.c:474 builtin/fetch.c:560
 msgid "[rejected]"
 msgstr "[Bị từ chối]"
 
-#: builtin/fetch.c:442
+#: builtin/fetch.c:485
 msgid "[tag update]"
 msgstr "[cập nhật thẻ]"
 
-#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497
+#: builtin/fetch.c:487 builtin/fetch.c:522 builtin/fetch.c:540
 msgid "  (unable to update local ref)"
-msgstr "  (không thể cập nhật tham chiếu (ref) nội bộ)"
+msgstr "  (không thể cập nhật tham chiếu nội bộ)"
 
-#: builtin/fetch.c:462
+#: builtin/fetch.c:505
 msgid "[new tag]"
 msgstr "[thẻ mới]"
 
-#: builtin/fetch.c:465
+#: builtin/fetch.c:508
 msgid "[new branch]"
 msgstr "[nhánh mới]"
 
-#: builtin/fetch.c:468
+#: builtin/fetch.c:511
 msgid "[new ref]"
 msgstr "[ref (tham chiếu) mới]"
 
-#: builtin/fetch.c:513
+#: builtin/fetch.c:556
 msgid "unable to update local ref"
-msgstr "không thể cập nhật tham chiếu (ref) nội bộ"
+msgstr "không thể cập nhật tham chiếu nội bộ"
 
-#: builtin/fetch.c:513
+#: builtin/fetch.c:556
 msgid "forced update"
 msgstr "cưỡng bức cập nhật"
 
-#: builtin/fetch.c:519
+#: builtin/fetch.c:562
 msgid "(non-fast-forward)"
 msgstr "(non-fast-forward)"
 
-#: builtin/fetch.c:552 builtin/fetch.c:785
+#: builtin/fetch.c:595 builtin/fetch.c:828
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "không thể mở %s: %s\n"
 
-#: builtin/fetch.c:561
+#: builtin/fetch.c:604
 #, 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:579
+#: builtin/fetch.c:622
 #, 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:667 builtin/fetch.c:750
+#: builtin/fetch.c:710 builtin/fetch.c:793
 #, c-format
 msgid "From %.*s\n"
 msgstr "Từ %.*s\n"
 
-#: builtin/fetch.c:678
+#: builtin/fetch.c:721
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
 " 'git remote prune %s' to remove any old, conflicting branches"
 msgstr ""
-"một số tham chiếu (refs) nội bộ không thể được cập nhật; hãy thử chạy\n"
+"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:730
+#: builtin/fetch.c:773
 #, 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:731
+#: builtin/fetch.c:774
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s đã trở thành không đầu (không được quản lý))"
 
-#: builtin/fetch.c:755
+#: builtin/fetch.c:798
 msgid "[deleted]"
 msgstr "[đã xóa]"
 
-#: builtin/fetch.c:756 builtin/remote.c:1050
+#: builtin/fetch.c:799 builtin/remote.c:1063
 msgid "(none)"
 msgstr "(không)"
 
-#: builtin/fetch.c:775
+#: builtin/fetch.c:818
 #, 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:794
+#: builtin/fetch.c:837
 #, 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:797
+#: builtin/fetch.c:840
 #, 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:853
+#: builtin/fetch.c:896
 #, 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:1015
+#: builtin/fetch.c:1058
 #, c-format
 msgid "Fetching %s\n"
-msgstr "Đang lấy về %s\n"
+msgstr "Đang lấy “%s” về\n"
 
-#: builtin/fetch.c:1017 builtin/remote.c:90
+#: builtin/fetch.c:1060 builtin/remote.c:90
 #, c-format
 msgid "Could not fetch %s"
-msgstr "không thể lấy về %s"
+msgstr "không thể “%s” về"
 
-#: builtin/fetch.c:1035
+#: builtin/fetch.c:1078
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -5233,32 +5448,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:1059
+#: builtin/fetch.c:1101
 msgid "You need to specify a tag name."
 msgstr "Bạn phải định rõ tên thẻ."
 
-#: builtin/fetch.c:1107
+#: builtin/fetch.c:1143
 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:1109
+#: builtin/fetch.c:1145
 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:1132
+#: builtin/fetch.c:1168
 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:1134
+#: builtin/fetch.c:1170
 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:1145
+#: builtin/fetch.c:1181
 #, 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:1153
+#: builtin/fetch.c:1189
 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ý"
 
@@ -5267,9 +5482,9 @@
 msgstr ""
 "git fmt-merge-msg [-m <chú_thích>] [--log[=<n>]|--no-log] [--file <tập-tin>]"
 
-#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700
-#: builtin/merge.c:196 builtin/repack.c:175 builtin/repack.c:179
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:501
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:698
+#: builtin/merge.c:197 builtin/repack.c:179 builtin/repack.c:183
+#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:590
 #: parse-options.h:132 parse-options.h:239
 msgid "n"
 msgstr "n"
@@ -5294,99 +5509,103 @@
 msgid "file to read from"
 msgstr "tập tin để đọc dữ liệu từ đó"
 
-#: builtin/for-each-ref.c:1063
+#: builtin/for-each-ref.c:676
+msgid "unable to parse format"
+msgstr "không thể phân tích định dạng"
+
+#: builtin/for-each-ref.c:1057
 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:1078
+#: builtin/for-each-ref.c:1072
 msgid "quote placeholders suitably for shells"
 msgstr "trích dẫn để phù hợp cho hệ vỏ (shell)"
 
-#: builtin/for-each-ref.c:1080
+#: builtin/for-each-ref.c:1074
 msgid "quote placeholders suitably for perl"
 msgstr "trích dẫn để phù hợp cho perl"
 
-#: builtin/for-each-ref.c:1082
+#: builtin/for-each-ref.c:1076
 msgid "quote placeholders suitably for python"
 msgstr "trích dẫn để phù hợp cho python"
 
-#: builtin/for-each-ref.c:1084
+#: builtin/for-each-ref.c:1078
 msgid "quote placeholders suitably for tcl"
 msgstr "trích dẫn để phù hợp cho tcl"
 
-#: builtin/for-each-ref.c:1087
+#: builtin/for-each-ref.c:1081
 msgid "show only <n> matched refs"
 msgstr "hiển thị chỉ <n> tham chiếu khớp"
 
-#: builtin/for-each-ref.c:1088 builtin/replace.c:177
+#: builtin/for-each-ref.c:1082 builtin/replace.c:438
 msgid "format"
 msgstr "định dạng"
 
-#: builtin/for-each-ref.c:1088
+#: builtin/for-each-ref.c:1082
 msgid "format to use for the output"
 msgstr "định dạng sẽ dùng cho đầu ra"
 
-#: builtin/for-each-ref.c:1089
+#: builtin/for-each-ref.c:1083
 msgid "key"
 msgstr "khóa"
 
-#: builtin/for-each-ref.c:1090
+#: builtin/for-each-ref.c:1084
 msgid "field name to sort on"
 msgstr "tên trường cần sắp xếp"
 
-#: builtin/fsck.c:147 builtin/prune.c:172
+#: builtin/fsck.c:147 builtin/prune.c:136
 msgid "Checking connectivity"
 msgstr "Đang kiểm tra kết nối"
 
-#: builtin/fsck.c:544
+#: builtin/fsck.c:540
 msgid "Checking object directories"
 msgstr "Đang kiểm tra các thư mục đối tượng"
 
-#: builtin/fsck.c:607
+#: builtin/fsck.c:603
 msgid "git fsck [options] [<object>...]"
 msgstr "git fsck [các-tùy-chọn] [<đối-tượng>...]"
 
-#: builtin/fsck.c:613
+#: builtin/fsck.c:609
 msgid "show unreachable objects"
 msgstr "hiển thị các đối tượng không thể đọc được"
 
-#: builtin/fsck.c:614
+#: builtin/fsck.c:610
 msgid "show dangling objects"
 msgstr "hiển thị các đối tượng không được quản lý"
 
-#: builtin/fsck.c:615
+#: builtin/fsck.c:611
 msgid "report tags"
 msgstr "báo cáo các thẻ"
 
-#: builtin/fsck.c:616
+#: builtin/fsck.c:612
 msgid "report root nodes"
 msgstr "báo cáo node gốc"
 
-#: builtin/fsck.c:617
+#: builtin/fsck.c:613
 msgid "make index objects head nodes"
-msgstr "tạo “ index objects head nodes”"
+msgstr "tạo “index objects head nodes”"
 
-#: builtin/fsck.c:618
+#: builtin/fsck.c:614
 msgid "make reflogs head nodes (default)"
-msgstr "tạo  reflogs head nodes (mặc định)"
+msgstr "tạo “reflogs head nodes” (mặc định)"
 
-#: builtin/fsck.c:619
+#: builtin/fsck.c:615
 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:620
+#: builtin/fsck.c:616
 msgid "enable more strict checking"
 msgstr "cho phép kiểm tra hạn chế hơn"
 
-#: builtin/fsck.c:622
+#: builtin/fsck.c:618
 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:623 builtin/prune.c:144
+#: builtin/fsck.c:619 builtin/prune.c:108
 msgid "show progress"
 msgstr "hiển thị quá trình"
 
-#: builtin/fsck.c:673
+#: builtin/fsck.c:669
 msgid "Checking objects"
 msgstr "Đang kiểm tra các đối tượng"
 
@@ -5394,50 +5613,50 @@
 msgid "git gc [options]"
 msgstr "git gc [các-tùy-chọn]"
 
-#: builtin/gc.c:90
+#: builtin/gc.c:79
 #, c-format
-msgid "Invalid %s: '%s'"
-msgstr "%s không hợp lệ: “%s”"
+msgid "Invalid gc.pruneexpire: '%s'"
+msgstr "gc.pruneexpire không hợp lệ: “%s”"
 
-#: builtin/gc.c:117
+#: builtin/gc.c:107
 #, 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"
+msgstr "thư mục đối tượng dài một cách điên rồ %.*s"
 
-#: builtin/gc.c:273
+#: builtin/gc.c:276
 msgid "prune unreferenced objects"
 msgstr "xóa bỏ các đối tượng không được tham chiếu"
 
-#: builtin/gc.c:275
+#: builtin/gc.c:278
 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:276
+#: builtin/gc.c:279
 msgid "enable auto-gc mode"
 msgstr "bật chế độ auto-gc"
 
-#: builtin/gc.c:277
+#: builtin/gc.c:280
 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:318
+#: builtin/gc.c:321
 #, 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:320
+#: builtin/gc.c:323
 #, 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:321
+#: builtin/gc.c:324
 #, 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:342
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5445,7 +5664,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:361
+#: builtin/gc.c:364
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -5461,231 +5680,226 @@
 msgid "grep: failed to create thread: %s"
 msgstr "grep: gặp lỗi tạo tuyến (thread): %s"
 
-#: builtin/grep.c:365
-#, c-format
-msgid "Failed to chdir: %s"
-msgstr "Gặp lỗi với lệnh chdir: %s"
-
-#: builtin/grep.c:443 builtin/grep.c:478
+#: builtin/grep.c:441 builtin/grep.c:476
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "không thể đọc cây (%s)"
 
-#: builtin/grep.c:493
+#: builtin/grep.c:491
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "không thể thực hiện lệnh grep (lọc tìm) từ đối tượng thuộc kiểu %s"
 
-#: builtin/grep.c:549
+#: builtin/grep.c:547
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "chuyển đến “%c” cần một giá trị bằng số"
 
-#: builtin/grep.c:566
+#: builtin/grep.c:564
 #, c-format
 msgid "cannot open '%s'"
 msgstr "không mở được “%s”"
 
-#: builtin/grep.c:640
+#: builtin/grep.c:638
 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:642
+#: builtin/grep.c:640
 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:644
+#: builtin/grep.c:642
 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:646
+#: builtin/grep.c:644
 msgid "search also in ignored files"
 msgstr "tìm cả trong các tập tin đã bị lờ đi"
 
-#: builtin/grep.c:649
+#: builtin/grep.c:647
 msgid "show non-matching lines"
 msgstr "hiển thị những dòng không khớp với mẫu"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:649
 msgid "case insensitive matching"
 msgstr "phân biệt HOA/thường"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:651
 msgid "match patterns only at word boundaries"
 msgstr "chỉ khớp mẫu tại đường ranh giới từ"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:653
 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:657
+#: builtin/grep.c:655
 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:660
+#: builtin/grep.c:658
 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:662
+#: builtin/grep.c:660
 msgid "descend at most <depth> levels"
 msgstr "giảm xuống ít nhất mức <sâu>"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:664
 msgid "use extended POSIX regular expressions"
 msgstr "dùng biểu thức chính qui POSIX có mở rộng"
 
-#: builtin/grep.c:669
+#: builtin/grep.c:667
 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:672
+#: builtin/grep.c:670
 msgid "interpret patterns as fixed strings"
 msgstr "diễn dịch các mẫu như là chuỗi cố định"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:673
 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:678
+#: builtin/grep.c:676
 msgid "show line numbers"
 msgstr "hiển thị số của dòng"
 
-#: builtin/grep.c:679
+#: builtin/grep.c:677
 msgid "don't show filenames"
 msgstr "không hiển thị tên tập tin"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:678
 msgid "show filenames"
 msgstr "hiển thị các tên tập tin"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:680
 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:684
+#: builtin/grep.c:682
 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:686
+#: builtin/grep.c:684
 msgid "synonym for --files-with-matches"
 msgstr "đồng nghĩa với --files-with-matches"
 
-#: builtin/grep.c:689
+#: builtin/grep.c:687
 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:691
+#: builtin/grep.c:689
 msgid "print NUL after filenames"
 msgstr "thêm NUL vào sau tên tập tin"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:691
 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:694
+#: builtin/grep.c:692
 msgid "highlight matches"
-msgstr "tô sáng cái khớp"
+msgstr "tô sáng phần khớp mẫu"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:694
 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:698
+#: builtin/grep.c:696
 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:701
+#: builtin/grep.c:699
 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:704
+#: builtin/grep.c:702
 msgid "show <n> context lines before matches"
 msgstr "hiển thị <n> dòng nội dung trước khớp"
 
-#: builtin/grep.c:706
+#: builtin/grep.c:704
 msgid "show <n> context lines after matches"
 msgstr "hiển thị <n> dòng nội dung sau khớp"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:705
 msgid "shortcut for -C NUM"
 msgstr "dạng viết tắt của -C SỐ"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:708
 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:712
+#: builtin/grep.c:710
 msgid "show the surrounding function"
 msgstr "hiển thị hàm bao quanh"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:713
 msgid "read patterns from file"
 msgstr "đọc mẫu từ tập-tin"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:715
 msgid "match <pattern>"
 msgstr "match <mẫu>"
 
-#: builtin/grep.c:719
+#: builtin/grep.c:717
 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:731
+#: builtin/grep.c:729
 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:733
+#: builtin/grep.c:731
 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:735
+#: builtin/grep.c:733
 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:739
+#: builtin/grep.c:737
 msgid "pager"
-msgstr "giấy"
+msgstr "dàn trang"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:737
 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:742
+#: builtin/grep.c:740
 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:743 builtin/show-ref.c:187
+#: builtin/grep.c:741 builtin/show-ref.c:187
 msgid "show usage"
 msgstr "hiển thị cách dùng"
 
-#: builtin/grep.c:810
+#: builtin/grep.c:808
 msgid "no pattern given."
 msgstr "chưa chỉ ra mẫu."
 
-#: builtin/grep.c:868
+#: builtin/grep.c:866
 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:891
+#: builtin/grep.c:892
 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:896
+#: builtin/grep.c:897
 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:899
+#: builtin/grep.c:900
 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:907
+#: builtin/grep.c:908
 msgid "both --cached and trees are given."
 msgstr "cả hai --cached và các cây phải được chỉ ra."
 
-#: builtin/hash-object.c:60
+#: builtin/hash-object.c:82
 msgid ""
 "git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] "
 "<file>..."
@@ -5693,31 +5907,36 @@
 "git hash-object [-t <kiểu>] [-w] [--path=<tập-tin>|--no-filters] [--stdin] "
 "[--] <tập-tin>..."
 
-#: builtin/hash-object.c:61
+#: builtin/hash-object.c:83
 msgid "git hash-object  --stdin-paths < <list-of-paths>"
 msgstr "git hash-object  --stdin-paths < <danh-sách-đường-dẫn>"
 
-#: builtin/hash-object.c:72 builtin/tag.c:521
+#: builtin/hash-object.c:94 builtin/tag.c:610
 msgid "type"
 msgstr "kiểu"
 
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr "kiểu đối tượng"
 
-#: builtin/hash-object.c:73
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr "ghi đối tượng vào dữ liệu đối tượng"
 
-#: builtin/hash-object.c:74
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr "đọc đối tượng từ đầu vào tiêu chuẩn stdin"
 
-#: builtin/hash-object.c:76
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr "lưu các tập tin mà nó không có các bộ lọc"
 
-#: builtin/hash-object.c:77
+#: builtin/hash-object.c:100
+msgid ""
+"just hash any random garbage to create corrupt objects for debugging Git"
+msgstr "chỉ cần băm rác ngẫu nhiên để tạo một đối tượng hỏng để mà gỡ lỗi Git"
+
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr "xử lý tập tin như là nó đang ở thư mục này"
 
@@ -5750,25 +5969,25 @@
 msgid "unrecognized help format '%s'"
 msgstr "không nhận ra định dạng trợ giúp “%s”"
 
-#: builtin/help.c:92
+#: builtin/help.c:91
 msgid "Failed to start emacsclient."
-msgstr "Lỗi khởi chạy emacsclient."
+msgstr "Gặp lỗi khi khởi chạy emacsclient."
 
-#: builtin/help.c:105
+#: builtin/help.c:104
 msgid "Failed to parse emacsclient version."
 msgstr "Gặp lỗi khi phân tích phiên bản emacsclient."
 
-#: builtin/help.c:113
+#: builtin/help.c:112
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "phiên bản của emacsclient “%d” quá cũ (< 22)."
 
-#: builtin/help.c:131 builtin/help.c:159 builtin/help.c:168 builtin/help.c:176
+#: builtin/help.c:130 builtin/help.c:158 builtin/help.c:167 builtin/help.c:175
 #, c-format
 msgid "failed to exec '%s': %s"
 msgstr "gặp lỗi khi thực thi “%s”: %s"
 
-#: builtin/help.c:216
+#: builtin/help.c:215
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -5777,7 +5996,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:228
+#: builtin/help.c:227
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -5786,23 +6005,27 @@
 "“%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:353
+#: builtin/help.c:352
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "“%s”: không rõ chương trình xem man."
 
-#: builtin/help.c:370
+#: builtin/help.c:369
 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:378
+#: builtin/help.c:377
 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:424
+#: builtin/help.c:423
 msgid "Defining attributes per path"
 msgstr "Định nghĩa các thuộc tính cho mỗi đường dẫn"
 
+#: builtin/help.c:424
+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:425
 msgid "A Git glossary"
 msgstr "Thuật ngữ chuyên môn Git"
@@ -5841,280 +6064,291 @@
 msgid "`git %s' is aliased to `%s'"
 msgstr "“git %s” được đặt bí danh thành “%s”"
 
-#: builtin/index-pack.c:184
+#: builtin/index-pack.c:150
+#, c-format
+msgid "unable to open %s"
+msgstr "không thể mở %s"
+
+#: builtin/index-pack.c:200
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "kiểu đối tượng không khớp tại %s"
 
-#: builtin/index-pack.c:204
-msgid "object of unexpected type"
-msgstr "đối tượng của kiểu không mong đợi"
+#: builtin/index-pack.c:220
+#, c-format
+msgid "did not receive expected object %s"
+msgstr "Không thể lấy về đối tượng cần %s"
 
-#: builtin/index-pack.c:244
+#: builtin/index-pack.c:223
+#, c-format
+msgid "object %s: expected type %s, found %s"
+msgstr "đối tượng %s: cần kiểu %s nhưng lại nhận được %s"
+
+#: builtin/index-pack.c:265
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "không thể điền vào %d byte"
 msgstr[1] "không thể điền vào %d byte"
 
-#: builtin/index-pack.c:254
+#: builtin/index-pack.c:275
 msgid "early EOF"
-msgstr "gặp kết thúc EOF quá sớm"
+msgstr "gặp kết thúc tập tin EOF quá sớm"
 
-#: builtin/index-pack.c:255
+#: builtin/index-pack.c:276
 msgid "read error on input"
 msgstr "lỗi đọc ở đầu vào"
 
-#: builtin/index-pack.c:267
+#: builtin/index-pack.c:288
 msgid "used more bytes than were available"
 msgstr "sử dụng nhiều hơn số lượng byte mà nó sẵn có"
 
-#: builtin/index-pack.c:274
+#: builtin/index-pack.c:295
 msgid "pack too large for current definition of off_t"
-msgstr "pack quá lớn so với định nghĩa hiện tại của kiểu off_t"
+msgstr "gói quá lớn so với định nghĩa hiện tại của kiểu off_t"
 
-#: builtin/index-pack.c:290
+#: builtin/index-pack.c:311
 #, c-format
 msgid "unable to create '%s'"
 msgstr "không thể tạo “%s”"
 
-#: builtin/index-pack.c:295
+#: builtin/index-pack.c:316
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "không thể mở packfile “%s”"
 
-#: builtin/index-pack.c:309
+#: builtin/index-pack.c:330
 msgid "pack signature mismatch"
-msgstr "chữ ký cho pack không khớp"
+msgstr "chữ ký cho gói không khớp"
 
-#: builtin/index-pack.c:311
+#: builtin/index-pack.c:332
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
-msgstr "không hỗ trợ phiên bản pack %<PRIu32>"
+msgstr "không hỗ trợ phiên bản gói %<PRIu32>"
 
-#: builtin/index-pack.c:329
+#: builtin/index-pack.c:350
 #, c-format
 msgid "pack has bad object at offset %lu: %s"
-msgstr "pack có đối tượng sai khoảng bù (offset) %lu: %s"
+msgstr "gói có đối tượng sai khoảng bù (offset) %lu: %s"
 
-#: builtin/index-pack.c:451
+#: builtin/index-pack.c:471
 #, c-format
 msgid "inflate returned %d"
 msgstr "xả nén trả về %d"
 
-#: builtin/index-pack.c:500
+#: builtin/index-pack.c:520
 msgid "offset value overflow for delta base object"
 msgstr "tràn giá trị khoảng bù cho đối tượng delta cơ sở"
 
-#: builtin/index-pack.c:508
+#: builtin/index-pack.c:528
 msgid "delta base offset is out of bound"
 msgstr "khoảng bù cơ sở cho delta nằm ngoài phạm vi"
 
-#: builtin/index-pack.c:516
+#: builtin/index-pack.c:536
 #, c-format
 msgid "unknown object type %d"
 msgstr "không hiểu kiểu đối tượng %d"
 
-#: builtin/index-pack.c:547
+#: builtin/index-pack.c:567
 msgid "cannot pread pack file"
-msgstr "không thể chạy hàm pread cho tập tin pack"
+msgstr "không thể chạy hàm pread cho tập tin gói"
 
-#: builtin/index-pack.c:549
+#: builtin/index-pack.c:569
 #, c-format
 msgid "premature end of pack file, %lu byte missing"
 msgid_plural "premature end of pack file, %lu bytes missing"
-msgstr[0] "tập tin pack bị kết thúc sớm, thiếu %lu byte"
-msgstr[1] "tập tin pack bị kết thúc sớm, thiếu %lu byte"
+msgstr[0] "tập tin gói bị kết thúc sớm, thiếu %lu byte"
+msgstr[1] "tập tin gói bị kết thúc sớm, thiếu %lu byte"
 
-#: builtin/index-pack.c:575
+#: builtin/index-pack.c:595
 msgid "serious inflate inconsistency"
 msgstr "sự mâu thuẫn xả nén nghiêm trọng"
 
-#: builtin/index-pack.c:666 builtin/index-pack.c:672 builtin/index-pack.c:695
-#: builtin/index-pack.c:729 builtin/index-pack.c:738
+#: builtin/index-pack.c:686 builtin/index-pack.c:692 builtin/index-pack.c:715
+#: builtin/index-pack.c:749 builtin/index-pack.c:758
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "SỰ VA CHẠM SHA1 ĐÃ XẢY RA VỚI %s!"
 
-#: builtin/index-pack.c:669 builtin/pack-objects.c:162
-#: builtin/pack-objects.c:254
+#: builtin/index-pack.c:689 builtin/pack-objects.c:164
+#: builtin/pack-objects.c:256
 #, c-format
 msgid "unable to read %s"
 msgstr "không thể đọc %s"
 
-#: builtin/index-pack.c:735
+#: builtin/index-pack.c:755
 #, c-format
 msgid "cannot read existing object %s"
 msgstr "không thể đọc đối tượng đã tồn tại %s"
 
-#: builtin/index-pack.c:749
+#: builtin/index-pack.c:769
 #, c-format
 msgid "invalid blob object %s"
 msgstr "đối tượng blob không hợp lệ %s"
 
-#: builtin/index-pack.c:763
+#: builtin/index-pack.c:783
 #, c-format
 msgid "invalid %s"
 msgstr "%s không hợp lệ"
 
-#: builtin/index-pack.c:766
+#: builtin/index-pack.c:787
 msgid "Error in object"
 msgstr "Lỗi trong đối tượng"
 
-#: builtin/index-pack.c:768
+#: builtin/index-pack.c:789
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "Không phải tất cả các đối tượng con của %s là có thể với tới được"
 
-#: builtin/index-pack.c:839 builtin/index-pack.c:869
+#: builtin/index-pack.c:861 builtin/index-pack.c:890
 msgid "failed to apply delta"
 msgstr "gặp lỗi khi áp dụng delta"
 
-#: builtin/index-pack.c:1010
+#: builtin/index-pack.c:1055
 msgid "Receiving objects"
 msgstr "Đang nhận về các đối tượng"
 
-#: builtin/index-pack.c:1010
+#: builtin/index-pack.c:1055
 msgid "Indexing objects"
 msgstr "Các đối tượng bảng mục lục"
 
-#: builtin/index-pack.c:1036
+#: builtin/index-pack.c:1081
 msgid "pack is corrupted (SHA1 mismatch)"
-msgstr "pack bị sai hỏng (SHA1 không khớp)"
+msgstr "gói bị sai hỏng (SHA1 không khớp)"
 
-#: builtin/index-pack.c:1041
+#: builtin/index-pack.c:1086
 msgid "cannot fstat packfile"
 msgstr "không thể lấy thông tin thống kê packfile"
 
-#: builtin/index-pack.c:1044
+#: builtin/index-pack.c:1089
 msgid "pack has junk at the end"
 msgstr "pack có phần thừa ở cuối"
 
-#: builtin/index-pack.c:1055
+#: builtin/index-pack.c:1100
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "lộn xộn hơn cả điên rồ khi chạy hàm parse_pack_objects()"
 
-#: builtin/index-pack.c:1078
+#: builtin/index-pack.c:1123
 msgid "Resolving deltas"
 msgstr "Đang phân giải các delta"
 
-#: builtin/index-pack.c:1088
+#: builtin/index-pack.c:1133
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "không thể tạo tuyến: %s"
 
-#: builtin/index-pack.c:1130
+#: builtin/index-pack.c:1175
 msgid "confusion beyond insanity"
 msgstr "lộn xộn hơn cả điên rồ"
 
-#: builtin/index-pack.c:1138
+#: builtin/index-pack.c:1181
 #, c-format
 msgid "completed with %d local objects"
 msgstr "đầy đủ với %d đối tượng nội bộ"
 
-#: builtin/index-pack.c:1148
+#: builtin/index-pack.c:1191
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "Tổng kiểm tra tail không như mong đợi cho %s (đĩa hỏng?)"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1195
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
-msgstr[0] "pack có %d delta chưa được giải quyết"
-msgstr[1] "pack có %d delta chưa được giải quyết"
+msgstr[0] "gói có %d delta chưa được giải quyết"
+msgstr[1] "gói có %d delta chưa được giải quyết"
 
-#: builtin/index-pack.c:1177
+#: builtin/index-pack.c:1220
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "không thể xả nén đối tượng nối thêm (%d)"
 
-#: builtin/index-pack.c:1256
+#: builtin/index-pack.c:1299
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "đối tượng nội bộ %s bị hỏng"
 
-#: builtin/index-pack.c:1280
+#: builtin/index-pack.c:1323
 msgid "error while closing pack file"
-msgstr "gặp lỗi trong khi đóng tập tin gói (pack)"
+msgstr "gặp lỗi trong khi đóng tập tin gói"
 
-#: builtin/index-pack.c:1293
+#: builtin/index-pack.c:1336
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "không thể ghi tập tin giữ lại “%s”"
 
-#: builtin/index-pack.c:1301
+#: builtin/index-pack.c:1344
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "không thể đóng tập tin giữ lại đã được ghi “%s”"
 
-#: builtin/index-pack.c:1314
+#: builtin/index-pack.c:1357
 msgid "cannot store pack file"
-msgstr "không thể lưu tập tin pack"
+msgstr "không thể lưu tập tin gói"
 
-#: builtin/index-pack.c:1325
+#: builtin/index-pack.c:1368
 msgid "cannot store index file"
 msgstr "không thể lưu trữ tập tin ghi mục lục"
 
-#: builtin/index-pack.c:1358
+#: builtin/index-pack.c:1401
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "sai pack.indexversion=%<PRIu32>"
 
-#: builtin/index-pack.c:1364
+#: builtin/index-pack.c:1407
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "số tuyến chỉ ra không hợp lệ (%d)"
 
-#: builtin/index-pack.c:1368 builtin/index-pack.c:1546
+#: builtin/index-pack.c:1411 builtin/index-pack.c:1590
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "không hỗ trợ đa tuyến, bỏ qua %s"
 
-#: builtin/index-pack.c:1426
+#: builtin/index-pack.c:1469
 #, c-format
 msgid "Cannot open existing pack file '%s'"
-msgstr "Không thể mở tập tin pack đã sẵn có “%s”"
+msgstr "Không thể mở tập tin gói đã sẵn có “%s”"
 
-#: builtin/index-pack.c:1428
+#: builtin/index-pack.c:1471
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
-msgstr "Không thể mở tập tin “pack idx” cho “%s”"
+msgstr "Không thể mở tập tin idx của gói cho “%s”"
 
-#: builtin/index-pack.c:1475
+#: builtin/index-pack.c:1518
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "không delta: %d đối tượng"
 msgstr[1] "không delta: %d đối tượng"
 
-#: builtin/index-pack.c:1482
+#: builtin/index-pack.c:1525
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "chiều dài xích = %d: %lu đối tượng"
 msgstr[1] "chiều dài xích = %d: %lu đối tượng"
 
-#: builtin/index-pack.c:1510
+#: builtin/index-pack.c:1554
 msgid "Cannot come back to cwd"
 msgstr "Không thể quay lại cwd"
 
-#: builtin/index-pack.c:1558 builtin/index-pack.c:1561
-#: builtin/index-pack.c:1573 builtin/index-pack.c:1577
+#: builtin/index-pack.c:1602 builtin/index-pack.c:1605
+#: builtin/index-pack.c:1617 builtin/index-pack.c:1621
 #, c-format
 msgid "bad %s"
 msgstr "%s sai"
 
-#: builtin/index-pack.c:1591
+#: builtin/index-pack.c:1635
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin không thể được dùng mà không có --stdin"
 
-#: builtin/index-pack.c:1595 builtin/index-pack.c:1605
+#: builtin/index-pack.c:1639 builtin/index-pack.c:1648
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
-msgstr "tên tập tin packfile “%s” không được kết thúc bằng đuôi “.pack”"
+msgstr "tên tập tin tập tin gói “%s” không được kết thúc bằng đuôi “.pack”"
 
-#: builtin/index-pack.c:1614
+#: builtin/index-pack.c:1656
 msgid "--verify with no packfile name given"
 msgstr "dùng tùy chọn --verify mà không đưa ra tên packfile"
 
@@ -6223,41 +6457,37 @@
 msgid " shared"
 msgstr " đã chia sẻ"
 
-#: builtin/init-db.c:439
-msgid "cannot tell cwd"
-msgstr "không nói chuyện được với lệnh cwd"
-
-#: builtin/init-db.c:465
+#: builtin/init-db.c:467
 msgid ""
-"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared"
-"[=<permissions>]] [directory]"
+"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
+"shared[=<permissions>]] [directory]"
 msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<thư-mục-tạm>] [--shared[=<các-"
 "quyền>]] [thư-mục]"
 
-#: builtin/init-db.c:488
+#: builtin/init-db.c:490
 msgid "permissions"
 msgstr "các quyền"
 
-#: builtin/init-db.c:489
+#: builtin/init-db.c:491
 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:491 builtin/prune-packed.c:79 builtin/repack.c:168
+#: builtin/init-db.c:493 builtin/prune-packed.c:57 builtin/repack.c:172
 msgid "be quiet"
 msgstr "im lặng"
 
-#: builtin/init-db.c:523 builtin/init-db.c:528
+#: builtin/init-db.c:525 builtin/init-db.c:530
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "không thể mkdir (tạo thư mục): %s"
 
-#: builtin/init-db.c:532
+#: builtin/init-db.c:534
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "không thể chdir (chuyển đổi thư mục) sang %s"
 
-#: builtin/init-db.c:554
+#: builtin/init-db.c:555
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -6266,15 +6496,31 @@
 "%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:578
-msgid "Cannot access current working directory"
-msgstr "Không thể truy cập thư mục làm việc hiện hành"
-
-#: builtin/init-db.c:585
+#: builtin/init-db.c:583
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "không thể truy cập cây (tree) làm việc “%s”"
 
+#: builtin/interpret-trailers.c:15
+msgid ""
+"git interpret-trailers [--trim-empty] [(--trailer <token>[(=|:)<value>])...] "
+"[<file>...]"
+msgstr ""
+"git interpret-trailers [--trim-empty] [(--trailer <thẻ>[(=|:)<giá-trị>])...] "
+"[<tập-tin>...]"
+
+#: builtin/interpret-trailers.c:25
+msgid "trim empty trailers"
+msgstr "bộ dò vết cắt bỏ phần trống rỗng"
+
+#: builtin/interpret-trailers.c:26
+msgid "trailer"
+msgstr "bộ dò vết"
+
+#: builtin/interpret-trailers.c:27
+msgid "trailer(s) to add"
+msgstr "bộ dò vết cần thêm"
+
 #: builtin/log.c:41
 msgid "git log [<options>] [<revision range>] [[--] <path>...]\n"
 msgstr "git log [<các-tùy-chọn>] [<vùng xem xét>] [[--] <đường-dẫn>...]\n"
@@ -6283,33 +6529,47 @@
 msgid "   or: git show [options] <object>..."
 msgstr "  hay: git show [các-tùy-chọn] <đối-tượng>..."
 
-#: builtin/log.c:125
+#: builtin/log.c:81
+#, c-format
+msgid "invalid --decorate option: %s"
+msgstr "tùy chọn--decorate không hợp lệ: %s"
+
+#: builtin/log.c:127
 msgid "suppress diff output"
 msgstr "chặn mọi kết xuất từ diff"
 
-#: builtin/log.c:126
+#: builtin/log.c:128
 msgid "show source"
 msgstr "hiển thị mã nguồn"
 
-#: builtin/log.c:127
+#: builtin/log.c:129
 msgid "Use mail map file"
 msgstr "Sử dụng tập tin ánh xạ thư"
 
-#: builtin/log.c:128
+#: builtin/log.c:130
 msgid "decorate options"
 msgstr "các tùy chọn trang trí"
 
-#: builtin/log.c:231
+#: builtin/log.c:133
+msgid "Process line range n,m in file, counting from 1"
+msgstr "Xử lý chỉ dòng vùng n,m trong tập tin, tính từ 1"
+
+#: builtin/log.c:229
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Kết xuất cuối cùng: %d %s\n"
 
-#: builtin/log.c:473 builtin/log.c:565
+#: builtin/log.c:458
+#, c-format
+msgid "git show %s: bad file"
+msgstr "git show %s: sai tập tin"
+
+#: builtin/log.c:472 builtin/log.c:564
 #, c-format
 msgid "Could not read object %s"
 msgstr "Không thể đọc đối tượng %s"
 
-#: builtin/log.c:589
+#: builtin/log.c:588
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Không nhận ra kiểu: %d"
@@ -6318,212 +6578,221 @@
 msgid "format.headers without value"
 msgstr "format.headers không có giá trị cụ thể"
 
-#: builtin/log.c:771
+#: builtin/log.c:773
 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:787
+#: builtin/log.c:789
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Không thể mở tập tin miếng vá: %s"
 
-#: builtin/log.c:801
+#: builtin/log.c:803
 msgid "Need exactly one range."
 msgstr "Cần chính xác một vùng."
 
-#: builtin/log.c:809
+#: builtin/log.c:811
 msgid "Not a range."
 msgstr "Không phải là một vùng."
 
-#: builtin/log.c:911
+#: builtin/log.c:919
 msgid "Cover letter needs email format"
 msgstr "“Cover letter” cần cho định dạng thư"
 
-#: builtin/log.c:987
+#: builtin/log.c:998
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "in-reply-to điên rồ: %s"
 
-#: builtin/log.c:1015
+#: builtin/log.c:1026
 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:1060
+#: builtin/log.c:1071
 msgid "Two output directories?"
 msgstr "Hai thư mục kết xuất?"
 
-#: builtin/log.c:1175
+#: builtin/log.c:1186
 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:1178
+#: builtin/log.c:1189
 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:1182
+#: builtin/log.c:1193
 msgid "print patches to standard out"
 msgstr "hiển thị miếng vá ra đầu ra chuẩn"
 
-#: builtin/log.c:1184
+#: builtin/log.c:1195
 msgid "generate a cover letter"
 msgstr "tạo bì thư"
 
-#: builtin/log.c:1186
+#: builtin/log.c:1197
 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:1187
+#: builtin/log.c:1198
 msgid "sfx"
 msgstr "sfx"
 
-#: builtin/log.c:1188
+#: builtin/log.c:1199
 msgid "use <sfx> instead of '.patch'"
 msgstr "sử dụng <sfx> thay cho “.patch”"
 
-#: builtin/log.c:1190
+#: builtin/log.c:1201
 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:1192
+#: builtin/log.c:1203
 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:1194
+#: builtin/log.c:1205
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "Dùng [<tiền-tố>] thay cho [VÁ]"
 
-#: builtin/log.c:1197
+#: builtin/log.c:1208
 msgid "store resulting files in <dir>"
 msgstr "lưu các tập tin kết quả trong <t.mục>"
 
-#: builtin/log.c:1200
+#: builtin/log.c:1211
 msgid "don't strip/add [PATCH]"
 msgstr "không strip/add [VÁ]"
 
-#: builtin/log.c:1203
+#: builtin/log.c:1214
 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:1205
+#: builtin/log.c:1216
 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:1207
+#: builtin/log.c:1218
 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:1209
+#: builtin/log.c:1220
 msgid "Messaging"
 msgstr "Lời nhắn"
 
-#: builtin/log.c:1210
+#: builtin/log.c:1221
 msgid "header"
 msgstr "đầu đề thư"
 
-#: builtin/log.c:1211
+#: builtin/log.c:1222
 msgid "add email header"
 msgstr "thêm đầu đề thư"
 
-#: builtin/log.c:1212 builtin/log.c:1214
+#: builtin/log.c:1223 builtin/log.c:1225
 msgid "email"
 msgstr "thư điện tử"
 
-#: builtin/log.c:1212
+#: builtin/log.c:1223
 msgid "add To: header"
 msgstr "thêm To: đầu đề thư"
 
-#: builtin/log.c:1214
+#: builtin/log.c:1225
 msgid "add Cc: header"
 msgstr "thêm Cc: đầu đề thư"
 
-#: builtin/log.c:1216
+#: builtin/log.c:1227
 msgid "ident"
 msgstr "thụt lề"
 
-#: builtin/log.c:1217
+#: builtin/log.c:1228
 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:1219
+#: builtin/log.c:1230
 msgid "message-id"
 msgstr "message-id"
 
-#: builtin/log.c:1220
+#: builtin/log.c:1231
 msgid "make first mail a reply to <message-id>"
 msgstr "dùng thư đầu tiên để trả lời <message-id>"
 
-#: builtin/log.c:1221 builtin/log.c:1224
+#: builtin/log.c:1232 builtin/log.c:1235
 msgid "boundary"
 msgstr "ranh giới"
 
-#: builtin/log.c:1222
+#: builtin/log.c:1233
 msgid "attach the patch"
 msgstr "đính kèm miếng vá"
 
-#: builtin/log.c:1225
+#: builtin/log.c:1236
 msgid "inline the patch"
 msgstr "dùng miếng vá làm nội dung"
 
-#: builtin/log.c:1229
+#: builtin/log.c:1240
 msgid "enable message threading, styles: shallow, deep"
 msgstr "cho phép luồng lời nhắn, kiểu: “shallow”, “deep”"
 
-#: builtin/log.c:1231
+#: builtin/log.c:1242
 msgid "signature"
 msgstr "chữ ký"
 
-#: builtin/log.c:1232
+#: builtin/log.c:1243
 msgid "add a signature"
 msgstr "thêm chữ ký"
 
-#: builtin/log.c:1233
+#: builtin/log.c:1245
+msgid "add a signature from a file"
+msgstr "thêm chữ ký từ một tập tin"
+
+#: builtin/log.c:1246
 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:1307
+#: builtin/log.c:1320
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "dòng thụt lề không hợp lệ: %s"
 
-#: builtin/log.c:1322
+#: builtin/log.c:1335
 msgid "-n and -k are mutually exclusive."
 msgstr "-n và  -k loại từ lẫn nhau."
 
-#: builtin/log.c:1324
+#: builtin/log.c:1337
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "--subject-prefix và -k xung khắc nhau."
 
-#: builtin/log.c:1332
+#: builtin/log.c:1345
 msgid "--name-only does not make sense"
 msgstr "--name-only không hợp lý"
 
-#: builtin/log.c:1334
+#: builtin/log.c:1347
 msgid "--name-status does not make sense"
 msgstr "--name-status không hợp lý"
 
-#: builtin/log.c:1336
+#: builtin/log.c:1349
 msgid "--check does not make sense"
 msgstr "--check không hợp lý"
 
-#: builtin/log.c:1359
+#: builtin/log.c:1372
 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:1361
+#: builtin/log.c:1374
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Không thể tạo thư mục “%s”"
 
-#: builtin/log.c:1509
+#: builtin/log.c:1472
+#, c-format
+msgid "unable to read signature file '%s'"
+msgstr "không thể đọc tập tin chữ ký “%s”"
+
+#: builtin/log.c:1535
 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:1558
+#: builtin/log.c:1583
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
-msgstr "git cherry [-v] [<thượng-nguồn> [<head> [<giới-hạn>]]]"
+msgstr "git cherry [-v] [<thượng-nguồn> [<đầu> [<giới-hạn>]]]"
 
-#: builtin/log.c:1613
+#: builtin/log.c:1638
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -6531,7 +6800,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:1626 builtin/log.c:1628 builtin/log.c:1640
+#: builtin/log.c:1651 builtin/log.c:1653 builtin/log.c:1665
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Không hiểu lần chuyển giao %s"
@@ -6579,7 +6848,7 @@
 msgstr "hiển thị các tập tin trên hệ thống tập tin mà nó cần được gỡ bỏ"
 
 #: builtin/ls-files.c:477
-msgid "show 'other' directories' name only"
+msgid "show 'other' directories' names only"
 msgstr "chỉ hiển thị tên của các thư mục “khác”"
 
 #: builtin/ls-files.c:480
@@ -6667,99 +6936,99 @@
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr "liệt kê cây mục tin; không chỉ thư mục hiện hành (ngụ ý --full-name)"
 
-#: builtin/merge.c:43
+#: builtin/merge.c:44
 msgid "git merge [options] [<commit>...]"
 msgstr "git merge [các-tùy-chọn] [<commit>...]"
 
-#: builtin/merge.c:44
+#: builtin/merge.c:45
 msgid "git merge [options] <msg> HEAD <commit>"
 msgstr "git merge [các-tùy-chọn] <tin-nhắn> HEAD <commit>"
 
-#: builtin/merge.c:45
+#: builtin/merge.c:46
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:98
+#: builtin/merge.c:99
 msgid "switch `m' requires a value"
 msgstr "switch “m” yêu cầu một giá trị"
 
-#: builtin/merge.c:135
+#: builtin/merge.c:136
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "Không tìm thấy chiến lược hòa trộn “%s”.\n"
 
-#: builtin/merge.c:136
+#: builtin/merge.c:137
 #, c-format
 msgid "Available strategies are:"
 msgstr "Các chiến lược sẵn sàng là:"
 
-#: builtin/merge.c:141
+#: builtin/merge.c:142
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Các chiến lược tùy chỉnh sẵn sàng là:"
 
-#: builtin/merge.c:191
+#: builtin/merge.c:192
 msgid "do not show a diffstat at the end of the merge"
 msgstr "không hiển thị thống kê khác biệt tại cuối của lần hòa trộn"
 
-#: builtin/merge.c:194
+#: builtin/merge.c:195
 msgid "show a diffstat at the end of the merge"
 msgstr "hiển thị thống kê khác biệt tại cuối của hòa trộn"
 
-#: builtin/merge.c:195
+#: builtin/merge.c:196
 msgid "(synonym to --stat)"
 msgstr "(đồng nghĩa với --stat)"
 
-#: builtin/merge.c:197
+#: builtin/merge.c:198
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr "thêm (ít nhất <n>) mục từ shortlog cho ghi chú chuyển giao hòa trộn"
 
-#: builtin/merge.c:200
+#: builtin/merge.c:201
 msgid "create a single commit instead of doing a merge"
 msgstr "tạo một lần chuyển giao đưon thay vì thực hiện việc hòa trộn"
 
-#: builtin/merge.c:202
+#: builtin/merge.c:203
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "thực hiện chuyển giao nếu hòa trộn thành công (mặc định)"
 
-#: builtin/merge.c:204
+#: builtin/merge.c:205
 msgid "edit message before committing"
 msgstr "sửa chú thích trước khi chuyển giao"
 
-#: builtin/merge.c:205
+#: builtin/merge.c:206
 msgid "allow fast-forward (default)"
 msgstr "cho phép fast-forward (mặc định)"
 
-#: builtin/merge.c:207
+#: builtin/merge.c:208
 msgid "abort if fast-forward is not possible"
 msgstr "bỏ qua nếu fast-forward không thể được"
 
-#: builtin/merge.c:211
+#: builtin/merge.c:212
 msgid "Verify that the named commit has a valid GPG signature"
 msgstr "Thẩm tra xem lần chuyển giao có tên đó có chữ ký GPG hợp lệ hay không"
 
-#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
+#: builtin/merge.c:213 builtin/notes.c:741 builtin/revert.c:89
 msgid "strategy"
 msgstr "chiến lược"
 
-#: builtin/merge.c:213
+#: builtin/merge.c:214
 msgid "merge strategy to use"
 msgstr "chiến lược hòa trộn sẽ dùng"
 
-#: builtin/merge.c:214
+#: builtin/merge.c:215
 msgid "option=value"
 msgstr "tùy_chọn=giá_trị"
 
-#: builtin/merge.c:215
+#: builtin/merge.c:216
 msgid "option for selected merge strategy"
 msgstr "tùy chọn cho chiến lược hòa trộn đã chọn"
 
-#: builtin/merge.c:217
+#: builtin/merge.c:218
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr ""
 "hòa trộn ghi chú của lần chuyển giao (dành cho hòa trộn non-fast-forward)"
 
-#: builtin/merge.c:221
+#: builtin/merge.c:222
 msgid "abort the current in-progress merge"
 msgstr "bãi bỏ quá trình hòa trộn hiện tại đang thực hiện"
 
@@ -6816,33 +7085,33 @@
 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/merge.c:681
+#: builtin/merge.c:677
 msgid "Not handling anything other than two heads merge."
 msgstr "Không cầm nắm gì ngoài hai head hòa trộn"
 
-#: builtin/merge.c:695
+#: builtin/merge.c:691
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Không hiểu tùy chọn cho merge-recursive: -X%s"
 
-#: builtin/merge.c:709
+#: builtin/merge.c:704
 #, c-format
 msgid "unable to write %s"
 msgstr "không thể ghi %s"
 
-#: builtin/merge.c:798
+#: builtin/merge.c:793
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "Không thể đọc từ “%s”"
 
-#: builtin/merge.c:807
+#: builtin/merge.c:802
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 "Vẫn chưa hòa trộn các lần chuyển giao; sử dụng lệnh “git commit” để hoàn tất "
 "việc hòa trộn.\n"
 
-#: builtin/merge.c:813
+#: builtin/merge.c:808
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -6860,166 +7129,166 @@
 "rỗng\n"
 "sẽ hủy bỏ lần chuyển giao.\n"
 
-#: builtin/merge.c:837
+#: builtin/merge.c:832
 msgid "Empty commit message."
 msgstr "Chú thích của lần commit (chuyển giao) bị trống rỗng."
 
-#: builtin/merge.c:849
+#: builtin/merge.c:844
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Thần kỳ.\n"
 
-#: builtin/merge.c:914
+#: builtin/merge.c:907
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 "Việc tự động hòa trộn gặp lỗi; hãy sửa các xung đột sau đó chuyển giao kết "
 "quả.\n"
 
-#: builtin/merge.c:930
+#: builtin/merge.c:923
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "%s không phải là một lần commit (chuyển giao)"
 
-#: builtin/merge.c:971
+#: builtin/merge.c:964
 msgid "No current branch."
 msgstr "không phải nhánh hiện hành"
 
-#: builtin/merge.c:973
+#: builtin/merge.c:966
 msgid "No remote for the current branch."
 msgstr "Không có máy chủ cho nhánh hiện hành."
 
-#: builtin/merge.c:975
+#: builtin/merge.c:968
 msgid "No default upstream defined for the current branch."
 msgstr "Không có thượng nguồn mặc định được định nghĩa cho nhánh hiện hành."
 
-#: builtin/merge.c:980
+#: builtin/merge.c:973
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Không nhánh mạng theo dõi cho %s từ %s"
 
-#: builtin/merge.c:1136
+#: builtin/merge.c:1129
 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:1152 git-pull.sh:31
+#: builtin/merge.c:1145
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
-"Please, commit your changes before you can merge."
+"Please, commit your changes before you merge."
 msgstr ""
-"Bạn chưa kết thúc việc hòa trộng (MERGE_HEAD vẫn tồn tại).\n"
+"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:1155 git-pull.sh:34
+#: builtin/merge.c:1148 git-pull.sh:34
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Bạn chưa kết thúc việc hòa trộng (MERGE_HEAD vẫn tồn tại)."
 
-#: builtin/merge.c:1159
+#: builtin/merge.c:1152
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
-"Please, commit your changes before you can merge."
+"Please, commit your changes before you merge."
 msgstr ""
 "Bạn chưa kết thúc việc cherry-pick (CHERRY_PICK_HEAD vẫn tồn tại).\n"
 "Hãy chuyển giao các thay đổi trước khi bạn có thể hòa trộn."
 
-#: builtin/merge.c:1162
+#: builtin/merge.c:1155
 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:1171
+#: builtin/merge.c:1164
 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:1180
+#: builtin/merge.c:1173
 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:1212
+#: builtin/merge.c:1205
 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:1215
+#: builtin/merge.c:1208
 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:1217
+#: builtin/merge.c:1210
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
 "Chuyển giao không-fast-forward không hợp lý ở trong một head trống rỗng"
 
-#: builtin/merge.c:1222
+#: builtin/merge.c:1215
 #, 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:1273
+#: builtin/merge.c:1266
 #, 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:1276
+#: builtin/merge.c:1269
 #, 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:1279
+#: builtin/merge.c:1272
 #, 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:1282
+#: builtin/merge.c:1275
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "Lần chuyển giao %s có một chữ ký GPG tốt bởi %s\n"
 
-#: builtin/merge.c:1366
+#: builtin/merge.c:1356
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Đang cập nhật %s..%s\n"
 
-#: builtin/merge.c:1405
+#: builtin/merge.c:1395
 #, 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:1412
+#: builtin/merge.c:1402
 #, c-format
 msgid "Nope.\n"
 msgstr "Không.\n"
 
-#: builtin/merge.c:1444
+#: builtin/merge.c:1434
 msgid "Not possible to fast-forward, aborting."
 msgstr "Thực hiện lệnh fast-forward là không thể được, đang bỏ qua."
 
-#: builtin/merge.c:1467 builtin/merge.c:1546
+#: builtin/merge.c:1457 builtin/merge.c:1536
 #, 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:1471
+#: builtin/merge.c:1461
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Đang thử chiến lược hòa trộn %s...\n"
 
-#: builtin/merge.c:1537
+#: builtin/merge.c:1527
 #, 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:1539
+#: builtin/merge.c:1529
 #, 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:1548
+#: builtin/merge.c:1538
 #, 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:1560
+#: builtin/merge.c:1550
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -7126,77 +7395,81 @@
 msgid "git mv [options] <source>... <destination>"
 msgstr "git mv [các-tùy-chọn] <nguồn>... <đích>"
 
+#: builtin/mv.c:69
+#, c-format
+msgid "Directory %s is in index and no submodule?"
+msgstr "Thư mục “%s” có ở trong chỉ mục mà không có mô-đun con?"
+
 #: builtin/mv.c:71
+msgid "Please stage your changes to .gitmodules or stash them to proceed"
+msgstr ""
+"Hãy đưa các thay đổi của bạn vào .gitmodules hay tạm cất chúng đi để xử lý"
+
+#: builtin/mv.c:89
+#, c-format
+msgid "%.*s is in index"
+msgstr "%.*s trong bảng mục lục"
+
+#: builtin/mv.c:111
 msgid "force move/rename even if target exists"
 msgstr "ép buộc di chuyển hay đổi tên thậm chí cả khi đích đã tồn tại"
 
-#: builtin/mv.c:72
+#: builtin/mv.c:112
 msgid "skip move/rename errors"
 msgstr "bỏ qua các lỗi liên quan đến di chuyển, đổi tên"
 
-#: builtin/mv.c:122
+#: builtin/mv.c:151
+#, c-format
+msgid "destination '%s' is not a directory"
+msgstr "có đích “%s” nhưng đây không phải là một thư mục"
+
+#: builtin/mv.c:162
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr "Đang kiểm tra việc đổi tên của “%s” thành “%s”\n"
 
-#: builtin/mv.c:126
+#: builtin/mv.c:166
 msgid "bad source"
 msgstr "nguồn sai"
 
-#: builtin/mv.c:129
+#: builtin/mv.c:169
 msgid "can not move directory into itself"
 msgstr "không thể di chuyển một thư mục vào trong chính nó được"
 
-#: builtin/mv.c:132
+#: builtin/mv.c:172
 msgid "cannot move directory over file"
 msgstr "không di chuyển được thư mục thông qua tập tin"
 
-#: builtin/mv.c:138
-#, c-format
-msgid "Huh? Directory %s is in index and no submodule?"
-msgstr "Hả? Thư mục “%s” trong chỉ mục và không mô-đun con?"
-
-#: builtin/mv.c:140 builtin/rm.c:318
-msgid "Please, stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-"Vui lòng đưa các thay đổi của bạn vào “.gitmodules” hay tạm cất chúng đi để "
-"xử lý"
-
-#: builtin/mv.c:156
-#, c-format
-msgid "Huh? %.*s is in index?"
-msgstr "Hả? %.*s trong bảng mục lục à?"
-
-#: builtin/mv.c:169
+#: builtin/mv.c:181
 msgid "source directory is empty"
 msgstr "thư mục nguồn là trống rỗng"
 
-#: builtin/mv.c:205
+#: builtin/mv.c:206
 msgid "not under version control"
 msgstr "không nằm dưới sự quản lý mã nguồn"
 
-#: builtin/mv.c:207
+#: builtin/mv.c:209
 msgid "destination exists"
 msgstr "đích đã tồn tại sẵn rồi"
 
-#: builtin/mv.c:215
+#: builtin/mv.c:217
 #, c-format
 msgid "overwriting '%s'"
 msgstr "đang ghi đè lên “%s”"
 
-#: builtin/mv.c:218
+#: builtin/mv.c:220
 msgid "Cannot overwrite"
 msgstr "Không thể ghi đè"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:223
 msgid "multiple sources for the same target"
 msgstr "Nhiều nguồn cho cùng một đích"
 
-#: builtin/mv.c:223
+#: builtin/mv.c:225
 msgid "destination directory does not exist"
 msgstr "thư mục đích không tồn tại"
 
-#: builtin/mv.c:243
+#: builtin/mv.c:232
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, nguồn=%s, đích=%s"
@@ -7206,49 +7479,49 @@
 msgid "Renaming %s to %s\n"
 msgstr "Đổi tên %s thành %s\n"
 
-#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:358
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "gặp lỗi khi đổi tên “%s”"
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:255
 msgid "git name-rev [options] <commit>..."
 msgstr "git name-rev [các-tùy-chọn] <commit>..."
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:256
 msgid "git name-rev [options] --all"
 msgstr "git name-rev [các-tùy-chọn] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:257
 msgid "git name-rev [options] --stdin"
 msgstr "git name-rev [các-tùy-chọn] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:309
 msgid "print only names (no SHA-1)"
 msgstr "chỉ hiển thị tên (không SHA-1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:310
 msgid "only use tags to name the commits"
 msgstr "chỉ dùng các thẻ để đặt tên cho các lần chuyển giao"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:312
 msgid "only use refs matching <pattern>"
-msgstr "chỉ sử dụng các tham chiếu (refs) khớp với <mẫu>"
+msgstr "chỉ sử dụng các tham chiếu khớp với <mẫu>"
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:314
 msgid "list all commits reachable from all refs"
 msgstr ""
 "liệt kê tất cả các lần chuyển giao có thể đọc được từ tất cả các tham chiếu"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:315
 msgid "read from stdin"
 msgstr "đọc từ đầu vào tiêu chuẩn"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:316
 msgid "allow to print `undefined` names (default)"
 msgstr "cho phép in các tên “chưa định nghĩa” (mặc định)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:322
 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ộ)"
 
@@ -7362,119 +7635,119 @@
 msgid "git notes get-ref"
 msgstr "git notes get-ref"
 
-#: builtin/notes.c:137
+#: builtin/notes.c:136
 #, c-format
 msgid "unable to start 'show' for object '%s'"
 msgstr "không thể khởi chạy “show” cho đối tượng “%s”"
 
-#: builtin/notes.c:141
+#: builtin/notes.c:140
 msgid "could not read 'show' output"
 msgstr "không thể đọc kết xuất “show”"
 
-#: builtin/notes.c:149
+#: builtin/notes.c:148
 #, c-format
 msgid "failed to finish 'show' for object '%s'"
 msgstr "gặp lỗi khi hoàn thành “show” cho đối tượng “%s”"
 
-#: builtin/notes.c:167 builtin/tag.c:373
+#: builtin/notes.c:166 builtin/tag.c:477
 #, c-format
 msgid "could not create file '%s'"
 msgstr "không thể tạo tập tin “%s”"
 
-#: builtin/notes.c:186
+#: builtin/notes.c:185
 msgid "Please supply the note contents using either -m or -F option"
 msgstr ""
 "Xin hãy áp dụng nội dung của ghi chú sử dụng hoặc là tùy chọn -m hoặc là -F"
 
-#: builtin/notes.c:207 builtin/notes.c:848
+#: builtin/notes.c:206 builtin/notes.c:847
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Đang gỡ bỏ ghi chú (note) cho đối tượng %s\n"
 
-#: builtin/notes.c:212
+#: builtin/notes.c:211
 msgid "unable to write note object"
 msgstr "không thể ghi đối tượng ghi chú (note)"
 
-#: builtin/notes.c:214
+#: builtin/notes.c:213
 #, c-format
-msgid "The note contents has been left in %s"
+msgid "The note contents have been left in %s"
 msgstr "Nội dung ghi chú còn lại %s"
 
-#: builtin/notes.c:248 builtin/tag.c:604
+#: builtin/notes.c:247 builtin/tag.c:693
 #, c-format
 msgid "cannot read '%s'"
 msgstr "không thể đọc “%s”"
 
-#: builtin/notes.c:250 builtin/tag.c:607
+#: builtin/notes.c:249 builtin/tag.c:696
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "không thể mở hay đọc “%s”"
 
-#: builtin/notes.c:269 builtin/notes.c:320 builtin/notes.c:322
-#: builtin/notes.c:382 builtin/notes.c:436 builtin/notes.c:519
-#: builtin/notes.c:524 builtin/notes.c:599 builtin/notes.c:641
-#: builtin/notes.c:843 builtin/tag.c:620
+#: builtin/notes.c:268 builtin/notes.c:319 builtin/notes.c:321
+#: builtin/notes.c:381 builtin/notes.c:435 builtin/notes.c:518
+#: builtin/notes.c:523 builtin/notes.c:598 builtin/notes.c:640
+#: builtin/notes.c:842 builtin/tag.c:709
 #, 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 (ref) hợp lệ."
+msgstr "Gặp lỗi khi phân giải “%s” như là một tham chiếu hợp lệ."
 
-#: builtin/notes.c:272
+#: builtin/notes.c:271
 #, c-format
 msgid "Failed to read object '%s'."
 msgstr "Gặp lỗi khi đọc đối tượng “%s”."
 
-#: builtin/notes.c:276
+#: builtin/notes.c:275
 #, c-format
 msgid "Cannot read note data from non-blob object '%s'."
-msgstr "không thể đọc dữ liệu ghi chú từ đối tượng không-blob '%s'."
+msgstr "không thể đọc dữ liệu ghi chú từ đối tượng không-blob “%s”."
 
-#: builtin/notes.c:316
+#: builtin/notes.c:315
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "Dòng đầu vào dị hình: “%s”."
 
-#: builtin/notes.c:331
+#: builtin/notes.c:330
 #, 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/notes.c:375 builtin/notes.c:429 builtin/notes.c:502
-#: builtin/notes.c:514 builtin/notes.c:587 builtin/notes.c:634
-#: builtin/notes.c:908
+#: builtin/notes.c:374 builtin/notes.c:428 builtin/notes.c:501
+#: builtin/notes.c:513 builtin/notes.c:586 builtin/notes.c:633
+#: builtin/notes.c:907
 msgid "too many parameters"
 msgstr "quá nhiều đối số"
 
-#: builtin/notes.c:388 builtin/notes.c:647
+#: builtin/notes.c:387 builtin/notes.c:646
 #, c-format
 msgid "No note found for object %s."
 msgstr "không tìm thấy ghi chú cho đối tượng %s."
 
-#: builtin/notes.c:410 builtin/notes.c:567
+#: builtin/notes.c:409 builtin/notes.c:566
 msgid "note contents as a string"
 msgstr "nội dung ghi chú (note) nằm trong một chuỗi"
 
-#: builtin/notes.c:413 builtin/notes.c:570
+#: builtin/notes.c:412 builtin/notes.c:569
 msgid "note contents in a file"
 msgstr "nội dung ghi chú (note) nằm trong một tập tin"
 
-#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
-#: builtin/notes.c:575 builtin/tag.c:539
+#: builtin/notes.c:414 builtin/notes.c:417 builtin/notes.c:571
+#: builtin/notes.c:574 builtin/tag.c:628
 msgid "object"
 msgstr "đối tượng"
 
-#: builtin/notes.c:416 builtin/notes.c:573
+#: builtin/notes.c:415 builtin/notes.c:572
 msgid "reuse and edit specified note object"
 msgstr "dùng lại nhưng có sửa chữa đối tượng note đã chỉ ra"
 
-#: builtin/notes.c:419 builtin/notes.c:576
+#: builtin/notes.c:418 builtin/notes.c:575
 msgid "reuse specified note object"
 msgstr "dùng lại đối tượng ghi chú (note) đã chỉ ra"
 
-#: builtin/notes.c:421 builtin/notes.c:489
+#: builtin/notes.c:420 builtin/notes.c:488
 msgid "replace existing notes"
 msgstr "thay thế ghi chú trước"
 
-#: builtin/notes.c:455
+#: builtin/notes.c:454
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7483,24 +7756,24 @@
 "Không thể thêm các ghi chú. Đã tìm thấy các ghi chú đã có sẵn cho đối tượng "
 "%s. Sử dụng tùy chọn “-f” để ghi đè lên các ghi chú cũ"
 
-#: builtin/notes.c:460 builtin/notes.c:537
+#: builtin/notes.c:459 builtin/notes.c:536
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Đang ghi đè lên ghi chú cũ cho đối tượng %s\n"
 
-#: builtin/notes.c:490
+#: builtin/notes.c:489
 msgid "read objects from stdin"
 msgstr "đọc các đối tượng từ đầu vào tiêu chuẩn"
 
-#: builtin/notes.c:492
+#: builtin/notes.c:491
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr "tải cấu hình chép lại cho <lệnh> (ngầm định là --stdin)"
 
-#: builtin/notes.c:510
+#: builtin/notes.c:509
 msgid "too few parameters"
 msgstr "quá ít đối số"
 
-#: builtin/notes.c:531
+#: builtin/notes.c:530
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7509,12 +7782,12 @@
 "Không thể sao chép các ghi chú. Đã tìm thấy các ghi chú đã có sẵn cho đối "
 "tượng %s. Sử dụng tùy chọn “-f” để ghi đè lên các ghi chú cũ"
 
-#: builtin/notes.c:543
+#: builtin/notes.c:542
 #, c-format
 msgid "Missing notes on source object %s. Cannot copy."
 msgstr "Thiếu ghi chú trên đối tượng nguồn %s. Không thể sao chép."
 
-#: builtin/notes.c:592
+#: builtin/notes.c:591
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -7523,15 +7796,15 @@
 "Các tùy chọn -m/-F/-c/-C đã cổ không còn dùng nữa cho lệnh con “edit”.\n"
 "Xin hãy sử dụng lệnh sau để thay thế: “git notes add -f -m/-F/-c/-C”.\n"
 
-#: builtin/notes.c:739
+#: builtin/notes.c:738
 msgid "General options"
 msgstr "Tùy chọn chung"
 
-#: builtin/notes.c:741
+#: builtin/notes.c:740
 msgid "Merge options"
 msgstr "Tùy chọn về hòa trộn"
 
-#: builtin/notes.c:743
+#: builtin/notes.c:742
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -7539,229 +7812,233 @@
 "phân giải các xung đột “notes” sử dụng chiến lược đã đưa ra (manual/ours/"
 "theirs/union/cat_sort_uniq)"
 
-#: builtin/notes.c:745
+#: builtin/notes.c:744
 msgid "Committing unmerged notes"
 msgstr "Chuyển giao các note chưa được hòa trộn"
 
-#: builtin/notes.c:747
+#: builtin/notes.c:746
 msgid "finalize notes merge by committing unmerged notes"
 msgstr ""
 "các note cuối cùng được hòa trộn bởi các note chưa hòa trộn của lần chuyển "
 "giao"
 
-#: builtin/notes.c:749
+#: builtin/notes.c:748
 msgid "Aborting notes merge resolution"
 msgstr "Hủy bỏ phân giải ghi chú (note) hòa trộn"
 
-#: builtin/notes.c:751
+#: builtin/notes.c:750
 msgid "abort notes merge"
 msgstr "bỏ qua hòa trộn các ghi chú (note)"
 
-#: builtin/notes.c:846
+#: builtin/notes.c:845
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "Đối tượng %s không có ghi chú (note)\n"
 
-#: builtin/notes.c:858
+#: builtin/notes.c:857
 msgid "attempt to remove non-existent note is not an error"
 msgstr "cố gắng gỡ bỏ một note chưa từng tồn tại không phải là một lỗi"
 
-#: builtin/notes.c:861
+#: builtin/notes.c:860
 msgid "read object names from the standard input"
 msgstr "đọc tên đối tượng từ thiết bị nhập chuẩn"
 
-#: builtin/notes.c:942
+#: builtin/notes.c:941
 msgid "notes-ref"
 msgstr "notes-ref"
 
-#: builtin/notes.c:943
+#: builtin/notes.c:942
 msgid "use notes from <notes_ref>"
 msgstr "dùng “notes” từ <notes_ref>"
 
-#: builtin/notes.c:978 builtin/remote.c:1593
+#: builtin/notes.c:977 builtin/remote.c:1624
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Không hiểu câu lệnh con: %s"
 
-#: builtin/pack-objects.c:25
+#: builtin/pack-objects.c:28
 msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
 msgstr ""
 "git pack-objects --stdout [các-tùy-chọn...] [< danh-sách-ref | < danh-sách-"
 "đối-tượng]"
 
-#: builtin/pack-objects.c:26
+#: builtin/pack-objects.c:29
 msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
 msgstr ""
 "git pack-objects [các-tùy-chọn...] base-name [< danh-sách-ref | < danh-sách-"
 "đối-tượng]"
 
-#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
+#: builtin/pack-objects.c:177 builtin/pack-objects.c:180
 #, c-format
 msgid "deflate error (%d)"
 msgstr "lỗi giải nén (%d)"
 
-#: builtin/pack-objects.c:771
+#: builtin/pack-objects.c:773
 msgid "Writing objects"
 msgstr "Đang ghi lại các đối tượng"
 
-#: builtin/pack-objects.c:1012
+#: builtin/pack-objects.c:1015
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr "tắt ghi bitmap, như vậy một số đối tượng sẽ không được đóng gói"
 
-#: builtin/pack-objects.c:2174
+#: builtin/pack-objects.c:2175
 msgid "Compressing objects"
 msgstr "Đang nén các đối tượng"
 
-#: builtin/pack-objects.c:2530
+#: builtin/pack-objects.c:2572
 #, c-format
 msgid "unsupported index version %s"
 msgstr "phiên bản mục lục không được hỗ trợ %s"
 
-#: builtin/pack-objects.c:2534
+#: builtin/pack-objects.c:2576
 #, c-format
 msgid "bad index version '%s'"
 msgstr "phiên bản mục lục sai “%s”"
 
-#: builtin/pack-objects.c:2557
+#: builtin/pack-objects.c:2599
 #, c-format
 msgid "option %s does not accept negative form"
 msgstr "tùy chọn %s không chấp nhận dạng thức âm"
 
-#: builtin/pack-objects.c:2561
+#: builtin/pack-objects.c:2603
 #, c-format
 msgid "unable to parse value '%s' for option %s"
 msgstr "không thể phân tích giá trị “%s” cho tùy chọn %s"
 
-#: builtin/pack-objects.c:2580
+#: builtin/pack-objects.c:2622
 msgid "do not show progress meter"
 msgstr "không hiển thị bộ đo tiến trình"
 
-#: builtin/pack-objects.c:2582
+#: builtin/pack-objects.c:2624
 msgid "show progress meter"
 msgstr "hiển thị bộ đo tiến trình"
 
-#: builtin/pack-objects.c:2584
+#: builtin/pack-objects.c:2626
 msgid "show progress meter during object writing phase"
 msgstr "hiển thị bộ đo tiến triển trong suốt pha ghi đối tượng"
 
-#: builtin/pack-objects.c:2587
+#: builtin/pack-objects.c:2629
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "tương tự --all-progress khi bộ đo tiến trình được xuất hiện"
 
-#: builtin/pack-objects.c:2588
+#: builtin/pack-objects.c:2630
 msgid "version[,offset]"
 msgstr "phiên bản[,offset]"
 
-#: builtin/pack-objects.c:2589
+#: builtin/pack-objects.c:2631
 msgid "write the pack index file in the specified idx format version"
 msgstr "ghi tập tin bảng mục lục gói (pack) ở phiên bản định dạng idx đã cho"
 
-#: builtin/pack-objects.c:2592
+#: builtin/pack-objects.c:2634
 msgid "maximum size of each output pack file"
 msgstr "kcíh thước tối đa cho tập tin gói được tạo"
 
-#: builtin/pack-objects.c:2594
+#: builtin/pack-objects.c:2636
 msgid "ignore borrowed objects from alternate object store"
 msgstr "bỏ qua các đối tượng vay mượn từ kho đối tượng thay thế"
 
-#: builtin/pack-objects.c:2596
+#: builtin/pack-objects.c:2638
 msgid "ignore packed objects"
 msgstr "bỏ qua các đối tượng đóng gói"
 
-#: builtin/pack-objects.c:2598
+#: builtin/pack-objects.c:2640
 msgid "limit pack window by objects"
 msgstr "giới hạn cửa sổ đóng gói theo đối tượng"
 
-#: builtin/pack-objects.c:2600
+#: builtin/pack-objects.c:2642
 msgid "limit pack window by memory in addition to object limit"
 msgstr "giới hạn cửa sổ đóng gói theo bộ nhớ cộng thêm với giới hạn đối tượng"
 
-#: builtin/pack-objects.c:2602
+#: builtin/pack-objects.c:2644
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr "độ dài tối đa của chuỗi móc xích “delta” được phép trong gói kết quả"
 
-#: builtin/pack-objects.c:2604
+#: builtin/pack-objects.c:2646
 msgid "reuse existing deltas"
 msgstr "dùng lại các delta sẵn có"
 
-#: builtin/pack-objects.c:2606
+#: builtin/pack-objects.c:2648
 msgid "reuse existing objects"
 msgstr "dùng lại các đối tượng sẵn có"
 
-#: builtin/pack-objects.c:2608
+#: builtin/pack-objects.c:2650
 msgid "use OFS_DELTA objects"
 msgstr "dùng các đối tượng OFS_DELTA"
 
-#: builtin/pack-objects.c:2610
+#: builtin/pack-objects.c:2652
 msgid "use threads when searching for best delta matches"
 msgstr "sử dụng các tuyến trình khi tìm kiếm cho các mẫu khớp delta tốt nhất"
 
-#: builtin/pack-objects.c:2612
+#: builtin/pack-objects.c:2654
 msgid "do not create an empty pack output"
-msgstr "không thể tạo kết xuất gói (pack) trống rỗng"
+msgstr "không thể tạo kết xuất gói trống rỗng"
 
-#: builtin/pack-objects.c:2614
+#: builtin/pack-objects.c:2656
 msgid "read revision arguments from standard input"
 msgstr " đọc tham số “revision” từ thiết bị nhập chuẩn"
 
-#: builtin/pack-objects.c:2616
+#: builtin/pack-objects.c:2658
 msgid "limit the objects to those that are not yet packed"
 msgstr "giới hạn các đối tượng thành những cái mà chúng vẫn chưa được đóng gói"
 
-#: builtin/pack-objects.c:2619
+#: builtin/pack-objects.c:2661
 msgid "include objects reachable from any reference"
 msgstr "bao gồm các đối tượng có thể đọc được từ bất kỳ tham chiếu nào"
 
-#: builtin/pack-objects.c:2622
+#: builtin/pack-objects.c:2664
 msgid "include objects referred by reflog entries"
 msgstr "bao gồm các đối tượng được tham chiếu bởi các mục reflog"
 
-#: builtin/pack-objects.c:2625
+#: builtin/pack-objects.c:2667
+msgid "include objects referred to by the index"
+msgstr "bao gồm các đối tượng được tham chiếu bởi mục lục"
+
+#: builtin/pack-objects.c:2670
 msgid "output pack to stdout"
 msgstr "xuất gói ra đầu ra tiêu chuẩn"
 
-#: builtin/pack-objects.c:2627
+#: builtin/pack-objects.c:2672
 msgid "include tag objects that refer to objects to be packed"
 msgstr "bao gồm các đối tượng tham chiếu đến các đối tượng được đóng gói"
 
-#: builtin/pack-objects.c:2629
+#: builtin/pack-objects.c:2674
 msgid "keep unreachable objects"
 msgstr "giữ lại các đối tượng không thể đọc được"
 
-#: builtin/pack-objects.c:2630 parse-options.h:140
+#: builtin/pack-objects.c:2675 parse-options.h:140
 msgid "time"
 msgstr "thời-gian"
 
-#: builtin/pack-objects.c:2631
+#: builtin/pack-objects.c:2676
 msgid "unpack unreachable objects newer than <time>"
 msgstr ""
 "xả nén (gỡ khỏi gói) các đối tượng không thể đọc được mới hơn <thời-gian>"
 
-#: builtin/pack-objects.c:2634
+#: builtin/pack-objects.c:2679
 msgid "create thin packs"
 msgstr "tạo gói nhẹ"
 
-#: builtin/pack-objects.c:2636
+#: builtin/pack-objects.c:2681
 msgid "ignore packs that have companion .keep file"
 msgstr "bỏ qua các gói mà nó có tập tin .keep đi kèm"
 
-#: builtin/pack-objects.c:2638
+#: builtin/pack-objects.c:2683
 msgid "pack compression level"
 msgstr "mức nén gói"
 
-#: builtin/pack-objects.c:2640
+#: builtin/pack-objects.c:2685
 msgid "do not hide commits by grafts"
 msgstr "không ẩn các lần chuyển giao bởi “grafts”"
 
-#: builtin/pack-objects.c:2642
+#: builtin/pack-objects.c:2687
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr "dùng mục lục ánh xạ nếu có thể được để nâng cao tốc độ đếm đối tượng"
 
-#: builtin/pack-objects.c:2644
+#: builtin/pack-objects.c:2689
 msgid "write a bitmap index together with the pack index"
 msgstr "ghi một mục lục ánh xạ cùng với mục lục gói"
 
-#: builtin/pack-objects.c:2723
+#: builtin/pack-objects.c:2778
 msgid "Counting objects"
 msgstr "Đang đếm các đối tượng"
 
@@ -7775,13 +8052,13 @@
 
 #: builtin/pack-refs.c:15
 msgid "prune loose refs (default)"
-msgstr "prune (cắt cụt) những tham chiếu (refs) bị mất (mặc định)"
+msgstr "prune (cắt cụt) những tham chiếu bị mất (mặc định)"
 
 #: 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:49
+#: builtin/prune-packed.c:40
 msgid "Removing duplicate objects"
 msgstr "Đang gỡ các đối tượng trùng lặp"
 
@@ -7789,15 +8066,15 @@
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <thời-gian>] [--] [<head>...]"
 
-#: builtin/prune.c:142
+#: builtin/prune.c:106
 msgid "do not remove, show only"
 msgstr "không gỡ bỏ, chỉ hiển thị"
 
-#: builtin/prune.c:143
+#: builtin/prune.c:107
 msgid "report pruned objects"
 msgstr "báo cáo các đối tượng đã prune"
 
-#: builtin/prune.c:146
+#: builtin/prune.c:110
 msgid "expire objects older than <time>"
 msgstr "các đối tượng hết hạn cũ hơn khoảng <thời gian>"
 
@@ -7811,9 +8088,9 @@
 
 #: builtin/push.c:95
 msgid "--delete only accepts plain target ref names"
-msgstr "--delete chỉ chấp nhận các tên tham chiếu (ref) dạng thường"
+msgstr "--delete chỉ chấp nhận các tên tham chiếu dạng thường"
 
-#: builtin/push.c:140
+#: builtin/push.c:139
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -7822,7 +8099,7 @@
 "Để chọn mỗi tùy chọn một cách cố định, xem push.default trong “git help "
 "config”."
 
-#: builtin/push.c:143
+#: builtin/push.c:142
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -7847,7 +8124,7 @@
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:158
+#: builtin/push.c:157
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -7862,7 +8139,7 @@
 "\n"
 "    git push %s HEAD:<tên-của-nhánh-máy-chủ>\n"
 
-#: builtin/push.c:172
+#: builtin/push.c:171
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -7876,12 +8153,12 @@
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:180
+#: builtin/push.c:179
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr "Nhánh hiện tại %s có nhiều nhánh thượng nguồn, từ chối push."
 
-#: builtin/push.c:183
+#: builtin/push.c:182
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -7893,7 +8170,7 @@
 "nhánh hiện tại “%s” của bạn, mà không báo cho tôi biết là cái gì được push\n"
 "để cập nhật nhánh máy chủ nào."
 
-#: builtin/push.c:206
+#: builtin/push.c:205
 msgid ""
 "push.default is unset; its implicit value has changed in\n"
 "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
@@ -7939,14 +8216,14 @@
 "tự\n"
 "“current” thay vì “simple” nếu bạn thỉnh thoảng phải sử dụng bản Git cũ)"
 
-#: builtin/push.c:273
+#: builtin/push.c:272
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "Bạn đã không chỉ ra một refspecs nào để push, và push.default là \"không là "
 "gì cả\"."
 
-#: builtin/push.c:280
+#: builtin/push.c:279
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -7959,7 +8236,7 @@
 "Xem “Note about fast-forwards” trong “git push --help” để có thông tin chi "
 "tiết."
 
-#: builtin/push.c:286
+#: builtin/push.c:285
 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"
@@ -7972,7 +8249,7 @@
 "Xem “Note about fast-forwards” trong “git push --help” để có thông tin chi "
 "tiết."
 
-#: builtin/push.c:292
+#: builtin/push.c:291
 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"
@@ -7987,11 +8264,11 @@
 "Xem “Note about fast-forwards” trong “git push --help” để có thông tin chi "
 "tiết."
 
-#: builtin/push.c:299
+#: builtin/push.c:298
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr "Việc cập nhật bị từ chối bởi vì thẻ đã sẵn có từ trước trên máy chủ."
 
-#: builtin/push.c:302
+#: builtin/push.c:301
 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"
@@ -8003,22 +8280,22 @@
 "đối tượng\n"
 "không phải chuyển giao, mà không sử dụng tùy chọn “--force”.\n"
 
-#: builtin/push.c:361
+#: builtin/push.c:360
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Đang đẩy lên %s\n"
 
-#: builtin/push.c:365
+#: builtin/push.c:364
 #, c-format
 msgid "failed to push some refs to '%s'"
-msgstr "gặp lỗi khi đẩy tới một số tham chiếu (ref) đến “%s”"
+msgstr "gặp lỗi khi đẩy tới một số tham chiếu đến “%s”"
 
-#: builtin/push.c:395
+#: builtin/push.c:394
 #, c-format
 msgid "bad repository '%s'"
 msgstr "repository (kho) sai “%s”"
 
-#: builtin/push.c:396
+#: builtin/push.c:395
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -8039,99 +8316,103 @@
 "\n"
 "    git push <tên>\n"
 
-#: builtin/push.c:411
+#: builtin/push.c:410
 msgid "--all and --tags are incompatible"
 msgstr "--all và --tags xung khắc nhau"
 
-#: builtin/push.c:412
+#: builtin/push.c:411
 msgid "--all can't be combined with refspecs"
 msgstr "--all không thể được tổ hợp cùng với đặc tả đường dẫn"
 
-#: builtin/push.c:417
+#: builtin/push.c:416
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror và --tags xung khắc nhau"
 
-#: builtin/push.c:418
+#: builtin/push.c:417
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror không thể được tổ hợp cùng với đặc tả đường dẫn"
 
-#: builtin/push.c:423
+#: builtin/push.c:422
 msgid "--all and --mirror are incompatible"
 msgstr "--all và --mirror xung khắc nhau"
 
-#: builtin/push.c:483
+#: builtin/push.c:493
 msgid "repository"
 msgstr "kho"
 
-#: builtin/push.c:484
+#: builtin/push.c:494
 msgid "push all refs"
 msgstr "đẩy tất cả các tham chiếu"
 
-#: builtin/push.c:485
+#: builtin/push.c:495
 msgid "mirror all refs"
 msgstr "mirror tất cả các tham chiếu"
 
-#: builtin/push.c:487
+#: builtin/push.c:497
 msgid "delete refs"
 msgstr "xóa các tham chiếu"
 
-#: builtin/push.c:488
+#: builtin/push.c:498
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "đẩy các thẻ (không dùng cùng với --all hay --mirror)"
 
-#: builtin/push.c:491
+#: builtin/push.c:501
 msgid "force updates"
 msgstr "ép buộc cập nhật"
 
-#: builtin/push.c:493
+#: builtin/push.c:503
 msgid "refname>:<expect"
 msgstr "tên-tham-chiếu>:<cần"
 
-#: builtin/push.c:494
+#: builtin/push.c:504
 msgid "require old value of ref to be at this value"
 msgstr "yêu cầu giá-trị cũ của tham chiếu thì là giá-trị này"
 
-#: builtin/push.c:496
+#: builtin/push.c:506
 msgid "check"
 msgstr "kiểm tra"
 
-#: builtin/push.c:497
+#: builtin/push.c:507
 msgid "control recursive pushing of submodules"
 msgstr "điều khiển việc đẩy lên (push) đệ qui của mô-đun-con"
 
-#: builtin/push.c:499
+#: builtin/push.c:509
 msgid "use thin pack"
 msgstr "tạo gói nhẹ"
 
-#: builtin/push.c:500 builtin/push.c:501
+#: builtin/push.c:510 builtin/push.c:511
 msgid "receive pack program"
 msgstr "chương trình nhận gói"
 
-#: builtin/push.c:502
+#: builtin/push.c:512
 msgid "set upstream for git pull/status"
 msgstr "đặt thượng nguồn cho git pull/status"
 
-#: builtin/push.c:505
+#: builtin/push.c:515
 msgid "prune locally removed refs"
-msgstr "xén tỉa những tham chiếu (refs) bị gỡ bỏ"
+msgstr "xén tỉa những tham chiếu bị gỡ bỏ"
 
-#: builtin/push.c:507
+#: builtin/push.c:517
 msgid "bypass pre-push hook"
 msgstr "vòng qua móc tiền-đẩy (pre-push)"
 
-#: builtin/push.c:508
+#: builtin/push.c:518
 msgid "push missing but relevant tags"
 msgstr "push phần bị thiếu nhưng nhưng các thẻ lại thích hợp"
 
-#: builtin/push.c:518
+#: builtin/push.c:520
+msgid "GPG sign the push"
+msgstr "ký lần đẩy dùng GPG"
+
+#: builtin/push.c:529
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete là xung khắc với các tùy chọn --all, --mirror và --tags"
 
-#: builtin/push.c:520
+#: builtin/push.c:531
 msgid "--delete doesn't make sense without any refs"
-msgstr "--delete không hợp lý nếu không có bất kỳ tham chiếu (refs) nào"
+msgstr "--delete không hợp lý nếu không có bất kỳ tham chiếu nào"
 
-#: builtin/read-tree.c:36
+#: builtin/read-tree.c:37
 msgid ""
 "git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] "
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
@@ -8142,68 +8423,68 @@
 "[--index-output=<tập-tin>] (--empty | <tree-ish1> [<tree-ish2> [<tree-"
 "ish3>]])"
 
-#: builtin/read-tree.c:109
+#: builtin/read-tree.c:110
 msgid "write resulting index to <file>"
 msgstr "ghi mục lục kết quả vào <tập-tin>"
 
-#: builtin/read-tree.c:112
+#: builtin/read-tree.c:113
 msgid "only empty the index"
 msgstr "chỉ với bảng mục lục trống rỗng"
 
-#: builtin/read-tree.c:114
+#: builtin/read-tree.c:115
 msgid "Merging"
 msgstr "Hòa trộn"
 
-#: builtin/read-tree.c:116
+#: builtin/read-tree.c:117
 msgid "perform a merge in addition to a read"
 msgstr "thực hiện một hòa trộn thêm vào việc đọc"
 
-#: builtin/read-tree.c:118
+#: builtin/read-tree.c:119
 msgid "3-way merge if no file level merging required"
 msgstr ""
 "hòa trộn kiểu “3-way” nếu không có tập tin mức hòa trộn nào được yêu cầu "
 
-#: builtin/read-tree.c:120
+#: builtin/read-tree.c:121
 msgid "3-way merge in presence of adds and removes"
 msgstr "hòa trộn 3-way trong sự hiện diện của “adds” và “removes”"
 
-#: builtin/read-tree.c:122
+#: builtin/read-tree.c:123
 msgid "same as -m, but discard unmerged entries"
 msgstr "giống với -m, nhưng bỏ qua các mục chưa được hòa trộn"
 
-#: builtin/read-tree.c:123
+#: builtin/read-tree.c:124
 msgid "<subdirectory>/"
 msgstr "<thư-mục-con>/"
 
-#: builtin/read-tree.c:124
+#: builtin/read-tree.c:125
 msgid "read the tree into the index under <subdirectory>/"
 msgstr "đọc cây vào trong bảng mục lục dưới <thư_mục_con>/"
 
-#: builtin/read-tree.c:127
+#: builtin/read-tree.c:128
 msgid "update working tree with merge result"
 msgstr "cập nhật cây làm việc với kết quả hòa trộn"
 
-#: builtin/read-tree.c:129
+#: builtin/read-tree.c:130
 msgid "gitignore"
 msgstr "gitignore"
 
-#: builtin/read-tree.c:130
+#: builtin/read-tree.c:131
 msgid "allow explicitly ignored files to be overwritten"
 msgstr "cho phép các tập tin rõ ràng bị lờ đi được ghi đè"
 
-#: builtin/read-tree.c:133
+#: builtin/read-tree.c:134
 msgid "don't check the working tree after merging"
 msgstr "không kiểm tra cây làm việc sau hòa trộn"
 
-#: builtin/read-tree.c:134
+#: builtin/read-tree.c:135
 msgid "don't update the index or the work tree"
 msgstr "không cập nhật bảng mục lục hay cây làm việc"
 
-#: builtin/read-tree.c:136
+#: builtin/read-tree.c:137
 msgid "skip applying sparse checkout filter"
 msgstr "bỏ qua áp dụng bộ lọc lấy ra (checkout) thưa thớt"
 
-#: builtin/read-tree.c:138
+#: builtin/read-tree.c:139
 msgid "debug unpack-trees"
 msgstr "gỡ lỗi “unpack-trees”"
 
@@ -8368,21 +8649,16 @@
 msgid "Could not setup master '%s'"
 msgstr "Không thể cài đặt nhánh master “%s”"
 
-#: builtin/remote.c:289
-#, c-format
-msgid "more than one %s"
-msgstr "nhiều hơn một %s"
-
-#: builtin/remote.c:334
+#: builtin/remote.c:333
 #, 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:435 builtin/remote.c:443
+#: builtin/remote.c:434 builtin/remote.c:442
 msgid "(matching)"
 msgstr "(khớp)"
 
-#: builtin/remote.c:447
+#: builtin/remote.c:446
 msgid "(delete)"
 msgstr "(xóa)"
 
@@ -8391,7 +8667,7 @@
 msgid "Could not append '%s' to '%s'"
 msgstr "Không thể nối thêm “%s” vào “%s”"
 
-#: builtin/remote.c:634 builtin/remote.c:787 builtin/remote.c:885
+#: builtin/remote.c:634 builtin/remote.c:798 builtin/remote.c:898
 #, c-format
 msgid "No such remote: %s"
 msgstr "Không có máy chủ nào như thế: %s"
@@ -8401,7 +8677,7 @@
 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:657 builtin/remote.c:794
+#: builtin/remote.c:657 builtin/remote.c:850
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Không thể gỡ bỏ phần cấu hình “%s”"
@@ -8437,12 +8713,12 @@
 msgid "creating '%s' failed"
 msgstr "gặp lỗi khi tạo “%s”"
 
-#: builtin/remote.c:759
+#: builtin/remote.c:769
 #, c-format
 msgid "Could not remove branch %s"
 msgstr "Không thể gỡ bỏ nhánh “%s”"
 
-#: builtin/remote.c:829
+#: builtin/remote.c:836
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -8457,363 +8733,421 @@
 "đi;\n"
 "để xóa đi, sử dụng:"
 
-#: builtin/remote.c:938
+#: builtin/remote.c:951
 #, 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:941
+#: builtin/remote.c:954
 msgid " tracked"
 msgstr " được theo dõi"
 
-#: builtin/remote.c:943
+#: builtin/remote.c:956
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " cũ rích (dùng “git remote prune” để gỡ bỏ)"
 
-#: builtin/remote.c:945
+#: builtin/remote.c:958
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:986
+#: builtin/remote.c:999
 #, 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:993
+#: builtin/remote.c:1006
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "thực hiện rebase trên máy chủ %s"
 
-#: builtin/remote.c:996
+#: builtin/remote.c:1009
 #, c-format
 msgid " merges with remote %s"
 msgstr " hòa trộn với máy chủ %s"
 
-#: builtin/remote.c:997
+#: builtin/remote.c:1010
 msgid "    and with remote"
 msgstr "    và với máy chủ"
 
-#: builtin/remote.c:999
+#: builtin/remote.c:1012
 #, c-format
 msgid "merges with remote %s"
 msgstr "hòa trộn với máy chủ %s"
 
-#: builtin/remote.c:1000
+#: builtin/remote.c:1013
 msgid "   and with remote"
 msgstr "   và với máy chủ"
 
-#: builtin/remote.c:1046
+#: builtin/remote.c:1059
 msgid "create"
 msgstr "tạo"
 
-#: builtin/remote.c:1049
+#: builtin/remote.c:1062
 msgid "delete"
 msgstr "xoá"
 
-#: builtin/remote.c:1053
+#: builtin/remote.c:1066
 msgid "up to date"
 msgstr "đã cập nhật"
 
-#: builtin/remote.c:1056
+#: builtin/remote.c:1069
 msgid "fast-forwardable"
 msgstr "có-thể-fast-forward"
 
-#: builtin/remote.c:1059
+#: builtin/remote.c:1072
 msgid "local out of date"
 msgstr "dữ liệu nội bộ đã cũ"
 
-#: builtin/remote.c:1066
+#: builtin/remote.c:1079
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s ép buộc thành %-*s (%s)"
 
-#: builtin/remote.c:1069
+#: builtin/remote.c:1082
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s đẩy lên thành %-*s (%s)"
 
-#: builtin/remote.c:1073
+#: builtin/remote.c:1086
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s ép buộc thành %s"
 
-#: builtin/remote.c:1076
+#: builtin/remote.c:1089
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s đẩy lên thành %s"
 
-#: builtin/remote.c:1144
+#: builtin/remote.c:1157
 msgid "do not query remotes"
 msgstr "không truy vấn các máy chủ"
 
-#: builtin/remote.c:1171
+#: builtin/remote.c:1184
 #, c-format
 msgid "* remote %s"
 msgstr "* máy chủ %s"
 
-#: builtin/remote.c:1172
+#: builtin/remote.c:1185
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL để lấy về: %s"
 
-#: builtin/remote.c:1173 builtin/remote.c:1318
+#: builtin/remote.c:1186 builtin/remote.c:1333
 msgid "(no URL)"
 msgstr "(không có URL)"
 
-#: builtin/remote.c:1182 builtin/remote.c:1184
+#: builtin/remote.c:1195 builtin/remote.c:1197
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  URL để đẩy lên: %s"
 
-#: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190
+#: builtin/remote.c:1199 builtin/remote.c:1201 builtin/remote.c:1203
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Nhánh HEAD: %s"
 
-#: builtin/remote.c:1192
+#: builtin/remote.c:1205
 #, 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:1204
+#: builtin/remote.c:1217
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Nhánh trên máy chủ:%s"
 msgstr[1] "  Những nhánh trên máy chủ:%s"
 
-#: builtin/remote.c:1207 builtin/remote.c:1234
+#: builtin/remote.c:1220 builtin/remote.c:1247
 msgid " (status not queried)"
 msgstr " (trạng thái không được yêu cầu)"
 
-#: builtin/remote.c:1216
+#: builtin/remote.c:1229
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Nhánh nội bộ đã được cấu hình cho lệnh “git pull”:"
 msgstr[1] "  Những nhánh nội bộ đã được cấu hình cho lệnh “git pull”:"
 
-#: builtin/remote.c:1224
+#: builtin/remote.c:1237
 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:1231
+#: builtin/remote.c:1244
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
 msgstr[0] "  Tham chiếu nội bộ được cấu hình cho lệnh “git push”%s:"
 msgstr[1] "  Những tham chiếu nội bộ được cấu hình cho lệnh “git push”%s:"
 
-#: builtin/remote.c:1252
+#: builtin/remote.c:1265
 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:1254
+#: builtin/remote.c:1267
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "xóa refs/remotes/<tên>/HEAD"
 
-#: builtin/remote.c:1269
+#: builtin/remote.c:1282
 msgid "Cannot determine remote HEAD"
 msgstr "Không thể xác định được HEAD máy chủ"
 
-#: builtin/remote.c:1271
+#: builtin/remote.c:1284
 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:1281
+#: builtin/remote.c:1294
 #, c-format
 msgid "Could not delete %s"
 msgstr "Không thể xóa bỏ %s"
 
-#: builtin/remote.c:1289
+#: builtin/remote.c:1302
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Không phải là tham chiếu hợp lệ: %s"
 
-#: builtin/remote.c:1291
+#: builtin/remote.c:1304
 #, c-format
 msgid "Could not setup %s"
 msgstr "Không thể cài đặt %s"
 
-#: builtin/remote.c:1307
+#: builtin/remote.c:1322
 #, 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:1308
+#: builtin/remote.c:1323
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s đã trở thành không đầu (không được quản lý)!"
 
-#: builtin/remote.c:1314
+#: builtin/remote.c:1329
 #, c-format
 msgid "Pruning %s"
 msgstr "Đang xén bớt %s"
 
-#: builtin/remote.c:1315
+#: builtin/remote.c:1330
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1328
+#: builtin/remote.c:1357
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [nên xén bớt] %s"
 
-#: builtin/remote.c:1331
+#: builtin/remote.c:1360
 #, c-format
 msgid " * [pruned] %s"
 msgstr " *[đã bị xén] %s"
 
-#: builtin/remote.c:1374
+#: builtin/remote.c:1405
 msgid "prune remotes after fetching"
 msgstr "cắt máy chủ sau khi lấy về"
 
-#: builtin/remote.c:1440 builtin/remote.c:1514
+#: builtin/remote.c:1471 builtin/remote.c:1545
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Không có máy chủ nào có tên “%s”"
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1491
 msgid "add branch"
 msgstr "thêm nhánh"
 
-#: builtin/remote.c:1467
+#: builtin/remote.c:1498
 msgid "no remote specified"
 msgstr "chưa chỉ ra máy chủ nào"
 
-#: builtin/remote.c:1489
+#: builtin/remote.c:1520
 msgid "manipulate push URLs"
 msgstr "đẩy các “URL” bằng tay"
 
-#: builtin/remote.c:1491
+#: builtin/remote.c:1522
 msgid "add URL"
 msgstr "thêm URL"
 
-#: builtin/remote.c:1493
+#: builtin/remote.c:1524
 msgid "delete URLs"
 msgstr "xóa URLs"
 
-#: builtin/remote.c:1500
+#: builtin/remote.c:1531
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete không hợp lý"
 
-#: builtin/remote.c:1540
+#: builtin/remote.c:1571
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Kiểu mẫu URL cũ không hợp lệ: %s"
 
-#: builtin/remote.c:1548
+#: builtin/remote.c:1579
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Không tìm thấy URL như vậy: %s"
 
-#: builtin/remote.c:1550
+#: builtin/remote.c:1581
 msgid "Will not delete all non-push URLs"
 msgstr "Sẽ không xóa những địa chỉ URL không-push"
 
-#: builtin/remote.c:1564
+#: builtin/remote.c:1595
 msgid "be verbose; must be placed before a subcommand"
 msgstr "chi tiết; phải được đặt trước một lệnh-con"
 
-#: builtin/repack.c:16
+#: builtin/repack.c:17
 msgid "git repack [options]"
 msgstr "git repack [các-tùy-chọn]"
 
-#: builtin/repack.c:156
+#: builtin/repack.c:160
 msgid "pack everything in a single pack"
 msgstr "đóng gói mọi thứ trong một gói đơn"
 
-#: builtin/repack.c:158
+#: builtin/repack.c:162
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "giống với -a, và chỉnh sửa các đối tượng không đọc được thiếu sót"
 
-#: builtin/repack.c:161
+#: builtin/repack.c:165
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "xóa bỏ các gói dư thừa, và chạy git-prune-packed"
 
-#: builtin/repack.c:163
+#: builtin/repack.c:167
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "chuyển --no-reuse-delta cho git-pack-objects"
 
-#: builtin/repack.c:165
+#: builtin/repack.c:169
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "chuyển --no-reuse-object cho git-pack-objects"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:171
 msgid "do not run git-update-server-info"
 msgstr "không chạy git-update-server-info"
 
-#: builtin/repack.c:170
+#: builtin/repack.c:174
 msgid "pass --local to git-pack-objects"
 msgstr "chuyển --local cho git-pack-objects"
 
-#: builtin/repack.c:172
+#: builtin/repack.c:176
 msgid "write bitmap index"
 msgstr "ghi mục lục ánh xạ"
 
-#: builtin/repack.c:173
+#: builtin/repack.c:177
 msgid "approxidate"
 msgstr "ngày ước tính"
 
-#: builtin/repack.c:174
+#: builtin/repack.c:178
 msgid "with -A, do not loosen objects older than this"
 msgstr "với -A, các đối tượng cũ hơn khoảng thời gian này thì không bị mất"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:180
 msgid "size of the window used for delta compression"
 msgstr "kích thước cửa sổ được dùng cho nén “delta”"
 
-#: builtin/repack.c:177 builtin/repack.c:181
+#: builtin/repack.c:181 builtin/repack.c:185
 msgid "bytes"
 msgstr "byte"
 
-#: builtin/repack.c:178
+#: builtin/repack.c:182
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr "giống như trên, nhưng giới hạn kích thước bộ nhớ hay vì số lượng"
 
-#: builtin/repack.c:180
+#: builtin/repack.c:184
 msgid "limits the maximum delta depth"
 msgstr "giới hạn độ sâu tối đa của “delta”"
 
-#: builtin/repack.c:182
+#: builtin/repack.c:186
 msgid "maximum size of each packfile"
 msgstr "kcíh thước tối đa cho từng tập tin gói"
 
-#: builtin/repack.c:184
+#: builtin/repack.c:188
 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:371
+#: builtin/repack.c:374
 #, c-format
 msgid "removing '%s' failed"
 msgstr "gặp lỗi khi xóa bỏ “%s”"
 
-#: builtin/replace.c:17
+#: builtin/replace.c:19
 msgid "git replace [-f] <object> <replacement>"
 msgstr "git replace [-f] <đối-tượng> <thay-thế>"
 
-#: builtin/replace.c:18
+#: builtin/replace.c:20
+msgid "git replace [-f] --edit <object>"
+msgstr "git replace [-f] --edit <đối tượng>"
+
+#: builtin/replace.c:21
+msgid "git replace [-f] --graft <commit> [<parent>...]"
+msgstr "git replace [-f] --graft <lần_chuyển_giao> [<cha_mẹ>...]"
+
+#: builtin/replace.c:22
 msgid "git replace -d <object>..."
 msgstr "git replace -d <đối tượng>..."
 
-#: builtin/replace.c:19
+#: builtin/replace.c:23
 msgid "git replace [--format=<format>] [-l [<pattern>]]"
 msgstr "git replace [--format=<định_dạng>] [-l [<mẫu>]]"
 
-#: builtin/replace.c:174
+#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#, c-format
+msgid "Not a valid object name: '%s'"
+msgstr "Không phải là tên đối tượng hợp lệ: “%s”"
+
+#: builtin/replace.c:355
+#, c-format
+msgid "bad mergetag in commit '%s'"
+msgstr "thẻ hòa trộn sai trong lần chuyển giao “%s”"
+
+#: builtin/replace.c:357
+#, c-format
+msgid "malformed mergetag in commit '%s'"
+msgstr "thẻ hòa trộn không đúng dạng ở lần chuyển giao “%s”"
+
+#: builtin/replace.c:368
+#, c-format
+msgid ""
+"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
+"instead of --graft"
+msgstr ""
+"lần chuyển giao gốc “%s” có chứa thẻ hòa trộn “%s” cái mà bị loại bỏ; dùng "
+"tùy chọn --edit thay cho --graft"
+
+#: builtin/replace.c:401
+#, c-format
+msgid "the original commit '%s' has a gpg signature."
+msgstr "lần chuyển giao gốc “%s” có chữ ký GPG."
+
+#: builtin/replace.c:402
+msgid "the signature will be removed in the replacement commit!"
+msgstr "chữ ký sẽ được bỏ đi trong lần chuyển giao thay thế!"
+
+#: builtin/replace.c:408
+#, c-format
+msgid "could not write replacement commit for: '%s'"
+msgstr "không thể ghi lần chuyển giao thay thế cho: “%s”"
+
+#: builtin/replace.c:432
 msgid "list replace refs"
 msgstr "liệt kê các refs thay thế"
 
-#: builtin/replace.c:175
+#: builtin/replace.c:433
 msgid "delete replace refs"
-msgstr "xóa tham chiếu (refs) thay thế"
+msgstr "xóa tham chiếu thay thế"
 
-#: builtin/replace.c:176
+#: builtin/replace.c:434
+msgid "edit existing object"
+msgstr "sửa đối tượng sẵn có"
+
+#: builtin/replace.c:435
+msgid "change a commit's parents"
+msgstr "thay đổi cha mẹ của lần chuyển giao"
+
+#: builtin/replace.c:436
 msgid "replace the ref if it exists"
-msgstr "thay thế tham chiếu (ref) nếu nó đã sẵn có"
+msgstr "thay thế tham chiếu nếu nó đã sẵn có"
 
-#: builtin/replace.c:177
+#: builtin/replace.c:437
+msgid "do not pretty-print contents for --edit"
+msgstr "đừng in đẹp các nội dung cho --edit"
+
+#: builtin/replace.c:438
 msgid "use this format"
 msgstr "dùng định dạng này"
 
@@ -8825,156 +9159,156 @@
 msgid "register clean resolutions in index"
 msgstr "sổ ghi dọn sạch các phân giải trong bản mục lục"
 
-#: builtin/reset.c:25
+#: builtin/reset.c:26
 msgid ""
 "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
 msgstr ""
 "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
 
-#: builtin/reset.c:26
+#: builtin/reset.c:27
 msgid "git reset [-q] <tree-ish> [--] <paths>..."
 msgstr "git reset [-q] <tree-ish> [--] <đường-dẫn>..."
 
-#: builtin/reset.c:27
+#: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
 msgstr "git reset --patch [<tree-ish>] [--] [<các-đường-dẫn>...]"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "mixed"
 msgstr "pha trộn"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "soft"
 msgstr "mềm"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "hard"
 msgstr "cứng"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "merge"
 msgstr "hòa trộn"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "keep"
 msgstr "giữ lại"
 
-#: builtin/reset.c:73
+#: builtin/reset.c:74
 msgid "You do not have a valid HEAD."
 msgstr "Bạn không có HEAD nào hợp lệ."
 
-#: builtin/reset.c:75
+#: builtin/reset.c:76
 msgid "Failed to find tree of HEAD."
 msgstr "Gặp lỗi khi tìm cây của HEAD."
 
-#: builtin/reset.c:81
+#: builtin/reset.c:82
 #, c-format
 msgid "Failed to find tree of %s."
 msgstr "Gặp lỗi khi tìm cây của %s."
 
-#: builtin/reset.c:99
+#: builtin/reset.c:100
 #, c-format
 msgid "HEAD is now at %s"
 msgstr "HEAD hiện giờ tại %s"
 
-#: builtin/reset.c:182
+#: builtin/reset.c:183
 #, c-format
 msgid "Cannot do a %s reset in the middle of a merge."
 msgstr "Không thể thực hiện một %s reset ở giữa của quá trình hòa trộn."
 
-#: builtin/reset.c:273
+#: builtin/reset.c:276
 msgid "be quiet, only report errors"
 msgstr "làm việc ở chế độ im lặng, chỉ hiển thị khi có lỗi"
 
-#: builtin/reset.c:275
+#: builtin/reset.c:278
 msgid "reset HEAD and index"
 msgstr "đặt lại (reset) HEAD và bảng mục lục"
 
-#: builtin/reset.c:276
+#: builtin/reset.c:279
 msgid "reset only HEAD"
 msgstr "chỉ đặt lại (reset) HEAD"
 
-#: builtin/reset.c:278 builtin/reset.c:280
+#: builtin/reset.c:281 builtin/reset.c:283
 msgid "reset HEAD, index and working tree"
 msgstr "đặt lại HEAD, bảng mục lục và cây làm việc"
 
-#: builtin/reset.c:282
+#: builtin/reset.c:285
 msgid "reset HEAD but keep local changes"
 msgstr "đặt lại HEAD nhưng giữ lại các thay đổi nội bộ"
 
-#: builtin/reset.c:285
+#: builtin/reset.c:288
 msgid "record only the fact that removed paths will be added later"
 msgstr "chỉ ghi lại những đường dẫn thực sự sẽ được thêm vào sau này"
 
-#: builtin/reset.c:302
+#: builtin/reset.c:305
 #, c-format
 msgid "Failed to resolve '%s' as a valid revision."
 msgstr "Gặp lỗi khi phân giải “%s” như là điểm xét duyệt hợp lệ."
 
-#: builtin/reset.c:305 builtin/reset.c:313
+#: 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/reset.c:310
+#: builtin/reset.c:313
 #, c-format
 msgid "Failed to resolve '%s' as a valid tree."
 msgstr "Gặp lỗi khi phân giải “%s” như là một cây (tree) hợp lệ."
 
-#: builtin/reset.c:319
+#: builtin/reset.c:322
 msgid "--patch is incompatible with --{hard,mixed,soft}"
 msgstr "--patch xung khắc với --{hard,mixed,soft}"
 
-#: builtin/reset.c:328
+#: builtin/reset.c:331
 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
 msgstr ""
 "--mixed với các đường dẫn không còn dùng nữa; hãy thay thế bằng lệnh “git "
 "reset -- <đường_dẫn>”."
 
-#: builtin/reset.c:330
+#: builtin/reset.c:333
 #, c-format
 msgid "Cannot do %s reset with paths."
 msgstr "Không thể thực hiện lệnh %s reset với các đường dẫn."
 
-#: builtin/reset.c:340
+#: builtin/reset.c:343
 #, c-format
 msgid "%s reset is not allowed in a bare repository"
 msgstr "%s reset không được phép trên kho thuần"
 
-#: builtin/reset.c:344
+#: builtin/reset.c:347
 msgid "-N can only be used with --mixed"
 msgstr "-N chỉ được dùng khi có --mixed"
 
-#: builtin/reset.c:361
+#: builtin/reset.c:364
 msgid "Unstaged changes after reset:"
 msgstr "Những thay đổi được đưa ra khỏi bệ phóng sau khi reset:"
 
-#: builtin/reset.c:367
+#: builtin/reset.c:370
 #, c-format
 msgid "Could not reset index file to revision '%s'."
 msgstr "Không thể đặt lại (reset) bảng mục lục thành điểm xét duyệt “%s”."
 
-#: builtin/reset.c:372
+#: builtin/reset.c:374
 msgid "Could not write new index file."
 msgstr "Không thể ghi tập tin lưu bảng mục lục mới."
 
-#: builtin/rev-parse.c:359
+#: builtin/rev-parse.c:361
 msgid "git rev-parse --parseopt [options] -- [<args>...]"
 msgstr "git rev-parse --parseopt [các-tùy-chọn] -- [<th.số>...]"
 
-#: builtin/rev-parse.c:364
+#: builtin/rev-parse.c:366
 msgid "keep the `--` passed as an arg"
 msgstr "giữ lại “--” chuyển sang làm tham số"
 
-#: builtin/rev-parse.c:366
+#: builtin/rev-parse.c:368
 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:369
+#: builtin/rev-parse.c:371
 msgid "output in stuck long form"
 msgstr "kết xuất trong định dạng gậy dài"
 
-#: builtin/rev-parse.c:497
+#: builtin/rev-parse.c:499
 msgid ""
 "git rev-parse --parseopt [options] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -9086,7 +9420,7 @@
 "the following submodule (or one of its nested submodules)\n"
 "uses a .git directory:"
 msgid_plural ""
-"the following submodules (or one of its nested submodules)\n"
+"the following submodules (or one of their nested submodules)\n"
 "use a .git directory:"
 msgstr[0] ""
 "mô-đun-con sau đây (hay một trong số mô-đun-con bên trong của nó)\n"
@@ -9166,6 +9500,12 @@
 msgid "exit with a zero status even if nothing matched"
 msgstr "thoát ra với trạng thái khác không thậm chí nếu không có gì khớp"
 
+#: builtin/rm.c:318
+msgid "Please, stage your changes to .gitmodules or stash them to proceed"
+msgstr ""
+"Vui lòng đưa các thay đổi của bạn vào “.gitmodules” hay tạm cất chúng đi để "
+"xử lý"
+
 #: builtin/rm.c:336
 #, c-format
 msgid "not removing '%s' recursively without -r"
@@ -9287,11 +9627,11 @@
 
 #: builtin/show-ref.c:10
 msgid ""
-"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash"
-"[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] "
+"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--"
+"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] "
 msgstr ""
-"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash"
-"[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [mẫu*] "
+"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--"
+"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [mẫu*] "
 
 #: builtin/show-ref.c:11
 msgid "git show-ref --exclude-existing[=pattern] < ref-list"
@@ -9308,8 +9648,7 @@
 #: builtin/show-ref.c:170
 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 "
-"(ref)"
+"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:173 builtin/show-ref.c:175
 msgid "show the HEAD reference, even if it would be filtered out"
@@ -9331,8 +9670,8 @@
 #: builtin/show-ref.c:185
 msgid "show refs from stdin that aren't in local repository"
 msgstr ""
-"hiển thị các tham chiếu (refs) từ đầu vào tiêu chuẩn (stdin) cái mà không ở "
-"kho nội bộ"
+"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/symbolic-ref.c:7
 msgid "git symbolic-ref [options] name [ref]"
@@ -9344,22 +9683,21 @@
 
 #: builtin/symbolic-ref.c:40
 msgid "suppress error message for non-symbolic (detached) refs"
-msgstr ""
-"chặn các thông tin lỗi cho các tham chiếu (refs) “non-symbolic” (bị tách ra)"
+msgstr "chặn các thông tin lỗi cho các tham chiếu “không-mềm” (bị tách ra)"
 
 #: builtin/symbolic-ref.c:41
 msgid "delete symbolic ref"
-msgstr "xóa tham chiếu (ref) tượng trưng"
+msgstr "xóa tham chiếu mềm"
 
 #: builtin/symbolic-ref.c:42
 msgid "shorten ref output"
 msgstr "làm ngắn kết xuất ref (tham chiếu)"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
 msgid "reason"
 msgstr "lý do"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
 msgid "reason of the update"
 msgstr "lý do cập nhật"
 
@@ -9385,327 +9723,330 @@
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <tên-thẻ>..."
 
-#: builtin/tag.c:67
+#: builtin/tag.c:69
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "đối tượng dị hình tại “%s”"
 
-#: builtin/tag.c:239
+#: builtin/tag.c:301
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "tên thẻ quá dài: %.*s..."
 
-#: builtin/tag.c:244
+#: builtin/tag.c:306
 #, c-format
 msgid "tag '%s' not found."
 msgstr "không tìm thấy tìm thấy thẻ “%s”."
 
-#: builtin/tag.c:259
+#: builtin/tag.c:321
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Thẻ đã bị xóa “%s” (trước là %s)\n"
 
-#: builtin/tag.c:271
+#: builtin/tag.c:333
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "không thể thẩm tra thẻ “%s”"
 
-#: builtin/tag.c:281
+#: builtin/tag.c:343
 #, c-format
 msgid ""
 "\n"
-"Write a tag message\n"
+"Write a message for tag:\n"
+"  %s\n"
 "Lines starting with '%c' will be ignored.\n"
 msgstr ""
 "\n"
-"Viết các ghi chú cho (thẻ) tag\n"
+"Viết các ghi chú cho thẻ:\n"
+"  %s\n"
 "Những dòng được bắt đầu bằng “%c” sẽ được bỏ qua.\n"
 
-#: builtin/tag.c:285
+#: builtin/tag.c:347
 #, c-format
 msgid ""
 "\n"
-"Write a tag message\n"
+"Write a message for tag:\n"
+"  %s\n"
 "Lines starting with '%c' will be kept; you may remove them yourself if you "
 "want to.\n"
 msgstr ""
 "\n"
 "Viết các ghi chú cho (thẻ) tag\n"
-"Những dòng được bắt đầu bằng “%c” sẽ được bỏ qua; bạn có thể xóa chúng đi "
+"  %s\n"
+"Những dòng được bắt đầu bằng “%c” sẽ được giữ lại; bạn có thể xóa chúng đi "
 "nếu muốn.\n"
 
-#: builtin/tag.c:324
+#: 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
 msgid "unable to sign the tag"
 msgstr "không thể ký thẻ"
 
-#: builtin/tag.c:326
+#: builtin/tag.c:430
 msgid "unable to write tag file"
 msgstr "không thể ghi vào tập tin lưu thẻ"
 
-#: builtin/tag.c:351
+#: builtin/tag.c:455
 msgid "bad object type."
 msgstr "kiểu đối tượng sai."
 
-#: builtin/tag.c:364
+#: builtin/tag.c:468
 msgid "tag header too big."
 msgstr "đầu thẻ (tag) quá lớn."
 
-#: builtin/tag.c:400
+#: builtin/tag.c:504
 msgid "no tag message?"
 msgstr "không có chú thích gì cho cho thẻ à?"
 
-#: builtin/tag.c:406
+#: builtin/tag.c:510
 #, 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:455
+#: 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:457
+#: builtin/tag.c:561
 #, c-format
 msgid "malformed object name '%s'"
 msgstr "tên đối tượng dị hình “%s”"
 
-#: builtin/tag.c:480
-#, c-format
-msgid "unsupported sort specification %s"
-msgstr "không hỗ trợ đặc tả sắp xếp %s"
-
-#: builtin/tag.c:500
+#: builtin/tag.c:589
 msgid "list tag names"
 msgstr "chỉ liệt kê tên các thẻ"
 
-#: builtin/tag.c:502
+#: builtin/tag.c:591
 msgid "print <n> lines of each tag message"
 msgstr "hiển thị <n> dòng cho mỗi ghi chú"
 
-#: builtin/tag.c:504
+#: builtin/tag.c:593
 msgid "delete tags"
 msgstr "xóa thẻ"
 
-#: builtin/tag.c:505
+#: builtin/tag.c:594
 msgid "verify tags"
 msgstr "thẩm tra thẻ"
 
-#: builtin/tag.c:507
+#: builtin/tag.c:596
 msgid "Tag creation options"
 msgstr "Tùy chọn tạo tag"
 
-#: builtin/tag.c:509
+#: builtin/tag.c:598
 msgid "annotated tag, needs a message"
 msgstr "để chú giải cho thẻ, cần một lời ghi chú"
 
-#: builtin/tag.c:511
+#: builtin/tag.c:600
 msgid "tag message"
 msgstr "tin nhắn cho thẻ (tag)"
 
-#: builtin/tag.c:513
+#: builtin/tag.c:602
 msgid "annotated and GPG-signed tag"
 msgstr "thẻ chú giải và ký kiểu GPG"
 
-#: builtin/tag.c:517
+#: builtin/tag.c:606
 msgid "use another key to sign the tag"
 msgstr "dùng kháo khác để ký thẻ"
 
-#: builtin/tag.c:518
+#: builtin/tag.c:607
 msgid "replace the tag if exists"
 msgstr "thay thế nếu tag đó đã có trước"
 
-#: builtin/tag.c:519
+#: builtin/tag.c:608
 msgid "show tag list in columns"
 msgstr "hiển thị danh sách thẻ trong các cột"
 
-#: builtin/tag.c:521
+#: builtin/tag.c:610
 msgid "sort tags"
 msgstr "sắp xếp các thẻ"
 
-#: builtin/tag.c:525
+#: builtin/tag.c:614
 msgid "Tag listing options"
 msgstr "Các tùy chọn liệt kê thẻ"
 
-#: builtin/tag.c:528 builtin/tag.c:534
+#: builtin/tag.c:617 builtin/tag.c:623
 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:540
+#: builtin/tag.c:629
 msgid "print only tags of the object"
 msgstr "chỉ hiển thị các thẻ của đối tượng"
 
-#: builtin/tag.c:566
+#: builtin/tag.c:655
 msgid "--column and -n are incompatible"
 msgstr "--column và -n xung khắc nhau"
 
-#: builtin/tag.c:578
+#: builtin/tag.c:667
 msgid "--sort and -n are incompatible"
 msgstr "--sort và -n xung khắc nhau"
 
-#: builtin/tag.c:585
+#: builtin/tag.c:674
 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:587
+#: builtin/tag.c:676
 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:589
+#: builtin/tag.c:678
 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:597
+#: builtin/tag.c:686
 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:617
+#: builtin/tag.c:706
 msgid "too many params"
 msgstr "quá nhiều đối số"
 
-#: builtin/tag.c:623
+#: builtin/tag.c:712
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "“%s” không phải thẻ hợp lệ."
 
-#: builtin/tag.c:628
+#: builtin/tag.c:717
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "Thẻ “%s” đã tồn tại rồi"
 
-#: builtin/tag.c:646
-#, c-format
-msgid "%s: cannot lock the ref"
-msgstr "%s: không thể khóa ref (tham chiếu)"
-
-#: builtin/tag.c:648
-#, c-format
-msgid "%s: cannot update the ref"
-msgstr "%s: không thể cập nhật ref (tham chiếu)"
-
-#: builtin/tag.c:650
+#: builtin/tag.c:741
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Đã cập nhật thẻ “%s” (trước là %s)\n"
 
-#: builtin/unpack-objects.c:483
+#: builtin/unpack-objects.c:489
 msgid "Unpacking objects"
 msgstr "Đang giải nén các đối tượng"
 
-#: builtin/update-index.c:399
+#: builtin/update-index.c:403
 msgid "git update-index [options] [--] [<file>...]"
 msgstr "git update-index [các-tùy-chọn] [<tập-tin>...]"
 
-#: builtin/update-index.c:748
+#: builtin/update-index.c:756
 msgid "continue refresh even when index needs update"
 msgstr "tiếp tục làm mới ngay cả khi bảng mục lục cần được cập nhật"
 
-#: builtin/update-index.c:751
+#: builtin/update-index.c:759
 msgid "refresh: ignore submodules"
 msgstr "refresh: lờ đi mô-đun-con"
 
-#: builtin/update-index.c:754
+#: builtin/update-index.c:762
 msgid "do not ignore new files"
 msgstr "không bỏ qua các tập tin mới tạo"
 
-#: builtin/update-index.c:756
+#: builtin/update-index.c:764
 msgid "let files replace directories and vice-versa"
 msgstr "để các tập tin thay thế các thư mục và “vice-versa”"
 
-#: builtin/update-index.c:758
+#: builtin/update-index.c:766
 msgid "notice files missing from worktree"
 msgstr "thông báo các tập-tin thiếu trong thư-mục làm việc"
 
-#: builtin/update-index.c:760
+#: builtin/update-index.c:768
 msgid "refresh even if index contains unmerged entries"
 msgstr ""
 "làm tươi mới thậm chí khi bảng mục lục chứa các mục tin chưa được hòa trộn"
 
-#: builtin/update-index.c:763
+#: builtin/update-index.c:771
 msgid "refresh stat information"
 msgstr "lấy lại thông tin thống kê"
 
-#: builtin/update-index.c:767
+#: builtin/update-index.c:775
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "giống --refresh, nhưng bỏ qua các cài đặt “assume-unchanged”"
 
-#: builtin/update-index.c:771
+#: builtin/update-index.c:779
 msgid "<mode>,<object>,<path>"
 msgstr "<chế_độ>,<đối_tượng>,<đường_dẫn>"
 
-#: builtin/update-index.c:772
+#: builtin/update-index.c:780
 msgid "add the specified entry to the index"
 msgstr "thêm các tập tin đã chỉ ra vào bảng mục lục"
 
-#: builtin/update-index.c:776
+#: builtin/update-index.c:784
 msgid "(+/-)x"
 msgstr "(+/-)x"
 
-#: builtin/update-index.c:777
+#: builtin/update-index.c:785
 msgid "override the executable bit of the listed files"
 msgstr "ghi đè lên bít thi hành của các tập tin được liệt kê"
 
-#: builtin/update-index.c:781
+#: builtin/update-index.c:789
 msgid "mark files as \"not changing\""
 msgstr "Đánh dấu các tập tin là \"không thay đổi\""
 
-#: builtin/update-index.c:784
+#: builtin/update-index.c:792
 msgid "clear assumed-unchanged bit"
 msgstr "xóa bít  assumed-unchanged"
 
-#: builtin/update-index.c:787
+#: builtin/update-index.c:795
 msgid "mark files as \"index-only\""
 msgstr "đánh dấu các tập tin là “chỉ-đọc”"
 
-#: builtin/update-index.c:790
+#: builtin/update-index.c:798
 msgid "clear skip-worktree bit"
 msgstr "xóa bít skip-worktree"
 
-#: builtin/update-index.c:793
+#: builtin/update-index.c:801
 msgid "add to index only; do not add content to object database"
 msgstr ""
 "chỉ thêm vào bảng mục lục; không thêm nội dung vào cơ sở dữ liệu đối tượng"
 
-#: builtin/update-index.c:795
+#: builtin/update-index.c:803
 msgid "remove named paths even if present in worktree"
 msgstr ""
 "gỡ bỏ các đường dẫn được đặt tên thậm chí cả khi nó hiện diện trong thư mục "
 "làm việc"
 
-#: builtin/update-index.c:797
+#: builtin/update-index.c:805
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "với tùy chọn --stdin: các dòng đầu vào được chấm dứt bởi ký tự null"
 
-#: builtin/update-index.c:799
+#: builtin/update-index.c:807
 msgid "read list of paths to be updated from standard input"
 msgstr "đọc danh sách đường dẫn cần cập nhật từ đầu vào tiêu chuẩn"
 
-#: builtin/update-index.c:803
+#: builtin/update-index.c:811
 msgid "add entries from standard input to the index"
 msgstr "không thể đọc các mục từ đầu vào tiêu chuẩn vào bảng mục lục"
 
-#: builtin/update-index.c:807
+#: builtin/update-index.c:815
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr "phục hồi các trạng thái #2 và #3 cho các đường dẫn được liệt kê"
 
-#: builtin/update-index.c:811
+#: builtin/update-index.c:819
 msgid "only update entries that differ from HEAD"
 msgstr "chỉ cập nhật các mục tin mà nó khác biệt so với HEAD"
 
-#: builtin/update-index.c:815
+#: builtin/update-index.c:823
 msgid "ignore files missing from worktree"
 msgstr "bỏ qua các tập-tin thiếu trong thư-mục làm việc"
 
-#: builtin/update-index.c:818
+#: builtin/update-index.c:826
 msgid "report actions to standard output"
 msgstr "báo cáo các thao tác ra thiết bị xuất chuẩn"
 
-#: builtin/update-index.c:820
+#: builtin/update-index.c:828
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(cho “porcelains”) quên các xung đột chưa được giải quyết đã ghi"
 
-#: builtin/update-index.c:824
+#: builtin/update-index.c:832
 msgid "write index in this format"
 msgstr "ghi mục lục ở định dạng này"
 
+#: builtin/update-index.c:834
+msgid "enable or disable split index"
+msgstr "bật/tắt chia cắt bảng mục lục"
+
 #: builtin/update-ref.c:9
 msgid "git update-ref [options] -d <refname> [<oldval>]"
 msgstr "git update-ref [các-tùy-chọn] -d <refname> [<biến-cũ>]"
@@ -9718,19 +10059,19 @@
 msgid "git update-ref [options] --stdin [-z]"
 msgstr "git update-ref [các-tùy-chọn] --stdin [-z]"
 
-#: builtin/update-ref.c:256
+#: builtin/update-ref.c:363
 msgid "delete the reference"
 msgstr "xóa tham chiếu"
 
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:365
 msgid "update <refname> not the one it points to"
 msgstr "cập nhật <tên-tham-chiếu> không phải cái nó chỉ tới"
 
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:366
 msgid "stdin has NUL-terminated arguments"
 msgstr "đầu vào tiêu chuẩn có các đối số được chấm dứt bởi NUL"
 
-#: builtin/update-ref.c:260
+#: builtin/update-ref.c:367
 msgid "read updates from stdin"
 msgstr "đọc cập nhật từ đầu vào tiêu chuẩn"
 
@@ -9742,15 +10083,23 @@
 msgid "update the info files from scratch"
 msgstr "cập nhật các tập tin thông tin từ điểm xuất phát"
 
-#: builtin/verify-pack.c:56
+#: builtin/verify-commit.c:17
+msgid "git verify-commit [-v|--verbose] <commit>..."
+msgstr "git verify-commit [-v|--verbose] <lần_chuyển_giao>..."
+
+#: builtin/verify-commit.c:75
+msgid "print commit contents"
+msgstr "hiển thị nội dung của lần chuyển giao"
+
+#: builtin/verify-pack.c:54
 msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."
 msgstr "git verify-pack [-v|--verbose] [-s|--stat-only] <gói>..."
 
-#: builtin/verify-pack.c:66
+#: builtin/verify-pack.c:64
 msgid "verbose"
 msgstr "chi tiết"
 
-#: builtin/verify-pack.c:68
+#: builtin/verify-pack.c:66
 msgid "show statistics only"
 msgstr "chỉ hiển thị thống kê"
 
@@ -9778,9 +10127,13 @@
 msgid "only useful for debugging"
 msgstr "chỉ hữu ích khi cần gỡ lỗi"
 
+#: credential-cache--daemon.c:267
+msgid "print debugging messages to stderr"
+msgstr "in thông tin gỡ lỗi ra đầu ra lỗi tiêu chuẩn"
+
 #: git.c:17
 msgid ""
-"'git help -a' and 'git help -g' lists available subcommands and some\n"
+"'git help -a' and 'git help -g' list available subcommands and some\n"
 "concept guides. See 'git help <command>' or 'git help <concept>'\n"
 "to read about a specific subcommand or concept."
 msgstr ""
@@ -9788,26 +10141,6 @@
 "hướng dẫn về khái niệm. Xem “git help <lệnh>” hay “git help <khái-niệm>”\n"
 "để xem các đặc tả cho lệnh hay khái niệm cụ thể."
 
-#: parse-options.h:143
-msgid "expiry-date"
-msgstr "ngày hết hạn"
-
-#: parse-options.h:158
-msgid "no-op (backward compatibility)"
-msgstr "no-op (tương thích ngược)"
-
-#: parse-options.h:232
-msgid "be more verbose"
-msgstr "chi tiết hơn nữa"
-
-#: parse-options.h:234
-msgid "be more quiet"
-msgstr "im lặng hơn nữa"
-
-#: parse-options.h:240
-msgid "use <n> digits to display SHA-1s"
-msgstr "sử dụng <n> chữ số để hiển thị SHA-1s"
-
 #: common-cmds.h:8
 msgid "Add file contents to the index"
 msgstr "Thêm nội dung tập tin vào bảng mục lục"
@@ -9896,6 +10229,30 @@
 msgid "Create, list, delete or verify a tag object signed with GPG"
 msgstr "Tạo, liệt kê, xóa hay xác thực một đối tượng thẻ được ký bằng GPG"
 
+#: parse-options.h:143
+msgid "expiry-date"
+msgstr "ngày hết hạn"
+
+#: parse-options.h:158
+msgid "no-op (backward compatibility)"
+msgstr "no-op (tương thích ngược)"
+
+#: parse-options.h:232
+msgid "be more verbose"
+msgstr "chi tiết hơn nữa"
+
+#: parse-options.h:234
+msgid "be more quiet"
+msgstr "im lặng hơn nữa"
+
+#: parse-options.h:240
+msgid "use <n> digits to display SHA-1s"
+msgstr "sử dụng <n> chữ số để hiển thị SHA-1s"
+
+#: rerere.h:27
+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-am.sh:52
 msgid "You need to set your committer info first"
 msgstr "Bạn cần đặt thông tin về người chuyển giao mã nguồn trước đã"
@@ -10118,7 +10475,7 @@
 
 #: git-bisect.sh:144
 msgid "Bad HEAD - strange symbolic ref"
-msgstr "HEAD sai - tham chiếu (ref) tượng trưng kỳ lạ"
+msgstr "HEAD sai - tham chiếu mềm kỳ lạ"
 
 #: git-bisect.sh:189
 #, sh-format
@@ -10156,7 +10513,7 @@
 
 #: git-bisect.sh:289
 msgid ""
-"You need to give me at least one good and one bad revisions.\n"
+"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.)"
 msgstr ""
 "Bạn phải chỉ cho tôi ít nhất một điểm xét duyệt tốt và một điểm sai.\n"
@@ -10165,7 +10522,7 @@
 #: git-bisect.sh:292
 msgid ""
 "You need to start by \"git bisect start\".\n"
-"You then need to give me at least one good and one bad revisions.\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.)"
 msgstr ""
 "Bạn cần bắt đầu bằng lệnh \"git bisect start\".\n"
@@ -10239,25 +10596,33 @@
 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, or use 'git commit -a'."
+"as appropriate to mark resolution and make a commit."
 msgstr ""
 "Pull là không thể được bởi vì bạn có những tập tin chưa được hòa trộn.\n"
 "Xin hãy sửa chữa chúng trước, và sau đó sử dụng lệnh “git add/rm <tập-tin>”\n"
-"để phê chuẩn việc đánh dấu đây cần được giải quyết, hoặc là sử dụng “git "
-"commit -a”."
+"để phê chuẩn việc đánh dấu đây cần được giải quyết và tạo một lần chuyển "
+"giao."
 
 #: git-pull.sh:25
 msgid "Pull is not possible because you have unmerged files."
 msgstr ""
 "Full là không thể thực hiện bởi vì bạn có những tập tin chưa được hòa trộn."
 
-#: git-pull.sh:247
+#: git-pull.sh:31
+msgid ""
+"You have not concluded your merge (MERGE_HEAD exists).\n"
+"Please, commit your changes before you can merge."
+msgstr ""
+"Bạn chưa kết thúc việc hòa trộng (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."
+
+#: git-pull.sh:245
 msgid "updating an unborn branch with changes added to the index"
 msgstr ""
 "đang cập nhật một nhánh chưa được sinh ra với các thay đổi được thêm vào "
 "bảng mục lục"
 
-#: git-pull.sh:271
+#: git-pull.sh:269
 #, sh-format
 msgid ""
 "Warning: fetch updated the current branch head.\n"
@@ -10268,11 +10633,11 @@
 "Cảnh báo: đang fast-forward cây làm việc của bạn từ\n"
 "Cảnh báo: commit $orig_head."
 
-#: git-pull.sh:296
+#: git-pull.sh:294
 msgid "Cannot merge multiple branches into empty head"
 msgstr "Không thể hòa trộn nhiều nhánh và trong một head trống rỗng"
 
-#: git-pull.sh:300
+#: git-pull.sh:298
 msgid "Cannot rebase onto multiple branches"
 msgstr "Không thể thực hiện lệnh rebase (cơ cấu lại) trên nhiều nhánh"
 
@@ -10289,16 +10654,16 @@
 "Để phục hồi lại thành nhánh nguyên thủy và dừng việc vá lại thì chạy \"git "
 "rebase --abort\"."
 
-#: git-rebase.sh:164
+#: git-rebase.sh:165
 msgid "Applied autostash."
 msgstr "Đã áp dụng autostash."
 
-#: git-rebase.sh:167
+#: git-rebase.sh:168
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Không thể lưu $stash_sha1"
 
-#: git-rebase.sh:168
+#: git-rebase.sh:169
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
@@ -10309,35 +10674,35 @@
 "Bạn có thể chạy lệnh \"git stash pop\" hay \"git stash drop\" bất kỳ lúc "
 "nào.\n"
 
-#: git-rebase.sh:207
+#: git-rebase.sh:208
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Móc (hook) pre-rebase từ chối rebase."
 
-#: git-rebase.sh:212
+#: git-rebase.sh:213
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr ""
 "Hình như đang trong quá trình thực hiện lệnh git-am. Không thể chạy lệnh "
 "rebase."
 
-#: git-rebase.sh:350
+#: git-rebase.sh:351
 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:355
+#: git-rebase.sh:356
 msgid "No rebase in progress?"
 msgstr "Không có tiến trình rebase nào phải không?"
 
-#: git-rebase.sh:366
+#: git-rebase.sh:367
 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:373
+#: git-rebase.sh:374
 msgid "Cannot read HEAD"
 msgstr "Không thể đọc HEAD"
 
-#: git-rebase.sh:376
+#: git-rebase.sh:377
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -10345,12 +10710,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:394
+#: git-rebase.sh:395
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Không thể quay trở lại $head_name"
 
-#: git-rebase.sh:413
+#: git-rebase.sh:414
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -10373,65 +10738,65 @@
 "\n"
 "TÔI: là lệnh bạn vừa gọi!"
 
-#: git-rebase.sh:464
+#: git-rebase.sh:465
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "thượng nguồn không hợp lệ $upstream_name"
 
-#: git-rebase.sh:488
+#: git-rebase.sh:489
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: ở đây có nhiều hơn một nền móng hòa trộn"
 
-#: git-rebase.sh:491 git-rebase.sh:495
+#: git-rebase.sh:492 git-rebase.sh:496
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: ở đây không có nền móng hòa trộn nào"
 
-#: git-rebase.sh:500
+#: git-rebase.sh:501
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "Không chỉ đến một lần chuyển giao không hợp lệ: $onto_name"
 
-#: git-rebase.sh:523
+#: git-rebase.sh:524
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "nghiêm trọng: không có nhánh như thế: $branch_name"
 
-#: git-rebase.sh:556
+#: git-rebase.sh:557
 msgid "Cannot autostash"
 msgstr "Không thể autostash"
 
-#: git-rebase.sh:561
+#: git-rebase.sh:562
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Đã tạo autostash: $stash_abbrev"
 
-#: git-rebase.sh:565
+#: git-rebase.sh:566
 msgid "Please commit or stash them."
 msgstr "Xin hãy commit hoặc tạm cất (stash) chúng."
 
-#: git-rebase.sh:585
+#: git-rebase.sh:586
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "Nhánh hiện tại $branch_name đã được cập nhật rồi."
 
-#: git-rebase.sh:589
+#: git-rebase.sh:590
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "Nhánh hiện tại $branch_name đã được cập nhật rồi, lệnh rebase ép buộc."
 
-#: git-rebase.sh:600
+#: git-rebase.sh:601
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Thay đổi từ $mb thành $onto:"
 
-#: git-rebase.sh:609
+#: git-rebase.sh:610
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 "Trước tiên, di chuyển head để xem lại các công việc trên đỉnh của nó..."
 
-#: git-rebase.sh:619
+#: git-rebase.sh:620
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "Fast-forward $branch_name thành $onto_name."
@@ -10449,23 +10814,23 @@
 msgid "Cannot save the current index state"
 msgstr "Không thể ghi lại trạng thái bảng mục lục hiện hành"
 
-#: git-stash.sh:123 git-stash.sh:136
+#: git-stash.sh:124 git-stash.sh:137
 msgid "Cannot save the current worktree state"
 msgstr "Không thể ghi lại trạng thái cây-làm-việc hiện hành"
 
-#: git-stash.sh:140
+#: git-stash.sh:141
 msgid "No changes selected"
 msgstr "Chưa có thay đổi nào được chọn"
 
-#: git-stash.sh:143
+#: git-stash.sh:144
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "Không thể gỡ bỏ bảng mục lục tạm thời (không thể xảy ra)"
 
-#: git-stash.sh:156
+#: git-stash.sh:157
 msgid "Cannot record working tree state"
 msgstr "Không thể ghi lại trạng thái cây làm việc hiện hành"
 
-#: git-stash.sh:190
+#: git-stash.sh:191
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "Không thể cập nhật $ref_stash với $w_commit"
@@ -10480,7 +10845,7 @@
 #. $ 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:237
+#: git-stash.sh:238
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -10490,85 +10855,85 @@
 "     Để có thể dùng lời chú thích có chứa -- ở đầu,\n"
 "     dùng git stash save -- \"$option\""
 
-#: git-stash.sh:258
+#: git-stash.sh:259
 msgid "No local changes to save"
 msgstr "Không có thay đổi nội bộ nào được ghi lại"
 
-#: git-stash.sh:262
+#: git-stash.sh:263
 msgid "Cannot initialize stash"
 msgstr "Không thể khởi tạo stash"
 
-#: git-stash.sh:266
+#: git-stash.sh:267
 msgid "Cannot save the current status"
 msgstr "Không thể ghi lại trạng thái hiện hành"
 
-#: git-stash.sh:284
+#: git-stash.sh:285
 msgid "Cannot remove worktree changes"
 msgstr "Không thể gỡ bỏ các thay đổi cây-làm-việc"
 
-#: git-stash.sh:383
+#: git-stash.sh:384
 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:390
+#: git-stash.sh:391
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Chỉ ra quá nhiều điểm xét duyệt: $REV"
 
-#: git-stash.sh:396
+#: git-stash.sh:397
 #, sh-format
-msgid "$reference is not valid reference"
+msgid "$reference is not a valid reference"
 msgstr "$reference không phải là tham chiếu hợp lệ"
 
-#: git-stash.sh:424
+#: git-stash.sh:425
 #, 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:435
+#: git-stash.sh:436
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "”$args” không phải tham chiếu đến stash"
 
-#: git-stash.sh:443
+#: git-stash.sh:444
 msgid "unable to refresh index"
 msgstr "không thể làm tươi mới bảng mục lục"
 
-#: git-stash.sh:447
+#: git-stash.sh:448
 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:455
+#: git-stash.sh:456
 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:457
+#: git-stash.sh:458
 msgid "Could not save index tree"
 msgstr "Không thể ghi lại cây chỉ mục"
 
-#: git-stash.sh:491
+#: git-stash.sh:492
 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:506
+#: git-stash.sh:507
 msgid "Index was not unstashed."
 msgstr "Bảng mục lục đã không được bỏ stash."
 
-#: git-stash.sh:529
+#: git-stash.sh:530
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Đã xóa ${REV} ($s)"
 
-#: git-stash.sh:530
+#: git-stash.sh:531
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Không thể xóa bỏ mục stash"
 
-#: git-stash.sh:537
+#: git-stash.sh:539
 msgid "No branch name specified"
 msgstr "Chưa chỉ ra tên của nhánh"
 
-#: git-stash.sh:609
+#: git-stash.sh:611
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Để phục hồi lại chúng hãy gõ \"git stash apply\")"
 
@@ -10589,30 +10954,30 @@
 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:299
+#: 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:409
+#: git-submodule.sh:406
 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:419
+#: git-submodule.sh:416
 #, 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:436
+#: git-submodule.sh:433
 #, 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:440
+#: git-submodule.sh:437
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -10624,36 +10989,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:458
+#: git-submodule.sh:455
 #, 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:460
+#: git-submodule.sh:457
 #, 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:468
+#: git-submodule.sh:465
 #, 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:470
+#: git-submodule.sh:467
 #, 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:472
+#: git-submodule.sh:469
 #, 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:473
+#: git-submodule.sh:470
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
@@ -10662,71 +11027,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:475
+#: git-submodule.sh:472
 #, 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:487
+#: git-submodule.sh:484
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Không thể lấy ra mô-đun-con “$sm_path”"
 
-#: git-submodule.sh:492
+#: git-submodule.sh:489
 #, 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:501
+#: git-submodule.sh:498
 #, 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:545
+#: git-submodule.sh:542
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "Đang vào “$prefix$displaypath”"
 
-#: git-submodule.sh:565
+#: git-submodule.sh:562
 #, 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:611
+#: git-submodule.sh:608
 #, 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:620
+#: git-submodule.sh:617
 #, 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:622
+#: git-submodule.sh:619
 #, 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:639
+#: git-submodule.sh:636
 #, 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:677
+#: git-submodule.sh:674
 #, 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:694
+#: git-submodule.sh:691
 #, 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:695
+#: git-submodule.sh:692
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
@@ -10734,7 +11099,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:701
+#: git-submodule.sh:698
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -10743,27 +11108,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:704
+#: git-submodule.sh:701
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Đã tạo thư mục “$displaypath”"
 
-#: git-submodule.sh:705
+#: git-submodule.sh:702
 #, 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:708
+#: git-submodule.sh:705
 #, 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:717
+#: git-submodule.sh:714
 #, 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:833
+#: git-submodule.sh:830
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
@@ -10772,55 +11137,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:846
+#: git-submodule.sh:843
 #, 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:855
+#: git-submodule.sh:852
 #, 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:879
+#: git-submodule.sh:876
 #, 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:893
+#: git-submodule.sh:890
 #, 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:894
+#: git-submodule.sh:891
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Đường dẫn mô-đun-con “$displaypath”: đã checkout “$sha1”"
 
-#: git-submodule.sh:898
+#: git-submodule.sh:895
 #, 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:899
+#: git-submodule.sh:896
 #, 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:904
+#: git-submodule.sh:901
 #, 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:905
+#: git-submodule.sh:902
 #, 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:910
+#: git-submodule.sh:907
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule  path '$prefix$sm_path'"
@@ -10828,56 +11193,92 @@
 "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:911
+#: git-submodule.sh:908
 #, 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:941
+#: git-submodule.sh:938
 #, 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:1049
+#: git-submodule.sh:1046
 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:1097
+#: git-submodule.sh:1098
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "chế độ không như mong chờ $mod_dst"
 
-#: git-submodule.sh:1117
+#: git-submodule.sh:1118
 #, 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:1120
+#: git-submodule.sh:1121
 #, 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:1123
+#: git-submodule.sh:1124
 #, 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:1148
+#: git-submodule.sh:1149
 msgid "blob"
 msgstr "blob"
 
-#: git-submodule.sh:1262
+#: git-submodule.sh:1267
 #, 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:1326
+#: git-submodule.sh:1331
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
 
+#~ msgid "Failed to lock ref for update"
+#~ msgstr "Gặp lỗi khi khóa tham chiếu để cập nhật"
+
+#~ msgid "Failed to write ref"
+#~ msgstr "Gặp lỗi khi ghi tham chiếu"
+
+#~ msgid "invalid commit: %s"
+#~ msgstr "lần chuyển giao không hợp lệ: %s"
+
+#~ msgid "commit has empty message"
+#~ msgstr "lần chuyển giao có ghi chú trống rỗng"
+
+#~ msgid "cannot lock HEAD ref"
+#~ msgstr "không thể khóa HEAD ref (tham chiếu)"
+
+#~ msgid "cannot update HEAD ref"
+#~ msgstr "không thể cập nhật ref (tham chiếu) HEAD"
+
+#~ msgid "Invalid %s: '%s'"
+#~ msgstr "%s không hợp lệ: “%s”"
+
+#~ msgid "Failed to chdir: %s"
+#~ msgstr "Gặp lỗi với lệnh chdir: %s"
+
+#~ msgid "cannot tell cwd"
+#~ msgstr "không nói chuyện được với lệnh cwd"
+
+#~ msgid "%s: cannot lock the ref"
+#~ msgstr "%s: không thể khóa ref (tham chiếu)"
+
+#~ msgid "%s: cannot update the ref"
+#~ msgstr "%s: không thể cập nhật ref (tham chiếu)"
+
+#~ msgid "Failed to lock HEAD during fast_forward_to"
+#~ msgstr "Gặp lỗi khi khóa HEAD trong quá trình fast_forward_to"
+
 #~ msgid "key id"
 #~ msgstr "id của khóa"
 
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 06cc173..abe5f9f 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -12,8 +12,8 @@
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-04-23 12:50+0800\n"
-"PO-Revision-Date: 2014-04-23 12:53+0800\n"
+"POT-Creation-Date: 2014-11-01 07:46+0800\n"
+"PO-Revision-Date: 2014-11-02 10:58+0800\n"
 "Last-Translator: Jiang Xin <worldhello.net@gmail.com>\n"
 "Language-Team: GitHub <https://github.com/gotgit/git/>\n"
 "Language: zh_CN\n"
@@ -27,109 +27,106 @@
 msgid "hint: %.*s\n"
 msgstr "提示:%.*s\n"
 
-#: advice.c:85
+#: advice.c:88
 msgid ""
-"Fix them up in the work tree,\n"
-"and then use 'git add/rm <file>' as\n"
-"appropriate to mark resolution and make a commit,\n"
-"or use 'git commit -a'."
+"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 ""
-"请先在工作区改正文件,然后酌情使用\n"
-"'git add/rm <file>' 标记解决方案,\n"
-"或使用 'git commit -a'。"
+"请在工作区改正文件,然后酌情使用 'git add/rm <file>' 命令标记\n"
+"解决方案并提交。"
 
-#: archive.c:10
+#: archive.c:11
 msgid "git archive [options] <tree-ish> [<path>...]"
 msgstr "git archive [选项] <树或提交> [<路径>...]"
 
-#: archive.c:11
+#: archive.c:12
 msgid "git archive --list"
 msgstr "git archive --list"
 
-#: archive.c:12
+#: archive.c:13
 msgid ""
 "git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]"
 msgstr ""
 "git archive --remote <版本库> [--exec <命令>] [选项] <树或提交> [<路径>...]"
 
-#: archive.c:13
+#: archive.c:14
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <版本库> [--exec <命令>] --list"
 
-#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
+#: archive.c:334 builtin/add.c:137 builtin/add.c:427 builtin/rm.c:328
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "路径规则 '%s' 未匹配任何文件"
 
-#: archive.c:328
+#: archive.c:419
 msgid "fmt"
 msgstr "格式"
 
-#: archive.c:328
+#: archive.c:419
 msgid "archive format"
 msgstr "归档格式"
 
-#: archive.c:329 builtin/log.c:1193
+#: archive.c:420 builtin/log.c:1204
 msgid "prefix"
 msgstr "前缀"
 
-#: archive.c:330
+#: archive.c:421
 msgid "prepend prefix to each pathname in the archive"
 msgstr "为归档中每个路径名加上前缀"
 
-#: archive.c:331 builtin/archive.c:88 builtin/blame.c:2265
-#: builtin/blame.c:2266 builtin/config.c:57 builtin/fast-export.c:680
-#: builtin/fast-export.c:682 builtin/grep.c:714 builtin/hash-object.c:77
-#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:412
-#: builtin/notes.c:569 builtin/read-tree.c:108 parse-options.h:151
+#: archive.c:422 builtin/archive.c:88 builtin/blame.c:2517
+#: builtin/blame.c:2518 builtin/config.c:57 builtin/fast-export.c:986
+#: builtin/fast-export.c:988 builtin/grep.c:712 builtin/hash-object.c:101
+#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:411
+#: builtin/notes.c:568 builtin/read-tree.c:109 parse-options.h:151
 msgid "file"
 msgstr "文件"
 
-#: archive.c:332 builtin/archive.c:89
+#: archive.c:423 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr "归档写入此文件"
 
-#: archive.c:334
+#: archive.c:425
 msgid "read .gitattributes in working directory"
 msgstr "读取工作区中的 .gitattributes"
 
-#: archive.c:335
+#: archive.c:426
 msgid "report archived files on stderr"
 msgstr "在标准错误上报告归档文件"
 
-#: archive.c:336
+#: archive.c:427
 msgid "store only"
 msgstr "只存储"
 
-#: archive.c:337
+#: archive.c:428
 msgid "compress faster"
 msgstr "压缩速度更快"
 
-#: archive.c:345
+#: archive.c:436
 msgid "compress better"
 msgstr "压缩效果更好"
 
-#: archive.c:348
+#: archive.c:439
 msgid "list supported archive formats"
 msgstr "列出支持的归档格式"
 
-#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:441 builtin/archive.c:90 builtin/clone.c:85
 msgid "repo"
 msgstr "版本库"
 
-#: archive.c:351 builtin/archive.c:91
+#: archive.c:442 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "从远程版本库(<版本库>)提取归档文件"
 
-#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
+#: archive.c:443 builtin/archive.c:92 builtin/notes.c:490
 msgid "command"
 msgstr "命令"
 
-#: archive.c:353 builtin/archive.c:93
+#: archive.c:444 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr "远程 git-upload-archive 命令的路径"
 
-#: attr.c:259
+#: attr.c:258
 msgid ""
 "Negative patterns are ignored in git attributes\n"
 "Use '\\!' for literal leading exclamation."
@@ -187,31 +184,31 @@
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr "未跟踪:引用 %s 有歧义"
 
-#: branch.c:178
+#: branch.c:162
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "'%s' 不是一个有效的分支名称。"
 
-#: branch.c:183
+#: branch.c:167
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "一个分支名 '%s' 已经存在。"
 
-#: branch.c:191
+#: branch.c:175
 msgid "Cannot force update the current branch."
 msgstr "无法强制更新当前分支。"
 
-#: branch.c:211
+#: branch.c:195
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr "无法设置跟踪信息;起始点 '%s' 不是一个分支。"
 
-#: branch.c:213
+#: branch.c:197
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "请求的上游分支 '%s' 不存在"
 
-#: branch.c:215
+#: branch.c:199
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -229,113 +226,111 @@
 "如果您正计划推送一个能与对应远程分支建立跟踪的新的本地分支,\n"
 "您可能需要使用 \"git push -u\" 推送分支并配置和上游的关联。"
 
-#: branch.c:260
+#: branch.c:243
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "不是一个有效的对象名:'%s'。"
 
-#: branch.c:280
+#: branch.c:263
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "歧义的对象名:'%s'。"
 
-#: branch.c:285
+#: branch.c:268
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "无效的分支点:'%s'。"
 
-#: branch.c:291
-msgid "Failed to lock ref for update"
-msgstr "无法为更新锁定引用"
-
-#: branch.c:309
-msgid "Failed to write ref"
-msgstr "不能写引用"
-
-#: bundle.c:33
+#: bundle.c:34
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
 msgstr "'%s' 不像是一个 v2 版本的包文件"
 
-#: bundle.c:60
+#: bundle.c:61
 #, c-format
 msgid "unrecognized header: %s%s (%d)"
 msgstr "未能识别的包头:%s%s (%d)"
 
-#: bundle.c:86 builtin/commit.c:706
+#: bundle.c:87 builtin/commit.c:788
 #, c-format
 msgid "could not open '%s'"
 msgstr "不能打开 '%s'"
 
-#: bundle.c:138
+#: bundle.c:139
 msgid "Repository lacks these prerequisite commits:"
 msgstr "版本库缺少这些必备的提交:"
 
-#: bundle.c:162 sequencer.c:669 sequencer.c:1123 builtin/log.c:332
-#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357
+#: bundle.c:163 sequencer.c:641 sequencer.c:1096 builtin/blame.c:2706
+#: builtin/branch.c:652 builtin/commit.c:1085 builtin/log.c:330
+#: builtin/log.c:823 builtin/log.c:1432 builtin/log.c:1669 builtin/merge.c:357
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "版本遍历设置失败"
 
-#: bundle.c:184
+#: bundle.c:185
 #, c-format
 msgid "The bundle contains this ref:"
 msgid_plural "The bundle contains these %d refs:"
 msgstr[0] "这个包中含有这个引用:"
 msgstr[1] "这个包中含有 %d 个引用:"
 
-#: bundle.c:191
+#: bundle.c:192
 msgid "The bundle records a complete history."
 msgstr "这个包记录一个完整历史。"
 
-#: bundle.c:193
+#: bundle.c:194
 #, c-format
 msgid "The bundle requires this ref:"
 msgid_plural "The bundle requires these %d refs:"
 msgstr[0] "这个包需要这个引用:"
 msgstr[1] "这个包需要 %d 个引用:"
 
-#: bundle.c:293
+#: bundle.c:292
 msgid "rev-list died"
 msgstr "rev-list 终止"
 
-#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:298 builtin/log.c:153 builtin/log.c:1342 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "未能识别的参数:%s"
 
-#: bundle.c:334
+#: bundle.c:333
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "引用 '%s' 被 rev-list 选项排除"
 
-#: bundle.c:379
+#: bundle.c:378
 msgid "Refusing to create empty bundle."
 msgstr "不能创建空包。"
 
-#: bundle.c:395
+#: bundle.c:393
 msgid "Could not spawn pack-objects"
 msgstr "不能生成 pack-objects 进程"
 
-#: bundle.c:413
+#: bundle.c:411
 msgid "pack-objects died"
 msgstr "pack-objects 终止"
 
-#: bundle.c:416
+#: bundle.c:414
 #, c-format
 msgid "cannot create '%s'"
 msgstr "不能创建 '%s'"
 
-#: bundle.c:438
+#: bundle.c:435
 msgid "index-pack died"
 msgstr "index-pack 终止"
 
-#: commit.c:54
+#: color.c:157
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr "无效的颜色值:%.*s"
+
+#: commit.c:40
 #, c-format
 msgid "could not parse %s"
 msgstr "不能解析 %s"
 
-#: commit.c:56
+#: commit.c:42
 #, c-format
 msgid "%s %s is not a commit!"
 msgstr "%s %s 不是一个提交!"
@@ -344,16 +339,69 @@
 msgid "memory exhausted"
 msgstr "内存耗尽"
 
-#: connected.c:70
+#: config.c:469 config.c:471
+#, c-format
+msgid "bad config file line %d in %s"
+msgstr "配置文件 %2$s 出错于第 %1$d 行"
+
+#: config.c:587
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "文件 %3$s 中配置变量 '%2$s' 的数字取值 '%1$s' 设置错误: %4$s"
+
+#: config.c:589
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "配置变量 '%2$s' 的数字取值 '%1$s' 设置错误: %3$s"
+
+#: config.c:674
+#, c-format
+msgid "failed to expand user dir in: '%s'"
+msgstr "无法扩展 '%s' 中的用户目录"
+
+#: config.c:752 config.c:763
+#, c-format
+msgid "bad zlib compression level %d"
+msgstr "错误的 zlib 压缩级别 %d"
+
+#: config.c:885
+#, c-format
+msgid "invalid mode for object creation: %s"
+msgstr "无效的对象创建模式:%s"
+
+#: config.c:1201
+msgid "unable to parse command-line config"
+msgstr "无法解析命令行中的配置"
+
+#: config.c:1262
+msgid "unknown error occured while reading the configuration files"
+msgstr "在读取配置文件时遇到未知错误"
+
+#: config.c:1586
+#, c-format
+msgid "unable to parse '%s' from command-line config"
+msgstr "无法解析命令行配置中的 '%s'"
+
+#: config.c:1588
+#, c-format
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "在文件 '%2$s' 的第 %3$d 行发现错误的配置变量 '%1$s'"
+
+#: config.c:1647
+#, 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:90
+#: connected.c:89
 #, c-format
 msgid "failed write to rev-list: %s"
 msgstr "无法写入 rev-list:%s"
 
-#: connected.c:98
+#: connected.c:97
 #, c-format
 msgid "failed to close rev-list's stdin: %s"
 msgstr "无法关闭 rev-list 的标准输入:%s"
@@ -431,28 +479,28 @@
 msgid "failed to read orderfile '%s'"
 msgstr "无法读取排序文件 '%s'"
 
-#: diffcore-rename.c:517
+#: diffcore-rename.c:516
 msgid "Performing inexact rename detection"
 msgstr "正在进行非精确的重命名检测"
 
 #  译者:注意保持前导空格
-#: diff.c:113
+#: diff.c:114
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr "  无法解析 dirstat 截止(cut-off)百分比 '%s'\n"
 
 #  译者:注意保持前导空格
-#: diff.c:118
+#: diff.c:119
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  未知的 dirstat 参数 '%s'\n"
 
-#: diff.c:213
+#: diff.c:214
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "配置变量 'diff.submodule' 未知的取值:'%s'"
 
-#: diff.c:263
+#: diff.c:266
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -461,7 +509,16 @@
 "发现配置变量 'diff.dirstat' 中的错误:\n"
 "%s"
 
-#: diff.c:3495
+#: diff.c:2957
+#, c-format
+msgid "external diff died, stopping at %s"
+msgstr "外部 diff 退出,停止在 %s"
+
+#: diff.c:3352
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow 参数后只跟一个 pathspec"
+
+#: diff.c:3515
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -470,58 +527,58 @@
 "无法解析 --dirstat/-X 选项的参数:\n"
 "%s"
 
-#: diff.c:3509
+#: diff.c:3529
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "无法解析 --submodule 选项的参数:'%s'"
 
-#: gpg-interface.c:59 gpg-interface.c:131
+#: gpg-interface.c:129 gpg-interface.c:200
 msgid "could not run gpg."
 msgstr "不能执行 gpg。"
 
-#: gpg-interface.c:71
+#: gpg-interface.c:141
 msgid "gpg did not accept the data"
 msgstr "gpg 没有接受数据"
 
-#: gpg-interface.c:82
+#: gpg-interface.c:152
 msgid "gpg failed to sign the data"
 msgstr "gpg 无法为数据签名"
 
-#: gpg-interface.c:115
+#: gpg-interface.c:185
 #, c-format
 msgid "could not create temporary file '%s': %s"
 msgstr "不能创建临时文件 '%s':%s"
 
-#: gpg-interface.c:118
+#: gpg-interface.c:188
 #, c-format
 msgid "failed writing detached signature to '%s': %s"
 msgstr "无法将分离式签名写入 '%s':%s"
 
-#: grep.c:1698
+#: grep.c:1718
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "'%s':无法读取 %s"
 
-#: grep.c:1715
+#: grep.c:1735
 #, c-format
 msgid "'%s': %s"
 msgstr "'%s':%s"
 
-#: grep.c:1726
+#: grep.c:1746
 #, c-format
 msgid "'%s': short read %s"
 msgstr "'%s':读取不完整 %s"
 
-#: help.c:209
+#: help.c:207
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "在 '%s' 下可用的 git 命令"
 
-#: help.c:216
+#: help.c:214
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "在 $PATH 路径中的其他地方可用的 git 命令"
 
-#: help.c:232
+#: help.c:230
 msgid "The most commonly used git commands are:"
 msgstr "最常用的 git 命令有:"
 
@@ -557,7 +614,7 @@
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git:'%s' 不是一个 git 命令。参见 'git --help'。"
 
-#: help.c:384 help.c:443
+#: help.c:384 help.c:444
 msgid ""
 "\n"
 "Did you mean this?"
@@ -571,92 +628,100 @@
 "\n"
 "您指的是这其中的某一个么?"
 
-#: help.c:439
+#: help.c:440
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s:%s - %s"
 
-#: merge.c:56
+#: lockfile.c:275
+msgid "BUG: reopen a lockfile that is still open"
+msgstr "BUG: 重新打开一个仍打开着的锁文件"
+
+#: lockfile.c:277
+msgid "BUG: reopen a lockfile that has been committed"
+msgstr "BUG: 重新打开一个已提交的锁文件"
+
+#: merge.c:41
 msgid "failed to read the cache"
 msgstr "无法读取缓存"
 
-#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
-#: builtin/clone.c:661
+#: merge.c:94 builtin/checkout.c:356 builtin/checkout.c:562
+#: builtin/clone.c:659
 msgid "unable to write new index file"
 msgstr "无法写新的索引文件"
 
-#: merge-recursive.c:190
+#: merge-recursive.c:189
 #, c-format
 msgid "(bad commit)\n"
 msgstr "(坏提交)\n"
 
-#: merge-recursive.c:208
+#: merge-recursive.c:209
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "为路径 '%s' addinfo_cache 失败"
 
-#: merge-recursive.c:271
+#: merge-recursive.c:270
 msgid "error building trees"
 msgstr "无法创建树"
 
-#: merge-recursive.c:675
+#: merge-recursive.c:691
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "无法创建路径 '%s'%s"
 
-#: merge-recursive.c:686
+#: merge-recursive.c:702
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "删除 %s 以便为子目录留出空间\n"
 
-#: merge-recursive.c:700 merge-recursive.c:721
+#: merge-recursive.c:716 merge-recursive.c:737
 msgid ": perhaps a D/F conflict?"
 msgstr ":可能是一个目录/文件冲突?"
 
-#: merge-recursive.c:711
+#: merge-recursive.c:727
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "拒绝丢弃 '%s' 中的未跟踪文件"
 
-#: merge-recursive.c:751
+#: merge-recursive.c:767
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "不能读取对象 %s '%s'"
 
-#: merge-recursive.c:753
+#: merge-recursive.c:769
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "%s '%s' 应为数据(blob)对象"
 
-#: merge-recursive.c:776 builtin/clone.c:317
+#: merge-recursive.c:792 builtin/clone.c:318
 #, c-format
 msgid "failed to open '%s'"
 msgstr "无法打开 '%s'"
 
-#: merge-recursive.c:784
+#: merge-recursive.c:800
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "无法创建符号链接 '%s'"
 
-#: merge-recursive.c:787
+#: merge-recursive.c:803
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "不知道如何处理 %06o %s '%s'"
 
-#: merge-recursive.c:925
+#: merge-recursive.c:941
 msgid "Failed to execute internal merge"
 msgstr "无法执行内部合并"
 
-#: merge-recursive.c:929
+#: merge-recursive.c:945
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "不能添加 %s 至对象库"
 
-#: merge-recursive.c:945
+#: merge-recursive.c:961
 msgid "unsupported object type in the tree"
 msgstr "在树中有不支持的对象类型"
 
-#: merge-recursive.c:1024 merge-recursive.c:1038
+#: merge-recursive.c:1036 merge-recursive.c:1050
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -665,7 +730,7 @@
 "冲突(%1$s/删除):%2$s 在 %3$s 中被删除,在 %5$s 中被 %4$s。%7$s 在 %6$s 中"
 "的版本被保留。"
 
-#: merge-recursive.c:1030 merge-recursive.c:1043
+#: merge-recursive.c:1042 merge-recursive.c:1055
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -674,20 +739,20 @@
 "冲突(%1$s/删除):%2$s 在 %3$s 中被删除,在 %5$s 中被 %4$s。%7$s 在 %6$s 中"
 "的版本保留于 %8$s 中。"
 
-#: merge-recursive.c:1084
+#: merge-recursive.c:1096
 msgid "rename"
 msgstr "重命名"
 
-#: merge-recursive.c:1084
+#: merge-recursive.c:1096
 msgid "renamed"
 msgstr "重命名"
 
-#: merge-recursive.c:1140
+#: merge-recursive.c:1152
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "%s 是 %s 中的一个目录而以 %s 为名被添加"
 
-#: merge-recursive.c:1162
+#: merge-recursive.c:1174
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -696,196 +761,196 @@
 "冲突(重命名/重命名):在分支 \"%3$s\" 中重命名 \"%1$s\"->\"%2$s\",在分支 "
 "\"%6$s\" 中重命名 \"%4$s\"->\"%5$s\"%7$s"
 
-#: merge-recursive.c:1167
+#: merge-recursive.c:1179
 msgid " (left unresolved)"
 msgstr "(留下未解决)"
 
-#: merge-recursive.c:1221
+#: merge-recursive.c:1233
 #, 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:1251
+#: merge-recursive.c:1263
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "而是重命名 %s 至 %s,以及 %s 至 %s"
 
-#: merge-recursive.c:1450
+#: merge-recursive.c:1462
 #, 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:1460
+#: merge-recursive.c:1472
 #, c-format
 msgid "Adding merged %s"
 msgstr "添加合并后的 %s"
 
-#: merge-recursive.c:1465 merge-recursive.c:1663
+#: merge-recursive.c:1477 merge-recursive.c:1675
 #, c-format
 msgid "Adding as %s instead"
 msgstr "而是以 %s 为名添加"
 
-#: merge-recursive.c:1516
+#: merge-recursive.c:1528
 #, c-format
 msgid "cannot read object %s"
 msgstr "不能读取对象 %s"
 
-#: merge-recursive.c:1519
+#: merge-recursive.c:1531
 #, c-format
 msgid "object %s is not a blob"
 msgstr "对象 %s 不是一个数据(blob)对象"
 
-#: merge-recursive.c:1567
+#: merge-recursive.c:1579
 msgid "modify"
 msgstr "修改"
 
-#: merge-recursive.c:1567
+#: merge-recursive.c:1579
 msgid "modified"
 msgstr "修改"
 
-#: merge-recursive.c:1577
+#: merge-recursive.c:1589
 msgid "content"
 msgstr "内容"
 
-#: merge-recursive.c:1584
+#: merge-recursive.c:1596
 msgid "add/add"
 msgstr "添加/添加"
 
-#: merge-recursive.c:1618
+#: merge-recursive.c:1630
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "略过 %s(已经做过相同合并)"
 
-#: merge-recursive.c:1632
+#: merge-recursive.c:1644
 #, c-format
 msgid "Auto-merging %s"
 msgstr "自动合并 %s"
 
-#: merge-recursive.c:1636 git-submodule.sh:1149
+#: merge-recursive.c:1648 git-submodule.sh:1150
 msgid "submodule"
 msgstr "子模组"
 
-#: merge-recursive.c:1637
+#: merge-recursive.c:1649
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "冲突(%s):合并冲突于 %s"
 
-#: merge-recursive.c:1727
+#: merge-recursive.c:1735
 #, c-format
 msgid "Removing %s"
 msgstr "删除 %s"
 
-#: merge-recursive.c:1752
+#: merge-recursive.c:1760
 msgid "file/directory"
 msgstr "文件/目录"
 
-#: merge-recursive.c:1758
+#: merge-recursive.c:1766
 msgid "directory/file"
 msgstr "目录/文件"
 
-#: merge-recursive.c:1763
+#: merge-recursive.c:1771
 #, 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:1773
+#: merge-recursive.c:1781
 #, c-format
 msgid "Adding %s"
 msgstr "添加 %s"
 
-#: merge-recursive.c:1790
+#: merge-recursive.c:1798
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "严重的合并错误,不应发生。"
 
-#: merge-recursive.c:1809
+#: merge-recursive.c:1817
 msgid "Already up-to-date!"
 msgstr "已经是最新的!"
 
-#: merge-recursive.c:1818
+#: merge-recursive.c:1826
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "无法合并树 %s 和 %s"
 
-#: merge-recursive.c:1848
+#: merge-recursive.c:1856
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "未处理的路径??? %s"
 
-#: merge-recursive.c:1893
+#: merge-recursive.c:1901
 msgid "Merging:"
 msgstr "合并:"
 
-#: merge-recursive.c:1906
+#: merge-recursive.c:1914
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "发现 %u 个共同祖先:"
 msgstr[1] "发现 %u 个共同祖先:"
 
-#: merge-recursive.c:1943
+#: merge-recursive.c:1951
 msgid "merge returned no commit"
 msgstr "合并未返回提交"
 
-#: merge-recursive.c:2000
+#: merge-recursive.c:2008
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "不能解析对象 '%s'"
 
-#: merge-recursive.c:2012 builtin/merge.c:668
+#: merge-recursive.c:2019 builtin/merge.c:666
 msgid "Unable to write index."
 msgstr "不能写入索引。"
 
-#: notes-utils.c:40
+#: notes-utils.c:41
 msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr "不能提交未初始化/未引用的注解树"
 
-#: notes-utils.c:81
+#: notes-utils.c:83
 #, c-format
 msgid "Bad notes.rewriteMode value: '%s'"
 msgstr "坏的 notes.rewriteMode 值:'%s'"
 
-#: notes-utils.c:91
+#: notes-utils.c:93
 #, 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:118
+#: notes-utils.c:120
 #, c-format
 msgid "Bad %s value: '%s'"
 msgstr "坏的 %s 值:'%s'"
 
-#: object.c:229
+#: object.c:241
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "不能解析对象:%s"
 
-#: parse-options.c:532
+#: parse-options.c:546
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:550
+#: parse-options.c:564
 #, c-format
 msgid "usage: %s"
 msgstr "用法:%s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:554
+#: parse-options.c:568
 #, c-format
 msgid "   or: %s"
 msgstr "  或:%s"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: parse-options.c:557
+#: parse-options.c:571
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:591
+#: parse-options.c:605
 msgid "-NUM"
 msgstr "-数字"
 
@@ -938,12 +1003,12 @@
 msgid "%s: pathspec magic not supported by this command: %s"
 msgstr "%s:路径规则神奇前缀不被此命令支持:%s"
 
-#: pathspec.c:433
+#: pathspec.c:432
 #, c-format
 msgid "pathspec '%s' is beyond a symbolic link"
 msgstr "路径规则 '%s' 位于符号链接中"
 
-#: pathspec.c:442
+#: pathspec.c:441
 msgid ""
 "There is nothing to exclude from by :(exclude) patterns.\n"
 "Perhaps you forgot to add either ':/' or '.' ?"
@@ -951,11 +1016,15 @@
 "没有为 :(exclude) 模式提供要忽略的内容。也许您忘记了\n"
 "添加 ':/' 或 '.' ?"
 
-#: progress.c:224
+#: pretty.c:968
+msgid "unable to parse --pretty format"
+msgstr "不能解析 --pretty 格式"
+
+#: progress.c:225
 msgid "done"
 msgstr "完成"
 
-#: read-cache.c:1238
+#: read-cache.c:1261
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -964,7 +1033,7 @@
 "设置了 index.version,但是取值无效。\n"
 "使用版本 %i"
 
-#: read-cache.c:1248
+#: read-cache.c:1271
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -973,51 +1042,51 @@
 "设置了 GIT_INDEX_VERSION,但是取值无效。\n"
 "使用版本 %i"
 
-#: remote.c:758
+#: remote.c:782
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "不能同时获取 %s 和 %s 至 %s"
 
-#: remote.c:762
+#: remote.c:786
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s 通常跟踪 %s,而非 %s"
 
-#: remote.c:766
+#: remote.c:790
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s 同时跟踪 %s 和 %s"
 
-#: remote.c:774
+#: remote.c:798
 msgid "Internal error"
 msgstr "内部错误"
 
-#: remote.c:1948
+#: remote.c:1968
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "您的分支基于 '%s',但此上游分支已经不存在。\n"
 
-#: remote.c:1952
+#: remote.c:1972
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (使用 \"git branch --unset-upstream\" 来修复)\n"
 
-#: remote.c:1955
+#: remote.c:1975
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "您的分支与上游分支 '%s' 一致。\n"
 
-#: remote.c:1959
+#: remote.c:1979
 #, 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:1965
+#: remote.c:1985
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (使用 \"git push\" 来发布您的本地提交)\n"
 
-#: remote.c:1968
+#: remote.c:1988
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1026,11 +1095,11 @@
 msgstr[1] "您的分支落后 '%s' 共 %d 个提交,并且可以快进。\n"
 
 #  译者:注意保持前导空格
-#: remote.c:1976
+#: remote.c:1996
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (使用 \"git pull\" 来更新您的本地分支)\n"
 
-#: remote.c:1979
+#: remote.c:1999
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1046,32 +1115,40 @@
 "并且分别有 %d 和 %d 处不同的提交。\n"
 
 #  译者:注意保持前导空格
-#: remote.c:1989
+#: remote.c:2009
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr "  (使用 \"git pull\" 来合并远程分支)\n"
 
-#: run-command.c:80
+#: run-command.c:87
 msgid "open /dev/null failed"
 msgstr "不能打开 /dev/null"
 
-#: run-command.c:82
+#: run-command.c:89
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "不能调用 dup2(%d,%d)"
 
-#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
-#: builtin/merge.c:1009 builtin/merge.c:1019
+#: send-pack.c:265
+msgid "failed to sign the push certificate"
+msgstr "无法为推送证书签名"
+
+#: send-pack.c:322
+msgid "the receiving end does not support --signed push"
+msgstr "接收端不支持签名推送"
+
+#: sequencer.c:172 builtin/merge.c:781 builtin/merge.c:892
+#: builtin/merge.c:1002 builtin/merge.c:1012
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "不能为写入打开 '%s'"
 
-#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
-#: builtin/merge.c:1011 builtin/merge.c:1024
+#: sequencer.c:174 builtin/merge.c:343 builtin/merge.c:784
+#: builtin/merge.c:1004 builtin/merge.c:1017
 #, c-format
 msgid "Could not write to '%s'"
 msgstr "不能写入 '%s'"
 
-#: sequencer.c:229
+#: sequencer.c:195
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'"
@@ -1079,7 +1156,7 @@
 "冲突解决完毕后,用 'git add <paths>' 或 'git rm <paths>'\n"
 "命令标记修正后的文件"
 
-#: sequencer.c:232
+#: sequencer.c:198
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'\n"
@@ -1088,224 +1165,224 @@
 "冲突解决完毕后,用 'git add <paths>' 或 'git rm <paths>'\n"
 "对修正后的文件做标记,然后用 'git commit' 提交"
 
-#: sequencer.c:245 sequencer.c:879 sequencer.c:962
+#: sequencer.c:211 sequencer.c:852 sequencer.c:935
 #, c-format
 msgid "Could not write to %s"
 msgstr "不能写入 %s"
 
-#: sequencer.c:248
+#: sequencer.c:214
 #, c-format
 msgid "Error wrapping up %s"
 msgstr "错误收尾 %s"
 
-#: sequencer.c:263
+#: sequencer.c:229
 msgid "Your local changes would be overwritten by cherry-pick."
 msgstr "您的本地修改将被拣选操作覆盖。"
 
-#: sequencer.c:265
+#: sequencer.c:231
 msgid "Your local changes would be overwritten by revert."
 msgstr "您的本地修改将被还原操作覆盖。"
 
-#: sequencer.c:268
+#: sequencer.c:234
 msgid "Commit your changes or stash them to proceed."
 msgstr "提交您的修改或保存进度后再继续。"
 
 #. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:325
+#: sequencer.c:304
 #, c-format
 msgid "%s: Unable to write new index file"
 msgstr "%s:无法写入新索引文件"
 
-#: sequencer.c:356
+#: sequencer.c:335
 msgid "Could not resolve HEAD commit\n"
 msgstr "不能解析 HEAD 提交\n"
 
-#: sequencer.c:378
+#: sequencer.c:355
 msgid "Unable to update cache tree\n"
 msgstr "不能更新缓存\n"
 
-#: sequencer.c:430
+#: sequencer.c:402
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr "不能解析提交 %s\n"
 
-#: sequencer.c:435
+#: sequencer.c:407
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr "不能解析父提交 %s\n"
 
-#: sequencer.c:501
+#: sequencer.c:473
 msgid "Your index file is unmerged."
 msgstr "您的索引文件未完成合并。"
 
-#: sequencer.c:520
+#: sequencer.c:492
 #, c-format
 msgid "Commit %s is a merge but no -m option was given."
 msgstr "提交 %s 是一个合并提交但未提供 -m 选项。"
 
-#: sequencer.c:528
+#: sequencer.c:500
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr "提交 %s 没有父提交 %d"
 
-#: sequencer.c:532
+#: sequencer.c:504
 #, 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:545
+#: sequencer.c:517
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s:不能解析父提交 %s"
 
-#: sequencer.c:549
+#: sequencer.c:521
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr "不能得到 %s 的提交说明"
 
-#: sequencer.c:635
+#: sequencer.c:607
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "不能还原 %s... %s"
 
-#: sequencer.c:636
+#: sequencer.c:608
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "不能应用 %s... %s"
 
-#: sequencer.c:672
+#: sequencer.c:644
 msgid "empty commit set passed"
 msgstr "提供了空的提交集"
 
-#: sequencer.c:680
+#: sequencer.c:652
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s:无法读取索引"
 
-#: sequencer.c:685
+#: sequencer.c:656
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s:无法刷新索引"
 
-#: sequencer.c:743
+#: sequencer.c:716
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr "无法 %s 在一个 %s 过程中"
 
-#: sequencer.c:765
+#: sequencer.c:738
 #, c-format
 msgid "Could not parse line %d."
 msgstr "不能解析第 %d 行。"
 
-#: sequencer.c:770
+#: sequencer.c:743
 msgid "No commits parsed."
 msgstr "没有提交被解析。"
 
-#: sequencer.c:783
+#: sequencer.c:756
 #, c-format
 msgid "Could not open %s"
 msgstr "不能打开 %s"
 
-#: sequencer.c:787
+#: sequencer.c:760
 #, c-format
 msgid "Could not read %s."
 msgstr "不能读取 %s。"
 
-#: sequencer.c:794
+#: sequencer.c:767
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr "无用的指令表单:%s"
 
-#: sequencer.c:824
+#: sequencer.c:797
 #, c-format
 msgid "Invalid key: %s"
 msgstr "无效键名:%s"
 
-#: sequencer.c:827
+#: sequencer.c:800
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr "%s 的值无效:%s"
 
-#: sequencer.c:839
+#: sequencer.c:812
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr "非法的选项表单:%s"
 
-#: sequencer.c:860
+#: sequencer.c:833
 msgid "a cherry-pick or revert is already in progress"
 msgstr "一个拣选或还原操作已在进行"
 
-#: sequencer.c:861
+#: sequencer.c:834
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr "尝试 \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: sequencer.c:865
+#: sequencer.c:838
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr "不能创建序列目录 %s"
 
-#: sequencer.c:881 sequencer.c:966
+#: sequencer.c:854 sequencer.c:939
 #, c-format
 msgid "Error wrapping up %s."
 msgstr "错误收尾 %s。"
 
-#: sequencer.c:900 sequencer.c:1036
+#: sequencer.c:873 sequencer.c:1009
 msgid "no cherry-pick or revert in progress"
 msgstr "拣选或还原操作并未进行"
 
-#: sequencer.c:902
+#: sequencer.c:875
 msgid "cannot resolve HEAD"
 msgstr "不能解析 HEAD"
 
-#: sequencer.c:904
+#: sequencer.c:877
 msgid "cannot abort from a branch yet to be born"
 msgstr "不能从尚未建立的分支终止"
 
-#: sequencer.c:926 builtin/apply.c:4061
+#: sequencer.c:899 builtin/apply.c:4128
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "不能打开 %s:%s"
 
-#: sequencer.c:929
+#: sequencer.c:902
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "不能读取 %s:%s"
 
-#: sequencer.c:930
+#: sequencer.c:903
 msgid "unexpected end of file"
 msgstr "意外的文件结束"
 
-#: sequencer.c:936
+#: sequencer.c:909
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr "保存拣选提交前的 HEAD 文件 '%s' 损坏"
 
-#: sequencer.c:959
+#: sequencer.c:932
 #, c-format
 msgid "Could not format %s."
 msgstr "不能格式化 %s。"
 
-#: sequencer.c:1104
+#: sequencer.c:1077
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr "%s:不能拣选一个%s"
 
-#: sequencer.c:1107
+#: sequencer.c:1080
 #, c-format
 msgid "%s: bad revision"
 msgstr "%s:错误的版本"
 
-#: sequencer.c:1141
+#: sequencer.c:1114
 msgid "Can't revert as initial commit"
 msgstr "不能作为初始提交还原"
 
-#: sequencer.c:1142
+#: sequencer.c:1115
 msgid "Can't cherry-pick into empty head"
 msgstr "不能拣选到空分支"
 
-#: sha1_name.c:439
+#: sha1_name.c:440
 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"
@@ -1326,21 +1403,21 @@
 "可能需要删除它们。用 \"git config advice.objectNameWarning false\"\n"
 "命令关闭本消息通知。"
 
-#: sha1_name.c:1072
+#: sha1_name.c:1068
 msgid "HEAD does not point to a branch"
 msgstr "HEAD 没有指向一个分支"
 
-#: sha1_name.c:1075
+#: sha1_name.c:1071
 #, c-format
 msgid "No such branch: '%s'"
 msgstr "没有此分支:'%s'"
 
-#: sha1_name.c:1077
+#: sha1_name.c:1073
 #, c-format
 msgid "No upstream configured for branch '%s'"
 msgstr "尚未给分支 '%s' 设置上游"
 
-#: sha1_name.c:1081
+#: sha1_name.c:1077
 #, c-format
 msgid "Upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "上游分支 '%s' 没有存储为一个远程跟踪分支"
@@ -1368,17 +1445,42 @@
 msgid "staging updated .gitmodules failed"
 msgstr "将更新后 .gitmodules 添加暂存区失败"
 
-#: submodule.c:1121 builtin/init-db.c:363
+#: submodule.c:1111 builtin/init-db.c:363
 #, c-format
 msgid "Could not create git link %s"
 msgstr "不能创建 git link %s"
 
-#: submodule.c:1132
+#: submodule.c:1122
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "不能在 %s 中设置 core.worktree"
 
-#: unpack-trees.c:206
+#: trailer.c:500 trailer.c:504 trailer.c:508 trailer.c:562 trailer.c:566
+#: trailer.c:570
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "键 '%2$s' 的未知取值 '%1$s'"
+
+#: trailer.c:552 trailer.c:557 builtin/remote.c:288
+#, c-format
+msgid "more than one %s"
+msgstr "多于一个 %s"
+
+#: trailer.c:587
+#, c-format
+msgid "empty trailer token in trailer '%s'"
+msgstr "签名 '%s' 的键为空"
+
+#: trailer.c:706
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "不能读取输入文件 '%s'"
+
+#: trailer.c:709
+msgid "could not read from stdin"
+msgstr "不能自标准输入读取"
+
+#: unpack-trees.c:202
 msgid "Checking out files"
 msgstr "正在检出文件"
 
@@ -1411,25 +1513,29 @@
 msgid "invalid '..' path segment"
 msgstr "无效的 '..' 路径片段"
 
-#: wrapper.c:422
+#: wrapper.c:509
 #, c-format
 msgid "unable to access '%s': %s"
 msgstr "不能访问 '%s':%s"
 
-#: wrapper.c:443
+#: wrapper.c:530
 #, c-format
 msgid "unable to access '%s'"
 msgstr "不能访问 '%s'"
 
-#: wrapper.c:454
+#: wrapper.c:541
 #, c-format
 msgid "unable to look up current user in the passwd file: %s"
 msgstr "无法在口令文件中查询到当前用户:%s"
 
-#: wrapper.c:455
+#: wrapper.c:542
 msgid "no such user"
 msgstr "无此用户"
 
+#: wrapper.c:550
+msgid "unable to get current working directory"
+msgstr "不能获取当前工作目录"
+
 #: wt-status.c:150
 msgid "Unmerged paths:"
 msgstr "未合并的路径:"
@@ -1580,15 +1686,15 @@
 msgid "bug: unhandled diff status %c"
 msgstr "bug:无法处理的差异状态 %c"
 
-#: wt-status.c:765
+#: wt-status.c:761
 msgid "Submodules changed but not updated:"
 msgstr "子模组已修改但尚未更新:"
 
-#: wt-status.c:767
+#: wt-status.c:763
 msgid "Submodule changes to be committed:"
 msgstr "要提交的子模组变更:"
 
-#: wt-status.c:846
+#: wt-status.c:842
 msgid ""
 "Do not touch the line above.\n"
 "Everything below will be removed."
@@ -1596,198 +1702,198 @@
 "不要改动上面的一行。\n"
 "下面的所有内容均将被删除。"
 
-#: wt-status.c:937
+#: wt-status.c:933
 msgid "You have unmerged paths."
 msgstr "您有尚未合并的路径。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:940
+#: wt-status.c:936
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr "  (解决冲突并运行 \"git commit\")"
 
-#: wt-status.c:943
+#: wt-status.c:939
 msgid "All conflicts fixed but you are still merging."
 msgstr "所有冲突已解决但您仍处于合并中。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:946
+#: wt-status.c:942
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr "  (使用 \"git commit\" 结束合并)"
 
-#: wt-status.c:956
+#: wt-status.c:952
 msgid "You are in the middle of an am session."
 msgstr "您正处于 am 操作过程中。"
 
-#: wt-status.c:959
+#: wt-status.c:955
 msgid "The current patch is empty."
 msgstr "当前的补丁为空。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:963
+#: wt-status.c:959
 msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr "  (解决冲突,然后运行 \"git am --continue\")"
 
 #  译者:注意保持前导空格
-#: wt-status.c:965
+#: wt-status.c:961
 msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr "  (使用 \"git am --skip\" 跳过此补丁)"
 
 #  译者:注意保持前导空格
-#: wt-status.c:967
+#: wt-status.c:963
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr "  (使用 \"git am --abort\" 恢复原有分支)"
 
-#: wt-status.c:1027 wt-status.c:1044
+#: wt-status.c:1023 wt-status.c:1040
 #, c-format
 msgid "You are currently rebasing branch '%s' on '%s'."
 msgstr "您在执行将分支 '%s' 变基到 '%s' 的操作。"
 
-#: wt-status.c:1032 wt-status.c:1049
+#: wt-status.c:1028 wt-status.c:1045
 msgid "You are currently rebasing."
 msgstr "您在执行变基操作。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1035
+#: wt-status.c:1031
 msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr "  (解决冲突,然后运行 \"git rebase --continue\")"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1037
+#: wt-status.c:1033
 msgid "  (use \"git rebase --skip\" to skip this patch)"
 msgstr "  (使用 \"git rebase --skip\" 跳过此补丁)"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1039
+#: wt-status.c:1035
 msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr "  (使用 \"git rebase --abort\" 以检出原有分支)"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1052
+#: wt-status.c:1048
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr "  (所有冲突已解决:运行 \"git rebase --continue\")"
 
-#: wt-status.c:1056
+#: wt-status.c:1052
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
 msgstr "您在执行将分支 '%s' 变基到 '%s' 的操作时拆分提交。"
 
-#: wt-status.c:1061
+#: wt-status.c:1057
 msgid "You are currently splitting a commit during a rebase."
 msgstr "您在执行变基操作时拆分提交。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1064
+#: wt-status.c:1060
 msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr "  (一旦您工作目录提交干净后,运行 \"git rebase --continue\")"
 
-#: wt-status.c:1068
+#: wt-status.c:1064
 #, c-format
 msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr "您在执行将分支 '%s' 变基到 '%s' 的操作时编辑提交。"
 
-#: wt-status.c:1073
+#: wt-status.c:1069
 msgid "You are currently editing a commit during a rebase."
 msgstr "您在执行变基操作时编辑提交。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1076
+#: wt-status.c:1072
 msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr "  (使用 \"git commit --amend\" 修补当前提交)"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1078
+#: wt-status.c:1074
 msgid ""
 "  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr "  (当您对您的修改满意后执行 \"git rebase --continue\")"
 
-#: wt-status.c:1088
+#: wt-status.c:1084
 #, c-format
 msgid "You are currently cherry-picking commit %s."
 msgstr "您在执行拣选提交 %s 的操作。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1093
+#: wt-status.c:1089
 msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
 msgstr "  (解决冲突并运行 \"git cherry-pick --continue\")"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1096
+#: wt-status.c:1092
 msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr "  (所有冲突已解决:运行 \"git cherry-pick --continue\")"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1098
+#: wt-status.c:1094
 msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr "  (使用 \"git cherry-pick --abort\" 以取消拣选操作)"
 
-#: wt-status.c:1107
+#: wt-status.c:1103
 #, c-format
 msgid "You are currently reverting commit %s."
 msgstr "您在执行反转提交 %s 的操作。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1112
+#: wt-status.c:1108
 msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr "  (解决冲突并运行 \"git revert --continue\")"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1115
+#: wt-status.c:1111
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr "  (所有冲突已解决:运行 \"git revert --continue\")"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1117
+#: wt-status.c:1113
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr "  (使用 \"git revert --abort\" 以取消反转提交操作)"
 
-#: wt-status.c:1128
+#: wt-status.c:1124
 #, c-format
 msgid "You are currently bisecting, started from branch '%s'."
 msgstr "您在执行从分支 '%s' 开始的二分查找操作。"
 
-#: wt-status.c:1132
+#: wt-status.c:1128
 msgid "You are currently bisecting."
 msgstr "您在执行二分查找操作。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1135
+#: wt-status.c:1131
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr "  (使用 \"git bisect reset\" 以回到原有分支)"
 
-#: wt-status.c:1310
+#: wt-status.c:1306
 msgid "On branch "
 msgstr "位于分支 "
 
-#: wt-status.c:1317
+#: wt-status.c:1313
 msgid "rebase in progress; onto "
 msgstr "变基操作正在进行中;至 "
 
-#: wt-status.c:1324
+#: wt-status.c:1320
 msgid "HEAD detached at "
 msgstr "头指针分离于 "
 
-#: wt-status.c:1326
+#: wt-status.c:1322
 msgid "HEAD detached from "
 msgstr "头指针分离自 "
 
-#: wt-status.c:1329
+#: wt-status.c:1325
 msgid "Not currently on any branch."
 msgstr "当前不在任何分支上。"
 
-#: wt-status.c:1346
+#: wt-status.c:1342
 msgid "Initial commit"
 msgstr "初始提交"
 
-#: wt-status.c:1360
+#: wt-status.c:1356
 msgid "Untracked files"
 msgstr "未跟踪的文件"
 
-#: wt-status.c:1362
+#: wt-status.c:1358
 msgid "Ignored files"
 msgstr "忽略的文件"
 
-#: wt-status.c:1366
+#: wt-status.c:1362
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1797,129 +1903,129 @@
 "耗费了 %.2f 秒以枚举未跟踪的文件。'status -uno' 也许能提高速度,\n"
 "但您需要小心不要忘了添加新文件(参见 'git help status')。"
 
-#: wt-status.c:1372
+#: wt-status.c:1368
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr "未跟踪的文件没有列出%s"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1374
+#: wt-status.c:1370
 msgid " (use -u option to show untracked files)"
 msgstr "(使用 -u 参数显示未跟踪的文件)"
 
-#: wt-status.c:1380
+#: wt-status.c:1376
 msgid "No changes"
 msgstr "没有修改"
 
-#: wt-status.c:1385
+#: wt-status.c:1381
 #, 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:1388
+#: wt-status.c:1384
 #, c-format
 msgid "no changes added to commit\n"
 msgstr "修改尚未加入提交\n"
 
-#: wt-status.c:1391
+#: wt-status.c:1387
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
 "track)\n"
 msgstr "提交为空,但是存在尚未跟踪的文件(使用 \"git add\" 建立跟踪)\n"
 
-#: wt-status.c:1394
+#: wt-status.c:1390
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
 msgstr "提交为空,但是存在尚未跟踪的文件\n"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1397
+#: wt-status.c:1393
 #, c-format
 msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr "无文件要提交(创建/拷贝文件并使用 \"git add\" 建立跟踪)\n"
 
-#: wt-status.c:1400 wt-status.c:1405
+#: wt-status.c:1396 wt-status.c:1401
 #, c-format
 msgid "nothing to commit\n"
 msgstr "无文件要提交\n"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1403
+#: wt-status.c:1399
 #, c-format
 msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr "无文件要提交(使用 -u 显示未跟踪的文件)\n"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1407
+#: wt-status.c:1403
 #, c-format
 msgid "nothing to commit, working directory clean\n"
 msgstr "无文件要提交,干净的工作区\n"
 
-#: wt-status.c:1516
+#: wt-status.c:1512
 msgid "HEAD (no branch)"
 msgstr "HEAD(非分支)"
 
 #  译者:注意保持句尾空格
-#: wt-status.c:1522
+#: wt-status.c:1518
 msgid "Initial commit on "
 msgstr "初始提交于 "
 
-#: wt-status.c:1554
+#: wt-status.c:1550
 msgid "gone"
 msgstr "丢失"
 
 #  译者:注意保持句尾空格
-#: wt-status.c:1556 wt-status.c:1564
+#: wt-status.c:1552 wt-status.c:1560
 msgid "behind "
 msgstr "落后 "
 
-#: compat/precompose_utf8.c:55 builtin/clone.c:356
+#: compat/precompose_utf8.c:55 builtin/clone.c:357
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "无法删除 '%s'"
 
-#: builtin/add.c:21
+#: builtin/add.c:22
 msgid "git add [options] [--] <pathspec>..."
 msgstr "git add [选项] [--] <路径规则>..."
 
-#: builtin/add.c:64
+#: builtin/add.c:65
 #, c-format
 msgid "unexpected diff status %c"
 msgstr "意外的差异状态 %c"
 
-#: builtin/add.c:69 builtin/commit.c:261
+#: builtin/add.c:70 builtin/commit.c:275
 msgid "updating files failed"
 msgstr "更新文件失败"
 
-#: builtin/add.c:79
+#: builtin/add.c:80
 #, c-format
 msgid "remove '%s'\n"
 msgstr "删除 '%s'\n"
 
-#: builtin/add.c:133
+#: builtin/add.c:134
 msgid "Unstaged changes after refreshing the index:"
 msgstr "刷新索引之后尚未被暂存的变更:"
 
-#: builtin/add.c:193
+#: builtin/add.c:194 builtin/rev-parse.c:785
 msgid "Could not read the index"
 msgstr "不能读取索引"
 
-#: builtin/add.c:204
+#: builtin/add.c:205
 #, c-format
 msgid "Could not open '%s' for writing."
 msgstr "不能打开 '%s' 以写入。"
 
-#: builtin/add.c:208
+#: builtin/add.c:209
 msgid "Could not write patch"
 msgstr "不能生成补丁"
 
-#: builtin/add.c:213
+#: builtin/add.c:214
 #, c-format
 msgid "Could not stat '%s'"
 msgstr "不能查看文件状态 '%s'"
 
-#: builtin/add.c:215
+#: builtin/add.c:216
 msgid "Empty patch. Aborted."
 msgstr "空补丁。异常终止。"
 
@@ -1932,15 +2038,15 @@
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr "下列路径根据您的一个 .gitignore 文件而被忽略:\n"
 
-#: builtin/add.c:248 builtin/clean.c:876 builtin/fetch.c:93 builtin/mv.c:70
-#: builtin/prune-packed.c:77 builtin/push.c:489 builtin/remote.c:1344
+#: builtin/add.c:248 builtin/clean.c:875 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/prune-packed.c:55 builtin/push.c:499 builtin/remote.c:1375
 #: builtin/rm.c:269
 msgid "dry run"
 msgstr "演习"
 
-#: builtin/add.c:249 builtin/apply.c:4410 builtin/check-ignore.c:19
-#: builtin/commit.c:1256 builtin/count-objects.c:95 builtin/fsck.c:612
-#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113
+#: builtin/add.c:249 builtin/apply.c:4415 builtin/check-ignore.c:19
+#: builtin/commit.c:1362 builtin/count-objects.c:63 builtin/fsck.c:608
+#: builtin/log.c:1617 builtin/mv.c:109 builtin/read-tree.c:114
 msgid "be verbose"
 msgstr "冗长输出"
 
@@ -1948,7 +2054,7 @@
 msgid "interactive picking"
 msgstr "交互式拣选"
 
-#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:286
 msgid "select hunks interactively"
 msgstr "交互式挑选数据块"
 
@@ -2001,93 +2107,93 @@
 msgid "adding files failed"
 msgstr "添加文件失败"
 
-#: builtin/add.c:330
+#: builtin/add.c:329
 msgid "-A and -u are mutually incompatible"
 msgstr "-A 和 -u 选项互斥"
 
-#: builtin/add.c:337
+#: builtin/add.c:336
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr "选项 --ignore-missing 只能和 --dry-run 同时使用"
 
-#: builtin/add.c:358
+#: builtin/add.c:357
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "没有指定文件,也没有文件被添加。\n"
 
-#: builtin/add.c:359
+#: builtin/add.c:358
 #, 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:920
-#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:234 builtin/rm.c:299
+#: builtin/add.c:363 builtin/check-ignore.c:172 builtin/clean.c:919
+#: builtin/commit.c:333 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:299
 msgid "index file corrupt"
 msgstr "索引文件损坏"
 
-#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
+#: builtin/add.c:446 builtin/apply.c:4510 builtin/mv.c:279 builtin/rm.c:431
 msgid "Unable to write new index file"
 msgstr "无法写入新索引文件"
 
-#: builtin/apply.c:57
+#: builtin/apply.c:58
 msgid "git apply [options] [<patch>...]"
 msgstr "git apply [选项] [<补丁>...]"
 
-#: builtin/apply.c:110
+#: builtin/apply.c:111
 #, c-format
 msgid "unrecognized whitespace option '%s'"
 msgstr "未能识别的空白字符选项 '%s'"
 
-#: builtin/apply.c:125
+#: builtin/apply.c:126
 #, c-format
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "未能识别的空白字符忽略选项 '%s'"
 
-#: builtin/apply.c:823
+#: builtin/apply.c:826
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr "无法准备时间戳正则表达式 %s"
 
-#: builtin/apply.c:832
+#: builtin/apply.c:835
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr "regexec 返回 %d,输入为:%s"
 
-#: builtin/apply.c:913
+#: builtin/apply.c:916
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr "不能在补丁的第 %d 行找到文件名"
 
-#: builtin/apply.c:945
+#: builtin/apply.c:948
 #, 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:949
+#: builtin/apply.c:952
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr "git apply:错误的 git-diff - 第 %d 行上新文件名不一致"
 
-#: builtin/apply.c:950
+#: builtin/apply.c:953
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr "git apply:错误的 git-diff - 第 %d 行上旧文件名不一致"
 
-#: builtin/apply.c:957
+#: builtin/apply.c:960
 #, 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:1422
+#: builtin/apply.c:1423
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "recount:意外的行:%.*s"
 
-#: builtin/apply.c:1479
+#: builtin/apply.c:1480
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr "第 %d 行的补丁片段没有头信息:%.*s"
 
-#: builtin/apply.c:1496
+#: builtin/apply.c:1497
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -2098,77 +2204,77 @@
 msgstr[0] "当移除 %d 个前导路径后 git diff 头缺乏文件名信息(第 %d 行)"
 msgstr[1] "当移除 %d 个前导路径后 git diff 头缺乏文件名信息(第 %d 行)"
 
-#: builtin/apply.c:1656
+#: builtin/apply.c:1657
 msgid "new file depends on old contents"
 msgstr "新文件依赖旧内容"
 
-#: builtin/apply.c:1658
+#: builtin/apply.c:1659
 msgid "deleted file still has contents"
 msgstr "删除的文件仍有内容"
 
-#: builtin/apply.c:1684
+#: builtin/apply.c:1685
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "补丁在第 %d 行损坏"
 
-#: builtin/apply.c:1720
+#: builtin/apply.c:1721
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "新文件 %s 依赖旧内容"
 
-#: builtin/apply.c:1722
+#: builtin/apply.c:1723
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "删除的文件 %s 仍有内容"
 
-#: builtin/apply.c:1725
+#: builtin/apply.c:1726
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr "** 警告:文件 %s 成为空文件但并未删除"
 
-#: builtin/apply.c:1871
+#: builtin/apply.c:1872
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "二进制补丁在第 %d 行损坏:%.*s"
 
-#: builtin/apply.c:1900
+#: builtin/apply.c:1901
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "未能识别的二进制补丁位于第 %d 行"
 
-#: builtin/apply.c:1986
+#: builtin/apply.c:2052
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "补丁文件的第 %d 行只有垃圾数据"
 
-#: builtin/apply.c:2076
+#: builtin/apply.c:2142
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "无法读取符号链接 %s"
 
-#: builtin/apply.c:2080
+#: builtin/apply.c:2146
 #, c-format
 msgid "unable to open or read %s"
 msgstr "不能打开或读取 %s"
 
-#: builtin/apply.c:2688
+#: builtin/apply.c:2754
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "无效的行首字符:'%c'"
 
-#: builtin/apply.c:2806
+#: builtin/apply.c:2872
 #, 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:2818
+#: builtin/apply.c:2884
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr "上下文减少到(%ld/%ld)以在第 %d 行应用补丁片段"
 
-#: builtin/apply.c:2824
+#: builtin/apply.c:2890
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -2177,317 +2283,317 @@
 "当查询:\n"
 "%.*s"
 
-#: builtin/apply.c:2843
+#: builtin/apply.c:2909
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "缺失 '%s' 的二进制补丁数据"
 
-#: builtin/apply.c:2946
+#: builtin/apply.c:3010
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "二进制补丁未应用到 '%s'"
 
-#: builtin/apply.c:2952
+#: builtin/apply.c:3016
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr "到 '%s' 的二进制补丁产生了不正确的结果(应为 %s,却为 %s)"
 
-#: builtin/apply.c:2973
+#: builtin/apply.c:3037
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "打补丁失败:%s:%ld"
 
-#: builtin/apply.c:3095
+#: builtin/apply.c:3161
 #, c-format
 msgid "cannot checkout %s"
 msgstr "不能检出 %s"
 
-#: builtin/apply.c:3140 builtin/apply.c:3149 builtin/apply.c:3194
+#: builtin/apply.c:3206 builtin/apply.c:3215 builtin/apply.c:3260
 #, c-format
 msgid "read of %s failed"
 msgstr "读取 %s 失败"
 
-#: builtin/apply.c:3174 builtin/apply.c:3396
+#: builtin/apply.c:3240 builtin/apply.c:3462
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "路径 %s 已经被重命名/删除"
 
-#: builtin/apply.c:3255 builtin/apply.c:3410
+#: builtin/apply.c:3321 builtin/apply.c:3476
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "%s:不存在于索引中"
 
-#: builtin/apply.c:3259 builtin/apply.c:3402 builtin/apply.c:3424
+#: builtin/apply.c:3325 builtin/apply.c:3468 builtin/apply.c:3490
 #, c-format
 msgid "%s: %s"
 msgstr "%s:%s"
 
-#: builtin/apply.c:3264 builtin/apply.c:3418
+#: builtin/apply.c:3330 builtin/apply.c:3484
 #, c-format
 msgid "%s: does not match index"
 msgstr "%s:和索引不匹配"
 
-#: builtin/apply.c:3366
+#: builtin/apply.c:3432
 msgid "removal patch leaves file contents"
 msgstr "移除补丁仍留下了文件内容"
 
-#: builtin/apply.c:3435
+#: builtin/apply.c:3501
 #, c-format
 msgid "%s: wrong type"
 msgstr "%s:错误类型"
 
-#: builtin/apply.c:3437
+#: builtin/apply.c:3503
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "%s 的类型是 %o,应为 %o"
 
-#: builtin/apply.c:3538
+#: builtin/apply.c:3604
 #, c-format
 msgid "%s: already exists in index"
 msgstr "%s:已经存在于索引中"
 
-#: builtin/apply.c:3541
+#: builtin/apply.c:3607
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "%s:已经存在于工作区中"
 
-#: builtin/apply.c:3561
+#: builtin/apply.c:3627
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr "%2$s 的新模式(%1$o)和旧模式(%3$o)不匹配"
 
-#: builtin/apply.c:3566
+#: builtin/apply.c:3632
 #, 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:3574
+#: builtin/apply.c:3640
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "%s:补丁未应用"
 
-#: builtin/apply.c:3587
+#: builtin/apply.c:3653
 #, c-format
 msgid "Checking patch %s..."
 msgstr "检查补丁 %s..."
 
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
+#: builtin/apply.c:3746 builtin/checkout.c:213 builtin/reset.c:135
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "对路径 '%s' 的 make_cache_entry 操作失败"
 
-#: builtin/apply.c:3823
+#: builtin/apply.c:3889
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "不能从索引中移除 %s"
 
-#: builtin/apply.c:3851
+#: builtin/apply.c:3918
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr "子模组 %s 损坏的补丁"
 
-#: builtin/apply.c:3855
+#: builtin/apply.c:3922
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr "不能枚举新建文件 '%s' 的状态"
 
-#: builtin/apply.c:3860
+#: builtin/apply.c:3927
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr "不能为新建文件 %s 创建后端存储"
 
-#: builtin/apply.c:3863 builtin/apply.c:3971
+#: builtin/apply.c:3930 builtin/apply.c:4038
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "无法为 %s 添加缓存条目"
 
-#: builtin/apply.c:3896
+#: builtin/apply.c:3963
 #, c-format
 msgid "closing file '%s'"
 msgstr "关闭文件 '%s'"
 
-#: builtin/apply.c:3945
+#: builtin/apply.c:4012
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "不能写文件 '%s' 权限 %o"
 
-#: builtin/apply.c:4032
+#: builtin/apply.c:4099
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "成功应用补丁 %s。"
 
-#: builtin/apply.c:4040
+#: builtin/apply.c:4107
 msgid "internal error"
 msgstr "内部错误"
 
-#: builtin/apply.c:4043
+#: builtin/apply.c:4110
 #, 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:4053
+#: builtin/apply.c:4120
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "截短 .rej 文件名为 %.*s.rej"
 
-#: builtin/apply.c:4074
+#: builtin/apply.c:4141
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "第 #%d 个片段成功应用。"
 
-#: builtin/apply.c:4077
+#: builtin/apply.c:4144
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "拒绝第 #%d 个片段。"
 
-#: builtin/apply.c:4227
+#: builtin/apply.c:4234
 msgid "unrecognized input"
 msgstr "未能识别的输入"
 
-#: builtin/apply.c:4238
+#: builtin/apply.c:4245
 msgid "unable to read index file"
 msgstr "无法读取索引文件"
 
-#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90
-#: builtin/fetch.c:78
+#: builtin/apply.c:4362 builtin/apply.c:4365 builtin/clone.c:91
+#: builtin/fetch.c:93
 msgid "path"
 msgstr "路径"
 
-#: builtin/apply.c:4358
+#: builtin/apply.c:4363
 msgid "don't apply changes matching the given path"
 msgstr "不要应用与给出路径向匹配的变更"
 
-#: builtin/apply.c:4361
+#: builtin/apply.c:4366
 msgid "apply changes matching the given path"
 msgstr "应用与给出路径向匹配的变更"
 
-#: builtin/apply.c:4363
+#: builtin/apply.c:4368
 msgid "num"
 msgstr "数字"
 
-#: builtin/apply.c:4364
+#: builtin/apply.c:4369
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr "从传统的 diff 路径中移除指定数量的前导斜线"
 
-#: builtin/apply.c:4367
+#: builtin/apply.c:4372
 msgid "ignore additions made by the patch"
 msgstr "忽略补丁中的添加的文件"
 
-#: builtin/apply.c:4369
+#: builtin/apply.c:4374
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr "不应用补丁,而是显示输入的差异统计(diffstat)"
 
-#: builtin/apply.c:4373
+#: builtin/apply.c:4378
 msgid "show number of added and deleted lines in decimal notation"
 msgstr "以十进制数显示添加和删除的行数"
 
-#: builtin/apply.c:4375
+#: builtin/apply.c:4380
 msgid "instead of applying the patch, output a summary for the input"
 msgstr "不应用补丁,而是显示输入的概要"
 
-#: builtin/apply.c:4377
+#: builtin/apply.c:4382
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr "不应用补丁,而是查看补丁是否可应用"
 
-#: builtin/apply.c:4379
+#: builtin/apply.c:4384
 msgid "make sure the patch is applicable to the current index"
 msgstr "确认补丁可以应用到当前索引"
 
-#: builtin/apply.c:4381
+#: builtin/apply.c:4386
 msgid "apply a patch without touching the working tree"
 msgstr "应用补丁而不修改工作区"
 
-#: builtin/apply.c:4383
+#: builtin/apply.c:4388
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr "还应用此补丁(与 --stat/--summary/--check 选项同时使用)"
 
-#: builtin/apply.c:4385
+#: builtin/apply.c:4390
 msgid "attempt three-way merge if a patch does not apply"
 msgstr "如果一个补丁不能应用则尝试三路合并"
 
-#: builtin/apply.c:4387
+#: builtin/apply.c:4392
 msgid "build a temporary index based on embedded index information"
 msgstr "创建一个临时索引基于嵌入的索引信息"
 
-#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
+#: builtin/apply.c:4394 builtin/checkout-index.c:198 builtin/ls-files.c:455
 msgid "paths are separated with NUL character"
 msgstr "路径以 NUL 字符分隔"
 
-#: builtin/apply.c:4392
+#: builtin/apply.c:4397
 msgid "ensure at least <n> lines of context match"
 msgstr "确保至少匹配 <n> 行上下文"
 
-#: builtin/apply.c:4393
+#: builtin/apply.c:4398
 msgid "action"
 msgstr "动作"
 
-#: builtin/apply.c:4394
+#: builtin/apply.c:4399
 msgid "detect new or modified lines that have whitespace errors"
 msgstr "检查新增和修改的行中间的空白字符滥用"
 
-#: builtin/apply.c:4397 builtin/apply.c:4400
+#: builtin/apply.c:4402 builtin/apply.c:4405
 msgid "ignore changes in whitespace when finding context"
 msgstr "查找上下文时忽略空白字符的变更"
 
-#: builtin/apply.c:4403
+#: builtin/apply.c:4408
 msgid "apply the patch in reverse"
 msgstr "反向应用补丁"
 
-#: builtin/apply.c:4405
+#: builtin/apply.c:4410
 msgid "don't expect at least one line of context"
 msgstr "无需至少一行上下文"
 
-#: builtin/apply.c:4407
+#: builtin/apply.c:4412
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr "将拒绝的补丁片段保存在对应的 *.rej 文件中"
 
-#: builtin/apply.c:4409
+#: builtin/apply.c:4414
 msgid "allow overlapping hunks"
 msgstr "允许重叠的补丁片段"
 
-#: builtin/apply.c:4412
+#: builtin/apply.c:4417
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr "允许不正确的文件末尾换行符"
 
-#: builtin/apply.c:4415
+#: builtin/apply.c:4420
 msgid "do not trust the line counts in the hunk headers"
 msgstr "不信任补丁片段的头信息中的行号"
 
-#: builtin/apply.c:4417
+#: builtin/apply.c:4422
 msgid "root"
 msgstr "根目录"
 
-#: builtin/apply.c:4418
+#: builtin/apply.c:4423
 msgid "prepend <root> to all filenames"
 msgstr "为所有文件名前添加 <根目录>"
 
-#: builtin/apply.c:4440
+#: builtin/apply.c:4445
 msgid "--3way outside a repository"
 msgstr "--3way 在一个版本库之外"
 
-#: builtin/apply.c:4448
+#: builtin/apply.c:4453
 msgid "--index outside a repository"
 msgstr "--index 在一个版本库之外"
 
-#: builtin/apply.c:4451
+#: builtin/apply.c:4456
 msgid "--cached outside a repository"
 msgstr "--cached 在一个版本库之外"
 
-#: builtin/apply.c:4467
+#: builtin/apply.c:4472
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "不能打开补丁 '%s'"
 
-#: builtin/apply.c:4481
+#: builtin/apply.c:4486
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] "抑制下仍有 %d 个空白字符误用"
 msgstr[1] "抑制下仍有 %d 个空白字符误用"
 
-#: builtin/apply.c:4487 builtin/apply.c:4497
+#: builtin/apply.c:4492 builtin/apply.c:4502
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -2541,103 +2647,103 @@
 msgid "update BISECT_HEAD instead of checking out the current commit"
 msgstr "更新 BISECT_HEAD 而非检出当前提交"
 
-#: builtin/blame.c:27
+#: builtin/blame.c:30
 msgid "git blame [options] [rev-opts] [rev] [--] file"
 msgstr "git blame [选项] [版本选项] [版本] [--] 文件"
 
-#: builtin/blame.c:32
+#: builtin/blame.c:35
 msgid "[rev-opts] are documented in git-rev-list(1)"
 msgstr "[版本选项] 的文档记录在 git-rev-list(1) 中"
 
-#: builtin/blame.c:2249
+#: builtin/blame.c:2501
 msgid "Show blame entries as we find them, incrementally"
 msgstr "增量式地显示发现的 blame 条目"
 
-#: builtin/blame.c:2250
+#: builtin/blame.c:2502
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "边界提交显示空的 SHA-1(默认:关闭)"
 
-#: builtin/blame.c:2251
+#: builtin/blame.c:2503
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "不把根提交作为边界(默认:关闭)"
 
-#: builtin/blame.c:2252
+#: builtin/blame.c:2504
 msgid "Show work cost statistics"
 msgstr "显示命令消耗统计"
 
-#: builtin/blame.c:2253
+#: builtin/blame.c:2505
 msgid "Show output score for blame entries"
 msgstr "显示判断 blame 条目位移的得分诊断信息"
 
-#: builtin/blame.c:2254
+#: builtin/blame.c:2506
 msgid "Show original filename (Default: auto)"
 msgstr "显示原始文件名(默认:自动)"
 
-#: builtin/blame.c:2255
+#: builtin/blame.c:2507
 msgid "Show original linenumber (Default: off)"
 msgstr "显示原始的行号(默认:关闭)"
 
-#: builtin/blame.c:2256
+#: builtin/blame.c:2508
 msgid "Show in a format designed for machine consumption"
 msgstr "显示为一个适合机器读取的格式"
 
-#: builtin/blame.c:2257
+#: builtin/blame.c:2509
 msgid "Show porcelain format with per-line commit information"
 msgstr "为每一行显示机器适用的提交信息"
 
-#: builtin/blame.c:2258
+#: builtin/blame.c:2510
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "使用和 git-annotate 相同的输出模式(默认:关闭)"
 
-#: builtin/blame.c:2259
+#: builtin/blame.c:2511
 msgid "Show raw timestamp (Default: off)"
 msgstr "显示原始时间戳(默认:关闭)"
 
-#: builtin/blame.c:2260
+#: builtin/blame.c:2512
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "显示长的SHA1提交号(默认:关闭)"
 
-#: builtin/blame.c:2261
+#: builtin/blame.c:2513
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "隐藏作者名字和时间戳(默认:关闭)"
 
-#: builtin/blame.c:2262
+#: builtin/blame.c:2514
 msgid "Show author email instead of name (Default: off)"
 msgstr "显示作者的邮箱而不是名字(默认:关闭)"
 
-#: builtin/blame.c:2263
+#: builtin/blame.c:2515
 msgid "Ignore whitespace differences"
 msgstr "忽略空白差异"
 
-#: builtin/blame.c:2264
+#: builtin/blame.c:2516
 msgid "Spend extra cycles to find better match"
 msgstr "花费额外的循环来找到更好的匹配"
 
-#: builtin/blame.c:2265
+#: builtin/blame.c:2517
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "使用来自 <file> 的修订集而不是调用 git-rev-list"
 
-#: builtin/blame.c:2266
+#: builtin/blame.c:2518
 msgid "Use <file>'s contents as the final image"
 msgstr "使用 <file> 的内容作为最终的图片"
 
-#: builtin/blame.c:2267 builtin/blame.c:2268
+#: builtin/blame.c:2519 builtin/blame.c:2520
 msgid "score"
 msgstr "得分"
 
-#: builtin/blame.c:2267
+#: builtin/blame.c:2519
 msgid "Find line copies within and across files"
 msgstr "找到文件内及跨文件的行拷贝"
 
-#: builtin/blame.c:2268
+#: builtin/blame.c:2520
 msgid "Find line movements within and across files"
 msgstr "找到文件内及跨文件的行移动"
 
-#: builtin/blame.c:2269
+#: builtin/blame.c:2521
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2269
+#: builtin/blame.c:2521
 msgid "Process only line range n,m, counting from 1"
 msgstr "只处理行范围在 n 和 m 之间的,从 1 开始"
 
@@ -2647,7 +2753,7 @@
 #. 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:2347
+#: builtin/blame.c:2602
 msgid "4 years, 11 months ago"
 msgstr "4 年 11 个月前"
 
@@ -2668,7 +2774,7 @@
 msgstr "git branch [选项] (-m | -M) [<旧分支>] <新分支>"
 
 #  译者:保持原换行格式,在输出时 %s 的替代内容会让字符串变长
-#: builtin/branch.c:150
+#: builtin/branch.c:152
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -2678,7 +2784,7 @@
 "         '%s',但未合并到 HEAD。"
 
 #  译者:保持原换行格式,在输出时 %s 的替代内容会让字符串变长
-#: builtin/branch.c:154
+#: builtin/branch.c:156
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -2687,12 +2793,12 @@
 "并未删除分支 '%s', 虽然它已经合并到 HEAD,\n"
 "         然而却尚未被合并到分支 '%s' 。"
 
-#: builtin/branch.c:168
+#: builtin/branch.c:170
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "无法查询 '%s' 指向的提交对象"
 
-#: builtin/branch.c:172
+#: builtin/branch.c:174
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -2701,338 +2807,338 @@
 "分支 '%s' 没有完全合并。\n"
 "如果您确认要删除它,执行 'git branch -D %s'。"
 
-#: builtin/branch.c:185
+#: builtin/branch.c:187
 msgid "Update of config-file failed"
 msgstr "无法更新 config 文件"
 
-#: builtin/branch.c:213
+#: builtin/branch.c:215
 msgid "cannot use -a with -d"
 msgstr "不能将 -a 和 -d 同时使用"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:221
 msgid "Couldn't look up commit object for HEAD"
 msgstr "无法查询 HEAD 指向的提交对象"
 
-#: builtin/branch.c:227
+#: builtin/branch.c:229
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
 msgstr "无法删除您当前所在的分支 '%s'。"
 
-#: builtin/branch.c:240
+#: builtin/branch.c:245
 #, c-format
 msgid "remote branch '%s' not found."
 msgstr "远程分支 '%s' 未发现。"
 
-#: builtin/branch.c:241
+#: builtin/branch.c:246
 #, c-format
 msgid "branch '%s' not found."
 msgstr "分支 '%s' 未发现。"
 
-#: builtin/branch.c:255
+#: builtin/branch.c:260
 #, c-format
 msgid "Error deleting remote branch '%s'"
 msgstr "删除远程分支 '%s' 时出错"
 
-#: builtin/branch.c:256
+#: builtin/branch.c:261
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "删除分支 '%s' 时出错"
 
-#: builtin/branch.c:263
+#: builtin/branch.c:268
 #, c-format
 msgid "Deleted remote branch %s (was %s).\n"
 msgstr "已删除远程分支 %s(曾为 %s)。\n"
 
-#: builtin/branch.c:264
+#: builtin/branch.c:269
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "已删除分支 %s(曾为 %s)。\n"
 
-#: builtin/branch.c:366
+#: builtin/branch.c:370
 #, c-format
 msgid "branch '%s' does not point at a commit"
 msgstr "分支 '%s' 未指向一个提交"
 
-#: builtin/branch.c:454
+#: builtin/branch.c:459
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: 丢失]"
 
-#: builtin/branch.c:459
+#: builtin/branch.c:464
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:464
+#: builtin/branch.c:469
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s:落后 %d]"
 
-#: builtin/branch.c:466
+#: builtin/branch.c:471
 #, c-format
 msgid "[behind %d]"
 msgstr "[落后 %d]"
 
-#: builtin/branch.c:470
+#: builtin/branch.c:475
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s:领先 %d]"
 
-#: builtin/branch.c:472
+#: builtin/branch.c:477
 #, c-format
 msgid "[ahead %d]"
 msgstr "[领先 %d]"
 
-#: builtin/branch.c:475
+#: builtin/branch.c:480
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s:领先 %d,落后 %d]"
 
-#: builtin/branch.c:478
+#: builtin/branch.c:483
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[领先 %d,落后 %d]"
 
-#: builtin/branch.c:502
+#: builtin/branch.c:496
 msgid " **** invalid ref ****"
 msgstr " **** 无效引用 ****"
 
-#: builtin/branch.c:594
+#: builtin/branch.c:587
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(非分支,正变基 %s)"
 
-#: builtin/branch.c:597
+#: builtin/branch.c:590
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(非分支,二分查找开始于 %s)"
 
-#: builtin/branch.c:600
+#: builtin/branch.c:593
 #, c-format
 msgid "(detached from %s)"
 msgstr "(分离自 %s)"
 
-#: builtin/branch.c:603
+#: builtin/branch.c:596
 msgid "(no branch)"
 msgstr "(非分支)"
 
-#: builtin/branch.c:649
+#: builtin/branch.c:643
 #, c-format
 msgid "object '%s' does not point to a commit"
 msgstr "对象 '%s' 没有指向一个提交"
 
-#: builtin/branch.c:681
+#: builtin/branch.c:691
 msgid "some refs could not be read"
 msgstr "一些引用不能读取"
 
-#: builtin/branch.c:694
+#: builtin/branch.c:704
 msgid "cannot rename the current branch while not on any."
 msgstr "无法重命名当前分支因为不处于任何分支上。"
 
-#: builtin/branch.c:704
+#: builtin/branch.c:714
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "无效的分支名:'%s'"
 
-#: builtin/branch.c:719
+#: builtin/branch.c:729
 msgid "Branch rename failed"
 msgstr "分支重命名失败"
 
-#: builtin/branch.c:723
+#: builtin/branch.c:733
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "重命名掉一个错误命名的旧分支 '%s'"
 
-#: builtin/branch.c:727
+#: builtin/branch.c:737
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "分支重命名为 %s,但 HEAD 没有更新!"
 
-#: builtin/branch.c:734
+#: builtin/branch.c:744
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "分支被重命名,但更新 config 文件失败"
 
-#: builtin/branch.c:749
+#: builtin/branch.c:759
 #, c-format
 msgid "malformed object name %s"
 msgstr "非法的对象名 %s"
 
-#: builtin/branch.c:773
+#: builtin/branch.c:783
 #, c-format
 msgid "could not write branch description template: %s"
 msgstr "不能写分支描述模版:%s"
 
-#: builtin/branch.c:803
+#: builtin/branch.c:813
 msgid "Generic options"
 msgstr "通用选项"
 
-#: builtin/branch.c:805
+#: builtin/branch.c:815
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "显示哈希值和主题,若参数出现两次则显示上游分支"
 
-#: builtin/branch.c:806
+#: builtin/branch.c:816
 msgid "suppress informational messages"
 msgstr "不显示信息"
 
-#: builtin/branch.c:807
+#: builtin/branch.c:817
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "设置跟踪模式(参见 git-pull(1))"
 
-#: builtin/branch.c:809
+#: builtin/branch.c:819
 msgid "change upstream info"
 msgstr "改变上游信息"
 
-#: builtin/branch.c:813
+#: builtin/branch.c:823
 msgid "use colored output"
 msgstr "使用彩色输出"
 
-#: builtin/branch.c:814
+#: builtin/branch.c:824
 msgid "act on remote-tracking branches"
 msgstr "作用于远程跟踪分支"
 
-#: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844
-#: builtin/branch.c:850 builtin/commit.c:1494 builtin/commit.c:1495
-#: builtin/commit.c:1496 builtin/commit.c:1497 builtin/tag.c:527
-#: builtin/tag.c:533
+#: builtin/branch.c:827 builtin/branch.c:833 builtin/branch.c:854
+#: builtin/branch.c:860 builtin/commit.c:1622 builtin/commit.c:1623
+#: builtin/commit.c:1624 builtin/commit.c:1625 builtin/tag.c:616
+#: builtin/tag.c:622
 msgid "commit"
 msgstr "提交"
 
-#: builtin/branch.c:818 builtin/branch.c:824
+#: builtin/branch.c:828 builtin/branch.c:834
 msgid "print only branches that contain the commit"
 msgstr "只打印包含该提交的分支"
 
-#: builtin/branch.c:830
+#: builtin/branch.c:840
 msgid "Specific git-branch actions:"
 msgstr "具体的 git-branch 动作:"
 
-#: builtin/branch.c:831
+#: builtin/branch.c:841
 msgid "list both remote-tracking and local branches"
 msgstr "列出远程跟踪及本地分支"
 
-#: builtin/branch.c:833
+#: builtin/branch.c:843
 msgid "delete fully merged branch"
 msgstr "删除完全合并的分支"
 
-#: builtin/branch.c:834
+#: builtin/branch.c:844
 msgid "delete branch (even if not merged)"
 msgstr "删除分支(即使没有合并)"
 
-#: builtin/branch.c:835
+#: builtin/branch.c:845
 msgid "move/rename a branch and its reflog"
 msgstr "移动/重命名一个分支,以及它的引用日志"
 
-#: builtin/branch.c:836
+#: builtin/branch.c:846
 msgid "move/rename a branch, even if target exists"
 msgstr "移动/重命名一个分支,即使目标已存在"
 
-#: builtin/branch.c:837
+#: builtin/branch.c:847
 msgid "list branch names"
 msgstr "列出分支名"
 
-#: builtin/branch.c:838
+#: builtin/branch.c:848
 msgid "create the branch's reflog"
 msgstr "创建分支的引用日志"
 
-#: builtin/branch.c:840
+#: builtin/branch.c:850
 msgid "edit the description for the branch"
 msgstr "标记分支的描述"
 
-#: builtin/branch.c:841
+#: builtin/branch.c:851
 msgid "force creation (when already exists)"
 msgstr "强制创建(当已经存在)"
 
-#: builtin/branch.c:844
+#: builtin/branch.c:854
 msgid "print only not merged branches"
 msgstr "只打印没有合并的分支"
 
-#: builtin/branch.c:850
+#: builtin/branch.c:860
 msgid "print only merged branches"
 msgstr "只打印合并的分支"
 
-#: builtin/branch.c:854
+#: builtin/branch.c:864
 msgid "list branches in columns"
 msgstr "以列的方式显示分支"
 
-#: builtin/branch.c:867
+#: builtin/branch.c:877
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "无法将 HEAD 解析为有效引用。"
 
-#: builtin/branch.c:872 builtin/clone.c:635
+#: builtin/branch.c:881 builtin/clone.c:634
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD 没有位于 /refs/heads 之下!"
 
-#: builtin/branch.c:896
+#: builtin/branch.c:903
 msgid "--column and --verbose are incompatible"
 msgstr "--column 和 --verbose 不兼容"
 
-#: builtin/branch.c:902 builtin/branch.c:941
+#: builtin/branch.c:909 builtin/branch.c:948
 msgid "branch name required"
 msgstr "必须提供分支名"
 
-#: builtin/branch.c:917
+#: builtin/branch.c:924
 msgid "Cannot give description to detached HEAD"
 msgstr "不能向分离头指针提供描述"
 
-#: builtin/branch.c:922
+#: builtin/branch.c:929
 msgid "cannot edit description of more than one branch"
 msgstr "不能为一个以上的分支编辑描述"
 
-#: builtin/branch.c:929
+#: builtin/branch.c:936
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "分支 '%s' 尚无提交。"
 
-#: builtin/branch.c:932
+#: builtin/branch.c:939
 #, c-format
 msgid "No branch named '%s'."
 msgstr "没有分支 '%s'。"
 
-#: builtin/branch.c:947
+#: builtin/branch.c:954
 msgid "too many branches for a rename operation"
 msgstr "为重命名操作提供了太多的分支名"
 
-#: builtin/branch.c:952
+#: builtin/branch.c:959
 msgid "too many branches to set new upstream"
 msgstr "为设置新上游提供了太多的分支名"
 
-#: builtin/branch.c:956
+#: builtin/branch.c:963
 #, 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:959 builtin/branch.c:981 builtin/branch.c:1002
+#: builtin/branch.c:966 builtin/branch.c:988 builtin/branch.c:1009
 #, c-format
 msgid "no such branch '%s'"
 msgstr "没有此分支 '%s'"
 
-#: builtin/branch.c:963
+#: builtin/branch.c:970
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "分支 '%s' 不存在"
 
-#: builtin/branch.c:975
+#: builtin/branch.c:982
 msgid "too many branches to unset upstream"
 msgstr "为取消上游设置操作提供了太多的分支名"
 
-#: builtin/branch.c:979
+#: builtin/branch.c:986
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr "无法取消 HEAD 的上游设置因为它没有指向一个分支"
 
-#: builtin/branch.c:985
+#: builtin/branch.c:992
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "分支 '%s' 没有上游信息"
 
-#: builtin/branch.c:999
+#: builtin/branch.c:1006
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "手工创建 'HEAD' 没有意义"
 
-#: builtin/branch.c:1005
+#: builtin/branch.c:1012
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr "'git branch' 的 -a 和 -r 选项带一个分支名参数没有意义"
 
-#: builtin/branch.c:1008
+#: builtin/branch.c:1015
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -3040,7 +3146,7 @@
 msgstr ""
 "选项 --set-upstream 已弃用并将被移除。考虑使用 --track 或 --set-upstream-to\n"
 
-#: builtin/branch.c:1025
+#: builtin/branch.c:1032
 #, c-format
 msgid ""
 "\n"
@@ -3051,12 +3157,12 @@
 "如果你想用 '%s' 跟踪 '%s', 这么做:\n"
 "\n"
 
-#: builtin/branch.c:1026
+#: builtin/branch.c:1033
 #, c-format
 msgid "    git branch -d %s\n"
 msgstr "    git branch -d %s\n"
 
-#: builtin/branch.c:1027
+#: builtin/branch.c:1034
 #, c-format
 msgid "    git branch --set-upstream-to %s\n"
 msgstr "    git branch --set-upstream-to %s\n"
@@ -3074,43 +3180,43 @@
 msgid "Need a repository to unbundle."
 msgstr "需要一个版本库来解包。"
 
-#: builtin/cat-file.c:331
+#: builtin/cat-file.c:332
 msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
 msgstr "git cat-file (-t|-s|-e|-p|<类型>|--textconv) <对象>"
 
-#: builtin/cat-file.c:332
+#: builtin/cat-file.c:333
 msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
 msgstr "git cat-file (--batch|--batch-check) < <对象列表>"
 
-#: builtin/cat-file.c:369
+#: builtin/cat-file.c:370
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<类型> 可以是其中之一:blob、tree、commit、tag"
 
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:371
 msgid "show object type"
 msgstr "显示对象类型"
 
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:372
 msgid "show object size"
 msgstr "显示对象大小"
 
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:374
 msgid "exit with zero when there's no error"
 msgstr "当没有错误时退出并返回零"
 
-#: builtin/cat-file.c:374
+#: builtin/cat-file.c:375
 msgid "pretty-print object's content"
 msgstr "美观地打印对象的内容"
 
-#: builtin/cat-file.c:376
+#: builtin/cat-file.c:377
 msgid "for blob objects, run textconv on object's content"
 msgstr "对于数据(blob)对象,对其内容执行 textconv"
 
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:379
 msgid "show info and content of objects fed from the standard input"
 msgstr "显示从标准输入提供的对象的信息和内容"
 
-#: builtin/cat-file.c:381
+#: builtin/cat-file.c:382
 msgid "show info about objects fed from the standard input"
 msgstr "显示从标准输入提供的对象的信息"
 
@@ -3130,7 +3236,7 @@
 msgid "use .gitattributes only from the index"
 msgstr "只使用索引中的 .gitattributes"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:75
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
 msgid "read file names from stdin"
 msgstr "从标准输入读出文件名"
 
@@ -3138,7 +3244,7 @@
 msgid "terminate input and output records by a NUL character"
 msgstr "输入和输出的记录使用 NUL 字符终结"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:274
 msgid "suppress progress reporting"
 msgstr "不显示进度报告"
 
@@ -3195,43 +3301,43 @@
 msgid "git checkout-index [options] [--] [<file>...]"
 msgstr "git checkout-index [选项] [--] [<文件>...]"
 
-#: builtin/checkout-index.c:187
+#: builtin/checkout-index.c:188
 msgid "check out all files in the index"
 msgstr "检出索引区的所有文件"
 
-#: builtin/checkout-index.c:188
+#: builtin/checkout-index.c:189
 msgid "force overwrite of existing files"
 msgstr "强制覆盖现有的文件"
 
-#: builtin/checkout-index.c:190
+#: builtin/checkout-index.c:191
 msgid "no warning for existing files and files not in index"
 msgstr "存在或不在索引中的文件都没有警告"
 
-#: builtin/checkout-index.c:192
+#: builtin/checkout-index.c:193
 msgid "don't checkout new files"
 msgstr "不检出新文件"
 
-#: builtin/checkout-index.c:194
+#: builtin/checkout-index.c:195
 msgid "update stat information in the index file"
 msgstr "更新索引中文件的状态信息"
 
-#: builtin/checkout-index.c:200
+#: builtin/checkout-index.c:201
 msgid "read list of paths from the standard input"
 msgstr "从标准输入读取路径列表"
 
-#: builtin/checkout-index.c:202
+#: builtin/checkout-index.c:203
 msgid "write the content to temporary files"
 msgstr "将内容写入临时文件"
 
-#: builtin/checkout-index.c:203 builtin/column.c:30
+#: builtin/checkout-index.c:204 builtin/column.c:30
 msgid "string"
 msgstr "字符串"
 
-#: builtin/checkout-index.c:204
+#: builtin/checkout-index.c:205
 msgid "when creating files, prepend <string>"
 msgstr "在创建文件时,在前面加上<字符串>"
 
-#: builtin/checkout-index.c:207
+#: builtin/checkout-index.c:208
 msgid "copy out the files from named stage"
 msgstr "从指定暂存区中拷出文件"
 
@@ -3273,65 +3379,65 @@
 msgid "Unable to add merge result for '%s'"
 msgstr "无法为 '%s' 添加合并结果"
 
-#: builtin/checkout.c:232 builtin/checkout.c:235 builtin/checkout.c:238
-#: builtin/checkout.c:241
+#: builtin/checkout.c:231 builtin/checkout.c:234 builtin/checkout.c:237
+#: builtin/checkout.c:240
 #, c-format
 msgid "'%s' cannot be used with updating paths"
 msgstr "'%s' 不能在更新路径时使用"
 
-#: builtin/checkout.c:244 builtin/checkout.c:247
+#: builtin/checkout.c:243 builtin/checkout.c:246
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' 不能和 %s 同时使用"
 
-#: builtin/checkout.c:250
+#: builtin/checkout.c:249
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr "不能同时更新路径并切换到分支'%s'。"
 
-#: builtin/checkout.c:261 builtin/checkout.c:450
+#: builtin/checkout.c:260 builtin/checkout.c:449
 msgid "corrupt index file"
 msgstr "损坏的索引文件"
 
-#: builtin/checkout.c:321 builtin/checkout.c:328
+#: builtin/checkout.c:320 builtin/checkout.c:327
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "路径 '%s' 未合并"
 
-#: builtin/checkout.c:472
+#: builtin/checkout.c:471
 msgid "you need to resolve your current index first"
 msgstr "您需要先解决当前索引的冲突"
 
-#: builtin/checkout.c:593
+#: builtin/checkout.c:597
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr "不能对 '%s' 执行 reflog 操作\n"
 
-#: builtin/checkout.c:631
+#: builtin/checkout.c:635
 msgid "HEAD is now at"
 msgstr "HEAD 目前位于"
 
-#: builtin/checkout.c:638
+#: builtin/checkout.c:642
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "重置分支 '%s'\n"
 
-#: builtin/checkout.c:641
+#: builtin/checkout.c:645
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "已经位于 '%s'\n"
 
-#: builtin/checkout.c:645
+#: builtin/checkout.c:649
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "切换并重置分支 '%s'\n"
 
-#: builtin/checkout.c:647 builtin/checkout.c:1032
+#: builtin/checkout.c:651 builtin/checkout.c:1032
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "切换到一个新分支 '%s'\n"
 
-#: builtin/checkout.c:649
+#: builtin/checkout.c:653
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "切换到分支 '%s'\n"
@@ -3425,7 +3531,7 @@
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "不能切换分支到一个非提交 '%s'"
 
-#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:89
 #: builtin/remote.c:159 builtin/remote.c:161
 msgid "branch"
 msgstr "分支"
@@ -3474,11 +3580,11 @@
 msgid "perform a 3-way merge with the new branch"
 msgstr "和新的分支执行三路合并"
 
-#: builtin/checkout.c:1105 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:226
 msgid "update ignored files (default)"
 msgstr "更新忽略的文件(默认)"
 
-#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
+#: builtin/checkout.c:1106 builtin/log.c:1239 parse-options.h:245
 msgid "style"
 msgstr "风格"
 
@@ -3502,15 +3608,15 @@
 msgid "--track needs a branch name"
 msgstr "--track 需要一个分支名"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1157
 msgid "Missing branch name; try -b"
 msgstr "缺少分支名;尝试 -b"
 
-#: builtin/checkout.c:1196
+#: builtin/checkout.c:1194
 msgid "invalid path specification"
 msgstr "无效的路径规格"
 
-#: builtin/checkout.c:1203
+#: builtin/checkout.c:1201
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3519,12 +3625,12 @@
 "不能同时更新路径并切换到分支'%s'。\n"
 "您是想要检出 '%s' 但其未能解析为提交么?"
 
-#: builtin/checkout.c:1208
+#: builtin/checkout.c:1206
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout:--detach 不能接收路径参数 '%s'"
 
-#: builtin/checkout.c:1212
+#: builtin/checkout.c:1210
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -3599,30 +3705,30 @@
 msgid "Huh (%s)?"
 msgstr "嗯(%s)?"
 
-#: builtin/clean.c:660
+#: builtin/clean.c:659
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "输入模版以排除条目>> "
 
-#: builtin/clean.c:697
+#: builtin/clean.c:696
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "警告:无法找到和 %s 匹配的条目"
 
-#: builtin/clean.c:718
+#: builtin/clean.c:717
 msgid "Select items to delete"
 msgstr "选择要删除的条目"
 
-#: builtin/clean.c:758
+#: builtin/clean.c:757
 #, c-format
 msgid "remove %s? "
 msgstr "删除 %s?"
 
-#: builtin/clean.c:783
+#: builtin/clean.c:782
 msgid "Bye."
 msgstr "再见。"
 
-#: builtin/clean.c:791
+#: builtin/clean.c:790
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -3640,214 +3746,214 @@
 "help                - 显示本帮助\n"
 "?                   - 显示如何在提示符下选择的帮助"
 
-#: builtin/clean.c:818
+#: builtin/clean.c:817
 msgid "*** Commands ***"
 msgstr "*** 命令 ***"
 
-#: builtin/clean.c:819
+#: builtin/clean.c:818
 msgid "What now"
 msgstr "请选择"
 
-#: builtin/clean.c:827
+#: builtin/clean.c:826
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "将删除如下条目:"
 msgstr[1] "将删除如下条目:"
 
-#: builtin/clean.c:844
+#: builtin/clean.c:843
 msgid "No more files to clean, exiting."
 msgstr "没有要清理的文件,退出。"
 
-#: builtin/clean.c:875
+#: builtin/clean.c:874
 msgid "do not print names of files removed"
 msgstr "不打印删除文件的名称"
 
-#: builtin/clean.c:877
+#: builtin/clean.c:876
 msgid "force"
 msgstr "强制"
 
-#: builtin/clean.c:878
+#: builtin/clean.c:877
 msgid "interactive cleaning"
 msgstr "交互式清除"
 
-#: builtin/clean.c:880
+#: builtin/clean.c:879
 msgid "remove whole directories"
 msgstr "删除整个目录"
 
-#: builtin/clean.c:881 builtin/describe.c:415 builtin/grep.c:716
-#: builtin/ls-files.c:486 builtin/name-rev.c:314 builtin/show-ref.c:185
+#: builtin/clean.c:880 builtin/describe.c:407 builtin/grep.c:714
+#: builtin/ls-files.c:486 builtin/name-rev.c:311 builtin/show-ref.c:185
 msgid "pattern"
 msgstr "模式"
 
-#: builtin/clean.c:882
+#: builtin/clean.c:881
 msgid "add <pattern> to ignore rules"
 msgstr "添加<模式>到忽略规则"
 
-#: builtin/clean.c:883
+#: builtin/clean.c:882
 msgid "remove ignored files, too"
 msgstr "也删除忽略的文件"
 
-#: builtin/clean.c:885
+#: builtin/clean.c:884
 msgid "remove only ignored files"
 msgstr "只删除忽略的文件"
 
-#: builtin/clean.c:903
+#: builtin/clean.c:902
 msgid "-x and -X cannot be used together"
 msgstr "-x 和 -X 不能同时使用"
 
-#: builtin/clean.c:907
+#: builtin/clean.c:906
 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:910
+#: builtin/clean.c:909
 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:36
+#: builtin/clone.c:37
 msgid "git clone [options] [--] <repo> [<dir>]"
 msgstr "git clone [选项] [--] <版本库> [<路径>]"
 
-#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:504
+#: builtin/clone.c:65 builtin/fetch.c:112 builtin/merge.c:223
+#: builtin/push.c:514
 msgid "force progress reporting"
 msgstr "强制显示进度报告"
 
-#: builtin/clone.c:66
+#: builtin/clone.c:67
 msgid "don't create a checkout"
 msgstr "不创建一个检出"
 
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
+#: builtin/clone.c:68 builtin/clone.c:70 builtin/init-db.c:488
 msgid "create a bare repository"
-msgstr "创建一个裸版本库"
+msgstr "创建一个纯版本库"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:72
 msgid "create a mirror repository (implies bare)"
-msgstr "创建一个镜像版本库(也是裸版本库)"
+msgstr "创建一个镜像版本库(也是纯版本库)"
 
-#: builtin/clone.c:73
+#: builtin/clone.c:74
 msgid "to clone from a local repository"
 msgstr "从本地版本库克隆"
 
-#: builtin/clone.c:75
+#: builtin/clone.c:76
 msgid "don't use local hardlinks, always copy"
 msgstr "不使用本地硬链接,始终复制"
 
-#: builtin/clone.c:77
+#: builtin/clone.c:78
 msgid "setup as shared repository"
 msgstr "设置为共享版本库"
 
-#: builtin/clone.c:79 builtin/clone.c:81
+#: builtin/clone.c:80 builtin/clone.c:82
 msgid "initialize submodules in the clone"
 msgstr "在克隆时初始化子模组"
 
-#: builtin/clone.c:82 builtin/init-db.c:483
+#: builtin/clone.c:83 builtin/init-db.c:485
 msgid "template-directory"
 msgstr "模板目录"
 
-#: builtin/clone.c:83 builtin/init-db.c:484
+#: builtin/clone.c:84 builtin/init-db.c:486
 msgid "directory from which templates will be used"
 msgstr "模板目录将被使用"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:86
 msgid "reference repository"
 msgstr "参考版本库"
 
-#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44
 msgid "name"
 msgstr "名称"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:88
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "使用<名称>而不是 'origin' 去跟踪上游"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:90
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "检出<分支>而不是远程HEAD"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:92
 msgid "path to git-upload-pack on the remote"
 msgstr "远程 git-upload-pack 路径"
 
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
+#: builtin/clone.c:93 builtin/fetch.c:113 builtin/grep.c:659
 msgid "depth"
 msgstr "深度"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:94
 msgid "create a shallow clone of that depth"
 msgstr "创建一个指定深度的浅克隆"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:96
 msgid "clone only one branch, HEAD or --branch"
 msgstr "只克隆一个分支、HEAD 或 --branch"
 
-#: builtin/clone.c:96 builtin/init-db.c:492
+#: builtin/clone.c:97 builtin/init-db.c:494
 msgid "gitdir"
 msgstr "git目录"
 
-#: builtin/clone.c:97 builtin/init-db.c:493
+#: builtin/clone.c:98 builtin/init-db.c:495
 msgid "separate git dir from working tree"
 msgstr "git目录和工作区分离"
 
-#: builtin/clone.c:98
+#: builtin/clone.c:99
 msgid "key=value"
 msgstr "key=value"
 
-#: builtin/clone.c:99
+#: builtin/clone.c:100
 msgid "set config inside the new repository"
 msgstr "在新版本库中设置配置信息"
 
-#: builtin/clone.c:252
+#: builtin/clone.c:253
 #, c-format
 msgid "reference repository '%s' is not a local repository."
 msgstr "参考版本库 '%s' 不是一个本地版本库。"
 
-#: builtin/clone.c:256
+#: builtin/clone.c:257
 #, c-format
 msgid "reference repository '%s' is shallow"
 msgstr "参考版本库 '%s' 是一个浅克隆"
 
-#: builtin/clone.c:259
+#: builtin/clone.c:260
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr "参考版本库 '%s' 已被嫁接"
 
-#: builtin/clone.c:321
+#: builtin/clone.c:322
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr "无法创建目录 '%s'"
 
-#: builtin/clone.c:323 builtin/diff.c:83
+#: builtin/clone.c:324 builtin/diff.c:84
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "无法枚举 '%s' 状态"
 
-#: builtin/clone.c:325
+#: builtin/clone.c:326
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s 存在且不是一个目录"
 
-#: builtin/clone.c:339
+#: builtin/clone.c:340
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "无法枚举 %s 状态\n"
 
-#: builtin/clone.c:361
+#: builtin/clone.c:362
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "无法创建链接 '%s'"
 
-#: builtin/clone.c:365
+#: builtin/clone.c:366
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "无法拷贝文件至 '%s'"
 
-#: builtin/clone.c:388 builtin/clone.c:565
+#: builtin/clone.c:389 builtin/clone.c:563
 #, c-format
 msgid "done.\n"
 msgstr "完成。\n"
@@ -3862,25 +3968,25 @@
 "您可以通过 'git status' 检查哪些已被检出,然后使用命令\n"
 "'git checkout -f HEAD' 重试\n"
 
-#: builtin/clone.c:480
+#: builtin/clone.c:478
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "不能发现要克隆的远程分支 %s。"
 
-#: builtin/clone.c:560
+#: builtin/clone.c:558
 #, c-format
 msgid "Checking connectivity... "
 msgstr "检查连接... "
 
-#: builtin/clone.c:563
+#: builtin/clone.c:561
 msgid "remote did not send all necessary objects"
 msgstr "远程没有发送所有必须的对象"
 
-#: builtin/clone.c:626
+#: builtin/clone.c:625
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr "远程 HEAD 指向一个不存在的引用,无法检出。\n"
 
-#: builtin/clone.c:657
+#: builtin/clone.c:656
 msgid "unable to checkout working tree"
 msgstr "不能检出工作区"
 
@@ -3906,64 +4012,64 @@
 msgid "repository '%s' does not exist"
 msgstr "版本库 '%s' 不存在"
 
-#: builtin/clone.c:802
-msgid "--depth is ignored in local clones; use file:// instead."
-msgstr "--depth 在本地克隆被忽略,改为 file:// 协议试试。"
-
-#: builtin/clone.c:805
-msgid "source repository is shallow, ignoring --local"
-msgstr "源版本库是浅克隆,忽略 --local"
-
-#: builtin/clone.c:810
-msgid "--local is ignored"
-msgstr "--local 被忽略"
-
-#: builtin/clone.c:814 builtin/fetch.c:1119
+#: builtin/clone.c:802 builtin/fetch.c:1155
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "深度 %s 不是一个正数"
 
-#: builtin/clone.c:824
+#: builtin/clone.c:812
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "目标路径 '%s' 已经存在,并且不是一个空目录。"
 
-#: builtin/clone.c:834
+#: builtin/clone.c:822
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "工作区 '%s' 已经存在。"
 
-#: builtin/clone.c:847 builtin/clone.c:859
+#: builtin/clone.c:835 builtin/clone.c:847
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "不能为 '%s' 创建先导目录"
 
-#: builtin/clone.c:850
+#: builtin/clone.c:838
 #, c-format
 msgid "could not create work tree dir '%s'."
 msgstr "不能为 '%s' 创建工作区目录。"
 
-#: builtin/clone.c:869
+#: builtin/clone.c:857
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
-msgstr "克隆到裸版本库 '%s'...\n"
+msgstr "克隆到纯版本库 '%s'...\n"
 
-#: builtin/clone.c:871
+#: builtin/clone.c:859
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "正克隆到 '%s'...\n"
 
-#: builtin/clone.c:906
+#: builtin/clone.c:895
+msgid "--depth is ignored in local clones; use file:// instead."
+msgstr "--depth 在本地克隆被忽略,改为 file:// 协议试试。"
+
+#: builtin/clone.c:898
+msgid "source repository is shallow, ignoring --local"
+msgstr "源版本库是浅克隆,忽略 --local"
+
+#: builtin/clone.c:903
+msgid "--local is ignored"
+msgstr "--local 被忽略"
+
+#: builtin/clone.c:907
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "不知道如何克隆 %s"
 
-#: builtin/clone.c:957 builtin/clone.c:965
+#: builtin/clone.c:958 builtin/clone.c:966
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "远程分支 %s 在上游 %s 未发现"
 
-#: builtin/clone.c:968
+#: builtin/clone.c:969
 msgid "You appear to have cloned an empty repository."
 msgstr "您似乎克隆了一个空版本库。"
 
@@ -3999,15 +4105,39 @@
 msgid "--command must be the first argument"
 msgstr "--command 必须是第一个参数"
 
-#: builtin/commit.c:36
+#: builtin/commit.c:37
 msgid "git commit [options] [--] <pathspec>..."
 msgstr "git commit [选项] [--] <路径规则>..."
 
-#: builtin/commit.c:41
+#: builtin/commit.c:42
 msgid "git status [options] [--] <pathspec>..."
 msgstr "git status [选项] [--] <路径规则>..."
 
-#: builtin/commit.c:46
+#: builtin/commit.c:47
+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"
+"    git config --global --edit\n"
+"\n"
+"设置完毕后,您可以用下面的命令来修正本次提交所使用的用户身份:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+
+#: builtin/commit.c:60
 msgid ""
 "Your name and email address were configured automatically based\n"
 "on your username and hostname. Please check that they are accurate.\n"
@@ -4021,7 +4151,7 @@
 "    git commit --amend --reset-author\n"
 msgstr ""
 "您的姓名和邮件地址基于登录名和主机名进行了自动设置。请检查它们正确\n"
-"与否。您可以通过下面的命令对其进行明确地设置以免再出现本提示信息:\n"
+"与否。您可以对其进行设置以免再出现本提示信息:\n"
 "\n"
 "    git config --global user.name \"Your Name\"\n"
 "    git config --global user.email you@example.com\n"
@@ -4030,7 +4160,7 @@
 "\n"
 "    git commit --amend --reset-author\n"
 
-#: builtin/commit.c:58
+#: builtin/commit.c:72
 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"
@@ -4039,7 +4169,7 @@
 "您要修补最近的提交,但这么做会让它成为空提交。您可以重复您的命令并带上\n"
 "--allow-empty 选项,或者您可用命令 \"git reset HEAD^\" 整个删除该提交。\n"
 
-#: builtin/commit.c:63
+#: builtin/commit.c:77
 msgid ""
 "The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
 "If you wish to commit it anyway, use:\n"
@@ -4053,11 +4183,11 @@
 "    git commit --allow-empty\n"
 "\n"
 
-#: builtin/commit.c:70
+#: builtin/commit.c:84
 msgid "Otherwise, please use 'git reset'\n"
 msgstr "否则,请使用命令 'git reset'\n"
 
-#: builtin/commit.c:73
+#: builtin/commit.c:87
 msgid ""
 "If you wish to skip this commit, use:\n"
 "\n"
@@ -4073,93 +4203,117 @@
 "然后执行 \"git cherry-pick --continue\" 继续对其余提交执行拣选\n"
 "操作。\n"
 
-#: builtin/commit.c:288
+#: builtin/commit.c:302
 msgid "failed to unpack HEAD tree object"
 msgstr "无法解包 HEAD 树对象"
 
-#: builtin/commit.c:330
+#: builtin/commit.c:342
 msgid "unable to create temporary index"
 msgstr "不能创建临时索引"
 
-#: builtin/commit.c:336
+#: builtin/commit.c:348
 msgid "interactive add failed"
 msgstr "交互式添加失败"
 
-#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
+#: builtin/commit.c:359
+msgid "unable to write index file"
+msgstr "无法写入索引文件"
+
+#: builtin/commit.c:361
+msgid "unable to update temporary index"
+msgstr "无法更新临时索引"
+
+#: builtin/commit.c:363
+msgid "Failed to update main cache tree"
+msgstr "不能更新树的主缓存"
+
+#: builtin/commit.c:387 builtin/commit.c:412 builtin/commit.c:461
 msgid "unable to write new_index file"
 msgstr "无法写 new_index 文件"
 
-#: builtin/commit.c:421
+#: builtin/commit.c:443
 msgid "cannot do a partial commit during a merge."
 msgstr "在合并过程中不能做部分提交。"
 
-#: builtin/commit.c:423
+#: builtin/commit.c:445
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "在拣选过程中不能做部分提交。"
 
-#: builtin/commit.c:433
+#: builtin/commit.c:454
 msgid "cannot read the index"
 msgstr "无法读取索引"
 
-#: builtin/commit.c:453
+#: builtin/commit.c:473
 msgid "unable to write temporary index file"
 msgstr "无法写临时索引文件"
 
-#: builtin/commit.c:544 builtin/commit.c:550
+#: builtin/commit.c:592
 #, c-format
-msgid "invalid commit: %s"
-msgstr "无效的提交:%s"
+msgid "commit '%s' lacks author header"
+msgstr "提交 '%s' 缺少作者信息"
 
-#: builtin/commit.c:572
+#: builtin/commit.c:594
+#, c-format
+msgid "commit '%s' has malformed author line"
+msgstr "提交 '%s' 有非法的作者信息"
+
+#: builtin/commit.c:613
 msgid "malformed --author parameter"
 msgstr "非法的 --author 参数"
 
-#: builtin/commit.c:592
+#: builtin/commit.c:621
+#, c-format
+msgid "invalid date format: %s"
+msgstr "无效的日期格式:%s"
+
+#: builtin/commit.c:642
 #, c-format
 msgid "Malformed ident string: '%s'"
 msgstr "非法的身份字符串:'%s'"
 
-#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
+#: builtin/commit.c:675
+msgid ""
+"unable to select a comment character that is not used\n"
+"in the current commit message"
+msgstr "无法选择一个未被当前提交说明使用的注释字符"
+
+#: builtin/commit.c:712 builtin/commit.c:745 builtin/commit.c:1120
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "不能查询提交 %s"
 
-#: builtin/commit.c:641 builtin/shortlog.c:273
+#: builtin/commit.c:724 builtin/shortlog.c:273
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(正从标准输入中读取日志信息)\n"
 
-#: builtin/commit.c:643
+#: builtin/commit.c:726
 msgid "could not read log from standard input"
 msgstr "不能从标准输入中读取日志信息"
 
-#: builtin/commit.c:647
+#: builtin/commit.c:730
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "不能读取日志文件 '%s'"
 
-#: builtin/commit.c:654
-msgid "commit has empty message"
-msgstr "提交说明为空"
-
-#: builtin/commit.c:670
+#: builtin/commit.c:752
 msgid "could not read MERGE_MSG"
 msgstr "不能读取 MERGE_MSG"
 
-#: builtin/commit.c:674
+#: builtin/commit.c:756
 msgid "could not read SQUASH_MSG"
 msgstr "不能读取 SQUASH_MSG"
 
-#: builtin/commit.c:678
+#: builtin/commit.c:760
 #, c-format
 msgid "could not read '%s'"
 msgstr "不能读取 '%s'"
 
-#: builtin/commit.c:749
+#: builtin/commit.c:831
 msgid "could not write commit template"
 msgstr "不能写提交模版"
 
-#: builtin/commit.c:764
+#: builtin/commit.c:849
 #, c-format
 msgid ""
 "\n"
@@ -4173,7 +4327,7 @@
 "\t%s\n"
 "然后重试。\n"
 
-#: builtin/commit.c:769
+#: builtin/commit.c:854
 #, c-format
 msgid ""
 "\n"
@@ -4187,7 +4341,7 @@
 "\t%s\n"
 "然后重试。\n"
 
-#: builtin/commit.c:782
+#: builtin/commit.c:867
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4196,7 +4350,7 @@
 "请为您的变更输入提交说明。以 '%c' 开始的行将被忽略,而一个空的提交\n"
 "说明将会终止提交。\n"
 
-#: builtin/commit.c:789
+#: builtin/commit.c:874
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4207,358 +4361,356 @@
 "也可以删除它们。一个空的提交说明将会终止提交。\n"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: builtin/commit.c:802
+#: builtin/commit.c:888
 #, c-format
-msgid "%sAuthor:    %s"
-msgstr "%s作者:     %s"
+msgid "%sAuthor:    %.*s <%.*s>"
+msgstr "%s作者:  %.*s <%.*s>"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: builtin/commit.c:809
+#: builtin/commit.c:896
 #, c-format
-msgid "%sCommitter: %s"
-msgstr "%s提交者:   %s"
+msgid "%sDate:      %s"
+msgstr "%s日期:  %s"
 
-#: builtin/commit.c:829
+#  译者:为保证在输出中对齐,注意调整句中空格!
+#: builtin/commit.c:903
+#, c-format
+msgid "%sCommitter: %.*s <%.*s>"
+msgstr "%s提交者:%.*s <%.*s>"
+
+#: builtin/commit.c:921
 msgid "Cannot read index"
 msgstr "无法读取索引"
 
-#: builtin/commit.c:872
+#: builtin/commit.c:978
 msgid "Error building trees"
 msgstr "无法创建树对象"
 
-#: builtin/commit.c:887 builtin/tag.c:391
+#: builtin/commit.c:993 builtin/tag.c:495
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "请使用 -m 或 -F 选项提供提交说明。\n"
 
-#: builtin/commit.c:989
+#: builtin/commit.c:1095
 #, c-format
 msgid "No existing author found with '%s'"
 msgstr "没有找到匹配 '%s' 的作者"
 
-#: builtin/commit.c:1004 builtin/commit.c:1244
+#: builtin/commit.c:1110 builtin/commit.c:1350
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "无效的未追踪文件参数 '%s'"
 
-#: builtin/commit.c:1041
+#: builtin/commit.c:1147
 msgid "--long and -z are incompatible"
 msgstr "--long 和 -z 选项不兼容"
 
-#: builtin/commit.c:1071
+#: builtin/commit.c:1177
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "同时使用 --reset-author 和 --author 没有意义"
 
-#: builtin/commit.c:1080
+#: builtin/commit.c:1186
 msgid "You have nothing to amend."
 msgstr "您没有可修补的提交。"
 
-#: builtin/commit.c:1083
+#: builtin/commit.c:1189
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "您正处于一个合并过程中 -- 无法修补提交。"
 
-#: builtin/commit.c:1085
+#: builtin/commit.c:1191
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "您正处于一个拣选过程中 -- 无法修补提交。"
 
-#: builtin/commit.c:1088
+#: builtin/commit.c:1194
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "选项 --squash 和 --fixup 不能同时使用"
 
-#: builtin/commit.c:1098
+#: builtin/commit.c:1204
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "只能用一个 -c/-C/-F/--fixup 选项。"
 
-#: builtin/commit.c:1100
+#: builtin/commit.c:1206
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "选项 -m 不能和 -c/-C/-F/--fixup 同时使用。"
 
-#: builtin/commit.c:1108
+#: builtin/commit.c:1214
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author 只能和 -C、-c 或 --amend 同时使用。"
 
-#: builtin/commit.c:1125
+#: builtin/commit.c:1231
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr "只能用一个 --include/--only/--all/--interactive/--patch 选项。"
 
-#: builtin/commit.c:1127
+#: builtin/commit.c:1233
 msgid "No paths with --include/--only does not make sense."
 msgstr "参数 --include/--only 不跟路径没有意义。"
 
-#: builtin/commit.c:1129
+#: builtin/commit.c:1235
 msgid "Clever... amending the last one with dirty index."
 msgstr "聪明... 在索引不干净下修补最后的提交。"
 
-#: builtin/commit.c:1131
+#: builtin/commit.c:1237
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr "指定了明确的路径而没有使用 -i 或 -o 选项,认为是 --only paths..."
 
-#: builtin/commit.c:1143 builtin/tag.c:639
+#: builtin/commit.c:1249 builtin/tag.c:728
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "无效的清理模式 %s"
 
-#: builtin/commit.c:1148
+#: builtin/commit.c:1254
 msgid "Paths with -a does not make sense."
 msgstr "路径和 -a 选项同时使用没有意义。"
 
-#: builtin/commit.c:1258 builtin/commit.c:1516
+#: builtin/commit.c:1364 builtin/commit.c:1644
 msgid "show status concisely"
 msgstr "以简洁的格式显示状态"
 
-#: builtin/commit.c:1260 builtin/commit.c:1518
+#: builtin/commit.c:1366 builtin/commit.c:1646
 msgid "show branch information"
 msgstr "显示分支信息"
 
-#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
+#: builtin/commit.c:1368 builtin/commit.c:1648 builtin/push.c:500
 msgid "machine-readable output"
 msgstr "机器可读的输出"
 
-#: builtin/commit.c:1265 builtin/commit.c:1522
+#: builtin/commit.c:1371 builtin/commit.c:1650
 msgid "show status in long format (default)"
 msgstr "以长格式显示状态(默认)"
 
-#: builtin/commit.c:1268 builtin/commit.c:1525
+#: builtin/commit.c:1374 builtin/commit.c:1653
 msgid "terminate entries with NUL"
 msgstr "条目以NUL字符结尾"
 
-#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:514
+#: builtin/commit.c:1376 builtin/commit.c:1656 builtin/fast-export.c:980
+#: builtin/fast-export.c:983 builtin/tag.c:603
 msgid "mode"
 msgstr "模式"
 
-#: builtin/commit.c:1271 builtin/commit.c:1528
+#: builtin/commit.c:1377 builtin/commit.c:1656
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr "显示未跟踪的文件,“模式”的可选参数:all、normal、no。(默认:all)"
 
-#: builtin/commit.c:1274
+#: builtin/commit.c:1380
 msgid "show ignored files"
 msgstr "显示忽略的文件"
 
-#: builtin/commit.c:1275 parse-options.h:153
+#: builtin/commit.c:1381 parse-options.h:153
 msgid "when"
 msgstr "何时"
 
-#: builtin/commit.c:1276
+#: builtin/commit.c:1382
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
 msgstr ""
 "忽略子模组的更改,“何时”的可选参数:all、dirty、untracked。(默认:all)"
 
-#: builtin/commit.c:1278
+#: builtin/commit.c:1384
 msgid "list untracked files in columns"
 msgstr "以列的方式显示未跟踪的文件"
 
-#: builtin/commit.c:1347
+#: builtin/commit.c:1471
 msgid "couldn't look up newly created commit"
 msgstr "无法找到新创建的提交"
 
-#: builtin/commit.c:1349
+#: builtin/commit.c:1473
 msgid "could not parse newly created commit"
 msgstr "不能解析新创建的提交"
 
-#: builtin/commit.c:1390
+#: builtin/commit.c:1518
 msgid "detached HEAD"
 msgstr "分离头指针"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/commit.c:1392
+#: builtin/commit.c:1521
 msgid " (root-commit)"
 msgstr "(根提交)"
 
-#: builtin/commit.c:1486
+#: builtin/commit.c:1614
 msgid "suppress summary after successful commit"
 msgstr "提交成功后不显示概述信息"
 
-#: builtin/commit.c:1487
+#: builtin/commit.c:1615
 msgid "show diff in commit message template"
 msgstr "在提交说明模板里显示差异"
 
-#: builtin/commit.c:1489
+#: builtin/commit.c:1617
 msgid "Commit message options"
 msgstr "提交说明选项"
 
-#: builtin/commit.c:1490 builtin/tag.c:512
+#: builtin/commit.c:1618 builtin/tag.c:601
 msgid "read message from file"
 msgstr "从文件中读取提交说明"
 
-#: builtin/commit.c:1491
+#: builtin/commit.c:1619
 msgid "author"
 msgstr "作者"
 
-#: builtin/commit.c:1491
+#: builtin/commit.c:1619
 msgid "override author for commit"
 msgstr "提交时覆盖作者"
 
-#: builtin/commit.c:1492 builtin/gc.c:272
+#: builtin/commit.c:1620 builtin/gc.c:275
 msgid "date"
 msgstr "日期"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1620
 msgid "override date for commit"
 msgstr "提交时覆盖日期"
 
-#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
-#: builtin/notes.c:566 builtin/tag.c:510
+#: builtin/commit.c:1621 builtin/merge.c:217 builtin/notes.c:408
+#: builtin/notes.c:565 builtin/tag.c:599
 msgid "message"
 msgstr "说明"
 
-#: builtin/commit.c:1493
+#: builtin/commit.c:1621
 msgid "commit message"
 msgstr "提交说明"
 
-#: builtin/commit.c:1494
+#: builtin/commit.c:1622
 msgid "reuse and edit message from specified commit"
 msgstr "重用并编辑指定提交的提交说明"
 
-#: builtin/commit.c:1495
+#: builtin/commit.c:1623
 msgid "reuse message from specified commit"
 msgstr "重用指定提交的提交说明"
 
-#: builtin/commit.c:1496
+#: builtin/commit.c:1624
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr "使用 autosquash 格式的提交说明用以修正指定的提交"
 
-#: builtin/commit.c:1497
+#: builtin/commit.c:1625
 msgid "use autosquash formatted message to squash specified commit"
 msgstr "使用 autosquash 格式的提交说明用以压缩至指定的提交"
 
-#: builtin/commit.c:1498
+#: builtin/commit.c:1626
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "现在将该提交的作者改为我(和 -C/-c/--amend 参数共用)"
 
-#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1627 builtin/log.c:1191 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "添加 Signed-off-by: 签名"
 
-#: builtin/commit.c:1500
+#: builtin/commit.c:1628
 msgid "use specified template file"
 msgstr "使用指定的模板文件"
 
-#: builtin/commit.c:1501
+#: builtin/commit.c:1629
 msgid "force edit of commit"
 msgstr "强制编辑提交"
 
 #  译者:可选值,不能翻译(或是原文中笔误,应为 mode)
-#: builtin/commit.c:1502
+#: builtin/commit.c:1630
 msgid "default"
 msgstr "default"
 
-#: builtin/commit.c:1502 builtin/tag.c:515
+#: builtin/commit.c:1630 builtin/tag.c:604
 msgid "how to strip spaces and #comments from message"
 msgstr "设置如何删除提交说明里的空格和#注释"
 
-#: builtin/commit.c:1503
+#: builtin/commit.c:1631
 msgid "include status in commit message template"
 msgstr "在提交说明模板里包含状态信息"
 
-#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
-#: builtin/tag.c:516
+#: builtin/commit.c:1632 builtin/merge.c:224 builtin/revert.c:92
+#: builtin/tag.c:605
 msgid "key-id"
 msgstr "key-id"
 
-#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
+#: builtin/commit.c:1633 builtin/merge.c:225 builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "GPG 提交签名"
 
-#: builtin/commit.c:1508
+#: builtin/commit.c:1636
 msgid "Commit contents options"
 msgstr "提交内容选项"
 
-#: builtin/commit.c:1509
+#: builtin/commit.c:1637
 msgid "commit all changed files"
 msgstr "提交所有改动的文件"
 
-#: builtin/commit.c:1510
+#: builtin/commit.c:1638
 msgid "add specified files to index for commit"
 msgstr "添加指定的文件到索引区等待提交"
 
-#: builtin/commit.c:1511
+#: builtin/commit.c:1639
 msgid "interactively add files"
 msgstr "交互式添加文件"
 
-#: builtin/commit.c:1512
+#: builtin/commit.c:1640
 msgid "interactively add changes"
 msgstr "交互式添加变更"
 
-#: builtin/commit.c:1513
+#: builtin/commit.c:1641
 msgid "commit only specified files"
 msgstr "只提交指定的文件"
 
-#: builtin/commit.c:1514
+#: builtin/commit.c:1642
 msgid "bypass pre-commit hook"
 msgstr "绕过 pre-commit 钩子"
 
-#: builtin/commit.c:1515
+#: builtin/commit.c:1643
 msgid "show what would be committed"
 msgstr "显示将要提交的内容"
 
-#: builtin/commit.c:1526
+#: builtin/commit.c:1654
 msgid "amend previous commit"
 msgstr "修改先前的提交"
 
-#: builtin/commit.c:1527
+#: builtin/commit.c:1655
 msgid "bypass post-rewrite hook"
 msgstr "绕过 post-rewrite 钩子"
 
-#: builtin/commit.c:1532
+#: builtin/commit.c:1660
 msgid "ok to record an empty change"
 msgstr "允许一个空提交"
 
-#: builtin/commit.c:1534
+#: builtin/commit.c:1662
 msgid "ok to record a change with an empty message"
 msgstr "允许空的提交说明"
 
-#: builtin/commit.c:1562
+#: builtin/commit.c:1691
 msgid "could not parse HEAD commit"
 msgstr "不能解析 HEAD 提交"
 
-#: builtin/commit.c:1601 builtin/merge.c:518
+#: builtin/commit.c:1730 builtin/merge.c:518
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "不能为读入打开 '%s'"
 
-#: builtin/commit.c:1608
+#: builtin/commit.c:1737
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "损坏的 MERGE_HEAD 文件(%s)"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1744
 msgid "could not read MERGE_MODE"
 msgstr "不能读取 MERGE_MODE"
 
-#: builtin/commit.c:1634
+#: builtin/commit.c:1763
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "不能读取提交说明:%s"
 
-#: builtin/commit.c:1645
+#: builtin/commit.c:1774
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "终止提交;您未更改来自模版的提交说明。\n"
 
-#: builtin/commit.c:1650
+#: builtin/commit.c:1779
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "终止提交因为提交说明为空。\n"
 
-#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
+#: builtin/commit.c:1794 builtin/merge.c:850 builtin/merge.c:875
 msgid "failed to write commit object"
 msgstr "无法写提交对象"
 
-#: builtin/commit.c:1686
-msgid "cannot lock HEAD ref"
-msgstr "无法锁定 HEAD 引用"
-
-#: builtin/commit.c:1690
-msgid "cannot update HEAD ref"
-msgstr "无法更新 HEAD 引用"
-
-#: builtin/commit.c:1701
+#: builtin/commit.c:1827
 msgid ""
 "Repository has been updated, but unable to write\n"
-"new_index file. Check that disk is not full or quota is\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"
@@ -4692,63 +4844,87 @@
 msgid "respect include directives on lookup"
 msgstr "查询时参照 include 指令递归查找"
 
-#: builtin/count-objects.c:82
+#: builtin/config.c:315
+msgid "unable to parse default color value"
+msgstr "不能解析缺省的颜色值"
+
+#: builtin/config.c:455
+#, c-format
+msgid ""
+"# This is Git's per-user configuration file.\n"
+"[core]\n"
+"# Please adapt and uncomment the following lines:\n"
+"#\tuser = %s\n"
+"#\temail = %s\n"
+msgstr ""
+"# This is Git's per-user configuration file.\n"
+"[core]\n"
+"# Please adapt and uncomment the following lines:\n"
+"#\tuser = %s\n"
+"#\temail = %s\n"
+
+#: builtin/config.c:590
+#, c-format
+msgid "cannot create configuration file %s"
+msgstr "不能创建配置文件 %s"
+
+#: builtin/count-objects.c:55
 msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/count-objects.c:97
+#: builtin/count-objects.c:65
 msgid "print sizes in human readable format"
 msgstr "以用户可读的格式显示大小"
 
-#: builtin/describe.c:16
+#: builtin/describe.c:17
 msgid "git describe [options] <commit-ish>*"
 msgstr "git describe [选项] <提交号>*"
 
-#: builtin/describe.c:17
+#: builtin/describe.c:18
 msgid "git describe [options] --dirty"
 msgstr "git describe [选项] --dirty"
 
-#: builtin/describe.c:225
+#: builtin/describe.c:217
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "注释 tag %s 无效"
 
-#: builtin/describe.c:229
+#: builtin/describe.c:221
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr "注释 tag %s 没有嵌入名称"
 
-#: builtin/describe.c:231
+#: builtin/describe.c:223
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "tag '%s' 的确是在 '%s'"
 
-#: builtin/describe.c:258
+#: builtin/describe.c:250 builtin/log.c:452
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "不是一个有效的对象名 %s"
 
-#: builtin/describe.c:261
+#: builtin/describe.c:253
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr "%s 不是一个有效的 '%s' 对象"
 
-#: builtin/describe.c:278
+#: builtin/describe.c:270
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr "没有 tag 准确匹配 '%s'"
 
-#: builtin/describe.c:280
+#: builtin/describe.c:272
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "搜索描述 %s\n"
 
-#: builtin/describe.c:327
+#: builtin/describe.c:319
 #, c-format
 msgid "finished search at %s\n"
 msgstr "完成搜索 %s\n"
 
-#: builtin/describe.c:354
+#: builtin/describe.c:346
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -4757,7 +4933,7 @@
 "没有注释 tag 能描述 '%s'。\n"
 "然而,有非注释 tag:尝试 --tags。"
 
-#: builtin/describe.c:358
+#: builtin/describe.c:350
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -4766,12 +4942,12 @@
 "没有注释 tag 能描述 '%s'。\n"
 "尝试 --always,或者创建一些 tag。"
 
-#: builtin/describe.c:379
+#: builtin/describe.c:371
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "已遍历 %lu 个提交\n"
 
-#: builtin/describe.c:382
+#: builtin/describe.c:374
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
@@ -4780,135 +4956,147 @@
 "发现多于 %i 个 tag,列出最近的 %i 个\n"
 "在 %s 放弃搜索\n"
 
-#: builtin/describe.c:404
+#: builtin/describe.c:396
 msgid "find the tag that comes after the commit"
 msgstr "寻找提交之后的 tag(用于描述提交)"
 
-#: builtin/describe.c:405
+#: builtin/describe.c:397
 msgid "debug search strategy on stderr"
 msgstr "在标准错误上调试搜索策略"
 
-#: builtin/describe.c:406
+#: builtin/describe.c:398
 msgid "use any ref"
 msgstr "使用任意引用"
 
-#: builtin/describe.c:407
+#: builtin/describe.c:399
 msgid "use any tag, even unannotated"
 msgstr "使用任意 tag,即使未带注解"
 
-#: builtin/describe.c:408
+#: builtin/describe.c:400
 msgid "always use long format"
 msgstr "始终使用长提交号格式"
 
-#: builtin/describe.c:409
+#: builtin/describe.c:401
 msgid "only follow first parent"
 msgstr "只跟随第一个父提交"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:404
 msgid "only output exact matches"
 msgstr "只输出精确匹配"
 
-#: builtin/describe.c:414
+#: builtin/describe.c:406
 msgid "consider <n> most recent tags (default: 10)"
 msgstr "考虑最近 <n> 个 tags(默认:10)"
 
-#: builtin/describe.c:416
+#: builtin/describe.c:408
 msgid "only consider tags matching <pattern>"
 msgstr "只考虑匹配 <模式> 的 tags"
 
-#: builtin/describe.c:418 builtin/name-rev.c:321
+#: builtin/describe.c:410 builtin/name-rev.c:318
 msgid "show abbreviated commit object as fallback"
 msgstr "显示简写的提交号作为后备"
 
-#: builtin/describe.c:419
+#: builtin/describe.c:411
 msgid "mark"
 msgstr "标记"
 
-#: builtin/describe.c:420
+#: builtin/describe.c:412
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr "若工作区脏(有变更)在结尾添加 <标记>(默认:\"-dirty\")"
 
-#: builtin/describe.c:438
+#: builtin/describe.c:430
 msgid "--long is incompatible with --abbrev=0"
 msgstr "--long 与 --abbrev=0 不兼容"
 
-#: builtin/describe.c:464
+#: builtin/describe.c:456
 msgid "No names found, cannot describe anything."
 msgstr "没有发现名称,无法描述任何东西。"
 
-#: builtin/describe.c:484
+#: builtin/describe.c:476
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "--dirty 不能与提交同时使用"
 
-#: builtin/diff.c:85
+#: builtin/diff.c:86
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "'%s':不是一个正规文件或符号链接"
 
-#: builtin/diff.c:236
+#: builtin/diff.c:237
 #, c-format
 msgid "invalid option: %s"
 msgstr "无效选项:%s"
 
-#: builtin/diff.c:357
+#: builtin/diff.c:358
 msgid "Not a git repository"
 msgstr "不是一个 git 版本库"
 
-#: builtin/diff.c:400
+#: builtin/diff.c:401
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "提供了无效对象 '%s'。"
 
-#: builtin/diff.c:409
+#: builtin/diff.c:410
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "提供了超过两个数据(blob)对象:'%s'"
 
-#: builtin/diff.c:416
+#: builtin/diff.c:417
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "无法处理的对象 '%s'。"
 
-#: builtin/fast-export.c:22
+#: builtin/fast-export.c:24
 msgid "git fast-export [rev-list-opts]"
 msgstr "git fast-export [rev-list-opts]"
 
-#: builtin/fast-export.c:673
+#: builtin/fast-export.c:979
 msgid "show progress after <n> objects"
 msgstr "在 <n> 个对象之后显示进度"
 
-#: builtin/fast-export.c:675
+#: builtin/fast-export.c:981
 msgid "select handling of signed tags"
 msgstr "选择如何处理签名 tags"
 
-#: builtin/fast-export.c:678
+#: builtin/fast-export.c:984
 msgid "select handling of tags that tag filtered objects"
 msgstr "选择当 tag 指向被过滤时 tags 的处理方式"
 
-#: builtin/fast-export.c:681
+#: builtin/fast-export.c:987
 msgid "Dump marks to this file"
 msgstr "把标记存储到这个文件"
 
-#: builtin/fast-export.c:683
+#: builtin/fast-export.c:989
 msgid "Import marks from this file"
 msgstr "从这个文件导入标记"
 
-#: builtin/fast-export.c:685
+#: builtin/fast-export.c:991
 msgid "Fake a tagger when tags lack one"
 msgstr "当 tags 缺少标记者字段时,假装提供一个"
 
-#: builtin/fast-export.c:687
+#: builtin/fast-export.c:993
 msgid "Output full tree for each commit"
 msgstr "每次提交都输出整个树"
 
-#: builtin/fast-export.c:689
+#: builtin/fast-export.c:995
 msgid "Use the done feature to terminate the stream"
 msgstr "使用 done 功能来终止流"
 
-#: builtin/fast-export.c:690
+#: builtin/fast-export.c:996
 msgid "Skip output of blob data"
 msgstr "跳过数据对象的输出"
 
+#: builtin/fast-export.c:997
+msgid "refspec"
+msgstr "引用表达式"
+
+#: builtin/fast-export.c:998
+msgid "Apply refspec to exported refs"
+msgstr "对导出的引用应用引用表达式"
+
+#: builtin/fast-export.c:999
+msgid "anonymize output"
+msgstr "匿名输出"
+
 #: builtin/fetch.c:20
 msgid "git fetch [<options>] [<repository> [<refspec>...]]"
 msgstr "git fetch [<选项>] [<版本库> [<引用规则>...]]"
@@ -4925,155 +5113,163 @@
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<选项>]"
 
-#: builtin/fetch.c:75
+#: builtin/fetch.c:90
 msgid "fetch from all remotes"
 msgstr "从所有的远程抓取"
 
-#: builtin/fetch.c:77
+#: builtin/fetch.c:92
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "追加到 .git/FETCH_HEAD 而不是覆盖它"
 
-#: builtin/fetch.c:79
+#: builtin/fetch.c:94
 msgid "path to upload pack on remote end"
 msgstr "上传包到远程的路径"
 
-#: builtin/fetch.c:80
+#: builtin/fetch.c:95
 msgid "force overwrite of local branch"
 msgstr "强制覆盖本地分支"
 
-#: builtin/fetch.c:82
+#: builtin/fetch.c:97
 msgid "fetch from multiple remotes"
 msgstr "从多个远程抓取"
 
-#: builtin/fetch.c:84
+#: builtin/fetch.c:99
 msgid "fetch all tags and associated objects"
 msgstr "抓取所有的 tags 和关联对象"
 
-#: builtin/fetch.c:86
+#: builtin/fetch.c:101
 msgid "do not fetch all tags (--no-tags)"
 msgstr "不抓取任何 tags (--no-tags)"
 
-#: builtin/fetch.c:88
+#: builtin/fetch.c:103
 msgid "prune remote-tracking branches no longer on remote"
 msgstr "清除远程已经不存在的分支的跟踪分支"
 
 #  译者:可选值,不能翻译
-#: builtin/fetch.c:89
+#: builtin/fetch.c:104
 msgid "on-demand"
 msgstr "on-demand"
 
-#: builtin/fetch.c:90
+#: builtin/fetch.c:105
 msgid "control recursive fetching of submodules"
 msgstr "控制子模组的递归抓取"
 
-#: builtin/fetch.c:94
+#: builtin/fetch.c:109
 msgid "keep downloaded pack"
 msgstr "保持下载包"
 
-#: builtin/fetch.c:96
+#: builtin/fetch.c:111
 msgid "allow updating of HEAD ref"
 msgstr "允许更新 HEAD 引用"
 
-#: builtin/fetch.c:99
+#: builtin/fetch.c:114
 msgid "deepen history of shallow clone"
 msgstr "深化浅克隆的历史"
 
-#: builtin/fetch.c:101
+#: builtin/fetch.c:116
 msgid "convert to a complete repository"
 msgstr "转换为一个完整的版本库"
 
-#: builtin/fetch.c:103 builtin/log.c:1197
+#: builtin/fetch.c:118 builtin/log.c:1208
 msgid "dir"
 msgstr "目录"
 
-#: builtin/fetch.c:104
+#: builtin/fetch.c:119
 msgid "prepend this to submodule path output"
 msgstr "在子模组路径输出的前面加上此目录"
 
-#: builtin/fetch.c:107
+#: builtin/fetch.c:122
 msgid "default mode for recursion"
 msgstr "递归的默认模式"
 
-#: builtin/fetch.c:109
+#: builtin/fetch.c:124
 msgid "accept refs that update .git/shallow"
 msgstr "接受更新 .git/shallow 的引用"
 
-#: builtin/fetch.c:347
+#: builtin/fetch.c:125
+msgid "refmap"
+msgstr "引用映射"
+
+#: builtin/fetch.c:126
+msgid "specify fetch refmap"
+msgstr "指定获取操作的引用映射"
+
+#: builtin/fetch.c:376
 msgid "Couldn't find remote ref HEAD"
 msgstr "无法发现远程 HEAD 引用"
 
-#: builtin/fetch.c:411
+#: builtin/fetch.c:454
 #, c-format
 msgid "object %s not found"
 msgstr "对象 %s 未发现"
 
-#: builtin/fetch.c:416
+#: builtin/fetch.c:459
 msgid "[up to date]"
 msgstr "[最新]"
 
-#: builtin/fetch.c:430
+#: builtin/fetch.c:473
 #, c-format
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr "! %-*s %-*s -> %s  (在当前分支下不能获取)"
 
-#: builtin/fetch.c:431 builtin/fetch.c:517
+#: builtin/fetch.c:474 builtin/fetch.c:560
 msgid "[rejected]"
 msgstr "[已拒绝]"
 
-#: builtin/fetch.c:442
+#: builtin/fetch.c:485
 msgid "[tag update]"
 msgstr "[tag更新]"
 
 #  译者:注意保持前导空格
-#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497
+#: builtin/fetch.c:487 builtin/fetch.c:522 builtin/fetch.c:540
 msgid "  (unable to update local ref)"
 msgstr "  (不能更新本地引用)"
 
-#: builtin/fetch.c:462
+#: builtin/fetch.c:505
 msgid "[new tag]"
 msgstr "[新tag]"
 
-#: builtin/fetch.c:465
+#: builtin/fetch.c:508
 msgid "[new branch]"
 msgstr "[新分支]"
 
-#: builtin/fetch.c:468
+#: builtin/fetch.c:511
 msgid "[new ref]"
 msgstr "[新引用]"
 
-#: builtin/fetch.c:513
+#: builtin/fetch.c:556
 msgid "unable to update local ref"
 msgstr "不能更新本地引用"
 
-#: builtin/fetch.c:513
+#: builtin/fetch.c:556
 msgid "forced update"
 msgstr "强制更新"
 
-#: builtin/fetch.c:519
+#: builtin/fetch.c:562
 msgid "(non-fast-forward)"
 msgstr "(非快进式)"
 
-#: builtin/fetch.c:552 builtin/fetch.c:785
+#: builtin/fetch.c:595 builtin/fetch.c:828
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "无法打开 %s:%s\n"
 
-#: builtin/fetch.c:561
+#: builtin/fetch.c:604
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s 未发送所有必须的对象\n"
 
-#: builtin/fetch.c:579
+#: builtin/fetch.c:622
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr "拒绝 %s 因为浅克隆不允许被更新"
 
-#: builtin/fetch.c:667 builtin/fetch.c:750
+#: builtin/fetch.c:710 builtin/fetch.c:793
 #, c-format
 msgid "From %.*s\n"
 msgstr "来自 %.*s\n"
 
-#: builtin/fetch.c:678
+#: builtin/fetch.c:721
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -5083,87 +5279,87 @@
 " 'git remote prune %s' 来删除旧的、有冲突的分支"
 
 #  译者:注意保持前导空格
-#: builtin/fetch.c:730
+#: builtin/fetch.c:773
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s 将成为摇摆状态)"
 
 #  译者:注意保持前导空格
-#: builtin/fetch.c:731
+#: builtin/fetch.c:774
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s 已成为摇摆状态)"
 
-#: builtin/fetch.c:755
+#: builtin/fetch.c:798
 msgid "[deleted]"
 msgstr "[已删除]"
 
-#: builtin/fetch.c:756 builtin/remote.c:1050
+#: builtin/fetch.c:799 builtin/remote.c:1063
 msgid "(none)"
 msgstr "(无)"
 
-#: builtin/fetch.c:775
+#: builtin/fetch.c:818
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
-msgstr "拒绝获取到非裸版本库的当前分支 %s"
+msgstr "拒绝获取到非纯版本库的当前分支 %s"
 
-#: builtin/fetch.c:794
+#: builtin/fetch.c:837
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "选项 \"%s\" 的值 \"%s\" 对于 %s 是无效的"
 
-#: builtin/fetch.c:797
+#: builtin/fetch.c:840
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "选项 \"%s\" 为 %s 所忽略\n"
 
-#: builtin/fetch.c:853
+#: builtin/fetch.c:896
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "不知道如何从 %s 获取"
 
-#: builtin/fetch.c:1015
+#: builtin/fetch.c:1058
 #, c-format
 msgid "Fetching %s\n"
 msgstr "正在获取 %s\n"
 
-#: builtin/fetch.c:1017 builtin/remote.c:90
+#: builtin/fetch.c:1060 builtin/remote.c:90
 #, c-format
 msgid "Could not fetch %s"
 msgstr "不能获取 %s"
 
-#: builtin/fetch.c:1035
+#: builtin/fetch.c:1078
 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:1059
+#: builtin/fetch.c:1101
 msgid "You need to specify a tag name."
 msgstr "您需要指定一个 tag 名称。"
 
-#: builtin/fetch.c:1107
+#: builtin/fetch.c:1143
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth 和 --unshallow 不能同时使用"
 
-#: builtin/fetch.c:1109
+#: builtin/fetch.c:1145
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "对于一个完整的版本库,参数 --unshallow 没有意义"
 
-#: builtin/fetch.c:1132
+#: builtin/fetch.c:1168
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all 不能带一个版本库参数"
 
-#: builtin/fetch.c:1134
+#: builtin/fetch.c:1170
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all 带引用规则没有任何意义"
 
-#: builtin/fetch.c:1145
+#: builtin/fetch.c:1181
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "没有这样的远程或远程组:%s"
 
-#: builtin/fetch.c:1153
+#: builtin/fetch.c:1189
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "获取组并指定引用规则没有意义"
 
@@ -5172,9 +5368,9 @@
 msgstr ""
 "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
 
-#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700
-#: builtin/merge.c:196 builtin/repack.c:175 builtin/repack.c:179
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:501
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:698
+#: builtin/merge.c:197 builtin/repack.c:179 builtin/repack.c:183
+#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:590
 #: parse-options.h:132 parse-options.h:239
 msgid "n"
 msgstr "n"
@@ -5199,99 +5395,103 @@
 msgid "file to read from"
 msgstr "从文件中读取"
 
-#: builtin/for-each-ref.c:1063
+#: builtin/for-each-ref.c:676
+msgid "unable to parse format"
+msgstr "不能解析格式"
+
+#: builtin/for-each-ref.c:1057
 msgid "git for-each-ref [options] [<pattern>]"
 msgstr "git for-each-ref [选项] [<模式>]"
 
-#: builtin/for-each-ref.c:1078
+#: builtin/for-each-ref.c:1072
 msgid "quote placeholders suitably for shells"
 msgstr "引用占位符适用于 shells"
 
-#: builtin/for-each-ref.c:1080
+#: builtin/for-each-ref.c:1074
 msgid "quote placeholders suitably for perl"
 msgstr "引用占位符适用于 perl"
 
-#: builtin/for-each-ref.c:1082
+#: builtin/for-each-ref.c:1076
 msgid "quote placeholders suitably for python"
 msgstr "引用占位符适用于 python"
 
-#: builtin/for-each-ref.c:1084
+#: builtin/for-each-ref.c:1078
 msgid "quote placeholders suitably for tcl"
 msgstr "引用占位符适用于 tcl"
 
-#: builtin/for-each-ref.c:1087
+#: builtin/for-each-ref.c:1081
 msgid "show only <n> matched refs"
 msgstr "只显示 <n> 个匹配的引用"
 
-#: builtin/for-each-ref.c:1088 builtin/replace.c:177
+#: builtin/for-each-ref.c:1082 builtin/replace.c:438
 msgid "format"
 msgstr "格式"
 
-#: builtin/for-each-ref.c:1088
+#: builtin/for-each-ref.c:1082
 msgid "format to use for the output"
 msgstr "输出格式"
 
-#: builtin/for-each-ref.c:1089
+#: builtin/for-each-ref.c:1083
 msgid "key"
 msgstr "key"
 
-#: builtin/for-each-ref.c:1090
+#: builtin/for-each-ref.c:1084
 msgid "field name to sort on"
 msgstr "排序的字段名"
 
-#: builtin/fsck.c:147 builtin/prune.c:172
+#: builtin/fsck.c:147 builtin/prune.c:136
 msgid "Checking connectivity"
 msgstr "检查连接中"
 
-#: builtin/fsck.c:544
+#: builtin/fsck.c:540
 msgid "Checking object directories"
 msgstr "检查对象目录中"
 
-#: builtin/fsck.c:607
+#: builtin/fsck.c:603
 msgid "git fsck [options] [<object>...]"
 msgstr "git fsck [选项] [<对象>...]"
 
-#: builtin/fsck.c:613
+#: builtin/fsck.c:609
 msgid "show unreachable objects"
 msgstr "显示不可达的对象"
 
-#: builtin/fsck.c:614
+#: builtin/fsck.c:610
 msgid "show dangling objects"
 msgstr "显示摇摆的对象"
 
-#: builtin/fsck.c:615
+#: builtin/fsck.c:611
 msgid "report tags"
 msgstr "报告 tags"
 
-#: builtin/fsck.c:616
+#: builtin/fsck.c:612
 msgid "report root nodes"
 msgstr "报告根节点"
 
-#: builtin/fsck.c:617
+#: builtin/fsck.c:613
 msgid "make index objects head nodes"
 msgstr "将索引亦作为检查的头节点"
 
-#: builtin/fsck.c:618
+#: builtin/fsck.c:614
 msgid "make reflogs head nodes (default)"
 msgstr "将引用日志作为检查的头节点(默认)"
 
-#: builtin/fsck.c:619
+#: builtin/fsck.c:615
 msgid "also consider packs and alternate objects"
 msgstr "也考虑包和备用对象"
 
-#: builtin/fsck.c:620
+#: builtin/fsck.c:616
 msgid "enable more strict checking"
 msgstr "启用更严格的检查"
 
-#: builtin/fsck.c:622
+#: builtin/fsck.c:618
 msgid "write dangling objects in .git/lost-found"
 msgstr "将摇摆对象写入 .git/lost-found 中"
 
-#: builtin/fsck.c:623 builtin/prune.c:144
+#: builtin/fsck.c:619 builtin/prune.c:108
 msgid "show progress"
 msgstr "显示进度"
 
-#: builtin/fsck.c:673
+#: builtin/fsck.c:669
 msgid "Checking objects"
 msgstr "检查对象中"
 
@@ -5299,55 +5499,55 @@
 msgid "git gc [options]"
 msgstr "git gc [选项]"
 
-#: builtin/gc.c:90
+#: builtin/gc.c:79
 #, c-format
-msgid "Invalid %s: '%s'"
-msgstr "无效的 %s:'%s'"
+msgid "Invalid gc.pruneexpire: '%s'"
+msgstr "无效的 gc.pruneexpire:'%s'"
 
-#: builtin/gc.c:117
+#: builtin/gc.c:107
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "不正常的长对象目录 %.*s"
 
-#: builtin/gc.c:273
+#: builtin/gc.c:276
 msgid "prune unreferenced objects"
 msgstr "清除未引用的对象"
 
-#: builtin/gc.c:275
+#: builtin/gc.c:278
 msgid "be more thorough (increased runtime)"
 msgstr "更彻底(增加运行时间)"
 
-#: builtin/gc.c:276
+#: builtin/gc.c:279
 msgid "enable auto-gc mode"
 msgstr "启用自动垃圾回收模式"
 
-#: builtin/gc.c:277
+#: builtin/gc.c:280
 msgid "force running gc even if there may be another gc running"
 msgstr "强制执行 gc 即使另外一个 gc 正在执行"
 
-#: builtin/gc.c:318
+#: builtin/gc.c:321
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr "自动在后台执行版本库打包以求最佳性能。\n"
 
-#: builtin/gc.c:320
+#: builtin/gc.c:323
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
 msgstr "自动打包版本库以求最佳性能。\n"
 
-#: builtin/gc.c:321
+#: builtin/gc.c:324
 #, c-format
 msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr "手工维护参见 \"git help gc\"。\n"
 
-#: builtin/gc.c:336
+#: builtin/gc.c:342
 #, 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:361
+#: builtin/gc.c:364
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr "有太多不可达的松散对象,运行 'git prune' 删除它们。"
@@ -5361,229 +5561,224 @@
 msgid "grep: failed to create thread: %s"
 msgstr "grep:无法创建线程:%s"
 
-#: builtin/grep.c:365
-#, c-format
-msgid "Failed to chdir: %s"
-msgstr "无法切换目录:%s"
-
-#: builtin/grep.c:443 builtin/grep.c:478
+#: builtin/grep.c:441 builtin/grep.c:476
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "无法读取树(%s)"
 
-#: builtin/grep.c:493
+#: builtin/grep.c:491
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "无法抓取来自于 %s 类型的对象"
 
-#: builtin/grep.c:549
+#: builtin/grep.c:547
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "开关 `%c' 期望一个数字值"
 
-#: builtin/grep.c:566
+#: builtin/grep.c:564
 #, c-format
 msgid "cannot open '%s'"
 msgstr "不能打开 '%s'"
 
-#: builtin/grep.c:640
+#: builtin/grep.c:638
 msgid "search in index instead of in the work tree"
 msgstr "在索引区搜索而不是在工作区"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:640
 msgid "find in contents not managed by git"
 msgstr "在未被 git 管理的内容中查找"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/grep.c:644
+#: builtin/grep.c:642
 msgid "search in both tracked and untracked files"
 msgstr "在跟踪和未跟踪的文件中搜索"
 
-#: builtin/grep.c:646
+#: builtin/grep.c:644
 msgid "search also in ignored files"
 msgstr "也在忽略的文件中搜索"
 
-#: builtin/grep.c:649
+#: builtin/grep.c:647
 msgid "show non-matching lines"
 msgstr "显示未匹配的行"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:649
 msgid "case insensitive matching"
 msgstr "不区分大小写匹配"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:651
 msgid "match patterns only at word boundaries"
 msgstr "只在单词边界匹配模式"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:653
 msgid "process binary files as text"
 msgstr "把二进制文件当做文本处理"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:655
 msgid "don't match patterns in binary files"
 msgstr "不在二进制文件中匹配模式"
 
-#: builtin/grep.c:660
+#: builtin/grep.c:658
 msgid "process binary files with textconv filters"
 msgstr "用 textconv 过滤器处理二进制文件"
 
-#: builtin/grep.c:662
+#: builtin/grep.c:660
 msgid "descend at most <depth> levels"
 msgstr "最多以指定的深度向下寻找"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:664
 msgid "use extended POSIX regular expressions"
 msgstr "使用扩展的 POSIX 正则表达式"
 
-#: builtin/grep.c:669
+#: builtin/grep.c:667
 msgid "use basic POSIX regular expressions (default)"
 msgstr "使用基本的 POSIX 正则表达式(默认)"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:670
 msgid "interpret patterns as fixed strings"
 msgstr "把模式解析为固定的字符串"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:673
 msgid "use Perl-compatible regular expressions"
 msgstr "使用 Perl 兼容的正则表达式"
 
-#: builtin/grep.c:678
+#: builtin/grep.c:676
 msgid "show line numbers"
 msgstr "显示行号"
 
-#: builtin/grep.c:679
+#: builtin/grep.c:677
 msgid "don't show filenames"
 msgstr "不显示文件名"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:678
 msgid "show filenames"
 msgstr "显示文件名"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:680
 msgid "show filenames relative to top directory"
 msgstr "显示相对于顶级目录的文件名"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:682
 msgid "show only filenames instead of matching lines"
 msgstr "只显示文件名而不显示匹配的行"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:684
 msgid "synonym for --files-with-matches"
 msgstr "和 --files-with-matches 同义"
 
-#: builtin/grep.c:689
+#: builtin/grep.c:687
 msgid "show only the names of files without match"
 msgstr "只显示未匹配的文件名"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:689
 msgid "print NUL after filenames"
 msgstr "在文件名后输出 NUL 字符"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:691
 msgid "show the number of matches instead of matching lines"
 msgstr "显示总匹配行数,而不显示匹配的行"
 
-#: builtin/grep.c:694
+#: builtin/grep.c:692
 msgid "highlight matches"
 msgstr "高亮显示匹配项"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:694
 msgid "print empty line between matches from different files"
 msgstr "在不同文件的匹配项之间打印空行"
 
-#: builtin/grep.c:698
+#: builtin/grep.c:696
 msgid "show filename only once above matches from same file"
 msgstr "只在同一文件的匹配项的上面显示一次文件名"
 
-#: builtin/grep.c:701
+#: builtin/grep.c:699
 msgid "show <n> context lines before and after matches"
 msgstr "显示匹配项前后的 <n> 行上下文"
 
-#: builtin/grep.c:704
+#: builtin/grep.c:702
 msgid "show <n> context lines before matches"
 msgstr "显示匹配项前 <n> 行上下文"
 
-#: builtin/grep.c:706
+#: builtin/grep.c:704
 msgid "show <n> context lines after matches"
 msgstr "显示匹配项后 <n> 行上下文"
 
-#: builtin/grep.c:707
+#: builtin/grep.c:705
 msgid "shortcut for -C NUM"
 msgstr "快捷键 -C 数字"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:708
 msgid "show a line with the function name before matches"
 msgstr "在匹配的前面显示一行函数名"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:710
 msgid "show the surrounding function"
 msgstr "显示所在函数的前后内容"
 
-#: builtin/grep.c:715
+#: builtin/grep.c:713
 msgid "read patterns from file"
 msgstr "从文件读取模式"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:715
 msgid "match <pattern>"
 msgstr "匹配 <模式>"
 
-#: builtin/grep.c:719
+#: builtin/grep.c:717
 msgid "combine patterns specified with -e"
 msgstr "组合用 -e 参数设定的模式"
 
-#: builtin/grep.c:731
+#: builtin/grep.c:729
 msgid "indicate hit with exit status without output"
 msgstr "不输出,而用退出码标识命中状态"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:731
 msgid "show only matches from files that match all patterns"
 msgstr "只显示匹配所有模式的文件中的匹配"
 
-#: builtin/grep.c:735
+#: builtin/grep.c:733
 msgid "show parse tree for grep expression"
 msgstr "显示 grep 表达式的解析树"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:737
 msgid "pager"
 msgstr "分页"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:737
 msgid "show matching files in the pager"
 msgstr "分页显示匹配的文件"
 
-#: builtin/grep.c:742
+#: builtin/grep.c:740
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "允许调用 grep(1)(本次构建忽略)"
 
-#: builtin/grep.c:743 builtin/show-ref.c:187
+#: builtin/grep.c:741 builtin/show-ref.c:187
 msgid "show usage"
 msgstr "显示用法"
 
-#: builtin/grep.c:810
+#: builtin/grep.c:808
 msgid "no pattern given."
 msgstr "未提供模式匹配。"
 
-#: builtin/grep.c:868
+#: builtin/grep.c:866
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager 仅用于工作区"
 
-#: builtin/grep.c:891
+#: builtin/grep.c:892
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached 或 --untracked 不能与 --no-index 同时使用。"
 
-#: builtin/grep.c:896
+#: builtin/grep.c:897
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index 或 --untracked 不能和版本同时使用。"
 
-#: builtin/grep.c:899
+#: builtin/grep.c:900
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard 不能用于已跟踪内容。"
 
-#: builtin/grep.c:907
+#: builtin/grep.c:908
 msgid "both --cached and trees are given."
 msgstr "同时给出了 --cached 和树对象。"
 
-#: builtin/hash-object.c:60
+#: builtin/hash-object.c:82
 msgid ""
 "git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] "
 "<file>..."
@@ -5591,31 +5786,36 @@
 "git hash-object [-t <类型>] [-w] [--path=<文件>|--no-filters] [--stdin] [--] "
 "<文件>..."
 
-#: builtin/hash-object.c:61
+#: builtin/hash-object.c:83
 msgid "git hash-object  --stdin-paths < <list-of-paths>"
 msgstr "git hash-object  --stdin-paths < <路径列表>"
 
-#: builtin/hash-object.c:72 builtin/tag.c:521
+#: builtin/hash-object.c:94 builtin/tag.c:610
 msgid "type"
 msgstr "类型"
 
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:94
 msgid "object type"
 msgstr "对象类型"
 
-#: builtin/hash-object.c:73
+#: builtin/hash-object.c:95
 msgid "write the object into the object database"
 msgstr "将对象写入对象数据库"
 
-#: builtin/hash-object.c:74
+#: builtin/hash-object.c:97
 msgid "read the object from stdin"
 msgstr "从标准输入读取对象"
 
-#: builtin/hash-object.c:76
+#: builtin/hash-object.c:99
 msgid "store file as is without filters"
 msgstr "原样存储文件不使用过滤器"
 
-#: builtin/hash-object.c:77
+#: builtin/hash-object.c:100
+msgid ""
+"just hash any random garbage to create corrupt objects for debugging Git"
+msgstr "允许对任意随机垃圾数据做散列来创建损坏的对象以便调试 Git"
+
+#: builtin/hash-object.c:101
 msgid "process file as it were from this path"
 msgstr "处理文件并假设其来自于此路径"
 
@@ -5648,25 +5848,25 @@
 msgid "unrecognized help format '%s'"
 msgstr "未能识别的帮助格式 '%s'"
 
-#: builtin/help.c:92
+#: builtin/help.c:91
 msgid "Failed to start emacsclient."
 msgstr "无法启动 emacsclient。"
 
-#: builtin/help.c:105
+#: builtin/help.c:104
 msgid "Failed to parse emacsclient version."
 msgstr "无法解析 emacsclient 版本。"
 
-#: builtin/help.c:113
+#: builtin/help.c:112
 #, c-format
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "emacsclient 版本 '%d' 太老(< 22)。"
 
-#: builtin/help.c:131 builtin/help.c:159 builtin/help.c:168 builtin/help.c:176
+#: builtin/help.c:130 builtin/help.c:158 builtin/help.c:167 builtin/help.c:175
 #, c-format
 msgid "failed to exec '%s': %s"
 msgstr "无法执行 '%s':%s"
 
-#: builtin/help.c:216
+#: builtin/help.c:215
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -5675,7 +5875,7 @@
 "'%s':不支持的 man 手册查看器的路径。\n"
 "请使用 'man.<tool>.cmd'。"
 
-#: builtin/help.c:228
+#: builtin/help.c:227
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -5684,23 +5884,27 @@
 "'%s': 支持的 man 手册查看器命令。\n"
 "请使用 'man.<tool>.path'。"
 
-#: builtin/help.c:353
+#: builtin/help.c:352
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "'%s':未知的 man 查看器。"
 
-#: builtin/help.c:370
+#: builtin/help.c:369
 msgid "no man viewer handled the request"
 msgstr "没有 man 查看器处理此请求"
 
-#: builtin/help.c:378
+#: builtin/help.c:377
 msgid "no info viewer handled the request"
 msgstr "没有 info 查看器处理此请求"
 
-#: builtin/help.c:424
+#: builtin/help.c:423
 msgid "Defining attributes per path"
 msgstr "定义路径的属性"
 
+#: builtin/help.c:424
+msgid "Everyday Git With 20 Commands Or So"
+msgstr "每一天 Git 常用的约 20 条命令"
+
 #: builtin/help.c:425
 msgid "A Git glossary"
 msgstr "Git 词汇表"
@@ -5739,280 +5943,291 @@
 msgid "`git %s' is aliased to `%s'"
 msgstr "`git %s' 是 `%s' 的别名"
 
-#: builtin/index-pack.c:184
+#: builtin/index-pack.c:150
+#, c-format
+msgid "unable to open %s"
+msgstr "不能打开 %s"
+
+#: builtin/index-pack.c:200
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "%s 的对象类型不匹配"
 
-#: builtin/index-pack.c:204
-msgid "object of unexpected type"
-msgstr "意外的类型的对象"
+#: builtin/index-pack.c:220
+#, c-format
+msgid "did not receive expected object %s"
+msgstr "未能获取期望的对象 %s"
 
-#: builtin/index-pack.c:244
+#: builtin/index-pack.c:223
+#, c-format
+msgid "object %s: expected type %s, found %s"
+msgstr "对象 %s:期待类型 %s,却是 %s"
+
+#: builtin/index-pack.c:265
 #, c-format
 msgid "cannot fill %d byte"
 msgid_plural "cannot fill %d bytes"
 msgstr[0] "无法填充 %d 字节"
 msgstr[1] "无法填充 %d 字节"
 
-#: builtin/index-pack.c:254
+#: builtin/index-pack.c:275
 msgid "early EOF"
 msgstr "过早的文件结束符(EOF)"
 
-#: builtin/index-pack.c:255
+#: builtin/index-pack.c:276
 msgid "read error on input"
 msgstr "输入上的读错误"
 
-#: builtin/index-pack.c:267
+#: builtin/index-pack.c:288
 msgid "used more bytes than were available"
 msgstr "用掉了超过可用的字节"
 
-#: builtin/index-pack.c:274
+#: builtin/index-pack.c:295
 msgid "pack too large for current definition of off_t"
 msgstr "包太大超过了当前 off_t 的定义"
 
-#: builtin/index-pack.c:290
+#: builtin/index-pack.c:311
 #, c-format
 msgid "unable to create '%s'"
 msgstr "不能创建 '%s'"
 
-#: builtin/index-pack.c:295
+#: builtin/index-pack.c:316
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "无法打开包文件 '%s'"
 
-#: builtin/index-pack.c:309
+#: builtin/index-pack.c:330
 msgid "pack signature mismatch"
 msgstr "包签名不匹配"
 
-#: builtin/index-pack.c:311
+#: builtin/index-pack.c:332
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "不支持包版本 %<PRIu32>"
 
-#: builtin/index-pack.c:329
+#: builtin/index-pack.c:350
 #, c-format
 msgid "pack has bad object at offset %lu: %s"
 msgstr "包中有错误的对象位于 %lu:%s"
 
-#: builtin/index-pack.c:451
+#: builtin/index-pack.c:471
 #, c-format
 msgid "inflate returned %d"
 msgstr "解压缩返回 %d"
 
-#: builtin/index-pack.c:500
+#: builtin/index-pack.c:520
 msgid "offset value overflow for delta base object"
 msgstr "偏移值覆盖了 delta 基准对象"
 
-#: builtin/index-pack.c:508
+#: builtin/index-pack.c:528
 msgid "delta base offset is out of bound"
 msgstr "delta 基准偏移越界"
 
-#: builtin/index-pack.c:516
+#: builtin/index-pack.c:536
 #, c-format
 msgid "unknown object type %d"
 msgstr "未知对象类型 %d"
 
-#: builtin/index-pack.c:547
+#: builtin/index-pack.c:567
 msgid "cannot pread pack file"
 msgstr "无法读取包文件"
 
-#: builtin/index-pack.c:549
+#: builtin/index-pack.c:569
 #, 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:575
+#: builtin/index-pack.c:595
 msgid "serious inflate inconsistency"
 msgstr "解压缩严重的不一致"
 
-#: builtin/index-pack.c:666 builtin/index-pack.c:672 builtin/index-pack.c:695
-#: builtin/index-pack.c:729 builtin/index-pack.c:738
+#: builtin/index-pack.c:686 builtin/index-pack.c:692 builtin/index-pack.c:715
+#: builtin/index-pack.c:749 builtin/index-pack.c:758
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "发现 %s 出现 SHA1 冲突!"
 
-#: builtin/index-pack.c:669 builtin/pack-objects.c:162
-#: builtin/pack-objects.c:254
+#: builtin/index-pack.c:689 builtin/pack-objects.c:164
+#: builtin/pack-objects.c:256
 #, c-format
 msgid "unable to read %s"
 msgstr "不能读 %s"
 
-#: builtin/index-pack.c:735
+#: builtin/index-pack.c:755
 #, c-format
 msgid "cannot read existing object %s"
 msgstr "不能读取现存对象 %s"
 
-#: builtin/index-pack.c:749
+#: builtin/index-pack.c:769
 #, c-format
 msgid "invalid blob object %s"
 msgstr "无效的数据(blob)对象 %s"
 
-#: builtin/index-pack.c:763
+#: builtin/index-pack.c:783
 #, c-format
 msgid "invalid %s"
 msgstr "无效的 %s"
 
-#: builtin/index-pack.c:766
+#: builtin/index-pack.c:787
 msgid "Error in object"
 msgstr "对象中出错"
 
-#: builtin/index-pack.c:768
+#: builtin/index-pack.c:789
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "%s 的所有子对象并非都可达"
 
-#: builtin/index-pack.c:839 builtin/index-pack.c:869
+#: builtin/index-pack.c:861 builtin/index-pack.c:890
 msgid "failed to apply delta"
 msgstr "无法应用 delta"
 
-#: builtin/index-pack.c:1010
+#: builtin/index-pack.c:1055
 msgid "Receiving objects"
 msgstr "接收对象中"
 
-#: builtin/index-pack.c:1010
+#: builtin/index-pack.c:1055
 msgid "Indexing objects"
 msgstr "索引对象中"
 
-#: builtin/index-pack.c:1036
+#: builtin/index-pack.c:1081
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "包冲突(SHA1 不匹配)"
 
-#: builtin/index-pack.c:1041
+#: builtin/index-pack.c:1086
 msgid "cannot fstat packfile"
 msgstr "不能枚举包文件状态"
 
-#: builtin/index-pack.c:1044
+#: builtin/index-pack.c:1089
 msgid "pack has junk at the end"
 msgstr "包的结尾有垃圾数据"
 
-#: builtin/index-pack.c:1055
+#: builtin/index-pack.c:1100
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "parse_pack_objects() 中遇到不可理喻的问题"
 
-#: builtin/index-pack.c:1078
+#: builtin/index-pack.c:1123
 msgid "Resolving deltas"
 msgstr "处理 delta 中"
 
-#: builtin/index-pack.c:1088
+#: builtin/index-pack.c:1133
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "不能创建线程:%s"
 
-#: builtin/index-pack.c:1130
+#: builtin/index-pack.c:1175
 msgid "confusion beyond insanity"
 msgstr "不可理喻"
 
-#: builtin/index-pack.c:1138
+#: builtin/index-pack.c:1181
 #, c-format
 msgid "completed with %d local objects"
 msgstr "完成 %d 个本地对象"
 
-#: builtin/index-pack.c:1148
+#: builtin/index-pack.c:1191
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "对 %s 的尾部校验出现意外(磁盘损坏?)"
 
-#: builtin/index-pack.c:1152
+#: builtin/index-pack.c:1195
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "包有 %d 个未解决的 delta"
 msgstr[1] "包有 %d 个未解决的 delta"
 
-#: builtin/index-pack.c:1177
+#: builtin/index-pack.c:1220
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "不能压缩附加对象(%d)"
 
-#: builtin/index-pack.c:1256
+#: builtin/index-pack.c:1299
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "本地对象 %s 已损坏"
 
-#: builtin/index-pack.c:1280
+#: builtin/index-pack.c:1323
 msgid "error while closing pack file"
 msgstr "关闭包文件时出错"
 
-#: builtin/index-pack.c:1293
+#: builtin/index-pack.c:1336
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "无法写保留文件 '%s'"
 
-#: builtin/index-pack.c:1301
+#: builtin/index-pack.c:1344
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "无法关闭保留文件 '%s'"
 
-#: builtin/index-pack.c:1314
+#: builtin/index-pack.c:1357
 msgid "cannot store pack file"
 msgstr "无法存储包文件"
 
-#: builtin/index-pack.c:1325
+#: builtin/index-pack.c:1368
 msgid "cannot store index file"
 msgstr "无法存储索引文件"
 
-#: builtin/index-pack.c:1358
+#: builtin/index-pack.c:1401
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "坏的 pack.indexversion=%<PRIu32>"
 
-#: builtin/index-pack.c:1364
+#: builtin/index-pack.c:1407
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "指定的线程数无效(%d)"
 
-#: builtin/index-pack.c:1368 builtin/index-pack.c:1546
+#: builtin/index-pack.c:1411 builtin/index-pack.c:1590
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "没有线程支持,忽略 %s"
 
-#: builtin/index-pack.c:1426
+#: builtin/index-pack.c:1469
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "无法打开现存包文件 '%s'"
 
-#: builtin/index-pack.c:1428
+#: builtin/index-pack.c:1471
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "无法为 %s 打开包索引文件"
 
-#: builtin/index-pack.c:1475
+#: builtin/index-pack.c:1518
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "非 delta:%d 个对象"
 msgstr[1] "非 delta:%d 个对象"
 
-#: builtin/index-pack.c:1482
+#: builtin/index-pack.c:1525
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "链长 = %d: %lu 对象"
 msgstr[1] "链长 = %d: %lu 对象"
 
-#: builtin/index-pack.c:1510
+#: builtin/index-pack.c:1554
 msgid "Cannot come back to cwd"
 msgstr "无法返回当前工作目录"
 
-#: builtin/index-pack.c:1558 builtin/index-pack.c:1561
-#: builtin/index-pack.c:1573 builtin/index-pack.c:1577
+#: builtin/index-pack.c:1602 builtin/index-pack.c:1605
+#: builtin/index-pack.c:1617 builtin/index-pack.c:1621
 #, c-format
 msgid "bad %s"
 msgstr "错误选项 %s"
 
-#: builtin/index-pack.c:1591
+#: builtin/index-pack.c:1635
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin 不能和 --stdin 同时使用"
 
-#: builtin/index-pack.c:1595 builtin/index-pack.c:1605
+#: builtin/index-pack.c:1639 builtin/index-pack.c:1648
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "包名 '%s' 没有以 '.pack' 结尾"
 
-#: builtin/index-pack.c:1614
+#: builtin/index-pack.c:1656
 msgid "--verify with no packfile name given"
 msgstr "--verify 没有提供包名参数"
 
@@ -6122,11 +6337,7 @@
 msgid " shared"
 msgstr "共享"
 
-#: builtin/init-db.c:439
-msgid "cannot tell cwd"
-msgstr "无法获知当前路径"
-
-#: builtin/init-db.c:465
+#: builtin/init-db.c:467
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [directory]"
@@ -6134,29 +6345,29 @@
 "git init [-q | --quiet] [--bare] [--template=<模板目录>] [--shared[=<权限>]] "
 "[目录]"
 
-#: builtin/init-db.c:488
+#: builtin/init-db.c:490
 msgid "permissions"
 msgstr "权限"
 
-#: builtin/init-db.c:489
+#: builtin/init-db.c:491
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "指定 git 版本库是多个用户之间共享的"
 
-#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
+#: builtin/init-db.c:493 builtin/prune-packed.c:57 builtin/repack.c:172
 msgid "be quiet"
 msgstr "保持安静"
 
-#: builtin/init-db.c:523 builtin/init-db.c:528
+#: builtin/init-db.c:525 builtin/init-db.c:530
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "不能创建目录 %s"
 
-#: builtin/init-db.c:532
+#: builtin/init-db.c:534
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "不能切换目录到 %s"
 
-#: builtin/init-db.c:554
+#: builtin/init-db.c:555
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -6165,15 +6376,31 @@
 "不允许 %s(或 --work-tree=<directory>)而没有指定 %s(或 --git-"
 "dir=<directory>)"
 
-#: builtin/init-db.c:578
-msgid "Cannot access current working directory"
-msgstr "不能访问当前工作目录"
-
-#: builtin/init-db.c:585
+#: builtin/init-db.c:583
 #, 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:41
 msgid "git log [<options>] [<revision range>] [[--] <path>...]\n"
 msgstr "git log [<选项>] [<版本范围>] [[--] <路径>...]\n"
@@ -6182,33 +6409,47 @@
 msgid "   or: git show [options] <object>..."
 msgstr "   或者:git show [选项] <对象>..."
 
-#: builtin/log.c:125
+#: builtin/log.c:81
+#, c-format
+msgid "invalid --decorate option: %s"
+msgstr "无效的 --decorate 选项:%s"
+
+#: builtin/log.c:127
 msgid "suppress diff output"
 msgstr "不显示差异输出"
 
-#: builtin/log.c:126
+#: builtin/log.c:128
 msgid "show source"
 msgstr "显示源"
 
-#: builtin/log.c:127
+#: builtin/log.c:129
 msgid "Use mail map file"
 msgstr "使用邮件映射文件"
 
-#: builtin/log.c:128
+#: builtin/log.c:130
 msgid "decorate options"
 msgstr "修饰选项"
 
-#: builtin/log.c:231
+#: builtin/log.c:133
+msgid "Process line range n,m in file, counting from 1"
+msgstr "处理文件中第 n 到 m 之间的行,从 1 开始"
+
+#: builtin/log.c:229
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "最终输出:%d %s\n"
 
-#: builtin/log.c:473 builtin/log.c:565
+#: builtin/log.c:458
+#, c-format
+msgid "git show %s: bad file"
+msgstr "git show %s: 损坏的文件"
+
+#: builtin/log.c:472 builtin/log.c:564
 #, c-format
 msgid "Could not read object %s"
 msgstr "不能读取对象 %s"
 
-#: builtin/log.c:589
+#: builtin/log.c:588
 #, c-format
 msgid "Unknown type: %d"
 msgstr "未知类型:%d"
@@ -6217,217 +6458,226 @@
 msgid "format.headers without value"
 msgstr "format.headers 没有值"
 
-#: builtin/log.c:771
+#: builtin/log.c:773
 msgid "name of output directory is too long"
 msgstr "输出目录名太长"
 
-#: builtin/log.c:787
+#: builtin/log.c:789
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "无法打开补丁文件 %s"
 
-#: builtin/log.c:801
+#: builtin/log.c:803
 msgid "Need exactly one range."
 msgstr "只需要一个范围。"
 
-#: builtin/log.c:809
+#: builtin/log.c:811
 msgid "Not a range."
 msgstr "不是一个范围。"
 
-#: builtin/log.c:911
+#: builtin/log.c:919
 msgid "Cover letter needs email format"
 msgstr "信封需要邮件地址格式"
 
-#: builtin/log.c:987
+#: builtin/log.c:998
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "不正常的 in-reply-to:%s"
 
-#: builtin/log.c:1015
+#: builtin/log.c:1026
 msgid "git format-patch [options] [<since> | <revision range>]"
 msgstr "git format-patch [选项] [<从> | <修订集范围>]"
 
-#: builtin/log.c:1060
+#: builtin/log.c:1071
 msgid "Two output directories?"
 msgstr "两个输出目录?"
 
-#: builtin/log.c:1175
+#: builtin/log.c:1186
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "使用 [PATCH n/m],即使只有一个补丁"
 
-#: builtin/log.c:1178
+#: builtin/log.c:1189
 msgid "use [PATCH] even with multiple patches"
 msgstr "使用 [PATCH],即使有多个补丁"
 
-#: builtin/log.c:1182
+#: builtin/log.c:1193
 msgid "print patches to standard out"
 msgstr "打印补丁到标准输出"
 
-#: builtin/log.c:1184
+#: builtin/log.c:1195
 msgid "generate a cover letter"
 msgstr "生成一封附信"
 
-#: builtin/log.c:1186
+#: builtin/log.c:1197
 msgid "use simple number sequence for output file names"
 msgstr "使用简单的数字序列作为输出文件名"
 
-#: builtin/log.c:1187
+#: builtin/log.c:1198
 msgid "sfx"
 msgstr "后缀"
 
-#: builtin/log.c:1188
+#: builtin/log.c:1199
 msgid "use <sfx> instead of '.patch'"
 msgstr "使用 <后缀> 代替 '.patch'"
 
-#: builtin/log.c:1190
+#: builtin/log.c:1201
 msgid "start numbering patches at <n> instead of 1"
 msgstr "补丁以 <n> 开始编号,而不是1"
 
-#: builtin/log.c:1192
+#: builtin/log.c:1203
 msgid "mark the series as Nth re-roll"
 msgstr "标记补丁系列是第几次重制"
 
-#: builtin/log.c:1194
+#: builtin/log.c:1205
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "使用 [<前缀>] 代替 [PATCH]"
 
-#: builtin/log.c:1197
+#: builtin/log.c:1208
 msgid "store resulting files in <dir>"
 msgstr "把结果文件存储在 <dir>"
 
-#: builtin/log.c:1200
+#: builtin/log.c:1211
 msgid "don't strip/add [PATCH]"
 msgstr "不删除/添加 [PATCH]"
 
-#: builtin/log.c:1203
+#: builtin/log.c:1214
 msgid "don't output binary diffs"
 msgstr "不输出二进制差异"
 
-#: builtin/log.c:1205
+#: builtin/log.c:1216
 msgid "don't include a patch matching a commit upstream"
 msgstr "不包含已在上游提交中的补丁"
 
-#: builtin/log.c:1207
+#: builtin/log.c:1218
 msgid "show patch format instead of default (patch + stat)"
 msgstr "显示纯补丁格式而非默认的(补丁+状态)"
 
-#: builtin/log.c:1209
+#: builtin/log.c:1220
 msgid "Messaging"
 msgstr "邮件发送"
 
-#: builtin/log.c:1210
+#: builtin/log.c:1221
 msgid "header"
 msgstr "header"
 
-#: builtin/log.c:1211
+#: builtin/log.c:1222
 msgid "add email header"
 msgstr "添加邮件头"
 
-#: builtin/log.c:1212 builtin/log.c:1214
+#: builtin/log.c:1223 builtin/log.c:1225
 msgid "email"
 msgstr "邮件地址"
 
-#: builtin/log.c:1212
+#: builtin/log.c:1223
 msgid "add To: header"
 msgstr "添加收件人"
 
-#: builtin/log.c:1214
+#: builtin/log.c:1225
 msgid "add Cc: header"
 msgstr "添加抄送"
 
-#: builtin/log.c:1216
+#: builtin/log.c:1227
 msgid "ident"
 msgstr "ident"
 
-#: builtin/log.c:1217
+#: builtin/log.c:1228
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr "设置 From 地址为 <ident>(如若不提供,用提交者ID做为地址)"
 
-#: builtin/log.c:1219
+#: builtin/log.c:1230
 msgid "message-id"
 msgstr "message-id"
 
-#: builtin/log.c:1220
+#: builtin/log.c:1231
 msgid "make first mail a reply to <message-id>"
 msgstr "使第一封邮件作为对 <message-id> 的回复"
 
-#: builtin/log.c:1221 builtin/log.c:1224
+#: builtin/log.c:1232 builtin/log.c:1235
 msgid "boundary"
 msgstr "边界"
 
-#: builtin/log.c:1222
+#: builtin/log.c:1233
 msgid "attach the patch"
 msgstr "附件方式添加补丁"
 
-#: builtin/log.c:1225
+#: builtin/log.c:1236
 msgid "inline the patch"
 msgstr "内联显示补丁"
 
-#: builtin/log.c:1229
+#: builtin/log.c:1240
 msgid "enable message threading, styles: shallow, deep"
 msgstr "启用邮件线索,风格:浅,深"
 
-#: builtin/log.c:1231
+#: builtin/log.c:1242
 msgid "signature"
 msgstr "签名"
 
-#: builtin/log.c:1232
+#: builtin/log.c:1243
 msgid "add a signature"
 msgstr "添加一个签名"
 
-#: builtin/log.c:1233
+#: builtin/log.c:1245
+msgid "add a signature from a file"
+msgstr "从文件添加一个签名"
+
+#: builtin/log.c:1246
 msgid "don't print the patch filenames"
 msgstr "不要打印补丁文件名"
 
-#: builtin/log.c:1307
+#: builtin/log.c:1320
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "包含无效的身份标识:%s"
 
-#: builtin/log.c:1322
+#: builtin/log.c:1335
 msgid "-n and -k are mutually exclusive."
 msgstr "-n 和 -k 互斥。"
 
-#: builtin/log.c:1324
+#: builtin/log.c:1337
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "--subject-prefix 和 -k 互斥。"
 
-#: builtin/log.c:1332
+#: builtin/log.c:1345
 msgid "--name-only does not make sense"
 msgstr "--name-only 无意义"
 
-#: builtin/log.c:1334
+#: builtin/log.c:1347
 msgid "--name-status does not make sense"
 msgstr "--name-status 无意义"
 
-#: builtin/log.c:1336
+#: builtin/log.c:1349
 msgid "--check does not make sense"
 msgstr "--check 无意义"
 
-#: builtin/log.c:1359
+#: builtin/log.c:1372
 msgid "standard output, or directory, which one?"
 msgstr "标准输出或目录,哪一个?"
 
-#: builtin/log.c:1361
+#: builtin/log.c:1374
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "不能创建目录 '%s'"
 
-#: builtin/log.c:1509
+#: builtin/log.c:1472
+#, c-format
+msgid "unable to read signature file '%s'"
+msgstr "无法读取签名文件 '%s'"
+
+#: builtin/log.c:1535
 msgid "Failed to create output files"
 msgstr "无法创建输出文件"
 
-#: builtin/log.c:1558
+#: builtin/log.c:1583
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<上游> [<头> [<限制>]]]"
 
-#: builtin/log.c:1613
+#: builtin/log.c:1638
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
 msgstr "不能找到跟踪的远程分支,请手工指定 <upstream>。\n"
 
-#: builtin/log.c:1626 builtin/log.c:1628 builtin/log.c:1640
+#: builtin/log.c:1651 builtin/log.c:1653 builtin/log.c:1665
 #, c-format
 msgid "Unknown commit %s"
 msgstr "未知提交 %s"
@@ -6473,7 +6723,7 @@
 msgstr "显示文件系统需要删除的文件"
 
 #: builtin/ls-files.c:477
-msgid "show 'other' directories' name only"
+msgid "show 'other' directories' names only"
 msgstr "只显示“其他”目录的名称"
 
 #: builtin/ls-files.c:480
@@ -6560,98 +6810,98 @@
 msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr "列出整个树;不仅仅当前目录(隐含 --full-name)"
 
-#: builtin/merge.c:43
+#: builtin/merge.c:44
 msgid "git merge [options] [<commit>...]"
 msgstr "git merge [选项] [<提交>...]"
 
-#: builtin/merge.c:44
+#: builtin/merge.c:45
 msgid "git merge [options] <msg> HEAD <commit>"
 msgstr "git merge [选项] <说明> HEAD <提交>"
 
-#: builtin/merge.c:45
+#: builtin/merge.c:46
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:98
+#: builtin/merge.c:99
 msgid "switch `m' requires a value"
 msgstr "开关 `m' 需要一个值"
 
-#: builtin/merge.c:135
+#: builtin/merge.c:136
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "不能找到合并策略 '%s'。\n"
 
-#: builtin/merge.c:136
+#: builtin/merge.c:137
 #, c-format
 msgid "Available strategies are:"
 msgstr "可用的策略有:"
 
-#: builtin/merge.c:141
+#: builtin/merge.c:142
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "可用的自定义策略有:"
 
-#: builtin/merge.c:191
+#: builtin/merge.c:192
 msgid "do not show a diffstat at the end of the merge"
 msgstr "在合并的最后不显示差异统计"
 
-#: builtin/merge.c:194
+#: builtin/merge.c:195
 msgid "show a diffstat at the end of the merge"
 msgstr "在合并的最后显示差异统计"
 
-#: builtin/merge.c:195
+#: builtin/merge.c:196
 msgid "(synonym to --stat)"
 msgstr "(和 --stat 同义)"
 
-#: builtin/merge.c:197
+#: builtin/merge.c:198
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr "在合并提交信息中添加(最多 <n> 条)精简提交记录"
 
-#: builtin/merge.c:200
+#: builtin/merge.c:201
 msgid "create a single commit instead of doing a merge"
 msgstr "创建一个单独的提交而不是做一次合并"
 
-#: builtin/merge.c:202
+#: builtin/merge.c:203
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "如果合并成功,执行一次提交(默认)"
 
-#: builtin/merge.c:204
+#: builtin/merge.c:205
 msgid "edit message before committing"
 msgstr "在提交前编辑提交说明"
 
-#: builtin/merge.c:205
+#: builtin/merge.c:206
 msgid "allow fast-forward (default)"
 msgstr "允许快进(默认)"
 
-#: builtin/merge.c:207
+#: builtin/merge.c:208
 msgid "abort if fast-forward is not possible"
 msgstr "如果不能快进就放弃合并"
 
-#: builtin/merge.c:211
+#: builtin/merge.c:212
 msgid "Verify that the named commit has a valid GPG signature"
 msgstr "验证指定的提交是否包含一个有效的 GPG 签名"
 
-#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
+#: builtin/merge.c:213 builtin/notes.c:741 builtin/revert.c:89
 msgid "strategy"
 msgstr "策略"
 
-#: builtin/merge.c:213
+#: builtin/merge.c:214
 msgid "merge strategy to use"
 msgstr "要使用的合并策略"
 
-#: builtin/merge.c:214
+#: builtin/merge.c:215
 msgid "option=value"
 msgstr "option=value"
 
-#: builtin/merge.c:215
+#: builtin/merge.c:216
 msgid "option for selected merge strategy"
 msgstr "所选的合并策略的选项"
 
-#: builtin/merge.c:217
+#: builtin/merge.c:218
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr "合并的提交说明(针对非快进式合并)"
 
-#: builtin/merge.c:221
+#: builtin/merge.c:222
 msgid "abort the current in-progress merge"
 msgstr "放弃当前正在进行的合并"
 
@@ -6709,31 +6959,31 @@
 msgid "git write-tree failed to write a tree"
 msgstr "git write-tree 无法写入一树对象"
 
-#: builtin/merge.c:681
+#: builtin/merge.c:677
 msgid "Not handling anything other than two heads merge."
 msgstr "不能处理两个头合并之外的任何操作。"
 
-#: builtin/merge.c:695
+#: builtin/merge.c:691
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "merge-recursive 的未知选项:-X%s"
 
-#: builtin/merge.c:709
+#: builtin/merge.c:704
 #, c-format
 msgid "unable to write %s"
 msgstr "不能写 %s"
 
-#: builtin/merge.c:798
+#: builtin/merge.c:793
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "不能从 '%s' 读取"
 
-#: builtin/merge.c:807
+#: builtin/merge.c:802
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr "未提交合并,使用 'git commit' 完成此次合并。\n"
 
-#: builtin/merge.c:813
+#: builtin/merge.c:808
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -6747,160 +6997,160 @@
 "\n"
 "以 '%c' 开头的行将被忽略,而且空提交说明将会终止提交。\n"
 
-#: builtin/merge.c:837
+#: builtin/merge.c:832
 msgid "Empty commit message."
 msgstr "空提交信息。"
 
-#: builtin/merge.c:849
+#: builtin/merge.c:844
 #, c-format
 msgid "Wonderful.\n"
 msgstr "太棒了。\n"
 
-#: builtin/merge.c:914
+#: builtin/merge.c:907
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr "自动合并失败,修正冲突然后提交修正的结果。\n"
 
-#: builtin/merge.c:930
+#: builtin/merge.c:923
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "'%s' 不是一个提交"
 
-#: builtin/merge.c:971
+#: builtin/merge.c:964
 msgid "No current branch."
 msgstr "没有当前分支。"
 
-#: builtin/merge.c:973
+#: builtin/merge.c:966
 msgid "No remote for the current branch."
 msgstr "当前分支没有对应的远程版本库。"
 
-#: builtin/merge.c:975
+#: builtin/merge.c:968
 msgid "No default upstream defined for the current branch."
 msgstr "当前分支没有定义默认的上游分支。"
 
-#: builtin/merge.c:980
+#: builtin/merge.c:973
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "对于 %s 没有来自 %s 的远程跟踪分支"
 
-#: builtin/merge.c:1136
+#: builtin/merge.c:1129
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "没有要终止的合并(MERGE_HEAD 丢失)。"
 
-#: builtin/merge.c:1152 git-pull.sh:31
+#: builtin/merge.c:1145
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
-"Please, commit your changes before you can merge."
+"Please, commit your changes before you merge."
 msgstr ""
 "您尚未结束您的合并(存在 MERGE_HEAD)。\n"
 "请在合并前先提交您的修改。"
 
-#: builtin/merge.c:1155 git-pull.sh:34
+#: builtin/merge.c:1148 git-pull.sh:34
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "您尚未结束您的合并(存在 MERGE_HEAD)。"
 
-#: builtin/merge.c:1159
+#: builtin/merge.c:1152
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
-"Please, commit your changes before you can merge."
+"Please, commit your changes before you merge."
 msgstr ""
 "您尚未结束您的拣选(存在 CHERRY_PICK_HEAD)。\n"
 "请在合并前先提交您的修改。"
 
-#: builtin/merge.c:1162
+#: builtin/merge.c:1155
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "您尚未结束您的拣选(存在 CHERRY_PICK_HEAD)。"
 
-#: builtin/merge.c:1171
+#: builtin/merge.c:1164
 msgid "You cannot combine --squash with --no-ff."
 msgstr "您不能将 --squash 与 --no-ff 同时使用。"
 
-#: builtin/merge.c:1180
+#: builtin/merge.c:1173
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "未指定提交并且 merge.defaultToUpstream 未设置。"
 
-#: builtin/merge.c:1212
+#: builtin/merge.c:1205
 msgid "Can merge only exactly one commit into empty head"
 msgstr "只能将一个提交合并到空分支上"
 
-#: builtin/merge.c:1215
+#: builtin/merge.c:1208
 msgid "Squash commit into empty head not supported yet"
 msgstr "尚不支持到空分支的压缩提交"
 
-#: builtin/merge.c:1217
+#: builtin/merge.c:1210
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "到空分支的非快进式提交没有意义"
 
-#: builtin/merge.c:1222
+#: builtin/merge.c:1215
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - 不能被合并"
 
-#: builtin/merge.c:1273
+#: builtin/merge.c:1266
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr "提交 %s 有一个非可信的声称来自 %s 的 GPG 签名。"
 
-#: builtin/merge.c:1276
+#: builtin/merge.c:1269
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "提交 %s 有一个错误的声称来自 %s 的 GPG 签名。"
 
-#: builtin/merge.c:1279
+#: builtin/merge.c:1272
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "提交 %s 没有一个 GPG 签名。"
 
-#: builtin/merge.c:1282
+#: builtin/merge.c:1275
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "提交 %s 有一个来自 %s 的好的 GPG 签名。\n"
 
-#: builtin/merge.c:1366
+#: builtin/merge.c:1356
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "更新 %s..%s\n"
 
-#: builtin/merge.c:1405
+#: builtin/merge.c:1395
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "尝试非常小的索引内合并...\n"
 
-#: builtin/merge.c:1412
+#: builtin/merge.c:1402
 #, c-format
 msgid "Nope.\n"
 msgstr "无。\n"
 
-#: builtin/merge.c:1444
+#: builtin/merge.c:1434
 msgid "Not possible to fast-forward, aborting."
 msgstr "无法快进,终止。"
 
-#: builtin/merge.c:1467 builtin/merge.c:1546
+#: builtin/merge.c:1457 builtin/merge.c:1536
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "将树回滚至原始状态...\n"
 
-#: builtin/merge.c:1471
+#: builtin/merge.c:1461
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "尝试合并策略 %s...\n"
 
-#: builtin/merge.c:1537
+#: builtin/merge.c:1527
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "没有合并策略处理此合并。\n"
 
-#: builtin/merge.c:1539
+#: builtin/merge.c:1529
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "使用策略 %s 合并失败。\n"
 
-#: builtin/merge.c:1548
+#: builtin/merge.c:1538
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "使用 %s 以准备手工解决。\n"
 
-#: builtin/merge.c:1560
+#: builtin/merge.c:1550
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr "自动合并进展顺利,按要求在提交前停止\n"
@@ -7004,75 +7254,80 @@
 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 中或保存进度后再继续"
+
+#: 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:72
+#: builtin/mv.c:112
 msgid "skip move/rename errors"
 msgstr "跳过移动/重命名错误"
 
-#: builtin/mv.c:122
+#: 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:126
+#: builtin/mv.c:166
 msgid "bad source"
 msgstr "坏的源"
 
-#: builtin/mv.c:129
+#: builtin/mv.c:169
 msgid "can not move directory into itself"
 msgstr "不能将目录移动到自身"
 
-#: builtin/mv.c:132
+#: builtin/mv.c:172
 msgid "cannot move directory over file"
 msgstr "不能将目录移动到文件"
 
-#: builtin/mv.c:138
-#, c-format
-msgid "Huh? Directory %s is in index and no submodule?"
-msgstr "嗯?目录 %s 在索引中并且不是子模组?"
-
-#: builtin/mv.c:140 builtin/rm.c:318
-msgid "Please, stage your changes to .gitmodules or stash them to proceed"
-msgstr "请将您的修改缓存到 .gitmodules 中或保存进度后再继续"
-
-#: builtin/mv.c:156
-#, c-format
-msgid "Huh? %.*s is in index?"
-msgstr "嗯?%.*s 在索引中?"
-
-#: builtin/mv.c:169
+#: builtin/mv.c:181
 msgid "source directory is empty"
 msgstr "源目录为空"
 
-#: builtin/mv.c:205
+#: builtin/mv.c:206
 msgid "not under version control"
 msgstr "不在版本控制之下"
 
-#: builtin/mv.c:207
+#: builtin/mv.c:209
 msgid "destination exists"
 msgstr "目标已存在"
 
-#: builtin/mv.c:215
+#: builtin/mv.c:217
 #, c-format
 msgid "overwriting '%s'"
 msgstr "覆盖 '%s'"
 
-#: builtin/mv.c:218
+#: builtin/mv.c:220
 msgid "Cannot overwrite"
 msgstr "不能覆盖"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:223
 msgid "multiple sources for the same target"
 msgstr "同一目标具有多个源"
 
-#: builtin/mv.c:223
+#: builtin/mv.c:225
 msgid "destination directory does not exist"
 msgstr "目标目录不存在"
 
-#: builtin/mv.c:243
+#: builtin/mv.c:232
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s,源=%s,目标=%s"
@@ -7082,48 +7337,48 @@
 msgid "Renaming %s to %s\n"
 msgstr "重命名 %s 至 %s\n"
 
-#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:358
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "重命名 '%s' 失败"
 
-#: builtin/name-rev.c:258
+#: builtin/name-rev.c:255
 msgid "git name-rev [options] <commit>..."
 msgstr "git name-rev [选项] <提交>..."
 
-#: builtin/name-rev.c:259
+#: builtin/name-rev.c:256
 msgid "git name-rev [options] --all"
 msgstr "git name-rev [选项] --all"
 
-#: builtin/name-rev.c:260
+#: builtin/name-rev.c:257
 msgid "git name-rev [options] --stdin"
 msgstr "git name-rev [选项] --stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:309
 msgid "print only names (no SHA-1)"
 msgstr "只打印名称(无 SHA-1)"
 
-#: builtin/name-rev.c:313
+#: builtin/name-rev.c:310
 msgid "only use tags to name the commits"
 msgstr "只使用 tags 来命名提交"
 
-#: builtin/name-rev.c:315
+#: builtin/name-rev.c:312
 msgid "only use refs matching <pattern>"
 msgstr "只使用和 <模式> 相匹配的引用"
 
-#: builtin/name-rev.c:317
+#: builtin/name-rev.c:314
 msgid "list all commits reachable from all refs"
 msgstr "列出可以从所有引用访问的提交"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:315
 msgid "read from stdin"
 msgstr "从标准输入读取"
 
-#: builtin/name-rev.c:319
+#: builtin/name-rev.c:316
 msgid "allow to print `undefined` names (default)"
 msgstr "允许打印 `未定义` 的名称(默认)"
 
-#: builtin/name-rev.c:325
+#: builtin/name-rev.c:322
 msgid "dereference tags in the input (internal use)"
 msgstr "反向解析输入中的 tags(内部使用)"
 
@@ -7236,154 +7491,154 @@
 msgid "git notes get-ref"
 msgstr "git notes get-ref"
 
-#: builtin/notes.c:137
+#: builtin/notes.c:136
 #, c-format
 msgid "unable to start 'show' for object '%s'"
 msgstr "不能为对象 '%s' 开始 'show'"
 
-#: builtin/notes.c:141
+#: builtin/notes.c:140
 msgid "could not read 'show' output"
 msgstr "不能读取 'show' 的输出"
 
-#: builtin/notes.c:149
+#: builtin/notes.c:148
 #, c-format
 msgid "failed to finish 'show' for object '%s'"
 msgstr "无法为对象 '%s' 完成 'show'"
 
-#: builtin/notes.c:167 builtin/tag.c:373
+#: builtin/notes.c:166 builtin/tag.c:477
 #, c-format
 msgid "could not create file '%s'"
 msgstr "不能创建文件 '%s'"
 
-#: builtin/notes.c:186
+#: builtin/notes.c:185
 msgid "Please supply the note contents using either -m or -F option"
 msgstr "请通过 -m 或 -F 选项为注解提供内容"
 
-#: builtin/notes.c:207 builtin/notes.c:848
+#: builtin/notes.c:206 builtin/notes.c:847
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "删除对象 %s 的注解\n"
 
-#: builtin/notes.c:212
+#: builtin/notes.c:211
 msgid "unable to write note object"
 msgstr "不能写注解对象"
 
-#: builtin/notes.c:214
+#: builtin/notes.c:213
 #, c-format
-msgid "The note contents has been left in %s"
-msgstr "注解内容被留在文件 %s 中"
+msgid "The note contents have been left in %s"
+msgstr "注解内容被留在 %s 中"
 
-#: builtin/notes.c:248 builtin/tag.c:604
+#: builtin/notes.c:247 builtin/tag.c:693
 #, c-format
 msgid "cannot read '%s'"
 msgstr "不能读取 '%s'"
 
-#: builtin/notes.c:250 builtin/tag.c:607
+#: builtin/notes.c:249 builtin/tag.c:696
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "不能打开或读取 '%s'"
 
-#: builtin/notes.c:269 builtin/notes.c:320 builtin/notes.c:322
-#: builtin/notes.c:382 builtin/notes.c:436 builtin/notes.c:519
-#: builtin/notes.c:524 builtin/notes.c:599 builtin/notes.c:641
-#: builtin/notes.c:843 builtin/tag.c:620
+#: builtin/notes.c:268 builtin/notes.c:319 builtin/notes.c:321
+#: builtin/notes.c:381 builtin/notes.c:435 builtin/notes.c:518
+#: builtin/notes.c:523 builtin/notes.c:598 builtin/notes.c:640
+#: builtin/notes.c:842 builtin/tag.c:709
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "无法解析 '%s' 为一个有效引用。"
 
-#: builtin/notes.c:272
+#: builtin/notes.c:271
 #, c-format
 msgid "Failed to read object '%s'."
 msgstr "无法读取对象 '%s'。"
 
-#: builtin/notes.c:276
+#: builtin/notes.c:275
 #, c-format
 msgid "Cannot read note data from non-blob object '%s'."
 msgstr "不能从非数据对象 '%s' 中读取注解数据"
 
-#: builtin/notes.c:316
+#: builtin/notes.c:315
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "非法的输入行:'%s'。"
 
-#: builtin/notes.c:331
+#: builtin/notes.c:330
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "无法从 '%s' 到 '%s' 拷贝注解"
 
-#: builtin/notes.c:375 builtin/notes.c:429 builtin/notes.c:502
-#: builtin/notes.c:514 builtin/notes.c:587 builtin/notes.c:634
-#: builtin/notes.c:908
+#: builtin/notes.c:374 builtin/notes.c:428 builtin/notes.c:501
+#: builtin/notes.c:513 builtin/notes.c:586 builtin/notes.c:633
+#: builtin/notes.c:907
 msgid "too many parameters"
 msgstr "参数太多"
 
-#: builtin/notes.c:388 builtin/notes.c:647
+#: builtin/notes.c:387 builtin/notes.c:646
 #, c-format
 msgid "No note found for object %s."
 msgstr "未发现对象 %s 的注解。"
 
-#: builtin/notes.c:410 builtin/notes.c:567
+#: builtin/notes.c:409 builtin/notes.c:566
 msgid "note contents as a string"
 msgstr "注解内容作为一个字符串"
 
-#: builtin/notes.c:413 builtin/notes.c:570
+#: builtin/notes.c:412 builtin/notes.c:569
 msgid "note contents in a file"
 msgstr "注解内容到一个文件中"
 
-#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
-#: builtin/notes.c:575 builtin/tag.c:539
+#: builtin/notes.c:414 builtin/notes.c:417 builtin/notes.c:571
+#: builtin/notes.c:574 builtin/tag.c:628
 msgid "object"
 msgstr "对象"
 
-#: builtin/notes.c:416 builtin/notes.c:573
+#: builtin/notes.c:415 builtin/notes.c:572
 msgid "reuse and edit specified note object"
 msgstr "重用和编辑指定的注解对象"
 
-#: builtin/notes.c:419 builtin/notes.c:576
+#: builtin/notes.c:418 builtin/notes.c:575
 msgid "reuse specified note object"
 msgstr "重用指定的注解对象"
 
-#: builtin/notes.c:421 builtin/notes.c:489
+#: builtin/notes.c:420 builtin/notes.c:488
 msgid "replace existing notes"
 msgstr "替换已存在的注解"
 
-#: builtin/notes.c:455
+#: builtin/notes.c:454
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr "不能添加注解。发现对象 %s 已存在注解。使用 '-f' 覆盖现存注解"
 
-#: builtin/notes.c:460 builtin/notes.c:537
+#: builtin/notes.c:459 builtin/notes.c:536
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "覆盖对象 %s 现存注解\n"
 
-#: builtin/notes.c:490
+#: builtin/notes.c:489
 msgid "read objects from stdin"
 msgstr "从标准输入读取对象"
 
-#: builtin/notes.c:492
+#: builtin/notes.c:491
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr "重新加载 <命令> 的配置(隐含 --stdin)"
 
-#: builtin/notes.c:510
+#: builtin/notes.c:509
 msgid "too few parameters"
 msgstr "参数太少"
 
-#: builtin/notes.c:531
+#: builtin/notes.c:530
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr "不能拷贝注解。发现对象 %s 已存在注解。使用 '-f' 覆盖现存注解"
 
-#: builtin/notes.c:543
+#: builtin/notes.c:542
 #, c-format
 msgid "Missing notes on source object %s. Cannot copy."
 msgstr "源对象 %s 缺少注解。不能拷贝。"
 
-#: builtin/notes.c:592
+#: builtin/notes.c:591
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -7392,236 +7647,240 @@
 "子命令 'edit' 的选项 -m/-F/-c/-C 已弃用。\n"
 "请换用 'git notes add -f -m/-F/-c/-C'。\n"
 
-#: builtin/notes.c:739
+#: builtin/notes.c:738
 msgid "General options"
 msgstr "通用选项"
 
-#: builtin/notes.c:741
+#: builtin/notes.c:740
 msgid "Merge options"
 msgstr "合并选项"
 
-#: builtin/notes.c:743
+#: builtin/notes.c:742
 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:745
+#: builtin/notes.c:744
 msgid "Committing unmerged notes"
 msgstr "提交未合并的注解"
 
-#: builtin/notes.c:747
+#: builtin/notes.c:746
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "通过提交未合并的注解来完成注解合并"
 
-#: builtin/notes.c:749
+#: builtin/notes.c:748
 msgid "Aborting notes merge resolution"
 msgstr "中止注解合并的方案"
 
-#: builtin/notes.c:751
+#: builtin/notes.c:750
 msgid "abort notes merge"
 msgstr "中止注解合并"
 
-#: builtin/notes.c:846
+#: builtin/notes.c:845
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "对象 %s 没有注解\n"
 
-#: builtin/notes.c:858
+#: builtin/notes.c:857
 msgid "attempt to remove non-existent note is not an error"
 msgstr "尝试删除不存在的注解不是一个错误"
 
-#: builtin/notes.c:861
+#: builtin/notes.c:860
 msgid "read object names from the standard input"
 msgstr "从标准输入读取对象名称"
 
-#: builtin/notes.c:942
+#: builtin/notes.c:941
 msgid "notes-ref"
 msgstr "注解引用"
 
-#: builtin/notes.c:943
+#: builtin/notes.c:942
 msgid "use notes from <notes_ref>"
 msgstr "从 <注解引用> 使用注解"
 
-#: builtin/notes.c:978 builtin/remote.c:1593
+#: builtin/notes.c:977 builtin/remote.c:1624
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "未知子命令:%s"
 
-#: builtin/pack-objects.c:25
+#: builtin/pack-objects.c:28
 msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
 msgstr "git pack-objects --stdout [选项...] [< 引用列表 | < 对象列表]"
 
-#: builtin/pack-objects.c:26
+#: builtin/pack-objects.c:29
 msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
 msgstr "git pack-objects [选项...] base-name [< 引用列表 | < 对象列表]"
 
-#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
+#: builtin/pack-objects.c:177 builtin/pack-objects.c:180
 #, c-format
 msgid "deflate error (%d)"
 msgstr "压缩错误 (%d)"
 
-#: builtin/pack-objects.c:771
+#: builtin/pack-objects.c:773
 msgid "Writing objects"
 msgstr "写入对象中"
 
-#: builtin/pack-objects.c:1012
+#: builtin/pack-objects.c:1015
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr "禁用 bitmap 写入,因为一些对象将不会被打包"
 
-#: builtin/pack-objects.c:2174
+#: builtin/pack-objects.c:2175
 msgid "Compressing objects"
 msgstr "压缩对象中"
 
-#: builtin/pack-objects.c:2530
+#: builtin/pack-objects.c:2572
 #, c-format
 msgid "unsupported index version %s"
 msgstr "不支持的索引版本 %s"
 
-#: builtin/pack-objects.c:2534
+#: builtin/pack-objects.c:2576
 #, c-format
 msgid "bad index version '%s'"
 msgstr "坏的索引版本 '%s'"
 
-#: builtin/pack-objects.c:2557
+#: builtin/pack-objects.c:2599
 #, c-format
 msgid "option %s does not accept negative form"
 msgstr "选项 %s 不接受否定格式"
 
-#: builtin/pack-objects.c:2561
+#: builtin/pack-objects.c:2603
 #, c-format
 msgid "unable to parse value '%s' for option %s"
 msgstr "不能解析选项 %1$s 的值 '%2$s'"
 
-#: builtin/pack-objects.c:2580
+#: builtin/pack-objects.c:2622
 msgid "do not show progress meter"
 msgstr "不显示进度表"
 
-#: builtin/pack-objects.c:2582
+#: builtin/pack-objects.c:2624
 msgid "show progress meter"
 msgstr "显示进度表"
 
-#: builtin/pack-objects.c:2584
+#: builtin/pack-objects.c:2626
 msgid "show progress meter during object writing phase"
 msgstr "在对象写入阶段显示进度表"
 
-#: builtin/pack-objects.c:2587
+#: builtin/pack-objects.c:2629
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "当进度表显示时类似于 --all-progress"
 
-#: builtin/pack-objects.c:2588
+#: builtin/pack-objects.c:2630
 msgid "version[,offset]"
 msgstr "版本[,偏移]"
 
-#: builtin/pack-objects.c:2589
+#: builtin/pack-objects.c:2631
 msgid "write the pack index file in the specified idx format version"
 msgstr "用指定的 idx 格式版本来写包索引文件"
 
-#: builtin/pack-objects.c:2592
+#: builtin/pack-objects.c:2634
 msgid "maximum size of each output pack file"
 msgstr "每个输出包的最大尺寸"
 
-#: builtin/pack-objects.c:2594
+#: builtin/pack-objects.c:2636
 msgid "ignore borrowed objects from alternate object store"
 msgstr "忽略从替代对象存储里借用对象"
 
-#: builtin/pack-objects.c:2596
+#: builtin/pack-objects.c:2638
 msgid "ignore packed objects"
 msgstr "忽略包对象"
 
-#: builtin/pack-objects.c:2598
+#: builtin/pack-objects.c:2640
 msgid "limit pack window by objects"
 msgstr "限制打包窗口的对象数"
 
-#: builtin/pack-objects.c:2600
+#: builtin/pack-objects.c:2642
 msgid "limit pack window by memory in addition to object limit"
 msgstr "除对象数量限制外设置打包窗口的内存限制"
 
-#: builtin/pack-objects.c:2602
+#: builtin/pack-objects.c:2644
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr "打包允许的 delta 链的最大长度"
 
-#: builtin/pack-objects.c:2604
+#: builtin/pack-objects.c:2646
 msgid "reuse existing deltas"
 msgstr "重用已存在的 deltas"
 
-#: builtin/pack-objects.c:2606
+#: builtin/pack-objects.c:2648
 msgid "reuse existing objects"
 msgstr "重用已存在的对象"
 
-#: builtin/pack-objects.c:2608
+#: builtin/pack-objects.c:2650
 msgid "use OFS_DELTA objects"
 msgstr "使用 OFS_DELTA 对象"
 
-#: builtin/pack-objects.c:2610
+#: builtin/pack-objects.c:2652
 msgid "use threads when searching for best delta matches"
 msgstr "使用线程查询最佳 delta 匹配"
 
-#: builtin/pack-objects.c:2612
+#: builtin/pack-objects.c:2654
 msgid "do not create an empty pack output"
 msgstr "不创建空的包输出"
 
-#: builtin/pack-objects.c:2614
+#: builtin/pack-objects.c:2656
 msgid "read revision arguments from standard input"
 msgstr "从标准输入读取修订号参数"
 
-#: builtin/pack-objects.c:2616
+#: builtin/pack-objects.c:2658
 msgid "limit the objects to those that are not yet packed"
 msgstr "限制那些尚未打包的对象"
 
-#: builtin/pack-objects.c:2619
+#: builtin/pack-objects.c:2661
 msgid "include objects reachable from any reference"
 msgstr "包括可以从任何引用访问到的对象"
 
-#: builtin/pack-objects.c:2622
+#: builtin/pack-objects.c:2664
 msgid "include objects referred by reflog entries"
 msgstr "包括被引用日志引用到的对象"
 
-#: builtin/pack-objects.c:2625
+#: builtin/pack-objects.c:2667
+msgid "include objects referred to by the index"
+msgstr "包括被索引引用到的对象"
+
+#: builtin/pack-objects.c:2670
 msgid "output pack to stdout"
 msgstr "输出包到标准输出"
 
-#: builtin/pack-objects.c:2627
+#: builtin/pack-objects.c:2672
 msgid "include tag objects that refer to objects to be packed"
 msgstr "包括引用了打包对象的 tag"
 
-#: builtin/pack-objects.c:2629
+#: builtin/pack-objects.c:2674
 msgid "keep unreachable objects"
 msgstr "维持不可达的对象"
 
-#: builtin/pack-objects.c:2630 parse-options.h:140
+#: builtin/pack-objects.c:2675 parse-options.h:140
 msgid "time"
 msgstr "时间"
 
-#: builtin/pack-objects.c:2631
+#: builtin/pack-objects.c:2676
 msgid "unpack unreachable objects newer than <time>"
 msgstr "将比给定 <时间> 新的无法访问的对象解包"
 
-#: builtin/pack-objects.c:2634
+#: builtin/pack-objects.c:2679
 msgid "create thin packs"
 msgstr "创建精简包"
 
-#: builtin/pack-objects.c:2636
+#: builtin/pack-objects.c:2681
 msgid "ignore packs that have companion .keep file"
 msgstr "忽略配有 .keep 文件的包"
 
-#: builtin/pack-objects.c:2638
+#: builtin/pack-objects.c:2683
 msgid "pack compression level"
 msgstr "打包压缩级别"
 
-#: builtin/pack-objects.c:2640
+#: builtin/pack-objects.c:2685
 msgid "do not hide commits by grafts"
 msgstr "显示被嫁接隐藏的提交"
 
-#: builtin/pack-objects.c:2642
+#: builtin/pack-objects.c:2687
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr "使用 bitmap 索引(如果有的话)以提高对象计数时的速度"
 
-#: builtin/pack-objects.c:2644
+#: builtin/pack-objects.c:2689
 msgid "write a bitmap index together with the pack index"
 msgstr "在建立包索引的同时创建 bitmap 索引"
 
-#: builtin/pack-objects.c:2723
+#: builtin/pack-objects.c:2778
 msgid "Counting objects"
 msgstr "对象计数中"
 
@@ -7641,7 +7900,7 @@
 msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
 msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]"
 
-#: builtin/prune-packed.c:49
+#: builtin/prune-packed.c:40
 msgid "Removing duplicate objects"
 msgstr "正在删除重复对象"
 
@@ -7649,15 +7908,15 @@
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <时间>] [--] [<头>...]"
 
-#: builtin/prune.c:142
+#: builtin/prune.c:106
 msgid "do not remove, show only"
 msgstr "不删除,只显示"
 
-#: builtin/prune.c:143
+#: builtin/prune.c:107
 msgid "report pruned objects"
 msgstr "报告清除的对象"
 
-#: builtin/prune.c:146
+#: builtin/prune.c:110
 msgid "expire objects older than <time>"
 msgstr "使早于给定时间的对象过期"
 
@@ -7673,7 +7932,7 @@
 msgid "--delete only accepts plain target ref names"
 msgstr "--delete 只接受简单的目标引用名"
 
-#: builtin/push.c:140
+#: builtin/push.c:139
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -7681,7 +7940,7 @@
 "\n"
 "为了永久地选择任一选项,参见 'git help config' 中的 push.default。"
 
-#: builtin/push.c:143
+#: builtin/push.c:142
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -7705,7 +7964,7 @@
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:158
+#: builtin/push.c:157
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -7719,7 +7978,7 @@
 "\n"
 "    git push %s HEAD:<name-of-remote-branch>\n"
 
-#: builtin/push.c:172
+#: builtin/push.c:171
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -7732,12 +7991,12 @@
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:180
+#: builtin/push.c:179
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr "当前分支 %s 有多个上游分支,拒绝推送。"
 
-#: builtin/push.c:183
+#: builtin/push.c:182
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -7748,7 +8007,7 @@
 "而没有告诉我要推送什么、更新哪个远程分支。"
 
 #  译者:字符串首行行首要添加“warning: ”字串,故此首行要较其余行短
-#: builtin/push.c:206
+#: builtin/push.c:205
 msgid ""
 "push.default is unset; its implicit value has changed in\n"
 "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
@@ -7791,12 +8050,12 @@
 "('simple' 模式由 Git 1.7.11 版本引入。如果您有时要使用老版本的 Git,\n"
 "为保持兼容,请用 'current' 代替 'simple')"
 
-#: builtin/push.c:273
+#: builtin/push.c:272
 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:279
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -7807,7 +8066,7 @@
 "再次推送前,先与远程变更合并(如 'git pull ...')。详见\n"
 "'git push --help' 中的 'Note about fast-forwards' 小节。"
 
-#: builtin/push.c:286
+#: builtin/push.c:285
 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"
@@ -7818,7 +8077,7 @@
 "检出该分支并整合远程变更(如 'git pull ...'),然后再推送。详见\n"
 "'git push --help' 中的 'Note about fast-forwards' 小节。"
 
-#: builtin/push.c:292
+#: builtin/push.c:291
 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"
@@ -7831,11 +8090,11 @@
 "(如 'git pull ...')。\n"
 "详见 'git push --help' 中的 'Note about fast-forwards' 小节。"
 
-#: builtin/push.c:299
+#: builtin/push.c:298
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr "更新被拒绝因为 tag 在远程已经存在。"
 
-#: builtin/push.c:302
+#: builtin/push.c:301
 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"
@@ -7844,22 +8103,22 @@
 "如果不使用 '--force' 参数,您不能更新一个指向非提交对象的远程引用,\n"
 "也不能更新远程引用让其指向一个非提交对象。\n"
 
-#: builtin/push.c:361
+#: builtin/push.c:360
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "推送到 %s\n"
 
-#: builtin/push.c:365
+#: builtin/push.c:364
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "无法推送一些引用到 '%s'"
 
-#: builtin/push.c:395
+#: builtin/push.c:394
 #, c-format
 msgid "bad repository '%s'"
 msgstr "坏的版本库 '%s'"
 
-#: builtin/push.c:396
+#: builtin/push.c:395
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -7880,99 +8139,103 @@
 "\n"
 "    git push <name>\n"
 
-#: builtin/push.c:411
+#: builtin/push.c:410
 msgid "--all and --tags are incompatible"
 msgstr "--all 和 --tags 不兼容"
 
-#: builtin/push.c:412
+#: builtin/push.c:411
 msgid "--all can't be combined with refspecs"
 msgstr "--all 不能和引用规则同时使用"
 
-#: builtin/push.c:417
+#: builtin/push.c:416
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror 和 --tags 不兼容"
 
-#: builtin/push.c:418
+#: builtin/push.c:417
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror 不能和引用规则同时使用"
 
-#: builtin/push.c:423
+#: builtin/push.c:422
 msgid "--all and --mirror are incompatible"
 msgstr "--all 和 --mirror 不兼容"
 
-#: builtin/push.c:483
+#: builtin/push.c:493
 msgid "repository"
 msgstr "版本库"
 
-#: builtin/push.c:484
+#: builtin/push.c:494
 msgid "push all refs"
 msgstr "推送所有引用"
 
-#: builtin/push.c:485
+#: builtin/push.c:495
 msgid "mirror all refs"
 msgstr "镜像所有引用"
 
-#: builtin/push.c:487
+#: builtin/push.c:497
 msgid "delete refs"
 msgstr "删除引用"
 
-#: builtin/push.c:488
+#: builtin/push.c:498
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "推送 tags(不能使用 --all or --mirror)"
 
-#: builtin/push.c:491
+#: builtin/push.c:501
 msgid "force updates"
 msgstr "强制更新"
 
-#: builtin/push.c:493
+#: builtin/push.c:503
 msgid "refname>:<expect"
 msgstr "引用名>:<期望值"
 
-#: builtin/push.c:494
+#: builtin/push.c:504
 msgid "require old value of ref to be at this value"
 msgstr "要求引用旧的取值为设定值"
 
-#: builtin/push.c:496
+#: builtin/push.c:506
 msgid "check"
 msgstr "检查"
 
-#: builtin/push.c:497
+#: builtin/push.c:507
 msgid "control recursive pushing of submodules"
 msgstr "控制子模组的递归推送"
 
-#: builtin/push.c:499
+#: builtin/push.c:509
 msgid "use thin pack"
 msgstr "使用精简打包"
 
-#: builtin/push.c:500 builtin/push.c:501
+#: builtin/push.c:510 builtin/push.c:511
 msgid "receive pack program"
 msgstr "接收包程序"
 
-#: builtin/push.c:502
+#: builtin/push.c:512
 msgid "set upstream for git pull/status"
 msgstr "设置 git pull/status 的上游"
 
-#: builtin/push.c:505
+#: builtin/push.c:515
 msgid "prune locally removed refs"
 msgstr "清除本地删除的引用"
 
-#: builtin/push.c:507
+#: builtin/push.c:517
 msgid "bypass pre-push hook"
 msgstr "绕过 pre-push 钩子"
 
-#: builtin/push.c:508
+#: builtin/push.c:518
 msgid "push missing but relevant tags"
 msgstr "推送缺失的有关的 tags"
 
-#: builtin/push.c:518
+#: builtin/push.c:520
+msgid "GPG sign the push"
+msgstr "用 GPG 为推送签名"
+
+#: builtin/push.c:529
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete 与 --all、--mirror 及 --tags 不兼容"
 
-#: builtin/push.c:520
+#: builtin/push.c:531
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete 未接任何引用没有意义"
 
-#: builtin/read-tree.c:36
+#: builtin/read-tree.c:37
 msgid ""
 "git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] "
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
@@ -7982,67 +8245,67 @@
 "u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
 "index-output=<文件>] (--empty | <树或提交1> [<树或提交2> [<树或提交3>]])"
 
-#: builtin/read-tree.c:109
+#: builtin/read-tree.c:110
 msgid "write resulting index to <file>"
 msgstr "将索引结果写入 <file>"
 
-#: builtin/read-tree.c:112
+#: builtin/read-tree.c:113
 msgid "only empty the index"
 msgstr "只是清空索引"
 
-#: builtin/read-tree.c:114
+#: builtin/read-tree.c:115
 msgid "Merging"
 msgstr "合并"
 
-#: builtin/read-tree.c:116
+#: builtin/read-tree.c:117
 msgid "perform a merge in addition to a read"
 msgstr "读取之余再执行一个合并"
 
-#: builtin/read-tree.c:118
+#: builtin/read-tree.c:119
 msgid "3-way merge if no file level merging required"
 msgstr "如果没有文件级合并需要,执行三路合并"
 
-#: builtin/read-tree.c:120
+#: builtin/read-tree.c:121
 msgid "3-way merge in presence of adds and removes"
 msgstr "存在添加和删除时,也执行三路合并"
 
-#: builtin/read-tree.c:122
+#: builtin/read-tree.c:123
 msgid "same as -m, but discard unmerged entries"
 msgstr "类似于 -m,但丢弃未合并的条目"
 
-#: builtin/read-tree.c:123
+#: builtin/read-tree.c:124
 msgid "<subdirectory>/"
 msgstr "<子目录>/"
 
-#: builtin/read-tree.c:124
+#: builtin/read-tree.c:125
 msgid "read the tree into the index under <subdirectory>/"
 msgstr "读取树对象到索引的 <子目录>/ 下"
 
-#: builtin/read-tree.c:127
+#: builtin/read-tree.c:128
 msgid "update working tree with merge result"
 msgstr "用合并的结果更新工作区"
 
-#: builtin/read-tree.c:129
+#: builtin/read-tree.c:130
 msgid "gitignore"
 msgstr "gitignore"
 
-#: builtin/read-tree.c:130
+#: builtin/read-tree.c:131
 msgid "allow explicitly ignored files to be overwritten"
 msgstr "允许忽略文件中设定的文件可以被覆盖"
 
-#: builtin/read-tree.c:133
+#: builtin/read-tree.c:134
 msgid "don't check the working tree after merging"
 msgstr "合并后不检查工作区"
 
-#: builtin/read-tree.c:134
+#: builtin/read-tree.c:135
 msgid "don't update the index or the work tree"
 msgstr "不更新索引区和工作区"
 
-#: builtin/read-tree.c:136
+#: builtin/read-tree.c:137
 msgid "skip applying sparse checkout filter"
 msgstr "跳过应用稀疏检出过滤器"
 
-#: builtin/read-tree.c:138
+#: builtin/read-tree.c:139
 msgid "debug unpack-trees"
 msgstr "调试 unpack-trees"
 
@@ -8206,21 +8469,16 @@
 msgid "Could not setup master '%s'"
 msgstr "无法设置 master '%s'"
 
-#: builtin/remote.c:289
-#, c-format
-msgid "more than one %s"
-msgstr "多于一个 %s"
-
-#: builtin/remote.c:334
+#: builtin/remote.c:333
 #, c-format
 msgid "Could not get fetch map for refspec %s"
 msgstr "无法得到引用规则 %s 的获取列表"
 
-#: builtin/remote.c:435 builtin/remote.c:443
+#: builtin/remote.c:434 builtin/remote.c:442
 msgid "(matching)"
 msgstr "(匹配)"
 
-#: builtin/remote.c:447
+#: builtin/remote.c:446
 msgid "(delete)"
 msgstr "(删除)"
 
@@ -8229,7 +8487,7 @@
 msgid "Could not append '%s' to '%s'"
 msgstr "不能添加 '%s' 至 '%s'"
 
-#: builtin/remote.c:634 builtin/remote.c:787 builtin/remote.c:885
+#: builtin/remote.c:634 builtin/remote.c:798 builtin/remote.c:898
 #, c-format
 msgid "No such remote: %s"
 msgstr "没有这样的远程:%s"
@@ -8239,7 +8497,7 @@
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "不能重命名配置小节 '%s' 到 '%s'"
 
-#: builtin/remote.c:657 builtin/remote.c:794
+#: builtin/remote.c:657 builtin/remote.c:850
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "不能移除配置小节 '%s'"
@@ -8275,12 +8533,12 @@
 msgid "creating '%s' failed"
 msgstr "创建 '%s' 失败"
 
-#: builtin/remote.c:759
+#: builtin/remote.c:769
 #, c-format
 msgid "Could not remove branch %s"
 msgstr "无法移除分支 %s"
 
-#: builtin/remote.c:829
+#: builtin/remote.c:836
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -8290,126 +8548,126 @@
 msgstr[0] "注意:ref/remotes 层级之外的一个分支未被移除。要删除它,使用:"
 msgstr[1] "注意:ref/remotes 层级之外的一些分支未被移除。要删除它们,使用:"
 
-#: builtin/remote.c:938
+#: builtin/remote.c:951
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " 新的(下一次获取将存储于 remotes/%s)"
 
-#: builtin/remote.c:941
+#: builtin/remote.c:954
 msgid " tracked"
 msgstr " 已跟踪"
 
-#: builtin/remote.c:943
+#: builtin/remote.c:956
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " 过时(使用 'git remote prune' 来移除)"
 
-#: builtin/remote.c:945
+#: builtin/remote.c:958
 msgid " ???"
 msgstr " ???"
 
-#: builtin/remote.c:986
+#: builtin/remote.c:999
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr "无效的 branch.%s.merge,不能变基到一个以上的分支"
 
-#: builtin/remote.c:993
+#: builtin/remote.c:1006
 #, c-format
 msgid "rebases onto remote %s"
 msgstr "变基到远程 %s"
 
-#: builtin/remote.c:996
+#: builtin/remote.c:1009
 #, c-format
 msgid " merges with remote %s"
 msgstr " 与远程 %s 合并"
 
-#: builtin/remote.c:997
+#: builtin/remote.c:1010
 msgid "    and with remote"
 msgstr "    且有远程"
 
-#: builtin/remote.c:999
+#: builtin/remote.c:1012
 #, c-format
 msgid "merges with remote %s"
 msgstr "与远程 %s 合并"
 
-#: builtin/remote.c:1000
+#: builtin/remote.c:1013
 msgid "   and with remote"
 msgstr "   且有远程"
 
-#: builtin/remote.c:1046
+#: builtin/remote.c:1059
 msgid "create"
 msgstr "创建"
 
-#: builtin/remote.c:1049
+#: builtin/remote.c:1062
 msgid "delete"
 msgstr "删除"
 
-#: builtin/remote.c:1053
+#: builtin/remote.c:1066
 msgid "up to date"
 msgstr "最新"
 
-#: builtin/remote.c:1056
+#: builtin/remote.c:1069
 msgid "fast-forwardable"
 msgstr "可快进"
 
-#: builtin/remote.c:1059
+#: builtin/remote.c:1072
 msgid "local out of date"
 msgstr "本地已过时"
 
-#: builtin/remote.c:1066
+#: builtin/remote.c:1079
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s 强制推送至 %-*s (%s)"
 
-#: builtin/remote.c:1069
+#: builtin/remote.c:1082
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s 推送至 %-*s (%s)"
 
-#: builtin/remote.c:1073
+#: builtin/remote.c:1086
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s 强制推送至 %s"
 
-#: builtin/remote.c:1076
+#: builtin/remote.c:1089
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s 推送至 %s"
 
-#: builtin/remote.c:1144
+#: builtin/remote.c:1157
 msgid "do not query remotes"
 msgstr "不查询远程"
 
-#: builtin/remote.c:1171
+#: builtin/remote.c:1184
 #, c-format
 msgid "* remote %s"
 msgstr "* 远程 %s"
 
-#: builtin/remote.c:1172
+#: builtin/remote.c:1185
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  获取地址:%s"
 
-#: builtin/remote.c:1173 builtin/remote.c:1318
+#: builtin/remote.c:1186 builtin/remote.c:1333
 msgid "(no URL)"
 msgstr "(无 URL)"
 
-#: builtin/remote.c:1182 builtin/remote.c:1184
+#: builtin/remote.c:1195 builtin/remote.c:1197
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  推送地址:%s"
 
-#: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190
+#: builtin/remote.c:1199 builtin/remote.c:1201 builtin/remote.c:1203
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  HEAD分支:%s"
 
-#: builtin/remote.c:1192
+#: builtin/remote.c:1205
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr "  HEAD 分支(远程 HEAD 模糊,可能是下列中的一个):\n"
 
-#: builtin/remote.c:1204
+#: builtin/remote.c:1217
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
@@ -8417,239 +8675,295 @@
 msgstr[1] "  远程分支:%s"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/remote.c:1207 builtin/remote.c:1234
+#: builtin/remote.c:1220 builtin/remote.c:1247
 msgid " (status not queried)"
 msgstr "(状态未查询)"
 
-#: builtin/remote.c:1216
+#: builtin/remote.c:1229
 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:1224
+#: builtin/remote.c:1237
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  本地引用将在 'git push' 时被镜像"
 
-#: builtin/remote.c:1231
+#: builtin/remote.c:1244
 #, 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:1252
+#: builtin/remote.c:1265
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "根据远程设置 refs/remotes/<名称>/HEAD"
 
-#: builtin/remote.c:1254
+#: builtin/remote.c:1267
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "删除 refs/remotes/<名称>/HEAD"
 
-#: builtin/remote.c:1269
+#: builtin/remote.c:1282
 msgid "Cannot determine remote HEAD"
 msgstr "无法确定远程 HEAD"
 
-#: builtin/remote.c:1271
+#: builtin/remote.c:1284
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr "多个远程 HEAD 分支。请明确地选择一个用命令:"
 
-#: builtin/remote.c:1281
+#: builtin/remote.c:1294
 #, c-format
 msgid "Could not delete %s"
 msgstr "无法删除 %s"
 
-#: builtin/remote.c:1289
+#: builtin/remote.c:1302
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "不是一个有效引用:%s"
 
-#: builtin/remote.c:1291
+#: builtin/remote.c:1304
 #, c-format
 msgid "Could not setup %s"
 msgstr "不能设置 %s"
 
 #  译者:注意保持前导空格
-#: builtin/remote.c:1307
+#: builtin/remote.c:1322
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s 将成为摇摆状态!"
 
 #  译者:注意保持前导空格
-#: builtin/remote.c:1308
+#: builtin/remote.c:1323
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s 已成为摇摆状态!"
 
-#: builtin/remote.c:1314
+#: builtin/remote.c:1329
 #, c-format
 msgid "Pruning %s"
 msgstr "修剪 %s"
 
-#: builtin/remote.c:1315
+#: builtin/remote.c:1330
 #, c-format
 msgid "URL: %s"
 msgstr "URL:%s"
 
-#: builtin/remote.c:1328
+#: builtin/remote.c:1357
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [将删除] %s"
 
-#: builtin/remote.c:1331
+#: builtin/remote.c:1360
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [已删除] %s"
 
-#: builtin/remote.c:1374
+#: builtin/remote.c:1405
 msgid "prune remotes after fetching"
 msgstr "抓取后清除远程"
 
-#: builtin/remote.c:1440 builtin/remote.c:1514
+#: builtin/remote.c:1471 builtin/remote.c:1545
 #, c-format
 msgid "No such remote '%s'"
 msgstr "没有此远程 '%s'"
 
-#: builtin/remote.c:1460
+#: builtin/remote.c:1491
 msgid "add branch"
 msgstr "添加分支"
 
-#: builtin/remote.c:1467
+#: builtin/remote.c:1498
 msgid "no remote specified"
 msgstr "未指定远程"
 
-#: builtin/remote.c:1489
+#: builtin/remote.c:1520
 msgid "manipulate push URLs"
 msgstr "操作推送 URLS"
 
-#: builtin/remote.c:1491
+#: builtin/remote.c:1522
 msgid "add URL"
 msgstr "添加 URL"
 
-#: builtin/remote.c:1493
+#: builtin/remote.c:1524
 msgid "delete URLs"
 msgstr "删除 URLS"
 
-#: builtin/remote.c:1500
+#: builtin/remote.c:1531
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete 无意义"
 
-#: builtin/remote.c:1540
+#: builtin/remote.c:1571
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "无效的旧URL匹配模版:%s"
 
-#: builtin/remote.c:1548
+#: builtin/remote.c:1579
 #, c-format
 msgid "No such URL found: %s"
 msgstr "未找到此URL:%s"
 
-#: builtin/remote.c:1550
+#: builtin/remote.c:1581
 msgid "Will not delete all non-push URLs"
 msgstr "将不会删除所有非推送URL地址"
 
-#: builtin/remote.c:1564
+#: builtin/remote.c:1595
 msgid "be verbose; must be placed before a subcommand"
 msgstr "冗长输出;必须置于子命令之前"
 
-#: builtin/repack.c:16
+#: builtin/repack.c:17
 msgid "git repack [options]"
 msgstr "git repack [选项]"
 
-#: builtin/repack.c:156
+#: builtin/repack.c:160
 msgid "pack everything in a single pack"
 msgstr "所有内容打包到一个包文件中"
 
-#: builtin/repack.c:158
+#: builtin/repack.c:162
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "和 -a 相同,并将不可达的对象设为松散对象"
 
-#: builtin/repack.c:161
+#: builtin/repack.c:165
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "删除多余的包,运行 git-prune-packed"
 
-#: builtin/repack.c:163
+#: builtin/repack.c:167
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "向 git-pack-objects 传递参数 --no-reuse-delta"
 
-#: builtin/repack.c:165
+#: builtin/repack.c:169
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "向 git-pack-objects 传递参数 --no-reuse-object"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:171
 msgid "do not run git-update-server-info"
 msgstr "不运行 git-update-server-info"
 
-#: builtin/repack.c:170
+#: builtin/repack.c:174
 msgid "pass --local to git-pack-objects"
 msgstr "向 git-pack-objects 传递参数 --local"
 
-#: builtin/repack.c:172
+#: builtin/repack.c:176
 msgid "write bitmap index"
 msgstr "写 bitmap 索引"
 
-#: builtin/repack.c:173
+#: builtin/repack.c:177
 msgid "approxidate"
 msgstr "近似日期"
 
-#: builtin/repack.c:174
+#: builtin/repack.c:178
 msgid "with -A, do not loosen objects older than this"
 msgstr "使用 -A,不要将早于给定时间的对象过期"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:180
 msgid "size of the window used for delta compression"
 msgstr "用于增量压缩的窗口值"
 
-#: builtin/repack.c:177 builtin/repack.c:181
+#: builtin/repack.c:181 builtin/repack.c:185
 msgid "bytes"
 msgstr "字节"
 
-#: builtin/repack.c:178
+#: builtin/repack.c:182
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr "和上面的相似,但限制内存大小而非条目数"
 
-#: builtin/repack.c:180
+#: builtin/repack.c:184
 msgid "limits the maximum delta depth"
 msgstr "限制最大增量深度"
 
-#: builtin/repack.c:182
+#: builtin/repack.c:186
 msgid "maximum size of each packfile"
 msgstr "每个包的最大尺寸"
 
-#: builtin/repack.c:184
+#: builtin/repack.c:188
 msgid "repack objects in packs marked with .keep"
 msgstr "对标记为 .keep 的包中的对象重新打包"
 
-#: builtin/repack.c:371
+#: builtin/repack.c:374
 #, c-format
 msgid "removing '%s' failed"
 msgstr "删除 '%s' 失败"
 
-#: builtin/replace.c:17
+#: builtin/replace.c:19
 msgid "git replace [-f] <object> <replacement>"
 msgstr "git replace [-f] <对象> <替换物>"
 
-#: builtin/replace.c:18
+#: 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:19
+#: builtin/replace.c:23
 msgid "git replace [--format=<format>] [-l [<pattern>]]"
 msgstr "git replace [--format=<格式>] [-l [<模式>]]"
 
-#: builtin/replace.c:174
+#: 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' 中损坏的 mergetag"
+
+#: builtin/replace.c:357
+#, c-format
+msgid "malformed mergetag in commit '%s'"
+msgstr "提交 '%s' 中非法的 mergetag"
+
+#: builtin/replace.c:368
+#, c-format
+msgid ""
+"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
+"instead of --graft"
+msgstr "原始提交 '%s' 包含已经丢弃的 mergetag '%s',使用 --edit 代替 --graft"
+
+#: 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:175
+#: builtin/replace.c:433
 msgid "delete replace refs"
 msgstr "删除替换的引用"
 
-#: builtin/replace.c:176
+#: 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:177
+#: builtin/replace.c:437
+msgid "do not pretty-print contents for --edit"
+msgstr "不要为 --edit 操作美观显示内容"
+
+#: builtin/replace.c:438
 msgid "use this format"
 msgstr "使用此格式"
 
@@ -8661,156 +8975,156 @@
 msgid "register clean resolutions in index"
 msgstr "在索引中注册干净的解决方案"
 
-#: builtin/reset.c:25
+#: 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:26
+#: builtin/reset.c:27
 msgid "git reset [-q] <tree-ish> [--] <paths>..."
 msgstr "git reset [-q] <树或提交> [--] <路径>..."
 
-#: builtin/reset.c:27
+#: builtin/reset.c:28
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
 msgstr "git reset --patch [<树或提交>] [--] [<路径>...]"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "mixed"
 msgstr "混杂"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "soft"
 msgstr "软性"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "hard"
 msgstr "硬性"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "merge"
 msgstr "合并"
 
-#: builtin/reset.c:33
+#: builtin/reset.c:34
 msgid "keep"
 msgstr "保持"
 
-#: builtin/reset.c:73
+#: builtin/reset.c:74
 msgid "You do not have a valid HEAD."
 msgstr "您没有一个有效的 HEAD。"
 
-#: builtin/reset.c:75
+#: builtin/reset.c:76
 msgid "Failed to find tree of HEAD."
 msgstr "无法找到 HEAD 指向的树。"
 
-#: builtin/reset.c:81
+#: builtin/reset.c:82
 #, c-format
 msgid "Failed to find tree of %s."
 msgstr "无法找到 %s 指向的树。"
 
-#: builtin/reset.c:99
+#: builtin/reset.c:100
 #, c-format
 msgid "HEAD is now at %s"
 msgstr "HEAD 现在位于 %s"
 
 #  译者:汉字之间无空格,故删除%s前后空格
-#: builtin/reset.c:182
+#: builtin/reset.c:183
 #, c-format
 msgid "Cannot do a %s reset in the middle of a merge."
 msgstr "在合并过程中不能做%s重置操作。"
 
-#: builtin/reset.c:273
+#: builtin/reset.c:276
 msgid "be quiet, only report errors"
 msgstr "安静模式,只报告错误"
 
-#: builtin/reset.c:275
+#: builtin/reset.c:278
 msgid "reset HEAD and index"
 msgstr "重置 HEAD 和索引"
 
-#: builtin/reset.c:276
+#: builtin/reset.c:279
 msgid "reset only HEAD"
 msgstr "只重置 HEAD"
 
-#: builtin/reset.c:278 builtin/reset.c:280
+#: builtin/reset.c:281 builtin/reset.c:283
 msgid "reset HEAD, index and working tree"
 msgstr "重置 HEAD、索引和工作区"
 
-#: builtin/reset.c:282
+#: builtin/reset.c:285
 msgid "reset HEAD but keep local changes"
 msgstr "重置 HEAD 但保存本地变更"
 
-#: builtin/reset.c:285
+#: builtin/reset.c:288
 msgid "record only the fact that removed paths will be added later"
 msgstr "将删除的路径标记为稍后添加"
 
-#: builtin/reset.c:302
+#: builtin/reset.c:305
 #, c-format
 msgid "Failed to resolve '%s' as a valid revision."
 msgstr "无法将 '%s' 解析为一个有效的版本。"
 
-#: builtin/reset.c:305 builtin/reset.c:313
+#: builtin/reset.c:308 builtin/reset.c:316
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "不能解析对象 '%s'。"
 
-#: builtin/reset.c:310
+#: builtin/reset.c:313
 #, c-format
 msgid "Failed to resolve '%s' as a valid tree."
 msgstr "无法将 '%s' 解析为一个有效的树对象。"
 
-#: builtin/reset.c:319
+#: builtin/reset.c:322
 msgid "--patch is incompatible with --{hard,mixed,soft}"
 msgstr "--patch 与 --{hard、mixed、soft} 选项不兼容"
 
-#: builtin/reset.c:328
+#: builtin/reset.c:331
 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
 msgstr "--mixed 带路径已弃用,而是用 'git reset -- <paths>'。"
 
 #  译者:汉字之间无空格,故删除%s前后空格
-#: builtin/reset.c:330
+#: builtin/reset.c:333
 #, c-format
 msgid "Cannot do %s reset with paths."
 msgstr "不能带路径进行%s重置。"
 
 #  译者:汉字之间无空格,故删除%s前后空格
-#: builtin/reset.c:340
+#: builtin/reset.c:343
 #, c-format
 msgid "%s reset is not allowed in a bare repository"
-msgstr "不能对裸版本库进行%s重置"
+msgstr "不能对纯版本库进行%s重置"
 
-#: builtin/reset.c:344
+#: builtin/reset.c:347
 msgid "-N can only be used with --mixed"
 msgstr "-N 只能和 --mixed 同时使用"
 
-#: builtin/reset.c:361
+#: builtin/reset.c:364
 msgid "Unstaged changes after reset:"
 msgstr "重置后撤出暂存区的变更:"
 
-#: builtin/reset.c:367
+#: builtin/reset.c:370
 #, c-format
 msgid "Could not reset index file to revision '%s'."
 msgstr "不能重置索引文件至版本 '%s'。"
 
-#: builtin/reset.c:372
+#: builtin/reset.c:374
 msgid "Could not write new index file."
 msgstr "不能写入新的索引文件。"
 
-#: builtin/rev-parse.c:359
+#: builtin/rev-parse.c:361
 msgid "git rev-parse --parseopt [options] -- [<args>...]"
 msgstr "git rev-parse --parseopt [选项] -- [<参数>...]"
 
-#: builtin/rev-parse.c:364
+#: builtin/rev-parse.c:366
 msgid "keep the `--` passed as an arg"
 msgstr "保持 `--` 作为一个参数传递"
 
-#: builtin/rev-parse.c:366
+#: builtin/rev-parse.c:368
 msgid "stop parsing after the first non-option argument"
 msgstr "遇到第一个非选项参数后停止解析"
 
-#: builtin/rev-parse.c:369
+#: builtin/rev-parse.c:371
 msgid "output in stuck long form"
 msgstr "以固定长格式输出"
 
-#: builtin/rev-parse.c:497
+#: builtin/rev-parse.c:499
 msgid ""
 "git rev-parse --parseopt [options] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -8922,10 +9236,10 @@
 "the following submodule (or one of its nested submodules)\n"
 "uses a .git directory:"
 msgid_plural ""
-"the following submodules (or one of its nested submodules)\n"
+"the following submodules (or one of their nested submodules)\n"
 "use a .git directory:"
-msgstr[0] "如下子模组(或一个其嵌套子模组)使用了一个 .git 目录:"
-msgstr[1] "如下子模组(或一个其嵌套子模组)使用了一个 .git 目录:"
+msgstr[0] "以下子模组(或一个其嵌套子模组)使用了一个 .git 目录:"
+msgstr[1] "以下子模组(或一个其嵌套子模组)使用了一个 .git 目录:"
 
 #: builtin/rm.c:71
 msgid ""
@@ -8993,6 +9307,10 @@
 msgid "exit with a zero status even if nothing matched"
 msgstr "即使没有匹配,也以零状态退出"
 
+#: builtin/rm.c:318
+msgid "Please, stage your changes to .gitmodules or stash them to proceed"
+msgstr "请将您的修改缓存到 .gitmodules 中或保存进度后再继续"
+
 #: builtin/rm.c:336
 #, c-format
 msgid "not removing '%s' recursively without -r"
@@ -9176,11 +9494,11 @@
 msgid "shorten ref output"
 msgstr "简短的引用输出"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
 msgid "reason"
 msgstr "原因"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
 msgid "reason of the update"
 msgstr "更新的原因"
 
@@ -9205,322 +9523,325 @@
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <标签名>..."
 
-#: builtin/tag.c:67
+#: builtin/tag.c:69
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "非法的对象于 '%s'"
 
-#: builtin/tag.c:239
+#: builtin/tag.c:301
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "tag 名字太长:%.*s..."
 
-#: builtin/tag.c:244
+#: builtin/tag.c:306
 #, c-format
 msgid "tag '%s' not found."
 msgstr "tag '%s' 未发现。"
 
-#: builtin/tag.c:259
+#: builtin/tag.c:321
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "已删除 tag '%s'(曾为 %s)\n"
 
-#: builtin/tag.c:271
+#: builtin/tag.c:333
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "不能校验 tag '%s'"
 
-#: builtin/tag.c:281
+#: builtin/tag.c:343
 #, c-format
 msgid ""
 "\n"
-"Write a tag message\n"
+"Write a message for tag:\n"
+"  %s\n"
 "Lines starting with '%c' will be ignored.\n"
 msgstr ""
 "\n"
-"输入一个 tag 说明\n"
+"输入一个 tag 说明:\n"
+"  %s\n"
 "以 '%c' 开头的行将被忽略。\n"
 
-#: builtin/tag.c:285
+#: builtin/tag.c:347
 #, c-format
 msgid ""
 "\n"
-"Write a tag message\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"
-"输入一个 tag 说明\n"
+"输入一个 tag 说明:\n"
+"  %s\n"
 "以 '%c' 开头的行将被保留,如果您愿意也可以删除它们。\n"
 
-#: builtin/tag.c:324
+#: 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
 msgid "unable to sign the tag"
 msgstr "无法签署 tag"
 
-#: builtin/tag.c:326
+#: builtin/tag.c:430
 msgid "unable to write tag file"
 msgstr "无法写 tag 文件"
 
-#: builtin/tag.c:351
+#: builtin/tag.c:455
 msgid "bad object type."
 msgstr "坏的对象类型。"
 
-#: builtin/tag.c:364
+#: builtin/tag.c:468
 msgid "tag header too big."
 msgstr "tag 头信息太大。"
 
-#: builtin/tag.c:400
+#: builtin/tag.c:504
 msgid "no tag message?"
 msgstr "无 tag 说明?"
 
-#: builtin/tag.c:406
+#: builtin/tag.c:510
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "tag 说明被保留在 %s\n"
 
-#: builtin/tag.c:455
+#: builtin/tag.c:559
 msgid "switch 'points-at' requires an object"
 msgstr "开关 'points-at' 需要一个对象"
 
-#: builtin/tag.c:457
+#: builtin/tag.c:561
 #, c-format
 msgid "malformed object name '%s'"
 msgstr "非法的对象名 '%s'"
 
-#: builtin/tag.c:480
-#, c-format
-msgid "unsupported sort specification %s"
-msgstr "不支持的排序规格 %s"
-
-#: builtin/tag.c:500
+#: builtin/tag.c:589
 msgid "list tag names"
 msgstr "列出tag名称"
 
-#: builtin/tag.c:502
+#: builtin/tag.c:591
 msgid "print <n> lines of each tag message"
 msgstr "每个 tag 信息打印 <n> 行"
 
-#: builtin/tag.c:504
+#: builtin/tag.c:593
 msgid "delete tags"
 msgstr "删除 tags"
 
-#: builtin/tag.c:505
+#: builtin/tag.c:594
 msgid "verify tags"
 msgstr "验证 tags"
 
-#: builtin/tag.c:507
+#: builtin/tag.c:596
 msgid "Tag creation options"
 msgstr "Tag 创建选项"
 
-#: builtin/tag.c:509
+#: builtin/tag.c:598
 msgid "annotated tag, needs a message"
 msgstr "注解 tag,需要一个说明"
 
-#: builtin/tag.c:511
+#: builtin/tag.c:600
 msgid "tag message"
 msgstr "tag 说明"
 
-#: builtin/tag.c:513
+#: builtin/tag.c:602
 msgid "annotated and GPG-signed tag"
 msgstr "注解并 GPG 签名的 tag"
 
-#: builtin/tag.c:517
+#: builtin/tag.c:606
 msgid "use another key to sign the tag"
 msgstr "使用另外的私钥签名 tag"
 
-#: builtin/tag.c:518
+#: builtin/tag.c:607
 msgid "replace the tag if exists"
 msgstr "如果存在,替换现有的 tag"
 
-#: builtin/tag.c:519
+#: builtin/tag.c:608
 msgid "show tag list in columns"
 msgstr "以列的方式显示 tag"
 
-#: builtin/tag.c:521
+#: builtin/tag.c:610
 msgid "sort tags"
 msgstr "排序 tags"
 
-#: builtin/tag.c:525
+#: builtin/tag.c:614
 msgid "Tag listing options"
 msgstr "Tag 列表选项"
 
-#: builtin/tag.c:528 builtin/tag.c:534
+#: builtin/tag.c:617 builtin/tag.c:623
 msgid "print only tags that contain the commit"
 msgstr "只打印包含提交的tags"
 
-#: builtin/tag.c:540
+#: builtin/tag.c:629
 msgid "print only tags of the object"
 msgstr "只打印tags对象"
 
-#: builtin/tag.c:566
+#: builtin/tag.c:655
 msgid "--column and -n are incompatible"
 msgstr "--column 和 -n 不兼容"
 
-#: builtin/tag.c:578
+#: builtin/tag.c:667
 msgid "--sort and -n are incompatible"
 msgstr "--sort 和 -n 不兼容"
 
-#: builtin/tag.c:585
+#: builtin/tag.c:674
 msgid "-n option is only allowed with -l."
 msgstr "-n 选项只允许和 -l 同时使用。"
 
-#: builtin/tag.c:587
+#: builtin/tag.c:676
 msgid "--contains option is only allowed with -l."
 msgstr "--contains 选项只允许和 -l 同时使用。"
 
-#: builtin/tag.c:589
+#: builtin/tag.c:678
 msgid "--points-at option is only allowed with -l."
 msgstr "--points-at 选项只允许和 -l 同时使用。"
 
-#: builtin/tag.c:597
+#: builtin/tag.c:686
 msgid "only one -F or -m option is allowed."
 msgstr "只允许一个 -F 或 -m 选项。"
 
-#: builtin/tag.c:617
+#: builtin/tag.c:706
 msgid "too many params"
 msgstr "太多参数"
 
-#: builtin/tag.c:623
+#: builtin/tag.c:712
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' 不是一个有效的tag名称。"
 
-#: builtin/tag.c:628
+#: builtin/tag.c:717
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "tag '%s' 已存在"
 
-#: builtin/tag.c:646
-#, c-format
-msgid "%s: cannot lock the ref"
-msgstr "%s:不能锁定引用"
-
-#: builtin/tag.c:648
-#, c-format
-msgid "%s: cannot update the ref"
-msgstr "%s:不能更新引用"
-
-#: builtin/tag.c:650
+#: builtin/tag.c:741
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "已更新tag '%s'(曾为 %s)\n"
 
-#: builtin/unpack-objects.c:483
+#: builtin/unpack-objects.c:489
 msgid "Unpacking objects"
 msgstr "展开对象中"
 
-#: builtin/update-index.c:399
+#: builtin/update-index.c:403
 msgid "git update-index [options] [--] [<file>...]"
 msgstr "git update-index [选项] [--] [<文件>...]"
 
-#: builtin/update-index.c:748
+#: builtin/update-index.c:756
 msgid "continue refresh even when index needs update"
 msgstr "当索引需要更新时继续刷新"
 
-#: builtin/update-index.c:751
+#: builtin/update-index.c:759
 msgid "refresh: ignore submodules"
 msgstr "刷新:忽略子模组"
 
-#: builtin/update-index.c:754
+#: builtin/update-index.c:762
 msgid "do not ignore new files"
 msgstr "不忽略新的文件"
 
-#: builtin/update-index.c:756
+#: builtin/update-index.c:764
 msgid "let files replace directories and vice-versa"
 msgstr "让文件替换目录(反之亦然)"
 
-#: builtin/update-index.c:758
+#: builtin/update-index.c:766
 msgid "notice files missing from worktree"
 msgstr "通知文件从工作区丢失"
 
-#: builtin/update-index.c:760
+#: builtin/update-index.c:768
 msgid "refresh even if index contains unmerged entries"
 msgstr "即使索引区包含未合并的条目也执行刷新"
 
-#: builtin/update-index.c:763
+#: builtin/update-index.c:771
 msgid "refresh stat information"
 msgstr "刷新统计信息"
 
-#: builtin/update-index.c:767
+#: builtin/update-index.c:775
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "类似于 --refresh,但是忽略 assume-unchanged 设置"
 
-#: builtin/update-index.c:771
+#: builtin/update-index.c:779
 msgid "<mode>,<object>,<path>"
 msgstr "<mode>,<object>,<path>"
 
-#: builtin/update-index.c:772
+#: builtin/update-index.c:780
 msgid "add the specified entry to the index"
 msgstr "添加指定的条目到索引区"
 
-#: builtin/update-index.c:776
+#: builtin/update-index.c:784
 msgid "(+/-)x"
 msgstr "(+/-)x"
 
-#: builtin/update-index.c:777
+#: builtin/update-index.c:785
 msgid "override the executable bit of the listed files"
 msgstr "覆盖列表里文件的可执行位"
 
-#: builtin/update-index.c:781
+#: builtin/update-index.c:789
 msgid "mark files as \"not changing\""
 msgstr "把文件标记为 \"没有变更\""
 
-#: builtin/update-index.c:784
+#: builtin/update-index.c:792
 msgid "clear assumed-unchanged bit"
 msgstr "清除 assumed-unchanged 位"
 
-#: builtin/update-index.c:787
+#: builtin/update-index.c:795
 msgid "mark files as \"index-only\""
 msgstr "把文件标记为 \"仅索引\""
 
-#: builtin/update-index.c:790
+#: builtin/update-index.c:798
 msgid "clear skip-worktree bit"
 msgstr "清除 skip-worktree 位"
 
-#: builtin/update-index.c:793
+#: builtin/update-index.c:801
 msgid "add to index only; do not add content to object database"
 msgstr "只添加到索引区;不添加对象到对象库"
 
-#: builtin/update-index.c:795
+#: builtin/update-index.c:803
 msgid "remove named paths even if present in worktree"
 msgstr "即使存在工作区里,也删除路径"
 
-#: builtin/update-index.c:797
+#: builtin/update-index.c:805
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "携带 --stdin:输入的行以 null 字符终止"
 
-#: builtin/update-index.c:799
+#: builtin/update-index.c:807
 msgid "read list of paths to be updated from standard input"
 msgstr "从标准输入中读取需要更新的路径列表"
 
-#: builtin/update-index.c:803
+#: builtin/update-index.c:811
 msgid "add entries from standard input to the index"
 msgstr "从标准输入添加条目到索引区"
 
-#: builtin/update-index.c:807
+#: builtin/update-index.c:815
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr "为指定文件重新生成第2和第3暂存区"
 
-#: builtin/update-index.c:811
+#: builtin/update-index.c:819
 msgid "only update entries that differ from HEAD"
 msgstr "只更新与 HEAD 不同的条目"
 
-#: builtin/update-index.c:815
+#: builtin/update-index.c:823
 msgid "ignore files missing from worktree"
 msgstr "忽略工作区丢失的文件"
 
-#: builtin/update-index.c:818
+#: builtin/update-index.c:826
 msgid "report actions to standard output"
 msgstr "在标准输出显示操作"
 
-#: builtin/update-index.c:820
+#: builtin/update-index.c:828
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(for porcelains) 忘记保存的未解决的冲突"
 
-#: builtin/update-index.c:824
+#: builtin/update-index.c:832
 msgid "write index in this format"
 msgstr "以这种格式写入索引区"
 
+#: builtin/update-index.c:834
+msgid "enable or disable split index"
+msgstr "启用或禁用索引拆分"
+
 #: builtin/update-ref.c:9
 msgid "git update-ref [options] -d <refname> [<oldval>]"
 msgstr "git update-ref [选项] -d <引用名> [<旧值>]"
@@ -9533,19 +9854,19 @@
 msgid "git update-ref [options] --stdin [-z]"
 msgstr "git update-ref [选项] --stdin [-z]"
 
-#: builtin/update-ref.c:256
+#: builtin/update-ref.c:363
 msgid "delete the reference"
 msgstr "删除引用"
 
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:365
 msgid "update <refname> not the one it points to"
 msgstr "更新 <引用名> 本身而不是它指向的引用"
 
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:366
 msgid "stdin has NUL-terminated arguments"
 msgstr "标准输入有以 NUL 字符终止的参数"
 
-#: builtin/update-ref.c:260
+#: builtin/update-ref.c:367
 msgid "read updates from stdin"
 msgstr "从标准输入读取更新"
 
@@ -9557,15 +9878,23 @@
 msgid "update the info files from scratch"
 msgstr "从头开始更新文件信息"
 
-#: builtin/verify-pack.c:56
+#: builtin/verify-commit.c:17
+msgid "git verify-commit [-v|--verbose] <commit>..."
+msgstr "git verify-commit [-v|--verbose] <提交>..."
+
+#: builtin/verify-commit.c:75
+msgid "print commit contents"
+msgstr "打印提交内容"
+
+#: builtin/verify-pack.c:54
 msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."
 msgstr "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."
 
-#: builtin/verify-pack.c:66
+#: builtin/verify-pack.c:64
 msgid "verbose"
 msgstr "冗长输出"
 
-#: builtin/verify-pack.c:68
+#: builtin/verify-pack.c:66
 msgid "show statistics only"
 msgstr "只显示统计"
 
@@ -9593,34 +9922,19 @@
 msgid "only useful for debugging"
 msgstr "只对调试有用"
 
+#: credential-cache--daemon.c:267
+msgid "print debugging messages to stderr"
+msgstr "调试信息输出到标准错误"
+
 #: git.c:17
 msgid ""
-"'git help -a' and 'git help -g' lists available subcommands and some\n"
+"'git help -a' and 'git help -g' list available subcommands and some\n"
 "concept guides. See 'git help <command>' or 'git help <concept>'\n"
 "to read about a specific subcommand or concept."
 msgstr ""
-"命令 'git help -a' 和 'git help -g' 显示可用的子命令和一些指南。参见\n"
-"'git help <命令>' 或 'git help <指南>' 来查看给定的子命令帮助或指南。"
-
-#: parse-options.h:143
-msgid "expiry-date"
-msgstr "逾期日期"
-
-#: parse-options.h:158
-msgid "no-op (backward compatibility)"
-msgstr "空操作(向后兼容)"
-
-#: parse-options.h:232
-msgid "be more verbose"
-msgstr "更加详细"
-
-#: parse-options.h:234
-msgid "be more quiet"
-msgstr "更加安静"
-
-#: parse-options.h:240
-msgid "use <n> digits to display SHA-1s"
-msgstr "用 <n> 位数字显示 SHA-1 哈希值"
+"命令 'git help -a' 和 'git help -g' 显示可用的子命令和一些概念帮助。\n"
+"查看 'git help <命令>' 或 'git help <概念>' 以获取给定子命令或概念的\n"
+"帮助。"
 
 #: common-cmds.h:8
 msgid "Add file contents to the index"
@@ -9706,6 +10020,30 @@
 msgid "Create, list, delete or verify a tag object signed with GPG"
 msgstr "创建、列出、删除或校验一个GPG签名的 tag 对象"
 
+#: parse-options.h:143
+msgid "expiry-date"
+msgstr "到期时间"
+
+#: parse-options.h:158
+msgid "no-op (backward compatibility)"
+msgstr "空操作(向后兼容)"
+
+#: parse-options.h:232
+msgid "be more verbose"
+msgstr "更加详细"
+
+#: parse-options.h:234
+msgid "be more quiet"
+msgstr "更加安静"
+
+#: parse-options.h:240
+msgid "use <n> digits to display SHA-1s"
+msgstr "用 <n> 位数字显示 SHA-1 哈希值"
+
+#: rerere.h:27
+msgid "update the index with reused conflict resolution if possible"
+msgstr "如果可能,重用冲突解决更新索引"
+
 #: git-am.sh:52
 msgid "You need to set your committer info first"
 msgstr "您需要先设置你的提交者信息"
@@ -9954,21 +10292,21 @@
 
 #: git-bisect.sh:289
 msgid ""
-"You need to give me at least one good and one bad revisions.\n"
+"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.)"
 msgstr ""
 "您需要给我至少一个好版本和一个坏版本。\n"
-"(您可以用 \"git bisect bad\" 和 \"git bisect good\" 命令来标识。)"
+"(为此您可以用 \"git bisect bad\" 和 \"git bisect good\" 命令。)"
 
 #: git-bisect.sh:292
 msgid ""
 "You need to start by \"git bisect start\".\n"
-"You then need to give me at least one good and one bad revisions.\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.)"
 msgstr ""
 "您需要执行 \"git bisect start\" 来开始。\n"
 "然后需要提供我至少一个好版本和一个坏版本。\n"
-"(您可以用 \"git bisect bad\" 和 \"git bisect good\" 命令来标识。)"
+"(为此您可以用 \"git bisect bad\" 和 \"git bisect good\" 命令。)"
 
 #: git-bisect.sh:363 git-bisect.sh:490
 msgid "We are not bisecting."
@@ -10036,21 +10374,28 @@
 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, or use 'git commit -a'."
+"as appropriate to mark resolution and make a commit."
 msgstr ""
 "Pull 不可用,因为您尚有未合并的文件。请先在工作区改正文件,\n"
-"然后酌情使用 'git add/rm <file>' 标记解决方案,\n"
-"或者使用 'git commit -a'。"
+"然后酌情使用 'git add/rm <file>' 标记解决方案,再做提交。"
 
 #: git-pull.sh:25
 msgid "Pull is not possible because you have unmerged files."
 msgstr "Pull 不可用,因为您尚有未合并的文件。"
 
-#: git-pull.sh:247
+#: git-pull.sh:31
+msgid ""
+"You have not concluded your merge (MERGE_HEAD exists).\n"
+"Please, commit your changes before you can merge."
+msgstr ""
+"您尚未结束您的合并(存在 MERGE_HEAD)。\n"
+"请在合并前先提交您的修改。"
+
+#: git-pull.sh:245
 msgid "updating an unborn branch with changes added to the index"
 msgstr "更新尚未诞生的分支,变更添加至索引"
 
-#: git-pull.sh:271
+#: git-pull.sh:269
 #, sh-format
 msgid ""
 "Warning: fetch updated the current branch head.\n"
@@ -10060,11 +10405,11 @@
 "警告:fetch 更新了当前的分支。您的工作区\n"
 "警告:从原提交 $orig_head 快进。"
 
-#: git-pull.sh:296
+#: git-pull.sh:294
 msgid "Cannot merge multiple branches into empty head"
 msgstr "无法将多个分支合并到空分支"
 
-#: git-pull.sh:300
+#: git-pull.sh:298
 msgid "Cannot rebase onto multiple branches"
 msgstr "无法变基到多个分支"
 
@@ -10079,16 +10424,16 @@
 "如果您想跳过此补丁,则执行 \"git rebase --skip\"。\n"
 "要恢复原分支并停止变基,执行 \"git rebase --abort\"。"
 
-#: git-rebase.sh:164
+#: git-rebase.sh:165
 msgid "Applied autostash."
 msgstr "成功应用 autostash。"
 
-#: git-rebase.sh:167
+#: git-rebase.sh:168
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "无法保存 $stash_sha1"
 
-#: git-rebase.sh:168
+#: git-rebase.sh:169
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
@@ -10098,31 +10443,31 @@
 "您的修改安全地保存在 stash 中。\n"
 "您可以在任何时候运行 \"git stash pop\" 或 \"git stash drop\"。\n"
 
-#: git-rebase.sh:207
+#: git-rebase.sh:208
 msgid "The pre-rebase hook refused to rebase."
 msgstr "钩子 pre-rebase 拒绝变基操作。"
 
-#: git-rebase.sh:212
+#: git-rebase.sh:213
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "似乎正处于在 git-am 的执行过程中。无法变基。"
 
-#: git-rebase.sh:350
+#: git-rebase.sh:351
 msgid "The --exec option must be used with the --interactive option"
 msgstr "选项 --exec 必须和选项 --interactive 同时使用"
 
-#: git-rebase.sh:355
+#: git-rebase.sh:356
 msgid "No rebase in progress?"
 msgstr "没有正在进行的变基?"
 
-#: git-rebase.sh:366
+#: git-rebase.sh:367
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr "动作 --edit-todo 只能用在交互式变基过程中。"
 
-#: git-rebase.sh:373
+#: git-rebase.sh:374
 msgid "Cannot read HEAD"
 msgstr "不能读取 HEAD"
 
-#: git-rebase.sh:376
+#: git-rebase.sh:377
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -10130,12 +10475,12 @@
 "您必须编辑所有的合并冲突,然后通过 git add\n"
 "命令将它们标记为已解决"
 
-#: git-rebase.sh:394
+#: git-rebase.sh:395
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "无法移回 $head_name"
 
-#: git-rebase.sh:413
+#: git-rebase.sh:414
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -10154,64 +10499,64 @@
 "\t$cmd_clear_stale_rebase\n"
 "然后再重新执行变基操作。 为避免丢失重要数据,我已经停止当前操作。"
 
-#: git-rebase.sh:464
+#: git-rebase.sh:465
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "无效的上游 $upstream_name"
 
-#: git-rebase.sh:488
+#: git-rebase.sh:489
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: 有一个以上的合并基准"
 
-#: git-rebase.sh:491 git-rebase.sh:495
+#: git-rebase.sh:492 git-rebase.sh:496
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: 没有合并基准"
 
-#: git-rebase.sh:500
+#: git-rebase.sh:501
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "没有指向一个有效的提交:$onto_name"
 
-#: git-rebase.sh:523
+#: git-rebase.sh:524
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "严重错误:无此分支:$branch_name"
 
-#: git-rebase.sh:556
+#: git-rebase.sh:557
 msgid "Cannot autostash"
 msgstr "无法 autostash"
 
-#: git-rebase.sh:561
+#: git-rebase.sh:562
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "创建了 autostash: $stash_abbrev"
 
-#: git-rebase.sh:565
+#: git-rebase.sh:566
 msgid "Please commit or stash them."
 msgstr "请提交或为它们保存进度。"
 
-#: git-rebase.sh:585
+#: git-rebase.sh:586
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "当前分支 $branch_name 是最新的。"
 
-#: git-rebase.sh:589
+#: git-rebase.sh:590
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "当前分支 $branch_name 是最新的,强制变基。"
 
-#: git-rebase.sh:600
+#: git-rebase.sh:601
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "变更从 $mb 到 $onto:"
 
-#: git-rebase.sh:609
+#: git-rebase.sh:610
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr "首先,重置头指针以便在上面重放您的工作..."
 
-#: git-rebase.sh:619
+#: git-rebase.sh:620
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "快进 $branch_name 至 $onto_name。"
@@ -10228,23 +10573,23 @@
 msgid "Cannot save the current index state"
 msgstr "无法保存当前索引状态"
 
-#: git-stash.sh:123 git-stash.sh:136
+#: git-stash.sh:124 git-stash.sh:137
 msgid "Cannot save the current worktree state"
 msgstr "无法保存当前工作区状态"
 
-#: git-stash.sh:140
+#: git-stash.sh:141
 msgid "No changes selected"
 msgstr "没有选择变更"
 
-#: git-stash.sh:143
+#: git-stash.sh:144
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "无法删除临时索引(不应发生)"
 
-#: git-stash.sh:156
+#: git-stash.sh:157
 msgid "Cannot record working tree state"
 msgstr "不能记录工作区状态"
 
-#: git-stash.sh:190
+#: git-stash.sh:191
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "无法用 $w_commit 更新 $ref_stash"
@@ -10259,7 +10604,7 @@
 #. $ 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:237
+#: git-stash.sh:238
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -10268,85 +10613,85 @@
 "错误:'stash save' 的未知选项:$option\n"
 "      要提供一个描述信息,使用 git stash save -- '$option'"
 
-#: git-stash.sh:258
+#: git-stash.sh:259
 msgid "No local changes to save"
 msgstr "没有要保存的本地修改"
 
-#: git-stash.sh:262
+#: git-stash.sh:263
 msgid "Cannot initialize stash"
 msgstr "无法初始化 stash"
 
-#: git-stash.sh:266
+#: git-stash.sh:267
 msgid "Cannot save the current status"
 msgstr "无法保存当前状态"
 
-#: git-stash.sh:284
+#: git-stash.sh:285
 msgid "Cannot remove worktree changes"
 msgstr "无法删除工作区变更"
 
-#: git-stash.sh:383
+#: git-stash.sh:384
 msgid "No stash found."
 msgstr "未发现 stash。"
 
-#: git-stash.sh:390
+#: git-stash.sh:391
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "指定了太多的版本:$REV"
 
-#: git-stash.sh:396
+#: git-stash.sh:397
 #, sh-format
-msgid "$reference is not valid reference"
-msgstr "$reference 不是有效的引用"
+msgid "$reference is not a valid reference"
+msgstr "$reference 不是一个有效的引用"
 
-#: git-stash.sh:424
+#: git-stash.sh:425
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' 不是 stash 样提交"
 
-#: git-stash.sh:435
+#: git-stash.sh:436
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' 不是一个 stash 引用"
 
-#: git-stash.sh:443
+#: git-stash.sh:444
 msgid "unable to refresh index"
 msgstr "无法刷新索引"
 
-#: git-stash.sh:447
+#: git-stash.sh:448
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "无法在合并过程中恢复进度"
 
-#: git-stash.sh:455
+#: git-stash.sh:456
 msgid "Conflicts in index. Try without --index."
 msgstr "索引中有冲突。尝试不使用 --index。"
 
-#: git-stash.sh:457
+#: git-stash.sh:458
 msgid "Could not save index tree"
 msgstr "不能保存索引树"
 
-#: git-stash.sh:491
+#: git-stash.sh:492
 msgid "Cannot unstage modified files"
 msgstr "无法还原修改的文件"
 
-#: git-stash.sh:506
+#: git-stash.sh:507
 msgid "Index was not unstashed."
 msgstr "索引的进度没有被恢复。"
 
-#: git-stash.sh:529
+#: git-stash.sh:530
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "丢弃了 ${REV} ($s)"
 
-#: git-stash.sh:530
+#: git-stash.sh:531
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}:不能丢弃进度条目"
 
-#: git-stash.sh:537
+#: git-stash.sh:539
 msgid "No branch name specified"
 msgstr "未指定分支名"
 
-#: git-stash.sh:609
+#: git-stash.sh:611
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(为恢复数据输入 \"git stash apply\")"
 
@@ -10365,26 +10710,26 @@
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
 msgstr "无法克隆 '$url' 到子模组路径 '$sm_path'"
 
-#: git-submodule.sh:299
+#: 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:409
+#: git-submodule.sh:406
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr "只能在工作区的顶级目录中使用相对路径"
 
-#: git-submodule.sh:419
+#: git-submodule.sh:416
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "版本库URL:'$repo' 必须是绝对路径或以 ./|../ 起始"
 
-#: git-submodule.sh:436
+#: git-submodule.sh:433
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' 已经存在于索引中"
 
-#: git-submodule.sh:440
+#: git-submodule.sh:437
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -10395,134 +10740,134 @@
 "$sm_path\n"
 "如果您确实想添加它,使用 -f 参数。"
 
-#: git-submodule.sh:458
+#: git-submodule.sh:455
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "添加位于 '$sm_path' 的现存版本库到索引"
 
-#: git-submodule.sh:460
+#: git-submodule.sh:457
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path' 已存在且不是一个有效的 git 版本库"
 
-#: git-submodule.sh:468
+#: git-submodule.sh:465
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr "本地发现 '$sm_name' 的一个 git 目录,与其对应的远程版本库:"
 
-#: git-submodule.sh:470
+#: git-submodule.sh:467
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
 msgstr "如果您想重用此本地 git 目录而不是重新克隆自"
 
-#: git-submodule.sh:472
+#: git-submodule.sh:469
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
 msgstr "使用 '--force' 参数。如果本地 git 目录不是正确的版本库"
 
-#: git-submodule.sh:473
+#: git-submodule.sh:470
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
 "option."
 msgstr "或者您不确定其中含义使用 '--name' 参数选择另外一个名称。"
 
-#: git-submodule.sh:475
+#: git-submodule.sh:472
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "激活本地 git 目录到子模组 '$sm_name'。"
 
-#: git-submodule.sh:487
+#: git-submodule.sh:484
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "不能检出子模组 '$sm_path'"
 
-#: git-submodule.sh:492
+#: git-submodule.sh:489
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "无法添加子模组 '$sm_path'"
 
-#: git-submodule.sh:501
+#: git-submodule.sh:498
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "无法注册子模组 '$sm_path'"
 
-#: git-submodule.sh:545
+#: git-submodule.sh:542
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "正在进入 '$prefix$displaypath'"
 
-#: git-submodule.sh:565
+#: git-submodule.sh:562
 #, sh-format
 msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
 msgstr "停止于 '$prefix$displaypath',脚本返回非零值。"
 
-#: git-submodule.sh:611
+#: git-submodule.sh:608
 #, sh-format
 msgid "No url found for submodule path '$displaypath' in .gitmodules"
 msgstr "在 .gitmodules 中未找到子模组路径 '$displaypath' 的 url"
 
-#: git-submodule.sh:620
+#: git-submodule.sh:617
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
 msgstr "无法为子模组路径 '$displaypath' 注册 url"
 
-#: git-submodule.sh:622
+#: git-submodule.sh:619
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr "子模组 '$name' ($url) 未对路径 '$displaypath' 注册"
 
-#: git-submodule.sh:639
+#: git-submodule.sh:636
 #, sh-format
 msgid "Failed to register update mode for submodule path '$displaypath'"
 msgstr "无法为子模组路径 '$displaypath' 注册更新模式"
 
-#: git-submodule.sh:677
+#: git-submodule.sh:674
 #, sh-format
 msgid "Use '.' if you really want to deinitialize all submodules"
 msgstr "使用 '.' 如果您真的想要对所有子模组取消初始化"
 
-#: git-submodule.sh:694
+#: git-submodule.sh:691
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr "子模组工作区 '$displaypath' 包含一个 .git 目录"
 
-#: git-submodule.sh:695
+#: git-submodule.sh:692
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr "(使用 'rm -rf' 命令如果您真的想删除它及其全部历史)"
 
-#: git-submodule.sh:701
+#: git-submodule.sh:698
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
 "discard them"
 msgstr "子模组工作区 '$displaypath' 包含本地修改;使用 '-f' 丢弃它们"
 
-#: git-submodule.sh:704
+#: git-submodule.sh:701
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "已清除目录 '$displaypath'"
 
-#: git-submodule.sh:705
+#: git-submodule.sh:702
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "无法移除子模组工作区 '$displaypath'"
 
-#: git-submodule.sh:708
+#: git-submodule.sh:705
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "不能创建空的子模组目录 '$displaypath'"
 
-#: git-submodule.sh:717
+#: git-submodule.sh:714
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr "子模组 '$name' ($url) 未对路径 '$displaypath' 注册"
 
-#: git-submodule.sh:833
+#: git-submodule.sh:830
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
@@ -10531,108 +10876,144 @@
 "子模组路径 '$displaypath' 没有初始化\n"
 "也许您想用 'update --init'?"
 
-#: git-submodule.sh:846
+#: git-submodule.sh:843
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中找到当前版本"
 
-#: git-submodule.sh:855
+#: git-submodule.sh:852
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "无法在子模组路径 '$sm_path' 中获取"
 
-#: git-submodule.sh:879
+#: git-submodule.sh:876
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中获取"
 
-#: git-submodule.sh:893
+#: git-submodule.sh:890
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中检出 '$sha1'"
 
-#: git-submodule.sh:894
+#: git-submodule.sh:891
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "子模组路径 '$displaypath':检出 '$sha1'"
 
-#: git-submodule.sh:898
+#: git-submodule.sh:895
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中变基 '$sha1'"
 
-#: git-submodule.sh:899
+#: git-submodule.sh:896
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "子模组路径 '$displaypath':变基至 '$sha1'"
 
-#: git-submodule.sh:904
+#: git-submodule.sh:901
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "无法合并 '$sha1' 到子模组路径 '$displaypath' 中"
 
-#: git-submodule.sh:905
+#: git-submodule.sh:902
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "子模组路径 '$displaypath':已合并入 '$sha1'"
 
-#: git-submodule.sh:910
+#: git-submodule.sh:907
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule  path '$prefix$sm_path'"
 msgstr "在子模组路径 '$prefix$sm_path' 中执行 '$command $sha1' 失败"
 
-#: git-submodule.sh:911
+#: git-submodule.sh:908
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr "子模组路径 '$prefix$sm_path': '$command $sha1'"
 
-#: git-submodule.sh:941
+#: git-submodule.sh:938
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "无法递归进子模组路径 '$displaypath'"
 
-#: git-submodule.sh:1049
+#: git-submodule.sh:1046
 msgid "The --cached option cannot be used with the --files option"
 msgstr "选项 --cached 不能和选项 --files 同时使用"
 
-#: git-submodule.sh:1097
+#: git-submodule.sh:1098
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "意外的模式 $mod_dst"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:1117
+#: git-submodule.sh:1118
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  警告:$display_name 未包含提交 $sha1_src"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:1120
+#: git-submodule.sh:1121
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  警告:$display_name 未包含提交 $sha1_dst"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:1123
+#: git-submodule.sh:1124
 #, 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:1148
+#: git-submodule.sh:1149
 msgid "blob"
 msgstr "数据对象"
 
-#: git-submodule.sh:1262
+#: git-submodule.sh:1267
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "无法递归进子模组路径 '$sm_path'"
 
-#: git-submodule.sh:1326
+#: git-submodule.sh:1331
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "为 '$displaypath' 同步子模组 url"
 
+#~ msgid "Failed to lock ref for update"
+#~ msgstr "无法为更新锁定引用"
+
+#~ msgid "Failed to write ref"
+#~ msgstr "不能写引用"
+
+#~ msgid "Failed to lock HEAD during fast_forward_to"
+#~ msgstr "在快进时无法为 HEAD 加锁"
+
+#~ msgid "invalid commit: %s"
+#~ msgstr "无效的提交:%s"
+
+#~ msgid "cannot lock HEAD ref"
+#~ msgstr "无法锁定 HEAD 引用"
+
+#~ msgid "cannot update HEAD ref"
+#~ msgstr "无法更新 HEAD 引用"
+
+#~ msgid "Invalid %s: '%s'"
+#~ msgstr "无效的 %s:'%s'"
+
+#~ msgid "cannot tell cwd"
+#~ msgstr "无法获知当前路径"
+
+#~ msgid "%s: cannot lock the ref"
+#~ msgstr "%s:不能锁定引用"
+
+#~ msgid "%s: cannot update the ref"
+#~ msgstr "%s:不能更新引用"
+
+#~ msgid "commit has empty message"
+#~ msgstr "提交说明为空"
+
+#~ msgid "Failed to chdir: %s"
+#~ msgstr "无法切换目录:%s"
+
 #~ msgid "key id"
 #~ msgstr "key id"
 
diff --git a/preload-index.c b/preload-index.c
index 968ee25..c1fe3a3 100644
--- a/preload-index.c
+++ b/preload-index.c
@@ -37,9 +37,8 @@
 	struct thread_data *p = _data;
 	struct index_state *index = p->index;
 	struct cache_entry **cep = index->cache + p->offset;
-	struct cache_def cache;
+	struct cache_def cache = CACHE_DEF_INIT;
 
-	memset(&cache, 0, sizeof(cache));
 	nr = p->nr;
 	if (nr + p->offset > index->cache_nr)
 		nr = index->cache_nr - p->offset;
@@ -64,6 +63,7 @@
 			continue;
 		ce_mark_uptodate(ce);
 	} while (--nr > 0);
+	cache_def_clear(&cache);
 	return NULL;
 }
 
diff --git a/pretty.c b/pretty.c
index f3e8b6c..9d34d02 100644
--- a/pretty.c
+++ b/pretty.c
@@ -24,6 +24,11 @@
 static size_t commit_formats_alloc;
 static struct cmt_fmt_map *find_commit_format(const char *sought);
 
+int commit_format_is_empty(enum cmit_fmt fmt)
+{
+	return fmt == CMIT_FMT_USERFORMAT && !*user_format;
+}
+
 static void save_user_format(struct rev_info *rev, const char *cp, int is_tformat)
 {
 	free(user_format);
@@ -40,10 +45,9 @@
 	const char *fmt;
 	int i;
 
-	if (!starts_with(var, "pretty."))
+	if (!skip_prefix(var, "pretty.", &name))
 		return 0;
 
-	name = var + strlen("pretty.");
 	for (i = 0; i < builtin_formats_len; i++) {
 		if (!strcmp(commit_formats[i].name, name))
 			return 0;
@@ -66,11 +70,12 @@
 
 	commit_format->name = xstrdup(name);
 	commit_format->format = CMIT_FMT_USERFORMAT;
-	git_config_string(&fmt, var, value);
-	if (starts_with(fmt, "format:") || starts_with(fmt, "tformat:")) {
-		commit_format->is_tformat = fmt[0] == 't';
-		fmt = strchr(fmt, ':') + 1;
-	} else if (strchr(fmt, '%'))
+	if (git_config_string(&fmt, var, value))
+		return -1;
+
+	if (skip_prefix(fmt, "format:", &fmt))
+		commit_format->is_tformat = 0;
+	else if (skip_prefix(fmt, "tformat:", &fmt) || strchr(fmt, '%'))
 		commit_format->is_tformat = 1;
 	else
 		commit_format->is_alias = 1;
@@ -147,16 +152,16 @@
 	struct cmt_fmt_map *commit_format;
 
 	rev->use_terminator = 0;
-	if (!arg || !*arg) {
+	if (!arg) {
 		rev->commit_format = CMIT_FMT_DEFAULT;
 		return;
 	}
-	if (starts_with(arg, "format:") || starts_with(arg, "tformat:")) {
-		save_user_format(rev, strchr(arg, ':') + 1, arg[0] == 't');
+	if (skip_prefix(arg, "format:", &arg)) {
+		save_user_format(rev, arg, 0);
 		return;
 	}
 
-	if (strchr(arg, '%')) {
+	if (!*arg || skip_prefix(arg, "tformat:", &arg) || strchr(arg, '%')) {
 		save_user_format(rev, arg, 1);
 		return;
 	}
@@ -393,8 +398,8 @@
 	strbuf_addstr(sb, "?=");
 }
 
-static const char *show_ident_date(const struct ident_split *ident,
-				   enum date_mode mode)
+const char *show_ident_date(const struct ident_split *ident,
+			    enum date_mode mode)
 {
 	unsigned long date = 0;
 	long tz = 0;
@@ -548,31 +553,11 @@
 	strbuf_addch(sb, '\n');
 }
 
-static char *get_header(const struct commit *commit, const char *msg,
-			const char *key)
+static char *get_header(const char *msg, const char *key)
 {
-	int key_len = strlen(key);
-	const char *line = msg;
-
-	while (line) {
-		const char *eol = strchrnul(line, '\n'), *next;
-
-		if (line == eol)
-			return NULL;
-		if (!*eol) {
-			warning("malformed commit (header is missing newline): %s",
-				sha1_to_hex(commit->object.sha1));
-			next = NULL;
-		} else
-			next = eol + 1;
-		if (eol - line > key_len &&
-		    !strncmp(line, key, key_len) &&
-		    line[key_len] == ' ') {
-			return xmemdupz(line + key_len + 1, eol - line - key_len - 1);
-		}
-		line = next;
-	}
-	return NULL;
+	size_t len;
+	const char *v = find_commit_header(msg, key, &len);
+	return v ? xmemdupz(v, len) : NULL;
 }
 
 static char *replace_encoding_header(char *buf, const char *encoding)
@@ -618,11 +603,10 @@
 
 	if (!output_encoding || !*output_encoding) {
 		if (commit_encoding)
-			*commit_encoding =
-				get_header(commit, msg, "encoding");
+			*commit_encoding = get_header(msg, "encoding");
 		return msg;
 	}
-	encoding = get_header(commit, msg, "encoding");
+	encoding = get_header(msg, "encoding");
 	if (commit_encoding)
 		*commit_encoding = encoding;
 	use_encoding = encoding ? encoding : utf8;
@@ -732,9 +716,12 @@
 	case 'r':	/* date, relative */
 		strbuf_addstr(sb, show_ident_date(&s, DATE_RELATIVE));
 		return placeholder_len;
-	case 'i':	/* date, ISO 8601 */
+	case 'i':	/* date, ISO 8601-like */
 		strbuf_addstr(sb, show_ident_date(&s, DATE_ISO8601));
 		return placeholder_len;
+	case 'I':	/* date, ISO 8601 strict */
+		strbuf_addstr(sb, show_ident_date(&s, DATE_ISO8601_STRICT));
+		return placeholder_len;
 	}
 
 skip:
@@ -821,18 +808,19 @@
 	int i;
 
 	for (i = 0; msg[i]; i++) {
+		const char *name;
 		int eol;
 		for (eol = i; msg[eol] && msg[eol] != '\n'; eol++)
 			; /* do nothing */
 
 		if (i == eol) {
 			break;
-		} else if (starts_with(msg + i, "author ")) {
-			context->author.off = i + 7;
-			context->author.len = eol - i - 7;
-		} else if (starts_with(msg + i, "committer ")) {
-			context->committer.off = i + 10;
-			context->committer.len = eol - i - 10;
+		} else if (skip_prefix(msg + i, "author ", &name)) {
+			context->author.off = name - msg;
+			context->author.len = msg + eol - name;
+		} else if (skip_prefix(msg + i, "committer ", &name)) {
+			context->committer.off = name - msg;
+			context->committer.len = msg + eol - name;
 		}
 		i = eol;
 	}
@@ -963,6 +951,8 @@
 			  const char *placeholder,
 			  struct format_commit_context *c)
 {
+	const char *rest = placeholder;
+
 	if (placeholder[1] == '(') {
 		const char *begin = placeholder + 2;
 		const char *end = strchr(begin, ')');
@@ -970,31 +960,24 @@
 
 		if (!end)
 			return 0;
-		if (starts_with(begin, "auto,")) {
+		if (skip_prefix(begin, "auto,", &begin)) {
 			if (!want_color(c->pretty_ctx->color))
 				return end - placeholder + 1;
-			begin += 5;
 		}
-		color_parse_mem(begin,
-				end - begin,
-				"--pretty format", color);
+		if (color_parse_mem(begin, end - begin, color) < 0)
+			die(_("unable to parse --pretty format"));
 		strbuf_addstr(sb, color);
 		return end - placeholder + 1;
 	}
-	if (starts_with(placeholder + 1, "red")) {
+	if (skip_prefix(placeholder + 1, "red", &rest))
 		strbuf_addstr(sb, GIT_COLOR_RED);
-		return 4;
-	} else if (starts_with(placeholder + 1, "green")) {
+	else if (skip_prefix(placeholder + 1, "green", &rest))
 		strbuf_addstr(sb, GIT_COLOR_GREEN);
-		return 6;
-	} else if (starts_with(placeholder + 1, "blue")) {
+	else if (skip_prefix(placeholder + 1, "blue", &rest))
 		strbuf_addstr(sb, GIT_COLOR_BLUE);
-		return 5;
-	} else if (starts_with(placeholder + 1, "reset")) {
+	else if (skip_prefix(placeholder + 1, "reset", &rest))
 		strbuf_addstr(sb, GIT_COLOR_RESET);
-		return 6;
-	} else
-		return 0;
+	return rest - placeholder;
 }
 
 static size_t parse_padding_placeholder(struct strbuf *sb,
@@ -1191,6 +1174,10 @@
 		load_ref_decorations(DECORATE_SHORT_REFS);
 		format_decorations(sb, commit, c->auto_color);
 		return 1;
+	case 'D':
+		load_ref_decorations(DECORATE_SHORT_REFS);
+		format_decorations_extended(sb, commit, c->auto_color, "", ", ", "");
+		return 1;
 	case 'g':		/* reflog info */
 		switch(placeholder[1]) {
 		case 'd':	/* reflog selector */
@@ -1377,7 +1364,7 @@
 		case trunc_none:
 			break;
 		}
-		strbuf_addstr(sb, local_sb.buf);
+		strbuf_addbuf(sb, &local_sb);
 	} else {
 		int sb_len = sb->len, offset = 0;
 		if (c->flush_type == flush_left)
@@ -1389,9 +1376,7 @@
 		 * convert it back to chars
 		 */
 		padding = padding - len + local_sb.len;
-		strbuf_grow(sb, padding);
-		strbuf_setlen(sb, sb_len + padding);
-		memset(sb->buf + sb_len, ' ', sb->len - sb_len);
+		strbuf_addchars(sb, ' ', padding);
 		memcpy(sb->buf + sb_len + offset, local_sb.buf,
 		       local_sb.len);
 	}
@@ -1521,8 +1506,6 @@
 
 	free(context.commit_encoding);
 	unuse_commit_buffer(commit, context.message);
-	free(context.signature_check.gpg_output);
-	free(context.signature_check.signer);
 }
 
 static void pp_header(struct pretty_print_context *pp,
@@ -1534,7 +1517,7 @@
 	int parents_shown = 0;
 
 	for (;;) {
-		const char *line = *msg_p;
+		const char *name, *line = *msg_p;
 		int linelen = get_one_line(*msg_p);
 
 		if (!linelen)
@@ -1557,12 +1540,7 @@
 		}
 
 		if (!parents_shown) {
-			struct commit_list *parent;
-			int num;
-			for (parent = commit->parents, num = 0;
-			     parent;
-			     parent = parent->next, num++)
-				;
+			unsigned num = commit_list_count(commit->parents);
 			/* with enough slop */
 			strbuf_grow(sb, num * 50 + 20);
 			add_merge_info(pp, sb, commit);
@@ -1574,14 +1552,14 @@
 		 * FULL shows both authors but not dates.
 		 * FULLER shows both authors and dates.
 		 */
-		if (starts_with(line, "author ")) {
+		if (skip_prefix(line, "author ", &name)) {
 			strbuf_grow(sb, linelen + 80);
-			pp_user_info(pp, "Author", sb, line + 7, encoding);
+			pp_user_info(pp, "Author", sb, name, encoding);
 		}
-		if (starts_with(line, "committer ") &&
+		if (skip_prefix(line, "committer ", &name) &&
 		    (pp->fmt == CMIT_FMT_FULL || pp->fmt == CMIT_FMT_FULLER)) {
 			strbuf_grow(sb, linelen + 80);
-			pp_user_info(pp, "Commit", sb, line + 10, encoding);
+			pp_user_info(pp, "Commit", sb, name, encoding);
 		}
 	}
 }
@@ -1673,10 +1651,8 @@
 		first = 0;
 
 		strbuf_grow(sb, linelen + indent + 20);
-		if (indent) {
-			memset(sb->buf + sb->len, ' ', indent);
-			strbuf_setlen(sb, sb->len + indent);
-		}
+		if (indent)
+			strbuf_addchars(sb, ' ', indent);
 		strbuf_add(sb, line, linelen);
 		strbuf_addch(sb, '\n');
 	}
diff --git a/prio-queue.c b/prio-queue.c
index c9f8c6d..e4365b0 100644
--- a/prio-queue.c
+++ b/prio-queue.c
@@ -1,18 +1,30 @@
 #include "cache.h"
-#include "commit.h"
 #include "prio-queue.h"
 
+static inline int compare(struct prio_queue *queue, int i, int j)
+{
+	int cmp = queue->compare(queue->array[i].data, queue->array[j].data,
+				 queue->cb_data);
+	if (!cmp)
+		cmp = queue->array[i].ctr - queue->array[j].ctr;
+	return cmp;
+}
+
+static inline void swap(struct prio_queue *queue, int i, int j)
+{
+	struct prio_queue_entry tmp = queue->array[i];
+	queue->array[i] = queue->array[j];
+	queue->array[j] = tmp;
+}
+
 void prio_queue_reverse(struct prio_queue *queue)
 {
 	int i, j;
 
 	if (queue->compare != NULL)
 		die("BUG: prio_queue_reverse() on non-LIFO queue");
-	for (i = 0; i <= (j = (queue->nr - 1) - i); i++) {
-		struct commit *swap = queue->array[i];
-		queue->array[i] = queue->array[j];
-		queue->array[j] = swap;
-	}
+	for (i = 0; i <= (j = (queue->nr - 1) - i); i++)
+		swap(queue, i, j);
 }
 
 void clear_prio_queue(struct prio_queue *queue)
@@ -21,44 +33,42 @@
 	queue->nr = 0;
 	queue->alloc = 0;
 	queue->array = NULL;
+	queue->insertion_ctr = 0;
 }
 
 void prio_queue_put(struct prio_queue *queue, void *thing)
 {
-	prio_queue_compare_fn compare = queue->compare;
 	int ix, parent;
 
 	/* Append at the end */
 	ALLOC_GROW(queue->array, queue->nr + 1, queue->alloc);
-	queue->array[queue->nr++] = thing;
-	if (!compare)
+	queue->array[queue->nr].ctr = queue->insertion_ctr++;
+	queue->array[queue->nr].data = thing;
+	queue->nr++;
+	if (!queue->compare)
 		return; /* LIFO */
 
 	/* Bubble up the new one */
 	for (ix = queue->nr - 1; ix; ix = parent) {
 		parent = (ix - 1) / 2;
-		if (compare(queue->array[parent], queue->array[ix],
-			    queue->cb_data) <= 0)
+		if (compare(queue, parent, ix) <= 0)
 			break;
 
-		thing = queue->array[parent];
-		queue->array[parent] = queue->array[ix];
-		queue->array[ix] = thing;
+		swap(queue, parent, ix);
 	}
 }
 
 void *prio_queue_get(struct prio_queue *queue)
 {
-	void *result, *swap;
+	void *result;
 	int ix, child;
-	prio_queue_compare_fn compare = queue->compare;
 
 	if (!queue->nr)
 		return NULL;
-	if (!compare)
-		return queue->array[--queue->nr]; /* LIFO */
+	if (!queue->compare)
+		return queue->array[--queue->nr].data; /* LIFO */
 
-	result = queue->array[0];
+	result = queue->array[0].data;
 	if (!--queue->nr)
 		return result;
 
@@ -67,18 +77,14 @@
 	/* Push down the one at the root */
 	for (ix = 0; ix * 2 + 1 < queue->nr; ix = child) {
 		child = ix * 2 + 1; /* left */
-		if ((child + 1 < queue->nr) &&
-		    (compare(queue->array[child], queue->array[child + 1],
-			     queue->cb_data) >= 0))
+		if (child + 1 < queue->nr &&
+		    compare(queue, child, child + 1) >= 0)
 			child++; /* use right child */
 
-		if (compare(queue->array[ix], queue->array[child],
-			    queue->cb_data) <= 0)
+		if (compare(queue, ix, child) <= 0)
 			break;
 
-		swap = queue->array[child];
-		queue->array[child] = queue->array[ix];
-		queue->array[ix] = swap;
+		swap(queue, child, ix);
 	}
 	return result;
 }
diff --git a/prio-queue.h b/prio-queue.h
index 9c3cd1f..d030ec9 100644
--- a/prio-queue.h
+++ b/prio-queue.h
@@ -21,11 +21,17 @@
  */
 typedef int (*prio_queue_compare_fn)(const void *one, const void *two, void *cb_data);
 
+struct prio_queue_entry {
+	unsigned ctr;
+	void *data;
+};
+
 struct prio_queue {
 	prio_queue_compare_fn compare;
+	unsigned insertion_ctr;
 	void *cb_data;
 	int alloc, nr;
-	void **array;
+	struct prio_queue_entry *array;
 };
 
 /*
diff --git a/progress.c b/progress.c
index 261314e..412e6b1 100644
--- a/progress.c
+++ b/progress.c
@@ -12,13 +12,14 @@
 #include "gettext.h"
 #include "progress.h"
 #include "strbuf.h"
+#include "trace.h"
 
 #define TP_IDX_MAX      8
 
 struct throughput {
 	off_t curr_total;
 	off_t prev_total;
-	struct timeval prev_tv;
+	uint64_t prev_ns;
 	unsigned int avg_bytes;
 	unsigned int avg_misecs;
 	unsigned int last_bytes[TP_IDX_MAX];
@@ -127,65 +128,65 @@
 void display_throughput(struct progress *progress, off_t total)
 {
 	struct throughput *tp;
-	struct timeval tv;
-	unsigned int misecs;
+	uint64_t now_ns;
+	unsigned int misecs, count, rate;
+	struct strbuf buf = STRBUF_INIT;
 
 	if (!progress)
 		return;
 	tp = progress->throughput;
 
-	gettimeofday(&tv, NULL);
+	now_ns = getnanotime();
 
 	if (!tp) {
 		progress->throughput = tp = calloc(1, sizeof(*tp));
 		if (tp) {
 			tp->prev_total = tp->curr_total = total;
-			tp->prev_tv = tv;
+			tp->prev_ns = now_ns;
 		}
 		return;
 	}
 	tp->curr_total = total;
 
+	/* only update throughput every 0.5 s */
+	if (now_ns - tp->prev_ns <= 500000000)
+		return;
+
 	/*
-	 * We have x = bytes and y = microsecs.  We want z = KiB/s:
+	 * We have x = bytes and y = nanosecs.  We want z = KiB/s:
 	 *
-	 *	z = (x / 1024) / (y / 1000000)
-	 *	z = x / y * 1000000 / 1024
-	 *	z = x / (y * 1024 / 1000000)
+	 *	z = (x / 1024) / (y / 1000000000)
+	 *	z = x / y * 1000000000 / 1024
+	 *	z = x / (y * 1024 / 1000000000)
 	 *	z = x / y'
 	 *
 	 * To simplify things we'll keep track of misecs, or 1024th of a sec
 	 * obtained with:
 	 *
-	 *	y' = y * 1024 / 1000000
-	 *	y' = y / (1000000 / 1024)
-	 *	y' = y / 977
+	 *	y' = y * 1024 / 1000000000
+	 *	y' = y * (2^10 / 2^42) * (2^42 / 1000000000)
+	 *	y' = y / 2^32 * 4398
+	 *	y' = (y * 4398) >> 32
 	 */
-	misecs = (tv.tv_sec - tp->prev_tv.tv_sec) * 1024;
-	misecs += (int)(tv.tv_usec - tp->prev_tv.tv_usec) / 977;
+	misecs = ((now_ns - tp->prev_ns) * 4398) >> 32;
 
-	if (misecs > 512) {
-		struct strbuf buf = STRBUF_INIT;
-		unsigned int count, rate;
+	count = total - tp->prev_total;
+	tp->prev_total = total;
+	tp->prev_ns = now_ns;
+	tp->avg_bytes += count;
+	tp->avg_misecs += misecs;
+	rate = tp->avg_bytes / tp->avg_misecs;
+	tp->avg_bytes -= tp->last_bytes[tp->idx];
+	tp->avg_misecs -= tp->last_misecs[tp->idx];
+	tp->last_bytes[tp->idx] = count;
+	tp->last_misecs[tp->idx] = misecs;
+	tp->idx = (tp->idx + 1) % TP_IDX_MAX;
 
-		count = total - tp->prev_total;
-		tp->prev_total = total;
-		tp->prev_tv = tv;
-		tp->avg_bytes += count;
-		tp->avg_misecs += misecs;
-		rate = tp->avg_bytes / tp->avg_misecs;
-		tp->avg_bytes -= tp->last_bytes[tp->idx];
-		tp->avg_misecs -= tp->last_misecs[tp->idx];
-		tp->last_bytes[tp->idx] = count;
-		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);
-		if (progress->last_value != -1 && progress_update)
-			display(progress, progress->last_value, NULL);
-	}
+	throughput_string(&buf, total, rate);
+	strncpy(tp->display, buf.buf, sizeof(tp->display));
+	strbuf_release(&buf);
+	if (progress->last_value != -1 && progress_update)
+		display(progress, progress->last_value, NULL);
 }
 
 int display_progress(struct progress *progress, unsigned n)
diff --git a/prompt.c b/prompt.c
index d7bb17c..e5b4938 100644
--- a/prompt.c
+++ b/prompt.c
@@ -6,7 +6,7 @@
 
 static char *do_askpass(const char *cmd, const char *prompt)
 {
-	struct child_process pass;
+	struct child_process pass = CHILD_PROCESS_INIT;
 	const char *args[3];
 	static struct strbuf buffer = STRBUF_INIT;
 	int err = 0;
@@ -15,7 +15,6 @@
 	args[1]	= prompt;
 	args[2] = NULL;
 
-	memset(&pass, 0, sizeof(pass));
 	pass.argv = args;
 	pass.out = -1;
 
diff --git a/reachable.c b/reachable.c
index 654a8c5..a647267 100644
--- a/reachable.c
+++ b/reachable.c
@@ -8,6 +8,7 @@
 #include "reachable.h"
 #include "cache-tree.h"
 #include "progress.h"
+#include "list-objects.h"
 
 struct connectivity_progress {
 	struct progress *progress;
@@ -21,134 +22,6 @@
 		display_progress(cp->progress, cp->count);
 }
 
-static void process_blob(struct blob *blob,
-			 struct object_array *p,
-			 struct name_path *path,
-			 const char *name,
-			 struct connectivity_progress *cp)
-{
-	struct object *obj = &blob->object;
-
-	if (!blob)
-		die("bad blob object");
-	if (obj->flags & SEEN)
-		return;
-	obj->flags |= SEEN;
-	update_progress(cp);
-	/* Nothing to do, really .. The blob lookup was the important part */
-}
-
-static void process_gitlink(const unsigned char *sha1,
-			    struct object_array *p,
-			    struct name_path *path,
-			    const char *name)
-{
-	/* I don't think we want to recurse into this, really. */
-}
-
-static void process_tree(struct tree *tree,
-			 struct object_array *p,
-			 struct name_path *path,
-			 const char *name,
-			 struct connectivity_progress *cp)
-{
-	struct object *obj = &tree->object;
-	struct tree_desc desc;
-	struct name_entry entry;
-	struct name_path me;
-
-	if (!tree)
-		die("bad tree object");
-	if (obj->flags & SEEN)
-		return;
-	obj->flags |= SEEN;
-	update_progress(cp);
-	if (parse_tree(tree) < 0)
-		die("bad tree object %s", sha1_to_hex(obj->sha1));
-	add_object(obj, p, path, name);
-	me.up = path;
-	me.elem = name;
-	me.elem_len = strlen(name);
-
-	init_tree_desc(&desc, tree->buffer, tree->size);
-
-	while (tree_entry(&desc, &entry)) {
-		if (S_ISDIR(entry.mode))
-			process_tree(lookup_tree(entry.sha1), p, &me, entry.path, cp);
-		else if (S_ISGITLINK(entry.mode))
-			process_gitlink(entry.sha1, p, &me, entry.path);
-		else
-			process_blob(lookup_blob(entry.sha1), p, &me, entry.path, cp);
-	}
-	free_tree_buffer(tree);
-}
-
-static void process_tag(struct tag *tag, struct object_array *p,
-			const char *name, struct connectivity_progress *cp)
-{
-	struct object *obj = &tag->object;
-
-	if (obj->flags & SEEN)
-		return;
-	obj->flags |= SEEN;
-	update_progress(cp);
-
-	if (parse_tag(tag) < 0)
-		die("bad tag object %s", sha1_to_hex(obj->sha1));
-	if (tag->tagged)
-		add_object(tag->tagged, p, NULL, name);
-}
-
-static void walk_commit_list(struct rev_info *revs,
-			     struct connectivity_progress *cp)
-{
-	int i;
-	struct commit *commit;
-	struct object_array objects = OBJECT_ARRAY_INIT;
-
-	/* Walk all commits, process their trees */
-	while ((commit = get_revision(revs)) != NULL) {
-		process_tree(commit->tree, &objects, NULL, "", cp);
-		update_progress(cp);
-	}
-
-	/* Then walk all the pending objects, recursively processing them too */
-	for (i = 0; i < revs->pending.nr; i++) {
-		struct object_array_entry *pending = revs->pending.objects + i;
-		struct object *obj = pending->item;
-		const char *name = pending->name;
-		if (obj->type == OBJ_TAG) {
-			process_tag((struct tag *) obj, &objects, name, cp);
-			continue;
-		}
-		if (obj->type == OBJ_TREE) {
-			process_tree((struct tree *)obj, &objects, NULL, name, cp);
-			continue;
-		}
-		if (obj->type == OBJ_BLOB) {
-			process_blob((struct blob *)obj, &objects, NULL, name, cp);
-			continue;
-		}
-		die("unknown pending object %s (%s)", sha1_to_hex(obj->sha1), name);
-	}
-}
-
-static int add_one_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
-		const char *email, unsigned long timestamp, int tz,
-		const char *message, void *cb_data)
-{
-	struct object *object;
-	struct rev_info *revs = (struct rev_info *)cb_data;
-
-	object = parse_object(osha1);
-	if (object)
-		add_pending_object(revs, object, "");
-	object = parse_object(nsha1);
-	if (object)
-		add_pending_object(revs, object, "");
-	return 0;
-}
-
 static int add_one_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
 {
 	struct object *object = parse_object_or_die(sha1, path);
@@ -159,58 +32,124 @@
 	return 0;
 }
 
-static int add_one_reflog(const char *path, const unsigned char *sha1, int flag, void *cb_data)
+/*
+ * The traversal will have already marked us as SEEN, so we
+ * only need to handle any progress reporting here.
+ */
+static void mark_object(struct object *obj, const struct name_path *path,
+			const char *name, void *data)
 {
-	for_each_reflog_ent(path, add_one_reflog_ent, cb_data);
+	update_progress(data);
+}
+
+static void mark_commit(struct commit *c, void *data)
+{
+	mark_object(&c->object, NULL, NULL, data);
+}
+
+struct recent_data {
+	struct rev_info *revs;
+	unsigned long timestamp;
+};
+
+static void add_recent_object(const unsigned char *sha1,
+			      unsigned long mtime,
+			      struct recent_data *data)
+{
+	struct object *obj;
+	enum object_type type;
+
+	if (mtime <= data->timestamp)
+		return;
+
+	/*
+	 * We do not want to call parse_object here, because
+	 * inflating blobs and trees could be very expensive.
+	 * However, we do need to know the correct type for
+	 * later processing, and the revision machinery expects
+	 * commits and tags to have been parsed.
+	 */
+	type = sha1_object_info(sha1, NULL);
+	if (type < 0)
+		die("unable to get object info for %s", sha1_to_hex(sha1));
+
+	switch (type) {
+	case OBJ_TAG:
+	case OBJ_COMMIT:
+		obj = parse_object_or_die(sha1, NULL);
+		break;
+	case OBJ_TREE:
+		obj = (struct object *)lookup_tree(sha1);
+		break;
+	case OBJ_BLOB:
+		obj = (struct object *)lookup_blob(sha1);
+		break;
+	default:
+		die("unknown object type for %s: %s",
+		    sha1_to_hex(sha1), typename(type));
+	}
+
+	if (!obj)
+		die("unable to lookup %s", sha1_to_hex(sha1));
+
+	add_pending_object(data->revs, obj, "");
+}
+
+static int add_recent_loose(const unsigned char *sha1,
+			    const char *path, void *data)
+{
+	struct stat st;
+	struct object *obj = lookup_object(sha1);
+
+	if (obj && obj->flags & SEEN)
+		return 0;
+
+	if (stat(path, &st) < 0) {
+		/*
+		 * It's OK if an object went away during our iteration; this
+		 * could be due to a simultaneous repack. But anything else
+		 * we should abort, since we might then fail to mark objects
+		 * which should not be pruned.
+		 */
+		if (errno == ENOENT)
+			return 0;
+		return error("unable to stat %s: %s",
+			     sha1_to_hex(sha1), strerror(errno));
+	}
+
+	add_recent_object(sha1, st.st_mtime, data);
 	return 0;
 }
 
-static void add_one_tree(const unsigned char *sha1, struct rev_info *revs)
+static int add_recent_packed(const unsigned char *sha1,
+			     struct packed_git *p, uint32_t pos,
+			     void *data)
 {
-	struct tree *tree = lookup_tree(sha1);
-	if (tree)
-		add_pending_object(revs, &tree->object, "");
+	struct object *obj = lookup_object(sha1);
+
+	if (obj && obj->flags & SEEN)
+		return 0;
+	add_recent_object(sha1, p->mtime, data);
+	return 0;
 }
 
-static void add_cache_tree(struct cache_tree *it, struct rev_info *revs)
+int add_unseen_recent_objects_to_traversal(struct rev_info *revs,
+					   unsigned long timestamp)
 {
-	int i;
+	struct recent_data data;
+	int r;
 
-	if (it->entry_count >= 0)
-		add_one_tree(it->sha1, revs);
-	for (i = 0; i < it->subtree_nr; i++)
-		add_cache_tree(it->down[i]->cache_tree, revs);
-}
+	data.revs = revs;
+	data.timestamp = timestamp;
 
-static void add_cache_refs(struct rev_info *revs)
-{
-	int i;
-
-	read_cache();
-	for (i = 0; i < active_nr; i++) {
-		/*
-		 * The index can contain blobs and GITLINKs, GITLINKs are hashes
-		 * that don't actually point to objects in the repository, it's
-		 * almost guaranteed that they are NOT blobs, so we don't call
-		 * lookup_blob() on them, to avoid populating the hash table
-		 * with invalid information
-		 */
-		if (S_ISGITLINK(active_cache[i]->ce_mode))
-			continue;
-
-		lookup_blob(active_cache[i]->sha1);
-		/*
-		 * We could add the blobs to the pending list, but quite
-		 * frankly, we don't care. Once we've looked them up, and
-		 * added them as objects, we've really done everything
-		 * there is to do for a blob
-		 */
-	}
-	if (active_cache_tree)
-		add_cache_tree(active_cache_tree, revs);
+	r = for_each_loose_object(add_recent_loose, &data);
+	if (r)
+		return r;
+	return for_each_packed_object(add_recent_packed, &data);
 }
 
 void mark_reachable_objects(struct rev_info *revs, int mark_reflog,
+			    unsigned long mark_recent,
 			    struct progress *progress)
 {
 	struct connectivity_progress cp;
@@ -224,14 +163,17 @@
 	revs->tree_objects = 1;
 
 	/* Add all refs from the index file */
-	add_cache_refs(revs);
+	add_index_objects_to_pending(revs, 0);
 
 	/* Add all external refs */
 	for_each_ref(add_one_ref, revs);
 
+	/* detached HEAD is not included in the list above */
+	head_ref(add_one_ref, revs);
+
 	/* Add all reflog info */
 	if (mark_reflog)
-		for_each_reflog(add_one_reflog, revs);
+		add_reflogs_to_pending(revs, 0);
 
 	cp.progress = progress;
 	cp.count = 0;
@@ -242,6 +184,16 @@
 	 */
 	if (prepare_revision_walk(revs))
 		die("revision walk setup failed");
-	walk_commit_list(revs, &cp);
+	traverse_commit_list(revs, mark_commit, mark_object, &cp);
+
+	if (mark_recent) {
+		revs->ignore_missing_links = 1;
+		if (add_unseen_recent_objects_to_traversal(revs, mark_recent))
+			die("unable to mark recent objects");
+		if (prepare_revision_walk(revs))
+			die("revision walk setup failed");
+		traverse_commit_list(revs, mark_commit, mark_object, &cp);
+	}
+
 	display_progress(cp.progress, cp.count);
 }
diff --git a/reachable.h b/reachable.h
index 5d082ad..d23efc3 100644
--- a/reachable.h
+++ b/reachable.h
@@ -2,6 +2,9 @@
 #define REACHEABLE_H
 
 struct progress;
-extern void mark_reachable_objects(struct rev_info *revs, int mark_reflog, struct progress *);
+extern int add_unseen_recent_objects_to_traversal(struct rev_info *revs,
+						  unsigned long timestamp);
+extern void mark_reachable_objects(struct rev_info *revs, int mark_reflog,
+				   unsigned long mark_recent, struct progress *);
 
 #endif
diff --git a/read-cache.c b/read-cache.c
index 7f5645e..8f3e9eb 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -5,6 +5,7 @@
  */
 #define NO_THE_INDEX_COMPATIBILITY_MACROS
 #include "cache.h"
+#include "lockfile.h"
 #include "cache-tree.h"
 #include "refs.h"
 #include "dir.h"
@@ -14,6 +15,8 @@
 #include "resolve-undo.h"
 #include "strbuf.h"
 #include "varint.h"
+#include "split-index.h"
+#include "sigchain.h"
 
 static struct cache_entry *refresh_cache_entry(struct cache_entry *ce,
 					       unsigned int options);
@@ -34,8 +37,15 @@
 #define CACHE_EXT(s) ( (s[0]<<24)|(s[1]<<16)|(s[2]<<8)|(s[3]) )
 #define CACHE_EXT_TREE 0x54524545	/* "TREE" */
 #define CACHE_EXT_RESOLVE_UNDO 0x52455543 /* "REUC" */
+#define CACHE_EXT_LINK 0x6c696e6b	  /* "link" */
+
+/* changes that can be kept in $GIT_DIR/index (basically all extensions) */
+#define EXTMASK (RESOLVE_UNDO_CHANGED | CACHE_TREE_CHANGED | \
+		 CE_ENTRY_ADDED | CE_ENTRY_REMOVED | CE_ENTRY_CHANGED | \
+		 SPLIT_INDEX_ORDERED)
 
 struct index_state the_index;
+static const char *alternate_index_output;
 
 static void set_index_entry(struct index_state *istate, int nr, struct cache_entry *ce)
 {
@@ -47,10 +57,12 @@
 {
 	struct cache_entry *old = istate->cache[nr];
 
+	replace_index_entry_in_base(istate, old, ce);
 	remove_name_hash(istate, old);
 	free(old);
 	set_index_entry(istate, nr, ce);
-	istate->cache_changed = 1;
+	ce->ce_flags |= CE_UPDATE_IN_BASE;
+	istate->cache_changed |= CE_ENTRY_CHANGED;
 }
 
 void rename_index_entry_at(struct index_state *istate, int nr, const char *new_name)
@@ -62,9 +74,10 @@
 	copy_cache_entry(new, old);
 	new->ce_flags &= ~CE_HASHED;
 	new->ce_namelen = namelen;
+	new->index = 0;
 	memcpy(new->name, new_name, namelen + 1);
 
-	cache_tree_invalidate_path(istate->cache_tree, old->name);
+	cache_tree_invalidate_path(istate, old->name);
 	remove_index_entry_at(istate, nr);
 	add_index_entry(istate, new, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE);
 }
@@ -422,18 +435,26 @@
 	return c1 - c2;
 }
 
-int cache_name_stage_compare(const char *name1, int len1, int stage1, const char *name2, int len2, int stage2)
+int name_compare(const char *name1, size_t len1, const char *name2, size_t len2)
 {
-	int len = len1 < len2 ? len1 : len2;
-	int cmp;
-
-	cmp = memcmp(name1, name2, len);
+	size_t min_len = (len1 < len2) ? len1 : len2;
+	int cmp = memcmp(name1, name2, min_len);
 	if (cmp)
 		return cmp;
 	if (len1 < len2)
 		return -1;
 	if (len1 > len2)
 		return 1;
+	return 0;
+}
+
+int cache_name_stage_compare(const char *name1, int len1, int stage1, const char *name2, int len2, int stage2)
+{
+	int cmp;
+
+	cmp = name_compare(name1, len1, name2, len2);
+	if (cmp)
+		return cmp;
 
 	if (stage1 < stage2)
 		return -1;
@@ -442,11 +463,6 @@
 	return 0;
 }
 
-int cache_name_compare(const char *name1, int len1, const char *name2, int len2)
-{
-	return cache_name_stage_compare(name1, len1, 0, name2, len2, 0);
-}
-
 static int index_name_stage_pos(const struct index_state *istate, const char *name, int namelen, int stage)
 {
 	int first, last;
@@ -480,8 +496,8 @@
 
 	record_resolve_undo(istate, ce);
 	remove_name_hash(istate, ce);
-	free(ce);
-	istate->cache_changed = 1;
+	save_or_free_index_entry(istate, ce);
+	istate->cache_changed |= CE_ENTRY_REMOVED;
 	istate->cache_nr--;
 	if (pos >= istate->cache_nr)
 		return 0;
@@ -504,12 +520,14 @@
 	for (i = j = 0; i < istate->cache_nr; i++) {
 		if (ce_array[i]->ce_flags & CE_REMOVE) {
 			remove_name_hash(istate, ce_array[i]);
-			free(ce_array[i]);
+			save_or_free_index_entry(istate, ce_array[i]);
 		}
 		else
 			ce_array[j++] = ce_array[i];
 	}
-	istate->cache_changed = 1;
+	if (j == istate->cache_nr)
+		return;
+	istate->cache_changed |= CE_ENTRY_REMOVED;
 	istate->cache_nr = j;
 }
 
@@ -518,7 +536,7 @@
 	int pos = index_name_pos(istate, path, strlen(path));
 	if (pos < 0)
 		pos = -pos-1;
-	cache_tree_invalidate_path(istate->cache_tree, path);
+	cache_tree_invalidate_path(istate, path);
 	while (pos < istate->cache_nr && !strcmp(istate->cache[pos]->name, path))
 		remove_index_entry_at(istate, pos);
 	return 0;
@@ -567,7 +585,9 @@
  * So we use the CE_ADDED flag to verify that the alias was an old
  * one before we accept it as
  */
-static struct cache_entry *create_alias_ce(struct cache_entry *ce, struct cache_entry *alias)
+static struct cache_entry *create_alias_ce(struct index_state *istate,
+					   struct cache_entry *ce,
+					   struct cache_entry *alias)
 {
 	int len;
 	struct cache_entry *new;
@@ -580,7 +600,7 @@
 	new = xcalloc(1, cache_entry_size(len));
 	memcpy(new->name, alias->name, len);
 	copy_cache_entry(new, ce);
-	free(ce);
+	save_or_free_index_entry(istate, ce);
 	return new;
 }
 
@@ -673,7 +693,7 @@
 		set_object_name_for_intent_to_add_entry(ce);
 
 	if (ignore_case && alias && different_name(ce, alias))
-		ce = create_alias_ce(ce, alias);
+		ce = create_alias_ce(istate, ce, alias);
 	ce->ce_flags |= CE_ADDED;
 
 	/* It was suspected to be racily clean, but it turns out to be Ok */
@@ -936,7 +956,8 @@
 	int skip_df_check = option & ADD_CACHE_SKIP_DFCHECK;
 	int new_only = option & ADD_CACHE_NEW_ONLY;
 
-	cache_tree_invalidate_path(istate->cache_tree, ce->name);
+	if (!(option & ADD_CACHE_KEEP_CACHE_TREE))
+		cache_tree_invalidate_path(istate, ce->name);
 	pos = index_name_stage_pos(istate, ce->name, ce_namelen(ce), ce_stage(ce));
 
 	/* existing match? Just replace it. */
@@ -999,7 +1020,7 @@
 			istate->cache + pos,
 			(istate->cache_nr - pos - 1) * sizeof(ce));
 	set_index_entry(istate, pos, ce);
-	istate->cache_changed = 1;
+	istate->cache_changed |= CE_ENTRY_ADDED;
 	return 0;
 }
 
@@ -1044,6 +1065,14 @@
 		return ce;
 	}
 
+	if (has_symlink_leading_path(ce->name, ce_namelen(ce))) {
+		if (ignore_missing)
+			return ce;
+		if (err)
+			*err = ENOENT;
+		return NULL;
+	}
+
 	if (lstat(ce->name, &st) < 0) {
 		if (ignore_missing && errno == ENOENT)
 			return ce;
@@ -1098,6 +1127,7 @@
 	    !(ce->ce_flags & CE_VALID))
 		updated->ce_flags &= ~CE_VALID;
 
+	/* istate->cache_changed is updated in the caller */
 	return updated;
 }
 
@@ -1179,7 +1209,8 @@
 				 * means the index is not valid anymore.
 				 */
 				ce->ce_flags &= ~CE_VALID;
-				istate->cache_changed = 1;
+				ce->ce_flags |= CE_UPDATE_IN_BASE;
+				istate->cache_changed |= CE_ENTRY_CHANGED;
 			}
 			if (quiet)
 				continue;
@@ -1216,24 +1247,16 @@
 
 #define INDEX_FORMAT_DEFAULT 3
 
-static int index_format_config(const char *var, const char *value, void *cb)
-{
-	unsigned int *version = cb;
-	if (!strcmp(var, "index.version")) {
-		*version = git_config_int(var, value);
-		return 0;
-	}
-	return 1;
-}
-
 static unsigned int get_index_format_default(void)
 {
 	char *envversion = getenv("GIT_INDEX_VERSION");
 	char *endp;
+	int value;
 	unsigned int version = INDEX_FORMAT_DEFAULT;
 
 	if (!envversion) {
-		git_config(index_format_config, &version);
+		if (!git_config_get_int("index.version", &value))
+			version = value;
 		if (version < INDEX_FORMAT_LB || INDEX_FORMAT_UB < version) {
 			warning(_("index.version set, but the value is invalid.\n"
 				  "Using version %i"), INDEX_FORMAT_DEFAULT);
@@ -1331,6 +1354,10 @@
 	case CACHE_EXT_RESOLVE_UNDO:
 		istate->resolve_undo = resolve_undo_read(data, sz);
 		break;
+	case CACHE_EXT_LINK:
+		if (read_link_extension(istate, data, sz))
+			return -1;
+		break;
 	default:
 		if (*ext < 'A' || 'Z' < *ext)
 			return error("index uses %.4s extension, which we do not understand",
@@ -1341,6 +1368,14 @@
 	return 0;
 }
 
+int hold_locked_index(struct lock_file *lk, int die_on_error)
+{
+	return hold_lock_file_for_update(lk, get_index_file(),
+					 die_on_error
+					 ? LOCK_DIE_ON_ERROR
+					 : 0);
+}
+
 int read_index(struct index_state *istate)
 {
 	return read_index_from(istate, get_index_file());
@@ -1365,6 +1400,7 @@
 	ce->ce_stat_data.sd_size  = get_be32(&ondisk->size);
 	ce->ce_flags = flags & ~CE_NAMEMASK;
 	ce->ce_namelen = len;
+	ce->index = 0;
 	hashcpy(ce->sha1, ondisk->sha1);
 	memcpy(ce->name, name, len);
 	ce->name[len] = '\0';
@@ -1438,8 +1474,23 @@
 	return ce;
 }
 
+static void check_ce_order(struct cache_entry *ce, struct cache_entry *next_ce)
+{
+	int name_compare = strcmp(ce->name, next_ce->name);
+	if (0 < name_compare)
+		die("unordered stage entries in index");
+	if (!name_compare) {
+		if (!ce_stage(ce))
+			die("multiple stage entries for merged file '%s'",
+				ce->name);
+		if (ce_stage(ce) > ce_stage(next_ce))
+			die("unordered stage entries for '%s'",
+				ce->name);
+	}
+}
+
 /* remember to discard_cache() before reading a different cache! */
-int read_index_from(struct index_state *istate, const char *path)
+int do_read_index(struct index_state *istate, const char *path, int must_exist)
 {
 	int fd, i;
 	struct stat st;
@@ -1456,9 +1507,9 @@
 	istate->timestamp.nsec = 0;
 	fd = open(path, O_RDONLY);
 	if (fd < 0) {
-		if (errno == ENOENT)
+		if (!must_exist && errno == ENOENT)
 			return 0;
-		die_errno("index file open failed");
+		die_errno("%s: index file open failed", path);
 	}
 
 	if (fstat(fd, &st))
@@ -1477,7 +1528,7 @@
 	if (verify_hdr(hdr, mmap_size) < 0)
 		goto unmap;
 
-	hashcpy(istate->sha1, (unsigned char *)hdr + mmap_size - 20);
+	hashcpy(istate->sha1, (const unsigned char *)hdr + mmap_size - 20);
 	istate->version = ntohl(hdr->hdr_version);
 	istate->cache_nr = ntohl(hdr->hdr_entries);
 	istate->cache_alloc = alloc_nr(istate->cache_nr);
@@ -1499,6 +1550,9 @@
 		ce = create_from_disk(disk_ce, &consumed, previous_name);
 		set_index_entry(istate, i, ce);
 
+		if (i > 0)
+			check_ce_order(istate->cache[i - 1], ce);
+
 		src_offset += consumed;
 	}
 	strbuf_release(&previous_name_buf);
@@ -1531,6 +1585,40 @@
 	die("index file corrupt");
 }
 
+int read_index_from(struct index_state *istate, const char *path)
+{
+	struct split_index *split_index;
+	int ret;
+
+	/* istate->initialized covers both .git/index and .git/sharedindex.xxx */
+	if (istate->initialized)
+		return istate->cache_nr;
+
+	ret = do_read_index(istate, path, 0);
+	split_index = istate->split_index;
+	if (!split_index)
+		return ret;
+
+	if (is_null_sha1(split_index->base_sha1))
+		return ret;
+
+	if (split_index->base)
+		discard_index(split_index->base);
+	else
+		split_index->base = xcalloc(1, sizeof(*split_index->base));
+	ret = do_read_index(split_index->base,
+			    git_path("sharedindex.%s",
+				     sha1_to_hex(split_index->base_sha1)), 1);
+	if (hashcmp(split_index->base_sha1, split_index->base->sha1))
+		die("broken index, expect %s in %s, got %s",
+		    sha1_to_hex(split_index->base_sha1),
+		    git_path("sharedindex.%s",
+				     sha1_to_hex(split_index->base_sha1)),
+		    sha1_to_hex(split_index->base->sha1));
+	merge_base_index(istate);
+	return ret;
+}
+
 int is_index_unborn(struct index_state *istate)
 {
 	return (!istate->cache_nr && !istate->timestamp.sec);
@@ -1540,8 +1628,15 @@
 {
 	int i;
 
-	for (i = 0; i < istate->cache_nr; i++)
+	for (i = 0; i < istate->cache_nr; i++) {
+		if (istate->cache[i]->index &&
+		    istate->split_index &&
+		    istate->split_index->base &&
+		    istate->cache[i]->index <= istate->split_index->base->cache_nr &&
+		    istate->cache[i] == istate->split_index->base->cache[istate->cache[i]->index - 1])
+			continue;
 		free(istate->cache[i]);
+	}
 	resolve_undo_clear_index(istate);
 	istate->cache_nr = 0;
 	istate->cache_changed = 0;
@@ -1553,6 +1648,7 @@
 	free(istate->cache);
 	istate->cache = NULL;
 	istate->cache_alloc = 0;
+	discard_split_index(istate);
 	return 0;
 }
 
@@ -1613,7 +1709,7 @@
 		(ce_write(context, fd, &sz, 4) < 0)) ? -1 : 0;
 }
 
-static int ce_flush(git_SHA_CTX *context, int fd)
+static int ce_flush(git_SHA_CTX *context, int fd, unsigned char *sha1)
 {
 	unsigned int left = write_buffer_len;
 
@@ -1631,6 +1727,7 @@
 
 	/* Append the SHA1 signature at the end */
 	git_SHA1_Final(write_buffer + left, context);
+	hashcpy(sha1, write_buffer + left);
 	left += 20;
 	return (write_in_full(fd, write_buffer, left) != left) ? -1 : 0;
 }
@@ -1702,7 +1799,7 @@
 	ondisk->size = htonl(ce->ce_stat_data.sd_size);
 	hashcpy(ondisk->sha1, ce->sha1);
 
-	flags = ce->ce_flags;
+	flags = ce->ce_flags & ~CE_NAMEMASK;
 	flags |= (ce_namelen(ce) >= CE_NAMEMASK ? CE_NAMEMASK : ce_namelen(ce));
 	ondisk->flags = htons(flags);
 	if (ce->ce_flags & CE_EXTENDED) {
@@ -1721,9 +1818,15 @@
 {
 	int size;
 	struct ondisk_cache_entry *ondisk;
+	int saved_namelen = saved_namelen; /* compiler workaround */
 	char *name;
 	int result;
 
+	if (ce->ce_flags & CE_STRIP_NAME) {
+		saved_namelen = ce_namelen(ce);
+		ce->ce_namelen = 0;
+	}
+
 	if (!previous_name) {
 		size = ondisk_ce_size(ce);
 		ondisk = xcalloc(1, size);
@@ -1755,6 +1858,10 @@
 		strbuf_splice(previous_name, common, to_remove,
 			      ce->name + common, ce_namelen(ce) - common);
 	}
+	if (ce->ce_flags & CE_STRIP_NAME) {
+		ce->ce_namelen = saved_namelen;
+		ce->ce_flags &= ~CE_STRIP_NAME;
+	}
 
 	result = ce_write(c, fd, ondisk, size);
 	free(ondisk);
@@ -1824,13 +1931,13 @@
 void update_index_if_able(struct index_state *istate, struct lock_file *lockfile)
 {
 	if ((istate->cache_changed || has_racy_timestamp(istate)) &&
-	    verify_index(istate) && !write_index(istate, lockfile->fd))
-		commit_locked_index(lockfile);
-	else
+	    verify_index(istate) &&
+	    write_locked_index(istate, lockfile, COMMIT_LOCK))
 		rollback_lock_file(lockfile);
 }
 
-int write_index(struct index_state *istate, int newfd)
+static int do_write_index(struct index_state *istate, int newfd,
+			  int strip_extensions)
 {
 	git_SHA_CTX c;
 	struct cache_header hdr;
@@ -1852,8 +1959,11 @@
 		}
 	}
 
-	if (!istate->version)
+	if (!istate->version) {
 		istate->version = get_index_format_default();
+		if (getenv("GIT_TEST_SPLIT_INDEX"))
+			init_split_index(istate);
+	}
 
 	/* demote version 3 to version 2 when the latter suffices */
 	if (istate->version == 3 || istate->version == 2)
@@ -1893,7 +2003,18 @@
 	strbuf_release(&previous_name_buf);
 
 	/* Write extension data here */
-	if (istate->cache_tree) {
+	if (!strip_extensions && istate->split_index) {
+		struct strbuf sb = STRBUF_INIT;
+
+		err = write_link_extension(&sb, istate) < 0 ||
+			write_index_ext_header(&c, newfd, CACHE_EXT_LINK,
+					       sb.len) < 0 ||
+			ce_write(&c, newfd, sb.buf, sb.len) < 0;
+		strbuf_release(&sb);
+		if (err)
+			return -1;
+	}
+	if (!strip_extensions && istate->cache_tree) {
 		struct strbuf sb = STRBUF_INIT;
 
 		cache_tree_write(&sb, istate->cache_tree);
@@ -1903,7 +2024,7 @@
 		if (err)
 			return -1;
 	}
-	if (istate->resolve_undo) {
+	if (!strip_extensions && istate->resolve_undo) {
 		struct strbuf sb = STRBUF_INIT;
 
 		resolve_undo_write(&sb, istate->resolve_undo);
@@ -1915,13 +2036,132 @@
 			return -1;
 	}
 
-	if (ce_flush(&c, newfd) || fstat(newfd, &st))
+	if (ce_flush(&c, newfd, istate->sha1) || fstat(newfd, &st))
 		return -1;
 	istate->timestamp.sec = (unsigned int)st.st_mtime;
 	istate->timestamp.nsec = ST_MTIME_NSEC(st);
 	return 0;
 }
 
+void set_alternate_index_output(const char *name)
+{
+	alternate_index_output = name;
+}
+
+static int commit_locked_index(struct lock_file *lk)
+{
+	if (alternate_index_output)
+		return commit_lock_file_to(lk, alternate_index_output);
+	else
+		return commit_lock_file(lk);
+}
+
+static int do_write_locked_index(struct index_state *istate, struct lock_file *lock,
+				 unsigned flags)
+{
+	int ret = do_write_index(istate, lock->fd, 0);
+	if (ret)
+		return ret;
+	assert((flags & (COMMIT_LOCK | CLOSE_LOCK)) !=
+	       (COMMIT_LOCK | CLOSE_LOCK));
+	if (flags & COMMIT_LOCK)
+		return commit_locked_index(lock);
+	else if (flags & CLOSE_LOCK)
+		return close_lock_file(lock);
+	else
+		return ret;
+}
+
+static int write_split_index(struct index_state *istate,
+			     struct lock_file *lock,
+			     unsigned flags)
+{
+	int ret;
+	prepare_to_write_split_index(istate);
+	ret = do_write_locked_index(istate, lock, flags);
+	finish_writing_split_index(istate);
+	return ret;
+}
+
+static char *temporary_sharedindex;
+
+static void remove_temporary_sharedindex(void)
+{
+	if (temporary_sharedindex) {
+		unlink_or_warn(temporary_sharedindex);
+		free(temporary_sharedindex);
+		temporary_sharedindex = NULL;
+	}
+}
+
+static void remove_temporary_sharedindex_on_signal(int signo)
+{
+	remove_temporary_sharedindex();
+	sigchain_pop(signo);
+	raise(signo);
+}
+
+static int write_shared_index(struct index_state *istate,
+			      struct lock_file *lock, unsigned flags)
+{
+	struct split_index *si = istate->split_index;
+	static int installed_handler;
+	int fd, ret;
+
+	temporary_sharedindex = git_pathdup("sharedindex_XXXXXX");
+	fd = mkstemp(temporary_sharedindex);
+	if (fd < 0) {
+		free(temporary_sharedindex);
+		temporary_sharedindex = NULL;
+		hashclr(si->base_sha1);
+		return do_write_locked_index(istate, lock, flags);
+	}
+	if (!installed_handler) {
+		atexit(remove_temporary_sharedindex);
+		sigchain_push_common(remove_temporary_sharedindex_on_signal);
+	}
+	move_cache_to_base_index(istate);
+	ret = do_write_index(si->base, fd, 1);
+	close(fd);
+	if (ret) {
+		remove_temporary_sharedindex();
+		return ret;
+	}
+	ret = rename(temporary_sharedindex,
+		     git_path("sharedindex.%s", sha1_to_hex(si->base->sha1)));
+	free(temporary_sharedindex);
+	temporary_sharedindex = NULL;
+	if (!ret)
+		hashcpy(si->base_sha1, si->base->sha1);
+	return ret;
+}
+
+int write_locked_index(struct index_state *istate, struct lock_file *lock,
+		       unsigned flags)
+{
+	struct split_index *si = istate->split_index;
+
+	if (!si || alternate_index_output ||
+	    (istate->cache_changed & ~EXTMASK)) {
+		if (si)
+			hashclr(si->base_sha1);
+		return do_write_locked_index(istate, lock, flags);
+	}
+
+	if (getenv("GIT_TEST_SPLIT_INDEX")) {
+		int v = si->base_sha1[0];
+		if ((v & 15) < 6)
+			istate->cache_changed |= SPLIT_INDEX_ORDERED;
+	}
+	if (istate->cache_changed & SPLIT_INDEX_ORDERED) {
+		int ret = write_shared_index(istate, lock, flags);
+		if (ret)
+			return ret;
+	}
+
+	return write_split_index(istate, lock, flags);
+}
+
 /*
  * Read the index file that is potentially unmerged into given
  * index_state, dropping any unmerged entries.  Returns true if
@@ -1953,7 +2193,6 @@
 		if (add_index_entry(istate, new_ce, 0))
 			return error("%s: cannot drop to stage #0",
 				     new_ce->name);
-		i = index_name_pos(istate, new_ce->name, len);
 	}
 	return unmerged;
 }
diff --git a/reflog-walk.c b/reflog-walk.c
index 9ce8b53..222de76 100644
--- a/reflog-walk.c
+++ b/reflog-walk.c
@@ -48,7 +48,8 @@
 		unsigned char sha1[20];
 		const char *name;
 		void *name_to_free;
-		name = name_to_free = resolve_refdup(ref, sha1, 1, NULL);
+		name = name_to_free = resolve_refdup(ref, RESOLVE_REF_READING,
+						     sha1, NULL);
 		if (name) {
 			for_each_reflog_ent(name, read_one_reflog, reflogs);
 			free(name_to_free);
@@ -133,7 +134,7 @@
 	struct commit_reflog *last_commit_reflog;
 };
 
-void init_reflog_walk(struct reflog_walk_info** info)
+void init_reflog_walk(struct reflog_walk_info **info)
 {
 	*info = xcalloc(1, sizeof(struct reflog_walk_info));
 }
@@ -174,7 +175,7 @@
 		if (*branch == '\0') {
 			unsigned char sha1[20];
 			free(branch);
-			branch = resolve_refdup("HEAD", sha1, 0, NULL);
+			branch = resolve_refdup("HEAD", 0, sha1, NULL);
 			if (!branch)
 				die ("No current branch");
 
diff --git a/reflog-walk.h b/reflog-walk.h
index 50265f5..a9bd60e 100644
--- a/reflog-walk.h
+++ b/reflog-walk.h
@@ -5,7 +5,7 @@
 
 struct reflog_walk_info;
 
-extern void init_reflog_walk(struct reflog_walk_info** info);
+extern void init_reflog_walk(struct reflog_walk_info **info);
 extern int add_reflog_for_walk(struct reflog_walk_info *info,
 		struct commit *commit, const char *name);
 extern void fake_reflog_parent(struct reflog_walk_info *info,
diff --git a/refs.c b/refs.c
index e9eda88..5ff457e 100644
--- a/refs.c
+++ b/refs.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "lockfile.h"
 #include "refs.h"
 #include "object.h"
 #include "tag.h"
@@ -6,8 +7,34 @@
 #include "string-list.h"
 
 /*
- * Make sure "ref" is something reasonable to have under ".git/refs/";
- * We do not like it if:
+ * How to handle various characters in refnames:
+ * 0: An acceptable character for refs
+ * 1: End-of-component
+ * 2: ., look for a preceding . to reject .. in refs
+ * 3: {, look for a preceding @ to reject @{ in refs
+ * 4: A bad character: ASCII control characters, "~", "^", ":" or SP
+ */
+static unsigned char refname_disposition[256] = {
+	1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+	4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+	4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2, 1,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
+};
+
+/*
+ * Used as a flag to ref_transaction_delete when a loose ref is being
+ * pruned.
+ */
+#define REF_ISPRUNING	0x0100
+/*
+ * 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
+ * ".git/refs/"; We do not like it if:
  *
  * - any path component of it begins with ".", or
  * - it has double dots "..", or
@@ -16,54 +43,37 @@
  * - it ends with ".lock"
  * - it contains a "\" (backslash)
  */
-
-/* Return true iff ch is not allowed in reference names. */
-static inline int bad_ref_char(int ch)
-{
-	if (((unsigned) ch) <= ' ' || ch == 0x7f ||
-	    ch == '~' || ch == '^' || ch == ':' || ch == '\\')
-		return 1;
-	/* 2.13 Pattern Matching Notation */
-	if (ch == '*' || ch == '?' || ch == '[') /* Unsupported */
-		return 1;
-	return 0;
-}
-
-/*
- * 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.
- */
 static int check_refname_component(const char *refname, int flags)
 {
 	const char *cp;
 	char last = '\0';
 
 	for (cp = refname; ; cp++) {
-		char ch = *cp;
-		if (ch == '\0' || ch == '/')
+		int ch = *cp & 255;
+		unsigned char disp = refname_disposition[ch];
+		switch (disp) {
+		case 1:
+			goto out;
+		case 2:
+			if (last == '.')
+				return -1; /* Refname contains "..". */
 			break;
-		if (bad_ref_char(ch))
-			return -1; /* Illegal character in refname. */
-		if (last == '.' && ch == '.')
-			return -1; /* Refname contains "..". */
-		if (last == '@' && ch == '{')
-			return -1; /* Refname contains "@{". */
+		case 3:
+			if (last == '@')
+				return -1; /* Refname contains "@{". */
+			break;
+		case 4:
+			return -1;
+		}
 		last = ch;
 	}
+out:
 	if (cp == refname)
 		return 0; /* Component has zero length. */
-	if (refname[0] == '.') {
-		if (!(flags & REFNAME_DOT_COMPONENT))
-			return -1; /* Component starts with '.'. */
-		/*
-		 * Even if leading dots are allowed, don't allow "."
-		 * as a component (".." is prevented by a rule above).
-		 */
-		if (refname[1] == '\0')
-			return -1; /* Component equals ".". */
-	}
-	if (cp - refname >= 5 && !memcmp(cp - 5, ".lock", 5))
+	if (refname[0] == '.')
+		return -1; /* Component starts with '.'. */
+	if (cp - refname >= LOCK_SUFFIX_LEN &&
+	    !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN))
 		return -1; /* Refname ends with ".lock". */
 	return cp - refname;
 }
@@ -177,8 +187,8 @@
 
 /*
  * Bit values for ref_entry::flag.  REF_ISSYMREF=0x01,
- * REF_ISPACKED=0x02, and REF_ISBROKEN=0x04 are public values; see
- * refs.h.
+ * REF_ISPACKED=0x02, REF_ISBROKEN=0x04 and REF_BAD_NAME=0x08 are
+ * public values; see refs.h.
  */
 
 /*
@@ -186,16 +196,16 @@
  * 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 0x08
+#define REF_KNOWS_PEELED 0x10
 
 /* ref_entry represents a directory of references */
-#define REF_DIR 0x10
+#define REF_DIR 0x20
 
 /*
  * Entry has not yet been read from disk (used only for REF_DIR
  * entries representing loose references)
  */
-#define REF_INCOMPLETE 0x20
+#define REF_INCOMPLETE 0x40
 
 /*
  * A ref_entry represents either a reference or a "subdirectory" of
@@ -264,6 +274,39 @@
 	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)
+{
+	if (starts_with(refname, "refs/")) {
+		char *buf;
+		int result;
+
+		buf = xmalloc(strlen(refname) + 1);
+		/*
+		 * Does the refname try to escape refs/?
+		 * For example: refs/foo/../bar is safe but refs/foo/../../bar
+		 * is not.
+		 */
+		result = !normalize_path_copy(buf, refname + strlen("refs/"));
+		free(buf);
+		return result;
+	}
+	while (*refname) {
+		if (!isupper(*refname) && *refname != '_')
+			return 0;
+		refname++;
+	}
+	return 1;
+}
+
 static struct ref_entry *create_ref_entry(const char *refname,
 					  const unsigned char *sha1, int flag,
 					  int check_name)
@@ -272,8 +315,10 @@
 	struct ref_entry *ref;
 
 	if (check_name &&
-	    check_refname_format(refname, REFNAME_ALLOW_ONELEVEL|REFNAME_DOT_COMPONENT))
+	    check_refname_format(refname, REFNAME_ALLOW_ONELEVEL))
 		die("Reference has invalid format: '%s'", refname);
+	if (!check_name && !refname_is_safe(refname))
+		die("Reference has invalid name: '%s'", refname);
 	len = strlen(refname) + 1;
 	ref = xmalloc(sizeof(struct ref_entry) + len);
 	hashcpy(ref->u.value.sha1, sha1);
@@ -768,60 +813,121 @@
 			prime_ref_dir(get_ref_dir(entry));
 	}
 }
-/*
- * Return true iff refname1 and refname2 conflict with each other.
- * 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".
- */
-static int names_conflict(const char *refname1, const char *refname2)
+
+static int entry_matches(struct ref_entry *entry, const struct string_list *list)
 {
-	for (; *refname1 && *refname1 == *refname2; refname1++, refname2++)
-		;
-	return (*refname1 == '\0' && *refname2 == '/')
-		|| (*refname1 == '/' && *refname2 == '\0');
+	return list && string_list_has_string(list, entry->name);
 }
 
-struct name_conflict_cb {
-	const char *refname;
-	const char *oldrefname;
-	const char *conflicting_refname;
+struct nonmatching_ref_data {
+	const struct string_list *skip;
+	struct ref_entry *found;
 };
 
-static int name_conflict_fn(struct ref_entry *entry, void *cb_data)
+static int nonmatching_ref_fn(struct ref_entry *entry, void *vdata)
 {
-	struct name_conflict_cb *data = (struct name_conflict_cb *)cb_data;
-	if (data->oldrefname && !strcmp(data->oldrefname, entry->name))
+	struct nonmatching_ref_data *data = vdata;
+
+	if (entry_matches(entry, data->skip))
 		return 0;
-	if (names_conflict(data->refname, entry->name)) {
-		data->conflicting_refname = entry->name;
-		return 1;
-	}
-	return 0;
+
+	data->found = entry;
+	return 1;
+}
+
+static void report_refname_conflict(struct ref_entry *entry,
+				    const char *refname)
+{
+	error("'%s' exists; cannot create '%s'", entry->name, refname);
 }
 
 /*
  * Return true iff a reference named refname could be created without
  * conflicting with the name of an existing reference in dir.  If
- * oldrefname is non-NULL, ignore potential conflicts with oldrefname
- * (e.g., because oldrefname is scheduled for deletion in the same
+ * skip is non-NULL, ignore potential conflicts with refs in skip
+ * (e.g., because they are scheduled for deletion in the same
  * operation).
+ *
+ * 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".
+ *
+ * skip must be sorted.
  */
-static int is_refname_available(const char *refname, const char *oldrefname,
+static int is_refname_available(const char *refname,
+				const struct string_list *skip,
 				struct ref_dir *dir)
 {
-	struct name_conflict_cb data;
-	data.refname = refname;
-	data.oldrefname = oldrefname;
-	data.conflicting_refname = NULL;
+	const char *slash;
+	size_t len;
+	int pos;
+	char *dirname;
 
-	sort_ref_dir(dir);
-	if (do_for_each_entry_in_dir(dir, 0, name_conflict_fn, &data)) {
-		error("'%s' exists; cannot create '%s'",
-		      data.conflicting_refname, refname);
+	for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
+		/*
+		 * We are still at a leading dir of the refname; we are
+		 * looking for a conflict with a leaf entry.
+		 *
+		 * If we find one, we still must make sure it is
+		 * not in "skip".
+		 */
+		pos = search_ref_dir(dir, refname, slash - refname);
+		if (pos >= 0) {
+			struct ref_entry *entry = dir->entries[pos];
+			if (entry_matches(entry, skip))
+				return 1;
+			report_refname_conflict(entry, refname);
+			return 0;
+		}
+
+
+		/*
+		 * Otherwise, we can try to continue our search with
+		 * the next component; if we come up empty, we know
+		 * there is nothing under this whole prefix.
+		 */
+		pos = search_ref_dir(dir, refname, slash + 1 - refname);
+		if (pos < 0)
+			return 1;
+
+		dir = get_ref_dir(dir->entries[pos]);
+	}
+
+	/*
+	 * We are at the leaf of our refname; we want to
+	 * make sure there are no directories which match it.
+	 */
+	len = strlen(refname);
+	dirname = xmallocz(len + 1);
+	sprintf(dirname, "%s/", refname);
+	pos = search_ref_dir(dir, dirname, len + 1);
+	free(dirname);
+
+	if (pos >= 0) {
+		/*
+		 * We found a directory named "refname". It is a
+		 * problem iff it contains any ref that is not
+		 * in "skip".
+		 */
+		struct ref_entry *entry = dir->entries[pos];
+		struct ref_dir *dir = get_ref_dir(entry);
+		struct nonmatching_ref_data data;
+
+		data.skip = skip;
+		sort_ref_dir(dir);
+		if (!do_for_each_entry_in_dir(dir, 0, nonmatching_ref_fn, &data))
+			return 1;
+
+		report_refname_conflict(data.found, refname);
 		return 0;
 	}
+
+	/*
+	 * There is no point in searching for another leaf
+	 * node which matches it; such an entry would be the
+	 * ref we are looking for, not a conflict.
+	 */
 	return 1;
 }
 
@@ -1040,7 +1146,13 @@
 
 		refname = parse_ref_line(refline, sha1);
 		if (refname) {
-			last = create_ref_entry(refname, sha1, REF_ISPACKED, 1);
+			int flag = REF_ISPACKED;
+
+			if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
+				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;
@@ -1151,7 +1263,7 @@
 
 		if (de->d_name[0] == '.')
 			continue;
-		if (has_extension(de->d_name, ".lock"))
+		if (ends_with(de->d_name, ".lock"))
 			continue;
 		strbuf_addstr(&refname, de->d_name);
 		refdir = *refs->name
@@ -1172,12 +1284,19 @@
 					hashclr(sha1);
 					flag |= REF_ISBROKEN;
 				}
-			} else if (read_ref_full(refname.buf, sha1, 1, &flag)) {
+			} else if (read_ref_full(refname.buf,
+						 RESOLVE_REF_READING,
+						 sha1, &flag)) {
 				hashclr(sha1);
 				flag |= REF_ISBROKEN;
 			}
+			if (check_refname_format(refname.buf,
+						 REFNAME_ALLOW_ONELEVEL)) {
+				hashclr(sha1);
+				flag |= REF_BAD_NAME | REF_ISBROKEN;
+			}
 			add_entry_to_dir(dir,
-					 create_ref_entry(refname.buf, sha1, flag, 1));
+					 create_ref_entry(refname.buf, sha1, flag, 0));
 		}
 		strbuf_setlen(&refname, dirnamelen);
 	}
@@ -1296,10 +1415,10 @@
  * A loose ref file doesn't exist; check for a packed ref.  The
  * options are forwarded from resolve_safe_unsafe().
  */
-static const char *handle_missing_loose_ref(const char *refname,
-					    unsigned char *sha1,
-					    int reading,
-					    int *flag)
+static int resolve_missing_loose_ref(const char *refname,
+				     int resolve_flags,
+				     unsigned char *sha1,
+				     int *flags)
 {
 	struct ref_entry *entry;
 
@@ -1310,40 +1429,61 @@
 	entry = get_packed_ref(refname);
 	if (entry) {
 		hashcpy(sha1, entry->u.value.sha1);
-		if (flag)
-			*flag |= REF_ISPACKED;
-		return refname;
+		if (flags)
+			*flags |= REF_ISPACKED;
+		return 0;
 	}
 	/* The reference is not a packed reference, either. */
-	if (reading) {
-		return NULL;
+	if (resolve_flags & RESOLVE_REF_READING) {
+		errno = ENOENT;
+		return -1;
 	} else {
 		hashclr(sha1);
-		return refname;
+		return 0;
 	}
 }
 
-const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int reading, int *flag)
+/* This function needs to return a meaningful errno on failure */
+const char *resolve_ref_unsafe(const char *refname, int resolve_flags, unsigned char *sha1, int *flags)
 {
 	int depth = MAXDEPTH;
 	ssize_t len;
 	char buffer[256];
 	static char refname_buffer[256];
+	int bad_name = 0;
 
-	if (flag)
-		*flag = 0;
+	if (flags)
+		*flags = 0;
 
-	if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL))
-		return NULL;
+	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 (;;) {
 		char path[PATH_MAX];
 		struct stat st;
 		char *buf;
 		int fd;
 
-		if (--depth < 0)
+		if (--depth < 0) {
+			errno = ELOOP;
 			return NULL;
+		}
 
 		git_snpath(path, sizeof(path), "%s", refname);
 
@@ -1358,11 +1498,17 @@
 		 */
 	stat_ref:
 		if (lstat(path, &st) < 0) {
-			if (errno == ENOENT)
-				return handle_missing_loose_ref(refname, sha1,
-								reading, flag);
-			else
+			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 */
@@ -1380,8 +1526,12 @@
 					!check_refname_format(buffer, 0)) {
 				strcpy(refname_buffer, buffer);
 				refname = refname_buffer;
-				if (flag)
-					*flag |= REF_ISSYMREF;
+				if (flags)
+					*flags |= REF_ISSYMREF;
+				if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
+					hashclr(sha1);
+					return refname;
+				}
 				continue;
 			}
 		}
@@ -1405,9 +1555,13 @@
 				return NULL;
 		}
 		len = read_in_full(fd, buffer, sizeof(buffer)-1);
-		close(fd);
-		if (len < 0)
+		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';
@@ -1422,29 +1576,45 @@
 			 */
 			if (get_sha1_hex(buffer, sha1) ||
 			    (buffer[40] != '\0' && !isspace(buffer[40]))) {
-				if (flag)
-					*flag |= REF_ISBROKEN;
+				if (flags)
+					*flags |= REF_ISBROKEN;
+				errno = EINVAL;
 				return NULL;
 			}
+			if (bad_name) {
+				hashclr(sha1);
+				if (flags)
+					*flags |= REF_ISBROKEN;
+			}
 			return refname;
 		}
-		if (flag)
-			*flag |= REF_ISSYMREF;
+		if (flags)
+			*flags |= REF_ISSYMREF;
 		buf = buffer + 4;
 		while (isspace(*buf))
 			buf++;
-		if (check_refname_format(buf, REFNAME_ALLOW_ONELEVEL)) {
-			if (flag)
-				*flag |= REF_ISBROKEN;
-			return NULL;
-		}
 		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;
+		}
 	}
 }
 
-char *resolve_refdup(const char *ref, unsigned char *sha1, int reading, int *flag)
+char *resolve_refdup(const char *ref, int resolve_flags, unsigned char *sha1, int *flags)
 {
-	const char *ret = resolve_ref_unsafe(ref, sha1, reading, flag);
+	const char *ret = resolve_ref_unsafe(ref, resolve_flags, sha1, flags);
 	return ret ? xstrdup(ret) : NULL;
 }
 
@@ -1455,22 +1625,22 @@
 	void *cb_data;
 };
 
-int read_ref_full(const char *refname, unsigned char *sha1, int reading, int *flags)
+int read_ref_full(const char *refname, int resolve_flags, unsigned char *sha1, int *flags)
 {
-	if (resolve_ref_unsafe(refname, sha1, reading, flags))
+	if (resolve_ref_unsafe(refname, resolve_flags, sha1, flags))
 		return 0;
 	return -1;
 }
 
 int read_ref(const char *refname, unsigned char *sha1)
 {
-	return read_ref_full(refname, sha1, 1, NULL);
+	return read_ref_full(refname, RESOLVE_REF_READING, sha1, NULL);
 }
 
 int ref_exists(const char *refname)
 {
 	unsigned char sha1[20];
-	return !!resolve_ref_unsafe(refname, sha1, 1, NULL);
+	return !!resolve_ref_unsafe(refname, RESOLVE_REF_READING, sha1, NULL);
 }
 
 static int filter_refs(const char *refname, const unsigned char *sha1, int flags,
@@ -1583,7 +1753,7 @@
 		return 0;
 	}
 
-	if (read_ref_full(refname, base, 1, &flag))
+	if (read_ref_full(refname, RESOLVE_REF_READING, base, &flag))
 		return -1;
 
 	/*
@@ -1624,7 +1794,7 @@
 	if (!(flags & REF_ISSYMREF))
 		return 0;
 
-	resolves_to = resolve_ref_unsafe(refname, junk, 0, NULL);
+	resolves_to = resolve_ref_unsafe(refname, 0, junk, NULL);
 	if (!resolves_to
 	    || (d->refname
 		? strcmp(resolves_to, d->refname)
@@ -1749,7 +1919,7 @@
 		return 0;
 	}
 
-	if (!read_ref_full("HEAD", sha1, 1, &flag))
+	if (!read_ref_full("HEAD", RESOLVE_REF_READING, sha1, &flag))
 		return fn("HEAD", sha1, flag, cb_data);
 
 	return 0;
@@ -1829,7 +1999,7 @@
 	int flag;
 
 	strbuf_addf(&buf, "%sHEAD", get_git_namespace());
-	if (!read_ref_full(buf.buf, sha1, 1, &flag))
+	if (!read_ref_full(buf.buf, RESOLVE_REF_READING, sha1, &flag))
 		ret = fn(buf.buf, sha1, flag, cb_data);
 	strbuf_release(&buf);
 
@@ -1920,18 +2090,24 @@
 	return 0;
 }
 
+/* This function should make sure errno is meaningful on error */
 static struct ref_lock *verify_lock(struct ref_lock *lock,
 	const unsigned char *old_sha1, int mustexist)
 {
-	if (read_ref_full(lock->ref_name, lock->old_sha1, mustexist, NULL)) {
+	if (read_ref_full(lock->ref_name,
+			  mustexist ? RESOLVE_REF_READING : 0,
+			  lock->old_sha1, NULL)) {
+		int save_errno = errno;
 		error("Can't verify ref %s", lock->ref_name);
 		unlock_ref(lock);
+		errno = save_errno;
 		return NULL;
 	}
 	if (hashcmp(lock->old_sha1, old_sha1)) {
 		error("Ref %s is at %s but expected %s", lock->ref_name,
 			sha1_to_hex(lock->old_sha1), sha1_to_hex(old_sha1));
 		unlock_ref(lock);
+		errno = EBUSY;
 		return NULL;
 	}
 	return lock;
@@ -1944,14 +2120,16 @@
 	 * only empty directories), remove them.
 	 */
 	struct strbuf path;
-	int result;
+	int result, save_errno;
 
 	strbuf_init(&path, 20);
 	strbuf_addstr(&path, file);
 
 	result = remove_dir_recursively(&path, REMOVE_DIR_EMPTY_ONLY);
+	save_errno = errno;
 
 	strbuf_release(&path);
+	errno = save_errno;
 
 	return result;
 }
@@ -1991,7 +2169,8 @@
 
 		this_result = refs_found ? sha1_from_ref : sha1;
 		mksnpath(fullref, sizeof(fullref), *p, len, str);
-		r = resolve_ref_unsafe(fullref, this_result, 1, &flag);
+		r = resolve_ref_unsafe(fullref, RESOLVE_REF_READING,
+				       this_result, &flag);
 		if (r) {
 			if (!refs_found++)
 				*ref = xstrdup(r);
@@ -2015,21 +2194,18 @@
 
 	*log = NULL;
 	for (p = ref_rev_parse_rules; *p; p++) {
-		struct stat st;
 		unsigned char hash[20];
 		char path[PATH_MAX];
 		const char *ref, *it;
 
 		mksnpath(path, sizeof(path), *p, len, str);
-		ref = resolve_ref_unsafe(path, hash, 1, NULL);
+		ref = resolve_ref_unsafe(path, RESOLVE_REF_READING,
+					 hash, NULL);
 		if (!ref)
 			continue;
-		if (!stat(git_path("logs/%s", path), &st) &&
-		    S_ISREG(st.st_mode))
+		if (reflog_exists(path))
 			it = path;
-		else if (strcmp(ref, path) &&
-			 !stat(git_path("logs/%s", ref), &st) &&
-			 S_ISREG(st.st_mode))
+		else if (strcmp(ref, path) && reflog_exists(ref))
 			it = ref;
 		else
 			continue;
@@ -2044,8 +2220,13 @@
 	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 *skip,
 					    int flags, int *type_p)
 {
 	char *ref_file;
@@ -2054,13 +2235,23 @@
 	int last_errno = 0;
 	int type, lflags;
 	int mustexist = (old_sha1 && !is_null_sha1(old_sha1));
+	int resolve_flags = 0;
 	int missing = 0;
 	int attempts_remaining = 3;
 
 	lock = xcalloc(1, sizeof(struct ref_lock));
 	lock->lock_fd = -1;
 
-	refname = resolve_ref_unsafe(refname, lock->old_sha1, mustexist, &type);
+	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_sha1, &type);
 	if (!refname && errno == EISDIR) {
 		/* we are trying to lock foo but we used to
 		 * have foo/bar which now does not exist;
@@ -2073,7 +2264,8 @@
 			error("there are still refs under '%s'", orig_refname);
 			goto error_return;
 		}
-		refname = resolve_ref_unsafe(orig_refname, lock->old_sha1, mustexist, &type);
+		refname = resolve_ref_unsafe(orig_refname, resolve_flags,
+					     lock->old_sha1, &type);
 	}
 	if (type_p)
 	    *type_p = type;
@@ -2090,7 +2282,7 @@
 	 * name is a proper prefix of our refname.
 	 */
 	if (missing &&
-	     !is_refname_available(refname, NULL, get_packed_refs(&ref_cache))) {
+	     !is_refname_available(refname, skip, get_packed_refs(&ref_cache))) {
 		last_errno = ENOTDIR;
 		goto error_return;
 	}
@@ -2100,7 +2292,7 @@
 	lflags = 0;
 	if (flags & REF_NODEREF) {
 		refname = orig_refname;
-		lflags |= LOCK_NODEREF;
+		lflags |= LOCK_NO_DEREF;
 	}
 	lock->ref_name = xstrdup(refname);
 	lock->orig_ref_name = xstrdup(orig_refname);
@@ -2134,7 +2326,7 @@
 			 */
 			goto retry;
 		else
-			unable_to_lock_index_die(ref_file, errno);
+			unable_to_lock_die(ref_file, errno);
 	}
 	return old_sha1 ? verify_lock(lock, old_sha1, mustexist) : lock;
 
@@ -2144,47 +2336,23 @@
 	return NULL;
 }
 
-struct ref_lock *lock_ref_sha1(const char *refname, const unsigned char *old_sha1)
-{
-	char refpath[PATH_MAX];
-	if (check_refname_format(refname, 0))
-		return NULL;
-	strcpy(refpath, mkpath("refs/%s", refname));
-	return lock_ref_sha1_basic(refpath, old_sha1, 0, NULL);
-}
-
 struct ref_lock *lock_any_ref_for_update(const char *refname,
 					 const unsigned char *old_sha1,
 					 int flags, int *type_p)
 {
-	if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL))
-		return NULL;
-	return lock_ref_sha1_basic(refname, old_sha1, flags, type_p);
+	return lock_ref_sha1_basic(refname, old_sha1, NULL, flags, type_p);
 }
 
 /*
  * 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(int fd, char *refname, unsigned char *sha1,
+static void write_packed_entry(FILE *fh, char *refname, unsigned char *sha1,
 			       unsigned char *peeled)
 {
-	char line[PATH_MAX + 100];
-	int len;
-
-	len = snprintf(line, sizeof(line), "%s %s\n",
-		       sha1_to_hex(sha1), refname);
-	/* this should not happen but just being defensive */
-	if (len > sizeof(line))
-		die("too long a refname '%s'", refname);
-	write_or_die(fd, line, len);
-
-	if (peeled) {
-		if (snprintf(line, sizeof(line), "^%s\n",
-			     sha1_to_hex(peeled)) != PEELED_LINE_LENGTH)
-			die("internal error");
-		write_or_die(fd, line, PEELED_LINE_LENGTH);
-	}
+	fprintf_or_die(fh, "%s %s\n", sha1_to_hex(sha1), refname);
+	if (peeled)
+		fprintf_or_die(fh, "^%s\n", sha1_to_hex(peeled));
 }
 
 /*
@@ -2192,18 +2360,18 @@
  */
 static int write_packed_entry_fn(struct ref_entry *entry, void *cb_data)
 {
-	int *fd = 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(*fd, entry->name, entry->u.value.sha1,
+	write_packed_entry(cb_data, entry->name, entry->u.value.sha1,
 			   peel_status == PEEL_PEELED ?
 			   entry->u.value.peeled : NULL);
 	return 0;
 }
 
+/* This should return a meaningful errno on failure */
 int lock_packed_refs(int flags)
 {
 	struct packed_ref_cache *packed_ref_cache;
@@ -2223,24 +2391,36 @@
 	return 0;
 }
 
+/*
+ * Commit the packed refs changes.
+ * On error we must make sure that errno contains a meaningful value.
+ */
 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");
-	write_or_die(packed_ref_cache->lock->fd,
-		     PACKED_REFS_HEADER, strlen(PACKED_REFS_HEADER));
 
+	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,
-				 &packed_ref_cache->lock->fd);
-	if (commit_lock_file(packed_ref_cache->lock))
+				 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;
 }
 
@@ -2353,13 +2533,25 @@
 /* make sure nobody touched the ref, and unlink */
 static void prune_ref(struct ref_to_prune *r)
 {
-	struct ref_lock *lock = lock_ref_sha1(r->name + 5, r->sha1);
+	struct ref_transaction *transaction;
+	struct strbuf err = STRBUF_INIT;
 
-	if (lock) {
-		unlink_or_warn(git_path("%s", r->name));
-		unlock_ref(lock);
-		try_remove_empty_parents(r->name);
+	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, 1, 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)
@@ -2415,7 +2607,7 @@
 		unsigned char sha1[20];
 		int flags;
 
-		if (read_ref_full(entry->name, sha1, 0, &flags))
+		if (read_ref_full(entry->name, 0, sha1, &flags))
 			/* We should at least have found the packed ref. */
 			die("Internal error");
 		if ((flags & REF_ISSYMREF) || !(flags & REF_ISPACKED)) {
@@ -2447,12 +2639,14 @@
 	return 0;
 }
 
-int repack_without_refs(const char **refnames, int n)
+int repack_without_refs(const char **refnames, int n, struct strbuf *err)
 {
 	struct ref_dir *packed;
 	struct string_list refs_to_delete = STRING_LIST_INIT_DUP;
 	struct string_list_item *ref_to_delete;
-	int i, removed = 0;
+	int i, ret, removed = 0;
+
+	assert(err);
 
 	/* Look for a packed ref */
 	for (i = 0; i < n; i++)
@@ -2464,8 +2658,8 @@
 		return 0; /* no refname exists in packed refs */
 
 	if (lock_packed_refs(0)) {
-		unable_to_lock_error(git_path("packed-refs"), errno);
-		return error("cannot delete '%s' from packed refs", refnames[i]);
+		unable_to_lock_message(git_path("packed-refs"), errno, err);
+		return -1;
 	}
 	packed = get_packed_refs(&ref_cache);
 
@@ -2490,24 +2684,26 @@
 	}
 
 	/* Write what remains */
-	return commit_packed_refs();
+	ret = commit_packed_refs();
+	if (ret)
+		strbuf_addf(err, "unable to overwrite old ref-pack file: %s",
+			    strerror(errno));
+	return ret;
 }
 
-static int repack_without_ref(const char *refname)
+static int delete_ref_loose(struct ref_lock *lock, int flag, struct strbuf *err)
 {
-	return repack_without_refs(&refname, 1);
-}
+	assert(err);
 
-static int delete_ref_loose(struct ref_lock *lock, int flag)
-{
 	if (!(flag & REF_ISPACKED) || flag & REF_ISSYMREF) {
-		/* loose */
-		int err, i = strlen(lock->lk->filename) - 5; /* .lock */
-
-		lock->lk->filename[i] = 0;
-		err = unlink_or_warn(lock->lk->filename);
-		lock->lk->filename[i] = '.';
-		if (err && errno != ENOENT)
+		/*
+		 * 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;
@@ -2515,24 +2711,22 @@
 
 int delete_ref(const char *refname, const unsigned char *sha1, int delopt)
 {
-	struct ref_lock *lock;
-	int ret = 0, flag = 0;
+	struct ref_transaction *transaction;
+	struct strbuf err = STRBUF_INIT;
 
-	lock = lock_ref_sha1_basic(refname, sha1, delopt, &flag);
-	if (!lock)
+	transaction = ref_transaction_begin(&err);
+	if (!transaction ||
+	    ref_transaction_delete(transaction, refname, sha1, delopt,
+				   sha1 && !is_null_sha1(sha1), NULL, &err) ||
+	    ref_transaction_commit(transaction, &err)) {
+		error("%s", err.buf);
+		ref_transaction_free(transaction);
+		strbuf_release(&err);
 		return 1;
-	ret |= delete_ref_loose(lock, flag);
-
-	/* removing the loose one could have resurrected an earlier
-	 * packed one.  Also, if it was not loose we need to repack
-	 * without it.
-	 */
-	ret |= repack_without_ref(lock->ref_name);
-
-	unlink_or_warn(git_path("logs/%s", lock->ref_name));
-	clear_loose_ref_cache(&ref_cache);
-	unlock_ref(lock);
-	return ret;
+	}
+	ref_transaction_free(transaction);
+	strbuf_release(&err);
+	return 0;
 }
 
 /*
@@ -2589,6 +2783,21 @@
 	return 0;
 }
 
+static int rename_ref_available(const char *oldname, const char *newname)
+{
+	struct string_list skip = STRING_LIST_INIT_NODUP;
+	int ret;
+
+	string_list_insert(&skip, oldname);
+	ret = is_refname_available(newname, &skip, get_packed_refs(&ref_cache))
+	    && is_refname_available(newname, &skip, get_loose_refs(&ref_cache));
+	string_list_clear(&skip, 0);
+	return ret;
+}
+
+static int write_ref_sha1(struct ref_lock *lock, const unsigned char *sha1,
+			  const char *logmsg);
+
 int rename_ref(const char *oldrefname, const char *newrefname, const char *logmsg)
 {
 	unsigned char sha1[20], orig_sha1[20];
@@ -2601,17 +2810,15 @@
 	if (log && S_ISLNK(loginfo.st_mode))
 		return error("reflog for %s is a symlink", oldrefname);
 
-	symref = resolve_ref_unsafe(oldrefname, orig_sha1, 1, &flag);
+	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 (!is_refname_available(newrefname, oldrefname, get_packed_refs(&ref_cache)))
-		return 1;
-
-	if (!is_refname_available(newrefname, oldrefname, get_loose_refs(&ref_cache)))
+	if (!rename_ref_available(oldrefname, newrefname))
 		return 1;
 
 	if (log && rename(git_path("logs/%s", oldrefname), git_path(TMP_RENAMED_LOG)))
@@ -2623,7 +2830,7 @@
 		goto rollback;
 	}
 
-	if (!read_ref_full(newrefname, sha1, 1, &flag) &&
+	if (!read_ref_full(newrefname, RESOLVE_REF_READING, sha1, NULL) &&
 	    delete_ref(newrefname, sha1, REF_NODEREF)) {
 		if (errno==EISDIR) {
 			if (remove_empty_directories(git_path("%s", newrefname))) {
@@ -2641,7 +2848,7 @@
 
 	logmoved = log;
 
-	lock = lock_ref_sha1_basic(newrefname, NULL, 0, NULL);
+	lock = lock_ref_sha1_basic(newrefname, NULL, NULL, 0, NULL);
 	if (!lock) {
 		error("unable to lock %s for update", newrefname);
 		goto rollback;
@@ -2656,7 +2863,7 @@
 	return 0;
 
  rollback:
-	lock = lock_ref_sha1_basic(oldrefname, NULL, 0, NULL);
+	lock = lock_ref_sha1_basic(oldrefname, NULL, NULL, 0, NULL);
 	if (!lock) {
 		error("unable to lock %s for rollback", oldrefname);
 		goto rollbacklog;
@@ -2733,6 +2940,7 @@
 	return cp - buf;
 }
 
+/* This function must set a meaningful errno on failure */
 int log_ref_setup(const char *refname, char *logfile, int bufsize)
 {
 	int logfd, oflags = O_APPEND | O_WRONLY;
@@ -2743,9 +2951,12 @@
 	     starts_with(refname, "refs/remotes/") ||
 	     starts_with(refname, "refs/notes/") ||
 	     !strcmp(refname, "HEAD"))) {
-		if (safe_create_leading_directories(logfile) < 0)
-			return error("unable to create directory for %s",
-				     logfile);
+		if (safe_create_leading_directories(logfile) < 0) {
+			int save_errno = errno;
+			error("unable to create directory for %s", logfile);
+			errno = save_errno;
+			return -1;
+		}
 		oflags |= O_CREAT;
 	}
 
@@ -2756,15 +2967,22 @@
 
 		if (errno == EISDIR) {
 			if (remove_empty_directories(logfile)) {
-				return error("There are still logs under '%s'",
-					     logfile);
+				int save_errno = errno;
+				error("There are still logs under '%s'",
+				      logfile);
+				errno = save_errno;
+				return -1;
 			}
 			logfd = open(logfile, oflags, 0666);
 		}
 
-		if (logfd < 0)
-			return error("Unable to append to %s: %s",
-				     logfile, strerror(errno));
+		if (logfd < 0) {
+			int save_errno = errno;
+			error("Unable to append to %s: %s", logfile,
+			      strerror(errno));
+			errno = save_errno;
+			return -1;
+		}
 	}
 
 	adjust_shared_perm(logfile);
@@ -2804,24 +3022,41 @@
 		len += copy_msg(logrec + len - 1, msg) - 1;
 	written = len <= maxlen ? write_in_full(logfd, logrec, len) : -1;
 	free(logrec);
-	if (close(logfd) != 0 || written != len)
-		return error("Unable to append to %s", log_file);
+	if (written != len) {
+		int save_errno = errno;
+		close(logfd);
+		error("Unable to append to %s", log_file);
+		errno = save_errno;
+		return -1;
+	}
+	if (close(logfd)) {
+		int save_errno = errno;
+		error("Unable to append to %s", log_file);
+		errno = save_errno;
+		return -1;
+	}
 	return 0;
 }
 
-static int is_branch(const char *refname)
+int is_branch(const char *refname)
 {
 	return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
 }
 
-int write_ref_sha1(struct ref_lock *lock,
+/*
+ * Write sha1 into the ref specified by the lock. Make sure that errno
+ * is sane on error.
+ */
+static int write_ref_sha1(struct ref_lock *lock,
 	const unsigned char *sha1, const char *logmsg)
 {
 	static char term = '\n';
 	struct object *o;
 
-	if (!lock)
+	if (!lock) {
+		errno = EINVAL;
 		return -1;
+	}
 	if (!lock->force_write && !hashcmp(lock->old_sha1, sha1)) {
 		unlock_ref(lock);
 		return 0;
@@ -2831,19 +3066,23 @@
 		error("Trying to write ref %s with nonexistent object %s",
 			lock->ref_name, sha1_to_hex(sha1));
 		unlock_ref(lock);
+		errno = EINVAL;
 		return -1;
 	}
 	if (o->type != OBJ_COMMIT && is_branch(lock->ref_name)) {
 		error("Trying to write non-commit object %s to branch %s",
 			sha1_to_hex(sha1), lock->ref_name);
 		unlock_ref(lock);
+		errno = EINVAL;
 		return -1;
 	}
 	if (write_in_full(lock->lock_fd, sha1_to_hex(sha1), 40) != 40 ||
-	    write_in_full(lock->lock_fd, &term, 1) != 1
-		|| close_ref(lock) < 0) {
-		error("Couldn't write %s", lock->lk->filename);
+	    write_in_full(lock->lock_fd, &term, 1) != 1 ||
+	    close_ref(lock) < 0) {
+		int save_errno = errno;
+		error("Couldn't write %s", lock->lk->filename.buf);
 		unlock_ref(lock);
+		errno = save_errno;
 		return -1;
 	}
 	clear_loose_ref_cache(&ref_cache);
@@ -2869,7 +3108,8 @@
 		unsigned char head_sha1[20];
 		int head_flag;
 		const char *head_ref;
-		head_ref = resolve_ref_unsafe("HEAD", head_sha1, 1, &head_flag);
+		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))
 			log_ref_write("HEAD", lock->old_sha1, sha1, logmsg);
@@ -2946,122 +3186,137 @@
 	return 0;
 }
 
-static char *ref_msg(const char *line, const char *endp)
+struct read_ref_at_cb {
+	const char *refname;
+	unsigned long at_time;
+	int cnt;
+	int reccnt;
+	unsigned char *sha1;
+	int found_it;
+
+	unsigned char osha1[20];
+	unsigned char nsha1[20];
+	int tz;
+	unsigned long date;
+	char **msg;
+	unsigned long *cutoff_time;
+	int *cutoff_tz;
+	int *cutoff_cnt;
+};
+
+static int read_ref_at_ent(unsigned char *osha1, unsigned char *nsha1,
+		const char *email, unsigned long timestamp, int tz,
+		const char *message, void *cb_data)
 {
-	const char *ep;
-	line += 82;
-	ep = memchr(line, '\n', endp - line);
-	if (!ep)
-		ep = endp;
-	return xmemdupz(line, ep - line);
+	struct read_ref_at_cb *cb = cb_data;
+
+	cb->reccnt++;
+	cb->tz = tz;
+	cb->date = timestamp;
+
+	if (timestamp <= cb->at_time || cb->cnt == 0) {
+		if (cb->msg)
+			*cb->msg = xstrdup(message);
+		if (cb->cutoff_time)
+			*cb->cutoff_time = timestamp;
+		if (cb->cutoff_tz)
+			*cb->cutoff_tz = tz;
+		if (cb->cutoff_cnt)
+			*cb->cutoff_cnt = cb->reccnt - 1;
+		/*
+		 * we have not yet updated cb->[n|o]sha1 so they still
+		 * hold the values for the previous record.
+		 */
+		if (!is_null_sha1(cb->osha1)) {
+			hashcpy(cb->sha1, nsha1);
+			if (hashcmp(cb->osha1, nsha1))
+				warning("Log for ref %s has gap after %s.",
+					cb->refname, show_date(cb->date, cb->tz, DATE_RFC2822));
+		}
+		else if (cb->date == cb->at_time)
+			hashcpy(cb->sha1, nsha1);
+		else if (hashcmp(nsha1, cb->sha1))
+			warning("Log for ref %s unexpectedly ended on %s.",
+				cb->refname, show_date(cb->date, cb->tz,
+						   DATE_RFC2822));
+		hashcpy(cb->osha1, osha1);
+		hashcpy(cb->nsha1, nsha1);
+		cb->found_it = 1;
+		return 1;
+	}
+	hashcpy(cb->osha1, osha1);
+	hashcpy(cb->nsha1, nsha1);
+	if (cb->cnt > 0)
+		cb->cnt--;
+	return 0;
 }
 
-int read_ref_at(const char *refname, unsigned long at_time, int cnt,
+static int read_ref_at_ent_oldest(unsigned char *osha1, unsigned char *nsha1,
+				  const char *email, unsigned long timestamp,
+				  int tz, const char *message, void *cb_data)
+{
+	struct read_ref_at_cb *cb = cb_data;
+
+	if (cb->msg)
+		*cb->msg = xstrdup(message);
+	if (cb->cutoff_time)
+		*cb->cutoff_time = timestamp;
+	if (cb->cutoff_tz)
+		*cb->cutoff_tz = tz;
+	if (cb->cutoff_cnt)
+		*cb->cutoff_cnt = cb->reccnt;
+	hashcpy(cb->sha1, osha1);
+	if (is_null_sha1(cb->sha1))
+		hashcpy(cb->sha1, nsha1);
+	/* We just want the first entry */
+	return 1;
+}
+
+int read_ref_at(const char *refname, unsigned int flags, unsigned long at_time, int cnt,
 		unsigned char *sha1, char **msg,
 		unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
 {
-	const char *logfile, *logdata, *logend, *rec, *lastgt, *lastrec;
-	char *tz_c;
-	int logfd, tz, reccnt = 0;
-	struct stat st;
-	unsigned long date;
-	unsigned char logged_sha1[20];
-	void *log_mapped;
-	size_t mapsz;
+	struct read_ref_at_cb cb;
 
-	logfile = git_path("logs/%s", refname);
-	logfd = open(logfile, O_RDONLY, 0);
-	if (logfd < 0)
-		die_errno("Unable to read log '%s'", logfile);
-	fstat(logfd, &st);
-	if (!st.st_size)
-		die("Log %s is empty.", logfile);
-	mapsz = xsize_t(st.st_size);
-	log_mapped = xmmap(NULL, mapsz, PROT_READ, MAP_PRIVATE, logfd, 0);
-	logdata = log_mapped;
-	close(logfd);
+	memset(&cb, 0, sizeof(cb));
+	cb.refname = refname;
+	cb.at_time = at_time;
+	cb.cnt = cnt;
+	cb.msg = msg;
+	cb.cutoff_time = cutoff_time;
+	cb.cutoff_tz = cutoff_tz;
+	cb.cutoff_cnt = cutoff_cnt;
+	cb.sha1 = sha1;
 
-	lastrec = NULL;
-	rec = logend = logdata + st.st_size;
-	while (logdata < rec) {
-		reccnt++;
-		if (logdata < rec && *(rec-1) == '\n')
-			rec--;
-		lastgt = NULL;
-		while (logdata < rec && *(rec-1) != '\n') {
-			rec--;
-			if (*rec == '>')
-				lastgt = rec;
-		}
-		if (!lastgt)
-			die("Log %s is corrupt.", logfile);
-		date = strtoul(lastgt + 1, &tz_c, 10);
-		if (date <= at_time || cnt == 0) {
-			tz = strtoul(tz_c, NULL, 10);
-			if (msg)
-				*msg = ref_msg(rec, logend);
-			if (cutoff_time)
-				*cutoff_time = date;
-			if (cutoff_tz)
-				*cutoff_tz = tz;
-			if (cutoff_cnt)
-				*cutoff_cnt = reccnt - 1;
-			if (lastrec) {
-				if (get_sha1_hex(lastrec, logged_sha1))
-					die("Log %s is corrupt.", logfile);
-				if (get_sha1_hex(rec + 41, sha1))
-					die("Log %s is corrupt.", logfile);
-				if (hashcmp(logged_sha1, sha1)) {
-					warning("Log %s has gap after %s.",
-						logfile, show_date(date, tz, DATE_RFC2822));
-				}
-			}
-			else if (date == at_time) {
-				if (get_sha1_hex(rec + 41, sha1))
-					die("Log %s is corrupt.", logfile);
-			}
-			else {
-				if (get_sha1_hex(rec + 41, logged_sha1))
-					die("Log %s is corrupt.", logfile);
-				if (hashcmp(logged_sha1, sha1)) {
-					warning("Log %s unexpectedly ended on %s.",
-						logfile, show_date(date, tz, DATE_RFC2822));
-				}
-			}
-			munmap(log_mapped, mapsz);
-			return 0;
-		}
-		lastrec = rec;
-		if (cnt > 0)
-			cnt--;
+	for_each_reflog_ent_reverse(refname, read_ref_at_ent, &cb);
+
+	if (!cb.reccnt) {
+		if (flags & GET_SHA1_QUIETLY)
+			exit(128);
+		else
+			die("Log for %s is empty.", refname);
 	}
+	if (cb.found_it)
+		return 0;
 
-	rec = logdata;
-	while (rec < logend && *rec != '>' && *rec != '\n')
-		rec++;
-	if (rec == logend || *rec == '\n')
-		die("Log %s is corrupt.", logfile);
-	date = strtoul(rec + 1, &tz_c, 10);
-	tz = strtoul(tz_c, NULL, 10);
-	if (get_sha1_hex(logdata, sha1))
-		die("Log %s is corrupt.", logfile);
-	if (is_null_sha1(sha1)) {
-		if (get_sha1_hex(logdata + 41, sha1))
-			die("Log %s is corrupt.", logfile);
-	}
-	if (msg)
-		*msg = ref_msg(logdata, logend);
-	munmap(log_mapped, mapsz);
+	for_each_reflog_ent(refname, read_ref_at_ent_oldest, &cb);
 
-	if (cutoff_time)
-		*cutoff_time = date;
-	if (cutoff_tz)
-		*cutoff_tz = tz;
-	if (cutoff_cnt)
-		*cutoff_cnt = reccnt;
 	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];
@@ -3214,7 +3469,7 @@
 
 		if (de->d_name[0] == '.')
 			continue;
-		if (has_extension(de->d_name, ".lock"))
+		if (ends_with(de->d_name, ".lock"))
 			continue;
 		strbuf_addstr(name, de->d_name);
 		if (stat(git_path("logs/%s", name->buf), &st) < 0) {
@@ -3225,7 +3480,7 @@
 				retval = do_for_each_reflog(name, fn, cb_data);
 			} else {
 				unsigned char sha1[20];
-				if (read_ref_full(name->buf, sha1, 0, NULL))
+				if (read_ref_full(name->buf, 0, sha1, NULL))
 					retval = error("bad ref for %s", name->buf);
 				else
 					retval = fn(name->buf, sha1, 0, cb_data);
@@ -3249,37 +3504,177 @@
 	return retval;
 }
 
-static struct ref_lock *update_ref_lock(const char *refname,
-					const unsigned char *oldval,
-					int flags, int *type_p,
-					enum action_on_err onerr)
-{
+/**
+ * Information needed for a single ref update.  Set new_sha1 to the
+ * new value or to zero to delete the ref.  To check the old value
+ * while locking the ref, set have_old to 1 and set old_sha1 to the
+ * value or to zero to ensure the ref does not exist before update.
+ */
+struct ref_update {
+	unsigned char new_sha1[20];
+	unsigned char old_sha1[20];
+	int flags; /* REF_NODEREF? */
+	int have_old; /* 1 if old_sha1 is valid, 0 otherwise */
 	struct ref_lock *lock;
-	lock = lock_any_ref_for_update(refname, oldval, flags, type_p);
-	if (!lock) {
-		const char *str = "Cannot lock the ref '%s'.";
-		switch (onerr) {
-		case MSG_ON_ERR: error(str, refname); break;
-		case DIE_ON_ERR: die(str, refname); break;
-		case QUIET_ON_ERR: break;
-		}
-	}
-	return 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);
+
+	return xcalloc(1, sizeof(struct ref_transaction));
 }
 
-static int update_ref_write(const char *action, const char *refname,
-			    const unsigned char *sha1, struct ref_lock *lock,
-			    enum action_on_err onerr)
+void ref_transaction_free(struct ref_transaction *transaction)
 {
-	if (write_ref_sha1(lock, sha1, action) < 0) {
-		const char *str = "Cannot update the ref '%s'.";
-		switch (onerr) {
-		case MSG_ON_ERR: error(str, refname); break;
-		case DIE_ON_ERR: die(str, refname); break;
-		case QUIET_ON_ERR: break;
-		}
-		return 1;
+	int i;
+
+	if (!transaction)
+		return;
+
+	for (i = 0; i < transaction->nr; i++) {
+		free(transaction->updates[i]->msg);
+		free(transaction->updates[i]);
 	}
+	free(transaction->updates);
+	free(transaction);
+}
+
+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);
+	ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
+	transaction->updates[transaction->nr++] = update;
+	return update;
+}
+
+int ref_transaction_update(struct ref_transaction *transaction,
+			   const char *refname,
+			   const unsigned char *new_sha1,
+			   const unsigned char *old_sha1,
+			   int flags, int have_old, const char *msg,
+			   struct strbuf *err)
+{
+	struct ref_update *update;
+
+	assert(err);
+
+	if (transaction->state != REF_TRANSACTION_OPEN)
+		die("BUG: update called for transaction that is not open");
+
+	if (have_old && !old_sha1)
+		die("BUG: have_old is true but old_sha1 is NULL");
+
+	if (!is_null_sha1(new_sha1) &&
+	    check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
+		strbuf_addf(err, "refusing to update ref with bad name %s",
+			    refname);
+		return -1;
+	}
+
+	update = add_update(transaction, refname);
+	hashcpy(update->new_sha1, new_sha1);
+	update->flags = flags;
+	update->have_old = have_old;
+	if (have_old)
+		hashcpy(update->old_sha1, old_sha1);
+	if (msg)
+		update->msg = xstrdup(msg);
+	return 0;
+}
+
+int ref_transaction_create(struct ref_transaction *transaction,
+			   const char *refname,
+			   const unsigned char *new_sha1,
+			   int flags, const char *msg,
+			   struct strbuf *err)
+{
+	struct ref_update *update;
+
+	assert(err);
+
+	if (transaction->state != REF_TRANSACTION_OPEN)
+		die("BUG: create called for transaction that is not open");
+
+	if (!new_sha1 || is_null_sha1(new_sha1))
+		die("BUG: create ref with null new_sha1");
+
+	if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
+		strbuf_addf(err, "refusing to create ref with bad name %s",
+			    refname);
+		return -1;
+	}
+
+	update = add_update(transaction, refname);
+
+	hashcpy(update->new_sha1, new_sha1);
+	hashclr(update->old_sha1);
+	update->flags = flags;
+	update->have_old = 1;
+	if (msg)
+		update->msg = xstrdup(msg);
+	return 0;
+}
+
+int ref_transaction_delete(struct ref_transaction *transaction,
+			   const char *refname,
+			   const unsigned char *old_sha1,
+			   int flags, int have_old, const char *msg,
+			   struct strbuf *err)
+{
+	struct ref_update *update;
+
+	assert(err);
+
+	if (transaction->state != REF_TRANSACTION_OPEN)
+		die("BUG: delete called for transaction that is not open");
+
+	if (have_old && !old_sha1)
+		die("BUG: have_old is true but old_sha1 is NULL");
+
+	update = add_update(transaction, refname);
+	update->flags = flags;
+	update->have_old = have_old;
+	if (have_old) {
+		assert(!is_null_sha1(old_sha1));
+		hashcpy(update->old_sha1, old_sha1);
+	}
+	if (msg)
+		update->msg = xstrdup(msg);
 	return 0;
 }
 
@@ -3287,109 +3682,157 @@
 	       const unsigned char *sha1, const unsigned char *oldval,
 	       int flags, enum action_on_err onerr)
 {
-	struct ref_lock *lock;
-	lock = update_ref_lock(refname, oldval, flags, NULL, onerr);
-	if (!lock)
+	struct ref_transaction *t;
+	struct strbuf err = STRBUF_INIT;
+
+	t = ref_transaction_begin(&err);
+	if (!t ||
+	    ref_transaction_update(t, refname, sha1, oldval, flags,
+				   !!oldval, action, &err) ||
+	    ref_transaction_commit(t, &err)) {
+		const char *str = "update_ref failed for ref '%s': %s";
+
+		ref_transaction_free(t);
+		switch (onerr) {
+		case UPDATE_REFS_MSG_ON_ERR:
+			error(str, refname, err.buf);
+			break;
+		case UPDATE_REFS_DIE_ON_ERR:
+			die(str, refname, err.buf);
+			break;
+		case UPDATE_REFS_QUIET_ON_ERR:
+			break;
+		}
+		strbuf_release(&err);
 		return 1;
-	return update_ref_write(action, refname, sha1, lock, onerr);
+	}
+	strbuf_release(&err);
+	ref_transaction_free(t);
+	return 0;
 }
 
 static int ref_update_compare(const void *r1, const void *r2)
 {
 	const struct ref_update * const *u1 = r1;
 	const struct ref_update * const *u2 = r2;
-	return strcmp((*u1)->ref_name, (*u2)->ref_name);
+	return strcmp((*u1)->refname, (*u2)->refname);
 }
 
 static int ref_update_reject_duplicates(struct ref_update **updates, int n,
-					enum action_on_err onerr)
+					struct strbuf *err)
 {
 	int i;
+
+	assert(err);
+
 	for (i = 1; i < n; i++)
-		if (!strcmp(updates[i - 1]->ref_name, updates[i]->ref_name)) {
-			const char *str =
-				"Multiple updates for ref '%s' not allowed.";
-			switch (onerr) {
-			case MSG_ON_ERR:
-				error(str, updates[i]->ref_name); break;
-			case DIE_ON_ERR:
-				die(str, updates[i]->ref_name); break;
-			case QUIET_ON_ERR:
-				break;
-			}
+		if (!strcmp(updates[i - 1]->refname, updates[i]->refname)) {
+			strbuf_addf(err,
+				    "Multiple updates for ref '%s' not allowed.",
+				    updates[i]->refname);
 			return 1;
 		}
 	return 0;
 }
 
-int update_refs(const char *action, const struct ref_update **updates_orig,
-		int n, enum action_on_err onerr)
+int ref_transaction_commit(struct ref_transaction *transaction,
+			   struct strbuf *err)
 {
 	int ret = 0, delnum = 0, i;
-	struct ref_update **updates;
-	int *types;
-	struct ref_lock **locks;
 	const char **delnames;
+	int n = transaction->nr;
+	struct ref_update **updates = transaction->updates;
 
-	if (!updates_orig || !n)
+	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;
+	}
 
 	/* Allocate work space */
-	updates = xmalloc(sizeof(*updates) * n);
-	types = xmalloc(sizeof(*types) * n);
-	locks = xcalloc(n, sizeof(*locks));
 	delnames = xmalloc(sizeof(*delnames) * n);
 
 	/* Copy, sort, and reject duplicate refs */
-	memcpy(updates, updates_orig, sizeof(*updates) * n);
 	qsort(updates, n, sizeof(*updates), ref_update_compare);
-	ret = ref_update_reject_duplicates(updates, n, onerr);
-	if (ret)
+	if (ref_update_reject_duplicates(updates, n, err)) {
+		ret = TRANSACTION_GENERIC_ERROR;
 		goto cleanup;
+	}
 
 	/* Acquire all locks while verifying old values */
 	for (i = 0; i < n; i++) {
-		locks[i] = update_ref_lock(updates[i]->ref_name,
-					   (updates[i]->have_old ?
-					    updates[i]->old_sha1 : NULL),
-					   updates[i]->flags,
-					   &types[i], onerr);
-		if (!locks[i]) {
-			ret = 1;
+		struct ref_update *update = updates[i];
+		int flags = update->flags;
+
+		if (is_null_sha1(update->new_sha1))
+			flags |= REF_DELETING;
+		update->lock = lock_ref_sha1_basic(update->refname,
+						   (update->have_old ?
+						    update->old_sha1 :
+						    NULL),
+						   NULL,
+						   flags,
+						   &update->type);
+		if (!update->lock) {
+			ret = (errno == ENOTDIR)
+				? TRANSACTION_NAME_CONFLICT
+				: TRANSACTION_GENERIC_ERROR;
+			strbuf_addf(err, "Cannot lock the ref '%s'.",
+				    update->refname);
 			goto cleanup;
 		}
 	}
 
 	/* Perform updates first so live commits remain referenced */
-	for (i = 0; i < n; i++)
-		if (!is_null_sha1(updates[i]->new_sha1)) {
-			ret = update_ref_write(action,
-					       updates[i]->ref_name,
-					       updates[i]->new_sha1,
-					       locks[i], onerr);
-			locks[i] = NULL; /* freed by update_ref_write */
-			if (ret)
+	for (i = 0; i < n; i++) {
+		struct ref_update *update = updates[i];
+
+		if (!is_null_sha1(update->new_sha1)) {
+			if (write_ref_sha1(update->lock, update->new_sha1,
+					   update->msg)) {
+				update->lock = NULL; /* freed by write_ref_sha1 */
+				strbuf_addf(err, "Cannot update the ref '%s'.",
+					    update->refname);
+				ret = TRANSACTION_GENERIC_ERROR;
 				goto cleanup;
+			}
+			update->lock = NULL; /* freed by write_ref_sha1 */
 		}
+	}
 
 	/* Perform deletes now that updates are safely completed */
-	for (i = 0; i < n; i++)
-		if (locks[i]) {
-			delnames[delnum++] = locks[i]->ref_name;
-			ret |= delete_ref_loose(locks[i], types[i]);
+	for (i = 0; i < n; i++) {
+		struct ref_update *update = updates[i];
+
+		if (update->lock) {
+			if (delete_ref_loose(update->lock, update->type, err)) {
+				ret = TRANSACTION_GENERIC_ERROR;
+				goto cleanup;
+			}
+
+			if (!(update->flags & REF_ISPRUNING))
+				delnames[delnum++] = update->lock->ref_name;
 		}
-	ret |= repack_without_refs(delnames, delnum);
+	}
+
+	if (repack_without_refs(delnames, delnum, err)) {
+		ret = TRANSACTION_GENERIC_ERROR;
+		goto cleanup;
+	}
 	for (i = 0; i < delnum; i++)
 		unlink_or_warn(git_path("logs/%s", delnames[i]));
 	clear_loose_ref_cache(&ref_cache);
 
 cleanup:
+	transaction->state = REF_TRANSACTION_CLOSED;
+
 	for (i = 0; i < n; i++)
-		if (locks[i])
-			unlock_ref(locks[i]);
-	free(updates);
-	free(types);
-	free(locks);
+		if (updates[i]->lock)
+			unlock_ref(updates[i]->lock);
 	free(delnames);
 	return ret;
 }
diff --git a/refs.h b/refs.h
index 1440acc..2bc3556 100644
--- a/refs.h
+++ b/refs.h
@@ -10,19 +10,39 @@
 	int force_write;
 };
 
-/**
- * Information needed for a single ref update.  Set new_sha1 to the
- * new value or to zero to delete the ref.  To check the old value
- * while locking the ref, set have_old to 1 and set old_sha1 to the
- * value or to zero to ensure the ref does not exist before update.
+/*
+ * A ref_transaction represents a collection of ref updates
+ * that should succeed or fail together.
+ *
+ * Calling sequence
+ * ----------------
+ * - Allocate and initialize a `struct ref_transaction` by calling
+ *   `ref_transaction_begin()`.
+ *
+ * - List intended ref updates by calling functions like
+ *   `ref_transaction_update()` and `ref_transaction_create()`.
+ *
+ * - Call `ref_transaction_commit()` to execute the transaction.
+ *   If this succeeds, the ref updates will have taken place and
+ *   the transaction cannot be rolled back.
+ *
+ * - 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
+ *   successfully committed.
+ *
+ * Error handling
+ * --------------
+ *
+ * On error, transaction functions append a message about what
+ * went wrong to the 'err' argument.  The message mentions what
+ * ref was being updated (if any) when the error occurred so it
+ * can be passed to 'die' or 'error' as-is.
+ *
+ * The message is appended to err without first clearing err.
+ * err will not be '\n' terminated.
  */
-struct ref_update {
-	const char *ref_name;
-	unsigned char new_sha1[20];
-	unsigned char old_sha1[20];
-	int flags; /* REF_NODEREF? */
-	int have_old; /* 1 if old_sha1 is valid, 0 otherwise */
-};
+struct ref_transaction;
 
 /*
  * Bit values set in the flags argument passed to each_ref_fn():
@@ -36,12 +56,20 @@
 
 /*
  * Reference cannot be resolved to an object name: dangling symbolic
- * reference (directly or indirectly), corrupt reference file, or
- * symbolic reference refers to ill-formatted reference name.
+ * reference (directly or indirectly), corrupt reference file,
+ * reference exists but name is bad, or symbolic reference refers to
+ * ill-formatted reference name.
  */
 #define REF_ISBROKEN 0x04
 
 /*
+ * Reference name is not well formed.
+ *
+ * See git-check-ref-format(1) for the definition of well formed ref names.
+ */
+#define REF_BAD_NAME 0x08
+
+/*
  * The signature for the callback function for the for_each_*()
  * functions below.  The memory pointed to by the refname and sha1
  * arguments is only guaranteed to be valid for the duration of a
@@ -89,11 +117,12 @@
 extern int for_each_rawref(each_ref_fn, void *);
 
 extern void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname);
-extern void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list* refnames);
+extern void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames);
 
 /*
  * Lock the packed-refs file for writing.  Flags is passed to
  * hold_lock_file_for_update().  Return 0 on success.
+ * Errno is set to something meaningful on error.
  */
 extern int lock_packed_refs(int flags);
 
@@ -109,6 +138,7 @@
  * 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.
+ * Sets errno to something meaningful on error.
  */
 extern int commit_packed_refs(void);
 
@@ -133,10 +163,13 @@
  */
 int pack_refs(unsigned int flags);
 
-extern int repack_without_refs(const char **refnames, int n);
+extern int repack_without_refs(const char **refnames, int n,
+			       struct strbuf *err);
 
 extern int ref_exists(const char *);
 
+extern int is_branch(const char *refname);
+
 /*
  * If refname is a non-symbolic reference that refers to a tag object,
  * and the tag can be (recursively) dereferenced to a non-tag object,
@@ -147,11 +180,20 @@
  */
 extern int peel_ref(const char *refname, unsigned char *sha1);
 
-/** Locks a "refs/" ref returning the lock on success and NULL on failure. **/
-extern struct ref_lock *lock_ref_sha1(const char *refname, const unsigned char *old_sha1);
-
-/** Locks any ref (for 'HEAD' type refs). */
+/*
+ * Flags controlling lock_any_ref_for_update(), ref_transaction_update(),
+ * ref_transaction_create(), etc.
+ * REF_NODEREF: act on the ref directly, instead of dereferencing
+ *              symbolic references.
+ * REF_DELETING: tolerate broken refs
+ *
+ * Flags >= 0x100 are reserved for internal use.
+ */
 #define REF_NODEREF	0x01
+#define REF_DELETING	0x02
+/*
+ * This function sets errno to something meaningful on failure.
+ */
 extern struct ref_lock *lock_any_ref_for_update(const char *refname,
 						const unsigned char *old_sha1,
 						int flags, int *type_p);
@@ -165,17 +207,23 @@
 /** Release any lock taken but not written. **/
 extern void unlock_ref(struct ref_lock *lock);
 
-/** Writes sha1 into the ref specified by the lock. **/
-extern int write_ref_sha1(struct ref_lock *lock, const unsigned char *sha1, const char *msg);
-
-/** Setup reflog before using. **/
-int log_ref_setup(const char *ref_name, char *logfile, int bufsize);
+/*
+ * Setup reflog before using. Set errno to something meaningful on failure.
+ */
+int log_ref_setup(const char *refname, char *logfile, int bufsize);
 
 /** Reads log for the value of ref during at_time. **/
-extern int read_ref_at(const char *refname, unsigned long at_time, int cnt,
+extern int read_ref_at(const char *refname, unsigned int flags,
+		       unsigned long at_time, int cnt,
 		       unsigned char *sha1, char **msg,
 		       unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt);
 
+/** Check if a particular reflog exists */
+extern int reflog_exists(const char *refname);
+
+/** Delete a reflog */
+extern int delete_reflog(const char *refname);
+
 /* iterate over reflog entries */
 typedef int each_reflog_ent_fn(unsigned char *osha1, unsigned char *nsha1, const char *, unsigned long, int, const char *, void *);
 int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn, void *cb_data);
@@ -189,7 +237,6 @@
 
 #define REFNAME_ALLOW_ONELEVEL 1
 #define REFNAME_REFSPEC_PATTERN 2
-#define REFNAME_DOT_COMPONENT 4
 
 /*
  * Return 0 iff refname has the correct format for a refname according
@@ -197,10 +244,7 @@
  * If REFNAME_ALLOW_ONELEVEL is set in flags, then accept one-level
  * reference names.  If REFNAME_REFSPEC_PATTERN is set in flags, then
  * allow a "*" wildcard character in place of one of the name
- * components.  No leading or repeated slashes are accepted.  If
- * REFNAME_DOT_COMPONENT is set in flags, then allow refname
- * components to start with "." (but not a whole component equal to
- * "." or "..").
+ * components.  No leading or repeated slashes are accepted.
  */
 extern int check_refname_format(const char *refname, int flags);
 
@@ -217,18 +261,95 @@
  */
 extern int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1);
 
-/** lock a ref and then write its file */
-enum action_on_err { MSG_ON_ERR, DIE_ON_ERR, QUIET_ON_ERR };
+enum action_on_err {
+	UPDATE_REFS_MSG_ON_ERR,
+	UPDATE_REFS_DIE_ON_ERR,
+	UPDATE_REFS_QUIET_ON_ERR
+};
+
+/*
+ * Begin a reference transaction.  The reference transaction must
+ * be freed by calling ref_transaction_free().
+ */
+struct ref_transaction *ref_transaction_begin(struct strbuf *err);
+
+/*
+ * The following functions add a reference check or update to a
+ * ref_transaction.  In all of them, refname is the name of the
+ * reference to be affected.  The functions make internal copies of
+ * refname and msg, so the caller retains ownership of these parameters.
+ * flags can be REF_NODEREF; it is passed to update_ref_lock().
+ */
+
+/*
+ * Add a reference update to transaction.  new_sha1 is the value that
+ * the reference should have after the update, or zeros if it should
+ * be deleted.  If have_old is true, then old_sha1 holds the value
+ * that the reference should have had before the update, or zeros if
+ * it must not have existed beforehand.
+ * Function returns 0 on success and non-zero on failure. A failure to update
+ * means that the transaction as a whole has failed and will need to be
+ * rolled back.
+ */
+int ref_transaction_update(struct ref_transaction *transaction,
+			   const char *refname,
+			   const unsigned char *new_sha1,
+			   const unsigned char *old_sha1,
+			   int flags, int have_old, const char *msg,
+			   struct strbuf *err);
+
+/*
+ * Add a reference creation to transaction.  new_sha1 is the value
+ * that the reference should have after the update; it must not be the
+ * null SHA-1.  It is verified that the reference does not exist
+ * already.
+ * Function returns 0 on success and non-zero on failure. A failure to create
+ * means that the transaction as a whole has failed and will need to be
+ * rolled back.
+ */
+int ref_transaction_create(struct ref_transaction *transaction,
+			   const char *refname,
+			   const unsigned char *new_sha1,
+			   int flags, const char *msg,
+			   struct strbuf *err);
+
+/*
+ * Add a reference deletion to transaction.  If have_old is true, then
+ * old_sha1 holds the value that the reference should have had before
+ * the update (which must not be the null SHA-1).
+ * Function returns 0 on success and non-zero on failure. A failure to delete
+ * means that the transaction as a whole has failed and will need to be
+ * rolled back.
+ */
+int ref_transaction_delete(struct ref_transaction *transaction,
+			   const char *refname,
+			   const unsigned char *old_sha1,
+			   int flags, int have_old, const char *msg,
+			   struct strbuf *err);
+
+/*
+ * Commit all of the changes that have been queued in transaction, as
+ * atomically as possible.
+ *
+ * Returns 0 for success, or one of the below error codes for errors.
+ */
+/* Naming conflict (for example, the ref names A and A/B conflict). */
+#define TRANSACTION_NAME_CONFLICT -1
+/* All other errors. */
+#define TRANSACTION_GENERIC_ERROR -2
+int ref_transaction_commit(struct ref_transaction *transaction,
+			   struct strbuf *err);
+
+/*
+ * Free an existing transaction and all associated data.
+ */
+void ref_transaction_free(struct ref_transaction *transaction);
+
+/** Lock a ref and then write its file */
 int update_ref(const char *action, const char *refname,
 		const unsigned char *sha1, const unsigned char *oldval,
 		int flags, enum action_on_err onerr);
 
-/**
- * Lock all refs and then perform all modifications.
- */
-int update_refs(const char *action, const struct ref_update **updates,
-		int n, enum action_on_err onerr);
-
 extern int parse_hide_refs_config(const char *var, const char *value, const char *);
 extern int ref_is_hidden(const char *);
 
diff --git a/remote-curl.c b/remote-curl.c
index 52c2d96..dd63bc2 100644
--- a/remote-curl.c
+++ b/remote-curl.c
@@ -25,7 +25,8 @@
 		update_shallow : 1,
 		followtags : 1,
 		dry_run : 1,
-		thin : 1;
+		thin : 1,
+		push_cert : 1;
 };
 static struct options options;
 static struct string_list cas_options = STRING_LIST_INIT_DUP;
@@ -106,6 +107,14 @@
 		else
 			return -1;
 		return 0;
+	} else if (!strcmp(name, "pushcert")) {
+		if (!strcmp(value, "true"))
+			options.push_cert = 1;
+		else if (!strcmp(value, "false"))
+			options.push_cert = 0;
+		else
+			return -1;
+		return 0;
 	} else {
 		return 1 /* unsupported */;
 	}
@@ -194,19 +203,19 @@
 	}
 }
 
-static int show_http_message(struct strbuf *type, struct strbuf *msg)
+static int show_http_message(struct strbuf *type, struct strbuf *charset,
+			     struct strbuf *msg)
 {
 	const char *p, *eol;
 
 	/*
 	 * We only show text/plain parts, as other types are likely
 	 * to be ugly to look at on the user's terminal.
-	 *
-	 * TODO should handle "; charset=XXX", and re-encode into
-	 * logoutputencoding
 	 */
-	if (strcasecmp(type->buf, "text/plain"))
+	if (strcmp(type->buf, "text/plain"))
 		return -1;
+	if (charset->len)
+		strbuf_reencode(msg, charset->buf, get_log_output_encoding());
 
 	strbuf_trim(msg);
 	if (!msg->len)
@@ -221,10 +230,11 @@
 	return 0;
 }
 
-static struct discovery* discover_refs(const char *service, int for_push)
+static struct discovery *discover_refs(const char *service, int for_push)
 {
 	struct strbuf exp = STRBUF_INIT;
 	struct strbuf type = STRBUF_INIT;
+	struct strbuf charset = STRBUF_INIT;
 	struct strbuf buffer = STRBUF_INIT;
 	struct strbuf refs_url = STRBUF_INIT;
 	struct strbuf effective_url = STRBUF_INIT;
@@ -249,6 +259,7 @@
 
 	memset(&options, 0, sizeof(options));
 	options.content_type = &type;
+	options.charset = &charset;
 	options.effective_url = &effective_url;
 	options.base_url = &url;
 	options.no_cache = 1;
@@ -259,13 +270,13 @@
 	case HTTP_OK:
 		break;
 	case HTTP_MISSING_TARGET:
-		show_http_message(&type, &buffer);
+		show_http_message(&type, &charset, &buffer);
 		die("repository '%s' not found", url.buf);
 	case HTTP_NOAUTH:
-		show_http_message(&type, &buffer);
+		show_http_message(&type, &charset, &buffer);
 		die("Authentication failed for '%s'", url.buf);
 	default:
-		show_http_message(&type, &buffer);
+		show_http_message(&type, &charset, &buffer);
 		die("unable to access '%s': %s", url.buf, curl_errorstr);
 	}
 
@@ -310,6 +321,7 @@
 	strbuf_release(&refs_url);
 	strbuf_release(&exp);
 	strbuf_release(&type);
+	strbuf_release(&charset);
 	strbuf_release(&effective_url);
 	strbuf_release(&buffer);
 	last_discovery = last;
@@ -396,7 +408,7 @@
 			rpc->pos = 0;
 			return CURLIOE_OK;
 		}
-		fprintf(stderr, "Unable to rewind rpc post data - try increasing http.postBuffer\n");
+		error("unable to rewind rpc post data - try increasing http.postBuffer");
 		return CURLIOE_FAILRESTART;
 
 	default:
@@ -620,10 +632,9 @@
 	const char *svc = rpc->service_name;
 	struct strbuf buf = STRBUF_INIT;
 	struct strbuf *preamble = rpc->stdin_preamble;
-	struct child_process client;
+	struct child_process client = CHILD_PROCESS_INIT;
 	int err = 0;
 
-	memset(&client, 0, sizeof(client));
 	client.in = -1;
 	client.out = -1;
 	client.git_cmd = 1;
@@ -706,7 +717,7 @@
 		free(targets[i]);
 	free(targets);
 
-	return ret ? error("Fetch failed.") : 0;
+	return ret ? error("fetch failed.") : 0;
 }
 
 static int fetch_git(struct discovery *heads,
@@ -788,9 +799,9 @@
 	int alloc_heads = 0, nr_heads = 0;
 
 	do {
-		if (starts_with(buf->buf, "fetch ")) {
-			char *p = buf->buf + strlen("fetch ");
-			char *name;
+		const char *p;
+		if (skip_prefix(buf->buf, "fetch ", &p)) {
+			const char *name;
 			struct ref *ref;
 			unsigned char old_sha1[20];
 
@@ -860,6 +871,7 @@
 	int i, err;
 	struct argv_array args;
 	struct string_list_item *cas_option;
+	struct strbuf preamble = STRBUF_INIT;
 
 	argv_array_init(&args);
 	argv_array_pushl(&args, "send-pack", "--stateless-rpc", "--helper-status",
@@ -869,6 +881,8 @@
 		argv_array_push(&args, "--thin");
 	if (options.dry_run)
 		argv_array_push(&args, "--dry-run");
+	if (options.push_cert)
+		argv_array_push(&args, "--signed");
 	if (options.verbosity == 0)
 		argv_array_push(&args, "--quiet");
 	else if (options.verbosity > 1)
@@ -877,17 +891,22 @@
 	for_each_string_list_item(cas_option, &cas_options)
 		argv_array_push(&args, cas_option->string);
 	argv_array_push(&args, url.buf);
+
+	argv_array_push(&args, "--stdin");
 	for (i = 0; i < nr_spec; i++)
-		argv_array_push(&args, specs[i]);
+		packet_buf_write(&preamble, "%s\n", specs[i]);
+	packet_buf_flush(&preamble);
 
 	memset(&rpc, 0, sizeof(rpc));
 	rpc.service_name = "git-receive-pack",
 	rpc.argv = args.argv;
+	rpc.stdin_preamble = &preamble;
 
 	err = rpc_service(&rpc, heads);
 	if (rpc.result.len)
 		write_or_die(1, rpc.result.buf, rpc.result.len);
 	strbuf_release(&rpc.result);
+	strbuf_release(&preamble);
 	argv_array_clear(&args);
 	return err;
 }
@@ -946,7 +965,7 @@
 	git_extract_argv0_path(argv[0]);
 	setup_git_directory_gently(&nongit);
 	if (argc < 2) {
-		fprintf(stderr, "Remote needed\n");
+		error("remote-curl: usage: git remote-curl <remote> [<url>]");
 		return 1;
 	}
 
@@ -965,18 +984,18 @@
 	http_init(remote, url.buf, 0);
 
 	do {
+		const char *arg;
+
 		if (strbuf_getline(&buf, stdin, '\n') == EOF) {
 			if (ferror(stdin))
-				fprintf(stderr, "Error reading command stream\n");
-			else
-				fprintf(stderr, "Unexpected end of command stream\n");
+				error("remote-curl: error reading command stream from git");
 			return 1;
 		}
 		if (buf.len == 0)
 			break;
 		if (starts_with(buf.buf, "fetch ")) {
 			if (nongit)
-				die("Fetch attempted without a local repo");
+				die("remote-curl: fetch attempted without a local repo");
 			parse_fetch(&buf);
 
 		} else if (!strcmp(buf.buf, "list") || starts_with(buf.buf, "list ")) {
@@ -986,9 +1005,8 @@
 		} else if (starts_with(buf.buf, "push ")) {
 			parse_push(&buf);
 
-		} else if (starts_with(buf.buf, "option ")) {
-			char *name = buf.buf + strlen("option ");
-			char *value = strchr(name, ' ');
+		} else if (skip_prefix(buf.buf, "option ", &arg)) {
+			char *value = strchr(arg, ' ');
 			int result;
 
 			if (value)
@@ -996,7 +1014,7 @@
 			else
 				value = "true";
 
-			result = set_option(name, value);
+			result = set_option(arg, value);
 			if (!result)
 				printf("ok\n");
 			else if (result < 0)
@@ -1013,7 +1031,7 @@
 			printf("\n");
 			fflush(stdout);
 		} else {
-			fprintf(stderr, "Unknown command '%s'\n", buf.buf);
+			error("remote-curl: unknown command '%s' from git", buf.buf);
 			return 1;
 		}
 		strbuf_reset(&buf);
diff --git a/remote-testsvn.c b/remote-testsvn.c
index 6be55cb..48bf6eb 100644
--- a/remote-testsvn.c
+++ b/remote-testsvn.c
@@ -175,8 +175,8 @@
 	char *note_msg;
 	unsigned char head_sha1[20];
 	unsigned int startrev;
-	struct argv_array svndump_argv = ARGV_ARRAY_INIT;
-	struct child_process svndump_proc;
+	struct child_process svndump_proc = CHILD_PROCESS_INIT;
+	const char *command = "svnrdump";
 
 	if (read_ref(private_ref, head_sha1))
 		startrev = 0;
@@ -200,17 +200,15 @@
 		if(dumpin_fd < 0)
 			die_errno("Couldn't open svn dump file %s.", url);
 	} else {
-		memset(&svndump_proc, 0, sizeof(struct child_process));
 		svndump_proc.out = -1;
-		argv_array_push(&svndump_argv, "svnrdump");
-		argv_array_push(&svndump_argv, "dump");
-		argv_array_push(&svndump_argv, url);
-		argv_array_pushf(&svndump_argv, "-r%u:HEAD", startrev);
-		svndump_proc.argv = svndump_argv.argv;
+		argv_array_push(&svndump_proc.args, command);
+		argv_array_push(&svndump_proc.args, "dump");
+		argv_array_push(&svndump_proc.args, url);
+		argv_array_pushf(&svndump_proc.args, "-r%u:HEAD", startrev);
 
 		code = start_command(&svndump_proc);
 		if (code)
-			die("Unable to start %s, code %d", svndump_proc.argv[0], code);
+			die("Unable to start %s, code %d", command, code);
 		dumpin_fd = svndump_proc.out;
 	}
 	/* setup marks file import/export */
@@ -226,8 +224,7 @@
 	if (!dump_from_file) {
 		code = finish_command(&svndump_proc);
 		if (code)
-			warning("%s, returned %d", svndump_proc.argv[0], code);
-		argv_array_clear(&svndump_argv);
+			warning("%s, returned %d", command, code);
 	}
 
 	return 0;
diff --git a/remote.c b/remote.c
index 0e9459c..f624217 100644
--- a/remote.c
+++ b/remote.c
@@ -42,6 +42,7 @@
 static struct remote **remotes;
 static int remotes_alloc;
 static int remotes_nr;
+static struct hashmap remotes_hash;
 
 static struct branch **branches;
 static int branches_alloc;
@@ -136,26 +137,51 @@
 	add_pushurl_alias(remote, url);
 }
 
+struct remotes_hash_key {
+	const char *str;
+	int len;
+};
+
+static int remotes_hash_cmp(const struct remote *a, const struct remote *b, const struct remotes_hash_key *key)
+{
+	if (key)
+		return strncmp(a->name, key->str, key->len) || a->name[key->len];
+	else
+		return strcmp(a->name, b->name);
+}
+
+static inline void init_remotes_hash(void)
+{
+	if (!remotes_hash.cmpfn)
+		hashmap_init(&remotes_hash, (hashmap_cmp_fn)remotes_hash_cmp, 0);
+}
+
 static struct remote *make_remote(const char *name, int len)
 {
-	struct remote *ret;
-	int i;
+	struct remote *ret, *replaced;
+	struct remotes_hash_key lookup;
+	struct hashmap_entry lookup_entry;
 
-	for (i = 0; i < remotes_nr; i++) {
-		if (len ? (!strncmp(name, remotes[i]->name, len) &&
-			   !remotes[i]->name[len]) :
-		    !strcmp(name, remotes[i]->name))
-			return remotes[i];
-	}
+	if (!len)
+		len = strlen(name);
+
+	init_remotes_hash();
+	lookup.str = name;
+	lookup.len = len;
+	hashmap_entry_init(&lookup_entry, memhash(name, len));
+
+	if ((ret = hashmap_get(&remotes_hash, &lookup_entry, &lookup)) != NULL)
+		return ret;
 
 	ret = xcalloc(1, sizeof(struct remote));
 	ret->prune = -1;  /* unspecified */
 	ALLOC_GROW(remotes, remotes_nr + 1, remotes_alloc);
 	remotes[remotes_nr++] = ret;
-	if (len)
-		ret->name = xstrndup(name, len);
-	else
-		ret->name = xstrdup(name);
+	ret->name = xstrndup(name, len);
+
+	hashmap_entry_init(ret, lookup_entry.hash);
+	replaced = hashmap_put(&remotes_hash, ret);
+	assert(replaced == NULL);  /* no previous entry overwritten */
 	return ret;
 }
 
@@ -170,7 +196,6 @@
 {
 	struct branch *ret;
 	int i;
-	char *refname;
 
 	for (i = 0; i < branches_nr; i++) {
 		if (len ? (!strncmp(name, branches[i]->name, len) &&
@@ -186,10 +211,7 @@
 		ret->name = xstrndup(name, len);
 	else
 		ret->name = xstrdup(name);
-	refname = xmalloc(strlen(name) + strlen("refs/heads/") + 1);
-	strcpy(refname, "refs/heads/");
-	strcpy(refname + strlen("refs/heads/"), ret->name);
-	ret->refname = refname;
+	ret->refname = xstrfmt("refs/heads/%s", ret->name);
 
 	return ret;
 }
@@ -486,11 +508,10 @@
 		return;
 	default_remote_name = "origin";
 	current_branch = NULL;
-	head_ref = resolve_ref_unsafe("HEAD", sha1, 0, &flag);
+	head_ref = resolve_ref_unsafe("HEAD", 0, sha1, &flag);
 	if (head_ref && (flag & REF_ISSYMREF) &&
-	    starts_with(head_ref, "refs/heads/")) {
-		current_branch =
-			make_branch(head_ref + strlen("refs/heads/"), 0);
+	    skip_prefix(head_ref, "refs/heads/", &head_ref)) {
+		current_branch = make_branch(head_ref, 0);
 	}
 	git_config(handle_config, NULL);
 	if (branch_pushremote_name) {
@@ -722,13 +743,16 @@
 
 int remote_is_configured(const char *name)
 {
-	int i;
+	struct remotes_hash_key lookup;
+	struct hashmap_entry lookup_entry;
 	read_config();
 
-	for (i = 0; i < remotes_nr; i++)
-		if (!strcmp(name, remotes[i]->name))
-			return 1;
-	return 0;
+	init_remotes_hash();
+	lookup.str = name;
+	lookup.len = strlen(name);
+	hashmap_entry_init(&lookup_entry, memhash(name, lookup.len));
+
+	return hashmap_get(&remotes_hash, &lookup_entry, &lookup) != NULL;
 }
 
 int for_each_remote(each_remote_fn fn, void *priv)
@@ -838,21 +862,14 @@
 	ret = !strncmp(name, key, klen) && namelen >= klen + ksuffixlen &&
 		!memcmp(name + namelen - ksuffixlen, kstar + 1, ksuffixlen);
 	if (ret && value) {
+		struct strbuf sb = STRBUF_INIT;
 		const char *vstar = strchr(value, '*');
-		size_t vlen;
-		size_t vsuffixlen;
 		if (!vstar)
 			die("Value '%s' of pattern has no '*'", value);
-		vlen = vstar - value;
-		vsuffixlen = strlen(vstar + 1);
-		*result = xmalloc(vlen + vsuffixlen +
-				  strlen(name) -
-				  klen - ksuffixlen + 1);
-		strncpy(*result, value, vlen);
-		strncpy(*result + vlen,
-			name + klen, namelen - klen - ksuffixlen);
-		strcpy(*result + vlen + namelen - klen - ksuffixlen,
-		       vstar + 1);
+		strbuf_add(&sb, value, vstar - value);
+		strbuf_add(&sb, name + klen, namelen - klen - ksuffixlen);
+		strbuf_addstr(&sb, vstar + 1);
+		*result = strbuf_detach(&sb, NULL);
 	}
 	return ret;
 }
@@ -1121,7 +1138,8 @@
 	struct strbuf buf = STRBUF_INIT;
 	unsigned char sha1[20];
 
-	const char *r = resolve_ref_unsafe(peer->name, sha1, 1, NULL);
+	const char *r = resolve_ref_unsafe(peer->name, RESOLVE_REF_READING,
+					   sha1, NULL);
 	if (!r)
 		return NULL;
 
@@ -1182,7 +1200,9 @@
 		unsigned char sha1[20];
 		int flag;
 
-		dst_value = resolve_ref_unsafe(matched_src->name, sha1, 1, &flag);
+		dst_value = resolve_ref_unsafe(matched_src->name,
+					       RESOLVE_REF_READING,
+					       sha1, &flag);
 		if (!dst_value ||
 		    ((flag & REF_ISSYMREF) &&
 		     !starts_with(dst_value, "refs/heads/")))
@@ -1194,7 +1214,7 @@
 	case 1:
 		break;
 	case 0:
-		if (!memcmp(dst_value, "refs/", 5))
+		if (starts_with(dst_value, "refs/"))
 			matched_dst = make_linked_ref(dst_value, dst_tail);
 		else if (is_null_sha1(matched_src->new_sha1))
 			error("unable to delete '%s': remote ref does not exist",
@@ -1656,7 +1676,7 @@
 	unsigned char sha1[20];
 	int flag;
 
-	if (!resolve_ref_unsafe(refname, sha1, 0, &flag))
+	if (!resolve_ref_unsafe(refname, 0, sha1, &flag))
 		return 0; /* non-existing refs are OK */
 	return (flag & REF_ISSYMREF);
 }
@@ -1898,7 +1918,8 @@
 
 	init_revisions(&revs, NULL);
 	setup_revisions(rev_argc, rev_argv, &revs, NULL);
-	prepare_revision_walk(&revs);
+	if (prepare_revision_walk(&revs))
+		die("revision walk setup failed");
 
 	/* ... and count the commits on each side. */
 	*num_ours = 0;
@@ -1925,7 +1946,7 @@
 int format_tracking_info(struct branch *branch, struct strbuf *sb)
 {
 	int ours, theirs;
-	const char *base;
+	char *base;
 	int upstream_is_gone = 0;
 
 	switch (stat_tracking_info(branch, &ours, &theirs)) {
@@ -1941,8 +1962,7 @@
 		break;
 	}
 
-	base = branch->merge[0]->dst;
-	base = shorten_unambiguous_ref(base, 0);
+	base = shorten_unambiguous_ref(branch->merge[0]->dst, 0);
 	if (upstream_is_gone) {
 		strbuf_addf(sb,
 			_("Your branch is based on '%s', but the upstream is gone.\n"),
@@ -1988,6 +2008,7 @@
 			strbuf_addf(sb,
 				_("  (use \"git pull\" to merge the remote branch into yours)\n"));
 	}
+	free(base);
 	return 1;
 }
 
diff --git a/remote.h b/remote.h
index 917d383..8b62efd 100644
--- a/remote.h
+++ b/remote.h
@@ -2,6 +2,7 @@
 #define REMOTE_H
 
 #include "parse-options.h"
+#include "hashmap.h"
 
 enum {
 	REMOTE_CONFIG,
@@ -10,6 +11,8 @@
 };
 
 struct remote {
+	struct hashmap_entry ent;  /* must be first */
+
 	const char *name;
 	int origin;
 
diff --git a/rerere.c b/rerere.c
index d55aa8a..1b0555f 100644
--- a/rerere.c
+++ b/rerere.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "lockfile.h"
 #include "string-list.h"
 #include "rerere.h"
 #include "xdiff-interface.h"
@@ -207,11 +208,11 @@
 			strbuf_reset(&one);
 			strbuf_reset(&two);
 		} else if (hunk == RR_SIDE_1)
-			strbuf_addstr(&one, buf.buf);
+			strbuf_addbuf(&one, &buf);
 		else if (hunk == RR_ORIGINAL)
 			; /* discard */
 		else if (hunk == RR_SIDE_2)
-			strbuf_addstr(&two, buf.buf);
+			strbuf_addbuf(&two, &buf);
 		else
 			rerere_io_putstr(buf.buf, io);
 		continue;
@@ -492,8 +493,7 @@
 	}
 
 	if (!status && active_cache_changed) {
-		if (write_cache(fd, active_cache, active_nr) ||
-		    commit_locked_index(&index_lock))
+		if (write_locked_index(&the_index, &index_lock, COMMIT_LOCK))
 			die("Unable to write new index file");
 	} else if (fd >= 0)
 		rollback_lock_file(&index_lock);
@@ -574,15 +574,11 @@
 	return write_rr(rr, fd);
 }
 
-static int git_rerere_config(const char *var, const char *value, void *cb)
+static void git_rerere_config(void)
 {
-	if (!strcmp(var, "rerere.enabled"))
-		rerere_enabled = git_config_bool(var, value);
-	else if (!strcmp(var, "rerere.autoupdate"))
-		rerere_autoupdate = git_config_bool(var, value);
-	else
-		return git_default_config(var, value, cb);
-	return 0;
+	git_config_get_bool("rerere.enabled", &rerere_enabled);
+	git_config_get_bool("rerere.autoupdate", &rerere_autoupdate);
+	git_config(git_default_config, NULL);
 }
 
 static int is_rerere_enabled(void)
@@ -607,7 +603,7 @@
 {
 	int fd;
 
-	git_config(git_rerere_config, NULL);
+	git_rerere_config();
 	if (!is_rerere_enabled())
 		return -1;
 
@@ -700,24 +696,6 @@
 	rmdir(git_path("rr-cache/%s", name));
 }
 
-struct rerere_gc_config_cb {
-	int cutoff_noresolve;
-	int cutoff_resolve;
-};
-
-static int git_rerere_gc_config(const char *var, const char *value, void *cb)
-{
-	struct rerere_gc_config_cb *cf = cb;
-
-	if (!strcmp(var, "gc.rerereresolved"))
-		cf->cutoff_resolve = git_config_int(var, value);
-	else if (!strcmp(var, "gc.rerereunresolved"))
-		cf->cutoff_noresolve = git_config_int(var, value);
-	else
-		return git_default_config(var, value, cb);
-	return 0;
-}
-
 void rerere_gc(struct string_list *rr)
 {
 	struct string_list to_remove = STRING_LIST_INIT_DUP;
@@ -725,9 +703,12 @@
 	struct dirent *e;
 	int i, cutoff;
 	time_t now = time(NULL), then;
-	struct rerere_gc_config_cb cf = { 15, 60 };
+	int cutoff_noresolve = 15;
+	int cutoff_resolve = 60;
 
-	git_config(git_rerere_gc_config, &cf);
+	git_config_get_int("gc.rerereresolved", &cutoff_resolve);
+	git_config_get_int("gc.rerereunresolved", &cutoff_noresolve);
+	git_config(git_default_config, NULL);
 	dir = opendir(git_path("rr-cache"));
 	if (!dir)
 		die_errno("unable to open rr-cache directory");
@@ -737,12 +718,12 @@
 
 		then = rerere_last_used_at(e->d_name);
 		if (then) {
-			cutoff = cf.cutoff_resolve;
+			cutoff = cutoff_resolve;
 		} else {
 			then = rerere_created_at(e->d_name);
 			if (!then)
 				continue;
-			cutoff = cf.cutoff_noresolve;
+			cutoff = cutoff_noresolve;
 		}
 		if (then < now - cutoff * 86400)
 			string_list_append(&to_remove, e->d_name);
diff --git a/rerere.h b/rerere.h
index 4aa06c9..2956c2e 100644
--- a/rerere.h
+++ b/rerere.h
@@ -24,6 +24,6 @@
 extern void rerere_gc(struct string_list *);
 
 #define OPT_RERERE_AUTOUPDATE(v) OPT_UYN(0, "rerere-autoupdate", (v), \
-	"update the index with reused conflict resolution if possible")
+	N_("update the index with reused conflict resolution if possible"))
 
 #endif
diff --git a/resolve-undo.c b/resolve-undo.c
index 44c697c..468a2eb 100644
--- a/resolve-undo.c
+++ b/resolve-undo.c
@@ -110,7 +110,7 @@
 	string_list_clear(resolve_undo, 1);
 	free(resolve_undo);
 	istate->resolve_undo = NULL;
-	istate->cache_changed = 1;
+	istate->cache_changed |= RESOLVE_UNDO_CHANGED;
 }
 
 int unmerge_index_entry_at(struct index_state *istate, int pos)
diff --git a/revision.c b/revision.c
index 2571ada..75dda92 100644
--- a/revision.c
+++ b/revision.c
@@ -17,6 +17,7 @@
 #include "mailmap.h"
 #include "commit-slab.h"
 #include "dir.h"
+#include "cache-tree.h"
 
 volatile show_early_output_fn_t show_early_output;
 
@@ -86,16 +87,6 @@
 	fputc('\n', out);
 }
 
-void add_object(struct object *obj,
-		struct object_array *p,
-		struct name_path *path,
-		const char *name)
-{
-	char *pn = path_name(path, name);
-	add_object_array(obj, pn, p);
-	free(pn);
-}
-
 static void mark_blob_uninteresting(struct blob *blob)
 {
 	if (!blob)
@@ -198,9 +189,10 @@
 	}
 }
 
-static void add_pending_object_with_mode(struct rev_info *revs,
+static void add_pending_object_with_path(struct rev_info *revs,
 					 struct object *obj,
-					 const char *name, unsigned mode)
+					 const char *name, unsigned mode,
+					 const char *path)
 {
 	if (!obj)
 		return;
@@ -220,7 +212,14 @@
 		if (st)
 			return;
 	}
-	add_object_array_with_mode(obj, name, &revs->pending, mode);
+	add_object_array_with_path(obj, name, &revs->pending, mode, path);
+}
+
+static void add_pending_object_with_mode(struct rev_info *revs,
+					 struct object *obj,
+					 const char *name, unsigned mode)
+{
+	add_pending_object_with_path(revs, obj, name, mode, NULL);
 }
 
 void add_pending_object(struct rev_info *revs,
@@ -265,8 +264,12 @@
 }
 
 static struct commit *handle_commit(struct rev_info *revs,
-				    struct object *object, const char *name)
+				    struct object_array_entry *entry)
 {
+	struct object *object = entry->item;
+	const char *name = entry->name;
+	const char *path = entry->path;
+	unsigned int mode = entry->mode;
 	unsigned long flags = object->flags;
 
 	/*
@@ -285,6 +288,14 @@
 			die("bad object %s", sha1_to_hex(tag->tagged->sha1));
 		}
 		object->flags |= flags;
+		/*
+		 * We'll handle the tagged object by looping or dropping
+		 * through to the non-tag handlers below. Do not
+		 * propagate data from the tag's pending entry.
+		 */
+		name = "";
+		path = NULL;
+		mode = 0;
 	}
 
 	/*
@@ -300,7 +311,7 @@
 			revs->limited = 1;
 		}
 		if (revs->show_source && !commit->util)
-			commit->util = (void *) name;
+			commit->util = xstrdup(name);
 		return commit;
 	}
 
@@ -316,7 +327,7 @@
 			mark_tree_contents_uninteresting(tree);
 			return NULL;
 		}
-		add_pending_object(revs, object, "");
+		add_pending_object_with_path(revs, object, name, mode, path);
 		return NULL;
 	}
 
@@ -328,7 +339,7 @@
 			return NULL;
 		if (flags & UNINTERESTING)
 			return NULL;
-		add_pending_object(revs, object, "");
+		add_pending_object_with_path(revs, object, name, mode, path);
 		return NULL;
 	}
 	die("%s is unknown object", name);
@@ -473,7 +484,7 @@
 		 * If we are simplifying by decoration, then the commit
 		 * is worth showing if it has a tag pointing at it.
 		 */
-		if (lookup_decoration(&name_decoration, &commit->object))
+		if (get_name_decoration(&commit->object))
 			return REV_TREE_DIFFERENT;
 		/*
 		 * A commit that is not pointed by a tag is uninteresting
@@ -1275,7 +1286,7 @@
 	return 0;
 }
 
-static void handle_reflog(struct rev_info *revs, unsigned flags)
+void add_reflogs_to_pending(struct rev_info *revs, unsigned flags)
 {
 	struct all_refs_cb cb;
 	cb.all_revs = revs;
@@ -1283,6 +1294,53 @@
 	for_each_reflog(handle_one_reflog, &cb);
 }
 
+static void add_cache_tree(struct cache_tree *it, struct rev_info *revs,
+			   struct strbuf *path)
+{
+	size_t baselen = path->len;
+	int i;
+
+	if (it->entry_count >= 0) {
+		struct tree *tree = lookup_tree(it->sha1);
+		add_pending_object_with_path(revs, &tree->object, "",
+					     040000, path->buf);
+	}
+
+	for (i = 0; i < it->subtree_nr; i++) {
+		struct cache_tree_sub *sub = it->down[i];
+		strbuf_addf(path, "%s%s", baselen ? "/" : "", sub->name);
+		add_cache_tree(sub->cache_tree, revs, path);
+		strbuf_setlen(path, baselen);
+	}
+
+}
+
+void add_index_objects_to_pending(struct rev_info *revs, unsigned flags)
+{
+	int i;
+
+	read_cache();
+	for (i = 0; i < active_nr; i++) {
+		struct cache_entry *ce = active_cache[i];
+		struct blob *blob;
+
+		if (S_ISGITLINK(ce->ce_mode))
+			continue;
+
+		blob = lookup_blob(ce->sha1);
+		if (!blob)
+			die("unable to add index blob to traversal");
+		add_pending_object_with_path(revs, &blob->object, "",
+					     ce->ce_mode, ce->name);
+	}
+
+	if (active_cache_tree) {
+		struct strbuf path = STRBUF_INIT;
+		add_cache_tree(active_cache_tree, revs, &path);
+		strbuf_release(&path);
+	}
+}
+
 static int add_parents_only(struct rev_info *revs, const char *arg_, int flags)
 {
 	unsigned char sha1[20];
@@ -1397,7 +1455,7 @@
 			continue;
 		if (ce_path_match(ce, &revs->prune_data, NULL)) {
 			prune_num++;
-			prune = xrealloc(prune, sizeof(*prune) * prune_num);
+			REALLOC_ARRAY(prune, prune_num);
 			prune[prune_num-2] = ce->name;
 			prune[prune_num-1] = NULL;
 		}
@@ -1633,6 +1691,7 @@
 	    !strcmp(arg, "--reflog") || !strcmp(arg, "--not") ||
 	    !strcmp(arg, "--no-walk") || !strcmp(arg, "--do-walk") ||
 	    !strcmp(arg, "--bisect") || starts_with(arg, "--glob=") ||
+	    !strcmp(arg, "--indexed-objects") ||
 	    starts_with(arg, "--exclude=") ||
 	    starts_with(arg, "--branches=") || starts_with(arg, "--tags=") ||
 	    starts_with(arg, "--remotes=") || starts_with(arg, "--no-walk="))
@@ -1825,7 +1884,7 @@
 	} else if (!strcmp(arg, "--pretty")) {
 		revs->verbose_header = 1;
 		revs->pretty_given = 1;
-		get_commit_format(arg+8, revs);
+		get_commit_format(NULL, revs);
 	} else if (starts_with(arg, "--pretty=") || starts_with(arg, "--format=")) {
 		/*
 		 * Detached form ("--pretty X" as opposed to "--pretty=X")
@@ -2061,7 +2120,9 @@
 		for_each_glob_ref_in(handle_one_ref, arg + 10, "refs/remotes/", &cb);
 		clear_ref_exclusion(&revs->ref_excludes);
 	} else if (!strcmp(arg, "--reflog")) {
-		handle_reflog(revs, *flags);
+		add_reflogs_to_pending(revs, *flags);
+	} else if (!strcmp(arg, "--indexed-objects")) {
+		add_index_objects_to_pending(revs, *flags);
 	} else if (!strcmp(arg, "--not")) {
 		*flags ^= UNINTERESTING | BOTTOM;
 	} else if (!strcmp(arg, "--no-walk")) {
@@ -2656,26 +2717,26 @@
 
 int prepare_revision_walk(struct rev_info *revs)
 {
-	int nr = revs->pending.nr;
-	struct object_array_entry *e, *list;
+	int i;
+	struct object_array old_pending;
 	struct commit_list **next = &revs->commits;
 
-	e = list = revs->pending.objects;
+	memcpy(&old_pending, &revs->pending, sizeof(old_pending));
 	revs->pending.nr = 0;
 	revs->pending.alloc = 0;
 	revs->pending.objects = NULL;
-	while (--nr >= 0) {
-		struct commit *commit = handle_commit(revs, e->item, e->name);
+	for (i = 0; i < old_pending.nr; i++) {
+		struct object_array_entry *e = old_pending.objects + i;
+		struct commit *commit = handle_commit(revs, e);
 		if (commit) {
 			if (!(commit->object.flags & SEEN)) {
 				commit->object.flags |= SEEN;
 				next = commit_list_append(commit, next);
 			}
 		}
-		e++;
 	}
 	if (!revs->leak_pending)
-		free(list);
+		object_array_clear(&old_pending);
 
 	/* Signal whether we need per-parent treesame decoration */
 	if (revs->simplify_merges ||
diff --git a/revision.h b/revision.h
index a620530..9cb5adc 100644
--- a/revision.h
+++ b/revision.h
@@ -264,11 +264,6 @@
 extern void show_object_with_name(FILE *, struct object *,
 				  const struct name_path *, const char *);
 
-extern void add_object(struct object *obj,
-		       struct object_array *p,
-		       struct name_path *path,
-		       const char *name);
-
 extern void add_pending_object(struct rev_info *revs,
 			       struct object *obj, const char *name);
 extern void add_pending_sha1(struct rev_info *revs,
@@ -276,6 +271,8 @@
 			     unsigned int flags);
 
 extern void add_head_to_pending(struct rev_info *);
+extern void add_reflogs_to_pending(struct rev_info *, unsigned int flags);
+extern void add_index_objects_to_pending(struct rev_info *, unsigned int flags);
 
 enum commit_action {
 	commit_ignore,
diff --git a/run-command.c b/run-command.c
index 75abc47..a476999 100644
--- a/run-command.c
+++ b/run-command.c
@@ -8,6 +8,13 @@
 # define SHELL_PATH "/bin/sh"
 #endif
 
+void child_process_init(struct child_process *child)
+{
+	memset(child, 0, sizeof(*child));
+	argv_array_init(&child->args);
+	argv_array_init(&child->env_array);
+}
+
 struct child_to_clean {
 	pid_t pid;
 	struct child_to_clean *next;
@@ -279,6 +286,11 @@
 	int failed_errno;
 	char *str;
 
+	if (!cmd->argv)
+		cmd->argv = cmd->args.argv;
+	if (!cmd->env)
+		cmd->env = cmd->env_array.argv;
+
 	/*
 	 * In case of errors we must keep the promise to close FDs
 	 * that have been passed in via ->in and ->out.
@@ -328,6 +340,8 @@
 fail_pipe:
 			error("cannot create %s pipe for %s: %s",
 				str, cmd->argv[0], strerror(failed_errno));
+			argv_array_clear(&cmd->args);
+			argv_array_clear(&cmd->env_array);
 			errno = failed_errno;
 			return -1;
 		}
@@ -450,7 +464,6 @@
 {
 	int fhin = 0, fhout = 1, fherr = 2;
 	const char **sargv = cmd->argv;
-	char **env = environ;
 
 	if (cmd->no_stdin)
 		fhin = open("/dev/null", O_RDWR);
@@ -475,24 +488,19 @@
 	else if (cmd->out > 1)
 		fhout = dup(cmd->out);
 
-	if (cmd->env)
-		env = make_augmented_environ(cmd->env);
-
 	if (cmd->git_cmd)
 		cmd->argv = prepare_git_cmd(cmd->argv);
 	else if (cmd->use_shell)
 		cmd->argv = prepare_shell_cmd(cmd->argv);
 
-	cmd->pid = mingw_spawnvpe(cmd->argv[0], cmd->argv, env, cmd->dir,
-				  fhin, fhout, fherr);
+	cmd->pid = mingw_spawnvpe(cmd->argv[0], cmd->argv, (char**) cmd->env,
+			cmd->dir, fhin, fhout, fherr);
 	failed_errno = errno;
 	if (cmd->pid < 0 && (!cmd->silent_exec_failure || errno != ENOENT))
 		error("cannot spawn %s: %s", cmd->argv[0], strerror(errno));
 	if (cmd->clean_on_exit && cmd->pid >= 0)
 		mark_child_for_cleanup(cmd->pid);
 
-	if (cmd->env)
-		free_environ(env);
 	if (cmd->git_cmd)
 		free(cmd->argv);
 
@@ -519,6 +527,8 @@
 			close_pair(fderr);
 		else if (cmd->err)
 			close(cmd->err);
+		argv_array_clear(&cmd->args);
+		argv_array_clear(&cmd->env_array);
 		errno = failed_errno;
 		return -1;
 	}
@@ -543,7 +553,10 @@
 
 int finish_command(struct child_process *cmd)
 {
-	return wait_or_whine(cmd->pid, cmd->argv[0]);
+	int ret = wait_or_whine(cmd->pid, cmd->argv[0]);
+	argv_array_clear(&cmd->args);
+	argv_array_clear(&cmd->env_array);
+	return ret;
 }
 
 int run_command(struct child_process *cmd)
@@ -554,31 +567,21 @@
 	return finish_command(cmd);
 }
 
-static void prepare_run_command_v_opt(struct child_process *cmd,
-				      const char **argv,
-				      int opt)
-{
-	memset(cmd, 0, sizeof(*cmd));
-	cmd->argv = argv;
-	cmd->no_stdin = opt & RUN_COMMAND_NO_STDIN ? 1 : 0;
-	cmd->git_cmd = opt & RUN_GIT_CMD ? 1 : 0;
-	cmd->stdout_to_stderr = opt & RUN_COMMAND_STDOUT_TO_STDERR ? 1 : 0;
-	cmd->silent_exec_failure = opt & RUN_SILENT_EXEC_FAILURE ? 1 : 0;
-	cmd->use_shell = opt & RUN_USING_SHELL ? 1 : 0;
-	cmd->clean_on_exit = opt & RUN_CLEAN_ON_EXIT ? 1 : 0;
-}
-
 int run_command_v_opt(const char **argv, int opt)
 {
-	struct child_process cmd;
-	prepare_run_command_v_opt(&cmd, argv, opt);
-	return run_command(&cmd);
+	return run_command_v_opt_cd_env(argv, opt, NULL, NULL);
 }
 
 int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const char *const *env)
 {
-	struct child_process cmd;
-	prepare_run_command_v_opt(&cmd, argv, opt);
+	struct child_process cmd = CHILD_PROCESS_INIT;
+	cmd.argv = argv;
+	cmd.no_stdin = opt & RUN_COMMAND_NO_STDIN ? 1 : 0;
+	cmd.git_cmd = opt & RUN_GIT_CMD ? 1 : 0;
+	cmd.stdout_to_stderr = opt & RUN_COMMAND_STDOUT_TO_STDERR ? 1 : 0;
+	cmd.silent_exec_failure = opt & RUN_SILENT_EXEC_FAILURE ? 1 : 0;
+	cmd.use_shell = opt & RUN_USING_SHELL ? 1 : 0;
+	cmd.clean_on_exit = opt & RUN_CLEAN_ON_EXIT ? 1 : 0;
 	cmd.dir = dir;
 	cmd.env = env;
 	return run_command(&cmd);
@@ -623,6 +626,45 @@
 	return ret != NULL;
 }
 
+#else
+
+static struct {
+	void (**handlers)(void);
+	size_t nr;
+	size_t alloc;
+} git_atexit_hdlrs;
+
+static int git_atexit_installed;
+
+static void git_atexit_dispatch(void)
+{
+	size_t i;
+
+	for (i=git_atexit_hdlrs.nr ; i ; i--)
+		git_atexit_hdlrs.handlers[i-1]();
+}
+
+static void git_atexit_clear(void)
+{
+	free(git_atexit_hdlrs.handlers);
+	memset(&git_atexit_hdlrs, 0, sizeof(git_atexit_hdlrs));
+	git_atexit_installed = 0;
+}
+
+#undef atexit
+int git_atexit(void (*handler)(void))
+{
+	ALLOC_GROW(git_atexit_hdlrs.handlers, git_atexit_hdlrs.nr + 1, git_atexit_hdlrs.alloc);
+	git_atexit_hdlrs.handlers[git_atexit_hdlrs.nr++] = handler;
+	if (!git_atexit_installed) {
+		if (atexit(&git_atexit_dispatch))
+			return -1;
+		git_atexit_installed = 1;
+	}
+	return 0;
+}
+#define atexit git_atexit
+
 #endif
 
 int start_async(struct async *async)
@@ -681,6 +723,7 @@
 			close(fdin[1]);
 		if (need_out)
 			close(fdout[0]);
+		git_atexit_clear();
 		exit(!!async->proc(proc_in, proc_out, async->data));
 	}
 
@@ -762,29 +805,21 @@
 
 int run_hook_ve(const char *const *env, const char *name, va_list args)
 {
-	struct child_process hook;
-	struct argv_array argv = ARGV_ARRAY_INIT;
+	struct child_process hook = CHILD_PROCESS_INIT;
 	const char *p;
-	int ret;
 
 	p = find_hook(name);
 	if (!p)
 		return 0;
 
-	argv_array_push(&argv, p);
-
+	argv_array_push(&hook.args, p);
 	while ((p = va_arg(args, const char *)))
-		argv_array_push(&argv, p);
-
-	memset(&hook, 0, sizeof(hook));
-	hook.argv = argv.argv;
+		argv_array_push(&hook.args, p);
 	hook.env = env;
 	hook.no_stdin = 1;
 	hook.stdout_to_stderr = 1;
 
-	ret = run_command(&hook);
-	argv_array_clear(&argv);
-	return ret;
+	return run_command(&hook);
 }
 
 int run_hook_le(const char *const *env, const char *name, ...)
diff --git a/run-command.h b/run-command.h
index 3653bfa..2137315 100644
--- a/run-command.h
+++ b/run-command.h
@@ -5,8 +5,12 @@
 #include <pthread.h>
 #endif
 
+#include "argv-array.h"
+
 struct child_process {
 	const char **argv;
+	struct argv_array args;
+	struct argv_array env_array;
 	pid_t pid;
 	/*
 	 * Using .in, .out, .err:
@@ -41,6 +45,9 @@
 	unsigned clean_on_exit:1;
 };
 
+#define CHILD_PROCESS_INIT { NULL, ARGV_ARRAY_INIT, ARGV_ARRAY_INIT }
+void child_process_init(struct child_process *);
+
 int start_command(struct child_process *);
 int finish_command(struct child_process *);
 int run_command(struct child_process *);
diff --git a/send-pack.c b/send-pack.c
index 6129b0f..949cb61 100644
--- a/send-pack.c
+++ b/send-pack.c
@@ -11,6 +11,7 @@
 #include "transport.h"
 #include "version.h"
 #include "sha1-array.h"
+#include "gpg-interface.h"
 
 static int feed_object(const unsigned char *sha1, int fd, int negative)
 {
@@ -47,7 +48,7 @@
 		NULL,
 		NULL,
 	};
-	struct child_process po;
+	struct child_process po = CHILD_PROCESS_INIT;
 	int i;
 
 	i = 4;
@@ -59,7 +60,6 @@
 		argv[i++] = "-q";
 	if (args->progress)
 		argv[i++] = "--progress";
-	memset(&po, 0, sizeof(po));
 	po.argv = argv;
 	po.in = -1;
 	po.out = args->stateless_rpc ? -1 : fd;
@@ -190,6 +190,94 @@
 	for_each_commit_graft(advertise_shallow_grafts_cb, sb);
 }
 
+static int ref_update_to_be_sent(const struct ref *ref, const struct send_pack_args *args)
+{
+	if (!ref->peer_ref && !args->send_mirror)
+		return 0;
+
+	/* Check for statuses set by set_ref_status_for_push() */
+	switch (ref->status) {
+	case REF_STATUS_REJECT_NONFASTFORWARD:
+	case REF_STATUS_REJECT_ALREADY_EXISTS:
+	case REF_STATUS_REJECT_FETCH_FIRST:
+	case REF_STATUS_REJECT_NEEDS_FORCE:
+	case REF_STATUS_REJECT_STALE:
+	case REF_STATUS_REJECT_NODELETE:
+	case REF_STATUS_UPTODATE:
+		return 0;
+	default:
+		return 1;
+	}
+}
+
+/*
+ * the beginning of the next line, or the end of buffer.
+ *
+ * NEEDSWORK: perhaps move this to git-compat-util.h or somewhere and
+ * convert many similar uses found by "git grep -A4 memchr".
+ */
+static const char *next_line(const char *line, size_t len)
+{
+	const char *nl = memchr(line, '\n', len);
+	if (!nl)
+		return line + len; /* incomplete line */
+	return nl + 1;
+}
+
+static int generate_push_cert(struct strbuf *req_buf,
+			      const struct ref *remote_refs,
+			      struct send_pack_args *args,
+			      const char *cap_string,
+			      const char *push_cert_nonce)
+{
+	const struct ref *ref;
+	char *signing_key = xstrdup(get_signing_key());
+	const char *cp, *np;
+	struct strbuf cert = STRBUF_INIT;
+	int update_seen = 0;
+
+	strbuf_addf(&cert, "certificate version 0.1\n");
+	strbuf_addf(&cert, "pusher %s ", signing_key);
+	datestamp(&cert);
+	strbuf_addch(&cert, '\n');
+	if (args->url && *args->url) {
+		char *anon_url = transport_anonymize_url(args->url);
+		strbuf_addf(&cert, "pushee %s\n", anon_url);
+		free(anon_url);
+	}
+	if (push_cert_nonce[0])
+		strbuf_addf(&cert, "nonce %s\n", push_cert_nonce);
+	strbuf_addstr(&cert, "\n");
+
+	for (ref = remote_refs; ref; ref = ref->next) {
+		if (!ref_update_to_be_sent(ref, args))
+			continue;
+		update_seen = 1;
+		strbuf_addf(&cert, "%s %s %s\n",
+			    sha1_to_hex(ref->old_sha1),
+			    sha1_to_hex(ref->new_sha1),
+			    ref->name);
+	}
+	if (!update_seen)
+		goto free_return;
+
+	if (sign_buffer(&cert, &cert, signing_key))
+		die(_("failed to sign the push certificate"));
+
+	packet_buf_write(req_buf, "push-cert%c%s", 0, cap_string);
+	for (cp = cert.buf; cp < cert.buf + cert.len; cp = np) {
+		np = next_line(cp, cert.buf + cert.len - cp);
+		packet_buf_write(req_buf,
+				 "%.*s", (int)(np - cp), cp);
+	}
+	packet_buf_write(req_buf, "push-cert-end\n");
+
+free_return:
+	free(signing_key);
+	strbuf_release(&cert);
+	return update_seen;
+}
+
 int send_pack(struct send_pack_args *args,
 	      int fd[], struct child_process *conn,
 	      struct ref *remote_refs,
@@ -198,8 +286,9 @@
 	int in = fd[0];
 	int out = fd[1];
 	struct strbuf req_buf = STRBUF_INIT;
+	struct strbuf cap_buf = STRBUF_INIT;
 	struct ref *ref;
-	int new_refs;
+	int need_pack_data = 0;
 	int allow_deleting_refs = 0;
 	int status_report = 0;
 	int use_sideband = 0;
@@ -208,6 +297,7 @@
 	unsigned cmds_sent = 0;
 	int ret;
 	struct async demux;
+	const char *push_cert_nonce = NULL;
 
 	/* Does the other end support the reporting? */
 	if (server_supports("report-status"))
@@ -224,6 +314,14 @@
 		agent_supported = 1;
 	if (server_supports("no-thin"))
 		args->use_thin_pack = 0;
+	if (args->push_cert) {
+		int len;
+
+		push_cert_nonce = server_feature_value("push-cert", &len);
+		if (!push_cert_nonce)
+			die(_("the receiving end does not support --signed push"));
+		push_cert_nonce = xmemdupz(push_cert_nonce, len);
+	}
 
 	if (!remote_refs) {
 		fprintf(stderr, "No refs in common and none specified; doing nothing.\n"
@@ -231,64 +329,71 @@
 		return 0;
 	}
 
+	if (status_report)
+		strbuf_addstr(&cap_buf, " report-status");
+	if (use_sideband)
+		strbuf_addstr(&cap_buf, " side-band-64k");
+	if (quiet_supported && (args->quiet || !args->progress))
+		strbuf_addstr(&cap_buf, " quiet");
+	if (agent_supported)
+		strbuf_addf(&cap_buf, " agent=%s", git_user_agent_sanitized());
+
+	/*
+	 * NEEDSWORK: why does delete-refs have to be so specific to
+	 * send-pack machinery that set_ref_status_for_push() cannot
+	 * set this bit for us???
+	 */
+	for (ref = remote_refs; ref; ref = ref->next)
+		if (ref->deletion && !allow_deleting_refs)
+			ref->status = REF_STATUS_REJECT_NODELETE;
+
 	if (!args->dry_run)
 		advertise_shallow_grafts_buf(&req_buf);
 
+	if (!args->dry_run && args->push_cert)
+		cmds_sent = generate_push_cert(&req_buf, remote_refs, args,
+					       cap_buf.buf, push_cert_nonce);
+
+	/*
+	 * Clear the status for each ref and see if we need to send
+	 * the pack data.
+	 */
+	for (ref = remote_refs; ref; ref = ref->next) {
+		if (!ref_update_to_be_sent(ref, args))
+			continue;
+
+		if (!ref->deletion)
+			need_pack_data = 1;
+
+		if (args->dry_run || !status_report)
+			ref->status = REF_STATUS_OK;
+		else
+			ref->status = REF_STATUS_EXPECTING_REPORT;
+	}
+
 	/*
 	 * Finally, tell the other end!
 	 */
-	new_refs = 0;
 	for (ref = remote_refs; ref; ref = ref->next) {
-		if (!ref->peer_ref && !args->send_mirror)
+		char *old_hex, *new_hex;
+
+		if (args->dry_run || args->push_cert)
 			continue;
 
-		/* Check for statuses set by set_ref_status_for_push() */
-		switch (ref->status) {
-		case REF_STATUS_REJECT_NONFASTFORWARD:
-		case REF_STATUS_REJECT_ALREADY_EXISTS:
-		case REF_STATUS_REJECT_FETCH_FIRST:
-		case REF_STATUS_REJECT_NEEDS_FORCE:
-		case REF_STATUS_REJECT_STALE:
-		case REF_STATUS_UPTODATE:
+		if (!ref_update_to_be_sent(ref, args))
 			continue;
-		default:
-			; /* do nothing */
-		}
 
-		if (ref->deletion && !allow_deleting_refs) {
-			ref->status = REF_STATUS_REJECT_NODELETE;
-			continue;
-		}
-
-		if (!ref->deletion)
-			new_refs++;
-
-		if (args->dry_run) {
-			ref->status = REF_STATUS_OK;
+		old_hex = sha1_to_hex(ref->old_sha1);
+		new_hex = sha1_to_hex(ref->new_sha1);
+		if (!cmds_sent) {
+			packet_buf_write(&req_buf,
+					 "%s %s %s%c%s",
+					 old_hex, new_hex, ref->name, 0,
+					 cap_buf.buf);
+			cmds_sent = 1;
 		} else {
-			char *old_hex = sha1_to_hex(ref->old_sha1);
-			char *new_hex = sha1_to_hex(ref->new_sha1);
-			int quiet = quiet_supported && (args->quiet || !args->progress);
-
-			if (!cmds_sent && (status_report || use_sideband ||
-					   quiet || agent_supported)) {
-				packet_buf_write(&req_buf,
-						 "%s %s %s%c%s%s%s%s%s",
-						 old_hex, new_hex, ref->name, 0,
-						 status_report ? " report-status" : "",
-						 use_sideband ? " side-band-64k" : "",
-						 quiet ? " quiet" : "",
-						 agent_supported ? " agent=" : "",
-						 agent_supported ? git_user_agent_sanitized() : ""
-						);
-			}
-			else
-				packet_buf_write(&req_buf, "%s %s %s",
-						 old_hex, new_hex, ref->name);
-			ref->status = status_report ?
-				REF_STATUS_EXPECTING_REPORT :
-				REF_STATUS_OK;
-			cmds_sent++;
+			packet_buf_write(&req_buf, "%s %s %s",
+					 old_hex, new_hex, ref->name);
 		}
 	}
 
@@ -302,6 +407,7 @@
 		packet_flush(out);
 	}
 	strbuf_release(&req_buf);
+	strbuf_release(&cap_buf);
 
 	if (use_sideband && cmds_sent) {
 		memset(&demux, 0, sizeof(demux));
@@ -313,7 +419,7 @@
 		in = demux.out;
 	}
 
-	if (new_refs && cmds_sent) {
+	if (need_pack_data && cmds_sent) {
 		if (pack_objects(out, remote_refs, extra_have, args) < 0) {
 			for (ref = remote_refs; ref; ref = ref->next)
 				ref->status = REF_STATUS_NONE;
diff --git a/send-pack.h b/send-pack.h
index 8e84392..5635457 100644
--- a/send-pack.h
+++ b/send-pack.h
@@ -2,6 +2,7 @@
 #define SEND_PACK_H
 
 struct send_pack_args {
+	const char *url;
 	unsigned verbose:1,
 		quiet:1,
 		porcelain:1,
@@ -11,6 +12,7 @@
 		use_thin_pack:1,
 		use_ofs_delta:1,
 		dry_run:1,
+		push_cert:1,
 		stateless_rpc:1;
 };
 
diff --git a/sequencer.c b/sequencer.c
index bbaddcb..a03d4fa 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "lockfile.h"
 #include "sequencer.h"
 #include "dir.h"
 #include "object.h"
@@ -237,19 +238,33 @@
 static int fast_forward_to(const unsigned char *to, const unsigned char *from,
 			int unborn, struct replay_opts *opts)
 {
-	struct ref_lock *ref_lock;
+	struct ref_transaction *transaction;
 	struct strbuf sb = STRBUF_INIT;
-	int ret;
+	struct strbuf err = STRBUF_INIT;
 
 	read_cache();
 	if (checkout_fast_forward(from, to, 1))
-		exit(1); /* the callee should have complained already */
-	ref_lock = lock_any_ref_for_update("HEAD", unborn ? null_sha1 : from,
-					   0, NULL);
+		exit(128); /* the callee should have complained already */
+
 	strbuf_addf(&sb, "%s: fast-forward", action_name(opts));
-	ret = write_ref_sha1(ref_lock, to, sb.buf);
+
+	transaction = ref_transaction_begin(&err);
+	if (!transaction ||
+	    ref_transaction_update(transaction, "HEAD",
+				   to, unborn ? null_sha1 : from,
+				   0, 1, sb.buf, &err) ||
+	    ref_transaction_commit(transaction, &err)) {
+		ref_transaction_free(transaction);
+		error("%s", err.buf);
+		strbuf_release(&sb);
+		strbuf_release(&err);
+		return -1;
+	}
+
 	strbuf_release(&sb);
-	return ret;
+	strbuf_release(&err);
+	ref_transaction_free(transaction);
+	return 0;
 }
 
 static int do_recursive_merge(struct commit *base, struct commit *next,
@@ -259,11 +274,11 @@
 {
 	struct merge_options o;
 	struct tree *result, *next_tree, *base_tree, *head_tree;
-	int clean, index_fd;
+	int clean;
 	const char **xopt;
 	static struct lock_file index_lock;
 
-	index_fd = hold_locked_index(&index_lock, 1);
+	hold_locked_index(&index_lock, 1);
 
 	read_cache();
 
@@ -284,8 +299,7 @@
 			    next_tree, base_tree, &result);
 
 	if (active_cache_changed &&
-	    (write_cache(index_fd, active_cache, active_nr) ||
-	     commit_locked_index(&index_lock)))
+	    write_locked_index(&the_index, &index_lock, COMMIT_LOCK))
 		/* TRANSLATORS: %s will be "revert" or "cherry-pick" */
 		die(_("%s: Unable to write new index file"), action_name(opts));
 	rollback_lock_file(&index_lock);
@@ -317,7 +331,7 @@
 	unsigned char head_sha1[20];
 	struct commit *head_commit;
 
-	if (!resolve_ref_unsafe("HEAD", head_sha1, 1, NULL))
+	if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, head_sha1, NULL))
 		return error(_("Could not resolve HEAD commit\n"));
 
 	head_commit = lookup_commit(head_sha1);
@@ -337,9 +351,7 @@
 		active_cache_tree = cache_tree();
 
 	if (!cache_tree_fully_valid(active_cache_tree))
-		if (cache_tree_update(active_cache_tree,
-				      (const struct cache_entry * const *)active_cache,
-				      active_nr, 0))
+		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);
@@ -357,18 +369,13 @@
 {
 	struct argv_array array;
 	int rc;
-	char *gpg_sign;
 
 	argv_array_init(&array);
 	argv_array_push(&array, "commit");
 	argv_array_push(&array, "-n");
 
-	if (opts->gpg_sign) {
-		gpg_sign = xmalloc(3 + strlen(opts->gpg_sign));
-		sprintf(gpg_sign, "-S%s", opts->gpg_sign);
-		argv_array_push(&array, gpg_sign);
-		free(gpg_sign);
-	}
+	if (opts->gpg_sign)
+		argv_array_pushf(&array, "-S%s", opts->gpg_sign);
 	if (opts->signoff)
 		argv_array_push(&array, "-s");
 	if (!opts->edit) {
@@ -644,9 +651,8 @@
 	if (read_index_preload(&the_index, NULL) < 0)
 		die(_("git %s: failed to read the index"), action_name(opts));
 	refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
-	if (the_index.cache_changed) {
-		if (write_index(&the_index, index_fd) ||
-		    commit_locked_index(&index_lock))
+	if (the_index.cache_changed && index_fd >= 0) {
+		if (write_locked_index(&the_index, &index_lock, COMMIT_LOCK))
 			die(_("git %s: failed to refresh the index"), action_name(opts));
 	}
 	rollback_lock_file(&index_lock);
@@ -865,7 +871,7 @@
 	if (!file_exists(git_path("CHERRY_PICK_HEAD")) &&
 	    !file_exists(git_path("REVERT_HEAD")))
 		return error(_("no cherry-pick or revert in progress"));
-	if (read_ref_full("HEAD", head_sha1, 0, NULL))
+	if (read_ref_full("HEAD", 0, head_sha1, NULL))
 		return error(_("cannot resolve HEAD"));
 	if (is_null_sha1(head_sha1))
 		return error(_("cannot abort from a branch yet to be born"));
diff --git a/server-info.c b/server-info.c
index 9ec744e..31f4a74 100644
--- a/server-info.c
+++ b/server-info.c
@@ -4,45 +4,80 @@
 #include "commit.h"
 #include "tag.h"
 
-/* refs */
-static FILE *info_ref_fp;
+/*
+ * Create the file "path" by writing to a temporary file and renaming
+ * it into place. The contents of the file come from "generate", which
+ * should return non-zero if it encounters an error.
+ */
+static int update_info_file(char *path, int (*generate)(FILE *))
+{
+	char *tmp = mkpathdup("%s_XXXXXX", path);
+	int ret = -1;
+	int fd = -1;
+	FILE *fp = NULL;
+
+	safe_create_leading_directories(path);
+	fd = mkstemp(tmp);
+	if (fd < 0)
+		goto out;
+	fp = fdopen(fd, "w");
+	if (!fp)
+		goto out;
+	ret = generate(fp);
+	if (ret)
+		goto out;
+	if (fclose(fp))
+		goto out;
+	if (adjust_shared_perm(tmp) < 0)
+		goto out;
+	if (rename(tmp, path) < 0)
+		goto out;
+	ret = 0;
+
+out:
+	if (ret) {
+		error("unable to update %s: %s", path, strerror(errno));
+		if (fp)
+			fclose(fp);
+		else if (fd >= 0)
+			close(fd);
+		unlink(tmp);
+	}
+	free(tmp);
+	return ret;
+}
 
 static int add_info_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
 {
+	FILE *fp = cb_data;
 	struct object *o = parse_object(sha1);
 	if (!o)
 		return -1;
 
-	fprintf(info_ref_fp, "%s	%s\n", sha1_to_hex(sha1), path);
+	if (fprintf(fp, "%s	%s\n", sha1_to_hex(sha1), path) < 0)
+		return -1;
+
 	if (o->type == OBJ_TAG) {
 		o = deref_tag(o, path, 0);
 		if (o)
-			fprintf(info_ref_fp, "%s	%s^{}\n",
-				sha1_to_hex(o->sha1), path);
+			if (fprintf(fp, "%s	%s^{}\n",
+				sha1_to_hex(o->sha1), path) < 0)
+				return -1;
 	}
 	return 0;
 }
 
+static int generate_info_refs(FILE *fp)
+{
+	return for_each_ref(add_info_ref, fp);
+}
+
 static int update_info_refs(int force)
 {
-	char *path0 = git_pathdup("info/refs");
-	int len = strlen(path0);
-	char *path1 = xmalloc(len + 2);
-
-	strcpy(path1, path0);
-	strcpy(path1 + len, "+");
-
-	safe_create_leading_directories(path0);
-	info_ref_fp = fopen(path1, "w");
-	if (!info_ref_fp)
-		return error("unable to update %s", path1);
-	for_each_ref(add_info_ref, NULL);
-	fclose(info_ref_fp);
-	adjust_shared_perm(path1);
-	rename(path1, path0);
-	free(path0);
-	free(path1);
-	return 0;
+	char *path = git_pathdup("info/refs");
+	int ret = update_info_file(path, generate_info_refs);
+	free(path);
+	return ret;
 }
 
 /* packs */
@@ -198,36 +233,36 @@
 		info[i]->new_num = i;
 }
 
-static void write_pack_info_file(FILE *fp)
+static void free_pack_info(void)
 {
 	int i;
 	for (i = 0; i < num_pack; i++)
-		fprintf(fp, "P %s\n", info[i]->p->pack_name + objdirlen + 6);
-	fputc('\n', fp);
+		free(info[i]);
+	free(info);
+}
+
+static int write_pack_info_file(FILE *fp)
+{
+	int i;
+	for (i = 0; i < num_pack; i++) {
+		if (fprintf(fp, "P %s\n", info[i]->p->pack_name + objdirlen + 6) < 0)
+			return -1;
+	}
+	if (fputc('\n', fp) == EOF)
+		return -1;
+	return 0;
 }
 
 static int update_info_packs(int force)
 {
-	char infofile[PATH_MAX];
-	char name[PATH_MAX];
-	int namelen;
-	FILE *fp;
-
-	namelen = sprintf(infofile, "%s/info/packs", get_object_directory());
-	strcpy(name, infofile);
-	strcpy(name + namelen, "+");
+	char *infofile = mkpathdup("%s/info/packs", get_object_directory());
+	int ret;
 
 	init_pack_info(infofile, force);
-
-	safe_create_leading_directories(name);
-	fp = fopen(name, "w");
-	if (!fp)
-		return error("cannot open %s", name);
-	write_pack_info_file(fp);
-	fclose(fp);
-	adjust_shared_perm(name);
-	rename(name, infofile);
-	return 0;
+	ret = update_info_file(infofile, write_pack_info_file);
+	free_pack_info();
+	free(infofile);
+	return ret;
 }
 
 /* public */
diff --git a/setup.c b/setup.c
index 0a22f8b..979b13f 100644
--- a/setup.c
+++ b/setup.c
@@ -387,7 +387,7 @@
 }
 
 static const char *setup_explicit_git_dir(const char *gitdirenv,
-					  char *cwd, int len,
+					  struct strbuf *cwd,
 					  int *nongit_ok)
 {
 	const char *work_tree_env = getenv(GIT_WORK_TREE_ENVIRONMENT);
@@ -434,16 +434,16 @@
 		if (is_absolute_path(git_work_tree_cfg))
 			set_git_work_tree(git_work_tree_cfg);
 		else {
-			char core_worktree[PATH_MAX];
+			char *core_worktree;
 			if (chdir(gitdirenv))
 				die_errno("Could not chdir to '%s'", gitdirenv);
 			if (chdir(git_work_tree_cfg))
 				die_errno("Could not chdir to '%s'", git_work_tree_cfg);
-			if (!getcwd(core_worktree, PATH_MAX))
-				die_errno("Could not get directory '%s'", git_work_tree_cfg);
-			if (chdir(cwd))
+			core_worktree = xgetcwd();
+			if (chdir(cwd->buf))
 				die_errno("Could not come back to cwd");
 			set_git_work_tree(core_worktree);
+			free(core_worktree);
 		}
 	}
 	else if (!git_env_bool(GIT_IMPLICIT_WORK_TREE_ENVIRONMENT, 1)) {
@@ -459,21 +459,20 @@
 	worktree = get_git_work_tree();
 
 	/* both get_git_work_tree() and cwd are already normalized */
-	if (!strcmp(cwd, worktree)) { /* cwd == worktree */
+	if (!strcmp(cwd->buf, worktree)) { /* cwd == worktree */
 		set_git_dir(gitdirenv);
 		free(gitfile);
 		return NULL;
 	}
 
-	offset = dir_inside_of(cwd, worktree);
+	offset = dir_inside_of(cwd->buf, worktree);
 	if (offset >= 0) {	/* cwd inside worktree? */
 		set_git_dir(real_path(gitdirenv));
 		if (chdir(worktree))
 			die_errno("Could not chdir to '%s'", worktree);
-		cwd[len++] = '/';
-		cwd[len] = '\0';
+		strbuf_addch(cwd, '/');
 		free(gitfile);
-		return cwd + offset;
+		return cwd->buf + offset;
 	}
 
 	/* cwd outside worktree */
@@ -483,7 +482,7 @@
 }
 
 static const char *setup_discovered_git_dir(const char *gitdir,
-					    char *cwd, int offset, int len,
+					    struct strbuf *cwd, int offset,
 					    int *nongit_ok)
 {
 	if (check_repository_format_gently(gitdir, nongit_ok))
@@ -491,17 +490,17 @@
 
 	/* --work-tree is set without --git-dir; use discovered one */
 	if (getenv(GIT_WORK_TREE_ENVIRONMENT) || git_work_tree_cfg) {
-		if (offset != len && !is_absolute_path(gitdir))
+		if (offset != cwd->len && !is_absolute_path(gitdir))
 			gitdir = xstrdup(real_path(gitdir));
-		if (chdir(cwd))
+		if (chdir(cwd->buf))
 			die_errno("Could not come back to cwd");
-		return setup_explicit_git_dir(gitdir, cwd, len, nongit_ok);
+		return setup_explicit_git_dir(gitdir, cwd, nongit_ok);
 	}
 
 	/* #16.2, #17.2, #20.2, #21.2, #24, #25, #28, #29 (see t1510) */
 	if (is_bare_repository_cfg > 0) {
-		set_git_dir(offset == len ? gitdir : real_path(gitdir));
-		if (chdir(cwd))
+		set_git_dir(offset == cwd->len ? gitdir : real_path(gitdir));
+		if (chdir(cwd->buf))
 			die_errno("Could not come back to cwd");
 		return NULL;
 	}
@@ -512,18 +511,18 @@
 		set_git_dir(gitdir);
 	inside_git_dir = 0;
 	inside_work_tree = 1;
-	if (offset == len)
+	if (offset == cwd->len)
 		return NULL;
 
 	/* Make "offset" point to past the '/', and add a '/' at the end */
 	offset++;
-	cwd[len++] = '/';
-	cwd[len] = 0;
-	return cwd + offset;
+	strbuf_addch(cwd, '/');
+	return cwd->buf + offset;
 }
 
 /* #16.1, #17.1, #20.1, #21.1, #22.1 (see t1510) */
-static const char *setup_bare_git_dir(char *cwd, int offset, int len, int *nongit_ok)
+static const char *setup_bare_git_dir(struct strbuf *cwd, int offset,
+				      int *nongit_ok)
 {
 	int root_len;
 
@@ -536,20 +535,20 @@
 	if (getenv(GIT_WORK_TREE_ENVIRONMENT) || git_work_tree_cfg) {
 		const char *gitdir;
 
-		gitdir = offset == len ? "." : xmemdupz(cwd, offset);
-		if (chdir(cwd))
+		gitdir = offset == cwd->len ? "." : xmemdupz(cwd->buf, offset);
+		if (chdir(cwd->buf))
 			die_errno("Could not come back to cwd");
-		return setup_explicit_git_dir(gitdir, cwd, len, nongit_ok);
+		return setup_explicit_git_dir(gitdir, cwd, nongit_ok);
 	}
 
 	inside_git_dir = 1;
 	inside_work_tree = 0;
-	if (offset != len) {
-		if (chdir(cwd))
+	if (offset != cwd->len) {
+		if (chdir(cwd->buf))
 			die_errno("Cannot come back to cwd");
-		root_len = offset_1st_component(cwd);
-		cwd[offset > root_len ? offset : root_len] = '\0';
-		set_git_dir(cwd);
+		root_len = offset_1st_component(cwd->buf);
+		strbuf_setlen(cwd, offset > root_len ? offset : root_len);
+		set_git_dir(cwd->buf);
 	}
 	else
 		set_git_dir(".");
@@ -617,14 +616,23 @@
 {
 	const char *env_ceiling_dirs = getenv(CEILING_DIRECTORIES_ENVIRONMENT);
 	struct string_list ceiling_dirs = STRING_LIST_INIT_DUP;
-	static char cwd[PATH_MAX + 1];
+	static struct strbuf cwd = STRBUF_INIT;
 	const char *gitdirenv, *ret;
 	char *gitfile;
-	int len, offset, offset_parent, ceil_offset = -1;
+	int offset, offset_parent, ceil_offset = -1;
 	dev_t current_device = 0;
 	int one_filesystem = 1;
 
 	/*
+	 * We may have read an incomplete configuration before
+	 * setting-up the git directory. If so, clear the cache so
+	 * that the next queries to the configuration reload complete
+	 * configuration (including the per-repo config file that we
+	 * ignored previously).
+	 */
+	git_config_clear();
+
+	/*
 	 * Let's assume that we are in a git repository.
 	 * If it turns out later that we are somewhere else, the value will be
 	 * updated accordingly.
@@ -632,9 +640,9 @@
 	if (nongit_ok)
 		*nongit_ok = 0;
 
-	if (!getcwd(cwd, sizeof(cwd) - 1))
+	if (strbuf_getcwd(&cwd))
 		die_errno("Unable to read current working directory");
-	offset = len = strlen(cwd);
+	offset = cwd.len;
 
 	/*
 	 * If GIT_DIR is set explicitly, we're not going
@@ -643,7 +651,7 @@
 	 */
 	gitdirenv = getenv(GIT_DIR_ENVIRONMENT);
 	if (gitdirenv)
-		return setup_explicit_git_dir(gitdirenv, cwd, len, nongit_ok);
+		return setup_explicit_git_dir(gitdirenv, &cwd, nongit_ok);
 
 	if (env_ceiling_dirs) {
 		int empty_entry_found = 0;
@@ -651,11 +659,11 @@
 		string_list_split(&ceiling_dirs, env_ceiling_dirs, PATH_SEP, -1);
 		filter_string_list(&ceiling_dirs, 0,
 				   canonicalize_ceiling_entry, &empty_entry_found);
-		ceil_offset = longest_ancestor_length(cwd, &ceiling_dirs);
+		ceil_offset = longest_ancestor_length(cwd.buf, &ceiling_dirs);
 		string_list_clear(&ceiling_dirs, 0);
 	}
 
-	if (ceil_offset < 0 && has_dos_drive_prefix(cwd))
+	if (ceil_offset < 0 && has_dos_drive_prefix(cwd.buf))
 		ceil_offset = 1;
 
 	/*
@@ -683,7 +691,7 @@
 
 		if (gitdirenv) {
 			ret = setup_discovered_git_dir(gitdirenv,
-						       cwd, offset, len,
+						       &cwd, offset,
 						       nongit_ok);
 			free(gitfile);
 			return ret;
@@ -691,29 +699,31 @@
 		free(gitfile);
 
 		if (is_git_directory("."))
-			return setup_bare_git_dir(cwd, offset, len, nongit_ok);
+			return setup_bare_git_dir(&cwd, offset, nongit_ok);
 
 		offset_parent = offset;
-		while (--offset_parent > ceil_offset && cwd[offset_parent] != '/');
+		while (--offset_parent > ceil_offset && cwd.buf[offset_parent] != '/');
 		if (offset_parent <= ceil_offset)
-			return setup_nongit(cwd, nongit_ok);
+			return setup_nongit(cwd.buf, nongit_ok);
 		if (one_filesystem) {
-			dev_t parent_device = get_device_or_die("..", cwd, offset);
+			dev_t parent_device = get_device_or_die("..", cwd.buf,
+								offset);
 			if (parent_device != current_device) {
 				if (nongit_ok) {
-					if (chdir(cwd))
+					if (chdir(cwd.buf))
 						die_errno("Cannot come back to cwd");
 					*nongit_ok = 1;
 					return NULL;
 				}
-				cwd[offset] = '\0';
+				strbuf_setlen(&cwd, offset);
 				die("Not a git repository (or any parent up to mount point %s)\n"
-				"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).", cwd);
+				"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).",
+				    cwd.buf);
 			}
 		}
 		if (chdir("..")) {
-			cwd[offset] = '\0';
-			die_errno("Cannot change to '%s/..'", cwd);
+			strbuf_setlen(&cwd, offset);
+			die_errno("Cannot change to '%s/..'", cwd.buf);
 		}
 		offset = offset_parent;
 	}
diff --git a/sh-i18n--envsubst.c b/sh-i18n--envsubst.c
index 6dd03a9..2842a22 100644
--- a/sh-i18n--envsubst.c
+++ b/sh-i18n--envsubst.c
@@ -208,11 +208,8 @@
   /* Grow the list.  */
   if (slp->nitems >= slp->nitems_max)
     {
-      size_t nbytes;
-
       slp->nitems_max = slp->nitems_max * 2 + 4;
-      nbytes = slp->nitems_max * sizeof (slp->item[0]);
-      slp->item = (const char **) xrealloc (slp->item, nbytes);
+      REALLOC_ARRAY(slp->item, slp->nitems_max);
     }
 
   /* Add the string to the end of the list.  */
diff --git a/sha1-lookup.c b/sha1-lookup.c
index 2dd8515..5f06921 100644
--- a/sha1-lookup.c
+++ b/sha1-lookup.c
@@ -84,8 +84,6 @@
 				die("BUG: assertion failed in binary search");
 			}
 		}
-		if (18 <= ofs)
-			die("cannot happen -- lo and hi are identical");
 	}
 
 	do {
diff --git a/sha1_file.c b/sha1_file.c
index a38854c..d7f1838 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -8,6 +8,7 @@
  */
 #include "cache.h"
 #include "string-list.h"
+#include "lockfile.h"
 #include "delta.h"
 #include "pack.h"
 #include "blob.h"
@@ -36,9 +37,6 @@
 
 const unsigned char null_sha1[20];
 
-static const char *no_log_pack_access = "no_log_pack_access";
-static const char *log_pack_access;
-
 /*
  * This is meant to hold a *small* number of objects that you would
  * want read_sha1_file() to be able to return, but yet you do not want
@@ -268,9 +266,9 @@
  * SHA1, an extra slash for the first level indirection, and the
  * terminating NUL.
  */
-static int link_alt_odb_entry(const char *entry, const char *relative_base, int depth)
+static int link_alt_odb_entry(const char *entry, const char *relative_base,
+	int depth, const char *normalized_objdir)
 {
-	const char *objdir = get_object_directory();
 	struct alternate_object_database *ent;
 	struct alternate_object_database *alt;
 	int pfxlen, entlen;
@@ -321,7 +319,7 @@
 			return -1;
 		}
 	}
-	if (!strcmp(ent->base, objdir)) {
+	if (!strcmp_icase(ent->base, normalized_objdir)) {
 		free(ent);
 		return -1;
 	}
@@ -345,6 +343,7 @@
 	struct string_list entries = STRING_LIST_INIT_NODUP;
 	char *alt_copy;
 	int i;
+	struct strbuf objdirbuf = STRBUF_INIT;
 
 	if (depth > 5) {
 		error("%s: ignoring alternate object stores, nesting too deep.",
@@ -352,6 +351,9 @@
 		return;
 	}
 
+	strbuf_add_absolute_path(&objdirbuf, get_object_directory());
+	normalize_path_copy(objdirbuf.buf, objdirbuf.buf);
+
 	alt_copy = xmemdupz(alt, len);
 	string_list_split_in_place(&entries, alt_copy, sep, -1);
 	for (i = 0; i < entries.nr; i++) {
@@ -362,11 +364,12 @@
 			error("%s: ignoring relative alternate object store %s",
 					relative_base, entry);
 		} else {
-			link_alt_odb_entry(entry, relative_base, depth);
+			link_alt_odb_entry(entry, relative_base, depth, objdirbuf.buf);
 		}
 	}
 	string_list_clear(&entries, 0);
 	free(alt_copy);
+	strbuf_release(&objdirbuf);
 }
 
 void read_info_alternates(const char * relative_base, int depth)
@@ -410,14 +413,18 @@
 		link_alt_odb_entries(alt, strlen(alt), '\n', NULL, 0);
 }
 
-void foreach_alt_odb(alt_odb_fn fn, void *cb)
+int foreach_alt_odb(alt_odb_fn fn, void *cb)
 {
 	struct alternate_object_database *ent;
+	int r = 0;
 
 	prepare_alt_odb();
-	for (ent = alt_odb_list; ent; ent = ent->next)
-		if (fn(ent, cb))
-			return;
+	for (ent = alt_odb_list; ent; ent = ent->next) {
+		r = fn(ent, cb);
+		if (r)
+			break;
+	}
+	return r;
 }
 
 void prepare_alt_odb(void)
@@ -436,27 +443,53 @@
 	read_info_alternates(get_object_directory(), 0);
 }
 
-static int has_loose_object_local(const unsigned char *sha1)
+static int freshen_file(const char *fn)
 {
-	return !access(sha1_file_name(sha1), F_OK);
+	struct utimbuf t;
+	t.actime = t.modtime = time(NULL);
+	return !utime(fn, &t);
 }
 
-int has_loose_object_nonlocal(const unsigned char *sha1)
+static int check_and_freshen_file(const char *fn, int freshen)
+{
+	if (access(fn, F_OK))
+		return 0;
+	if (freshen && freshen_file(fn))
+		return 0;
+	return 1;
+}
+
+static int check_and_freshen_local(const unsigned char *sha1, int freshen)
+{
+	return check_and_freshen_file(sha1_file_name(sha1), freshen);
+}
+
+static int check_and_freshen_nonlocal(const unsigned char *sha1, int freshen)
 {
 	struct alternate_object_database *alt;
 	prepare_alt_odb();
 	for (alt = alt_odb_list; alt; alt = alt->next) {
 		fill_sha1_path(alt->name, sha1);
-		if (!access(alt->base, F_OK))
+		if (check_and_freshen_file(alt->base, freshen))
 			return 1;
 	}
 	return 0;
 }
 
+static int check_and_freshen(const unsigned char *sha1, int freshen)
+{
+	return check_and_freshen_local(sha1, freshen) ||
+	       check_and_freshen_nonlocal(sha1, freshen);
+}
+
+int has_loose_object_nonlocal(const unsigned char *sha1)
+{
+	return check_and_freshen_nonlocal(sha1, 0);
+}
+
 static int has_loose_object(const unsigned char *sha1)
 {
-	return has_loose_object_local(sha1) ||
-	       has_loose_object_nonlocal(sha1);
+	return check_and_freshen(sha1, 0);
 }
 
 static unsigned int pack_used_ctr;
@@ -661,10 +694,26 @@
 		; /* nothing */
 }
 
+static void mmap_limit_check(size_t length)
+{
+	static size_t limit = 0;
+	if (!limit) {
+		limit = git_env_ulong("GIT_MMAP_LIMIT", 0);
+		if (!limit)
+			limit = SIZE_MAX;
+	}
+	if (length > limit)
+		die("attempting to mmap %"PRIuMAX" over limit %"PRIuMAX,
+		    (uintmax_t)length, (uintmax_t)limit);
+}
+
 void *xmmap(void *start, size_t length,
 	int prot, int flags, int fd, off_t offset)
 {
-	void *ret = mmap(start, length, prot, flags, fd, offset);
+	void *ret;
+
+	mmap_limit_check(length);
+	ret = mmap(start, length, prot, flags, fd, offset);
 	if (ret == MAP_FAILED) {
 		if (!length)
 			return NULL;
@@ -1178,48 +1227,42 @@
 
 static void prepare_packed_git_one(char *objdir, int local)
 {
-	/* Ensure that this buffer is large enough so that we can
-	   append "/pack/" without clobbering the stack even if
-	   strlen(objdir) were PATH_MAX.  */
-	char path[PATH_MAX + 1 + 4 + 1 + 1];
-	int len;
+	struct strbuf path = STRBUF_INIT;
+	size_t dirnamelen;
 	DIR *dir;
 	struct dirent *de;
 	struct string_list garbage = STRING_LIST_INIT_DUP;
 
-	sprintf(path, "%s/pack", objdir);
-	len = strlen(path);
-	dir = opendir(path);
+	strbuf_addstr(&path, objdir);
+	strbuf_addstr(&path, "/pack");
+	dir = opendir(path.buf);
 	if (!dir) {
 		if (errno != ENOENT)
 			error("unable to open object pack directory: %s: %s",
-			      path, strerror(errno));
+			      path.buf, strerror(errno));
+		strbuf_release(&path);
 		return;
 	}
-	path[len++] = '/';
+	strbuf_addch(&path, '/');
+	dirnamelen = path.len;
 	while ((de = readdir(dir)) != NULL) {
-		int namelen = strlen(de->d_name);
 		struct packed_git *p;
-
-		if (len + namelen + 1 > sizeof(path)) {
-			if (report_garbage) {
-				struct strbuf sb = STRBUF_INIT;
-				strbuf_addf(&sb, "%.*s/%s", len - 1, path, de->d_name);
-				report_garbage("path too long", sb.buf);
-				strbuf_release(&sb);
-			}
-			continue;
-		}
+		size_t base_len;
 
 		if (is_dot_or_dotdot(de->d_name))
 			continue;
 
-		strcpy(path + len, de->d_name);
+		strbuf_setlen(&path, dirnamelen);
+		strbuf_addstr(&path, de->d_name);
 
-		if (has_extension(de->d_name, ".idx")) {
+		base_len = path.len;
+		if (strip_suffix_mem(path.buf, &base_len, ".idx")) {
 			/* Don't reopen a pack we already have. */
 			for (p = packed_git; p; p = p->next) {
-				if (!memcmp(path, p->pack_name, len + namelen - 4))
+				size_t len;
+				if (strip_suffix(p->pack_name, ".pack", &len) &&
+				    len == base_len &&
+				    !memcmp(p->pack_name, path.buf, len))
 					break;
 			}
 			if (p == NULL &&
@@ -1227,24 +1270,25 @@
 			     * See if it really is a valid .idx file with
 			     * corresponding .pack file that we can map.
 			     */
-			    (p = add_packed_git(path, len + namelen, local)) != NULL)
+			    (p = add_packed_git(path.buf, path.len, local)) != NULL)
 				install_packed_git(p);
 		}
 
 		if (!report_garbage)
 			continue;
 
-		if (has_extension(de->d_name, ".idx") ||
-		    has_extension(de->d_name, ".pack") ||
-		    has_extension(de->d_name, ".bitmap") ||
-		    has_extension(de->d_name, ".keep"))
-			string_list_append(&garbage, path);
+		if (ends_with(de->d_name, ".idx") ||
+		    ends_with(de->d_name, ".pack") ||
+		    ends_with(de->d_name, ".bitmap") ||
+		    ends_with(de->d_name, ".keep"))
+			string_list_append(&garbage, path.buf);
 		else
-			report_garbage("garbage found", path);
+			report_garbage("garbage found", path.buf);
 	}
 	closedir(dir);
 	report_pack_garbage(&garbage);
 	string_list_clear(&garbage, 0);
+	strbuf_release(&path);
 }
 
 static int sort_pack(const void *a_, const void *b_)
@@ -1926,7 +1970,9 @@
 	git_zstream stream;
 	unsigned char *buffer, *in;
 
-	buffer = xmallocz(size);
+	buffer = xmallocz_gently(size);
+	if (!buffer)
+		return NULL;
 	memset(&stream, 0, sizeof(stream));
 	stream.next_out = buffer;
 	stream.avail_out = size + 1;
@@ -2086,27 +2132,9 @@
 
 static void write_pack_access_log(struct packed_git *p, off_t obj_offset)
 {
-	static FILE *log_file;
-
-	if (!log_pack_access)
-		log_pack_access = getenv("GIT_TRACE_PACK_ACCESS");
-	if (!log_pack_access)
-		log_pack_access = no_log_pack_access;
-	if (log_pack_access == no_log_pack_access)
-		return;
-
-	if (!log_file) {
-		log_file = fopen(log_pack_access, "w");
-		if (!log_file) {
-			error("cannot open pack access log '%s' for writing: %s",
-			      log_pack_access, strerror(errno));
-			log_pack_access = no_log_pack_access;
-			return;
-		}
-	}
-	fprintf(log_file, "%s %"PRIuMAX"\n",
-		p->pack_name, (uintmax_t)obj_offset);
-	fflush(log_file);
+	static struct trace_key pack_access = TRACE_KEY_INIT(PACK_ACCESS);
+	trace_printf_key(&pack_access, "%s %"PRIuMAX"\n",
+			 p->pack_name, (uintmax_t)obj_offset);
 }
 
 int do_check_packed_object_crc;
@@ -2131,8 +2159,7 @@
 	int delta_stack_nr = 0, delta_stack_alloc = UNPACK_ENTRY_STACK_PREALLOC;
 	int base_from_cache = 0;
 
-	if (log_pack_access != no_log_pack_access)
-		write_pack_access_log(p, obj_offset);
+	write_pack_access_log(p, obj_offset);
 
 	/* PHASE 1: drill down to the innermost base object */
 	for (;;) {
@@ -2965,6 +2992,17 @@
 	return move_temp_to_file(tmp_file, filename);
 }
 
+static int freshen_loose_object(const unsigned char *sha1)
+{
+	return check_and_freshen(sha1, 1);
+}
+
+static int freshen_packed_object(const unsigned char *sha1)
+{
+	struct pack_entry e;
+	return find_pack_entry(sha1, &e) && freshen_file(e.p->pack_name);
+}
+
 int write_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *returnsha1)
 {
 	unsigned char sha1[20];
@@ -2977,7 +3015,7 @@
 	write_sha1_file_prepare(buf, len, type, sha1, hdr, &hdrlen);
 	if (returnsha1)
 		hashcpy(returnsha1, sha1);
-	if (has_sha1_file(sha1))
+	if (freshen_loose_object(sha1) || freshen_packed_object(sha1))
 		return 0;
 	return write_loose_object(sha1, hdr, hdrlen, buf, len, 0);
 }
@@ -3096,6 +3134,29 @@
 	return ret;
 }
 
+static int index_stream_convert_blob(unsigned char *sha1, int fd,
+				     const char *path, unsigned flags)
+{
+	int ret;
+	const int write_object = flags & HASH_WRITE_OBJECT;
+	struct strbuf sbuf = STRBUF_INIT;
+
+	assert(path);
+	assert(would_convert_to_git_filter_fd(path));
+
+	convert_to_git_filter_fd(path, fd, &sbuf,
+				 write_object ? safe_crlf : SAFE_CRLF_FALSE);
+
+	if (write_object)
+		ret = write_sha1_file(sbuf.buf, sbuf.len, typename(OBJ_BLOB),
+				      sha1);
+	else
+		ret = hash_sha1_file(sbuf.buf, sbuf.len, typename(OBJ_BLOB),
+				     sha1);
+	strbuf_release(&sbuf);
+	return ret;
+}
+
 static int index_pipe(unsigned char *sha1, int fd, enum object_type type,
 		      const char *path, unsigned flags)
 {
@@ -3161,15 +3222,22 @@
 	     enum object_type type, const char *path, unsigned flags)
 {
 	int ret;
-	size_t size = xsize_t(st->st_size);
 
-	if (!S_ISREG(st->st_mode))
+	/*
+	 * Call xsize_t() only when needed to avoid potentially unnecessary
+	 * die() for large files.
+	 */
+	if (type == OBJ_BLOB && path && would_convert_to_git_filter_fd(path))
+		ret = index_stream_convert_blob(sha1, fd, path, flags);
+	else if (!S_ISREG(st->st_mode))
 		ret = index_pipe(sha1, fd, type, path, flags);
-	else if (size <= big_file_threshold || type != OBJ_BLOB ||
-		 (path && would_convert_to_git(path, NULL, 0, 0)))
-		ret = index_core(sha1, fd, size, type, path, flags);
+	else if (st->st_size <= big_file_threshold || type != OBJ_BLOB ||
+		 (path && would_convert_to_git(path)))
+		ret = index_core(sha1, fd, xsize_t(st->st_size), type, path,
+				 flags);
 	else
-		ret = index_stream(sha1, fd, size, type, path, flags);
+		ret = index_stream(sha1, fd, xsize_t(st->st_size), type, path,
+				   flags);
 	close(fd);
 	return ret;
 }
@@ -3234,3 +3302,149 @@
 		die("%s is not a valid '%s' object", sha1_to_hex(sha1),
 		    typename(expect));
 }
+
+static int for_each_file_in_obj_subdir(int subdir_nr,
+				       struct strbuf *path,
+				       each_loose_object_fn obj_cb,
+				       each_loose_cruft_fn cruft_cb,
+				       each_loose_subdir_fn subdir_cb,
+				       void *data)
+{
+	size_t baselen = path->len;
+	DIR *dir = opendir(path->buf);
+	struct dirent *de;
+	int r = 0;
+
+	if (!dir) {
+		if (errno == ENOENT)
+			return 0;
+		return error("unable to open %s: %s", path->buf, strerror(errno));
+	}
+
+	while ((de = readdir(dir))) {
+		if (is_dot_or_dotdot(de->d_name))
+			continue;
+
+		strbuf_setlen(path, baselen);
+		strbuf_addf(path, "/%s", de->d_name);
+
+		if (strlen(de->d_name) == 38)  {
+			char hex[41];
+			unsigned char sha1[20];
+
+			snprintf(hex, sizeof(hex), "%02x%s",
+				 subdir_nr, de->d_name);
+			if (!get_sha1_hex(hex, sha1)) {
+				if (obj_cb) {
+					r = obj_cb(sha1, path->buf, data);
+					if (r)
+						break;
+				}
+				continue;
+			}
+		}
+
+		if (cruft_cb) {
+			r = cruft_cb(de->d_name, path->buf, data);
+			if (r)
+				break;
+		}
+	}
+	strbuf_setlen(path, baselen);
+
+	if (!r && subdir_cb)
+		r = subdir_cb(subdir_nr, path->buf, data);
+
+	closedir(dir);
+	return r;
+}
+
+int for_each_loose_file_in_objdir(const char *path,
+			    each_loose_object_fn obj_cb,
+			    each_loose_cruft_fn cruft_cb,
+			    each_loose_subdir_fn subdir_cb,
+			    void *data)
+{
+	struct strbuf buf = STRBUF_INIT;
+	size_t baselen;
+	int r = 0;
+	int i;
+
+	strbuf_addstr(&buf, path);
+	strbuf_addch(&buf, '/');
+	baselen = buf.len;
+
+	for (i = 0; i < 256; i++) {
+		strbuf_addf(&buf, "%02x", i);
+		r = for_each_file_in_obj_subdir(i, &buf, obj_cb, cruft_cb,
+						subdir_cb, data);
+		strbuf_setlen(&buf, baselen);
+		if (r)
+			break;
+	}
+
+	strbuf_release(&buf);
+	return r;
+}
+
+struct loose_alt_odb_data {
+	each_loose_object_fn *cb;
+	void *data;
+};
+
+static int loose_from_alt_odb(struct alternate_object_database *alt,
+			      void *vdata)
+{
+	struct loose_alt_odb_data *data = vdata;
+	return for_each_loose_file_in_objdir(alt->base,
+					     data->cb, NULL, NULL,
+					     data->data);
+}
+
+int for_each_loose_object(each_loose_object_fn cb, void *data)
+{
+	struct loose_alt_odb_data alt;
+	int r;
+
+	r = for_each_loose_file_in_objdir(get_object_directory(),
+					  cb, NULL, NULL, data);
+	if (r)
+		return r;
+
+	alt.cb = cb;
+	alt.data = data;
+	return foreach_alt_odb(loose_from_alt_odb, &alt);
+}
+
+static int for_each_object_in_pack(struct packed_git *p, each_packed_object_fn cb, void *data)
+{
+	uint32_t i;
+	int r = 0;
+
+	for (i = 0; i < p->num_objects; i++) {
+		const unsigned char *sha1 = nth_packed_object_sha1(p, i);
+
+		if (!sha1)
+			return error("unable to get sha1 of object %u in %s",
+				     i, p->pack_name);
+
+		r = cb(sha1, p, i, data);
+		if (r)
+			break;
+	}
+	return r;
+}
+
+int for_each_packed_object(each_packed_object_fn cb, void *data)
+{
+	struct packed_git *p;
+	int r = 0;
+
+	prepare_packed_git();
+	for (p = packed_git; p; p = p->next) {
+		r = for_each_object_in_pack(p, cb, data);
+		if (r)
+			break;
+	}
+	return r;
+}
diff --git a/sha1_name.c b/sha1_name.c
index c2c938c..5b004f5 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -432,7 +432,8 @@
 static int get_sha1_1(const char *name, int len, unsigned char *sha1, unsigned lookup_flags);
 static int interpret_nth_prior_checkout(const char *name, int namelen, struct strbuf *buf);
 
-static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
+static int get_sha1_basic(const char *str, int len, unsigned char *sha1,
+			  unsigned int flags)
 {
 	static const char *warn_msg = "refname '%.*s' is ambiguous.";
 	static const char *object_name_msg = N_(
@@ -511,7 +512,7 @@
 	if (!refs_found)
 		return -1;
 
-	if (warn_ambiguous_refs &&
+	if (warn_ambiguous_refs && !(flags & GET_SHA1_QUIETLY) &&
 	    (refs_found > 1 ||
 	     !get_short_sha1(str, len, tmp_sha1, GET_SHA1_QUIETLY)))
 		warning(warn_msg, len, str);
@@ -540,10 +541,12 @@
 			char *tmp = xstrndup(str + at + 2, reflog_len);
 			at_time = approxidate_careful(tmp, &errors);
 			free(tmp);
-			if (errors)
+			if (errors) {
+				free(real_ref);
 				return -1;
+			}
 		}
-		if (read_ref_at(real_ref, at_time, nth, sha1, NULL,
+		if (read_ref_at(real_ref, flags, at_time, nth, sha1, NULL,
 				&co_time, &co_tz, &co_cnt)) {
 			if (!len) {
 				if (starts_with(real_ref, "refs/heads/")) {
@@ -555,11 +558,16 @@
 					len = 4;
 				}
 			}
-			if (at_time)
-				warning("Log for '%.*s' only goes "
-					"back to %s.", len, str,
-					show_date(co_time, co_tz, DATE_RFC2822));
-			else {
+			if (at_time) {
+				if (!(flags & GET_SHA1_QUIETLY)) {
+					warning("Log for '%.*s' only goes "
+						"back to %s.", len, str,
+						show_date(co_time, co_tz, DATE_RFC2822));
+				}
+			} else {
+				if (flags & GET_SHA1_QUIETLY) {
+					exit(128);
+				}
 				die("Log for '%.*s' only has %d entries.",
 				    len, str, co_cnt);
 			}
@@ -799,7 +807,7 @@
 	if (!ret)
 		return 0;
 
-	ret = get_sha1_basic(name, len, sha1);
+	ret = get_sha1_basic(name, len, sha1, lookup_flags);
 	if (!ret)
 		return 0;
 
@@ -837,7 +845,7 @@
 	}
 	if (object->type != OBJ_COMMIT)
 		return 0;
-	commit_list_insert_by_date((struct commit *)object, list);
+	commit_list_insert((struct commit *)object, list);
 	return 0;
 }
 
@@ -901,10 +909,8 @@
 	const char *match = NULL, *target = NULL;
 	size_t len;
 
-	if (starts_with(message, "checkout: moving from ")) {
-		match = message + strlen("checkout: moving from ");
+	if (skip_prefix(message, "checkout: moving from ", &match))
 		target = strstr(match, " to ");
-	}
 
 	if (!match || !target)
 		return 0;
@@ -948,7 +954,7 @@
 	retval = 0;
 	if (0 < for_each_reflog_ent_reverse("HEAD", grab_nth_branch_switch, &cb)) {
 		strbuf_reset(buf);
-		strbuf_add(buf, cb.buf.buf, cb.buf.len);
+		strbuf_addbuf(buf, &cb.buf);
 		retval = brace - name + 1;
 	}
 
@@ -1242,10 +1248,7 @@
 		die("Path '%s' exists on disk, but not in '%.*s'.",
 		    filename, object_name_len, object_name);
 	if (errno == ENOENT || errno == ENOTDIR) {
-		char *fullname = xmalloc(strlen(filename)
-					     + strlen(prefix) + 1);
-		strcpy(fullname, prefix);
-		strcat(fullname, filename);
+		char *fullname = xstrfmt("%s%s", prefix, filename);
 
 		if (!get_tree_entry(tree_sha1, fullname,
 				    sha1, &mode)) {
@@ -1369,6 +1372,7 @@
 		if (!only_to_die && namelen > 2 && name[1] == '/') {
 			struct commit_list *list = NULL;
 			for_each_ref(handle_one_ref, &list);
+			commit_list_sort_by_date(&list);
 			return get_sha1_oneline(name + 2, sha1, list);
 		}
 		if (namelen < 3 ||
diff --git a/shallow.c b/shallow.c
index 0b267b6..cdd0775 100644
--- a/shallow.c
+++ b/shallow.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "lockfile.h"
 #include "commit.h"
 #include "tag.h"
 #include "pkt-line.h"
@@ -226,7 +227,6 @@
 
 const char *setup_temporary_shallow(const struct sha1_array *extra)
 {
-	static int installed_handler;
 	struct strbuf sb = STRBUF_INIT;
 	int fd;
 
@@ -237,10 +237,8 @@
 		strbuf_addstr(&temporary_shallow, git_path("shallow_XXXXXX"));
 		fd = xmkstemp(temporary_shallow.buf);
 
-		if (!installed_handler) {
-			atexit(remove_temporary_shallow);
-			sigchain_push_common(remove_temporary_shallow_on_signal);
-		}
+		atexit(remove_temporary_shallow);
+		sigchain_push_common(remove_temporary_shallow_on_signal);
 
 		if (write_in_full(fd, sb.buf, sb.len) != sb.len)
 			die_errno("failed to write to %s",
@@ -269,8 +267,8 @@
 	if (write_shallow_commits(&sb, 0, extra)) {
 		if (write_in_full(fd, sb.buf, sb.len) != sb.len)
 			die_errno("failed to write to %s",
-				  shallow_lock->filename);
-		*alternate_shallow_file = shallow_lock->filename;
+				  shallow_lock->filename.buf);
+		*alternate_shallow_file = shallow_lock->filename.buf;
 	} else
 		/*
 		 * is_repository_shallow() sees empty string as "no
@@ -316,7 +314,7 @@
 	if (write_shallow_commits_1(&sb, 0, NULL, SEEN_ONLY)) {
 		if (write_in_full(fd, sb.buf, sb.len) != sb.len)
 			die_errno("failed to write to %s",
-				  shallow_lock.filename);
+				  shallow_lock.filename.buf);
 		commit_lock_file(&shallow_lock);
 	} else {
 		unlink(git_path("shallow"));
@@ -325,7 +323,7 @@
 	strbuf_release(&sb);
 }
 
-#define TRACE_KEY "GIT_TRACE_SHALLOW"
+struct trace_key trace_shallow = TRACE_KEY_INIT(SHALLOW);
 
 /*
  * Step 1, split sender shallow commits into "ours" and "theirs"
@@ -334,7 +332,7 @@
 void prepare_shallow_info(struct shallow_info *info, struct sha1_array *sa)
 {
 	int i;
-	trace_printf_key(TRACE_KEY, "shallow: prepare_shallow_info\n");
+	trace_printf_key(&trace_shallow, "shallow: prepare_shallow_info\n");
 	memset(info, 0, sizeof(*info));
 	info->shallow = sa;
 	if (!sa)
@@ -365,7 +363,7 @@
 {
 	unsigned char (*sha1)[20] = info->shallow->sha1;
 	int i, dst;
-	trace_printf_key(TRACE_KEY, "shallow: remove_nonexistent_theirs_shallow\n");
+	trace_printf_key(&trace_shallow, "shallow: remove_nonexistent_theirs_shallow\n");
 	for (i = dst = 0; i < info->nr_theirs; i++) {
 		if (i != dst)
 			info->theirs[dst] = info->theirs[i];
@@ -392,8 +390,7 @@
 	void *p;
 	if (!info->slab_count || info->free + size > info->end) {
 		info->slab_count++;
-		info->slab = xrealloc(info->slab,
-				      info->slab_count * sizeof(*info->slab));
+		REALLOC_ARRAY(info->slab, info->slab_count);
 		info->free = xmalloc(COMMIT_SLAB_SIZE);
 		info->slab[info->slab_count - 1] = info->free;
 		info->end = info->free + COMMIT_SLAB_SIZE;
@@ -516,7 +513,7 @@
 	int *shallow, nr_shallow = 0;
 	struct paint_info pi;
 
-	trace_printf_key(TRACE_KEY, "shallow: assign_shallow_commits_to_refs\n");
+	trace_printf_key(&trace_shallow, "shallow: assign_shallow_commits_to_refs\n");
 	shallow = xmalloc(sizeof(*shallow) * (info->nr_ours + info->nr_theirs));
 	for (i = 0; i < info->nr_ours; i++)
 		shallow[nr_shallow++] = info->ours[i];
@@ -622,7 +619,7 @@
 	int bitmap_nr = (info->ref->nr + 31) / 32;
 	struct commit_array ca;
 
-	trace_printf_key(TRACE_KEY, "shallow: post_assign_shallow\n");
+	trace_printf_key(&trace_shallow, "shallow: post_assign_shallow\n");
 	if (ref_status)
 		memset(ref_status, 0, sizeof(*ref_status) * info->ref->nr);
 
diff --git a/shell.c b/shell.c
index 5c0d47a..ace62e4 100644
--- a/shell.c
+++ b/shell.c
@@ -46,11 +46,7 @@
 
 static char *make_cmd(const char *prog)
 {
-	char *prefix = xmalloc((strlen(prog) + strlen(COMMAND_DIR) + 2));
-	strcpy(prefix, COMMAND_DIR);
-	strcat(prefix, "/");
-	strcat(prefix, prog);
-	return prefix;
+	return xstrfmt("%s/%s", COMMAND_DIR, prog);
 }
 
 static void cd_to_homedir(void)
diff --git a/sigchain.c b/sigchain.c
index 1118b99..faa375d 100644
--- a/sigchain.c
+++ b/sigchain.c
@@ -1,5 +1,5 @@
-#include "sigchain.h"
 #include "cache.h"
+#include "sigchain.h"
 
 #define SIGCHAIN_MAX_SIGNALS 32
 
diff --git a/split-index.c b/split-index.c
new file mode 100644
index 0000000..21485e2
--- /dev/null
+++ b/split-index.c
@@ -0,0 +1,328 @@
+#include "cache.h"
+#include "split-index.h"
+#include "ewah/ewok.h"
+
+struct split_index *init_split_index(struct index_state *istate)
+{
+	if (!istate->split_index) {
+		istate->split_index = xcalloc(1, sizeof(*istate->split_index));
+		istate->split_index->refcount = 1;
+	}
+	return istate->split_index;
+}
+
+int read_link_extension(struct index_state *istate,
+			 const void *data_, unsigned long sz)
+{
+	const unsigned char *data = data_;
+	struct split_index *si;
+	int ret;
+
+	if (sz < 20)
+		return error("corrupt link extension (too short)");
+	si = init_split_index(istate);
+	hashcpy(si->base_sha1, data);
+	data += 20;
+	sz -= 20;
+	if (!sz)
+		return 0;
+	si->delete_bitmap = ewah_new();
+	ret = ewah_read_mmap(si->delete_bitmap, data, sz);
+	if (ret < 0)
+		return error("corrupt delete bitmap in link extension");
+	data += ret;
+	sz -= ret;
+	si->replace_bitmap = ewah_new();
+	ret = ewah_read_mmap(si->replace_bitmap, data, sz);
+	if (ret < 0)
+		return error("corrupt replace bitmap in link extension");
+	if (ret != sz)
+		return error("garbage at the end of link extension");
+	return 0;
+}
+
+static int write_strbuf(void *user_data, const void *data, size_t len)
+{
+	struct strbuf *sb = user_data;
+	strbuf_add(sb, data, len);
+	return len;
+}
+
+int write_link_extension(struct strbuf *sb,
+			 struct index_state *istate)
+{
+	struct split_index *si = istate->split_index;
+	strbuf_add(sb, si->base_sha1, 20);
+	if (!si->delete_bitmap && !si->replace_bitmap)
+		return 0;
+	ewah_serialize_to(si->delete_bitmap, write_strbuf, sb);
+	ewah_serialize_to(si->replace_bitmap, write_strbuf, sb);
+	return 0;
+}
+
+static void mark_base_index_entries(struct index_state *base)
+{
+	int i;
+	/*
+	 * To keep track of the shared entries between
+	 * istate->base->cache[] and istate->cache[], base entry
+	 * position is stored in each base entry. All positions start
+	 * from 1 instead of 0, which is resrved to say "this is a new
+	 * entry".
+	 */
+	for (i = 0; i < base->cache_nr; i++)
+		base->cache[i]->index = i + 1;
+}
+
+void move_cache_to_base_index(struct index_state *istate)
+{
+	struct split_index *si = istate->split_index;
+	int i;
+
+	/*
+	 * do not delete old si->base, its index entries may be shared
+	 * with istate->cache[]. Accept a bit of leaking here because
+	 * this code is only used by short-lived update-index.
+	 */
+	si->base = xcalloc(1, sizeof(*si->base));
+	si->base->version = istate->version;
+	/* zero timestamp disables racy test in ce_write_index() */
+	si->base->timestamp = istate->timestamp;
+	ALLOC_GROW(si->base->cache, istate->cache_nr, si->base->cache_alloc);
+	si->base->cache_nr = istate->cache_nr;
+	memcpy(si->base->cache, istate->cache,
+	       sizeof(*istate->cache) * istate->cache_nr);
+	mark_base_index_entries(si->base);
+	for (i = 0; i < si->base->cache_nr; i++)
+		si->base->cache[i]->ce_flags &= ~CE_UPDATE_IN_BASE;
+}
+
+static void mark_entry_for_delete(size_t pos, void *data)
+{
+	struct index_state *istate = data;
+	if (pos >= istate->cache_nr)
+		die("position for delete %d exceeds base index size %d",
+		    (int)pos, istate->cache_nr);
+	istate->cache[pos]->ce_flags |= CE_REMOVE;
+	istate->split_index->nr_deletions = 1;
+}
+
+static void replace_entry(size_t pos, void *data)
+{
+	struct index_state *istate = data;
+	struct split_index *si = istate->split_index;
+	struct cache_entry *dst, *src;
+
+	if (pos >= istate->cache_nr)
+		die("position for replacement %d exceeds base index size %d",
+		    (int)pos, istate->cache_nr);
+	if (si->nr_replacements >= si->saved_cache_nr)
+		die("too many replacements (%d vs %d)",
+		    si->nr_replacements, si->saved_cache_nr);
+	dst = istate->cache[pos];
+	if (dst->ce_flags & CE_REMOVE)
+		die("entry %d is marked as both replaced and deleted",
+		    (int)pos);
+	src = si->saved_cache[si->nr_replacements];
+	if (ce_namelen(src))
+		die("corrupt link extension, entry %d should have "
+		    "zero length name", (int)pos);
+	src->index = pos + 1;
+	src->ce_flags |= CE_UPDATE_IN_BASE;
+	src->ce_namelen = dst->ce_namelen;
+	copy_cache_entry(dst, src);
+	free(src);
+	si->nr_replacements++;
+}
+
+void merge_base_index(struct index_state *istate)
+{
+	struct split_index *si = istate->split_index;
+	unsigned int i;
+
+	mark_base_index_entries(si->base);
+
+	si->saved_cache	    = istate->cache;
+	si->saved_cache_nr  = istate->cache_nr;
+	istate->cache_nr    = si->base->cache_nr;
+	istate->cache	    = NULL;
+	istate->cache_alloc = 0;
+	ALLOC_GROW(istate->cache, istate->cache_nr, istate->cache_alloc);
+	memcpy(istate->cache, si->base->cache,
+	       sizeof(*istate->cache) * istate->cache_nr);
+
+	si->nr_deletions = 0;
+	si->nr_replacements = 0;
+	ewah_each_bit(si->replace_bitmap, replace_entry, istate);
+	ewah_each_bit(si->delete_bitmap, mark_entry_for_delete, istate);
+	if (si->nr_deletions)
+		remove_marked_cache_entries(istate);
+
+	for (i = si->nr_replacements; i < si->saved_cache_nr; i++) {
+		if (!ce_namelen(si->saved_cache[i]))
+			die("corrupt link extension, entry %d should "
+			    "have non-zero length name", i);
+		add_index_entry(istate, si->saved_cache[i],
+				ADD_CACHE_OK_TO_ADD |
+				ADD_CACHE_KEEP_CACHE_TREE |
+				/*
+				 * we may have to replay what
+				 * merge-recursive.c:update_stages()
+				 * does, which has this flag on
+				 */
+				ADD_CACHE_SKIP_DFCHECK);
+		si->saved_cache[i] = NULL;
+	}
+
+	ewah_free(si->delete_bitmap);
+	ewah_free(si->replace_bitmap);
+	free(si->saved_cache);
+	si->delete_bitmap  = NULL;
+	si->replace_bitmap = NULL;
+	si->saved_cache	   = NULL;
+	si->saved_cache_nr = 0;
+}
+
+void prepare_to_write_split_index(struct index_state *istate)
+{
+	struct split_index *si = init_split_index(istate);
+	struct cache_entry **entries = NULL, *ce;
+	int i, nr_entries = 0, nr_alloc = 0;
+
+	si->delete_bitmap = ewah_new();
+	si->replace_bitmap = ewah_new();
+
+	if (si->base) {
+		/* Go through istate->cache[] and mark CE_MATCHED to
+		 * entry with positive index. We'll go through
+		 * base->cache[] later to delete all entries in base
+		 * that are not marked eith either CE_MATCHED or
+		 * CE_UPDATE_IN_BASE. If istate->cache[i] is a
+		 * duplicate, deduplicate it.
+		 */
+		for (i = 0; i < istate->cache_nr; i++) {
+			struct cache_entry *base;
+			/* namelen is checked separately */
+			const unsigned int ondisk_flags =
+				CE_STAGEMASK | CE_VALID | CE_EXTENDED_FLAGS;
+			unsigned int ce_flags, base_flags, ret;
+			ce = istate->cache[i];
+			if (!ce->index)
+				continue;
+			if (ce->index > si->base->cache_nr) {
+				ce->index = 0;
+				continue;
+			}
+			ce->ce_flags |= CE_MATCHED; /* or "shared" */
+			base = si->base->cache[ce->index - 1];
+			if (ce == base)
+				continue;
+			if (ce->ce_namelen != base->ce_namelen ||
+			    strcmp(ce->name, base->name)) {
+				ce->index = 0;
+				continue;
+			}
+			ce_flags = ce->ce_flags;
+			base_flags = base->ce_flags;
+			/* only on-disk flags matter */
+			ce->ce_flags   &= ondisk_flags;
+			base->ce_flags &= ondisk_flags;
+			ret = memcmp(&ce->ce_stat_data, &base->ce_stat_data,
+				     offsetof(struct cache_entry, name) -
+				     offsetof(struct cache_entry, ce_stat_data));
+			ce->ce_flags = ce_flags;
+			base->ce_flags = base_flags;
+			if (ret)
+				ce->ce_flags |= CE_UPDATE_IN_BASE;
+			free(base);
+			si->base->cache[ce->index - 1] = ce;
+		}
+		for (i = 0; i < si->base->cache_nr; i++) {
+			ce = si->base->cache[i];
+			if ((ce->ce_flags & CE_REMOVE) ||
+			    !(ce->ce_flags & CE_MATCHED))
+				ewah_set(si->delete_bitmap, i);
+			else if (ce->ce_flags & CE_UPDATE_IN_BASE) {
+				ewah_set(si->replace_bitmap, i);
+				ce->ce_flags |= CE_STRIP_NAME;
+				ALLOC_GROW(entries, nr_entries+1, nr_alloc);
+				entries[nr_entries++] = ce;
+			}
+		}
+	}
+
+	for (i = 0; i < istate->cache_nr; i++) {
+		ce = istate->cache[i];
+		if ((!si->base || !ce->index) && !(ce->ce_flags & CE_REMOVE)) {
+			assert(!(ce->ce_flags & CE_STRIP_NAME));
+			ALLOC_GROW(entries, nr_entries+1, nr_alloc);
+			entries[nr_entries++] = ce;
+		}
+		ce->ce_flags &= ~CE_MATCHED;
+	}
+
+	/*
+	 * take cache[] out temporarily, put entries[] in its place
+	 * for writing
+	 */
+	si->saved_cache = istate->cache;
+	si->saved_cache_nr = istate->cache_nr;
+	istate->cache = entries;
+	istate->cache_nr = nr_entries;
+}
+
+void finish_writing_split_index(struct index_state *istate)
+{
+	struct split_index *si = init_split_index(istate);
+
+	ewah_free(si->delete_bitmap);
+	ewah_free(si->replace_bitmap);
+	si->delete_bitmap = NULL;
+	si->replace_bitmap = NULL;
+	free(istate->cache);
+	istate->cache = si->saved_cache;
+	istate->cache_nr = si->saved_cache_nr;
+}
+
+void discard_split_index(struct index_state *istate)
+{
+	struct split_index *si = istate->split_index;
+	if (!si)
+		return;
+	istate->split_index = NULL;
+	si->refcount--;
+	if (si->refcount)
+		return;
+	if (si->base) {
+		discard_index(si->base);
+		free(si->base);
+	}
+	free(si);
+}
+
+void save_or_free_index_entry(struct index_state *istate, struct cache_entry *ce)
+{
+	if (ce->index &&
+	    istate->split_index &&
+	    istate->split_index->base &&
+	    ce->index <= istate->split_index->base->cache_nr &&
+	    ce == istate->split_index->base->cache[ce->index - 1])
+		ce->ce_flags |= CE_REMOVE;
+	else
+		free(ce);
+}
+
+void replace_index_entry_in_base(struct index_state *istate,
+				 struct cache_entry *old,
+				 struct cache_entry *new)
+{
+	if (old->index &&
+	    istate->split_index &&
+	    istate->split_index->base &&
+	    old->index <= istate->split_index->base->cache_nr) {
+		new->index = old->index;
+		if (old != istate->split_index->base->cache[new->index - 1])
+			free(istate->split_index->base->cache[new->index - 1]);
+		istate->split_index->base->cache[new->index - 1] = new;
+	}
+}
diff --git a/split-index.h b/split-index.h
new file mode 100644
index 0000000..c1324f5
--- /dev/null
+++ b/split-index.h
@@ -0,0 +1,35 @@
+#ifndef SPLIT_INDEX_H
+#define SPLIT_INDEX_H
+
+struct index_state;
+struct strbuf;
+struct ewah_bitmap;
+
+struct split_index {
+	unsigned char base_sha1[20];
+	struct index_state *base;
+	struct ewah_bitmap *delete_bitmap;
+	struct ewah_bitmap *replace_bitmap;
+	struct cache_entry **saved_cache;
+	unsigned int saved_cache_nr;
+	unsigned int nr_deletions;
+	unsigned int nr_replacements;
+	int refcount;
+};
+
+struct split_index *init_split_index(struct index_state *istate);
+void save_or_free_index_entry(struct index_state *istate, struct cache_entry *ce);
+void replace_index_entry_in_base(struct index_state *istate,
+				 struct cache_entry *old,
+				 struct cache_entry *new);
+int read_link_extension(struct index_state *istate,
+			const void *data, unsigned long sz);
+int write_link_extension(struct strbuf *sb,
+			 struct index_state *istate);
+void move_cache_to_base_index(struct index_state *istate);
+void merge_base_index(struct index_state *istate);
+void prepare_to_write_split_index(struct index_state *istate);
+void finish_writing_split_index(struct index_state *istate);
+void discard_split_index(struct index_state *istate);
+
+#endif
diff --git a/strbuf.c b/strbuf.c
index ee96dcf..0346e74 100644
--- a/strbuf.c
+++ b/strbuf.c
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "refs.h"
+#include "utf8.h"
 
 int starts_with(const char *str, const char *prefix)
 {
@@ -10,15 +11,6 @@
 			return 0;
 }
 
-int ends_with(const char *str, const char *suffix)
-{
-	int len = strlen(str), suflen = strlen(suffix);
-	if (len < suflen)
-		return 0;
-	else
-		return !strcmp(str + len - suflen, suffix);
-}
-
 /*
  * Used as the default ->buf value, so that people can always assume
  * buf is non NULL and ->buf is NUL terminated even for a freshly
@@ -78,15 +70,8 @@
 
 void strbuf_trim(struct strbuf *sb)
 {
-	char *b = sb->buf;
-	while (sb->len > 0 && isspace((unsigned char)sb->buf[sb->len - 1]))
-		sb->len--;
-	while (sb->len > 0 && isspace(*b)) {
-		b++;
-		sb->len--;
-	}
-	memmove(sb->buf, b, sb->len);
-	sb->buf[sb->len] = '\0';
+	strbuf_rtrim(sb);
+	strbuf_ltrim(sb);
 }
 void strbuf_rtrim(struct strbuf *sb)
 {
@@ -106,6 +91,29 @@
 	sb->buf[sb->len] = '\0';
 }
 
+int strbuf_reencode(struct strbuf *sb, const char *from, const char *to)
+{
+	char *out;
+	int len;
+
+	if (same_encoding(from, to))
+		return 0;
+
+	out = reencode_string_len(sb->buf, sb->len, to, from, &len);
+	if (!out)
+		return -1;
+
+	strbuf_attach(sb, out, len, len);
+	return 0;
+}
+
+void strbuf_tolower(struct strbuf *sb)
+{
+	char *p = sb->buf, *end = sb->buf + sb->len;
+	for (; p < end; p++)
+		*p = tolower(*p);
+}
+
 struct strbuf **strbuf_split_buf(const char *str, size_t slen,
 				 int terminator, int max)
 {
@@ -196,6 +204,13 @@
 	strbuf_setlen(sb, sb->len + len);
 }
 
+void strbuf_addchars(struct strbuf *sb, int c, size_t n)
+{
+	strbuf_grow(sb, n);
+	memset(sb->buf + sb->len, c, n);
+	strbuf_setlen(sb, sb->len + n);
+}
+
 void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
 {
 	va_list ap;
@@ -398,6 +413,27 @@
 	return -1;
 }
 
+int strbuf_getcwd(struct strbuf *sb)
+{
+	size_t oldalloc = sb->alloc;
+	size_t guessed_len = 128;
+
+	for (;; guessed_len *= 2) {
+		strbuf_grow(sb, guessed_len);
+		if (getcwd(sb->buf, sb->alloc)) {
+			strbuf_setlen(sb, strlen(sb->buf));
+			return 0;
+		}
+		if (errno != ERANGE)
+			break;
+	}
+	if (oldalloc == 0)
+		strbuf_release(sb);
+	else
+		strbuf_reset(sb);
+	return -1;
+}
+
 int strbuf_getwholeline(struct strbuf *sb, FILE *fp, int term)
 {
 	int ch;
@@ -547,6 +583,31 @@
 	}
 }
 
+void strbuf_add_absolute_path(struct strbuf *sb, const char *path)
+{
+	if (!*path)
+		die("The empty string is not a valid path");
+	if (!is_absolute_path(path)) {
+		struct stat cwd_stat, pwd_stat;
+		size_t orig_len = sb->len;
+		char *cwd = xgetcwd();
+		char *pwd = getenv("PWD");
+		if (pwd && strcmp(pwd, cwd) &&
+		    !stat(cwd, &cwd_stat) &&
+		    (cwd_stat.st_dev || cwd_stat.st_ino) &&
+		    !stat(pwd, &pwd_stat) &&
+		    pwd_stat.st_dev == cwd_stat.st_dev &&
+		    pwd_stat.st_ino == cwd_stat.st_ino)
+			strbuf_addstr(sb, pwd);
+		else
+			strbuf_addstr(sb, cwd);
+		if (sb->len > orig_len && !is_dir_sep(sb->buf[sb->len - 1]))
+			strbuf_addch(sb, '/');
+		free(cwd);
+	}
+	strbuf_addstr(sb, path);
+}
+
 int printf_ln(const char *fmt, ...)
 {
 	int ret;
@@ -570,3 +631,35 @@
 		return -1;
 	return ret + 1;
 }
+
+char *xstrdup_tolower(const char *string)
+{
+	char *result;
+	size_t len, i;
+
+	len = strlen(string);
+	result = xmalloc(len + 1);
+	for (i = 0; i < len; i++)
+		result[i] = tolower(string[i]);
+	result[i] = '\0';
+	return result;
+}
+
+char *xstrvfmt(const char *fmt, va_list ap)
+{
+	struct strbuf buf = STRBUF_INIT;
+	strbuf_vaddf(&buf, fmt, ap);
+	return strbuf_detach(&buf, NULL);
+}
+
+char *xstrfmt(const char *fmt, ...)
+{
+	va_list ap;
+	char *ret;
+
+	va_start(ap, fmt);
+	ret = xstrvfmt(fmt, ap);
+	va_end(ap);
+
+	return ret;
+}
diff --git a/strbuf.h b/strbuf.h
index 39c14cf..652b6c4 100644
--- a/strbuf.h
+++ b/strbuf.h
@@ -45,8 +45,19 @@
 extern void strbuf_trim(struct strbuf *);
 extern void strbuf_rtrim(struct strbuf *);
 extern void strbuf_ltrim(struct strbuf *);
+extern int strbuf_reencode(struct strbuf *sb, const char *from, const char *to);
+extern void strbuf_tolower(struct strbuf *sb);
 extern int strbuf_cmp(const struct strbuf *, const struct strbuf *);
 
+static inline int strbuf_strip_suffix(struct strbuf *sb, const char *suffix)
+{
+	if (strip_suffix_mem(sb->buf, &sb->len, suffix)) {
+		strbuf_setlen(sb, sb->len);
+		return 1;
+	} else
+		return 0;
+}
+
 /*
  * Split str (of length slen) at the specified terminator character.
  * Return a null-terminated array of pointers to strbuf objects
@@ -127,6 +138,7 @@
 	strbuf_add(sb, sb2->buf, sb2->len);
 }
 extern void strbuf_adddup(struct strbuf *sb, size_t pos, size_t len);
+extern void strbuf_addchars(struct strbuf *sb, int c, size_t n);
 
 typedef size_t (*expand_fn_t) (struct strbuf *sb, const char *placeholder, void *context);
 extern void strbuf_expand(struct strbuf *sb, const char *format, expand_fn_t fn, void *context);
@@ -163,6 +175,7 @@
 extern ssize_t strbuf_read(struct strbuf *, int fd, size_t hint);
 extern int strbuf_read_file(struct strbuf *sb, const char *path, size_t hint);
 extern int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint);
+extern int strbuf_getcwd(struct strbuf *sb);
 
 extern int strbuf_getwholeline(struct strbuf *, FILE *, int);
 extern int strbuf_getline(struct strbuf *, FILE *, int);
@@ -178,9 +191,22 @@
 				    int reserved);
 extern void strbuf_humanise_bytes(struct strbuf *buf, off_t bytes);
 
+extern void strbuf_add_absolute_path(struct strbuf *sb, const char *path);
+
 __attribute__((format (printf,1,2)))
 extern int printf_ln(const char *fmt, ...);
 __attribute__((format (printf,2,3)))
 extern int fprintf_ln(FILE *fp, const char *fmt, ...);
 
+char *xstrdup_tolower(const char *);
+
+/*
+ * Create a newly allocated string using printf format. You can do this easily
+ * with a strbuf, but this provides a shortcut to save a few lines.
+ */
+__attribute__((format (printf, 1, 0)))
+char *xstrvfmt(const char *fmt, va_list ap);
+__attribute__((format (printf, 1, 2)))
+char *xstrfmt(const char *fmt, ...);
+
 #endif /* STRBUF_H */
diff --git a/string-list.c b/string-list.c
index aabb25e..c5aa076 100644
--- a/string-list.c
+++ b/string-list.c
@@ -1,6 +1,12 @@
 #include "cache.h"
 #include "string-list.h"
 
+void string_list_init(struct string_list *list, int strdup_strings)
+{
+	memset(list, 0, sizeof(*list));
+	list->strdup_strings = strdup_strings;
+}
+
 /* if there is no exact match, point to the index where the entry could be
  * inserted */
 static int get_entry_index(const struct string_list *list, const char *string,
@@ -37,8 +43,7 @@
 
 	if (list->nr + 1 >= list->alloc) {
 		list->alloc += 32;
-		list->items = xrealloc(list->items, list->alloc
-				* sizeof(struct string_list_item));
+		REALLOC_ARRAY(list->items, list->alloc);
 	}
 	if (index < list->nr)
 		memmove(list->items + index + 1, list->items + index,
diff --git a/string-list.h b/string-list.h
index de6769c..494eb5d 100644
--- a/string-list.h
+++ b/string-list.h
@@ -15,8 +15,10 @@
 	compare_strings_fn cmp; /* NULL uses strcmp() */
 };
 
-#define STRING_LIST_INIT_NODUP { NULL, 0, 0, 0 }
-#define STRING_LIST_INIT_DUP   { NULL, 0, 0, 1 }
+#define STRING_LIST_INIT_NODUP { NULL, 0, 0, 0, NULL }
+#define STRING_LIST_INIT_DUP   { NULL, 0, 0, 1, NULL }
+
+void string_list_init(struct string_list *list, int strdup_strings);
 
 void print_string_list(const struct string_list *p, const char *text);
 void string_list_clear(struct string_list *list, int free_util);
diff --git a/submodule.c b/submodule.c
index b80ecac..0690dc5 100644
--- a/submodule.c
+++ b/submodule.c
@@ -433,13 +433,12 @@
 		return 0;
 
 	if (for_each_remote_ref_submodule(path, has_remote, NULL) > 0) {
-		struct child_process cp;
+		struct child_process cp = CHILD_PROCESS_INIT;
 		const char *argv[] = {"rev-list", NULL, "--not", "--remotes", "-n", "1" , NULL};
 		struct strbuf buf = STRBUF_INIT;
 		int needs_pushing = 0;
 
 		argv[1] = sha1_to_hex(sha1);
-		memset(&cp, 0, sizeof(cp));
 		cp.argv = argv;
 		cp.env = local_repo_env;
 		cp.git_cmd = 1;
@@ -524,10 +523,9 @@
 		return 1;
 
 	if (for_each_remote_ref_submodule(path, has_remote, NULL) > 0) {
-		struct child_process cp;
+		struct child_process cp = CHILD_PROCESS_INIT;
 		const char *argv[] = {"push", NULL};
 
-		memset(&cp, 0, sizeof(cp));
 		cp.argv = argv;
 		cp.env = local_repo_env;
 		cp.git_cmd = 1;
@@ -544,10 +542,7 @@
 int push_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name)
 {
 	int i, ret = 1;
-	struct string_list needs_pushing;
-
-	memset(&needs_pushing, 0, sizeof(struct string_list));
-	needs_pushing.strdup_strings = 1;
+	struct string_list needs_pushing = STRING_LIST_INIT_DUP;
 
 	if (!find_unpushed_submodules(new_sha1, remotes_name, &needs_pushing))
 		return 1;
@@ -572,12 +567,11 @@
 	if (!add_submodule_odb(path) && lookup_commit_reference(sha1)) {
 		/* Even if the submodule is checked out and the commit is
 		 * present, make sure it is reachable from a ref. */
-		struct child_process cp;
+		struct child_process cp = CHILD_PROCESS_INIT;
 		const char *argv[] = {"rev-list", "-n", "1", NULL, "--not", "--all", NULL};
 		struct strbuf buf = STRBUF_INIT;
 
 		argv[3] = sha1_to_hex(sha1);
-		memset(&cp, 0, sizeof(cp));
 		cp.argv = argv;
 		cp.env = local_repo_env;
 		cp.git_cmd = 1;
@@ -698,7 +692,7 @@
 			       int quiet)
 {
 	int i, result = 0;
-	struct child_process cp;
+	struct child_process cp = CHILD_PROCESS_INIT;
 	struct argv_array argv = ARGV_ARRAY_INIT;
 	struct string_list_item *name_for_path;
 	const char *work_tree = get_git_work_tree();
@@ -714,7 +708,6 @@
 	argv_array_push(&argv, "--recurse-submodules-default");
 	/* default value, "--submodule-prefix" and its value are added later */
 
-	memset(&cp, 0, sizeof(cp));
 	cp.env = local_repo_env;
 	cp.git_cmd = 1;
 	cp.no_stdin = 1;
@@ -797,7 +790,7 @@
 unsigned is_submodule_modified(const char *path, int ignore_untracked)
 {
 	ssize_t len;
-	struct child_process cp;
+	struct child_process cp = CHILD_PROCESS_INIT;
 	const char *argv[] = {
 		"status",
 		"--porcelain",
@@ -824,7 +817,6 @@
 	if (ignore_untracked)
 		argv[2] = "-uno";
 
-	memset(&cp, 0, sizeof(cp));
 	cp.argv = argv;
 	cp.env = local_repo_env;
 	cp.git_cmd = 1;
@@ -865,7 +857,7 @@
 
 int submodule_uses_gitfile(const char *path)
 {
-	struct child_process cp;
+	struct child_process cp = CHILD_PROCESS_INIT;
 	const char *argv[] = {
 		"submodule",
 		"foreach",
@@ -886,7 +878,6 @@
 	strbuf_release(&buf);
 
 	/* Now test that all nested submodules use a gitfile too */
-	memset(&cp, 0, sizeof(cp));
 	cp.argv = argv;
 	cp.env = local_repo_env;
 	cp.git_cmd = 1;
@@ -904,7 +895,7 @@
 {
 	struct stat st;
 	ssize_t len;
-	struct child_process cp;
+	struct child_process cp = CHILD_PROCESS_INIT;
 	const char *argv[] = {
 		"status",
 		"--porcelain",
@@ -921,7 +912,6 @@
 	if (!submodule_uses_gitfile(path))
 		return 0;
 
-	memset(&cp, 0, sizeof(cp));
 	cp.argv = argv;
 	cp.env = local_repo_env;
 	cp.git_cmd = 1;
@@ -965,7 +955,7 @@
 			sha1_to_hex(a->object.sha1));
 	init_revisions(&revs, NULL);
 	rev_opts.submodule = path;
-	setup_revisions(sizeof(rev_args)/sizeof(char *)-1, rev_args, &revs, &rev_opts);
+	setup_revisions(ARRAY_SIZE(rev_args)-1, rev_args, &revs, &rev_opts);
 
 	/* save all revisions from the above list that contain b */
 	if (prepare_revision_walk(&revs))
diff --git a/symlinks.c b/symlinks.c
index c2b41a8..5261e8c 100644
--- a/symlinks.c
+++ b/symlinks.c
@@ -35,12 +35,11 @@
 	return match_len;
 }
 
-static struct cache_def default_cache;
+static struct cache_def default_cache = CACHE_DEF_INIT;
 
 static inline void reset_lstat_cache(struct cache_def *cache)
 {
-	cache->path[0] = '\0';
-	cache->len = 0;
+	strbuf_reset(&cache->path);
 	cache->flags = 0;
 	/*
 	 * The track_flags and prefix_len_stat_func members is only
@@ -73,7 +72,7 @@
 				int prefix_len_stat_func)
 {
 	int match_len, last_slash, last_slash_dir, previous_slash;
-	int save_flags, max_len, ret;
+	int save_flags, ret;
 	struct stat st;
 
 	if (cache->track_flags != track_flags ||
@@ -93,14 +92,14 @@
 		 * the 2 "excluding" path types.
 		 */
 		match_len = last_slash =
-			longest_path_match(name, len, cache->path, cache->len,
-					   &previous_slash);
+			longest_path_match(name, len, cache->path.buf,
+					   cache->path.len, &previous_slash);
 		*ret_flags = cache->flags & track_flags & (FL_NOENT|FL_SYMLINK);
 
 		if (!(track_flags & FL_FULLPATH) && match_len == len)
 			match_len = last_slash = previous_slash;
 
-		if (*ret_flags && match_len == cache->len)
+		if (*ret_flags && match_len == cache->path.len)
 			return match_len;
 		/*
 		 * If we now have match_len > 0, we would know that
@@ -121,21 +120,22 @@
 	 */
 	*ret_flags = FL_DIR;
 	last_slash_dir = last_slash;
-	max_len = len < PATH_MAX ? len : PATH_MAX;
-	while (match_len < max_len) {
+	if (len > cache->path.len)
+		strbuf_grow(&cache->path, len - cache->path.len);
+	while (match_len < len) {
 		do {
-			cache->path[match_len] = name[match_len];
+			cache->path.buf[match_len] = name[match_len];
 			match_len++;
-		} while (match_len < max_len && name[match_len] != '/');
-		if (match_len >= max_len && !(track_flags & FL_FULLPATH))
+		} while (match_len < len && name[match_len] != '/');
+		if (match_len >= len && !(track_flags & FL_FULLPATH))
 			break;
 		last_slash = match_len;
-		cache->path[last_slash] = '\0';
+		cache->path.buf[last_slash] = '\0';
 
 		if (last_slash <= prefix_len_stat_func)
-			ret = stat(cache->path, &st);
+			ret = stat(cache->path.buf, &st);
 		else
-			ret = lstat(cache->path, &st);
+			ret = lstat(cache->path.buf, &st);
 
 		if (ret) {
 			*ret_flags = FL_LSTATERR;
@@ -158,12 +158,11 @@
 	 * for the moment!
 	 */
 	save_flags = *ret_flags & track_flags & (FL_NOENT|FL_SYMLINK);
-	if (save_flags && last_slash > 0 && last_slash <= PATH_MAX) {
-		cache->path[last_slash] = '\0';
-		cache->len = last_slash;
+	if (save_flags && last_slash > 0) {
+		cache->path.buf[last_slash] = '\0';
+		cache->path.len = last_slash;
 		cache->flags = save_flags;
-	} else if ((track_flags & FL_DIR) &&
-		   last_slash_dir > 0 && last_slash_dir <= PATH_MAX) {
+	} else if ((track_flags & FL_DIR) && last_slash_dir > 0) {
 		/*
 		 * We have a separate test for the directory case,
 		 * since it could be that we have found a symlink or a
@@ -175,8 +174,8 @@
 		 * can still cache the path components before the last
 		 * one (the found symlink or non-existing component).
 		 */
-		cache->path[last_slash_dir] = '\0';
-		cache->len = last_slash_dir;
+		cache->path.buf[last_slash_dir] = '\0';
+		cache->path.len = last_slash_dir;
 		cache->flags = FL_DIR;
 	} else {
 		reset_lstat_cache(cache);
@@ -273,21 +272,18 @@
 		FL_DIR;
 }
 
-static struct removal_def {
-	char path[PATH_MAX];
-	int len;
-} removal;
+static struct strbuf removal = STRBUF_INIT;
 
 static void do_remove_scheduled_dirs(int new_len)
 {
 	while (removal.len > new_len) {
-		removal.path[removal.len] = '\0';
-		if (rmdir(removal.path))
+		removal.buf[removal.len] = '\0';
+		if (rmdir(removal.buf))
 			break;
 		do {
 			removal.len--;
 		} while (removal.len > new_len &&
-			 removal.path[removal.len] != '/');
+			 removal.buf[removal.len] != '/');
 	}
 	removal.len = new_len;
 }
@@ -297,7 +293,7 @@
 	int match_len, last_slash, i, previous_slash;
 
 	match_len = last_slash = i =
-		longest_path_match(name, len, removal.path, removal.len,
+		longest_path_match(name, len, removal.buf, removal.len,
 				   &previous_slash);
 	/* Find last slash inside 'name' */
 	while (i < len) {
@@ -317,11 +313,8 @@
 	 * If we go deeper down the directory tree, we only need to
 	 * save the new path components as we go down.
 	 */
-	if (match_len < last_slash) {
-		memcpy(&removal.path[match_len], &name[match_len],
-		       last_slash - match_len);
-		removal.len = last_slash;
-	}
+	if (match_len < last_slash)
+		strbuf_add(&removal, &name[match_len], last_slash - match_len);
 }
 
 void remove_scheduled_dirs(void)
diff --git a/t/Makefile b/t/Makefile
index 8fd1a72..43b15e3 100644
--- a/t/Makefile
+++ b/t/Makefile
@@ -13,7 +13,7 @@
 RM ?= rm -f
 PROVE ?= prove
 DEFAULT_TEST_TARGET ?= test
-TEST_LINT ?= test-lint-duplicates test-lint-executable
+TEST_LINT ?= test-lint
 
 ifdef TEST_OUTPUT_DIRECTORY
 TEST_RESULTS_DIRECTORY = $(TEST_OUTPUT_DIRECTORY)/test-results
@@ -29,6 +29,7 @@
 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)
 
@@ -65,7 +66,7 @@
 		echo >&2 "non-executable tests:" $$bad; exit 1; }
 
 test-lint-shell-syntax:
-	@'$(PERL_PATH_SQ)' check-non-portable-shell.pl $(T)
+	@'$(PERL_PATH_SQ)' check-non-portable-shell.pl $(T) $(THELPERS)
 
 aggregate-results-and-cleanup: $(T)
 	$(MAKE) aggregate-results
diff --git a/t/README b/t/README
index caeeb9d..9952261 100644
--- a/t/README
+++ b/t/README
@@ -71,6 +71,7 @@
 (or -i) command line argument to the test, or by setting GIT_TEST_OPTS
 appropriately before running "make".
 
+-v::
 --verbose::
 	This makes the test more verbose.  Specifically, the
 	command being run and their output if any are also
@@ -81,6 +82,13 @@
 	numbers matching <pattern>.  The number matched against is
 	simply the running count of the test within the file.
 
+-x::
+	Turn on shell tracing (i.e., `set -x`) during the tests
+	themselves. Implies `--verbose`. Note that this can cause
+	failures in some tests which redirect and test the
+	output of shell functions. Use with caution.
+
+-d::
 --debug::
 	This may help the person who is developing a new test.
 	It causes the command defined with test_debug to run.
@@ -89,6 +97,7 @@
 	failed tests so that you can inspect its contents after
 	the test finished.
 
+-i::
 --immediate::
 	This causes the test to immediately exit upon the first
 	failed test. Cleanup commands requested with
@@ -96,10 +105,17 @@
 	in order to keep the state for inspection by the tester
 	to diagnose the bug.
 
+-l::
 --long-tests::
 	This causes additional long-running tests to be run (where
 	available), for more exhaustive testing.
 
+-r::
+--run=<test-selector>::
+	Run only the subset of tests indicated by
+	<test-selector>.  See section "Skipping Tests" below for
+	<test-selector> syntax.
+
 --valgrind=<tool>::
 	Execute all Git binaries under valgrind tool <tool> and exit
 	with status 126 on errors (just like regular tests, this will
@@ -187,10 +203,77 @@
 test, or t[0-9]{4} followed by ".$number" to say which
 particular test to skip.
 
-Note that some tests in the existing test suite rely on previous
-test item, so you cannot arbitrarily disable one and expect the
-remainder of test to check what the test originally was intended
-to check.
+For an individual test suite --run could be used to specify that
+only some tests should be run or that some tests should be
+excluded from a run.
+
+The argument for --run is a list of individual test numbers or
+ranges with an optional negation prefix that define what tests in
+a test suite to include in the run.  A range is two numbers
+separated with a dash and matches a range of tests with both ends
+been included.  You may omit the first or the second number to
+mean "from the first test" or "up to the very last test"
+respectively.
+
+Optional prefix of '!' means that the test or a range of tests
+should be excluded from the run.
+
+If --run starts with an unprefixed number or range the initial
+set of tests to run is empty. If the first item starts with '!'
+all the tests are added to the initial set.  After initial set is
+determined every test number or range is added or excluded from
+the set one by one, from left to right.
+
+Individual numbers or ranges could be separated either by a space
+or a comma.
+
+For example, to run only tests up to a specific test (21), one
+could do this:
+
+    $ sh ./t9200-git-cvsexport-commit.sh --run='1-21'
+
+or this:
+
+    $ sh ./t9200-git-cvsexport-commit.sh --run='-21'
+
+Common case is to run several setup tests (1, 2, 3) and then a
+specific test (21) that relies on that setup:
+
+    $ sh ./t9200-git-cvsexport-commit.sh --run='1 2 3 21'
+
+or:
+
+    $ sh ./t9200-git-cvsexport-commit.sh --run=1,2,3,21
+
+or:
+
+    $ sh ./t9200-git-cvsexport-commit.sh --run='-3 21'
+
+As noted above, the test set is built going though items left to
+right, so this:
+
+    $ sh ./t9200-git-cvsexport-commit.sh --run='1-4 !3'
+
+will run tests 1, 2, and 4.  Items that comes later have higher
+precendence.  It means that this:
+
+    $ sh ./t9200-git-cvsexport-commit.sh --run='!3 1-4'
+
+would just run tests from 1 to 4, including 3.
+
+You may use negation with ranges.  The following will run all
+test in the test suite except from 7 up to 11:
+
+    $ sh ./t9200-git-cvsexport-commit.sh --run='!7-11'
+
+Some tests in a test suite rely on the previous tests performing
+certain actions, specifically some tests are designated as
+"setup" test, so you cannot _arbitrarily_ disable one test and
+expect the rest to function correctly.
+
+--run is mostly useful when you want to focus on a specific test
+and know what setup is needed for it.  Or when you want to run
+everything up to a certain test.
 
 
 Naming Tests
@@ -596,6 +679,27 @@
 		...
 	'
 
+ - test_write_lines <lines>
+
+   Write <lines> on standard output, one line per argument.
+   Useful to prepare multi-line files in a compact form.
+
+   Example:
+
+	test_write_lines a b c d e f g >foo
+
+   Is a more compact equivalent of:
+	cat >foo <<-EOF
+	a
+	b
+	c
+	d
+	e
+	f
+	g
+	EOF
+
+
  - test_pause
 
 	This command is useful for writing and debugging tests and must be
diff --git a/t/annotate-tests.sh b/t/annotate-tests.sh
index 304c7b7..071e4d7 100644
--- a/t/annotate-tests.sh
+++ b/t/annotate-tests.sh
@@ -1,6 +1,17 @@
 # This file isn't used as a test script directly, instead it is
 # sourced from t8001-annotate.sh and t8002-blame.sh.
 
+if test_have_prereq MINGW
+then
+  sanitize_L () {
+	echo "$1" | sed 'sX\(^-L\|,\)\^\?/X&\\;*Xg'
+  }
+else
+  sanitize_L () {
+	echo "$1"
+  }
+fi
+
 check_count () {
 	head= &&
 	file='file' &&
@@ -10,6 +21,7 @@
 		case "$1" in
 		-h) head="$2"; shift; shift ;;
 		-f) file="$2"; shift; shift ;;
+		-L*) options="$options $(sanitize_L "$1")"; shift ;;
 		-*) options="$options $1"; shift ;;
 		*) break ;;
 		esac
diff --git a/t/check-non-portable-shell.pl b/t/check-non-portable-shell.pl
index 45971f4..b170cbc 100755
--- a/t/check-non-portable-shell.pl
+++ b/t/check-non-portable-shell.pl
@@ -16,12 +16,12 @@
 
 while (<>) {
 	chomp;
-	/^\s*sed\s+-i/ and err 'sed -i is not portable';
-	/^\s*echo\s+-n/ and err 'echo -n is not portable (please use printf)';
+	/\bsed\s+-i/ and err 'sed -i is not portable';
+	/\becho\s+-n/ and err 'echo -n is not portable (please use printf)';
 	/^\s*declare\s+/ and err 'arrays/declare not portable';
 	/^\s*[^#]\s*which\s/ and err 'which is not portable (please use type)';
-	/test\s+[^=]*==/ and err '"test a == b" is not portable (please use =)';
-	/^\s*export\s+[^=]*=/ and err '"export FOO=bar" is not portable (please use FOO=bar && export FOO)';
+	/\btest\s+[^=]*==/ and err '"test a == b" is not portable (please use =)';
+	/\bexport\s+[A-Za-z0-9_]*=/ and err '"export FOO=bar" is not portable (please use FOO=bar && export FOO)';
 	# this resets our $. for each file
 	close ARGV if eof;
 }
diff --git a/t/lib-credential.sh b/t/lib-credential.sh
index 957ae93..d8e41f7 100755
--- a/t/lib-credential.sh
+++ b/t/lib-credential.sh
@@ -278,12 +278,10 @@
 	'
 }
 
-cat >askpass <<\EOF
-#!/bin/sh
+write_script askpass <<\EOF
 echo >&2 askpass: $*
-what=`echo $1 | cut -d" " -f1 | tr A-Z a-z | tr -cd a-z`
+what=$(echo $1 | cut -d" " -f1 | tr A-Z a-z | tr -cd a-z)
 echo "askpass-$what"
 EOF
-chmod +x askpass
 GIT_ASKPASS="$PWD/askpass"
 export GIT_ASKPASS
diff --git a/t/lib-cvs.sh b/t/lib-cvs.sh
index 5076718..9b2bcfb 100644
--- a/t/lib-cvs.sh
+++ b/t/lib-cvs.sh
@@ -13,7 +13,7 @@
 CVS="cvs -f"
 export CVS
 
-cvsps_version=`cvsps -h 2>&1 | sed -ne 's/cvsps version //p'`
+cvsps_version=$(cvsps -h 2>&1 | sed -ne 's/cvsps version //p')
 case "$cvsps_version" in
 2.1 | 2.2*)
 	;;
diff --git a/t/lib-gpg.sh b/t/lib-gpg.sh
index 05824fa..cd2baef 100755
--- a/t/lib-gpg.sh
+++ b/t/lib-gpg.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-gpg_version=`gpg --version 2>&1`
+gpg_version=$(gpg --version 2>&1)
 if test $? = 127; then
 	say "You do not seem to have gpg installed"
 else
@@ -18,6 +18,7 @@
 		# No password given, to enable non-interactive operation.
 		cp -R "$TEST_DIRECTORY"/lib-gpg ./gpghome
 		chmod 0700 gpghome
+		chmod 0600 gpghome/*
 		GNUPGHOME="$(pwd)/gpghome"
 		export GNUPGHOME
 		test_set_prereq GPG
diff --git a/t/lib-httpd.sh b/t/lib-httpd.sh
index 252cbf1..fd53b57 100644
--- a/t/lib-httpd.sh
+++ b/t/lib-httpd.sh
@@ -37,6 +37,11 @@
 	test_done
 fi
 
+if ! test_have_prereq SANITY; then
+	test_skip_or_die $GIT_TEST_HTTPD \
+		"Cannot run httpd tests as root"
+fi
+
 HTTPD_PARA=""
 
 for DEFAULT_HTTPD_PATH in '/usr/sbin/httpd' '/usr/sbin/apache2'
@@ -105,10 +110,15 @@
 		"Could not identify web server at '$LIB_HTTPD_PATH'"
 fi
 
+install_script () {
+	write_script "$HTTPD_ROOT_PATH/$1" <"$TEST_PATH/$1"
+}
+
 prepare_httpd() {
 	mkdir -p "$HTTPD_DOCUMENT_ROOT_PATH"
 	cp "$TEST_PATH"/passwd "$HTTPD_ROOT_PATH"
-	cp "$TEST_PATH"/broken-smart-http.sh "$HTTPD_ROOT_PATH"
+	install_script broken-smart-http.sh
+	install_script error.sh
 
 	ln -s "$LIB_HTTPD_MODULE_PATH" "$HTTPD_ROOT_PATH/modules"
 
@@ -132,7 +142,7 @@
 	HTTPD_URL_USER=$HTTPD_PROTO://user%40host@$HTTPD_DEST
 	HTTPD_URL_USER_PASS=$HTTPD_PROTO://user%40host:pass%40host@$HTTPD_DEST
 
-	if test -n "$LIB_HTTPD_DAV" -o -n "$LIB_HTTPD_SVN"
+	if test -n "$LIB_HTTPD_DAV" || test -n "$LIB_HTTPD_SVN"
 	then
 		HTTPD_PARA="$HTTPD_PARA -DDAV"
 
diff --git a/t/lib-httpd/apache.conf b/t/lib-httpd/apache.conf
index 3a03e82..7713dd2 100644
--- a/t/lib-httpd/apache.conf
+++ b/t/lib-httpd/apache.conf
@@ -68,6 +68,7 @@
 
 PassEnv GIT_VALGRIND
 PassEnv GIT_VALGRIND_OPTIONS
+PassEnv GNUPGHOME
 
 Alias /dumb/ www/
 Alias /auth/dumb/ www/auth/dumb/
@@ -97,12 +98,16 @@
 </LocationMatch>
 ScriptAliasMatch /smart_*[^/]*/(.*) ${GIT_EXEC_PATH}/git-http-backend/$1
 ScriptAlias /broken_smart/ broken-smart-http.sh/
+ScriptAlias /error/ error.sh/
 <Directory ${GIT_EXEC_PATH}>
 	Options FollowSymlinks
 </Directory>
 <Files broken-smart-http.sh>
 	Options ExecCGI
 </Files>
+<Files error.sh>
+  Options ExecCGI
+</Files>
 <Files ${GIT_EXEC_PATH}/git-http-backend>
 	Options ExecCGI
 </Files>
diff --git a/t/lib-httpd/broken-smart-http.sh b/t/lib-httpd/broken-smart-http.sh
old mode 100755
new mode 100644
index f7ebfff..82cc610
--- a/t/lib-httpd/broken-smart-http.sh
+++ b/t/lib-httpd/broken-smart-http.sh
@@ -1,4 +1,3 @@
-#!/bin/sh
 printf "Content-Type: text/%s\n" "html"
 echo
 printf "%s\n" "001e# service=git-upload-pack"
diff --git a/t/lib-httpd/error.sh b/t/lib-httpd/error.sh
new file mode 100755
index 0000000..a77b8e5
--- /dev/null
+++ b/t/lib-httpd/error.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+printf "Status: 500 Intentional Breakage\n"
+
+printf "Content-Type: "
+charset=iso-8859-1
+case "$PATH_INFO" in
+*html*)
+	printf "text/html"
+	;;
+*text*)
+	printf "text/plain"
+	;;
+*charset*)
+	printf "text/plain; charset=utf-8"
+	charset=utf-8
+	;;
+*utf16*)
+	printf "text/plain; charset=utf-16"
+	charset=utf-16
+	;;
+*odd-spacing*)
+	printf "text/plain; foo=bar ;charset=utf-16; other=nonsense"
+	charset=utf-16
+	;;
+esac
+printf "\n"
+
+printf "\n"
+printf "this is the error message\n" |
+iconv -f us-ascii -t $charset
diff --git a/t/lib-submodule-update.sh b/t/lib-submodule-update.sh
new file mode 100755
index 0000000..79cdd34
--- /dev/null
+++ b/t/lib-submodule-update.sh
@@ -0,0 +1,680 @@
+# Create a submodule layout used for all tests below.
+#
+# The following use cases are covered:
+# - New submodule (no_submodule => add_sub1)
+# - Removed submodule (add_sub1 => remove_sub1)
+# - Updated submodule (add_sub1 => modify_sub1)
+# - Submodule updated to invalid commit (add_sub1 => invalid_sub1)
+# - Submodule updated from invalid commit (invalid_sub1 => valid_sub1)
+# - Submodule replaced by tracked files in directory (add_sub1 =>
+#   replace_sub1_with_directory)
+# - Directory containing tracked files replaced by submodule
+#   (replace_sub1_with_directory => replace_directory_with_sub1)
+# - Submodule replaced by tracked file with the same name (add_sub1 =>
+#   replace_sub1_with_file)
+# - Tracked file replaced by submodule (replace_sub1_with_file =>
+#   replace_file_with_sub1)
+#
+#                   --O-----O
+#                  /  ^     replace_directory_with_sub1
+#                 /   replace_sub1_with_directory
+#                /----O
+#               /     ^
+#              /      modify_sub1
+#      O------O-------O
+#      ^      ^\      ^
+#      |      | \     remove_sub1
+#      |      |  -----O-----O
+#      |      |   \   ^     replace_file_with_sub1
+#      |      |    \  replace_sub1_with_file
+#      |   add_sub1 --O-----O
+# no_submodule        ^     valid_sub1
+#                     invalid_sub1
+#
+create_lib_submodule_repo () {
+	git init submodule_update_repo &&
+	(
+		cd submodule_update_repo &&
+		echo "expect" >>.gitignore &&
+		echo "actual" >>.gitignore &&
+		echo "x" >file1 &&
+		echo "y" >file2 &&
+		git add .gitignore file1 file2 &&
+		git commit -m "Base" &&
+		git branch "no_submodule" &&
+
+		git checkout -b "add_sub1" &&
+		git submodule add ./. sub1 &&
+		git config -f .gitmodules submodule.sub1.ignore all &&
+		git config submodule.sub1.ignore all &&
+		git add .gitmodules &&
+		git commit -m "Add sub1" &&
+		git checkout -b remove_sub1 &&
+		git revert HEAD &&
+
+		git checkout -b "modify_sub1" "add_sub1" &&
+		git submodule update &&
+		(
+			cd sub1 &&
+			git fetch &&
+			git checkout -b "modifications" &&
+			echo "z" >file2 &&
+			echo "x" >file3 &&
+			git add file2 file3 &&
+			git commit -m "modified file2 and added file3" &&
+			git push origin modifications
+		) &&
+		git add sub1 &&
+		git commit -m "Modify sub1" &&
+
+		git checkout -b "replace_sub1_with_directory" "add_sub1" &&
+		git submodule update &&
+		(
+			cd sub1 &&
+			git checkout modifications
+		) &&
+		git rm --cached sub1 &&
+		rm sub1/.git* &&
+		git config -f .gitmodules --remove-section "submodule.sub1" &&
+		git add .gitmodules sub1/* &&
+		git commit -m "Replace sub1 with directory" &&
+		git checkout -b replace_directory_with_sub1 &&
+		git revert HEAD &&
+
+		git checkout -b "replace_sub1_with_file" "add_sub1" &&
+		git rm sub1 &&
+		echo "content" >sub1 &&
+		git add sub1 &&
+		git commit -m "Replace sub1 with file" &&
+		git checkout -b replace_file_with_sub1 &&
+		git revert HEAD &&
+
+		git checkout -b "invalid_sub1" "add_sub1" &&
+		git update-index --cacheinfo 160000 0123456789012345678901234567890123456789 sub1 &&
+		git commit -m "Invalid sub1 commit" &&
+		git checkout -b valid_sub1 &&
+		git revert HEAD &&
+		git checkout master
+	)
+}
+
+# Helper function to replace gitfile with .git directory
+replace_gitfile_with_git_dir () {
+	(
+		cd "$1" &&
+		git_dir="$(git rev-parse --git-dir)" &&
+		rm -f .git &&
+		cp -R "$git_dir" .git &&
+		GIT_WORK_TREE=. git config --unset core.worktree
+	)
+}
+
+# Test that the .git directory in the submodule is unchanged (except for the
+# core.worktree setting, which appears only in $GIT_DIR/modules/$1/config).
+# Call this function before test_submodule_content as the latter might
+# write the index file leading to false positive index differences.
+#
+# Note that this only supports submodules at the root level of the
+# superproject, with the default name, i.e. same as its path.
+test_git_directory_is_unchanged () {
+	(
+		cd ".git/modules/$1" &&
+		# does core.worktree point at the right place?
+		test "$(git config core.worktree)" = "../../../$1" &&
+		# remove it temporarily before comparing, as
+		# "$1/.git/config" lacks it...
+		git config --unset core.worktree
+	) &&
+	diff -r ".git/modules/$1" "$1/.git" &&
+	(
+		# ... and then restore.
+		cd ".git/modules/$1" &&
+		git config core.worktree "../../../$1"
+	)
+}
+
+# Helper function to be executed at the start of every test below, it sets up
+# the submodule repo if it doesn't exist and configures the most problematic
+# settings for diff.ignoreSubmodules.
+prolog () {
+	(test -d submodule_update_repo || create_lib_submodule_repo) &&
+	test_config_global diff.ignoreSubmodules all &&
+	test_config diff.ignoreSubmodules all
+}
+
+# Helper function to bring work tree back into the state given by the
+# commit. This includes trying to populate sub1 accordingly if it exists and
+# should be updated to an existing commit.
+reset_work_tree_to () {
+	rm -rf submodule_update &&
+	git clone submodule_update_repo submodule_update &&
+	(
+		cd submodule_update &&
+		rm -rf sub1 &&
+		git checkout -f "$1" &&
+		git status -u -s >actual &&
+		test_must_be_empty actual &&
+		sha1=$(git rev-parse --revs-only HEAD:sub1) &&
+		if test -n "$sha1" &&
+		   test $(cd "sub1" && git rev-parse --verify "$sha1^{commit}")
+		then
+			git submodule update --init --recursive "sub1"
+		fi
+	)
+}
+
+# Test that the superproject contains the content according to commit "$1"
+# (the work tree must match the index for everything but submodules but the
+# index must exactly match the given commit including any submodule SHA-1s).
+test_superproject_content () {
+	git diff-index --cached "$1" >actual &&
+	test_must_be_empty actual &&
+	git diff-files --ignore-submodules >actual &&
+	test_must_be_empty actual
+}
+
+# Test that the given submodule at path "$1" contains the content according
+# to the submodule commit recorded in the superproject's commit "$2"
+test_submodule_content () {
+	if test $# != 2
+	then
+		echo "test_submodule_content needs two arguments"
+		return 1
+	fi &&
+	submodule="$1" &&
+	commit="$2" &&
+	test -d "$submodule"/ &&
+	if ! test -f "$submodule"/.git && ! test -d "$submodule"/.git
+	then
+		echo "Submodule $submodule is not populated"
+		return 1
+	fi &&
+	sha1=$(git rev-parse --verify "$commit:$submodule") &&
+	if test -z "$sha1"
+	then
+		echo "Couldn't retrieve SHA-1 of $submodule for $commit"
+		return 1
+	fi &&
+	(
+		cd "$submodule" &&
+		git status -u -s >actual &&
+		test_must_be_empty actual &&
+		git diff "$sha1" >actual &&
+		test_must_be_empty actual
+	)
+}
+
+# Test that the following transitions are correctly handled:
+# - Updated submodule
+# - New submodule
+# - Removed submodule
+# - Directory containing tracked files replaced by submodule
+# - Submodule replaced by tracked files in directory
+# - Submodule replaced by tracked file with the same name
+# - tracked file replaced by submodule
+#
+# The default is that submodule contents aren't changed until "git submodule
+# update" is run. And even then that command doesn't delete the work tree of
+# a removed submodule.
+#
+# Removing a submodule containing a .git directory must fail even when forced
+# to protect the history!
+#
+
+# Test that submodule contents are currently not updated when switching
+# between commits that change a submodule.
+test_submodule_switch () {
+	command="$1"
+	######################### Appearing submodule #########################
+	# Switching to a commit letting a submodule appear creates empty dir ...
+	if test "$KNOWN_FAILURE_STASH_DOES_IGNORE_SUBMODULE_CHANGES" = 1
+	then
+		# Restoring stash fails to restore submodule index entry
+		RESULT="failure"
+	else
+		RESULT="success"
+	fi
+	test_expect_$RESULT "$command: added submodule creates empty directory" '
+		prolog &&
+		reset_work_tree_to no_submodule &&
+		(
+			cd submodule_update &&
+			git branch -t add_sub1 origin/add_sub1 &&
+			$command add_sub1 &&
+			test_superproject_content origin/add_sub1 &&
+			test_dir_is_empty sub1 &&
+			git submodule update --init --recursive &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+	# ... and doesn't care if it already exists ...
+	test_expect_$RESULT "$command: added submodule leaves existing empty directory alone" '
+		prolog &&
+		reset_work_tree_to no_submodule &&
+		(
+			cd submodule_update &&
+			mkdir sub1 &&
+			git branch -t add_sub1 origin/add_sub1 &&
+			$command add_sub1 &&
+			test_superproject_content origin/add_sub1 &&
+			test_dir_is_empty sub1 &&
+			git submodule update --init --recursive &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+	# ... unless there is an untracked file in its place.
+	test_expect_success "$command: added submodule doesn't remove untracked unignored file with same name" '
+		prolog &&
+		reset_work_tree_to no_submodule &&
+		(
+			cd submodule_update &&
+			git branch -t add_sub1 origin/add_sub1 &&
+			>sub1 &&
+			test_must_fail $command add_sub1 &&
+			test_superproject_content origin/no_submodule &&
+			test_must_be_empty sub1
+		)
+	'
+	# Replacing a tracked file with a submodule produces an empty
+	# directory ...
+	test_expect_$RESULT "$command: replace tracked file with submodule creates empty directory" '
+		prolog &&
+		reset_work_tree_to replace_sub1_with_file &&
+		(
+			cd submodule_update &&
+			git branch -t replace_file_with_sub1 origin/replace_file_with_sub1 &&
+			$command replace_file_with_sub1 &&
+			test_superproject_content origin/replace_file_with_sub1 &&
+			test_dir_is_empty sub1 &&
+			git submodule update --init --recursive &&
+			test_submodule_content sub1 origin/replace_file_with_sub1
+		)
+	'
+	# ... as does removing a directory with tracked files with a
+	# submodule.
+	if test "$KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR" = 1
+	then
+		# Non fast-forward merges fail with "Directory sub1 doesn't
+		# exist. sub1" because the empty submodule directory is not
+		# created
+		RESULT="failure"
+	else
+		RESULT="success"
+	fi
+	test_expect_$RESULT "$command: replace directory with submodule" '
+		prolog &&
+		reset_work_tree_to replace_sub1_with_directory &&
+		(
+			cd submodule_update &&
+			git branch -t replace_directory_with_sub1 origin/replace_directory_with_sub1 &&
+			$command replace_directory_with_sub1 &&
+			test_superproject_content origin/replace_directory_with_sub1 &&
+			test_dir_is_empty sub1 &&
+			git submodule update --init --recursive &&
+			test_submodule_content sub1 origin/replace_directory_with_sub1
+		)
+	'
+
+	######################## Disappearing submodule #######################
+	# Removing a submodule doesn't remove its work tree ...
+	if test "$KNOWN_FAILURE_STASH_DOES_IGNORE_SUBMODULE_CHANGES" = 1
+	then
+		RESULT="failure"
+	else
+		RESULT="success"
+	fi
+	test_expect_$RESULT "$command: removed submodule leaves submodule directory and its contents in place" '
+		prolog &&
+		reset_work_tree_to add_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t remove_sub1 origin/remove_sub1 &&
+			$command remove_sub1 &&
+			test_superproject_content origin/remove_sub1 &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+	# ... especially when it contains a .git directory.
+	test_expect_$RESULT "$command: removed submodule leaves submodule containing a .git directory alone" '
+		prolog &&
+		reset_work_tree_to add_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t remove_sub1 origin/remove_sub1 &&
+			replace_gitfile_with_git_dir sub1 &&
+			$command remove_sub1 &&
+			test_superproject_content origin/remove_sub1 &&
+			test_git_directory_is_unchanged sub1 &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+	# Replacing a submodule with files in a directory must fail as the
+	# submodule work tree isn't removed ...
+	if test "$KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES" = 1
+	then
+		# Non fast-forward merges attempt to merge the former
+		# submodule files with the newly checked out ones in the
+		# directory of the same name while it shouldn't.
+		RESULT="failure"
+	else
+		RESULT="success"
+	fi
+	test_expect_$RESULT "$command: replace submodule with a directory must fail" '
+		prolog &&
+		reset_work_tree_to add_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t replace_sub1_with_directory origin/replace_sub1_with_directory &&
+			test_must_fail $command replace_sub1_with_directory &&
+			test_superproject_content origin/add_sub1 &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+	# ... especially when it contains a .git directory.
+	test_expect_$RESULT "$command: replace submodule containing a .git directory with a directory must fail" '
+		prolog &&
+		reset_work_tree_to add_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t replace_sub1_with_directory origin/replace_sub1_with_directory &&
+			replace_gitfile_with_git_dir sub1 &&
+			test_must_fail $command replace_sub1_with_directory &&
+			test_superproject_content origin/add_sub1 &&
+			test_git_directory_is_unchanged sub1 &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+	# Replacing it with a file must fail as it could throw away any local
+	# work tree changes ...
+	test_expect_failure "$command: replace submodule with a file must fail" '
+		prolog &&
+		reset_work_tree_to add_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t replace_sub1_with_file origin/replace_sub1_with_file &&
+			test_must_fail $command replace_sub1_with_file &&
+			test_superproject_content origin/add_sub1 &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+	# ... or even destroy unpushed parts of submodule history if that
+	# still uses a .git directory.
+	test_expect_failure "$command: replace submodule containing a .git directory with a file must fail" '
+		prolog &&
+		reset_work_tree_to add_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t replace_sub1_with_file origin/replace_sub1_with_file &&
+			replace_gitfile_with_git_dir sub1 &&
+			test_must_fail $command replace_sub1_with_file &&
+			test_superproject_content origin/add_sub1 &&
+			test_git_directory_is_unchanged sub1 &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+
+	########################## Modified submodule #########################
+	# Updating a submodule sha1 doesn't update the submodule's work tree
+	if test "$KNOWN_FAILURE_CHERRY_PICK_SEES_EMPTY_COMMIT" = 1
+	then
+		# When cherry picking a SHA-1 update for an ignored submodule
+		# the commit incorrectly fails with "The previous cherry-pick
+		# is now empty, possibly due to conflict resolution."
+		RESULT="failure"
+	else
+		RESULT="success"
+	fi
+	test_expect_$RESULT "$command: modified submodule does not update submodule work tree" '
+		prolog &&
+		reset_work_tree_to add_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t modify_sub1 origin/modify_sub1 &&
+			$command modify_sub1 &&
+			test_superproject_content origin/modify_sub1 &&
+			test_submodule_content sub1 origin/add_sub1 &&
+			git submodule update &&
+			test_submodule_content sub1 origin/modify_sub1
+		)
+	'
+
+	# Updating a submodule to an invalid sha1 doesn't update the
+	# submodule's work tree, subsequent update will fail
+	test_expect_$RESULT "$command: modified submodule does not update submodule work tree to invalid commit" '
+		prolog &&
+		reset_work_tree_to add_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t invalid_sub1 origin/invalid_sub1 &&
+			$command invalid_sub1 &&
+			test_superproject_content origin/invalid_sub1 &&
+			test_submodule_content sub1 origin/add_sub1 &&
+			test_must_fail git submodule update &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+	# Updating a submodule from an invalid sha1 doesn't update the
+	# submodule's work tree, subsequent update will succeed
+	test_expect_$RESULT "$command: modified submodule does not update submodule work tree from invalid commit" '
+		prolog &&
+		reset_work_tree_to invalid_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t valid_sub1 origin/valid_sub1 &&
+			$command valid_sub1 &&
+			test_superproject_content origin/valid_sub1 &&
+			test_dir_is_empty sub1 &&
+			git submodule update --init --recursive &&
+			test_submodule_content sub1 origin/valid_sub1
+		)
+	'
+}
+
+# Test that submodule contents are currently not updated when switching
+# between commits that change a submodule, but throwing away local changes in
+# the superproject is allowed.
+test_submodule_forced_switch () {
+	command="$1"
+	######################### Appearing submodule #########################
+	# Switching to a commit letting a submodule appear creates empty dir ...
+	test_expect_success "$command: added submodule creates empty directory" '
+		prolog &&
+		reset_work_tree_to no_submodule &&
+		(
+			cd submodule_update &&
+			git branch -t add_sub1 origin/add_sub1 &&
+			$command add_sub1 &&
+			test_superproject_content origin/add_sub1 &&
+			test_dir_is_empty sub1 &&
+			git submodule update --init --recursive &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+	# ... and doesn't care if it already exists ...
+	test_expect_success "$command: added submodule leaves existing empty directory alone" '
+		prolog &&
+		reset_work_tree_to no_submodule &&
+		(
+			cd submodule_update &&
+			git branch -t add_sub1 origin/add_sub1 &&
+			mkdir sub1 &&
+			$command add_sub1 &&
+			test_superproject_content origin/add_sub1 &&
+			test_dir_is_empty sub1 &&
+			git submodule update --init --recursive &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+	# ... unless there is an untracked file in its place.
+	test_expect_success "$command: added submodule does remove untracked unignored file with same name when forced" '
+		prolog &&
+		reset_work_tree_to no_submodule &&
+		(
+			cd submodule_update &&
+			git branch -t add_sub1 origin/add_sub1 &&
+			>sub1 &&
+			$command add_sub1 &&
+			test_superproject_content origin/add_sub1 &&
+			test_dir_is_empty sub1
+		)
+	'
+	# Replacing a tracked file with a submodule produces an empty
+	# directory ...
+	test_expect_success "$command: replace tracked file with submodule creates empty directory" '
+		prolog &&
+		reset_work_tree_to replace_sub1_with_file &&
+		(
+			cd submodule_update &&
+			git branch -t replace_file_with_sub1 origin/replace_file_with_sub1 &&
+			$command replace_file_with_sub1 &&
+			test_superproject_content origin/replace_file_with_sub1 &&
+			test_dir_is_empty sub1 &&
+			git submodule update --init --recursive &&
+			test_submodule_content sub1 origin/replace_file_with_sub1
+		)
+	'
+	# ... as does removing a directory with tracked files with a
+	# submodule.
+	test_expect_success "$command: replace directory with submodule" '
+		prolog &&
+		reset_work_tree_to replace_sub1_with_directory &&
+		(
+			cd submodule_update &&
+			git branch -t replace_directory_with_sub1 origin/replace_directory_with_sub1 &&
+			$command replace_directory_with_sub1 &&
+			test_superproject_content origin/replace_directory_with_sub1 &&
+			test_dir_is_empty sub1 &&
+			git submodule update --init --recursive &&
+			test_submodule_content sub1 origin/replace_directory_with_sub1
+		)
+	'
+
+	######################## Disappearing submodule #######################
+	# Removing a submodule doesn't remove its work tree ...
+	test_expect_success "$command: removed submodule leaves submodule directory and its contents in place" '
+		prolog &&
+		reset_work_tree_to add_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t remove_sub1 origin/remove_sub1 &&
+			$command remove_sub1 &&
+			test_superproject_content origin/remove_sub1 &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+	# ... especially when it contains a .git directory.
+	test_expect_success "$command: removed submodule leaves submodule containing a .git directory alone" '
+		prolog &&
+		reset_work_tree_to add_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t remove_sub1 origin/remove_sub1 &&
+			replace_gitfile_with_git_dir sub1 &&
+			$command remove_sub1 &&
+			test_superproject_content origin/remove_sub1 &&
+			test_git_directory_is_unchanged sub1 &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+	# Replacing a submodule with files in a directory must fail as the
+	# submodule work tree isn't removed ...
+	test_expect_failure "$command: replace submodule with a directory must fail" '
+		prolog &&
+		reset_work_tree_to add_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t replace_sub1_with_directory origin/replace_sub1_with_directory &&
+			test_must_fail $command replace_sub1_with_directory &&
+			test_superproject_content origin/add_sub1 &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+	# ... especially when it contains a .git directory.
+	test_expect_failure "$command: replace submodule containing a .git directory with a directory must fail" '
+		prolog &&
+		reset_work_tree_to add_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t replace_sub1_with_directory origin/replace_sub1_with_directory &&
+			replace_gitfile_with_git_dir sub1 &&
+			test_must_fail $command replace_sub1_with_directory &&
+			test_superproject_content origin/add_sub1 &&
+			test_git_directory_is_unchanged sub1 &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+	# Replacing it with a file must fail as it could throw away any local
+	# work tree changes ...
+	test_expect_failure "$command: replace submodule with a file must fail" '
+		prolog &&
+		reset_work_tree_to add_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t replace_sub1_with_file origin/replace_sub1_with_file &&
+			test_must_fail $command replace_sub1_with_file &&
+			test_superproject_content origin/add_sub1 &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+	# ... or even destroy unpushed parts of submodule history if that
+	# still uses a .git directory.
+	test_expect_failure "$command: replace submodule containing a .git directory with a file must fail" '
+		prolog &&
+		reset_work_tree_to add_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t replace_sub1_with_file origin/replace_sub1_with_file &&
+			replace_gitfile_with_git_dir sub1 &&
+			test_must_fail $command replace_sub1_with_file &&
+			test_superproject_content origin/add_sub1 &&
+			test_git_directory_is_unchanged sub1 &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+
+	########################## Modified submodule #########################
+	# Updating a submodule sha1 doesn't update the submodule's work tree
+	test_expect_success "$command: modified submodule does not update submodule work tree" '
+		prolog &&
+		reset_work_tree_to add_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t modify_sub1 origin/modify_sub1 &&
+			$command modify_sub1 &&
+			test_superproject_content origin/modify_sub1 &&
+			test_submodule_content sub1 origin/add_sub1 &&
+			git submodule update &&
+			test_submodule_content sub1 origin/modify_sub1
+		)
+	'
+	# Updating a submodule to an invalid sha1 doesn't update the
+	# submodule's work tree, subsequent update will fail
+	test_expect_success "$command: modified submodule does not update submodule work tree to invalid commit" '
+		prolog &&
+		reset_work_tree_to add_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t invalid_sub1 origin/invalid_sub1 &&
+			$command invalid_sub1 &&
+			test_superproject_content origin/invalid_sub1 &&
+			test_submodule_content sub1 origin/add_sub1 &&
+			test_must_fail git submodule update &&
+			test_submodule_content sub1 origin/add_sub1
+		)
+	'
+	# Updating a submodule from an invalid sha1 doesn't update the
+	# submodule's work tree, subsequent update will succeed
+	test_expect_success "$command: modified submodule does not update submodule work tree from invalid commit" '
+		prolog &&
+		reset_work_tree_to invalid_sub1 &&
+		(
+			cd submodule_update &&
+			git branch -t valid_sub1 origin/valid_sub1 &&
+			$command valid_sub1 &&
+			test_superproject_content origin/valid_sub1 &&
+			test_dir_is_empty sub1 &&
+			git submodule update --init --recursive &&
+			test_submodule_content sub1 origin/valid_sub1
+		)
+	'
+}
diff --git a/t/perf/p5302-pack-index.sh b/t/perf/p5302-pack-index.sh
index 6cb5b0d..5ee9211 100755
--- a/t/perf/p5302-pack-index.sh
+++ b/t/perf/p5302-pack-index.sh
@@ -8,7 +8,7 @@
 
 test_expect_success 'repack' '
 	git repack -ad &&
-	PACK=`ls .git/objects/pack/*.pack | head -n1` &&
+	PACK=$(ls .git/objects/pack/*.pack | head -n1) &&
 	test -f "$PACK" &&
 	export PACK
 '
diff --git a/t/perf/p5310-pack-bitmaps.sh b/t/perf/p5310-pack-bitmaps.sh
index 685d46f..f8ed857 100755
--- a/t/perf/p5310-pack-bitmaps.sh
+++ b/t/perf/p5310-pack-bitmaps.sh
@@ -8,6 +8,9 @@
 # note that we do everything through config,
 # since we want to be able to compare bitmap-aware
 # git versus non-bitmap git
+#
+# We intentionally use the deprecated pack.writebitmaps
+# config so that we can test against older versions of git.
 test_expect_success 'setup bitmap config' '
 	git config pack.writebitmaps true &&
 	git config pack.writebitmaphashcache true
diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh
index a2bb63c..f10ba4a 100755
--- a/t/t0000-basic.sh
+++ b/t/t0000-basic.sh
@@ -42,9 +42,9 @@
 	:
 '
 
-run_sub_test_lib_test () {
-	name="$1" descr="$2" # stdin is the body of the test code
-	shift 2
+_run_sub_test_lib_test_common () {
+	neg="$1" name="$2" descr="$3" # stdin is the body of the test code
+	shift 3
 	mkdir "$name" &&
 	(
 		# Pretend we're not running under a test harness, whether we
@@ -70,10 +70,23 @@
 		export TEST_DIRECTORY &&
 		TEST_OUTPUT_DIRECTORY=$(pwd) &&
 		export TEST_OUTPUT_DIRECTORY &&
-		./"$name.sh" "$@" >out 2>err
+		if test -z "$neg"
+		then
+			./"$name.sh" "$@" >out 2>err
+		else
+			!  ./"$name.sh" "$@" >out 2>err
+		fi
 	)
 }
 
+run_sub_test_lib_test () {
+	_run_sub_test_lib_test_common '' "$@"
+}
+
+run_sub_test_lib_test_err () {
+	_run_sub_test_lib_test_common '!' "$@"
+}
+
 check_sub_test_lib_test () {
 	name="$1" # stdin is the expected output from the test
 	(
@@ -84,6 +97,18 @@
 	)
 }
 
+check_sub_test_lib_test_err () {
+	name="$1" # stdin is the expected output output from the test
+	# expected error output is in descriptior 3
+	(
+		cd "$name" &&
+		sed -e 's/^> //' -e 's/Z$//' >expect.out &&
+		test_cmp expect.out out &&
+		sed -e 's/^> //' -e 's/Z$//' <&3 >expect.err &&
+		test_cmp expect.err err
+	)
+}
+
 test_expect_success 'pretend we have a fully passing test suite' "
 	run_sub_test_lib_test full-pass '3 passing tests' <<-\\EOF &&
 	for i in 1 2 3
@@ -270,6 +295,398 @@
 	EOF
 '
 
+test_expect_success 'GIT_SKIP_TESTS' "
+	(
+		GIT_SKIP_TESTS='git.2' && export GIT_SKIP_TESTS &&
+		run_sub_test_lib_test git-skip-tests-basic \
+			'GIT_SKIP_TESTS' <<-\\EOF &&
+		for i in 1 2 3
+		do
+			test_expect_success \"passing test #\$i\" 'true'
+		done
+		test_done
+		EOF
+		check_sub_test_lib_test git-skip-tests-basic <<-\\EOF
+		> ok 1 - passing test #1
+		> ok 2 # skip passing test #2 (GIT_SKIP_TESTS)
+		> ok 3 - passing test #3
+		> # passed all 3 test(s)
+		> 1..3
+		EOF
+	)
+"
+
+test_expect_success 'GIT_SKIP_TESTS several tests' "
+	(
+		GIT_SKIP_TESTS='git.2 git.5' && export GIT_SKIP_TESTS &&
+		run_sub_test_lib_test git-skip-tests-several \
+			'GIT_SKIP_TESTS several tests' <<-\\EOF &&
+		for i in 1 2 3 4 5 6
+		do
+			test_expect_success \"passing test #\$i\" 'true'
+		done
+		test_done
+		EOF
+		check_sub_test_lib_test git-skip-tests-several <<-\\EOF
+		> ok 1 - passing test #1
+		> ok 2 # skip passing test #2 (GIT_SKIP_TESTS)
+		> ok 3 - passing test #3
+		> ok 4 - passing test #4
+		> ok 5 # skip passing test #5 (GIT_SKIP_TESTS)
+		> ok 6 - passing test #6
+		> # passed all 6 test(s)
+		> 1..6
+		EOF
+	)
+"
+
+test_expect_success 'GIT_SKIP_TESTS sh pattern' "
+	(
+		GIT_SKIP_TESTS='git.[2-5]' && export GIT_SKIP_TESTS &&
+		run_sub_test_lib_test git-skip-tests-sh-pattern \
+			'GIT_SKIP_TESTS sh pattern' <<-\\EOF &&
+		for i in 1 2 3 4 5 6
+		do
+			test_expect_success \"passing test #\$i\" 'true'
+		done
+		test_done
+		EOF
+		check_sub_test_lib_test git-skip-tests-sh-pattern <<-\\EOF
+		> ok 1 - passing test #1
+		> ok 2 # skip passing test #2 (GIT_SKIP_TESTS)
+		> ok 3 # skip passing test #3 (GIT_SKIP_TESTS)
+		> ok 4 # skip passing test #4 (GIT_SKIP_TESTS)
+		> ok 5 # skip passing test #5 (GIT_SKIP_TESTS)
+		> ok 6 - passing test #6
+		> # passed all 6 test(s)
+		> 1..6
+		EOF
+	)
+"
+
+test_expect_success '--run basic' "
+	run_sub_test_lib_test run-basic \
+		'--run basic' --run='1 3 5' <<-\\EOF &&
+	for i in 1 2 3 4 5 6
+	do
+		test_expect_success \"passing test #\$i\" 'true'
+	done
+	test_done
+	EOF
+	check_sub_test_lib_test run-basic <<-\\EOF
+	> ok 1 - passing test #1
+	> ok 2 # skip passing test #2 (--run)
+	> ok 3 - passing test #3
+	> ok 4 # skip passing test #4 (--run)
+	> ok 5 - passing test #5
+	> ok 6 # skip passing test #6 (--run)
+	> # passed all 6 test(s)
+	> 1..6
+	EOF
+"
+
+test_expect_success '--run with a range' "
+	run_sub_test_lib_test run-range \
+		'--run with a range' --run='1-3' <<-\\EOF &&
+	for i in 1 2 3 4 5 6
+	do
+		test_expect_success \"passing test #\$i\" 'true'
+	done
+	test_done
+	EOF
+	check_sub_test_lib_test run-range <<-\\EOF
+	> ok 1 - passing test #1
+	> ok 2 - passing test #2
+	> ok 3 - passing test #3
+	> ok 4 # skip passing test #4 (--run)
+	> ok 5 # skip passing test #5 (--run)
+	> ok 6 # skip passing test #6 (--run)
+	> # passed all 6 test(s)
+	> 1..6
+	EOF
+"
+
+test_expect_success '--run with two ranges' "
+	run_sub_test_lib_test run-two-ranges \
+		'--run with two ranges' --run='1-2 5-6' <<-\\EOF &&
+	for i in 1 2 3 4 5 6
+	do
+		test_expect_success \"passing test #\$i\" 'true'
+	done
+	test_done
+	EOF
+	check_sub_test_lib_test run-two-ranges <<-\\EOF
+	> ok 1 - passing test #1
+	> ok 2 - passing test #2
+	> ok 3 # skip passing test #3 (--run)
+	> ok 4 # skip passing test #4 (--run)
+	> ok 5 - passing test #5
+	> ok 6 - passing test #6
+	> # passed all 6 test(s)
+	> 1..6
+	EOF
+"
+
+test_expect_success '--run with a left open range' "
+	run_sub_test_lib_test run-left-open-range \
+		'--run with a left open range' --run='-3' <<-\\EOF &&
+	for i in 1 2 3 4 5 6
+	do
+		test_expect_success \"passing test #\$i\" 'true'
+	done
+	test_done
+	EOF
+	check_sub_test_lib_test run-left-open-range <<-\\EOF
+	> ok 1 - passing test #1
+	> ok 2 - passing test #2
+	> ok 3 - passing test #3
+	> ok 4 # skip passing test #4 (--run)
+	> ok 5 # skip passing test #5 (--run)
+	> ok 6 # skip passing test #6 (--run)
+	> # passed all 6 test(s)
+	> 1..6
+	EOF
+"
+
+test_expect_success '--run with a right open range' "
+	run_sub_test_lib_test run-right-open-range \
+		'--run with a right open range' --run='4-' <<-\\EOF &&
+	for i in 1 2 3 4 5 6
+	do
+		test_expect_success \"passing test #\$i\" 'true'
+	done
+	test_done
+	EOF
+	check_sub_test_lib_test run-right-open-range <<-\\EOF
+	> ok 1 # skip passing test #1 (--run)
+	> ok 2 # skip passing test #2 (--run)
+	> ok 3 # skip passing test #3 (--run)
+	> ok 4 - passing test #4
+	> ok 5 - passing test #5
+	> ok 6 - passing test #6
+	> # passed all 6 test(s)
+	> 1..6
+	EOF
+"
+
+test_expect_success '--run with basic negation' "
+	run_sub_test_lib_test run-basic-neg \
+		'--run with basic negation' --run='"'!3'"' <<-\\EOF &&
+	for i in 1 2 3 4 5 6
+	do
+		test_expect_success \"passing test #\$i\" 'true'
+	done
+	test_done
+	EOF
+	check_sub_test_lib_test run-basic-neg <<-\\EOF
+	> ok 1 - passing test #1
+	> ok 2 - passing test #2
+	> ok 3 # skip passing test #3 (--run)
+	> ok 4 - passing test #4
+	> ok 5 - passing test #5
+	> ok 6 - passing test #6
+	> # passed all 6 test(s)
+	> 1..6
+	EOF
+"
+
+test_expect_success '--run with two negations' "
+	run_sub_test_lib_test run-two-neg \
+		'--run with two negations' --run='"'!3 !6'"' <<-\\EOF &&
+	for i in 1 2 3 4 5 6
+	do
+		test_expect_success \"passing test #\$i\" 'true'
+	done
+	test_done
+	EOF
+	check_sub_test_lib_test run-two-neg <<-\\EOF
+	> ok 1 - passing test #1
+	> ok 2 - passing test #2
+	> ok 3 # skip passing test #3 (--run)
+	> ok 4 - passing test #4
+	> ok 5 - passing test #5
+	> ok 6 # skip passing test #6 (--run)
+	> # passed all 6 test(s)
+	> 1..6
+	EOF
+"
+
+test_expect_success '--run a range and negation' "
+	run_sub_test_lib_test run-range-and-neg \
+		'--run a range and negation' --run='"'-4 !2'"' <<-\\EOF &&
+	for i in 1 2 3 4 5 6
+	do
+		test_expect_success \"passing test #\$i\" 'true'
+	done
+	test_done
+	EOF
+	check_sub_test_lib_test run-range-and-neg <<-\\EOF
+	> ok 1 - passing test #1
+	> ok 2 # skip passing test #2 (--run)
+	> ok 3 - passing test #3
+	> ok 4 - passing test #4
+	> ok 5 # skip passing test #5 (--run)
+	> ok 6 # skip passing test #6 (--run)
+	> # passed all 6 test(s)
+	> 1..6
+	EOF
+"
+
+test_expect_success '--run range negation' "
+	run_sub_test_lib_test run-range-neg \
+		'--run range negation' --run='"'!1-3'"' <<-\\EOF &&
+	for i in 1 2 3 4 5 6
+	do
+		test_expect_success \"passing test #\$i\" 'true'
+	done
+	test_done
+	EOF
+	check_sub_test_lib_test run-range-neg <<-\\EOF
+	> ok 1 # skip passing test #1 (--run)
+	> ok 2 # skip passing test #2 (--run)
+	> ok 3 # skip passing test #3 (--run)
+	> ok 4 - passing test #4
+	> ok 5 - passing test #5
+	> ok 6 - passing test #6
+	> # passed all 6 test(s)
+	> 1..6
+	EOF
+"
+
+test_expect_success '--run include, exclude and include' "
+	run_sub_test_lib_test run-inc-neg-inc \
+		'--run include, exclude and include' \
+		--run='"'1-5 !1-3 2'"' <<-\\EOF &&
+	for i in 1 2 3 4 5 6
+	do
+		test_expect_success \"passing test #\$i\" 'true'
+	done
+	test_done
+	EOF
+	check_sub_test_lib_test run-inc-neg-inc <<-\\EOF
+	> ok 1 # skip passing test #1 (--run)
+	> ok 2 - passing test #2
+	> ok 3 # skip passing test #3 (--run)
+	> ok 4 - passing test #4
+	> ok 5 - passing test #5
+	> ok 6 # skip passing test #6 (--run)
+	> # passed all 6 test(s)
+	> 1..6
+	EOF
+"
+
+test_expect_success '--run include, exclude and include, comma separated' "
+	run_sub_test_lib_test run-inc-neg-inc-comma \
+		'--run include, exclude and include, comma separated' \
+		--run=1-5,\!1-3,2 <<-\\EOF &&
+	for i in 1 2 3 4 5 6
+	do
+		test_expect_success \"passing test #\$i\" 'true'
+	done
+	test_done
+	EOF
+	check_sub_test_lib_test run-inc-neg-inc-comma <<-\\EOF
+	> ok 1 # skip passing test #1 (--run)
+	> ok 2 - passing test #2
+	> ok 3 # skip passing test #3 (--run)
+	> ok 4 - passing test #4
+	> ok 5 - passing test #5
+	> ok 6 # skip passing test #6 (--run)
+	> # passed all 6 test(s)
+	> 1..6
+	EOF
+"
+
+test_expect_success '--run exclude and include' "
+	run_sub_test_lib_test run-neg-inc \
+		'--run exclude and include' \
+		--run='"'!3- 5'"' <<-\\EOF &&
+	for i in 1 2 3 4 5 6
+	do
+		test_expect_success \"passing test #\$i\" 'true'
+	done
+	test_done
+	EOF
+	check_sub_test_lib_test run-neg-inc <<-\\EOF
+	> ok 1 - passing test #1
+	> ok 2 - passing test #2
+	> ok 3 # skip passing test #3 (--run)
+	> ok 4 # skip passing test #4 (--run)
+	> ok 5 - passing test #5
+	> ok 6 # skip passing test #6 (--run)
+	> # passed all 6 test(s)
+	> 1..6
+	EOF
+"
+
+test_expect_success '--run empty selectors' "
+	run_sub_test_lib_test run-empty-sel \
+		'--run empty selectors' \
+		--run='1,,3,,,5' <<-\\EOF &&
+	for i in 1 2 3 4 5 6
+	do
+		test_expect_success \"passing test #\$i\" 'true'
+	done
+	test_done
+	EOF
+	check_sub_test_lib_test run-empty-sel <<-\\EOF
+	> ok 1 - passing test #1
+	> ok 2 # skip passing test #2 (--run)
+	> ok 3 - passing test #3
+	> ok 4 # skip passing test #4 (--run)
+	> ok 5 - passing test #5
+	> ok 6 # skip passing test #6 (--run)
+	> # passed all 6 test(s)
+	> 1..6
+	EOF
+"
+
+test_expect_success '--run invalid range start' "
+	run_sub_test_lib_test_err run-inv-range-start \
+		'--run invalid range start' \
+		--run='a-5' <<-\\EOF &&
+	test_expect_success \"passing test #1\" 'true'
+	test_done
+	EOF
+	check_sub_test_lib_test_err run-inv-range-start \
+		<<-\\EOF_OUT 3<<-\\EOF_ERR
+	> FATAL: Unexpected exit with code 1
+	EOF_OUT
+	> error: --run: invalid non-numeric in range start: 'a-5'
+	EOF_ERR
+"
+
+test_expect_success '--run invalid range end' "
+	run_sub_test_lib_test_err run-inv-range-end \
+		'--run invalid range end' \
+		--run='1-z' <<-\\EOF &&
+	test_expect_success \"passing test #1\" 'true'
+	test_done
+	EOF
+	check_sub_test_lib_test_err run-inv-range-end \
+		<<-\\EOF_OUT 3<<-\\EOF_ERR
+	> FATAL: Unexpected exit with code 1
+	EOF_OUT
+	> error: --run: invalid non-numeric in range end: '1-z'
+	EOF_ERR
+"
+
+test_expect_success '--run invalid selector' "
+	run_sub_test_lib_test_err run-inv-selector \
+		'--run invalid selector' \
+		--run='1?' <<-\\EOF &&
+	test_expect_success \"passing test #1\" 'true'
+	test_done
+	EOF
+	check_sub_test_lib_test_err run-inv-selector \
+		<<-\\EOF_OUT 3<<-\\EOF_ERR
+	> FATAL: Unexpected exit with code 1
+	EOF_OUT
+	> error: --run: invalid non-numeric in test selector: '1?'
+	EOF_ERR
+"
+
+
 test_set_prereq HAVEIT
 haveit=no
 test_expect_success HAVEIT 'test runs if prerequisite is satisfied' '
diff --git a/t/t0001-init.sh b/t/t0001-init.sh
index bbc9cb6..e62c0ff 100755
--- a/t/t0001-init.sh
+++ b/t/t0001-init.sh
@@ -56,7 +56,7 @@
 	check_config plain-aliased/.git false unset
 '
 
-test_expect_failure 'plain nested through aliased command' '
+test_expect_success 'plain nested through aliased command' '
 	(
 		git init plain-ancestor-aliased &&
 		cd plain-ancestor-aliased &&
@@ -68,7 +68,7 @@
 	check_config plain-ancestor-aliased/plain-nested/.git false unset
 '
 
-test_expect_failure 'plain nested in bare through aliased command' '
+test_expect_success 'plain nested in bare through aliased command' '
 	(
 		git init --bare bare-ancestor-aliased.git &&
 		cd bare-ancestor-aliased.git &&
@@ -185,14 +185,14 @@
 	git init --bare --shared=0666 init-bare-shared-override &&
 	check_config init-bare-shared-override true unset &&
 	test x0666 = \
-	x`git config -f init-bare-shared-override/config core.sharedRepository`
+	x$(git config -f init-bare-shared-override/config core.sharedRepository)
 '
 
 test_expect_success 'init honors global core.sharedRepository' '
 	test_config_global core.sharedRepository 0666 &&
 	git init shared-honor-global &&
 	test x0666 = \
-	x`git config -f shared-honor-global/.git/config core.sharedRepository`
+	x$(git config -f shared-honor-global/.git/config core.sharedRepository)
 '
 
 test_expect_success 'init rejects insanely long --template' '
@@ -285,7 +285,7 @@
 test_expect_success 'init with separate gitdir' '
 	rm -rf newdir &&
 	git init --separate-git-dir realgitdir newdir &&
-	echo "gitdir: `pwd`/realgitdir" >expected &&
+	echo "gitdir: $(pwd)/realgitdir" >expected &&
 	test_cmp expected newdir/.git &&
 	test_path_is_dir realgitdir/refs
 '
@@ -299,7 +299,7 @@
 	cd newdir &&
 	git init --separate-git-dir ../surrealgitdir
 	) &&
-	echo "gitdir: `pwd`/surrealgitdir" >expected &&
+	echo "gitdir: $(pwd)/surrealgitdir" >expected &&
 	test_cmp expected newdir/.git &&
 	test_path_is_dir surrealgitdir/refs &&
 	test_path_is_missing realgitdir/refs
@@ -312,7 +312,7 @@
 	cd newdir &&
 	git init --separate-git-dir ../realgitdir
 	) &&
-	echo "gitdir: `pwd`/realgitdir" >expected &&
+	echo "gitdir: $(pwd)/realgitdir" >expected &&
 	test_cmp expected newdir/.git &&
 	test_path_is_dir realgitdir/refs
 '
@@ -326,7 +326,7 @@
 	ln -s here .git &&
 	git init --separate-git-dir ../realgitdir
 	) &&
-	echo "gitdir: `pwd`/realgitdir" >expected &&
+	echo "gitdir: $(pwd)/realgitdir" >expected &&
 	test_cmp expected newdir/.git &&
 	test_cmp expected newdir/here &&
 	test_path_is_dir realgitdir/refs
diff --git a/t/t0005-signals.sh b/t/t0005-signals.sh
index 981437b..aeea50c 100755
--- a/t/t0005-signals.sh
+++ b/t/t0005-signals.sh
@@ -27,4 +27,26 @@
 	test_expect_code 143 git sigterm
 '
 
+large_git () {
+	for i in $(test_seq 1 100)
+	do
+		git diff --cached --binary || return
+	done
+}
+
+test_expect_success 'create blob' '
+	test-genrandom foo 16384 >file &&
+	git add file
+'
+
+test_expect_success !MINGW 'a constipated git dies with SIGPIPE' '
+	OUT=$( ((large_git; echo $? 1>&3) | :) 3>&1 )
+	test "$OUT" -eq 141
+'
+
+test_expect_success !MINGW 'a constipated git dies with SIGPIPE even if parent ignores it' '
+	OUT=$( ((trap "" PIPE; large_git; echo $? 1>&3) | :) 3>&1 )
+	test "$OUT" -eq 141
+'
+
 test_done
diff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh
index 39e55a1..8dc6939 100755
--- a/t/t0008-ignores.sh
+++ b/t/t0008-ignores.sh
@@ -806,7 +806,7 @@
 	test_cmp err.expect err
 '
 
-test_expect_success NOT_MINGW,NOT_CYGWIN 'correct handling of backslashes' '
+test_expect_success !MINGW,!CYGWIN 'correct handling of backslashes' '
 	rm -rf whitespace &&
 	mkdir whitespace &&
 	>"whitespace/trailing 1  " &&
diff --git a/t/t0010-racy-git.sh b/t/t0010-racy-git.sh
index e45a9e4..5657c5a 100755
--- a/t/t0010-racy-git.sh
+++ b/t/t0010-racy-git.sh
@@ -14,7 +14,7 @@
 	git update-index --add infocom
 	echo xyzzy >infocom
 
-	files=`git diff-files -p`
+	files=$(git diff-files -p)
 	test_expect_success \
 	"Racy GIT trial #$trial part A" \
 	'test "" != "$files"'
@@ -23,7 +23,7 @@
 	echo xyzzy >cornerstone
 	git update-index --add cornerstone
 
-	files=`git diff-files -p`
+	files=$(git diff-files -p)
 	test_expect_success \
 	"Racy GIT trial #$trial part B" \
 	'test "" != "$files"'
diff --git a/t/t0011-hashmap.sh b/t/t0011-hashmap.sh
index 391e2b6..f97c805 100755
--- a/t/t0011-hashmap.sh
+++ b/t/t0011-hashmap.sh
@@ -237,4 +237,17 @@
 
 '
 
+test_expect_success 'string interning' '
+
+test_hashmap "intern value1
+intern Value1
+intern value2
+intern value2
+" "value1
+Value1
+value2
+value2"
+
+'
+
 test_done
diff --git a/t/t0020-crlf.sh b/t/t0020-crlf.sh
index e526184..d2e51a8 100755
--- a/t/t0020-crlf.sh
+++ b/t/t0020-crlf.sh
@@ -20,14 +20,14 @@
 
 	git commit -m initial &&
 
-	one=`git rev-parse HEAD:one` &&
-	dir=`git rev-parse HEAD:dir` &&
-	two=`git rev-parse HEAD:dir/two` &&
-	three=`git rev-parse HEAD:three` &&
+	one=$(git rev-parse HEAD:one) &&
+	dir=$(git rev-parse HEAD:dir) &&
+	two=$(git rev-parse HEAD:dir/two) &&
+	three=$(git rev-parse HEAD:three) &&
 
 	for w in Some extra lines here; do echo $w; done >>one &&
 	git diff >patch.file &&
-	patched=`git hash-object --stdin <one` &&
+	patched=$(git hash-object --stdin <one) &&
 	git read-tree --reset -u HEAD &&
 
 	echo happy.
@@ -111,7 +111,7 @@
 		}
 	done &&
 
-	differs=`git diff-index --cached HEAD` &&
+	differs=$(git diff-index --cached HEAD) &&
 	test -z "$differs" || {
 		echo Oops "$differs"
 		false
@@ -135,7 +135,7 @@
 		}
 	done &&
 
-	differs=`git diff-index --cached HEAD` &&
+	differs=$(git diff-index --cached HEAD) &&
 	test -z "$differs" || {
 		echo Oops "$differs"
 		false
@@ -158,9 +158,9 @@
 			break
 		}
 	done &&
-	test "$one" = `git hash-object --stdin <one` &&
-	test "$two" = `git hash-object --stdin <dir/two` &&
-	differs=`git diff-index --cached HEAD` &&
+	test "$one" = $(git hash-object --stdin <one) &&
+	test "$two" = $(git hash-object --stdin <dir/two) &&
+	differs=$(git diff-index --cached HEAD) &&
 	test -z "$differs" || {
 		echo Oops "$differs"
 		false
@@ -184,9 +184,9 @@
 			git update-index -- $f
 		fi
 	done &&
-	test "$one" = `git hash-object --stdin <one` &&
-	test "$two" = `git hash-object --stdin <dir/two` &&
-	differs=`git diff-index --cached HEAD` &&
+	test "$one" = $(git hash-object --stdin <one) &&
+	test "$two" = $(git hash-object --stdin <dir/two) &&
+	differs=$(git diff-index --cached HEAD) &&
 	test -z "$differs" || {
 		echo Oops "$differs"
 		false
@@ -200,7 +200,7 @@
 	git read-tree --reset -u HEAD &&
 
 	git apply patch.file &&
-	test "$patched" = "`git hash-object --stdin <one`" || {
+	test "$patched" = "$(git hash-object --stdin <one)" || {
 		echo "Eh?  apply without index"
 		false
 	}
@@ -213,7 +213,7 @@
 	git read-tree --reset -u HEAD &&
 
 	git apply --cached patch.file &&
-	test "$patched" = `git rev-parse :one` || {
+	test "$patched" = $(git rev-parse :one) || {
 		echo "Eh?  apply with --cached"
 		false
 	}
@@ -226,8 +226,8 @@
 	git read-tree --reset -u HEAD &&
 
 	git apply --index patch.file &&
-	test "$patched" = `git rev-parse :one` &&
-	test "$patched" = `git hash-object --stdin <one` || {
+	test "$patched" = $(git rev-parse :one) &&
+	test "$patched" = $(git hash-object --stdin <one) || {
 		echo "Eh?  apply with --index"
 		false
 	}
@@ -240,7 +240,7 @@
 	git read-tree --reset -u HEAD &&
 
 	git apply patch.file &&
-	test "$patched" = "`remove_cr <one | git hash-object --stdin`" || {
+	test "$patched" = "$(remove_cr <one | git hash-object --stdin)" || {
 		echo "Eh?  apply without index"
 		false
 	}
@@ -253,7 +253,7 @@
 	git read-tree --reset -u HEAD &&
 
 	git apply --cached patch.file &&
-	test "$patched" = `git rev-parse :one` || {
+	test "$patched" = $(git rev-parse :one) || {
 		echo "Eh?  apply without index"
 		false
 	}
@@ -266,8 +266,8 @@
 	git read-tree --reset -u HEAD &&
 
 	git apply --index patch.file &&
-	test "$patched" = `git rev-parse :one` &&
-	test "$patched" = "`remove_cr <one | git hash-object --stdin`" || {
+	test "$patched" = $(git rev-parse :one) &&
+	test "$patched" = "$(remove_cr <one | git hash-object --stdin)" || {
 		echo "Eh?  apply with --index"
 		false
 	}
diff --git a/t/t0021-conversion.sh b/t/t0021-conversion.sh
index b92e6cb..ca7d2a6 100755
--- a/t/t0021-conversion.sh
+++ b/t/t0021-conversion.sh
@@ -153,17 +153,23 @@
 	:
 '
 
-test_expect_success 'required filter success' '
-	git config filter.required.smudge cat &&
-	git config filter.required.clean cat &&
+test_expect_success 'required filter should filter data' '
+	git config filter.required.smudge ./rot13.sh &&
+	git config filter.required.clean ./rot13.sh &&
 	git config filter.required.required true &&
 
 	echo "*.r filter=required" >.gitattributes &&
 
-	echo test >test.r &&
+	cat test.o >test.r &&
 	git add test.r &&
+
 	rm -f test.r &&
-	git checkout -- test.r
+	git checkout -- test.r &&
+	cmp test.o test.r &&
+
+	./rot13.sh <test.o >expected &&
+	git cat-file blob :test.r >actual &&
+	cmp expected actual
 '
 
 test_expect_success 'required filter smudge failure' '
@@ -190,7 +196,13 @@
 	test_must_fail git add test.fc
 '
 
-test -n "$GIT_TEST_LONG" && test_set_prereq EXPENSIVE
+test_expect_success 'filtering large input to small output should use little memory' '
+	git config filter.devnull.clean "cat >/dev/null" &&
+	git config filter.devnull.required true &&
+	for i in $(test_seq 1 30); do printf "%1048576d" 1; done >30MB &&
+	echo "30MB filter=devnull" >.gitattributes &&
+	GIT_MMAP_LIMIT=1m GIT_ALLOC_LIMIT=1m git add 30MB
+'
 
 test_expect_success EXPENSIVE 'filter large file' '
 	git config filter.largefile.smudge cat &&
diff --git a/t/t0025-crlf-auto.sh b/t/t0025-crlf-auto.sh
index f5f67a6..c164b46 100755
--- a/t/t0025-crlf-auto.sh
+++ b/t/t0025-crlf-auto.sh
@@ -12,144 +12,144 @@
 
 	git config core.autocrlf false &&
 
-	for w in Hello world how are you; do echo $w; done >one &&
-	for w in I am very very fine thank you; do echo ${w}Q; done | q_to_cr >two &&
-	for w in Oh here is a QNUL byte how alarming; do echo ${w}; done | q_to_nul >three &&
+	for w in Hello world how are you; do echo $w; done >LFonly &&
+	for w in I am very very fine thank you; do echo ${w}Q; done | q_to_cr >CRLFonly &&
+	for w in Oh here is a QNUL byte how alarming; do echo ${w}; done | q_to_nul >LFwithNUL &&
 	git add . &&
 
 	git commit -m initial &&
 
-	one=`git rev-parse HEAD:one` &&
-	two=`git rev-parse HEAD:two` &&
-	three=`git rev-parse HEAD:three` &&
+	LFonly=$(git rev-parse HEAD:LFonly) &&
+	CRLFonly=$(git rev-parse HEAD:CRLFonly) &&
+	LFwithNUL=$(git rev-parse HEAD:LFwithNUL) &&
 
 	echo happy.
 '
 
 test_expect_success 'default settings cause no changes' '
 
-	rm -f .gitattributes tmp one two three &&
+	rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
 	git read-tree --reset -u HEAD &&
 
-	! has_cr one &&
-	has_cr two &&
-	onediff=`git diff one` &&
-	twodiff=`git diff two` &&
-	threediff=`git diff three` &&
-	test -z "$onediff" -a -z "$twodiff" -a -z "$threediff"
+	! has_cr LFonly &&
+	has_cr CRLFonly &&
+	LFonlydiff=$(git diff LFonly) &&
+	CRLFonlydiff=$(git diff CRLFonly) &&
+	LFwithNULdiff=$(git diff LFwithNUL) &&
+	test -z "$LFonlydiff" -a -z "$CRLFonlydiff" -a -z "$LFwithNULdiff"
 '
 
 test_expect_success 'crlf=true causes a CRLF file to be normalized' '
 
 	# Backwards compatibility check
-	rm -f .gitattributes tmp one two three &&
-	echo "two crlf" > .gitattributes &&
+	rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
+	echo "CRLFonly crlf" > .gitattributes &&
 	git read-tree --reset -u HEAD &&
 
 	# Note, "normalized" means that git will normalize it if added
-	has_cr two &&
-	twodiff=`git diff two` &&
-	test -n "$twodiff"
+	has_cr CRLFonly &&
+	CRLFonlydiff=$(git diff CRLFonly) &&
+	test -n "$CRLFonlydiff"
 '
 
 test_expect_success 'text=true causes a CRLF file to be normalized' '
 
-	rm -f .gitattributes tmp one two three &&
-	echo "two text" > .gitattributes &&
+	rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
+	echo "CRLFonly text" > .gitattributes &&
 	git read-tree --reset -u HEAD &&
 
 	# Note, "normalized" means that git will normalize it if added
-	has_cr two &&
-	twodiff=`git diff two` &&
-	test -n "$twodiff"
+	has_cr CRLFonly &&
+	CRLFonlydiff=$(git diff CRLFonly) &&
+	test -n "$CRLFonlydiff"
 '
 
 test_expect_success 'eol=crlf gives a normalized file CRLFs with autocrlf=false' '
 
-	rm -f .gitattributes tmp one two three &&
+	rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
 	git config core.autocrlf false &&
-	echo "one eol=crlf" > .gitattributes &&
+	echo "LFonly eol=crlf" > .gitattributes &&
 	git read-tree --reset -u HEAD &&
 
-	has_cr one &&
-	onediff=`git diff one` &&
-	test -z "$onediff"
+	has_cr LFonly &&
+	LFonlydiff=$(git diff LFonly) &&
+	test -z "$LFonlydiff"
 '
 
 test_expect_success 'eol=crlf gives a normalized file CRLFs with autocrlf=input' '
 
-	rm -f .gitattributes tmp one two three &&
+	rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
 	git config core.autocrlf input &&
-	echo "one eol=crlf" > .gitattributes &&
+	echo "LFonly eol=crlf" > .gitattributes &&
 	git read-tree --reset -u HEAD &&
 
-	has_cr one &&
-	onediff=`git diff one` &&
-	test -z "$onediff"
+	has_cr LFonly &&
+	LFonlydiff=$(git diff LFonly) &&
+	test -z "$LFonlydiff"
 '
 
 test_expect_success 'eol=lf gives a normalized file LFs with autocrlf=true' '
 
-	rm -f .gitattributes tmp one two three &&
+	rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
 	git config core.autocrlf true &&
-	echo "one eol=lf" > .gitattributes &&
+	echo "LFonly eol=lf" > .gitattributes &&
 	git read-tree --reset -u HEAD &&
 
-	! has_cr one &&
-	onediff=`git diff one` &&
-	test -z "$onediff"
+	! has_cr LFonly &&
+	LFonlydiff=$(git diff LFonly) &&
+	test -z "$LFonlydiff"
 '
 
 test_expect_success 'autocrlf=true does not normalize CRLF files' '
 
-	rm -f .gitattributes tmp one two three &&
+	rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
 	git config core.autocrlf true &&
 	git read-tree --reset -u HEAD &&
 
-	has_cr one &&
-	has_cr two &&
-	onediff=`git diff one` &&
-	twodiff=`git diff two` &&
-	threediff=`git diff three` &&
-	test -z "$onediff" -a -z "$twodiff" -a -z "$threediff"
+	has_cr LFonly &&
+	has_cr CRLFonly &&
+	LFonlydiff=$(git diff LFonly) &&
+	CRLFonlydiff=$(git diff CRLFonly) &&
+	LFwithNULdiff=$(git diff LFwithNUL) &&
+	test -z "$LFonlydiff" -a -z "$CRLFonlydiff" -a -z "$LFwithNULdiff"
 '
 
 test_expect_success 'text=auto, autocrlf=true _does_ normalize CRLF files' '
 
-	rm -f .gitattributes tmp one two three &&
+	rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
 	git config core.autocrlf true &&
 	echo "* text=auto" > .gitattributes &&
 	git read-tree --reset -u HEAD &&
 
-	has_cr one &&
-	has_cr two &&
-	onediff=`git diff one` &&
-	twodiff=`git diff two` &&
-	threediff=`git diff three` &&
-	test -z "$onediff" -a -n "$twodiff" -a -z "$threediff"
+	has_cr LFonly &&
+	has_cr CRLFonly &&
+	LFonlydiff=$(git diff LFonly) &&
+	CRLFonlydiff=$(git diff CRLFonly) &&
+	LFwithNULdiff=$(git diff LFwithNUL) &&
+	test -z "$LFonlydiff" -a -n "$CRLFonlydiff" -a -z "$LFwithNULdiff"
 '
 
 test_expect_success 'text=auto, autocrlf=true does not normalize binary files' '
 
-	rm -f .gitattributes tmp one two three &&
+	rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
 	git config core.autocrlf true &&
 	echo "* text=auto" > .gitattributes &&
 	git read-tree --reset -u HEAD &&
 
-	! has_cr three &&
-	threediff=`git diff three` &&
-	test -z "$threediff"
+	! has_cr LFwithNUL &&
+	LFwithNULdiff=$(git diff LFwithNUL) &&
+	test -z "$LFwithNULdiff"
 '
 
 test_expect_success 'eol=crlf _does_ normalize binary files' '
 
-	rm -f .gitattributes tmp one two three &&
-	echo "three eol=crlf" > .gitattributes &&
+	rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
+	echo "LFwithNUL eol=crlf" > .gitattributes &&
 	git read-tree --reset -u HEAD &&
 
-	has_cr three &&
-	threediff=`git diff three` &&
-	test -z "$threediff"
+	has_cr LFwithNUL &&
+	LFwithNULdiff=$(git diff LFwithNUL) &&
+	test -z "$LFwithNULdiff"
 '
 
 test_done
diff --git a/t/t0026-eol-config.sh b/t/t0026-eol-config.sh
index fe0164b..c5203e2 100755
--- a/t/t0026-eol-config.sh
+++ b/t/t0026-eol-config.sh
@@ -20,8 +20,8 @@
 
 	git commit -m initial &&
 
-	one=`git rev-parse HEAD:one` &&
-	two=`git rev-parse HEAD:two` &&
+	one=$(git rev-parse HEAD:one) &&
+	two=$(git rev-parse HEAD:two) &&
 
 	echo happy.
 '
@@ -34,9 +34,9 @@
 
 	! has_cr one &&
 	! has_cr two &&
-	onediff=`git diff one` &&
-	twodiff=`git diff two` &&
-	test -z "$onediff" -a -z "$twodiff"
+	onediff=$(git diff one) &&
+	twodiff=$(git diff two) &&
+	test -z "$onediff" && test -z "$twodiff"
 '
 
 test_expect_success 'eol=crlf puts CRLFs in normalized file' '
@@ -47,9 +47,9 @@
 
 	has_cr one &&
 	! has_cr two &&
-	onediff=`git diff one` &&
-	twodiff=`git diff two` &&
-	test -z "$onediff" -a -z "$twodiff"
+	onediff=$(git diff one) &&
+	twodiff=$(git diff two) &&
+	test -z "$onediff" && test -z "$twodiff"
 '
 
 test_expect_success 'autocrlf=true overrides eol=lf' '
@@ -61,9 +61,9 @@
 
 	has_cr one &&
 	has_cr two &&
-	onediff=`git diff one` &&
-	twodiff=`git diff two` &&
-	test -z "$onediff" -a -z "$twodiff"
+	onediff=$(git diff one) &&
+	twodiff=$(git diff two) &&
+	test -z "$onediff" && test -z "$twodiff"
 '
 
 test_expect_success 'autocrlf=true overrides unset eol' '
@@ -75,9 +75,29 @@
 
 	has_cr one &&
 	has_cr two &&
-	onediff=`git diff one` &&
-	twodiff=`git diff two` &&
-	test -z "$onediff" -a -z "$twodiff"
+	onediff=$(git diff one) &&
+	twodiff=$(git diff two) &&
+	test -z "$onediff" && test -z "$twodiff"
+'
+
+test_expect_success NATIVE_CRLF 'eol native is crlf' '
+
+	rm -rf native_eol && mkdir native_eol &&
+	(
+		cd native_eol &&
+		printf "*.txt text\n" >.gitattributes &&
+		printf "one\r\ntwo\r\nthree\r\n" >filedos.txt &&
+		printf "one\ntwo\nthree\n" >fileunix.txt &&
+		git init &&
+		git config core.autocrlf false &&
+		git config core.eol native &&
+		git add filedos.txt fileunix.txt &&
+		git commit -m "first" &&
+		rm file*.txt &&
+		git reset --hard HEAD &&
+		has_cr filedos.txt &&
+		has_cr fileunix.txt
+	)
 '
 
 test_done
diff --git a/t/t0027-auto-crlf.sh b/t/t0027-auto-crlf.sh
new file mode 100755
index 0000000..2a4a6c1
--- /dev/null
+++ b/t/t0027-auto-crlf.sh
@@ -0,0 +1,285 @@
+#!/bin/sh
+
+test_description='CRLF conversion all combinations'
+
+. ./test-lib.sh
+
+if ! test_have_prereq EXPENSIVE
+then
+	skip_all="EXPENSIVE not set"
+	test_done
+fi
+
+compare_files () {
+	tr '\015\000' QN <"$1" >"$1".expect &&
+	tr '\015\000' QN <"$2" >"$2".actual &&
+	test_cmp "$1".expect "$2".actual &&
+	rm "$1".expect "$2".actual
+}
+
+compare_ws_file () {
+	pfx=$1
+	exp=$2.expect
+	act=$pfx.actual.$3
+	tr '\015\000' QN <"$2" >"$exp" &&
+	tr '\015\000' QN <"$3" >"$act" &&
+	test_cmp $exp $act &&
+	rm $exp $act
+}
+
+create_gitattributes () {
+	attr=$1
+	case "$attr" in
+		auto)
+		echo "*.txt text=auto" >.gitattributes
+		;;
+		text)
+		echo "*.txt text" >.gitattributes
+		;;
+		-text)
+		echo "*.txt -text" >.gitattributes
+		;;
+		crlf)
+		echo "*.txt eol=crlf" >.gitattributes
+		;;
+		lf)
+		echo "*.txt eol=lf" >.gitattributes
+		;;
+		"")
+		echo >.gitattributes
+		;;
+		*)
+		echo >&2 invalid attribute: $attr
+		exit 1
+		;;
+	esac
+}
+
+create_file_in_repo () {
+	crlf=$1
+	attr=$2
+	create_gitattributes "$attr" &&
+	for f in LF CRLF LF_mix_CR CRLF_mix_LF CRLF_nul
+	do
+		pfx=crlf_${crlf}_attr_${attr}_$f.txt &&
+		cp $f $pfx && git -c core.autocrlf=$crlf add $pfx
+	done &&
+	git commit -m "core.autocrlf $crlf"
+}
+
+check_files_in_repo () {
+	crlf=$1
+	attr=$2
+	lfname=$3
+	crlfname=$4
+	lfmixcrlf=$5
+	lfmixcr=$6
+	crlfnul=$7
+	pfx=crlf_${crlf}_attr_${attr}_ &&
+	compare_files $lfname ${pfx}LF.txt &&
+	compare_files $crlfname ${pfx}CRLF.txt &&
+	compare_files $lfmixcrlf ${pfx}CRLF_mix_LF.txt &&
+	compare_files $lfmixcr ${pfx}LF_mix_CR.txt &&
+	compare_files $crlfnul ${pfx}CRLF_nul.txt
+}
+
+
+check_files_in_ws () {
+	eol=$1
+	crlf=$2
+	attr=$3
+	lfname=$4
+	crlfname=$5
+	lfmixcrlf=$6
+	lfmixcr=$7
+	crlfnul=$8
+	create_gitattributes $attr &&
+	git config core.autocrlf $crlf &&
+	pfx=eol_${eol}_crlf_${crlf}_attr_${attr}_ &&
+	src=crlf_false_attr__ &&
+	for f in LF CRLF LF_mix_CR CRLF_mix_LF CRLF_nul
+	do
+		rm $src$f.txt &&
+		if test -z "$eol"; then
+			git checkout $src$f.txt
+		else
+			git -c core.eol=$eol checkout $src$f.txt
+		fi
+	done
+
+	test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=LF" "
+		compare_ws_file $pfx $lfname    ${src}LF.txt
+	"
+	test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=CRLF" "
+		compare_ws_file $pfx $crlfname  ${src}CRLF.txt
+	"
+	test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=CRLF_mix_LF" "
+		compare_ws_file $pfx $lfmixcrlf ${src}CRLF_mix_LF.txt
+	"
+	test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=LF_mix_CR" "
+		compare_ws_file $pfx $lfmixcr   ${src}LF_mix_CR.txt
+	"
+	test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=CRLF_nul" "
+		compare_ws_file $pfx $crlfnul   ${src}CRLF_nul.txt
+	"
+}
+
+#######
+test_expect_success 'setup master' '
+	echo >.gitattributes &&
+	git checkout -b master &&
+	git add .gitattributes &&
+	git commit -m "add .gitattributes" "" &&
+	printf "line1\nline2\nline3"     >LF &&
+	printf "line1\r\nline2\r\nline3" >CRLF &&
+	printf "line1\r\nline2\nline3"   >CRLF_mix_LF &&
+	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
+'
+
+
+test_expect_success 'create files' '
+	create_file_in_repo false "" &&
+	create_file_in_repo true  "" &&
+	create_file_in_repo input "" &&
+
+	create_file_in_repo false "auto" &&
+	create_file_in_repo true  "auto" &&
+	create_file_in_repo input "auto" &&
+
+	create_file_in_repo false "text" &&
+	create_file_in_repo true  "text" &&
+	create_file_in_repo input "text" &&
+
+	create_file_in_repo false "-text" &&
+	create_file_in_repo true  "-text" &&
+	create_file_in_repo input "-text" &&
+	rm -f *.txt &&
+	git reset --hard
+'
+
+test_expect_success 'commit empty gitattribues' '
+	check_files_in_repo false ""      LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
+	check_files_in_repo true  ""      LF LF   LF          LF_mix_CR CRLF_nul &&
+	check_files_in_repo input ""      LF LF   LF          LF_mix_CR CRLF_nul
+'
+
+test_expect_success 'commit text=auto' '
+	check_files_in_repo false "auto"  LF LF   LF          LF_mix_CR CRLF_nul &&
+	check_files_in_repo true  "auto"  LF LF   LF          LF_mix_CR CRLF_nul &&
+	check_files_in_repo input "auto"  LF LF   LF          LF_mix_CR CRLF_nul
+'
+
+test_expect_success 'commit text' '
+	check_files_in_repo false "text"  LF LF   LF          LF_mix_CR LF_nul &&
+	check_files_in_repo true  "text"  LF LF   LF          LF_mix_CR LF_nul &&
+	check_files_in_repo input "text"  LF LF   LF          LF_mix_CR LF_nul
+'
+
+test_expect_success 'commit -text' '
+	check_files_in_repo false "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
+	check_files_in_repo true  "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
+	check_files_in_repo 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:
+# - check_files_in_ws will check multiple files with a combination of settings
+#   and attributes (core.autocrlf=input is forbidden with core.eol=crlf)
+# - parameter $1 : core.eol               lf | crlf
+# - parameter $2 : core.autocrlf          false | true | input
+# - parameter $3 : text in .gitattributs  "" (empty) | auto | text | -text
+# - parameter $4 : reference for a file with only LF in the repo
+# - parameter $5 : reference for a file with only CRLF in the repo
+# - parameter $6 : reference for a file with mixed LF and CRLF in the repo
+# - parameter $7 : reference for a file with LF and CR in the repo (does somebody uses this ?)
+# - parameter $8 : reference for a file with CRLF and a NUL (should be handled as binary when auto)
+
+#                                            What we have in the repo:
+#                														 ----------------- EOL in repo ----------------
+#                														 LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+#                   settings with checkout:
+#                   core.   core.   .gitattr
+#                    eol     acrlf
+#                                            ----------------------------------------------
+#                                            What we want to have in the working tree:
+if test_have_prereq MINGW
+then
+MIX_CRLF_LF=CRLF
+MIX_LF_CR=CRLF_mix_CR
+NL=CRLF
+else
+MIX_CRLF_LF=CRLF_mix_LF
+MIX_LF_CR=LF_mix_CR
+NL=LF
+fi
+export CRLF_MIX_LF_CR MIX NL
+
+check_files_in_ws    lf      false  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    lf      true   ""       CRLF  CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    lf      input  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    lf      false "auto"    LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    lf      true  "auto"    CRLF  CRLF  CRLF         LF_mix_CR    CRLF_nul
+check_files_in_ws    lf      input "auto"    LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    lf      false "text"    LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    lf      true  "text"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+check_files_in_ws    lf      input "text"    LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    lf      false "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    lf      true  "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    lf      input "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    lf      false "lf"      LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    lf      true  "lf"      LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    lf      input "lf"      LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    lf      false "crlf"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+check_files_in_ws    lf      true  "crlf"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+check_files_in_ws    lf      input "crlf"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+
+check_files_in_ws    crlf    false  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    crlf    true   ""       CRLF  CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    crlf    false "auto"    CRLF  CRLF  CRLF         LF_mix_CR    CRLF_nul
+check_files_in_ws    crlf    true  "auto"    CRLF  CRLF  CRLF         LF_mix_CR    CRLF_nul
+check_files_in_ws    crlf    false "text"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+check_files_in_ws    crlf    true  "text"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+check_files_in_ws    crlf    false "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    crlf    true  "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    crlf    false "lf"      LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    crlf    true  "lf"      LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    crlf    false "crlf"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+check_files_in_ws    crlf    true  "crlf"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+
+check_files_in_ws    ""      false  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    ""      true   ""       CRLF  CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    ""      input  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    ""      false "auto"    $NL   CRLF  $MIX_CRLF_LF LF_mix_CR    CRLF_nul
+check_files_in_ws    ""      true  "auto"    CRLF  CRLF  CRLF         LF_mix_CR    CRLF_nul
+check_files_in_ws    ""      input "auto"    LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    ""      false "text"    $NL   CRLF  $MIX_CRLF_LF $MIX_LF_CR   CRLF_nul
+check_files_in_ws    ""      true  "text"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+check_files_in_ws    ""      input "text"    LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    ""      false "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    ""      true  "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    ""      input "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    ""      false "lf"      LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    ""      true  "lf"      LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    ""      input "lf"      LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    ""      false "crlf"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+check_files_in_ws    ""      true  "crlf"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+check_files_in_ws    ""      input "crlf"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+
+check_files_in_ws    native  false  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    native  true   ""       CRLF  CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    native  false "auto"    $NL   CRLF  $MIX_CRLF_LF LF_mix_CR    CRLF_nul
+check_files_in_ws    native  true  "auto"    CRLF  CRLF  CRLF         LF_mix_CR    CRLF_nul
+check_files_in_ws    native  false "text"    $NL   CRLF  $MIX_CRLF_LF $MIX_LF_CR   CRLF_nul
+check_files_in_ws    native  true  "text"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+check_files_in_ws    native  false "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    native  true  "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    native  false "lf"      LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    native  true  "lf"      LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
+check_files_in_ws    native  false "crlf"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+check_files_in_ws    native  true  "crlf"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+
+test_done
diff --git a/t/t0030-stripspace.sh b/t/t0030-stripspace.sh
index a8e84d8..0333dd9 100755
--- a/t/t0030-stripspace.sh
+++ b/t/t0030-stripspace.sh
@@ -225,22 +225,22 @@
 
 test_expect_success \
     'text without newline at end should end with newline' '
-    test `printf "$ttt" | git stripspace | wc -l` -gt 0 &&
-    test `printf "$ttt$ttt" | git stripspace | wc -l` -gt 0 &&
-    test `printf "$ttt$ttt$ttt" | git stripspace | wc -l` -gt 0 &&
-    test `printf "$ttt$ttt$ttt$ttt" | git stripspace | wc -l` -gt 0
+    test $(printf "$ttt" | git stripspace | wc -l) -gt 0 &&
+    test $(printf "$ttt$ttt" | git stripspace | wc -l) -gt 0 &&
+    test $(printf "$ttt$ttt$ttt" | git stripspace | wc -l) -gt 0 &&
+    test $(printf "$ttt$ttt$ttt$ttt" | git stripspace | wc -l) -gt 0
 '
 
 # text plus spaces at the end:
 
 test_expect_success \
     'text plus spaces without newline at end should end with newline' '
-    test `printf "$ttt$sss" | git stripspace | wc -l` -gt 0 &&
-    test `printf "$ttt$ttt$sss" | git stripspace | wc -l` -gt 0 &&
-    test `printf "$ttt$ttt$ttt$sss" | git stripspace | wc -l` -gt 0 &&
-    test `printf "$ttt$sss$sss" | git stripspace | wc -l` -gt 0 &&
-    test `printf "$ttt$ttt$sss$sss" | git stripspace | wc -l` -gt 0 &&
-    test `printf "$ttt$sss$sss$sss" | git stripspace | wc -l` -gt 0
+    test $(printf "$ttt$sss" | git stripspace | wc -l) -gt 0 &&
+    test $(printf "$ttt$ttt$sss" | git stripspace | wc -l) -gt 0 &&
+    test $(printf "$ttt$ttt$ttt$sss" | git stripspace | wc -l) -gt 0 &&
+    test $(printf "$ttt$sss$sss" | git stripspace | wc -l) -gt 0 &&
+    test $(printf "$ttt$ttt$sss$sss" | git stripspace | wc -l) -gt 0 &&
+    test $(printf "$ttt$sss$sss$sss" | git stripspace | wc -l) -gt 0
 '
 
 test_expect_success \
diff --git a/t/t0064-sha1-array.sh b/t/t0064-sha1-array.sh
new file mode 100755
index 0000000..50b31ff
--- /dev/null
+++ b/t/t0064-sha1-array.sh
@@ -0,0 +1,94 @@
+#!/bin/sh
+
+test_description='basic tests for the SHA1 array implementation'
+. ./test-lib.sh
+
+echo20 () {
+	prefix="${1:+$1 }"
+	shift
+	while test $# -gt 0
+	do
+		echo "$prefix$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1"
+		shift
+	done
+}
+
+test_expect_success 'ordered enumeration' '
+	echo20 "" 44 55 88 aa >expect &&
+	{
+		echo20 append 88 44 aa 55 &&
+		echo for_each_unique
+	} | test-sha1-array >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'ordered enumeration with duplicate suppression' '
+	echo20 "" 44 55 88 aa >expect &&
+	{
+		echo20 append 88 44 aa 55 &&
+		echo20 append 88 44 aa 55 &&
+		echo for_each_unique
+	} | test-sha1-array >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'lookup' '
+	{
+		echo20 append 88 44 aa 55 &&
+		echo20 lookup 55
+	} | test-sha1-array >actual &&
+	n=$(cat actual) &&
+	test "$n" -eq 1
+'
+
+test_expect_success 'lookup non-existing entry' '
+	{
+		echo20 append 88 44 aa 55 &&
+		echo20 lookup 33
+	} | test-sha1-array >actual &&
+	n=$(cat actual) &&
+	test "$n" -lt 0
+'
+
+test_expect_success 'lookup with duplicates' '
+	{
+		echo20 append 88 44 aa 55 &&
+		echo20 append 88 44 aa 55 &&
+		echo20 lookup 55
+	} | test-sha1-array >actual &&
+	n=$(cat actual) &&
+	test "$n" -ge 2 &&
+	test "$n" -le 3
+'
+
+test_expect_success 'lookup non-existing entry with duplicates' '
+	{
+		echo20 append 88 44 aa 55 &&
+		echo20 append 88 44 aa 55 &&
+		echo20 lookup 66
+	} | test-sha1-array >actual &&
+	n=$(cat actual) &&
+	test "$n" -lt 0
+'
+
+test_expect_success 'lookup with almost duplicate values' '
+	{
+		echo "append 5555555555555555555555555555555555555555" &&
+		echo "append 555555555555555555555555555555555555555f" &&
+		echo20 lookup 55
+	} | test-sha1-array >actual &&
+	n=$(cat actual) &&
+	test "$n" -eq 0
+'
+
+test_expect_success 'lookup with single duplicate value' '
+	{
+		echo20 append 55 55 &&
+		echo20 lookup 55
+	} | test-sha1-array >actual &&
+	n=$(cat actual) &&
+	test "$n" -ge 0 &&
+	test "$n" -le 1
+'
+
+test_done
diff --git a/t/t0081-line-buffer.sh b/t/t0081-line-buffer.sh
index bd83ed3..ce92e6a 100755
--- a/t/t0081-line-buffer.sh
+++ b/t/t0081-line-buffer.sh
@@ -29,7 +29,7 @@
 	test_cmp expect actual
 '
 
-test_expect_success 'read from file descriptor' '
+test_expect_success !MINGW 'read from file descriptor' '
 	rm -f input &&
 	echo hello >expect &&
 	echo hello >input &&
diff --git a/t/t0090-cache-tree.sh b/t/t0090-cache-tree.sh
index 6c33e28..158cf4f 100755
--- a/t/t0090-cache-tree.sh
+++ b/t/t0090-cache-tree.sh
@@ -8,7 +8,7 @@
  . ./test-lib.sh
 
 cmp_cache_tree () {
-	test-dump-cache-tree >actual &&
+	test-dump-cache-tree | sed -e '/#(ref)/d' >actual &&
 	sed "s/$_x40/SHA/" <actual >filtered &&
 	test_cmp "$1" filtered
 }
@@ -16,15 +16,40 @@
 # We don't bother with actually checking the SHA1:
 # test-dump-cache-tree already verifies that all existing data is
 # correct.
-test_shallow_cache_tree () {
-	printf "SHA  (%d entries, 0 subtrees)\n" $(git ls-files|wc -l) >expect &&
+generate_expected_cache_tree_rec () {
+	dir="$1${1:+/}" &&
+	parent="$2" &&
+	# ls-files might have foo/bar, foo/bar/baz, and foo/bar/quux
+	# We want to count only foo because it's the only direct child
+	subtrees=$(git ls-files|grep /|cut -d / -f 1|uniq) &&
+	subtree_count=$(echo "$subtrees"|awk -v c=0 '$1 {++c} END {print c}') &&
+	entries=$(git ls-files|wc -l) &&
+	printf "SHA $dir (%d entries, %d subtrees)\n" "$entries" "$subtree_count" &&
+	for subtree in $subtrees
+	do
+		cd "$subtree"
+		generate_expected_cache_tree_rec "$dir$subtree" "$dir" || return 1
+		cd ..
+	done &&
+	dir=$parent
+}
+
+generate_expected_cache_tree () {
+	(
+		generate_expected_cache_tree_rec
+	)
+}
+
+test_cache_tree () {
+	generate_expected_cache_tree >expect &&
 	cmp_cache_tree expect
 }
 
 test_invalid_cache_tree () {
-	echo "invalid                                   (0 subtrees)" >expect &&
-	printf "SHA #(ref)  (%d entries, 0 subtrees)\n" $(git ls-files|wc -l) >>expect &&
-	cmp_cache_tree expect
+	printf "invalid                                  %s ()\n" "" "$@" >expect &&
+	test-dump-cache-tree |
+	sed -n -e "s/[0-9]* subtrees//" -e '/#(ref)/d' -e '/^invalid /p' >actual &&
+	test_cmp expect actual
 }
 
 test_no_cache_tree () {
@@ -32,26 +57,59 @@
 	cmp_cache_tree expect
 }
 
-test_expect_failure 'initial commit has cache-tree' '
+test_expect_success 'initial commit has cache-tree' '
 	test_commit foo &&
-	test_shallow_cache_tree
+	test_cache_tree
 '
 
 test_expect_success 'read-tree HEAD establishes cache-tree' '
 	git read-tree HEAD &&
-	test_shallow_cache_tree
+	test_cache_tree
 '
 
 test_expect_success 'git-add invalidates cache-tree' '
 	test_when_finished "git reset --hard; git read-tree HEAD" &&
-	echo "I changed this file" > foo &&
+	echo "I changed this file" >foo &&
 	git add foo &&
 	test_invalid_cache_tree
 '
 
+test_expect_success 'git-add in subdir invalidates cache-tree' '
+	test_when_finished "git reset --hard; git read-tree HEAD" &&
+	mkdir dirx &&
+	echo "I changed this file" >dirx/foo &&
+	git add dirx/foo &&
+	test_invalid_cache_tree
+'
+
+cat >before <<\EOF
+SHA  (3 entries, 2 subtrees)
+SHA dir1/ (1 entries, 0 subtrees)
+SHA dir2/ (1 entries, 0 subtrees)
+EOF
+
+cat >expect <<\EOF
+invalid                                   (2 subtrees)
+invalid                                  dir1/ (0 subtrees)
+SHA dir2/ (1 entries, 0 subtrees)
+EOF
+
+test_expect_success 'git-add in subdir does not invalidate sibling cache-tree' '
+	git tag no-children &&
+	test_when_finished "git reset --hard no-children; git read-tree HEAD" &&
+	mkdir dir1 dir2 &&
+	test_commit dir1/a &&
+	test_commit dir2/b &&
+	echo "I changed this file" >dir1/a &&
+	cmp_cache_tree before &&
+	echo "I changed this file" >dir1/a &&
+	git add dir1/a &&
+	cmp_cache_tree expect
+'
+
 test_expect_success 'update-index invalidates cache-tree' '
 	test_when_finished "git reset --hard; git read-tree HEAD" &&
-	echo "I changed this file" > foo &&
+	echo "I changed this file" >foo &&
 	git update-index --add foo &&
 	test_invalid_cache_tree
 '
@@ -59,7 +117,7 @@
 test_expect_success 'write-tree establishes cache-tree' '
 	test-scrap-cache-tree &&
 	git write-tree &&
-	test_shallow_cache_tree
+	test_cache_tree
 '
 
 test_expect_success 'test-scrap-cache-tree works' '
@@ -70,24 +128,94 @@
 
 test_expect_success 'second commit has cache-tree' '
 	test_commit bar &&
-	test_shallow_cache_tree
+	test_cache_tree
+'
+
+test_expect_success 'commit --interactive gives cache-tree on partial commit' '
+	cat <<-\EOT >foo.c &&
+	int foo()
+	{
+		return 42;
+	}
+	int bar()
+	{
+		return 42;
+	}
+	EOT
+	git add foo.c &&
+	test_invalid_cache_tree &&
+	git commit -m "add a file" &&
+	test_cache_tree &&
+	cat <<-\EOT >foo.c &&
+	int foo()
+	{
+		return 43;
+	}
+	int bar()
+	{
+		return 44;
+	}
+	EOT
+	(echo p; echo 1; echo; echo s; echo n; echo y; echo q) |
+	git commit --interactive -m foo &&
+	test_cache_tree
+'
+
+test_expect_success 'commit in child dir has cache-tree' '
+	mkdir dir &&
+	>dir/child.t &&
+	git add dir/child.t &&
+	git commit -m dir/child.t &&
+	test_cache_tree
 '
 
 test_expect_success 'reset --hard gives cache-tree' '
 	test-scrap-cache-tree &&
 	git reset --hard &&
-	test_shallow_cache_tree
+	test_cache_tree
 '
 
 test_expect_success 'reset --hard without index gives cache-tree' '
 	rm -f .git/index &&
 	git reset --hard &&
-	test_shallow_cache_tree
+	test_cache_tree
 '
 
-test_expect_failure 'checkout gives cache-tree' '
+test_expect_success 'checkout gives cache-tree' '
+	git tag current &&
 	git checkout HEAD^ &&
-	test_shallow_cache_tree
+	test_cache_tree
+'
+
+test_expect_success 'checkout -b gives cache-tree' '
+	git checkout current &&
+	git checkout -b prev HEAD^ &&
+	test_cache_tree
+'
+
+test_expect_success 'checkout -B gives cache-tree' '
+	git checkout current &&
+	git checkout -B prev HEAD^ &&
+	test_cache_tree
+'
+
+test_expect_success 'partial commit gives cache-tree' '
+	git checkout -b partial no-children &&
+	test_commit one &&
+	test_commit two &&
+	echo "some change" >one.t &&
+	git add one.t &&
+	echo "some other change" >two.t &&
+	git commit two.t -m partial &&
+	test_cache_tree
+'
+
+test_expect_success 'no phantom error when switching trees' '
+	mkdir newdir &&
+	>newdir/one &&
+	git add newdir/one &&
+	git checkout 2>errors &&
+	! test -s errors
 '
 
 test_done
diff --git a/t/t0110-urlmatch-normalization.sh b/t/t0110-urlmatch-normalization.sh
index 8d6096d..410d576 100755
--- a/t/t0110-urlmatch-normalization.sh
+++ b/t/t0110-urlmatch-normalization.sh
@@ -117,7 +117,7 @@
 	test "$(test-urlmatch-normalization -p "X://W?'\!'")" = "x://w/?'\!'"
 '
 
-test_expect_success 'url high-bit escapes' '
+test_expect_success !MINGW 'url high-bit escapes' '
 	test "$(test-urlmatch-normalization -p "$(cat "$tu-1")")" = "x://q/%01%02%03%04%05%06%07%08%0E%0F%10%11%12" &&
 	test "$(test-urlmatch-normalization -p "$(cat "$tu-2")")" = "x://q/%13%14%15%16%17%18%19%1B%1C%1D%1E%1F%7F" &&
 	test "$(test-urlmatch-normalization -p "$(cat "$tu-3")")" = "x://q/%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F" &&
@@ -127,7 +127,10 @@
 	test "$(test-urlmatch-normalization -p "$(cat "$tu-7")")" = "x://q/%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF" &&
 	test "$(test-urlmatch-normalization -p "$(cat "$tu-8")")" = "x://q/%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF" &&
 	test "$(test-urlmatch-normalization -p "$(cat "$tu-9")")" = "x://q/%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF" &&
-	test "$(test-urlmatch-normalization -p "$(cat "$tu-10")")" = "x://q/%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF" &&
+	test "$(test-urlmatch-normalization -p "$(cat "$tu-10")")" = "x://q/%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF"
+'
+
+test_expect_success 'url utf-8 escapes' '
 	test "$(test-urlmatch-normalization -p "$(cat "$tu-11")")" = "x://q/%C2%80%DF%BF%E0%A0%80%EF%BF%BD%F0%90%80%80%F0%AF%BF%BD"
 '
 
diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh
index 538ea5f..57ea5a1 100755
--- a/t/t0300-credentials.sh
+++ b/t/t0300-credentials.sh
@@ -6,7 +6,7 @@
 
 test_expect_success 'setup helper scripts' '
 	cat >dump <<-\EOF &&
-	whoami=`echo $0 | sed s/.*git-credential-//`
+	whoami=$(echo $0 | sed s/.*git-credential-//)
 	echo >&2 "$whoami: $*"
 	OIFS=$IFS
 	IFS==
diff --git a/t/t1000-read-tree-m-3way.sh b/t/t1000-read-tree-m-3way.sh
index babcdd2..a0b79b4 100755
--- a/t/t1000-read-tree-m-3way.sh
+++ b/t/t1000-read-tree-m-3way.sh
@@ -519,10 +519,10 @@
     'rm -f .git/index F16 &&
     echo F16 >F16 &&
     git update-index --add F16 &&
-    tree0=`git write-tree` &&
+    tree0=$(git write-tree) &&
     echo E16 >F16 &&
     git update-index F16 &&
-    tree1=`git write-tree` &&
+    tree1=$(git write-tree) &&
     read_tree_must_succeed -m $tree0 $tree1 $tree1 $tree0 &&
     git ls-files --stage'
 
diff --git a/t/t1001-read-tree-m-2way.sh b/t/t1001-read-tree-m-2way.sh
index 3a24abf..db1b6f5 100755
--- a/t/t1001-read-tree-m-2way.sh
+++ b/t/t1001-read-tree-m-2way.sh
@@ -36,7 +36,7 @@
 }
 
 check_cache_at () {
-	clean_if_empty=`git diff-files -- "$1"`
+	clean_if_empty=$(git diff-files -- "$1")
 	case "$clean_if_empty" in
 	'')  echo "$1: clean" ;;
 	?*)  echo "$1: dirty" ;;
@@ -68,14 +68,14 @@
      echo rezrov >rezrov &&
      echo yomin >yomin &&
      git update-index --add nitfol bozbar rezrov &&
-     treeH=`git write-tree` &&
+     treeH=$(git write-tree) &&
      echo treeH $treeH &&
      git ls-tree $treeH &&
 
      cat bozbar-new >bozbar &&
      git update-index --add frotz bozbar --force-remove rezrov &&
      git ls-files --stage >M.out &&
-     treeM=`git write-tree` &&
+     treeM=$(git write-tree) &&
      echo treeM $treeM &&
      git ls-tree $treeM &&
      git diff-tree $treeH $treeM'
@@ -315,7 +315,7 @@
     'rm -f .git/index &&
      echo DF >DF &&
      git update-index --add DF &&
-     treeDF=`git write-tree` &&
+     treeDF=$(git write-tree) &&
      echo treeDF $treeDF &&
      git ls-tree $treeDF &&
 
@@ -323,7 +323,7 @@
      mkdir DF &&
      echo DF/DF >DF/DF &&
      git update-index --add --remove DF DF/DF &&
-     treeDFDF=`git write-tree` &&
+     treeDFDF=$(git write-tree) &&
      echo treeDFDF $treeDFDF &&
      git ls-tree $treeDFDF &&
      git ls-files --stage >DFDF.out'
@@ -345,7 +345,7 @@
     'rm -f .git/index &&
      : >a &&
      git update-index --add a &&
-     treeM=`git write-tree` &&
+     treeM=$(git write-tree) &&
      echo treeM $treeM &&
      git ls-tree $treeM &&
      git ls-files --stage >treeM.out &&
@@ -354,7 +354,7 @@
      git update-index --remove a &&
      mkdir a &&
      : >a/b &&
-     treeH=`git write-tree` &&
+     treeH=$(git write-tree) &&
      echo treeH $treeH &&
      git ls-tree $treeH'
 
@@ -372,7 +372,7 @@
      mkdir c &&
      : >c/d &&
      git update-index --add a c/d &&
-     treeM=`git write-tree` &&
+     treeM=$(git write-tree) &&
      echo treeM $treeM &&
      git ls-tree $treeM &&
      git ls-files --stage >treeM.out &&
@@ -381,7 +381,7 @@
      mkdir a &&
      : >a/b &&
      git update-index --add --remove a a/b &&
-     treeH=`git write-tree` &&
+     treeH=$(git write-tree) &&
      echo treeH $treeH &&
      git ls-tree $treeH'
 
diff --git a/t/t1002-read-tree-m-u-2way.sh b/t/t1002-read-tree-m-u-2way.sh
index a847709..fed877b 100755
--- a/t/t1002-read-tree-m-u-2way.sh
+++ b/t/t1002-read-tree-m-u-2way.sh
@@ -21,7 +21,7 @@
 }
 
 check_cache_at () {
-	clean_if_empty=`git diff-files -- "$1"`
+	clean_if_empty=$(git diff-files -- "$1")
 	case "$clean_if_empty" in
 	'')  echo "$1: clean" ;;
 	?*)  echo "$1: dirty" ;;
@@ -41,14 +41,14 @@
      echo bozbar >bozbar &&
      echo rezrov >rezrov &&
      git update-index --add nitfol bozbar rezrov &&
-     treeH=`git write-tree` &&
+     treeH=$(git write-tree) &&
      echo treeH $treeH &&
      git ls-tree $treeH &&
 
      echo gnusto >bozbar &&
      git update-index --add frotz bozbar --force-remove rezrov &&
      git ls-files --stage >M.out &&
-     treeM=`git write-tree` &&
+     treeM=$(git write-tree) &&
      echo treeM $treeM &&
      git ls-tree $treeM &&
      sum bozbar frotz nitfol >M.sum &&
@@ -318,7 +318,7 @@
     'rm -f .git/index &&
      echo DF >DF &&
      git update-index --add DF &&
-     treeDF=`git write-tree` &&
+     treeDF=$(git write-tree) &&
      echo treeDF $treeDF &&
      git ls-tree $treeDF &&
 
@@ -326,7 +326,7 @@
      mkdir DF &&
      echo DF/DF >DF/DF &&
      git update-index --add --remove DF DF/DF &&
-     treeDFDF=`git write-tree` &&
+     treeDFDF=$(git write-tree) &&
      echo treeDFDF $treeDFDF &&
      git ls-tree $treeDFDF &&
      git ls-files --stage >DFDF.out'
diff --git a/t/t1003-read-tree-prefix.sh b/t/t1003-read-tree-prefix.sh
index 8c6d67e..b6111cd 100755
--- a/t/t1003-read-tree-prefix.sh
+++ b/t/t1003-read-tree-prefix.sh
@@ -11,7 +11,7 @@
 test_expect_success setup '
 	echo hello >one &&
 	git update-index --add one &&
-	tree=`git write-tree` &&
+	tree=$(git write-tree) &&
 	echo tree is $tree
 '
 
diff --git a/t/t1004-read-tree-m-u-wf.sh b/t/t1004-read-tree-m-u-wf.sh
index 3e72aff..c70cf42 100755
--- a/t/t1004-read-tree-m-u-wf.sh
+++ b/t/t1004-read-tree-m-u-wf.sh
@@ -30,7 +30,7 @@
 
 	echo >file2 master creates untracked file2 &&
 	echo >subdir/file2 master creates untracked subdir/file2 &&
-	if err=`read_tree_u_must_succeed -m -u master side 2>&1`
+	if err=$(read_tree_u_must_succeed -m -u master side 2>&1)
 	then
 		echo should have complained
 		false
@@ -43,7 +43,7 @@
 
 test_expect_success 'two-way with incorrect --exclude-per-directory (1)' '
 
-	if err=`read_tree_u_must_succeed -m --exclude-per-directory=.gitignore master side 2>&1`
+	if err=$(read_tree_u_must_succeed -m --exclude-per-directory=.gitignore master side 2>&1)
 	then
 		echo should have complained
 		false
@@ -54,7 +54,7 @@
 
 test_expect_success 'two-way with incorrect --exclude-per-directory (2)' '
 
-	if err=`read_tree_u_must_succeed -m -u --exclude-per-directory=foo --exclude-per-directory=.gitignore master side 2>&1`
+	if err=$(read_tree_u_must_succeed -m -u --exclude-per-directory=foo --exclude-per-directory=.gitignore master side 2>&1)
 	then
 		echo should have complained
 		false
@@ -95,7 +95,7 @@
 	git checkout master &&
 	echo >file3 file three created in master, untracked &&
 	echo >subdir/file3 file three created in master, untracked &&
-	if err=`read_tree_u_must_succeed -m -u branch-point master side 2>&1`
+	if err=$(read_tree_u_must_succeed -m -u branch-point master side 2>&1)
 	then
 		echo should have complained
 		false
diff --git a/t/t1013-read-tree-submodule.sh b/t/t1013-read-tree-submodule.sh
new file mode 100755
index 0000000..20526ae
--- /dev/null
+++ b/t/t1013-read-tree-submodule.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+test_description='read-tree can handle submodules'
+
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-submodule-update.sh
+
+test_submodule_switch "git read-tree -u -m"
+
+test_submodule_forced_switch "git read-tree -u --reset"
+
+test_done
diff --git a/t/t1020-subdirectory.sh b/t/t1020-subdirectory.sh
index 6902320..2edb4f2 100755
--- a/t/t1020-subdirectory.sh
+++ b/t/t1020-subdirectory.sh
@@ -20,27 +20,27 @@
 
 test_expect_success 'update-index and ls-files' '
 	git update-index --add one &&
-	case "`git ls-files`" in
+	case "$(git ls-files)" in
 	one) echo pass one ;;
 	*) echo bad one; exit 1 ;;
 	esac &&
 	(
 		cd dir &&
 		git update-index --add two &&
-		case "`git ls-files`" in
+		case "$(git ls-files)" in
 		two) echo pass two ;;
 		*) echo bad two; exit 1 ;;
 		esac
 	) &&
-	case "`git ls-files`" in
+	case "$(git ls-files)" in
 	dir/two"$LF"one) echo pass both ;;
 	*) echo bad; exit 1 ;;
 	esac
 '
 
 test_expect_success 'cat-file' '
-	two=`git ls-files -s dir/two` &&
-	two=`expr "$two" : "[0-7]* \\([0-9a-f]*\\)"` &&
+	two=$(git ls-files -s dir/two) &&
+	two=$(expr "$two" : "[0-7]* \\([0-9a-f]*\\)") &&
 	echo "$two" &&
 	git cat-file -p "$two" >actual &&
 	cmp dir/two actual &&
@@ -55,18 +55,18 @@
 test_expect_success 'diff-files' '
 	echo a >>one &&
 	echo d >>dir/two &&
-	case "`git diff-files --name-only`" in
+	case "$(git diff-files --name-only)" in
 	dir/two"$LF"one) echo pass top ;;
 	*) echo bad top; exit 1 ;;
 	esac &&
 	# diff should not omit leading paths
 	(
 		cd dir &&
-		case "`git diff-files --name-only`" in
+		case "$(git diff-files --name-only)" in
 		dir/two"$LF"one) echo pass subdir ;;
 		*) echo bad subdir; exit 1 ;;
 		esac &&
-		case "`git diff-files --name-only .`" in
+		case "$(git diff-files --name-only .)" in
 		dir/two) echo pass subdir limited ;;
 		*) echo bad subdir limited; exit 1 ;;
 		esac
@@ -74,11 +74,11 @@
 '
 
 test_expect_success 'write-tree' '
-	top=`git write-tree` &&
+	top=$(git write-tree) &&
 	echo $top &&
 	(
 		cd dir &&
-		sub=`git write-tree` &&
+		sub=$(git write-tree) &&
 		echo $sub &&
 		test "z$top" = "z$sub"
 	)
@@ -96,7 +96,7 @@
 
 test_expect_success 'read-tree' '
 	rm -f one dir/two &&
-	tree=`git write-tree` &&
+	tree=$(git write-tree) &&
 	read_tree_u_must_succeed --reset -u "$tree" &&
 	cmp one original.one &&
 	cmp dir/two original.two &&
@@ -118,7 +118,7 @@
 	)
 '
 
-test_expect_success NOT_MINGW '!alias expansion' '
+test_expect_success !MINGW '!alias expansion' '
 	pwd >expect &&
 	(
 		git config alias.test-alias-directory !pwd &&
diff --git a/t/t1050-large.sh b/t/t1050-large.sh
index fd10528..f5a9119 100755
--- a/t/t1050-large.sh
+++ b/t/t1050-large.sh
@@ -13,7 +13,7 @@
 	echo X | dd of=large2 bs=1k seek=2000 &&
 	echo X | dd of=large3 bs=1k seek=2000 &&
 	echo Y | dd of=huge bs=1k seek=2500 &&
-	GIT_ALLOC_LIMIT=1500 &&
+	GIT_ALLOC_LIMIT=1500k &&
 	export GIT_ALLOC_LIMIT
 '
 
@@ -112,6 +112,20 @@
 	git diff --raw HEAD^
 '
 
+test_expect_success 'diff --stat' '
+	git diff --stat HEAD^ HEAD
+'
+
+test_expect_success 'diff' '
+	git diff HEAD^ HEAD >actual &&
+	grep "Binary files.*differ" actual
+'
+
+test_expect_success 'diff --cached' '
+	git diff --cached HEAD^ >actual &&
+	grep "Binary files.*differ" actual
+'
+
 test_expect_success 'hash-object' '
 	git hash-object large1
 '
@@ -131,7 +145,7 @@
 '
 
 test_expect_success 'index-pack' '
-	git clone file://"`pwd`"/.git foo &&
+	git clone file://"$(pwd)"/.git foo &&
 	GIT_DIR=non-existent git index-pack --strict --verify foo/.git/objects/pack/*.pack
 '
 
@@ -140,7 +154,7 @@
 '
 
 test_expect_success 'pack-objects with large loose object' '
-	SHA1=`git hash-object huge` &&
+	SHA1=$(git hash-object huge) &&
 	test_create_repo loose &&
 	echo $SHA1 | git pack-objects --stdout |
 		GIT_ALLOC_LIMIT=0 GIT_DIR=loose/.git git unpack-objects &&
@@ -163,4 +177,10 @@
 	git archive --format=zip HEAD >/dev/null
 '
 
+test_expect_success 'fsck' '
+	test_must_fail git fsck 2>err &&
+	n=$(grep "error: attempting to allocate .* over limit" err | wc -l) &&
+	test "$n" -gt 1
+'
+
 test_done
diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh
index 58cd543..938fc8b 100755
--- a/t/t1300-repo-config.sh
+++ b/t/t1300-repo-config.sh
@@ -824,14 +824,14 @@
 	trailingtilde = foo~
 EOF
 
-test_expect_success NOT_MINGW 'set --path' '
+test_expect_success !MINGW 'set --path' '
 	rm -f .git/config &&
 	git config --path path.home "~/" &&
 	git config --path path.normal "/dev/null" &&
 	git config --path path.trailingtilde "foo~" &&
 	test_cmp expect .git/config'
 
-if test_have_prereq NOT_MINGW && test "${HOME+set}"
+if test_have_prereq !MINGW && test "${HOME+set}"
 then
 	test_set_prereq HOMEVAR
 fi
@@ -854,7 +854,7 @@
 foo~
 EOF
 
-test_expect_success NOT_MINGW 'get --path copes with unset $HOME' '
+test_expect_success !MINGW 'get --path copes with unset $HOME' '
 	(
 		unset HOME;
 		test_must_fail git config --get --path path.home \
@@ -1010,6 +1010,17 @@
 	test_must_fail git -c name=value config core.name
 '
 
+# We just need a type-specifier here that cares about the
+# distinction internally between a NULL boolean and a real
+# string (because most of git's internal parsers do care).
+# Using "--path" works, but we do not otherwise care about
+# its semantics.
+test_expect_success 'git -c can represent empty string' '
+	echo >expect &&
+	git -c foo.empty= config --path foo.empty >actual &&
+	test_cmp expect actual
+'
+
 test_expect_success 'key sanity-checking' '
 	test_must_fail git config foo=bar &&
 	test_must_fail git config foo=.bar &&
@@ -1158,4 +1169,14 @@
 	test_cmp expect .git/config
 '
 
+test_expect_success POSIXPERM,PERL 'preserves existing permissions' '
+	chmod 0600 .git/config &&
+	git config imap.pass Hunter2 &&
+	perl -e \
+	  "die q(badset) if ((stat(q(.git/config)))[2] & 07777) != 0600" &&
+	git config --rename-section imap pop &&
+	perl -e \
+	  "die q(badrename) if ((stat(q(.git/config)))[2] & 07777) != 0600"
+'
+
 test_done
diff --git a/t/t1303-wacky-config.sh b/t/t1303-wacky-config.sh
index 3a2c819..3b92083 100755
--- a/t/t1303-wacky-config.sh
+++ b/t/t1303-wacky-config.sh
@@ -111,4 +111,24 @@
 	test_must_fail git config section.key
 '
 
+test_expect_success '--add appends new value after existing empty value' '
+	cat >expect <<-\EOF &&
+
+
+	fool
+	roll
+	EOF
+	cp .git/config .git/config.old &&
+	test_when_finished "mv .git/config.old .git/config" &&
+	cat >.git/config <<-\EOF &&
+	[foo]
+		baz
+		baz =
+		baz = fool
+	EOF
+	git config --add foo.baz roll &&
+	git config --get-all foo.baz >output &&
+	test_cmp expect output
+'
+
 test_done
diff --git a/t/t1304-default-acl.sh b/t/t1304-default-acl.sh
index 79045ab..f5422f1 100755
--- a/t/t1304-default-acl.sh
+++ b/t/t1304-default-acl.sh
@@ -26,7 +26,7 @@
 
 if test -z "$LOGNAME"
 then
-	LOGNAME=$USER
+	LOGNAME="${USER:-$(id -u -n)}"
 fi
 
 check_perms_and_acl () {
diff --git a/t/t1308-config-set.sh b/t/t1308-config-set.sh
new file mode 100755
index 0000000..91235b7
--- /dev/null
+++ b/t/t1308-config-set.sh
@@ -0,0 +1,221 @@
+#!/bin/sh
+
+test_description='Test git config-set API in different settings'
+
+. ./test-lib.sh
+
+# 'check_config get_* section.key value' verifies that the entry for
+# section.key is 'value'
+check_config () {
+	if test "$1" = expect_code
+	then
+		expect_code="$2" && shift && shift
+	else
+		expect_code=0
+	fi &&
+	op=$1 key=$2 && shift && shift &&
+	if test $# != 0
+	then
+		printf "%s\n" "$@"
+	fi >expect &&
+	test_expect_code $expect_code test-config "$op" "$key" >actual &&
+	test_cmp expect actual
+}
+
+test_expect_success 'setup default config' '
+	cat >.git/config <<-\EOF
+	[case]
+		penguin = very blue
+		Movie = BadPhysics
+		UPPERCASE = true
+		MixedCase = true
+		my =
+		foo
+		baz = sam
+	[Cores]
+		WhatEver = Second
+		baz = bar
+	[cores]
+		baz = bat
+	[CORES]
+		baz = ball
+	[my "Foo bAr"]
+		hi = mixed-case
+	[my "FOO BAR"]
+		hi = upper-case
+	[my "foo bar"]
+		hi = lower-case
+	[case]
+		baz = bat
+		baz = hask
+	[lamb]
+		chop = 65
+		head = none
+	[goat]
+		legs = 4
+		head = true
+		skin = false
+		nose = 1
+		horns
+	EOF
+'
+
+test_expect_success 'get value for a simple key' '
+	check_config get_value case.penguin "very blue"
+'
+
+test_expect_success 'get value for a key with value as an empty string' '
+	check_config get_value case.my ""
+'
+
+test_expect_success 'get value for a key with value as NULL' '
+	check_config get_value case.foo "(NULL)"
+'
+
+test_expect_success 'upper case key' '
+	check_config get_value case.UPPERCASE "true" &&
+	check_config get_value case.uppercase "true"
+'
+
+test_expect_success 'mixed case key' '
+	check_config get_value case.MixedCase "true" &&
+	check_config get_value case.MIXEDCASE "true" &&
+	check_config get_value case.mixedcase "true"
+'
+
+test_expect_success 'key and value with mixed case' '
+	check_config get_value case.Movie "BadPhysics"
+'
+
+test_expect_success 'key with case sensitive subsection' '
+	check_config get_value "my.Foo bAr.hi" "mixed-case" &&
+	check_config get_value "my.FOO BAR.hi" "upper-case" &&
+	check_config get_value "my.foo bar.hi" "lower-case"
+'
+
+test_expect_success 'key with case insensitive section header' '
+	check_config get_value cores.baz "ball" &&
+	check_config get_value Cores.baz "ball" &&
+	check_config get_value CORES.baz "ball" &&
+	check_config get_value coreS.baz "ball"
+'
+
+test_expect_success 'key with case insensitive section header & variable' '
+	check_config get_value CORES.BAZ "ball" &&
+	check_config get_value cores.baz "ball" &&
+	check_config get_value cores.BaZ "ball" &&
+	check_config get_value cOreS.bAz "ball"
+'
+
+test_expect_success 'find value with misspelled key' '
+	check_config expect_code 1 get_value "my.fOo Bar.hi" "Value not found for \"my.fOo Bar.hi\""
+'
+
+test_expect_success 'find value with the highest priority' '
+	check_config get_value case.baz "hask"
+'
+
+test_expect_success 'find integer value for a key' '
+	check_config get_int lamb.chop 65
+'
+
+test_expect_success 'find string value for a key' '
+	check_config get_string case.baz hask &&
+	check_config expect_code 1 get_string case.ba "Value not found for \"case.ba\""
+'
+
+test_expect_success 'check line error when NULL string is queried' '
+	test_expect_code 128 test-config get_string case.foo 2>result &&
+	test_i18ngrep "fatal: .*case\.foo.*\.git/config.*line 7" result
+'
+
+test_expect_success 'find integer if value is non parse-able' '
+	check_config expect_code 128 get_int lamb.head
+'
+
+test_expect_success 'find bool value for the entered key' '
+	check_config get_bool goat.head 1 &&
+	check_config get_bool goat.skin 0 &&
+	check_config get_bool goat.nose 1 &&
+	check_config get_bool goat.horns 1 &&
+	check_config get_bool goat.legs 1
+'
+
+test_expect_success 'find multiple values' '
+	check_config get_value_multi case.baz sam bat hask
+'
+
+test_expect_success 'find value from a configset' '
+	cat >config2 <<-\EOF &&
+	[case]
+		baz = lama
+	[my]
+		new = silk
+	[case]
+		baz = ball
+	EOF
+	echo silk >expect &&
+	test-config configset_get_value my.new config2 .git/config >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'find value with highest priority from a configset' '
+	echo hask >expect &&
+	test-config configset_get_value case.baz config2 .git/config >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'find value_list for a key from a configset' '
+	cat >except <<-\EOF &&
+	sam
+	bat
+	hask
+	lama
+	ball
+	EOF
+	test-config configset_get_value case.baz config2 .git/config >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'proper error on non-existent files' '
+	echo "Error (-1) reading configuration file non-existent-file." >expect &&
+	test_expect_code 2 test-config configset_get_value foo.bar non-existent-file 2>actual &&
+	test_cmp expect actual
+'
+
+test_expect_success POSIXPERM,SANITY 'proper error on non-accessible files' '
+	chmod -r .git/config &&
+	test_when_finished "chmod +r .git/config" &&
+	echo "Error (-1) reading configuration file .git/config." >expect &&
+	test_expect_code 2 test-config configset_get_value foo.bar .git/config 2>actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'proper error on error in default config files' '
+	cp .git/config .git/config.old &&
+	test_when_finished "mv .git/config.old .git/config" &&
+	echo "[" >>.git/config &&
+	echo "fatal: bad config file line 34 in .git/config" >expect &&
+	test_expect_code 128 test-config get_value foo.bar 2>actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'proper error on error in custom config files' '
+	echo "[" >>syntax-error &&
+	echo "fatal: bad config file line 1 in syntax-error" >expect &&
+	test_expect_code 128 test-config configset_get_value foo.bar syntax-error 2>actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'check line errors for malformed values' '
+	mv .git/config .git/config.old &&
+	test_when_finished "mv .git/config.old .git/config" &&
+	cat >.git/config <<-\EOF &&
+	[alias]
+		br
+	EOF
+	test_expect_code 128 git br 2>result &&
+	test_i18ngrep "fatal: .*alias\.br.*\.git/config.*line 2" result
+'
+
+test_done
diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh
index e130c52..7b4707b 100755
--- a/t/t1400-update-ref.sh
+++ b/t/t1400-update-ref.sh
@@ -110,6 +110,32 @@
 cp -f .git/HEAD.orig .git/HEAD
 git update-ref -d $m
 
+test_expect_success 'update-ref -d is not confused by self-reference' '
+	git symbolic-ref refs/heads/self refs/heads/self &&
+	test_when_finished "rm -f .git/refs/heads/self" &&
+	test_path_is_file .git/refs/heads/self &&
+	test_must_fail git update-ref -d refs/heads/self &&
+	test_path_is_file .git/refs/heads/self
+'
+
+test_expect_success 'update-ref --no-deref -d can delete self-reference' '
+	git symbolic-ref refs/heads/self refs/heads/self &&
+	test_when_finished "rm -f .git/refs/heads/self" &&
+	test_path_is_file .git/refs/heads/self &&
+	git update-ref --no-deref -d refs/heads/self &&
+	test_path_is_missing .git/refs/heads/self
+'
+
+test_expect_success 'update-ref --no-deref -d can delete reference to bad ref' '
+	>.git/refs/heads/bad &&
+	test_when_finished "rm -f .git/refs/heads/bad" &&
+	git symbolic-ref refs/heads/ref-to-bad refs/heads/bad &&
+	test_when_finished "rm -f .git/refs/heads/ref-to-bad" &&
+	test_path_is_file .git/refs/heads/ref-to-bad &&
+	git update-ref --no-deref -d refs/heads/ref-to-bad &&
+	test_path_is_missing .git/refs/heads/ref-to-bad
+'
+
 test_expect_success '(not) create HEAD with old sha1' "
 	test_must_fail git update-ref HEAD $A $B
 "
@@ -235,7 +261,7 @@
 	'rm -f o e &&
 	 git rev-parse --verify "master@{2005-05-26 23:33:01}" >o 2>e &&
 	 test '"$B"' = $(cat o) &&
-	 test "warning: Log .git/logs/'"$m has gap after $gd"'." = "$(cat e)"'
+	 test "warning: Log for ref '"$m has gap after $gd"'." = "$(cat e)"'
 test_expect_success \
 	'Query "master@{2005-05-26 23:38:00}" (middle of history)' \
 	'rm -f o e &&
@@ -253,7 +279,7 @@
 	'rm -f o e &&
 	 git rev-parse --verify "master@{2005-05-28}" >o 2>e &&
 	 test '"$D"' = $(cat o) &&
-	 test "warning: Log .git/logs/'"$m unexpectedly ended on $ld"'." = "$(cat e)"'
+	 test "warning: Log for ref '"$m unexpectedly ended on $ld"'." = "$(cat e)"'
 
 
 rm -f .git/$m .git/logs/$m expect
@@ -350,88 +376,76 @@
 	grep "fatal: unknown command: unknown $a" err
 '
 
-test_expect_success 'stdin fails on badly quoted input' '
+test_expect_success 'stdin fails on unbalanced quotes' '
 	echo "create $a \"master" >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
 	grep "fatal: badly quoted argument: \\\"master" err
 '
 
-test_expect_success 'stdin fails on arguments not separated by space' '
+test_expect_success 'stdin fails on invalid escape' '
+	echo "create $a \"ma\zter\"" >stdin &&
+	test_must_fail git update-ref --stdin <stdin 2>err &&
+	grep "fatal: badly quoted argument: \\\"ma\\\\zter\\\"" err
+'
+
+test_expect_success 'stdin fails on junk after quoted argument' '
 	echo "create \"$a\"master" >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: expected SP but got: master" err
+	grep "fatal: unexpected character after quoted argument: \\\"$a\\\"master" err
 '
 
 test_expect_success 'stdin fails create with no ref' '
 	echo "create " >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: create line missing <ref>" err
-'
-
-test_expect_success 'stdin fails create with bad ref name' '
-	echo "create ~a $m" >stdin &&
-	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: invalid ref format: ~a" err
+	grep "fatal: create: missing <ref>" err
 '
 
 test_expect_success 'stdin fails create with no new value' '
 	echo "create $a" >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: create $a missing <newvalue>" err
+	grep "fatal: create $a: missing <newvalue>" err
 '
 
 test_expect_success 'stdin fails create with too many arguments' '
 	echo "create $a $m $m" >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: create $a has extra input:  $m" err
+	grep "fatal: create $a: extra input:  $m" err
 '
 
 test_expect_success 'stdin fails update with no ref' '
 	echo "update " >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: update line missing <ref>" err
-'
-
-test_expect_success 'stdin fails update with bad ref name' '
-	echo "update ~a $m" >stdin &&
-	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: invalid ref format: ~a" err
+	grep "fatal: update: missing <ref>" err
 '
 
 test_expect_success 'stdin fails update with no new value' '
 	echo "update $a" >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: update $a missing <newvalue>" err
+	grep "fatal: update $a: missing <newvalue>" err
 '
 
 test_expect_success 'stdin fails update with too many arguments' '
 	echo "update $a $m $m $m" >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: update $a has extra input:  $m" err
+	grep "fatal: update $a: extra input:  $m" err
 '
 
 test_expect_success 'stdin fails delete with no ref' '
 	echo "delete " >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: delete line missing <ref>" err
-'
-
-test_expect_success 'stdin fails delete with bad ref name' '
-	echo "delete ~a $m" >stdin &&
-	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: invalid ref format: ~a" err
+	grep "fatal: delete: missing <ref>" err
 '
 
 test_expect_success 'stdin fails delete with too many arguments' '
 	echo "delete $a $m $m" >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: delete $a has extra input:  $m" err
+	grep "fatal: delete $a: extra input:  $m" err
 '
 
 test_expect_success 'stdin fails verify with too many arguments' '
 	echo "verify $a $m $m" >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: verify $a has extra input:  $m" err
+	grep "fatal: verify $a: extra input:  $m" err
 '
 
 test_expect_success 'stdin fails option with unknown name' '
@@ -458,6 +472,24 @@
 	test_cmp expect actual
 '
 
+test_expect_success 'stdin succeeds with quoted argument' '
+	git update-ref -d $a &&
+	echo "create $a \"$m\"" >stdin &&
+	git update-ref --stdin <stdin &&
+	git rev-parse $m >expect &&
+	git rev-parse $a >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'stdin succeeds with escaped character' '
+	git update-ref -d $a &&
+	echo "create $a \"ma\\163ter\"" >stdin &&
+	git update-ref --stdin <stdin &&
+	git rev-parse $m >expect &&
+	git rev-parse $a >actual &&
+	test_cmp expect actual
+'
+
 test_expect_success 'stdin update ref creates with zero old value' '
 	echo "update $b $m $Z" >stdin &&
 	git update-ref --stdin <stdin &&
@@ -494,21 +526,21 @@
 test_expect_success 'stdin update ref fails with bad old value' '
 	echo "update $c $m does-not-exist" >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: invalid old value for ref $c: does-not-exist" err &&
+	grep "fatal: update $c: invalid <oldvalue>: does-not-exist" err &&
 	test_must_fail git rev-parse --verify -q $c
 '
 
 test_expect_success 'stdin create ref fails with bad new value' '
 	echo "create $c does-not-exist" >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: invalid new value for ref $c: does-not-exist" err &&
+	grep "fatal: create $c: invalid <newvalue>: does-not-exist" err &&
 	test_must_fail git rev-parse --verify -q $c
 '
 
 test_expect_success 'stdin create ref fails with zero new value' '
 	echo "create $c " >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: create $c given zero new value" err &&
+	grep "fatal: create $c: zero <newvalue>" err &&
 	test_must_fail git rev-parse --verify -q $c
 '
 
@@ -532,7 +564,7 @@
 test_expect_success 'stdin delete ref fails with zero old value' '
 	echo "delete $a " >stdin &&
 	test_must_fail git update-ref --stdin <stdin 2>err &&
-	grep "fatal: delete $a given zero old value" err &&
+	grep "fatal: delete $a: zero <oldvalue>" err &&
 	git rev-parse $m >expect &&
 	git rev-parse $a >actual &&
 	test_cmp expect actual
@@ -673,19 +705,13 @@
 test_expect_success 'stdin -z fails create with no ref' '
 	printf $F "create " >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: create line missing <ref>" err
-'
-
-test_expect_success 'stdin -z fails create with bad ref name' '
-	printf $F "create ~a " "$m" >stdin &&
-	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: invalid ref format: ~a " err
+	grep "fatal: create: missing <ref>" err
 '
 
 test_expect_success 'stdin -z fails create with no new value' '
 	printf $F "create $a" >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: create $a missing <newvalue>" err
+	grep "fatal: create $a: unexpected end of input when reading <newvalue>" err
 '
 
 test_expect_success 'stdin -z fails create with too many arguments' '
@@ -697,25 +723,33 @@
 test_expect_success 'stdin -z fails update with no ref' '
 	printf $F "update " >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: update line missing <ref>" err
+	grep "fatal: update: missing <ref>" err
 '
 
-test_expect_success 'stdin -z fails update with bad ref name' '
-	printf $F "update ~a" "$m" >stdin &&
+test_expect_success 'stdin -z fails update with too few args' '
+	printf $F "update $a" "$m" >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: invalid ref format: ~a" err
+	grep "fatal: update $a: unexpected end of input when reading <oldvalue>" err
+'
+
+test_expect_success 'stdin -z emits warning with empty new value' '
+	git update-ref $a $m &&
+	printf $F "update $a" "" "" >stdin &&
+	git update-ref -z --stdin <stdin 2>err &&
+	grep "warning: update $a: missing <newvalue>, treating as zero" err &&
+	test_must_fail git rev-parse --verify -q $a
 '
 
 test_expect_success 'stdin -z fails update with no new value' '
 	printf $F "update $a" >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: update $a missing <newvalue>" err
+	grep "fatal: update $a: unexpected end of input when reading <newvalue>" err
 '
 
 test_expect_success 'stdin -z fails update with no old value' '
 	printf $F "update $a" "$m" >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: update $a missing \\[<oldvalue>\\] NUL" err
+	grep "fatal: update $a: unexpected end of input when reading <oldvalue>" err
 '
 
 test_expect_success 'stdin -z fails update with too many arguments' '
@@ -727,19 +761,13 @@
 test_expect_success 'stdin -z fails delete with no ref' '
 	printf $F "delete " >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: delete line missing <ref>" err
-'
-
-test_expect_success 'stdin -z fails delete with bad ref name' '
-	printf $F "delete ~a" "$m" >stdin &&
-	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: invalid ref format: ~a" err
+	grep "fatal: delete: missing <ref>" err
 '
 
 test_expect_success 'stdin -z fails delete with no old value' '
 	printf $F "delete $a" >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: delete $a missing \\[<oldvalue>\\] NUL" err
+	grep "fatal: delete $a: unexpected end of input when reading <oldvalue>" err
 '
 
 test_expect_success 'stdin -z fails delete with too many arguments' '
@@ -757,7 +785,7 @@
 test_expect_success 'stdin -z fails verify with no old value' '
 	printf $F "verify $a" >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: verify $a missing \\[<oldvalue>\\] NUL" err
+	grep "fatal: verify $a: unexpected end of input when reading <oldvalue>" err
 '
 
 test_expect_success 'stdin -z fails option with unknown name' '
@@ -816,7 +844,7 @@
 test_expect_success 'stdin -z update ref fails with bad old value' '
 	printf $F "update $c" "$m" "does-not-exist" >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: invalid old value for ref $c: does-not-exist" err &&
+	grep "fatal: update $c: invalid <oldvalue>: does-not-exist" err &&
 	test_must_fail git rev-parse --verify -q $c
 '
 
@@ -834,14 +862,14 @@
 	git update-ref -d "$c" &&
 	printf $F "create $c" "does-not-exist" >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: invalid new value for ref $c: does-not-exist" err &&
+	grep "fatal: create $c: invalid <newvalue>: does-not-exist" err &&
 	test_must_fail git rev-parse --verify -q $c
 '
 
-test_expect_success 'stdin -z create ref fails with zero new value' '
+test_expect_success 'stdin -z create ref fails with empty new value' '
 	printf $F "create $c" "" >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: create $c given zero new value" err &&
+	grep "fatal: create $c: missing <newvalue>" err &&
 	test_must_fail git rev-parse --verify -q $c
 '
 
@@ -865,7 +893,7 @@
 test_expect_success 'stdin -z delete ref fails with zero old value' '
 	printf $F "delete $a" "$Z" >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
-	grep "fatal: delete $a given zero old value" err &&
+	grep "fatal: delete $a: zero <oldvalue>" err &&
 	git rev-parse $m >expect &&
 	git rev-parse $a >actual &&
 	test_cmp expect actual
@@ -923,7 +951,7 @@
 
 test_expect_success 'stdin -z update refs fails with wrong old value' '
 	git update-ref $c $m &&
-	printf $F "update $a" "$m" "$m" "update $b" "$m" "$m" "update $c" "" "$Z" >stdin &&
+	printf $F "update $a" "$m" "$m" "update $b" "$m" "$m" "update $c" "$m" "$Z" >stdin &&
 	test_must_fail git update-ref -z --stdin <stdin 2>err &&
 	grep "fatal: Cannot lock the ref '"'"'$c'"'"'" err &&
 	git rev-parse $m >expect &&
diff --git a/t/t1402-check-ref-format.sh b/t/t1402-check-ref-format.sh
index 1a5a5f3..e5dc62e 100755
--- a/t/t1402-check-ref-format.sh
+++ b/t/t1402-check-ref-format.sh
@@ -7,7 +7,7 @@
 valid_ref() {
 	prereq=
 	case $1 in
-	[A-Z]*)
+	[A-Z!]*)
 		prereq=$1
 		shift
 	esac
@@ -19,7 +19,7 @@
 invalid_ref() {
 	prereq=
 	case $1 in
-	[A-Z]*)
+	[A-Z!]*)
 		prereq=$1
 		shift
 	esac
@@ -30,17 +30,17 @@
 }
 
 invalid_ref ''
-invalid_ref NOT_MINGW '/'
-invalid_ref NOT_MINGW '/' --allow-onelevel
-invalid_ref NOT_MINGW '/' --normalize
-invalid_ref NOT_MINGW '/' '--allow-onelevel --normalize'
+invalid_ref !MINGW '/'
+invalid_ref !MINGW '/' --allow-onelevel
+invalid_ref !MINGW '/' --normalize
+invalid_ref !MINGW '/' '--allow-onelevel --normalize'
 valid_ref 'foo/bar/baz'
 valid_ref 'foo/bar/baz' --normalize
 invalid_ref 'refs///heads/foo'
 valid_ref 'refs///heads/foo' --normalize
 invalid_ref 'heads/foo/'
-invalid_ref NOT_MINGW '/heads/foo'
-valid_ref NOT_MINGW '/heads/foo' --normalize
+invalid_ref !MINGW '/heads/foo'
+valid_ref !MINGW '/heads/foo' --normalize
 invalid_ref '///heads/foo'
 valid_ref '///heads/foo' --normalize
 invalid_ref './foo'
@@ -48,6 +48,7 @@
 invalid_ref 'foo/./bar'
 invalid_ref 'foo/bar/.'
 invalid_ref '.refs/foo'
+invalid_ref 'refs/heads/foo.'
 invalid_ref 'heads/foo..bar'
 invalid_ref 'heads/foo?bar'
 valid_ref 'foo./bar'
@@ -119,14 +120,14 @@
 invalid_ref "$ref" '--refspec-pattern --allow-onelevel'
 
 ref='/foo'
-invalid_ref NOT_MINGW "$ref"
-invalid_ref NOT_MINGW "$ref" --allow-onelevel
-invalid_ref NOT_MINGW "$ref" --refspec-pattern
-invalid_ref NOT_MINGW "$ref" '--refspec-pattern --allow-onelevel'
-invalid_ref NOT_MINGW "$ref" --normalize
-valid_ref NOT_MINGW "$ref" '--allow-onelevel --normalize'
-invalid_ref NOT_MINGW "$ref" '--refspec-pattern --normalize'
-valid_ref NOT_MINGW "$ref" '--refspec-pattern --allow-onelevel --normalize'
+invalid_ref !MINGW "$ref"
+invalid_ref !MINGW "$ref" --allow-onelevel
+invalid_ref !MINGW "$ref" --refspec-pattern
+invalid_ref !MINGW "$ref" '--refspec-pattern --allow-onelevel'
+invalid_ref !MINGW "$ref" --normalize
+valid_ref !MINGW "$ref" '--allow-onelevel --normalize'
+invalid_ref !MINGW "$ref" '--refspec-pattern --normalize'
+valid_ref !MINGW "$ref" '--refspec-pattern --allow-onelevel --normalize'
 
 test_expect_success "check-ref-format --branch @{-1}" '
 	T=$(git write-tree) &&
@@ -161,7 +162,7 @@
 valid_ref_normalized() {
 	prereq=
 	case $1 in
-	[A-Z]*)
+	[A-Z!]*)
 		prereq=$1
 		shift
 	esac
@@ -173,7 +174,7 @@
 invalid_ref_normalized() {
 	prereq=
 	case $1 in
-	[A-Z]*)
+	[A-Z!]*)
 		prereq=$1
 		shift
 	esac
@@ -184,10 +185,10 @@
 
 valid_ref_normalized 'heads/foo' 'heads/foo'
 valid_ref_normalized 'refs///heads/foo' 'refs/heads/foo'
-valid_ref_normalized NOT_MINGW '/heads/foo' 'heads/foo'
+valid_ref_normalized !MINGW '/heads/foo' 'heads/foo'
 valid_ref_normalized '///heads/foo' 'heads/foo'
 invalid_ref_normalized 'foo'
-invalid_ref_normalized NOT_MINGW '/foo'
+invalid_ref_normalized !MINGW '/foo'
 invalid_ref_normalized 'heads/foo/../bar'
 invalid_ref_normalized 'heads/./foo'
 invalid_ref_normalized 'heads\foo'
diff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh
index 3b657c4..8cf4461 100755
--- a/t/t1410-reflog.sh
+++ b/t/t1410-reflog.sh
@@ -245,6 +245,14 @@
 
 '
 
+test_expect_success 'checkout should not delete log for packed ref' '
+	test $(git reflog master | wc -l) = 4 &&
+	git branch foo &&
+	git pack-refs --all &&
+	git checkout foo &&
+	test $(git reflog master | wc -l) = 4
+'
+
 test_expect_success 'stale dirs do not cause d/f conflicts (reflogs on)' '
 	test_when_finished "git branch -d one || git branch -d one/two" &&
 
diff --git a/t/t1413-reflog-detach.sh b/t/t1413-reflog-detach.sh
new file mode 100755
index 0000000..c730600
--- /dev/null
+++ b/t/t1413-reflog-detach.sh
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+test_description='Test reflog interaction with detached HEAD'
+. ./test-lib.sh
+
+reset_state () {
+	git checkout master &&
+	cp saved_reflog .git/logs/HEAD
+}
+
+test_expect_success setup '
+	test_tick &&
+	git commit --allow-empty -m initial &&
+	git branch side &&
+	test_tick &&
+	git commit --allow-empty -m second &&
+	cat .git/logs/HEAD >saved_reflog
+'
+
+test_expect_success baseline '
+	reset_state &&
+	git rev-parse master master^ >expect &&
+	git log -g --format=%H >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'switch to branch' '
+	reset_state &&
+	git rev-parse side master master^ >expect &&
+	git checkout side &&
+	git log -g --format=%H >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'detach to other' '
+	reset_state &&
+	git rev-parse master side master master^ >expect &&
+	git checkout side &&
+	git checkout master^0 &&
+	git log -g --format=%H >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'detach to self' '
+	reset_state &&
+	git rev-parse master master master^ >expect &&
+	git checkout master^0 &&
+	git log -g --format=%H >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'attach to self' '
+	reset_state &&
+	git rev-parse master master master master^ >expect &&
+	git checkout master^0 &&
+	git checkout master &&
+	git log -g --format=%H >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'attach to other' '
+	reset_state &&
+	git rev-parse side master master master^ >expect &&
+	git checkout master^0 &&
+	git checkout side &&
+	git log -g --format=%H >actual &&
+	test_cmp expect actual
+'
+
+test_done
diff --git a/t/t1430-bad-ref-name.sh b/t/t1430-bad-ref-name.sh
new file mode 100755
index 0000000..468e856
--- /dev/null
+++ b/t/t1430-bad-ref-name.sh
@@ -0,0 +1,207 @@
+#!/bin/sh
+
+test_description='Test handling of ref names that check-ref-format rejects'
+. ./test-lib.sh
+
+test_expect_success setup '
+	test_commit one &&
+	test_commit two
+'
+
+test_expect_success 'fast-import: fail on invalid branch name ".badbranchname"' '
+	test_when_finished "rm -f .git/objects/pack_* .git/objects/index_*" &&
+	cat >input <<-INPUT_END &&
+		commit .badbranchname
+		committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+		data <<COMMIT
+		corrupt
+		COMMIT
+
+		from refs/heads/master
+
+	INPUT_END
+	test_must_fail git fast-import <input
+'
+
+test_expect_success 'fast-import: fail on invalid branch name "bad[branch]name"' '
+	test_when_finished "rm -f .git/objects/pack_* .git/objects/index_*" &&
+	cat >input <<-INPUT_END &&
+		commit bad[branch]name
+		committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+		data <<COMMIT
+		corrupt
+		COMMIT
+
+		from refs/heads/master
+
+	INPUT_END
+	test_must_fail git fast-import <input
+'
+
+test_expect_success 'git branch shows 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 >output &&
+	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 &&
+	! 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 &&
+	! grep -e "broken\.\.\.ref" output
+'
+
+test_expect_success 'branch -D cannot delete non-ref in .git dir' '
+	echo precious >.git/my-private-file &&
+	echo precious >expect &&
+	test_must_fail git branch -D ../../my-private-file &&
+	test_cmp expect .git/my-private-file
+'
+
+test_expect_success 'branch -D cannot delete absolute path' '
+	git branch -f extra &&
+	test_must_fail git branch -D "$(pwd)/.git/refs/heads/extra" &&
+	test_cmp_rev HEAD extra
+'
+
+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 &&
+	! grep -e "broken\.\.\.ref" output
+'
+
+test_expect_success 'branch -m cannot rename to a bad ref name' '
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	test_might_fail git branch -D goodref &&
+	git branch goodref &&
+	test_must_fail git branch -m goodref broken...ref &&
+	test_cmp_rev master goodref &&
+	git branch >output &&
+	! grep -e "broken\.\.\.ref" output
+'
+
+test_expect_failure 'branch -m can rename from a bad ref name' '
+	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	git branch -m broken...ref renamed &&
+	test_cmp_rev master renamed &&
+	git branch >output &&
+	! 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 &&
+	! grep -e "broken\.\.\.ref" output
+'
+
+test_expect_failure 'push --mirror can delete badly named ref' '
+	top=$(pwd) &&
+	git init src &&
+	git init dest &&
+
+	(
+		cd src &&
+		test_commit one
+	) &&
+	(
+		cd dest &&
+		test_commit two &&
+		git checkout --detach &&
+		cp .git/refs/heads/master .git/refs/heads/broken...ref
+	) &&
+	git -C src push --mirror "file://$top/dest" &&
+	git -C dest branch >output &&
+	! grep -e "broken\.\.\.ref" output
+'
+
+test_expect_success 'rev-parse skips symref pointing to broken name' '
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	git branch shadow one &&
+	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+	git symbolic-ref refs/tags/shadow refs/heads/broken...ref &&
+
+	git rev-parse --verify one >expect &&
+	git rev-parse --verify shadow >actual 2>err &&
+	test_cmp expect actual &&
+	test_i18ngrep "ignoring.*refs/tags/shadow" err
+'
+
+test_expect_success 'update-ref --no-deref -d can delete reference to broken name' '
+	git symbolic-ref refs/heads/badname refs/heads/broken...ref &&
+	test_when_finished "rm -f .git/refs/heads/badname" &&
+	test_path_is_file .git/refs/heads/badname &&
+	git update-ref --no-deref -d refs/heads/badname &&
+	test_path_is_missing .git/refs/heads/badname
+'
+
+test_expect_success 'update-ref -d can delete broken name' '
+	cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+	test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+	git update-ref -d refs/heads/broken...ref &&
+	git branch >output &&
+	! grep -e "broken\.\.\.ref" output
+'
+
+test_expect_success 'update-ref -d cannot delete non-ref in .git dir' '
+	echo precious >.git/my-private-file &&
+	echo precious >expect &&
+	test_must_fail git update-ref -d my-private-file &&
+	test_cmp expect .git/my-private-file
+'
+
+test_expect_success 'update-ref -d cannot delete absolute path' '
+	git branch -f extra &&
+	test_must_fail git update-ref -d "$(pwd)/.git/refs/heads/extra" &&
+	test_cmp_rev HEAD extra
+'
+
+test_expect_success 'update-ref --stdin fails create with bad ref name' '
+	echo "create ~a refs/heads/master" >stdin &&
+	test_must_fail git update-ref --stdin <stdin 2>err &&
+	grep "fatal: invalid ref format: ~a" err
+'
+
+test_expect_success 'update-ref --stdin fails update with bad ref name' '
+	echo "update ~a refs/heads/master" >stdin &&
+	test_must_fail git update-ref --stdin <stdin 2>err &&
+	grep "fatal: invalid ref format: ~a" err
+'
+
+test_expect_success 'update-ref --stdin fails delete with bad ref name' '
+	echo "delete ~a refs/heads/master" >stdin &&
+	test_must_fail git update-ref --stdin <stdin 2>err &&
+	grep "fatal: invalid ref format: ~a" err
+'
+
+test_expect_success 'update-ref --stdin -z fails create with bad ref name' '
+	printf "%s\0" "create ~a " refs/heads/master >stdin &&
+	test_must_fail git update-ref -z --stdin <stdin 2>err &&
+	grep "fatal: invalid ref format: ~a " err
+'
+
+test_expect_success 'update-ref --stdin -z fails update with bad ref name' '
+	printf "%s\0" "update ~a" refs/heads/master "" >stdin &&
+	test_must_fail git update-ref -z --stdin <stdin 2>err &&
+	grep "fatal: invalid ref format: ~a" err
+'
+
+test_expect_success 'update-ref --stdin -z fails delete with bad ref name' '
+	printf "%s\0" "delete ~a" refs/heads/master >stdin &&
+	test_must_fail git update-ref -z --stdin <stdin 2>err &&
+	grep "fatal: invalid ref format: ~a" err
+'
+
+test_done
diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh
index 8c739c9..019fddd 100755
--- a/t/t1450-fsck.sh
+++ b/t/t1450-fsck.sh
@@ -69,7 +69,7 @@
 	git update-ref refs/heads/bogus $cmt &&
 	test_when_finished "git update-ref -d refs/heads/bogus" &&
 
-	test_might_fail git fsck 2>out &&
+	test_must_fail git fsck 2>out &&
 	cat out &&
 	grep "$sha.*corrupt" out
 '
@@ -101,7 +101,7 @@
 	test_when_finished "remove_object $new" &&
 	git update-ref refs/heads/bogus "$new" &&
 	test_when_finished "git update-ref -d refs/heads/bogus" &&
-	git fsck 2>out &&
+	test_must_fail git fsck 2>out &&
 	cat out &&
 	grep "error in commit $new" out
 '
@@ -113,7 +113,7 @@
 	test_when_finished "remove_object $new" &&
 	git update-ref refs/heads/bogus "$new" &&
 	test_when_finished "git update-ref -d refs/heads/bogus" &&
-	git fsck 2>out &&
+	test_must_fail git fsck 2>out &&
 	cat out &&
 	grep "error in commit $new.* - bad name" out
 '
@@ -125,7 +125,7 @@
 	test_when_finished "remove_object $new" &&
 	git update-ref refs/heads/bogus "$new" &&
 	test_when_finished "git update-ref -d refs/heads/bogus" &&
-	git fsck 2>out &&
+	test_must_fail git fsck 2>out &&
 	cat out &&
 	grep "error in commit $new.* - missing email" out
 '
@@ -137,7 +137,7 @@
 	test_when_finished "remove_object $new" &&
 	git update-ref refs/heads/bogus "$new" &&
 	test_when_finished "git update-ref -d refs/heads/bogus" &&
-	git fsck 2>out &&
+	test_must_fail git fsck 2>out &&
 	cat out &&
 	grep "error in commit $new" out
 '
@@ -151,11 +151,31 @@
 	test_when_finished "remove_object $new" &&
 	git update-ref refs/heads/bogus "$new" &&
 	test_when_finished "git update-ref -d refs/heads/bogus" &&
-	git fsck 2>out &&
+	test_must_fail git fsck 2>out &&
 	cat out &&
 	grep "error in commit $new.*integer overflow" out
 '
 
+test_expect_success 'malformatted tree object' '
+	test_when_finished "git update-ref -d refs/tags/wrong" &&
+	test_when_finished "remove_object \$T" &&
+	T=$(
+		GIT_INDEX_FILE=test-index &&
+		export GIT_INDEX_FILE &&
+		rm -f test-index &&
+		>x &&
+		git add x &&
+		T=$(git write-tree) &&
+		(
+			git cat-file tree $T &&
+			git cat-file tree $T
+		) |
+		git hash-object -w -t tree --stdin
+	) &&
+	test_must_fail git fsck 2>out &&
+	grep "error in tree .*contains duplicate file entries" out
+'
+
 test_expect_success 'tag pointing to nonexistent' '
 	cat >invalid-tag <<-\EOF &&
 	object ffffffffffffffffffffffffffffffffffffffff
@@ -194,6 +214,44 @@
 	test_must_fail git fsck --tags
 '
 
+test_expect_success 'tag with incorrect tag name & missing tagger' '
+	sha=$(git rev-parse HEAD) &&
+	cat >wrong-tag <<-EOF &&
+	object $sha
+	type commit
+	tag wrong name format
+
+	This is an invalid tag.
+	EOF
+
+	tag=$(git hash-object -t tag -w --stdin <wrong-tag) &&
+	test_when_finished "remove_object $tag" &&
+	echo $tag >.git/refs/tags/wrong &&
+	test_when_finished "git update-ref -d refs/tags/wrong" &&
+	git fsck --tags 2>out &&
+	grep "invalid .tag. name" out &&
+	grep "expected .tagger. line" out
+'
+
+test_expect_success 'tag with bad tagger' '
+	sha=$(git rev-parse HEAD) &&
+	cat >wrong-tag <<-EOF &&
+	object $sha
+	type commit
+	tag not-quite-wrong
+	tagger Bad Tagger Name
+
+	This is an invalid tag.
+	EOF
+
+	tag=$(git hash-object --literally -t tag -w --stdin <wrong-tag) &&
+	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 &&
+	grep "error in tag .*: invalid author/committer" out
+'
+
 test_expect_success 'cleaned up' '
 	git fsck >actual 2>&1 &&
 	test_cmp empty actual
@@ -282,4 +340,60 @@
 	)
 '
 
+# create a static test repo which is broken by omitting
+# one particular object ($1, which is looked up via rev-parse
+# in the new repository).
+create_repo_missing () {
+	rm -rf missing &&
+	git init missing &&
+	(
+		cd missing &&
+		git commit -m one --allow-empty &&
+		mkdir subdir &&
+		echo content >subdir/file &&
+		git add subdir/file &&
+		git commit -m two &&
+		unrelated=$(echo unrelated | git hash-object --stdin -w) &&
+		git tag -m foo tag $unrelated &&
+		sha1=$(git rev-parse --verify "$1") &&
+		path=$(echo $sha1 | sed 's|..|&/|') &&
+		rm .git/objects/$path
+	)
+}
+
+test_expect_success 'fsck notices missing blob' '
+	create_repo_missing HEAD:subdir/file &&
+	test_must_fail git -C missing fsck
+'
+
+test_expect_success 'fsck notices missing subtree' '
+	create_repo_missing HEAD:subdir &&
+	test_must_fail git -C missing fsck
+'
+
+test_expect_success 'fsck notices missing root tree' '
+	create_repo_missing HEAD^{tree} &&
+	test_must_fail git -C missing fsck
+'
+
+test_expect_success 'fsck notices missing parent' '
+	create_repo_missing HEAD^ &&
+	test_must_fail git -C missing fsck
+'
+
+test_expect_success 'fsck notices missing tagged object' '
+	create_repo_missing tag^{blob} &&
+	test_must_fail git -C missing fsck
+'
+
+test_expect_success 'fsck notices ref pointing to missing commit' '
+	create_repo_missing HEAD &&
+	test_must_fail git -C missing fsck
+'
+
+test_expect_success 'fsck notices ref pointing to missing tag' '
+	create_repo_missing tag &&
+	test_must_fail git -C missing fsck
+'
+
 test_done
diff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh
index 922423e..ebe7c3b 100755
--- a/t/t1502-rev-parse-parseopt.sh
+++ b/t/t1502-rev-parse-parseopt.sh
@@ -19,7 +19,7 @@
 |    -d, --data[=...]      short and long option with an optional argument
 |
 |Argument hints
-|    -b <arg>              short option required argument
+|    -B <arg>              short option required argument
 |    --bar2 <arg>          long option required argument
 |    -e, --fuz <with-space>
 |                          short and long option required argument
@@ -51,7 +51,7 @@
 |d,data?   short and long option with an optional argument
 |
 | Argument hints
-|b=arg     short option required argument
+|B=arg     short option required argument
 |bar2=arg  long option required argument
 |e,fuz=with-space  short and long option required argument
 |s?some    short option optional argument
diff --git a/t/t1503-rev-parse-verify.sh b/t/t1503-rev-parse-verify.sh
index 813cc1b..823fe1d 100755
--- a/t/t1503-rev-parse-verify.sh
+++ b/t/t1503-rev-parse-verify.sh
@@ -72,15 +72,42 @@
 
 test_expect_success 'fails silently when using -q' '
 	test_must_fail git rev-parse --verify --quiet 2>error &&
-	test -z "$(cat error)" &&
+	test_must_be_empty error &&
 	test_must_fail git rev-parse -q --verify foo 2>error &&
-	test -z "$(cat error)" &&
+	test_must_be_empty error &&
 	test_must_fail git rev-parse --verify -q HEAD bar 2>error &&
-	test -z "$(cat error)" &&
+	test_must_be_empty error &&
 	test_must_fail git rev-parse --quiet --verify baz HEAD 2>error &&
-	test -z "$(cat error)" &&
+	test_must_be_empty error &&
 	test_must_fail git rev-parse -q --verify $HASH2 HEAD 2>error &&
-	test -z "$(cat error)"
+	test_must_be_empty error
+'
+
+test_expect_success 'fails silently when using -q with deleted reflogs' '
+	ref=$(git rev-parse HEAD) &&
+	: >.git/logs/refs/test &&
+	git update-ref -m "message for refs/test" refs/test "$ref" &&
+	git reflog delete --updateref --rewrite refs/test@{0} &&
+	test_must_fail git rev-parse -q --verify refs/test@{0} >error 2>&1 &&
+	test_must_be_empty error
+'
+
+test_expect_success 'fails silently when using -q with not enough reflogs' '
+	ref=$(git rev-parse HEAD) &&
+	: >.git/logs/refs/test2 &&
+	git update-ref -m "message for refs/test2" refs/test2 "$ref" &&
+	test_must_fail git rev-parse -q --verify refs/test2@{999} >error 2>&1 &&
+	test_must_be_empty error
+'
+
+test_expect_success 'succeeds silently with -q and reflogs that do not go far back enough in time' '
+	ref=$(git rev-parse HEAD) &&
+	: >.git/logs/refs/test3 &&
+	git update-ref -m "message for refs/test3" refs/test3 "$ref" &&
+	git rev-parse -q --verify refs/test3@{1.year.ago} >actual 2>error &&
+	test_must_be_empty error &&
+	echo "$ref" >expect &&
+	test_cmp expect actual
 '
 
 test_expect_success 'no stdout output on error' '
diff --git a/t/t1700-split-index.sh b/t/t1700-split-index.sh
new file mode 100755
index 0000000..94fb473
--- /dev/null
+++ b/t/t1700-split-index.sh
@@ -0,0 +1,194 @@
+#!/bin/sh
+
+test_description='split index mode tests'
+
+. ./test-lib.sh
+
+# We need total control of index splitting here
+sane_unset GIT_TEST_SPLIT_INDEX
+
+test_expect_success 'enable split index' '
+	git update-index --split-index &&
+	test-dump-split-index .git/index >actual &&
+	cat >expect <<EOF &&
+own 8299b0bcd1ac364e5f1d7768efb62fa2da79a339
+base 39d890139ee5356c7ef572216cebcd27aa41f9df
+replacements:
+deletions:
+EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'add one file' '
+	: >one &&
+	git update-index --add one &&
+	git ls-files --stage >ls-files.actual &&
+	cat >ls-files.expect <<EOF &&
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0	one
+EOF
+	test_cmp ls-files.expect ls-files.actual &&
+
+	test-dump-split-index .git/index | sed "/^own/d" >actual &&
+	cat >expect <<EOF &&
+base 39d890139ee5356c7ef572216cebcd27aa41f9df
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0	one
+replacements:
+deletions:
+EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'disable split index' '
+	git update-index --no-split-index &&
+	git ls-files --stage >ls-files.actual &&
+	cat >ls-files.expect <<EOF &&
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0	one
+EOF
+	test_cmp ls-files.expect ls-files.actual &&
+
+	BASE=`test-dump-split-index .git/index | grep "^own" | sed "s/own/base/"` &&
+	test-dump-split-index .git/index | sed "/^own/d" >actual &&
+	cat >expect <<EOF &&
+not a split index
+EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'enable split index again, "one" now belongs to base index"' '
+	git update-index --split-index &&
+	git ls-files --stage >ls-files.actual &&
+	cat >ls-files.expect <<EOF &&
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0	one
+EOF
+	test_cmp ls-files.expect ls-files.actual &&
+
+	test-dump-split-index .git/index | sed "/^own/d" >actual &&
+	cat >expect <<EOF &&
+$BASE
+replacements:
+deletions:
+EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'modify original file, base index untouched' '
+	echo modified >one &&
+	git update-index one &&
+	git ls-files --stage >ls-files.actual &&
+	cat >ls-files.expect <<EOF &&
+100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0	one
+EOF
+	test_cmp ls-files.expect ls-files.actual &&
+
+	test-dump-split-index .git/index | sed "/^own/d" >actual &&
+	q_to_tab >expect <<EOF &&
+$BASE
+100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
+replacements: 0
+deletions:
+EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'add another file, which stays index' '
+	: >two &&
+	git update-index --add two &&
+	git ls-files --stage >ls-files.actual &&
+	cat >ls-files.expect <<EOF &&
+100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0	one
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0	two
+EOF
+	test_cmp ls-files.expect ls-files.actual &&
+
+	test-dump-split-index .git/index | sed "/^own/d" >actual &&
+	q_to_tab >expect <<EOF &&
+$BASE
+100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0	two
+replacements: 0
+deletions:
+EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'remove file not in base index' '
+	git update-index --force-remove two &&
+	git ls-files --stage >ls-files.actual &&
+	cat >ls-files.expect <<EOF &&
+100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0	one
+EOF
+	test_cmp ls-files.expect ls-files.actual &&
+
+	test-dump-split-index .git/index | sed "/^own/d" >actual &&
+	q_to_tab >expect <<EOF &&
+$BASE
+100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
+replacements: 0
+deletions:
+EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'remove file in base index' '
+	git update-index --force-remove one &&
+	git ls-files --stage >ls-files.actual &&
+	cat >ls-files.expect <<EOF &&
+EOF
+	test_cmp ls-files.expect ls-files.actual &&
+
+	test-dump-split-index .git/index | sed "/^own/d" >actual &&
+	cat >expect <<EOF &&
+$BASE
+replacements:
+deletions: 0
+EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'add original file back' '
+	: >one &&
+	git update-index --add one &&
+	git ls-files --stage >ls-files.actual &&
+	cat >ls-files.expect <<EOF &&
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0	one
+EOF
+	test_cmp ls-files.expect ls-files.actual &&
+
+	test-dump-split-index .git/index | sed "/^own/d" >actual &&
+	cat >expect <<EOF &&
+$BASE
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0	one
+replacements:
+deletions: 0
+EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'add new file' '
+	: >two &&
+	git update-index --add two &&
+	git ls-files --stage >actual &&
+	cat >expect <<EOF &&
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0	one
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0	two
+EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'unify index, two files remain' '
+	git update-index --no-split-index &&
+	git ls-files --stage >ls-files.actual &&
+	cat >ls-files.expect <<EOF &&
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0	one
+100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0	two
+EOF
+	test_cmp ls-files.expect ls-files.actual
+
+	test-dump-split-index .git/index | sed "/^own/d" >actual &&
+	cat >expect <<EOF &&
+not a split index
+EOF
+	test_cmp expect actual
+'
+
+test_done
diff --git a/t/t2013-checkout-submodule.sh b/t/t2013-checkout-submodule.sh
index 06b18f8..6847f75 100755
--- a/t/t2013-checkout-submodule.sh
+++ b/t/t2013-checkout-submodule.sh
@@ -3,6 +3,7 @@
 test_description='checkout can handle submodules'
 
 . ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-submodule-update.sh
 
 test_expect_success 'setup' '
 	mkdir submodule &&
@@ -62,4 +63,8 @@
 	! test -s actual
 '
 
+test_submodule_switch "git checkout"
+
+test_submodule_forced_switch "git checkout -f"
+
 test_done
diff --git a/t/t2104-update-index-skip-worktree.sh b/t/t2104-update-index-skip-worktree.sh
index 29c1fb1..cc830da 100755
--- a/t/t2104-update-index-skip-worktree.sh
+++ b/t/t2104-update-index-skip-worktree.sh
@@ -7,6 +7,8 @@
 
 . ./test-lib.sh
 
+sane_unset GIT_TEST_SPLIT_INDEX
+
 test_set_index_version 3
 
 cat >expect.full <<EOF
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index ac31b71..432921b 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -285,6 +285,15 @@
 	test_i18ncmp expect actual
 '
 
+test_expect_success 'deleting a self-referential symref' '
+	git symbolic-ref refs/heads/self-reference refs/heads/self-reference &&
+	test_path_is_file .git/refs/heads/self-reference &&
+	echo "Deleted branch self-reference (was refs/heads/self-reference)." >expect &&
+	git branch -d self-reference >actual &&
+	test_path_is_missing .git/refs/heads/self-reference &&
+	test_i18ncmp expect actual
+'
+
 test_expect_success 'renaming a symref is not allowed' '
 	git symbolic-ref refs/heads/master2 refs/heads/master &&
 	test_must_fail git branch -m master2 master3 &&
diff --git a/t/t3201-branch-contains.sh b/t/t3201-branch-contains.sh
index 141b061..912a663 100755
--- a/t/t3201-branch-contains.sh
+++ b/t/t3201-branch-contains.sh
@@ -130,4 +130,33 @@
 
 '
 
+# We want to set up a case where the walk for the tracking info
+# of one branch crosses the tip of another branch (and make sure
+# that the latter walk does not mess up our flag to see if it was
+# merged).
+#
+# Here "topic" tracks "master" with one extra commit, and "zzz" points to the
+# same tip as master The name "zzz" must come alphabetically after "topic"
+# as we process them in that order.
+test_expect_success 'branch --merged with --verbose' '
+	git branch --track topic master &&
+	git branch zzz topic &&
+	git checkout topic &&
+	test_commit foo &&
+	git branch --merged topic >actual &&
+	cat >expect <<-\EOF &&
+	  master
+	* topic
+	  zzz
+	EOF
+	test_cmp expect actual &&
+	git branch --verbose --merged topic >actual &&
+	cat >expect <<-\EOF &&
+	  master c77a0a9 second on master
+	* topic  2c939f4 [ahead 1] foo
+	  zzz    c77a0a9 second on master
+	EOF
+	test_cmp expect actual
+'
+
 test_done
diff --git a/t/t3210-pack-refs.sh b/t/t3210-pack-refs.sh
index 1a2080e..aa9eb3a 100755
--- a/t/t3210-pack-refs.sh
+++ b/t/t3210-pack-refs.sh
@@ -11,7 +11,9 @@
 '
 . ./test-lib.sh
 
-echo '[core] logallrefupdates = true' >>.git/config
+test_expect_success 'enable reflogs' '
+	git config core.logallrefupdates true
+'
 
 test_expect_success \
     'prepare a trivial repository' \
@@ -151,4 +153,38 @@
 	test_cmp /dev/null result
 '
 
+test_expect_success 'pack ref directly below refs/' '
+	git update-ref refs/top HEAD &&
+	git pack-refs --all --prune &&
+	grep refs/top .git/packed-refs &&
+	test_path_is_missing .git/refs/top
+'
+
+test_expect_success 'disable reflogs' '
+	git config core.logallrefupdates false &&
+	rm -rf .git/logs
+'
+
+test_expect_success 'create packed foo/bar/baz branch' '
+	git branch foo/bar/baz &&
+	git pack-refs --all --prune &&
+	test_path_is_missing .git/refs/heads/foo/bar/baz &&
+	test_path_is_missing .git/logs/refs/heads/foo/bar/baz
+'
+
+test_expect_success 'notice d/f conflict with existing directory' '
+	test_must_fail git branch foo &&
+	test_must_fail git branch foo/bar
+'
+
+test_expect_success 'existing directory reports concrete ref' '
+	test_must_fail git branch foo 2>stderr &&
+	grep refs/heads/foo/bar/baz stderr
+'
+
+test_expect_success 'notice d/f conflict with existing ref' '
+	test_must_fail git branch foo/bar/baz/extra &&
+	test_must_fail git branch foo/bar/baz/lots/of/extra/components
+'
+
 test_done
diff --git a/t/t3302-notes-index-expensive.sh b/t/t3302-notes-index-expensive.sh
index e35d781..7217c5e 100755
--- a/t/t3302-notes-index-expensive.sh
+++ b/t/t3302-notes-index-expensive.sh
@@ -7,53 +7,49 @@
 
 . ./test-lib.sh
 
-test_set_prereq NOT_EXPENSIVE
-test -n "$GIT_NOTES_TIMING_TESTS" && test_set_prereq EXPENSIVE
-test -x /usr/bin/time && test_set_prereq USR_BIN_TIME
-
 create_repo () {
 	number_of_commits=$1
 	nr=0
 	test -d .git || {
 	git init &&
 	(
-		while [ $nr -lt $number_of_commits ]; do
+		while test $nr -lt $number_of_commits
+		do
 			nr=$(($nr+1))
 			mark=$(($nr+$nr))
 			notemark=$(($mark+1))
 			test_tick &&
-			cat <<INPUT_END &&
-commit refs/heads/master
-mark :$mark
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-commit #$nr
-COMMIT
+			cat <<-INPUT_END &&
+			commit refs/heads/master
+			mark :$mark
+			committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+			data <<COMMIT
+			commit #$nr
+			COMMIT
 
-M 644 inline file
-data <<EOF
-file in commit #$nr
-EOF
+			M 644 inline file
+			data <<EOF
+			file in commit #$nr
+			EOF
 
-blob
-mark :$notemark
-data <<EOF
-note for commit #$nr
-EOF
+			blob
+			mark :$notemark
+			data <<EOF
+			note for commit #$nr
+			EOF
 
-INPUT_END
-
-			echo "N :$notemark :$mark" >> note_commit
+			INPUT_END
+			echo "N :$notemark :$mark" >>note_commit
 		done &&
 		test_tick &&
-		cat <<INPUT_END &&
-commit refs/notes/commits
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-notes
-COMMIT
+		cat <<-INPUT_END &&
+		commit refs/notes/commits
+		committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+		data <<COMMIT
+		notes
+		COMMIT
 
-INPUT_END
+		INPUT_END
 
 		cat note_commit
 	) |
@@ -65,62 +61,74 @@
 test_notes () {
 	count=$1 &&
 	git config core.notesRef refs/notes/commits &&
-	git log | grep "^    " > output &&
+	git log | grep "^    " >output &&
 	i=$count &&
-	while [ $i -gt 0 ]; do
+	while test $i -gt 0
+	do
 		echo "    commit #$i" &&
 		echo "    note for commit #$i" &&
-		i=$(($i-1));
-	done > expect &&
+		i=$(($i-1))
+	done >expect &&
 	test_cmp expect output
 }
 
-cat > time_notes << \EOF
+write_script time_notes <<\EOF
 	mode=$1
 	i=1
-	while [ $i -lt $2 ]; do
+	while test $i -lt $2
+	do
 		case $1 in
 		no-notes)
-			GIT_NOTES_REF=non-existing; export GIT_NOTES_REF
-		;;
+			GIT_NOTES_REF=non-existing
+			export GIT_NOTES_REF
+			;;
 		notes)
 			unset GIT_NOTES_REF
-		;;
+			;;
 		esac
-		git log >/dev/null
+		git log
 		i=$(($i+1))
-	done
+	done >/dev/null
 EOF
 
 time_notes () {
 	for mode in no-notes notes
 	do
 		echo $mode
-		/usr/bin/time "$SHELL_PATH" ../time_notes $mode $1
+		/usr/bin/time ../time_notes $mode $1
 	done
 }
 
 do_tests () {
-	pr=$1
-	count=$2
+	count=$1 pr=${2-}
 
-	test_expect_success $pr 'setup / mkdir' '
-		mkdir $count &&
-		cd $count
+	test_expect_success $pr "setup $count" '
+		mkdir "$count" &&
+		(
+			cd "$count" &&
+			create_repo "$count"
+		)
 	'
 
-	test_expect_success $pr "setup $count" "create_repo $count"
+	test_expect_success $pr 'notes work' '
+		(
+			cd "$count" &&
+			test_notes "$count"
+		)
+	'
 
-	test_expect_success $pr 'notes work' "test_notes $count"
-
-	test_expect_success USR_BIN_TIME,$pr 'notes timing with /usr/bin/time' "time_notes 100"
-
-	test_expect_success $pr 'teardown / cd ..' 'cd ..'
+	test_expect_success "USR_BIN_TIME${pr:+,$pr}" 'notes timing with /usr/bin/time' '
+		(
+			cd "$count" &&
+			time_notes 100
+		)
+	'
 }
 
-do_tests NOT_EXPENSIVE 10
-for count in 100 1000 10000; do
-	do_tests EXPENSIVE $count
+do_tests 10
+for count in 100 1000 10000
+do
+	do_tests "$count" EXPENSIVE
 done
 
 test_done
diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh
index 80e0a95..47b5682 100755
--- a/t/t3400-rebase.sh
+++ b/t/t3400-rebase.sh
@@ -169,6 +169,29 @@
 	test_cmp expect actual
 '
 
+test_expect_success 'cherry-picked commits and fork-point work together' '
+	git checkout default-base &&
+	echo Amended >A &&
+	git commit -a --no-edit --amend &&
+	test_commit B B &&
+	test_commit new_B B "New B" &&
+	test_commit C C &&
+	git checkout default &&
+	git reset --hard default-base@{4} &&
+	test_commit D D &&
+	git cherry-pick -2 default-base^ &&
+	test_commit final_B B "Final B" &&
+	git rebase &&
+	echo Amended >expect &&
+	test_cmp A expect &&
+	echo "Final B" >expect &&
+	test_cmp B expect &&
+	echo C >expect &&
+	test_cmp C expect &&
+	echo D >expect &&
+	test_cmp D expect
+'
+
 test_expect_success 'rebase -q is quiet' '
 	git checkout -b quiet topic &&
 	git rebase -q master >output.out 2>&1 &&
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index c0023a5..8197ed2 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -67,6 +67,14 @@
 SHELL=
 export SHELL
 
+test_expect_success 'rebase --keep-empty' '
+	git checkout -b emptybranch master &&
+	git commit --allow-empty -m "empty" &&
+	git rebase --keep-empty -i HEAD~2 &&
+	git log --oneline >actual &&
+	test_line_count = 6 actual
+'
+
 test_expect_success 'rebase -i with the exec command' '
 	git checkout master &&
 	(
diff --git a/t/t3419-rebase-patch-id.sh b/t/t3419-rebase-patch-id.sh
index e70ac10..217dd79 100755
--- a/t/t3419-rebase-patch-id.sh
+++ b/t/t3419-rebase-patch-id.sh
@@ -4,12 +4,7 @@
 
 . ./test-lib.sh
 
-test_set_prereq NOT_EXPENSIVE
-test -n "$GIT_PATCHID_TIMING_TESTS" && test_set_prereq EXPENSIVE
-test -x /usr/bin/time && test_set_prereq USR_BIN_TIME
-
-count()
-{
+count () {
 	i=0
 	while test $i -lt $1
 	do
@@ -18,8 +13,7 @@
 	done
 }
 
-scramble()
-{
+scramble () {
 	i=0
 	while read x
 	do
@@ -28,12 +22,11 @@
 			echo "$x"
 		fi
 		i=$((($i+1) % 10))
-	done < "$1" > "$1.new"
+	done <"$1" >"$1.new"
 	mv -f "$1.new" "$1"
 }
 
-run()
-{
+run () {
 	echo \$ "$@"
 	/usr/bin/time "$@" >/dev/null
 }
@@ -43,10 +36,8 @@
 	git tag root
 '
 
-do_tests()
-{
-	pr=$1
-	nlines=$2
+do_tests () {
+	nlines=$1 pr=${2-}
 
 	test_expect_success $pr "setup: $nlines lines" "
 		rm -f .gitattributes &&
@@ -103,7 +94,7 @@
 	"
 }
 
-do_tests NOT_EXPENSIVE 500
-do_tests EXPENSIVE 50000
+do_tests 500
+do_tests 50000 EXPENSIVE
 
 test_done
diff --git a/t/t3426-rebase-submodule.sh b/t/t3426-rebase-submodule.sh
new file mode 100755
index 0000000..d5b896d
--- /dev/null
+++ b/t/t3426-rebase-submodule.sh
@@ -0,0 +1,46 @@
+#!/bin/sh
+
+test_description='rebase can handle submodules'
+
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-submodule-update.sh
+. "$TEST_DIRECTORY"/lib-rebase.sh
+
+git_rebase () {
+	git status -su >expect &&
+	ls -1pR * >>expect &&
+	git checkout -b ours HEAD &&
+	echo x >>file1 &&
+	git add file1 &&
+	git commit -m add_x &&
+	git revert HEAD &&
+	git status -su >actual &&
+	ls -1pR * >>actual &&
+	test_cmp expect actual &&
+	git rebase "$1"
+}
+
+test_submodule_switch "git_rebase"
+
+git_rebase_interactive () {
+	git status -su >expect &&
+	ls -1pR * >>expect &&
+	git checkout -b ours HEAD &&
+	echo x >>file1 &&
+	git add file1 &&
+	git commit -m add_x &&
+	git revert HEAD &&
+	git status -su >actual &&
+	ls -1pR * >>actual &&
+	test_cmp expect actual &&
+	set_fake_editor &&
+	echo "fake-editor.sh" >.git/info/exclude &&
+	git rebase -i "$1"
+}
+
+KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1
+# The real reason "replace directory with submodule" fails is because a
+# directory "sub1" exists, but we reuse the suppression added for merge here
+test_submodule_switch "git_rebase_interactive"
+
+test_done
diff --git a/t/t3508-cherry-pick-many-commits.sh b/t/t3508-cherry-pick-many-commits.sh
index 19c99d7..b457333 100755
--- a/t/t3508-cherry-pick-many-commits.sh
+++ b/t/t3508-cherry-pick-many-commits.sh
@@ -65,12 +65,15 @@
 	cat <<-\EOF >expected &&
 	[master OBJID] second
 	 Author: A U Thor <author@example.com>
+	 Date: Thu Apr 7 15:14:13 2005 -0700
 	 1 file changed, 1 insertion(+)
 	[master OBJID] third
 	 Author: A U Thor <author@example.com>
+	 Date: Thu Apr 7 15:15:13 2005 -0700
 	 1 file changed, 1 insertion(+)
 	[master OBJID] fourth
 	 Author: A U Thor <author@example.com>
+	 Date: Thu Apr 7 15:16:13 2005 -0700
 	 1 file changed, 1 insertion(+)
 	EOF
 
@@ -98,14 +101,17 @@
 	Trying simple merge.
 	[master OBJID] second
 	 Author: A U Thor <author@example.com>
+	 Date: Thu Apr 7 15:14:13 2005 -0700
 	 1 file changed, 1 insertion(+)
 	Trying simple merge.
 	[master OBJID] third
 	 Author: A U Thor <author@example.com>
+	 Date: Thu Apr 7 15:15:13 2005 -0700
 	 1 file changed, 1 insertion(+)
 	Trying simple merge.
 	[master OBJID] fourth
 	 Author: A U Thor <author@example.com>
+	 Date: Thu Apr 7 15:16:13 2005 -0700
 	 1 file changed, 1 insertion(+)
 	EOF
 
diff --git a/t/t3512-cherry-pick-submodule.sh b/t/t3512-cherry-pick-submodule.sh
new file mode 100755
index 0000000..6863b7b
--- /dev/null
+++ b/t/t3512-cherry-pick-submodule.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+test_description='cherry-pick can handle submodules'
+
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-submodule-update.sh
+
+KNOWN_FAILURE_CHERRY_PICK_SEES_EMPTY_COMMIT=1
+KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1
+KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1
+test_submodule_switch "git cherry-pick"
+
+test_done
diff --git a/t/t3513-revert-submodule.sh b/t/t3513-revert-submodule.sh
new file mode 100755
index 0000000..a1c4e02
--- /dev/null
+++ b/t/t3513-revert-submodule.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+test_description='revert can handle submodules'
+
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-submodule-update.sh
+
+# Create a revert that moves from HEAD (including any test modifications to
+# the work tree) to $1 by first checking out $1 and reverting it. Reverting
+# the revert is the transition we test for. We tar the current work tree
+# first so we can restore the work tree test setup after doing the checkout
+# and revert.  We test here that the restored work tree content is identical
+# to that at the beginning. The last revert is then tested by the framework.
+git_revert () {
+	git status -su >expect &&
+	ls -1pR * >>expect &&
+	tar czf "$TRASH_DIRECTORY/tmp.tgz" * &&
+	git checkout "$1" &&
+	git revert HEAD &&
+	rm -rf * &&
+	tar xzf "$TRASH_DIRECTORY/tmp.tgz" &&
+	git status -su >actual &&
+	ls -1pR * >>actual &&
+	test_cmp expect actual &&
+	git revert HEAD
+}
+
+KNOWN_FAILURE_CHERRY_PICK_SEES_EMPTY_COMMIT=1
+KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1
+test_submodule_switch "git_revert"
+
+test_done
diff --git a/t/t3901-i18n-patch.sh b/t/t3901-i18n-patch.sh
index 31a5770..a392f3d 100755
--- a/t/t3901-i18n-patch.sh
+++ b/t/t3901-i18n-patch.sh
@@ -54,10 +54,13 @@
 	git add yours &&
 	git commit -s -m "Second on side" &&
 
-	# the second one on the side branch is ISO-8859-1
-	git config i18n.commitencoding ISO8859-1 &&
-	# use author and committer name in ISO-8859-1 to match it.
-	. "$TEST_DIRECTORY"/t3901-8859-1.txt &&
+	if test_have_prereq !MINGW
+	then
+		# the second one on the side branch is ISO-8859-1
+		git config i18n.commitencoding ISO8859-1 &&
+		# use author and committer name in ISO-8859-1 to match it.
+		. "$TEST_DIRECTORY"/t3901-8859-1.txt
+	fi &&
 	test_tick &&
 	echo Yet another >theirs &&
 	git add theirs &&
@@ -119,7 +122,7 @@
 	check_encoding 2
 '
 
-test_expect_success 'rebase (L/L)' '
+test_expect_success !MINGW 'rebase (L/L)' '
 	# In this test we want ISO-8859-1 encoded commits as the result
 	git config i18n.commitencoding ISO8859-1 &&
 	git config i18n.logoutputencoding ISO8859-1 &&
@@ -131,7 +134,7 @@
 	check_encoding 2 8859
 '
 
-test_expect_success 'rebase (L/U)' '
+test_expect_success !MINGW 'rebase (L/U)' '
 	# This is pathological -- use UTF-8 as intermediate form
 	# to get ISO-8859-1 results.
 	git config i18n.commitencoding ISO8859-1 &&
@@ -159,7 +162,7 @@
 	check_encoding 3
 '
 
-test_expect_success 'cherry-pick(L/L)' '
+test_expect_success !MINGW 'cherry-pick(L/L)' '
 	# Both the commitencoding and logoutputencoding is set to ISO-8859-1
 
 	git config i18n.commitencoding ISO8859-1 &&
@@ -189,7 +192,7 @@
 	check_encoding 3
 '
 
-test_expect_success 'cherry-pick(L/U)' '
+test_expect_success !MINGW 'cherry-pick(L/U)' '
 	# Again, the commitencoding is set to ISO-8859-1 but
 	# logoutputencoding is set to UTF-8.
 
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index 5b79b21..1e29962 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -685,4 +685,46 @@
 	grep pig file
 '
 
+test_expect_success 'setup stash with index and worktree changes' '
+	git stash clear &&
+	git reset --hard &&
+	echo index >file &&
+	git add file &&
+	echo working >file &&
+	git stash
+'
+
+test_expect_success 'stash list implies --first-parent -m' '
+	cat >expect <<-\EOF &&
+	stash@{0}: WIP on master: b27a2bc subdir
+
+	diff --git a/file b/file
+	index 257cc56..d26b33d 100644
+	--- a/file
+	+++ b/file
+	@@ -1 +1 @@
+	-foo
+	+working
+	EOF
+	git stash list -p >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'stash list --cc shows combined diff' '
+	cat >expect <<-\EOF &&
+	stash@{0}: WIP on master: b27a2bc subdir
+
+	diff --cc file
+	index 257cc56,9015a7a..d26b33d
+	--- a/file
+	+++ b/file
+	@@@ -1,1 -1,1 +1,1 @@@
+	- foo
+	 -index
+	++working
+	EOF
+	git stash list -p --cc >actual &&
+	test_cmp expect actual
+'
+
 test_done
diff --git a/t/t3905-stash-include-untracked.sh b/t/t3905-stash-include-untracked.sh
index a5e7e6b..f372fc8 100755
--- a/t/t3905-stash-include-untracked.sh
+++ b/t/t3905-stash-include-untracked.sh
@@ -96,8 +96,8 @@
 	git stash pop &&
 	git status --porcelain >actual &&
 	test_cmp expect actual &&
-	test "1" = "`cat file2`" &&
-	test untracked = "`cat untracked/untracked`"
+	test "1" = "$(cat file2)" &&
+	test untracked = "$(cat untracked/untracked)"
 '
 
 git clean --force --quiet -d
diff --git a/t/t3906-stash-submodule.sh b/t/t3906-stash-submodule.sh
new file mode 100755
index 0000000..d7219d6
--- /dev/null
+++ b/t/t3906-stash-submodule.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+test_description='stash apply can handle submodules'
+
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-submodule-update.sh
+
+git_stash () {
+	git status -su >expect &&
+	ls -1pR * >>expect &&
+	git read-tree -u -m "$1" &&
+	git stash &&
+	git status -su >actual &&
+	ls -1pR * >>actual &&
+	test_cmp expect actual &&
+	git stash apply
+}
+
+KNOWN_FAILURE_STASH_DOES_IGNORE_SUBMODULE_CHANGES=1
+KNOWN_FAILURE_CHERRY_PICK_SEES_EMPTY_COMMIT=1
+KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1
+test_submodule_switch "git_stash"
+
+test_done
diff --git a/t/t3910-mac-os-precompose.sh b/t/t3910-mac-os-precompose.sh
index e4ba601..8319356 100755
--- a/t/t3910-mac-os-precompose.sh
+++ b/t/t3910-mac-os-precompose.sh
@@ -14,13 +14,13 @@
 fi
 
 # create utf-8 variables
-Adiarnfc=`printf '\303\204'`
-Adiarnfd=`printf 'A\314\210'`
+Adiarnfc=$(printf '\303\204')
+Adiarnfd=$(printf 'A\314\210')
 
-Odiarnfc=`printf '\303\226'`
-Odiarnfd=`printf 'O\314\210'`
-AEligatu=`printf '\303\206'`
-Invalidu=`printf '\303\377'`
+Odiarnfc=$(printf '\303\226')
+Odiarnfd=$(printf 'O\314\210')
+AEligatu=$(printf '\303\206')
+Invalidu=$(printf '\303\377')
 
 
 #Create a string with 255 bytes (decomposed)
@@ -35,7 +35,7 @@
 Alongc=$Alongc$AEligatu$AEligatu                     #254 Byte
 
 test_expect_success "detect if nfd needed" '
-	precomposeunicode=`git config core.precomposeunicode` &&
+	precomposeunicode=$(git config core.precomposeunicode) &&
 	test "$precomposeunicode" = true &&
 	git config core.precomposeunicode true
 '
@@ -140,13 +140,23 @@
 	git add * &&
 	git commit -m "Long filename"
 '
+
+test_expect_failure 'handle existing decomposed filenames' '
+	echo content >"verbatim.$Adiarnfd" &&
+	git -c core.precomposeunicode=false add "verbatim.$Adiarnfd" &&
+	git commit -m "existing decomposed file" &&
+	>expect &&
+	git ls-files --exclude-standard -o "verbatim*" >untracked &&
+	test_cmp expect untracked
+'
+
 # Test if the global core.precomposeunicode stops autosensing
 # Must be the last test case
 test_expect_success "respect git config --global core.precomposeunicode" '
 	git config --global core.precomposeunicode true &&
 	rm -rf .git &&
 	git init &&
-	precomposeunicode=`git config core.precomposeunicode` &&
+	precomposeunicode=$(git config core.precomposeunicode) &&
 	test "$precomposeunicode" = "true"
 '
 
diff --git a/t/t4006-diff-mode.sh b/t/t4006-diff-mode.sh
index 0591149..76f643b 100755
--- a/t/t4006-diff-mode.sh
+++ b/t/t4006-diff-mode.sh
@@ -13,7 +13,7 @@
 test_expect_success 'setup' '
 	echo frotz >rezrov &&
 	git update-index --add rezrov &&
-	tree=`git write-tree` &&
+	tree=$(git write-tree) &&
 	echo $tree
 '
 
diff --git a/t/t4010-diff-pathspec.sh b/t/t4010-diff-pathspec.sh
index 2bb9736..bf07841 100755
--- a/t/t4010-diff-pathspec.sh
+++ b/t/t4010-diff-pathspec.sh
@@ -18,7 +18,7 @@
      mkdir path1 &&
      echo rezrov >path1/file1 &&
      git update-index --add file0 path1/file1 &&
-     tree=`git write-tree` &&
+     tree=$(git write-tree) &&
      echo "$tree" &&
      echo nitfol >file0 &&
      echo yomin >path1/file1 &&
@@ -131,7 +131,7 @@
 	mkdir path2 &&
 	echo rezrov >path2/file1 &&
 	git update-index --add path2/file1 &&
-	tree3=`git write-tree` &&
+	tree3=$(git write-tree) &&
 	git diff --name-only $tree $tree3 -- "path2*1" "path1*1" >actual &&
 	cat <<-\EOF >expect &&
 	path1/file1
diff --git a/t/t4012-diff-binary.sh b/t/t4012-diff-binary.sh
index 1215ae5..643d729 100755
--- a/t/t4012-diff-binary.sh
+++ b/t/t4012-diff-binary.sh
@@ -67,18 +67,18 @@
 	git diff >output &&
 	sed -e "s/-CIT/xCIT/" <output >broken &&
 	test_must_fail git apply --stat --summary broken 2>detected &&
-	detected=`cat detected` &&
-	detected=`expr "$detected" : "fatal.*at line \\([0-9]*\\)\$"` &&
-	detected=`sed -ne "${detected}p" broken` &&
+	detected=$(cat detected) &&
+	detected=$(expr "$detected" : "fatal.*at line \\([0-9]*\\)\$") &&
+	detected=$(sed -ne "${detected}p" broken) &&
 	test "$detected" = xCIT
 '
 
 test_expect_success C_LOCALE_OUTPUT 'apply detecting corrupt patch correctly' '
 	git diff --binary | sed -e "s/-CIT/xCIT/" >broken &&
 	test_must_fail git apply --stat --summary broken 2>detected &&
-	detected=`cat detected` &&
-	detected=`expr "$detected" : "fatal.*at line \\([0-9]*\\)\$"` &&
-	detected=`sed -ne "${detected}p" broken` &&
+	detected=$(cat detected) &&
+	detected=$(expr "$detected" : "fatal.*at line \\([0-9]*\\)\$") &&
+	detected=$(sed -ne "${detected}p" broken) &&
 	test "$detected" = xCIT
 '
 
@@ -88,7 +88,7 @@
 test_expect_success 'diff-index with --binary' '
 	echo AIT >a && mv b e && echo CIT >c && cat e >d &&
 	git update-index --add --remove a b c d e &&
-	tree0=`git write-tree` &&
+	tree0=$(git write-tree) &&
 	git diff --cached --binary >current &&
 	git apply --stat --summary current
 '
@@ -96,7 +96,7 @@
 test_expect_success 'apply binary patch' '
 	git reset --hard &&
 	git apply --binary --index <current &&
-	tree1=`git write-tree` &&
+	tree1=$(git write-tree) &&
 	test "$tree1" = "$tree0"
 '
 
diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh
index f7a9af8..6ec6072 100755
--- a/t/t4013-diff-various.sh
+++ b/t/t4013-diff-various.sh
@@ -107,14 +107,14 @@
 +*++ [initial] Initial
 EOF
 
-V=`git version | sed -e 's/^git version //' -e 's/\./\\./g'`
+V=$(git version | sed -e 's/^git version //' -e 's/\./\\./g')
 while read cmd
 do
 	case "$cmd" in
 	'' | '#'*) continue ;;
 	esac
-	test=`echo "$cmd" | sed -e 's|[/ ][/ ]*|_|g'`
-	pfx=`printf "%04d" $test_count`
+	test=$(echo "$cmd" | sed -e 's|[/ ][/ ]*|_|g')
+	pfx=$(printf "%04d" $test_count)
 	expect="$TEST_DIRECTORY/t4013/diff.$test"
 	actual="$pfx-diff.$test"
 
diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
index 9c80633..256affc 100755
--- a/t/t4014-format-patch.sh
+++ b/t/t4014-format-patch.sh
@@ -43,7 +43,7 @@
 test_expect_success "format-patch --ignore-if-in-upstream" '
 
 	git format-patch --stdout master..side >patch0 &&
-	cnt=`grep "^From " patch0 | wc -l` &&
+	cnt=$(grep "^From " patch0 | wc -l) &&
 	test $cnt = 3
 
 '
@@ -52,7 +52,7 @@
 
 	git format-patch --stdout \
 		--ignore-if-in-upstream master..side >patch1 &&
-	cnt=`grep "^From " patch1 | wc -l` &&
+	cnt=$(grep "^From " patch1 | wc -l) &&
 	test $cnt = 2
 
 '
@@ -69,7 +69,7 @@
 	git checkout -b merger master &&
 	test_tick &&
 	git merge --no-ff slave &&
-	cnt=`git format-patch -3 --stdout | grep "^From " | wc -l` &&
+	cnt=$(git format-patch -3 --stdout | grep "^From " | wc -l) &&
 	test $cnt = 3
 '
 
@@ -77,7 +77,7 @@
 
 	git checkout -b rebuild-0 master &&
 	git am -3 patch0 &&
-	cnt=`git rev-list master.. | wc -l` &&
+	cnt=$(git rev-list master.. | wc -l) &&
 	test $cnt = 2
 '
 
@@ -85,7 +85,7 @@
 
 	git checkout -b rebuild-1 master &&
 	git am -3 patch1 &&
-	cnt=`git rev-list master.. | wc -l` &&
+	cnt=$(git rev-list master.. | wc -l) &&
 	test $cnt = 2
 '
 
@@ -762,6 +762,67 @@
 	! grep "^-- \$" output
 '
 
+test_expect_success 'prepare mail-signature input' '
+	cat >mail-signature <<-\EOF
+
+	Test User <test.email@kernel.org>
+	http://git.kernel.org/cgit/git/git.git
+
+	git.kernel.org/?p=git/git.git;a=summary
+
+	EOF
+'
+
+test_expect_success '--signature-file=file works' '
+	git format-patch --stdout --signature-file=mail-signature -1 >output &&
+	check_patch output &&
+	sed -e "1,/^-- \$/d" <output >actual &&
+	{
+		cat mail-signature && echo
+	} >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success 'format.signaturefile works' '
+	test_config format.signaturefile mail-signature &&
+	git format-patch --stdout -1 >output &&
+	check_patch output &&
+	sed -e "1,/^-- \$/d" <output >actual &&
+	{
+		cat mail-signature && echo
+	} >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success '--no-signature suppresses format.signaturefile ' '
+	test_config format.signaturefile mail-signature &&
+	git format-patch --stdout --no-signature -1 >output &&
+	check_patch output &&
+	! grep "^-- \$" output
+'
+
+test_expect_success '--signature-file overrides format.signaturefile' '
+	cat >other-mail-signature <<-\EOF
+	Use this other signature instead of mail-signature.
+	EOF
+	test_config format.signaturefile mail-signature &&
+	git format-patch --stdout \
+			--signature-file=other-mail-signature -1 >output &&
+	check_patch output &&
+	sed -e "1,/^-- \$/d" <output >actual &&
+	{
+		cat other-mail-signature && echo
+	} >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success '--signature overrides format.signaturefile' '
+	test_config format.signaturefile mail-signature &&
+	git format-patch --stdout --signature="my sig" -1 >output &&
+	check_patch output &&
+	grep "my sig" output
+'
+
 test_expect_success TTY 'format-patch --stdout paginates' '
 	rm -f pager_used &&
 	test_terminal env GIT_PAGER="wc >pager_used" git format-patch --stdout --all &&
diff --git a/t/t4018-diff-funcname.sh b/t/t4018-diff-funcname.sh
index 34591c2..1dbaa38 100755
--- a/t/t4018-diff-funcname.sh
+++ b/t/t4018-diff-funcname.sh
@@ -52,15 +52,15 @@
 		echo "*.java diff=$p" >.gitattributes &&
 		test_expect_code 1 git diff --no-index \
 			A.java B.java 2>msg &&
-		! test_i18ngrep fatal msg &&
-		! test_i18ngrep error msg
+		test_i18ngrep ! fatal msg &&
+		test_i18ngrep ! error msg
 	'
 	test_expect_success "builtin $p wordRegex pattern compiles" '
 		echo "*.java diff=$p" >.gitattributes &&
 		test_expect_code 1 git diff --no-index --word-diff \
 			A.java B.java 2>msg &&
-		! test_i18ngrep fatal msg &&
-		! test_i18ngrep error msg
+		test_i18ngrep ! fatal msg &&
+		test_i18ngrep ! error msg
 	'
 done
 
diff --git a/t/t4036-format-patch-signer-mime.sh b/t/t4036-format-patch-signer-mime.sh
index ba43f18..98d9713 100755
--- a/t/t4036-format-patch-signer-mime.sh
+++ b/t/t4036-format-patch-signer-mime.sh
@@ -42,7 +42,7 @@
 
 	GIT_COMMITTER_NAME="はまの ふにおう" \
 	git format-patch -s --stdout -1 --attach >output &&
-	test `grep -ci ^MIME-Version: output` = 1
+	test $(grep -ci ^MIME-Version: output) = 1
 
 '
 
diff --git a/t/t4038-diff-combined.sh b/t/t4038-diff-combined.sh
index 1019d7b..0b4f7df 100755
--- a/t/t4038-diff-combined.sh
+++ b/t/t4038-diff-combined.sh
@@ -94,7 +94,7 @@
 	blob=$(echo file | git hash-object --stdin -w) &&
 	base_tree=$(echo "100644 blob $blob	file" | git mktree) &&
 	trees= &&
-	for i in `test_seq 1 40`
+	for i in $(test_seq 1 40)
 	do
 		blob=$(echo file$i | git hash-object --stdin -w) &&
 		trees="$trees$(echo "100644 blob $blob	file" | git mktree)$LF"
@@ -401,4 +401,38 @@
 	compare_diff_patch expected actual
 '
 
+test_expect_success 'combine diff gets tree sorting right' '
+	# create a directory and a file that sort differently in trees
+	# versus byte-wise (implied "/" sorts after ".")
+	git checkout -f master &&
+	mkdir foo &&
+	echo base >foo/one &&
+	echo base >foo/two &&
+	echo base >foo.ext &&
+	git add foo foo.ext &&
+	git commit -m base &&
+
+	# one side modifies a file in the directory, along with the root
+	# file...
+	echo master >foo/one &&
+	echo master >foo.ext &&
+	git commit -a -m master &&
+
+	# the other side modifies the other file in the directory
+	git checkout -b other HEAD^ &&
+	echo other >foo/two &&
+	git commit -a -m other &&
+
+	# And now we merge. The files in the subdirectory will resolve cleanly,
+	# meaning that a combined diff will not find them interesting. But it
+	# will find the tree itself interesting, because it had to be merged.
+	git checkout master &&
+	git merge other &&
+
+	printf "MM\tfoo\n" >expect &&
+	git diff-tree -c --name-status -t HEAD >actual.tmp &&
+	sed 1d <actual.tmp >actual &&
+	test_cmp expect actual
+'
+
 test_done
diff --git a/t/t4041-diff-submodule-option.sh b/t/t4041-diff-submodule-option.sh
index 463d63b..e432896 100755
--- a/t/t4041-diff-submodule-option.sh
+++ b/t/t4041-diff-submodule-option.sh
@@ -26,8 +26,10 @@
 			echo "$name" >"$name" &&
 			git add "$name" &&
 			test_tick &&
-			msg_added_iso88591=$(echo "Add $name ($added $name)" | iconv -f utf-8 -t $test_encoding) &&
-			git -c "i18n.commitEncoding=$test_encoding" commit -m "$msg_added_iso88591"
+			# "git commit -m" would break MinGW, as Windows refuse to pass
+			# $test_encoding encoded parameter to git.
+			echo "Add $name ($added $name)" | iconv -f utf-8 -t $test_encoding |
+			git -c "i18n.commitEncoding=$test_encoding" commit -F -
 		done >/dev/null &&
 		git rev-parse --short --verify HEAD
 	)
diff --git a/t/t4055-diff-context.sh b/t/t4055-diff-context.sh
index cd04543..741e080 100755
--- a/t/t4055-diff-context.sh
+++ b/t/t4055-diff-context.sh
@@ -79,7 +79,7 @@
 test_expect_success 'negative integer config parsing' '
 	git config diff.context -1 &&
 	test_must_fail git diff 2>output &&
-	test_i18ngrep "bad config file" output
+	test_i18ngrep "bad config variable" output
 '
 
 test_expect_success '-U0 is valid, so is diff.context=0' '
diff --git a/t/t4057-diff-combined-paths.sh b/t/t4057-diff-combined-paths.sh
index 097e632..dff36b7 100755
--- a/t/t4057-diff-combined-paths.sh
+++ b/t/t4057-diff-combined-paths.sh
@@ -5,7 +5,7 @@
 . ./test-lib.sh
 
 # verify that diffc.expect matches output of
-# `git diff -c --name-only HEAD HEAD^ HEAD^2`
+# $(git diff -c --name-only HEAD HEAD^ HEAD^2)
 diffc_verify () {
 	git diff -c --name-only HEAD HEAD^ HEAD^2 >diffc.actual &&
 	test_cmp diffc.expect diffc.actual
diff --git a/t/t4102-apply-rename.sh b/t/t4102-apply-rename.sh
index 49e2d6c..fae3059 100755
--- a/t/t4102-apply-rename.sh
+++ b/t/t4102-apply-rename.sh
@@ -52,6 +52,6 @@
 
 test_expect_success 'apply copy' \
     'git apply --index --stat --summary --apply test-patch &&
-     test "$(cat bar)" = "This is bar" -a "$(cat foo)" = "This is foo"'
+     test "$(cat bar)" = "This is bar" && test "$(cat foo)" = "This is foo"'
 
 test_done
diff --git a/t/t4116-apply-reverse.sh b/t/t4116-apply-reverse.sh
index 1e4d438..ce8567f 100755
--- a/t/t4116-apply-reverse.sh
+++ b/t/t4116-apply-reverse.sh
@@ -30,10 +30,10 @@
 
 test_expect_success 'apply in forward' '
 
-	T0=`git rev-parse "second^{tree}"` &&
+	T0=$(git rev-parse "second^{tree}") &&
 	git reset --hard initial &&
 	git apply --index --binary patch &&
-	T1=`git write-tree` &&
+	T1=$(git write-tree) &&
 	test "$T0" = "$T1"
 '
 
@@ -62,22 +62,22 @@
 
 test_expect_success 'apply in forward without postimage' '
 
-	T0=`git rev-parse "second^{tree}"` &&
+	T0=$(git rev-parse "second^{tree}") &&
 	(
 		cd initial &&
 		git apply --index --binary ../patch &&
-		T1=`git write-tree` &&
+		T1=$(git write-tree) &&
 		test "$T0" = "$T1"
 	)
 '
 
 test_expect_success 'apply in reverse without postimage' '
 
-	T0=`git rev-parse "initial^{tree}"` &&
+	T0=$(git rev-parse "initial^{tree}") &&
 	(
 		cd second &&
 		git apply --index --binary --reverse ../patch &&
-		T1=`git write-tree` &&
+		T1=$(git write-tree) &&
 		test "$T0" = "$T1"
 	)
 '
diff --git a/t/t4119-apply-config.sh b/t/t4119-apply-config.sh
index 3d0384d..a9a0583 100755
--- a/t/t4119-apply-config.sh
+++ b/t/t4119-apply-config.sh
@@ -68,7 +68,7 @@
 	check_result sub/file1
 '
 
-D=`pwd`
+D=$(pwd)
 
 test_expect_success 'apply --whitespace=strip in subdir' '
 
@@ -159,4 +159,21 @@
 	check_result sub/file1
 '
 
+test_expect_success 'in subdir with traditional patch input' '
+	cd "$D" &&
+	git config apply.whitespace strip &&
+	cat >.gitattributes <<-EOF &&
+	/* whitespace=blank-at-eol
+	sub/* whitespace=-blank-at-eol
+	EOF
+	rm -f sub/file1 &&
+	cp saved sub/file1 &&
+	git update-index --refresh &&
+
+	cd sub &&
+	git apply ../gpatch.file &&
+	echo "B " >expect &&
+	test_cmp expect file1
+'
+
 test_done
diff --git a/t/t4124-apply-ws-rule.sh b/t/t4124-apply-ws-rule.sh
index 5d0c598..c6474de 100755
--- a/t/t4124-apply-ws-rule.sh
+++ b/t/t4124-apply-ws-rule.sh
@@ -512,4 +512,15 @@
 	git -c core.whitespace=tab-in-indent apply --whitespace=fix patch
 '
 
+test_expect_success 'whitespace check skipped for excluded paths' '
+	git config core.whitespace blank-at-eol &&
+	>used &&
+	>unused &&
+	git add used unused &&
+	echo "used" >used &&
+	echo "unused " >unused &&
+	git diff-files -p used unused >patch &&
+	git apply --include=used --stat --whitespace=error <patch
+'
+
 test_done
diff --git a/t/t4137-apply-submodule.sh b/t/t4137-apply-submodule.sh
new file mode 100755
index 0000000..a9bd40a
--- /dev/null
+++ b/t/t4137-apply-submodule.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+test_description='git apply handling submodules'
+
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-submodule-update.sh
+
+apply_index () {
+	git diff --ignore-submodules=dirty "..$1" | git apply --index -
+}
+
+test_submodule_switch "apply_index"
+
+apply_3way () {
+	git diff --ignore-submodules=dirty "..$1" | git apply --3way -
+}
+
+test_submodule_switch "apply_3way"
+
+test_done
diff --git a/t/t4201-shortlog.sh b/t/t4201-shortlog.sh
index 97fcb31..7600a3e 100755
--- a/t/t4201-shortlog.sh
+++ b/t/t4201-shortlog.sh
@@ -93,7 +93,7 @@
 	test_cmp expect log.predictable
 '
 
-test_expect_success 'shortlog wrapping' '
+test_expect_success !MINGW 'shortlog wrapping' '
 	cat >expect <<\EOF &&
 A U Thor (5):
       Test
@@ -114,7 +114,7 @@
 	test_cmp expect out
 '
 
-test_expect_success 'shortlog from non-git directory' '
+test_expect_success !MINGW 'shortlog from non-git directory' '
 	git log HEAD >log &&
 	GIT_DIR=non-existing git shortlog -w <log >out &&
 	test_cmp expect out
@@ -159,7 +159,7 @@
 
 EOF
 
-test_expect_success 'shortlog encoding' '
+test_expect_success !MINGW 'shortlog encoding' '
 	git reset --hard "$commit" &&
 	git config --unset i18n.commitencoding &&
 	echo 2 > a1 &&
diff --git a/t/t4204-patch-id.sh b/t/t4204-patch-id.sh
index d2c930d..baa9d3c 100755
--- a/t/t4204-patch-id.sh
+++ b/t/t4204-patch-id.sh
@@ -5,27 +5,44 @@
 . ./test-lib.sh
 
 test_expect_success 'setup' '
-	test_commit initial foo a &&
-	test_commit first foo b &&
-	git checkout -b same HEAD^ &&
-	test_commit same-msg foo b &&
-	git checkout -b notsame HEAD^ &&
-	test_commit notsame-msg foo c
+	as="a a a a a a a a" && # eight a
+	test_write_lines $as >foo &&
+	test_write_lines $as >bar &&
+	git add foo bar &&
+	git commit -a -m initial &&
+	test_write_lines $as b >foo &&
+	test_write_lines $as b >bar &&
+	git commit -a -m first &&
+	git checkout -b same master &&
+	git commit --amend -m same-msg &&
+	git checkout -b notsame master &&
+	echo c >foo &&
+	echo c >bar &&
+	git commit --amend -a -m notsame-msg &&
+	test_write_lines bar foo >bar-then-foo &&
+	test_write_lines foo bar >foo-then-bar
 '
 
 test_expect_success 'patch-id output is well-formed' '
-	git log -p -1 | git patch-id > output &&
+	git log -p -1 | git patch-id >output &&
 	grep "^[a-f0-9]\{40\} $(git rev-parse HEAD)$" output
 '
 
+#calculate patch id. Make sure output is not empty.
 calc_patch_id () {
-	git patch-id |
-		sed "s# .*##" > patch-id_"$1"
+	name="$1"
+	shift
+	git patch-id "$@" |
+	sed "s/ .*//" >patch-id_"$name" &&
+	test_line_count -gt 0 patch-id_"$name"
+}
+
+get_top_diff () {
+	git log -p -1 "$@" -O bar-then-foo --
 }
 
 get_patch_id () {
-	git log -p -1 "$1" | git patch-id |
-		sed "s# .*##" > patch-id_"$1"
+	get_top_diff "$1" | calc_patch_id "$@"
 }
 
 test_expect_success 'patch-id detects equality' '
@@ -45,8 +62,8 @@
 	git checkout same &&
 	git format-patch -1 --stdout | calc_patch_id same &&
 	test_cmp patch-id_master patch-id_same &&
-	set `git format-patch -1 --stdout | git patch-id` &&
-	test "$2" = `git rev-parse HEAD`
+	set $(git format-patch -1 --stdout | git patch-id) &&
+	test "$2" = $(git rev-parse HEAD)
 '
 
 test_expect_success 'whitespace is irrelevant in footer' '
@@ -56,6 +73,69 @@
 	test_cmp patch-id_master patch-id_same
 '
 
+cmp_patch_id () {
+	if
+		test "$1" = "relevant"
+	then
+		! test_cmp patch-id_"$2" patch-id_"$3"
+	else
+		test_cmp patch-id_"$2" patch-id_"$3"
+	fi
+}
+
+test_patch_id_file_order () {
+	relevant="$1"
+	shift
+	name="order-${1}-$relevant"
+	shift
+	get_top_diff "master" | calc_patch_id "$name" "$@" &&
+	git checkout same &&
+	git format-patch -1 --stdout -O foo-then-bar |
+		calc_patch_id "ordered-$name" "$@" &&
+	cmp_patch_id $relevant "$name" "ordered-$name"
+
+}
+
+# combined test for options: add more tests here to make them
+# run with all options
+test_patch_id () {
+	test_patch_id_file_order "$@"
+}
+
+# small tests with detailed diagnostic for basic options.
+test_expect_success 'file order is irrelevant with --stable' '
+	test_patch_id_file_order irrelevant --stable --stable
+'
+
+test_expect_success 'file order is relevant with --unstable' '
+	test_patch_id_file_order relevant --unstable --unstable
+'
+
+#Now test various option combinations.
+test_expect_success 'default is unstable' '
+	test_patch_id relevant default
+'
+
+test_expect_success 'patchid.stable = true is stable' '
+	test_config patchid.stable true &&
+	test_patch_id irrelevant patchid.stable=true
+'
+
+test_expect_success 'patchid.stable = false is unstable' '
+	test_config patchid.stable false &&
+	test_patch_id relevant patchid.stable=false
+'
+
+test_expect_success '--unstable overrides patchid.stable = true' '
+	test_config patchid.stable true &&
+	test_patch_id relevant patchid.stable=true--unstable --unstable
+'
+
+test_expect_success '--stable overrides patchid.stable = false' '
+	test_config patchid.stable false &&
+	test_patch_id irrelevant patchid.stable=false--stable --stable
+'
+
 test_expect_success 'patch-id supports git-format-patch MIME output' '
 	get_patch_id master &&
 	git checkout same &&
diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh
index c84ec9a..7398605 100755
--- a/t/t4205-log-pretty-formats.sh
+++ b/t/t4205-log-pretty-formats.sh
@@ -31,7 +31,7 @@
 	git add foo &&
 	test_tick &&
 	git config i18n.commitEncoding $test_encoding &&
-	git commit -m "$(commit_msg $test_encoding)" &&
+	commit_msg $test_encoding | git commit -F - &&
 	git add bar &&
 	test_tick &&
 	git commit -m "add bar" &&
@@ -431,6 +431,21 @@
 	test_cmp expected actual
 '
 
+test_expect_success 'strbuf_utf8_replace() not producing NUL' '
+	git log --color --pretty="tformat:%<(10,trunc)%s%>>(10,ltrunc)%C(auto)%d" |
+		test_decode_color |
+		nul_to_q >actual &&
+	! grep Q actual
+'
+
+# ISO strict date format
+test_expect_success 'ISO and ISO-strict date formats display the same values' '
+	git log --format=%ai%n%ci |
+	sed -e "s/ /T/; s/ //; s/..\$/:&/" >expected &&
+	git log --format=%aI%n%cI >actual &&
+	test_cmp expected actual
+'
+
 # get new digests (with no abbreviations)
 head1=$(git rev-parse --verify HEAD~0) &&
 head2=$(git rev-parse --verify HEAD~1) &&
@@ -450,4 +465,15 @@
 	test_cmp expected actual1
 '
 
+test_expect_success 'clean log decoration' '
+	git log --no-walk --tags --pretty="%H %D" --decorate=full >actual &&
+	cat >expected <<EOF &&
+$head1 tag: refs/tags/tag2
+$head2 tag: refs/tags/message-one
+$old_head1 tag: refs/tags/message-two
+EOF
+	sort actual >actual1 &&
+	test_cmp expected actual1
+'
+
 test_done
diff --git a/t/t4210-log-i18n.sh b/t/t4210-log-i18n.sh
index 52a7472..e585fe6 100755
--- a/t/t4210-log-i18n.sh
+++ b/t/t4210-log-i18n.sh
@@ -34,7 +34,7 @@
 	test_cmp expect actual
 '
 
-test_expect_success 'log --grep searches in log output encoding (latin1)' '
+test_expect_success !MINGW 'log --grep searches in log output encoding (latin1)' '
 	cat >expect <<-\EOF &&
 	latin1
 	utf8
@@ -43,7 +43,7 @@
 	test_cmp expect actual
 '
 
-test_expect_success 'log --grep does not find non-reencoded values (utf8)' '
+test_expect_success !MINGW 'log --grep does not find non-reencoded values (utf8)' '
 	>expect &&
 	git log --encoding=utf8 --format=%s --grep=$latin1_e >actual &&
 	test_cmp expect actual
diff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh
index 7369d3c..0901b30 100755
--- a/t/t4211-line-log.sh
+++ b/t/t4211-line-log.sh
@@ -94,4 +94,9 @@
 	test_must_fail git log -L ,$n:b.c
 '
 
+test_expect_success '-L with --first-parent and a merge' '
+	git checkout parallel-change &&
+	git log --first-parent -L 1,1:b.c
+'
+
 test_done
diff --git a/t/t4212-log-corrupt.sh b/t/t4212-log-corrupt.sh
index 58b792b..67bd8ec 100755
--- a/t/t4212-log-corrupt.sh
+++ b/t/t4212-log-corrupt.sh
@@ -14,7 +14,7 @@
 '
 
 test_expect_success 'fsck notices broken commit' '
-	git fsck 2>actual &&
+	test_must_fail git fsck 2>actual &&
 	test_i18ngrep invalid.author actual
 '
 
diff --git a/t/t4255-am-submodule.sh b/t/t4255-am-submodule.sh
new file mode 100755
index 0000000..8bde7db
--- /dev/null
+++ b/t/t4255-am-submodule.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+test_description='git am handling submodules'
+
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-submodule-update.sh
+
+am () {
+	git format-patch --stdout --ignore-submodules=dirty "..$1" | git am -
+}
+
+test_submodule_switch "am"
+
+am_3way () {
+	git format-patch --stdout --ignore-submodules=dirty "..$1" | git am --3way -
+}
+
+KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1
+test_submodule_switch "am_3way"
+
+test_done
diff --git a/t/t5000-tar-tree.sh b/t/t5000-tar-tree.sh
index 4efaf8c..d01bbdc 100755
--- a/t/t5000-tar-tree.sh
+++ b/t/t5000-tar-tree.sh
@@ -72,7 +72,7 @@
 			for header in *.paxheader
 			do
 				data=${header%.paxheader}.data &&
-				if test -h $data -o -e $data
+				if test -h $data || test -e $data
 				then
 					path=$(get_pax_header $header path) &&
 					if test -n "$path"
@@ -119,14 +119,10 @@
     'echo ignore me >a/ignored &&
      echo ignored export-ignore >.git/info/attributes'
 
-test_expect_success \
-    'add files to repository' \
-    'find a -type f | xargs git update-index --add &&
-     find a -type l | xargs git update-index --add &&
-     treeid=`git write-tree` &&
-     echo $treeid >treeid &&
-     git update-ref HEAD $(TZ=GMT GIT_COMMITTER_DATE="2005-05-27 22:00:00" \
-     git commit-tree $treeid </dev/null)'
+test_expect_success 'add files to repository' '
+	git add a &&
+	GIT_COMMITTER_DATE="2005-05-27 22:00" git commit -m initial
+'
 
 test_expect_success 'setup export-subst' '
 	echo "substfile?" export-subst >>.git/info/attributes &&
@@ -207,7 +203,7 @@
 
 test_expect_success 'clients cannot access unreachable commits' '
 	test_commit unreachable &&
-	sha1=`git rev-parse HEAD` &&
+	sha1=$(git rev-parse HEAD) &&
 	git reset --hard HEAD^ &&
 	git archive $sha1 >remote.tar &&
 	test_must_fail git archive --remote=. $sha1 >remote.tar
@@ -215,7 +211,7 @@
 
 test_expect_success 'upload-archive can allow unreachable commits' '
 	test_commit unreachable1 &&
-	sha1=`git rev-parse HEAD` &&
+	sha1=$(git rev-parse HEAD) &&
 	git reset --hard HEAD^ &&
 	git archive $sha1 >remote.tar &&
 	test_config uploadarchive.allowUnreachable true &&
@@ -309,4 +305,18 @@
 		>remote.tar.gz
 '
 
+test_expect_success 'archive and :(glob)' '
+	git archive -v HEAD -- ":(glob)**/sh" >/dev/null 2>actual &&
+	cat >expect <<EOF &&
+a/
+a/bin/
+a/bin/sh
+EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'catch non-matching pathspec' '
+	test_must_fail git archive -v HEAD -- "*.abc" >/dev/null
+'
+
 test_done
diff --git a/t/t5003-archive-zip.sh b/t/t5003-archive-zip.sh
index 21a5c93..c929db5 100755
--- a/t/t5003-archive-zip.sh
+++ b/t/t5003-archive-zip.sh
@@ -61,14 +61,10 @@
     'echo ignore me >a/ignored &&
      echo ignored export-ignore >.git/info/attributes'
 
-test_expect_success \
-    'add files to repository' \
-    'find a -type f | xargs git update-index --add &&
-     find a -type l | xargs git update-index --add &&
-     treeid=`git write-tree` &&
-     echo $treeid >treeid &&
-     git update-ref HEAD $(TZ=GMT GIT_COMMITTER_DATE="2005-05-27 22:00:00" \
-     git commit-tree $treeid </dev/null)'
+test_expect_success 'add files to repository' '
+	git add a &&
+	GIT_COMMITTER_DATE="2005-05-27 22:00" git commit -m initial
+'
 
 test_expect_success 'setup export-subst' '
 	echo "substfile?" export-subst >>.git/info/attributes &&
diff --git a/t/t5100-mailinfo.sh b/t/t5100-mailinfo.sh
index 3e64a7a..9e1ad1c 100755
--- a/t/t5100-mailinfo.sh
+++ b/t/t5100-mailinfo.sh
@@ -89,4 +89,22 @@
 
 '
 
+test_expect_success 'mailinfo finds headers after embedded From line' '
+	mkdir embed-from &&
+	git mailsplit -oembed-from "$TEST_DIRECTORY"/t5100/embed-from.in &&
+	test_cmp "$TEST_DIRECTORY"/t5100/embed-from.in embed-from/0001 &&
+	git mailinfo embed-from/msg embed-from/patch \
+	  <embed-from/0001 >embed-from/out &&
+	test_cmp "$TEST_DIRECTORY"/t5100/embed-from.expect embed-from/out
+'
+
+test_expect_success 'mailinfo on message with quoted >From' '
+	mkdir quoted-from &&
+	git mailsplit -oquoted-from "$TEST_DIRECTORY"/t5100/quoted-from.in &&
+	test_cmp "$TEST_DIRECTORY"/t5100/quoted-from.in quoted-from/0001 &&
+	git mailinfo quoted-from/msg quoted-from/patch \
+	  <quoted-from/0001 >quoted-from/out &&
+	test_cmp "$TEST_DIRECTORY"/t5100/quoted-from.expect quoted-from/msg
+'
+
 test_done
diff --git a/t/t5100/embed-from.expect b/t/t5100/embed-from.expect
new file mode 100644
index 0000000..06a3a38
--- /dev/null
+++ b/t/t5100/embed-from.expect
@@ -0,0 +1,5 @@
+Author: Commit Author
+Email: commit@example.com
+Subject: patch subject
+Date: Sat, 13 Sep 2014 21:13:23 -0400 
+
diff --git a/t/t5100/embed-from.in b/t/t5100/embed-from.in
new file mode 100644
index 0000000..5f3f84e
--- /dev/null
+++ b/t/t5100/embed-from.in
@@ -0,0 +1,13 @@
+From 1234567890123456789012345678901234567890 Mon Sep 17 00:00:00 2001
+From: Email Author <email@example.com>
+Date: Sun, 25 May 2008 00:38:18 -0700
+Subject: [PATCH] email subject
+
+>From 1234567890123456789012345678901234567890 Mon Sep 17 00:00:00 2001
+From: Commit Author <commit@example.com>
+Date: Sat, 13 Sep 2014 21:13:23 -0400
+Subject: patch subject
+
+patch body
+---
+patch
diff --git a/t/t5100/quoted-from.expect b/t/t5100/quoted-from.expect
new file mode 100644
index 0000000..8c9d48c
--- /dev/null
+++ b/t/t5100/quoted-from.expect
@@ -0,0 +1,3 @@
+>From the depths of history, we are stuck with the
+flaky mbox format.
+
diff --git a/t/t5100/quoted-from.in b/t/t5100/quoted-from.in
new file mode 100644
index 0000000..847e1c4
--- /dev/null
+++ b/t/t5100/quoted-from.in
@@ -0,0 +1,10 @@
+From 1234567890123456789012345678901234567890 Mon Sep 17 00:00:00 2001
+From: Author Name <somebody@example.com>
+Date: Sun, 25 May 2008 00:38:18 -0700
+Subject: [PATCH] testing quoted >From
+
+>From the depths of history, we are stuck with the
+flaky mbox format.
+
+---
+patch
diff --git a/t/t5302-pack-index.sh b/t/t5302-pack-index.sh
index 4bbb718..61bc8da 100755
--- a/t/t5302-pack-index.sh
+++ b/t/t5302-pack-index.sh
@@ -243,4 +243,23 @@
     test -f .git/objects/pack/pack-${pack1}.idx
 '
 
+test_expect_success 'index-pack --strict warns upon missing tagger in tag' '
+    sha=$(git rev-parse HEAD) &&
+    cat >wrong-tag <<EOF &&
+object $sha
+type commit
+tag guten tag
+
+This is an invalid tag.
+EOF
+
+    tag=$(git hash-object -t tag -w --stdin <wrong-tag) &&
+    pack1=$(echo $tag $sha | git pack-objects tag-test) &&
+    echo remove tag object &&
+    thirtyeight=${tag#??} &&
+    rm -f .git/objects/${tag%$thirtyeight}/$thirtyeight &&
+    git index-pack --strict tag-test-${pack1}.pack 2>err &&
+    grep "^error:.* expected .tagger. line" err
+'
+
 test_done
diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh
index 377d3d3..e32e46d 100755
--- a/t/t5304-prune.sh
+++ b/t/t5304-prune.sh
@@ -13,8 +13,8 @@
 	before=$(git count-objects | sed "s/ .*//") &&
 	BLOB=$(echo aleph_0 | git hash-object -w --stdin) &&
 	BLOB_FILE=.git/objects/$(echo $BLOB | sed "s/^../&\//") &&
-	test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
-	test -f $BLOB_FILE &&
+	verbose test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
+	test_path_is_file $BLOB_FILE &&
 	test-chmtime =+0 $BLOB_FILE
 }
 
@@ -35,9 +35,9 @@
 	: > .git/objects/tmp_2.pack &&
 	test-chmtime =-86501 .git/objects/tmp_1.pack &&
 	git prune --expire 1.day &&
-	test -f $orig_pack &&
-	test -f .git/objects/tmp_2.pack &&
-	! test -f .git/objects/tmp_1.pack
+	test_path_is_file $orig_pack &&
+	test_path_is_file .git/objects/tmp_2.pack &&
+	test_path_is_missing .git/objects/tmp_1.pack
 
 '
 
@@ -45,12 +45,12 @@
 
 	add_blob &&
 	git prune --expire=1.hour.ago &&
-	test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
-	test -f $BLOB_FILE &&
+	verbose test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
+	test_path_is_file $BLOB_FILE &&
 	test-chmtime =-86500 $BLOB_FILE &&
 	git prune --expire 1.day &&
-	test $before = $(git count-objects | sed "s/ .*//") &&
-	! test -f $BLOB_FILE
+	verbose test $before = $(git count-objects | sed "s/ .*//") &&
+	test_path_is_missing $BLOB_FILE
 
 '
 
@@ -59,12 +59,12 @@
 	add_blob &&
 	test-chmtime =-$((2*$week-30)) $BLOB_FILE &&
 	git gc &&
-	test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
-	test -f $BLOB_FILE &&
+	verbose test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
+	test_path_is_file $BLOB_FILE &&
 	test-chmtime =-$((2*$week+1)) $BLOB_FILE &&
 	git gc &&
-	test $before = $(git count-objects | sed "s/ .*//") &&
-	! test -f $BLOB_FILE
+	verbose test $before = $(git count-objects | sed "s/ .*//") &&
+	test_path_is_missing $BLOB_FILE
 
 '
 
@@ -104,6 +104,28 @@
 
 '
 
+test_expect_success 'prune: do not prune detached HEAD with no reflog' '
+
+	git checkout --detach --quiet &&
+	git commit --allow-empty -m "detached commit" &&
+	# verify that there is no reflogs
+	# (should be removed and disabled by previous test)
+	test_path_is_missing .git/logs &&
+	git prune -n >prune_actual &&
+	: >prune_expected &&
+	test_cmp prune_actual prune_expected
+
+'
+
+test_expect_success 'prune: prune former HEAD after checking out branch' '
+
+	head_sha1=$(git rev-parse HEAD) &&
+	git checkout --quiet master &&
+	git prune -v >prune_actual &&
+	grep "$head_sha1" prune_actual
+
+'
+
 test_expect_success 'prune: do not prune heads listed as an argument' '
 
 	: > file2 &&
@@ -122,8 +144,8 @@
 	test-chmtime =-$((5001*$day)) $BLOB_FILE &&
 	git config gc.pruneExpire 2.days.ago &&
 	git gc --no-prune &&
-	test 1 = $(git count-objects | sed "s/ .*//") &&
-	test -f $BLOB_FILE
+	verbose test 1 = $(git count-objects | sed "s/ .*//") &&
+	test_path_is_file $BLOB_FILE
 
 '
 
@@ -131,10 +153,10 @@
 
 	git config gc.pruneExpire 5002.days.ago &&
 	git gc &&
-	test -f $BLOB_FILE &&
+	test_path_is_file $BLOB_FILE &&
 	git config gc.pruneExpire 5000.days.ago &&
 	git gc &&
-	test ! -f $BLOB_FILE
+	test_path_is_missing $BLOB_FILE
 
 '
 
@@ -143,9 +165,9 @@
 	add_blob &&
 	test-chmtime =-$((5001*$day)) $BLOB_FILE &&
 	git gc --prune=5002.days.ago &&
-	test -f $BLOB_FILE &&
+	test_path_is_file $BLOB_FILE &&
 	git gc --prune=5000.days.ago &&
-	test ! -f $BLOB_FILE
+	test_path_is_missing $BLOB_FILE
 
 '
 
@@ -153,9 +175,9 @@
 
 	add_blob &&
 	git gc --prune=never &&
-	test -f $BLOB_FILE &&
+	test_path_is_file $BLOB_FILE &&
 	git gc --prune=now &&
-	test ! -f $BLOB_FILE
+	test_path_is_missing $BLOB_FILE
 
 '
 
@@ -164,10 +186,10 @@
 	git config gc.pruneExpire never &&
 	add_blob &&
 	git gc &&
-	test -f $BLOB_FILE &&
+	test_path_is_file $BLOB_FILE &&
 	git config gc.pruneExpire now &&
 	git gc &&
-	test ! -f $BLOB_FILE
+	test_path_is_missing $BLOB_FILE
 
 '
 
@@ -175,9 +197,9 @@
 
 	add_blob &&
 	git prune --expire=never &&
-	test -f $BLOB_FILE &&
+	test_path_is_file $BLOB_FILE &&
 	git prune &&
-	test ! -f $BLOB_FILE
+	test_path_is_missing $BLOB_FILE
 
 '
 
@@ -187,11 +209,11 @@
 	git clone --no-hardlinks . aclone &&
 	(
 		cd aclone &&
-		test 1 = $(git count-objects | sed "s/ .*//") &&
-		test -f $BLOB_FILE &&
+		verbose test 1 = $(git count-objects | sed "s/ .*//") &&
+		test_path_is_file $BLOB_FILE &&
 		git gc --prune &&
-		test 0 = $(git count-objects | sed "s/ .*//") &&
-		! test -f $BLOB_FILE
+		verbose test 0 = $(git count-objects | sed "s/ .*//") &&
+		test_path_is_missing $BLOB_FILE
 	)
 '
 
@@ -228,7 +250,7 @@
 	grep $SHA1 .git/shallow &&
 	grep $SHA1 out &&
 	git prune &&
-	! test -f .git/shallow
+	test_path_is_missing .git/shallow
 '
 
 test_done
diff --git a/t/t5310-pack-bitmaps.sh b/t/t5310-pack-bitmaps.sh
index f4f02ba..6003490 100755
--- a/t/t5310-pack-bitmaps.sh
+++ b/t/t5310-pack-bitmaps.sh
@@ -18,7 +18,7 @@
 	git checkout master &&
 	blob=$(echo tagged-blob | git hash-object -w --stdin) &&
 	git tag tagged-blob $blob &&
-	git config pack.writebitmaps true &&
+	git config repack.writebitmaps true &&
 	git config pack.writebitmaphashcache true
 '
 
@@ -170,4 +170,13 @@
 	)
 '
 
+test_expect_success 'splitting packs does not generate bogus bitmaps' '
+	test-genrandom foo $((1024 * 1024)) >rand &&
+	git add rand &&
+	git commit -m "commit with big file" &&
+	git -c pack.packSizeLimit=500k repack -adb &&
+	git init --bare no-bitmaps.git &&
+	git -C no-bitmaps.git fetch .. HEAD
+'
+
 test_done
diff --git a/t/t5311-pack-bitmaps-shallow.sh b/t/t5311-pack-bitmaps-shallow.sh
new file mode 100755
index 0000000..872a95d
--- /dev/null
+++ b/t/t5311-pack-bitmaps-shallow.sh
@@ -0,0 +1,39 @@
+#!/bin/sh
+
+test_description='check bitmap operation with shallow repositories'
+. ./test-lib.sh
+
+# We want to create a situation where the shallow, grafted
+# view of reachability does not match reality in a way that
+# might cause us to send insufficient objects.
+#
+# We do this with a history that repeats a state, like:
+#
+#      A    --   B    --   C
+#    file=1    file=2    file=1
+#
+# and then create a shallow clone to the second commit, B.
+# In a non-shallow clone, that would mean we already have
+# the tree for A. But in a shallow one, we've grafted away
+# A, and fetching A to B requires that the other side send
+# us the tree for file=1.
+test_expect_success 'setup shallow repo' '
+	echo 1 >file &&
+	git add file &&
+	git commit -m orig &&
+	echo 2 >file &&
+	git commit -a -m update &&
+	git clone --no-local --bare --depth=1 . shallow.git &&
+	echo 1 >file &&
+	git commit -a -m repeat
+'
+
+test_expect_success 'turn on bitmaps in the parent' '
+	git repack -adb
+'
+
+test_expect_success 'shallow fetch from bitmapped repo' '
+	(cd shallow.git && git fetch)
+'
+
+test_done
diff --git a/t/t5401-update-hooks.sh b/t/t5401-update-hooks.sh
index 17bcb0b..7f278d8c 100755
--- a/t/t5401-update-hooks.sh
+++ b/t/t5401-update-hooks.sh
@@ -135,4 +135,17 @@
 	test_cmp expect actual
 '
 
+test_expect_success 'pre-receive hook that forgets to read its input' '
+	write_script victim.git/hooks/pre-receive <<-\EOF &&
+	exit 0
+	EOF
+	rm -f victim.git/hooks/update victim.git/hooks/post-update &&
+
+	for v in $(test_seq 100 999)
+	do
+		git branch branch_$v master || return
+	done &&
+	git push ./victim.git "+refs/heads/*:refs/heads/*"
+'
+
 test_done
diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh
index 1753ef2..fc898c9 100755
--- a/t/t5403-post-checkout-hook.sh
+++ b/t/t5403-post-checkout-hook.sh
@@ -39,7 +39,7 @@
 	old=$(awk "{print \$1}" clone1/.git/post-checkout.args) &&
 	new=$(awk "{print \$2}" clone1/.git/post-checkout.args) &&
 	flag=$(awk "{print \$3}" clone1/.git/post-checkout.args) &&
-	test $old = $new -a $flag = 1
+	test $old = $new && test $flag = 1
 '
 
 test_expect_success 'post-checkout runs as expected ' '
@@ -52,7 +52,7 @@
 	old=$(awk "{print \$1}" clone1/.git/post-checkout.args) &&
 	new=$(awk "{print \$2}" clone1/.git/post-checkout.args) &&
 	flag=$(awk "{print \$3}" clone1/.git/post-checkout.args) &&
-	test $old = $new -a $flag = 1
+	test $old = $new && test $flag = 1
 '
 
 test_expect_success 'post-checkout receives the right args with HEAD changed ' '
@@ -60,7 +60,7 @@
 	old=$(awk "{print \$1}" clone2/.git/post-checkout.args) &&
 	new=$(awk "{print \$2}" clone2/.git/post-checkout.args) &&
 	flag=$(awk "{print \$3}" clone2/.git/post-checkout.args) &&
-	test $old != $new -a $flag = 1
+	test $old != $new && test $flag = 1
 '
 
 test_expect_success 'post-checkout receives the right args when not switching branches ' '
@@ -68,7 +68,7 @@
 	old=$(awk "{print \$1}" clone2/.git/post-checkout.args) &&
 	new=$(awk "{print \$2}" clone2/.git/post-checkout.args) &&
 	flag=$(awk "{print \$3}" clone2/.git/post-checkout.args) &&
-	test $old = $new -a $flag = 0
+	test $old = $new && test $flag = 0
 '
 
 if test "$(git config --bool core.filemode)" = true; then
diff --git a/t/t5408-send-pack-stdin.sh b/t/t5408-send-pack-stdin.sh
new file mode 100755
index 0000000..e8737df
--- /dev/null
+++ b/t/t5408-send-pack-stdin.sh
@@ -0,0 +1,92 @@
+#!/bin/sh
+
+test_description='send-pack --stdin tests'
+. ./test-lib.sh
+
+create_ref () {
+	tree=$(git write-tree) &&
+	test_tick &&
+	commit=$(echo "$1" | git commit-tree $tree) &&
+	git update-ref "$1" $commit
+}
+
+clear_remote () {
+	rm -rf remote.git &&
+	git init --bare remote.git
+}
+
+verify_push () {
+	git rev-parse "$1" >expect &&
+	git --git-dir=remote.git rev-parse "${2:-$1}" >actual &&
+	test_cmp expect actual
+}
+
+test_expect_success 'setup refs' '
+	cat >refs <<-\EOF &&
+	refs/heads/A
+	refs/heads/C
+	refs/tags/D
+	refs/heads/B
+	refs/tags/E
+	EOF
+	for i in $(cat refs); do
+		create_ref $i || return 1
+	done
+'
+
+# sanity check our setup
+test_expect_success 'refs on cmdline' '
+	clear_remote &&
+	git send-pack remote.git $(cat refs) &&
+	for i in $(cat refs); do
+		verify_push $i || return 1
+	done
+'
+
+test_expect_success 'refs over stdin' '
+	clear_remote &&
+	git send-pack remote.git --stdin <refs &&
+	for i in $(cat refs); do
+		verify_push $i || return 1
+	done
+'
+
+test_expect_success 'stdin lines are full refspecs' '
+	clear_remote &&
+	echo "A:other" >input &&
+	git send-pack remote.git --stdin <input &&
+	verify_push refs/heads/A refs/heads/other
+'
+
+test_expect_success 'stdin mixed with cmdline' '
+	clear_remote &&
+	echo A >input &&
+	git send-pack remote.git --stdin B <input &&
+	verify_push A &&
+	verify_push B
+'
+
+test_expect_success 'cmdline refs written in order' '
+	clear_remote &&
+	test_must_fail git send-pack remote.git A:foo B:foo &&
+	verify_push A foo
+'
+
+test_expect_success '--stdin refs come after cmdline' '
+	clear_remote &&
+	echo A:foo >input &&
+	test_must_fail git send-pack remote.git --stdin B:foo <input &&
+	verify_push B foo
+'
+
+test_expect_success 'refspecs and --mirror do not mix (cmdline)' '
+	clear_remote &&
+	test_must_fail git send-pack remote.git --mirror $(cat refs)
+'
+
+test_expect_success 'refspecs and --mirror do not mix (stdin)' '
+	clear_remote &&
+	test_must_fail git send-pack remote.git --mirror --stdin <refs
+'
+
+test_done
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index 29d59ef..d78f320 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh
@@ -447,6 +447,43 @@
 	)
 '
 
+test_expect_success 'explicit --refmap is allowed only with command-line refspec' '
+	cd "$D" &&
+	(
+		cd three &&
+		test_must_fail git fetch --refmap="*:refs/remotes/none/*"
+	)
+'
+
+test_expect_success 'explicit --refmap option overrides remote.*.fetch' '
+	cd "$D" &&
+	git branch -f side &&
+	(
+		cd three &&
+		git update-ref refs/remotes/origin/master base-origin-master &&
+		o=$(git rev-parse --verify refs/remotes/origin/master) &&
+		git fetch --refmap="refs/heads/*:refs/remotes/other/*" origin master &&
+		n=$(git rev-parse --verify refs/remotes/origin/master) &&
+		test "$o" = "$n" &&
+		test_must_fail git rev-parse --verify refs/remotes/origin/side &&
+		git rev-parse --verify refs/remotes/other/master
+	)
+'
+
+test_expect_success 'explicitly empty --refmap option disables remote.*.fetch' '
+	cd "$D" &&
+	git branch -f side &&
+	(
+		cd three &&
+		git update-ref refs/remotes/origin/master base-origin-master &&
+		o=$(git rev-parse --verify refs/remotes/origin/master) &&
+		git fetch --refmap="" origin master &&
+		n=$(git rev-parse --verify refs/remotes/origin/master) &&
+		test "$o" = "$n" &&
+		test_must_fail git rev-parse --verify refs/remotes/origin/side
+	)
+'
+
 test_expect_success 'configured fetch updates tracking' '
 
 	cd "$D" &&
diff --git a/t/t5511-refspec.sh b/t/t5511-refspec.sh
index c289322..de6db86 100755
--- a/t/t5511-refspec.sh
+++ b/t/t5511-refspec.sh
@@ -5,7 +5,6 @@
 . ./test-lib.sh
 
 test_refspec () {
-
 	kind=$1 refspec=$2 expect=$3
 	git config remote.frotz.url "." &&
 	git config --remove-section remote.frotz &&
@@ -84,4 +83,9 @@
 test_refspec fetch 'refs/heads/*/for-linus:refs/remotes/mine/*'
 test_refspec push 'refs/heads/*/for-linus:refs/remotes/mine/*'
 
+good=$(printf '\303\204')
+test_refspec fetch "refs/heads/${good}"
+bad=$(printf '\011tab')
+test_refspec fetch "refs/heads/${bad}"				invalid
+
 test_done
diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh
index 2b69afa..f4da20a 100755
--- a/t/t5516-fetch-push.sh
+++ b/t/t5516-fetch-push.sh
@@ -1278,6 +1278,19 @@
 	git push --no-thin --receive-pack="$rcvpck" no-thin/.git refs/heads/master:refs/heads/foo
 '
 
+test_expect_success 'pushing a tag pushes the tagged object' '
+	rm -rf dst.git &&
+	blob=$(echo unreferenced | git hash-object -w --stdin) &&
+	git tag -m foo tag-of-blob $blob &&
+	git init --bare dst.git &&
+	git push dst.git tag-of-blob &&
+	# the receiving index-pack should have noticed
+	# any problems, but we double check
+	echo unreferenced >expect &&
+	git --git-dir=dst.git cat-file blob tag-of-blob >actual &&
+	test_cmp expect actual
+'
+
 test_expect_success 'push into bare respects core.logallrefupdates' '
 	rm -rf dst.git &&
 	git init --bare dst.git &&
diff --git a/t/t5534-push-signed.sh b/t/t5534-push-signed.sh
new file mode 100755
index 0000000..ecb8d44
--- /dev/null
+++ b/t/t5534-push-signed.sh
@@ -0,0 +1,171 @@
+#!/bin/sh
+
+test_description='signed push'
+
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-gpg.sh
+
+prepare_dst () {
+	rm -fr dst &&
+	test_create_repo dst &&
+
+	git push dst master:noop master:ff master:noff
+}
+
+test_expect_success setup '
+	# master, ff and noff branches pointing at the same commit
+	test_tick &&
+	git commit --allow-empty -m initial &&
+
+	git checkout -b noop &&
+	git checkout -b ff &&
+	git checkout -b noff &&
+
+	# noop stays the same, ff advances, noff rewrites
+	test_tick &&
+	git commit --allow-empty --amend -m rewritten &&
+	git checkout ff &&
+
+	test_tick &&
+	git commit --allow-empty -m second
+'
+
+test_expect_success 'unsigned push does not send push certificate' '
+	prepare_dst &&
+	mkdir -p dst/.git/hooks &&
+	write_script dst/.git/hooks/post-receive <<-\EOF &&
+	# discard the update list
+	cat >/dev/null
+	# record the push certificate
+	if test -n "${GIT_PUSH_CERT-}"
+	then
+		git cat-file blob $GIT_PUSH_CERT >../push-cert
+	fi
+	EOF
+
+	git push dst noop ff +noff &&
+	! test -f dst/push-cert
+'
+
+test_expect_success 'talking with a receiver without push certificate support' '
+	prepare_dst &&
+	mkdir -p dst/.git/hooks &&
+	write_script dst/.git/hooks/post-receive <<-\EOF &&
+	# discard the update list
+	cat >/dev/null
+	# record the push certificate
+	if test -n "${GIT_PUSH_CERT-}"
+	then
+		git cat-file blob $GIT_PUSH_CERT >../push-cert
+	fi
+	EOF
+
+	git push dst noop ff +noff &&
+	! test -f dst/push-cert
+'
+
+test_expect_success 'push --signed fails with a receiver without push certificate support' '
+	prepare_dst &&
+	mkdir -p dst/.git/hooks &&
+	test_must_fail git push --signed dst noop ff +noff 2>err &&
+	test_i18ngrep "the receiving end does not support" err
+'
+
+test_expect_success GPG 'no certificate for a signed push with no update' '
+	prepare_dst &&
+	mkdir -p dst/.git/hooks &&
+	write_script dst/.git/hooks/post-receive <<-\EOF &&
+	if test -n "${GIT_PUSH_CERT-}"
+	then
+		git cat-file blob $GIT_PUSH_CERT >../push-cert
+	fi
+	EOF
+	git push dst noop &&
+	! test -f dst/push-cert
+'
+
+test_expect_success GPG 'signed push sends push certificate' '
+	prepare_dst &&
+	mkdir -p dst/.git/hooks &&
+	git -C dst config receive.certnonceseed sekrit &&
+	write_script dst/.git/hooks/post-receive <<-\EOF &&
+	# discard the update list
+	cat >/dev/null
+	# record the push certificate
+	if test -n "${GIT_PUSH_CERT-}"
+	then
+		git cat-file blob $GIT_PUSH_CERT >../push-cert
+	fi &&
+
+	cat >../push-cert-status <<E_O_F
+	SIGNER=${GIT_PUSH_CERT_SIGNER-nobody}
+	KEY=${GIT_PUSH_CERT_KEY-nokey}
+	STATUS=${GIT_PUSH_CERT_STATUS-nostatus}
+	NONCE_STATUS=${GIT_PUSH_CERT_NONCE_STATUS-nononcestatus}
+	NONCE=${GIT_PUSH_CERT_NONCE-nononce}
+	E_O_F
+
+	EOF
+
+	git push --signed dst noop ff +noff &&
+
+	(
+		cat <<-\EOF &&
+		SIGNER=C O Mitter <committer@example.com>
+		KEY=13B6F51ECDDE430D
+		STATUS=G
+		NONCE_STATUS=OK
+		EOF
+		sed -n -e "s/^nonce /NONCE=/p" -e "/^$/q" dst/push-cert
+	) >expect &&
+
+	grep "$(git rev-parse noop ff) refs/heads/ff" dst/push-cert &&
+	grep "$(git rev-parse noop noff) refs/heads/noff" dst/push-cert &&
+	test_cmp expect dst/push-cert-status
+'
+
+test_expect_success GPG 'fail without key and heed user.signingkey' '
+	prepare_dst &&
+	mkdir -p dst/.git/hooks &&
+	git -C dst config receive.certnonceseed sekrit &&
+	write_script dst/.git/hooks/post-receive <<-\EOF &&
+	# discard the update list
+	cat >/dev/null
+	# record the push certificate
+	if test -n "${GIT_PUSH_CERT-}"
+	then
+		git cat-file blob $GIT_PUSH_CERT >../push-cert
+	fi &&
+
+	cat >../push-cert-status <<E_O_F
+	SIGNER=${GIT_PUSH_CERT_SIGNER-nobody}
+	KEY=${GIT_PUSH_CERT_KEY-nokey}
+	STATUS=${GIT_PUSH_CERT_STATUS-nostatus}
+	NONCE_STATUS=${GIT_PUSH_CERT_NONCE_STATUS-nononcestatus}
+	NONCE=${GIT_PUSH_CERT_NONCE-nononce}
+	E_O_F
+
+	EOF
+
+	unset GIT_COMMITTER_EMAIL &&
+	git config user.email hasnokey@nowhere.com &&
+	test_must_fail git push --signed dst noop ff +noff &&
+	git config user.signingkey committer@example.com &&
+	git push --signed dst noop ff +noff &&
+
+	(
+		cat <<-\EOF &&
+		SIGNER=C O Mitter <committer@example.com>
+		KEY=13B6F51ECDDE430D
+		STATUS=G
+		NONCE_STATUS=OK
+		EOF
+		sed -n -e "s/^nonce /NONCE=/p" -e "/^$/q" dst/push-cert
+	) >expect &&
+
+	grep "$(git rev-parse noop ff) refs/heads/ff" dst/push-cert &&
+	grep "$(git rev-parse noop noff) refs/heads/noff" dst/push-cert &&
+	test_cmp expect dst/push-cert-status
+'
+
+test_done
diff --git a/t/t5539-fetch-http-shallow.sh b/t/t5539-fetch-http-shallow.sh
index 94553e1..b461188 100755
--- a/t/t5539-fetch-http-shallow.sh
+++ b/t/t5539-fetch-http-shallow.sh
@@ -54,6 +54,7 @@
 test_expect_success 'no shallow lines after receiving ACK ready' '
 	(
 		cd shallow &&
+		test_tick &&
 		for i in $(test_seq 15)
 		do
 			git checkout --orphan unrelated$i &&
diff --git a/t/t5541-http-push-smart.sh b/t/t5541-http-push-smart.sh
index 73af16f..d2c681e 100755
--- a/t/t5541-http-push-smart.sh
+++ b/t/t5541-http-push-smart.sh
@@ -12,6 +12,7 @@
 fi
 
 ROOT_PATH="$PWD"
+. "$TEST_DIRECTORY"/lib-gpg.sh
 . "$TEST_DIRECTORY"/lib-httpd.sh
 . "$TEST_DIRECTORY"/lib-terminal.sh
 start_httpd
@@ -323,5 +324,60 @@
 	test_cmp expect actual
 '
 
+run_with_limited_cmdline () {
+	(ulimit -s 128 && "$@")
+}
+
+test_lazy_prereq CMDLINE_LIMIT 'run_with_limited_cmdline true'
+
+test_expect_success CMDLINE_LIMIT 'push 2000 tags over http' '
+	sha1=$(git rev-parse HEAD) &&
+	test_seq 2000 |
+	  sort |
+	  sed "s|.*|$sha1 refs/tags/really-long-tag-name-&|" \
+	  >.git/packed-refs &&
+	run_with_limited_cmdline git push --mirror
+'
+
+test_expect_success GPG 'push with post-receive to inspect certificate' '
+	(
+		cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git &&
+		mkdir -p hooks &&
+		write_script hooks/post-receive <<-\EOF &&
+		# discard the update list
+		cat >/dev/null
+		# record the push certificate
+		if test -n "${GIT_PUSH_CERT-}"
+		then
+			git cat-file blob $GIT_PUSH_CERT >../push-cert
+		fi &&
+		cat >../push-cert-status <<E_O_F
+		SIGNER=${GIT_PUSH_CERT_SIGNER-nobody}
+		KEY=${GIT_PUSH_CERT_KEY-nokey}
+		STATUS=${GIT_PUSH_CERT_STATUS-nostatus}
+		NONCE_STATUS=${GIT_PUSH_CERT_NONCE_STATUS-nononcestatus}
+		NONCE=${GIT_PUSH_CERT_NONCE-nononce}
+		E_O_F
+		EOF
+
+		git config receive.certnonceseed sekrit &&
+		git config receive.certnonceslop 30
+	) &&
+	cd "$ROOT_PATH/test_repo_clone" &&
+	test_commit cert-test &&
+	git push --signed "$HTTPD_URL/smart/test_repo.git" &&
+	(
+		cd "$HTTPD_DOCUMENT_ROOT_PATH" &&
+		cat <<-\EOF &&
+		SIGNER=C O Mitter <committer@example.com>
+		KEY=13B6F51ECDDE430D
+		STATUS=G
+		NONCE_STATUS=OK
+		EOF
+		sed -n -e "s/^nonce /NONCE=/p" -e "/^$/q" push-cert
+	) >expect &&
+	test_cmp expect "$HTTPD_DOCUMENT_ROOT_PATH/push-cert-status"
+'
+
 stop_httpd
 test_done
diff --git a/t/t5550-http-fetch-dumb.sh b/t/t5550-http-fetch-dumb.sh
index 1a3a2b6..ac71418 100755
--- a/t/t5550-http-fetch-dumb.sh
+++ b/t/t5550-http-fetch-dumb.sh
@@ -171,5 +171,30 @@
 	test_cmp exp act
 '
 
+test_expect_success 'git client shows text/plain errors' '
+	test_must_fail git clone "$HTTPD_URL/error/text" 2>stderr &&
+	grep "this is the error message" stderr
+'
+
+test_expect_success 'git client does not show html errors' '
+	test_must_fail git clone "$HTTPD_URL/error/html" 2>stderr &&
+	! grep "this is the error message" stderr
+'
+
+test_expect_success 'git client shows text/plain with a charset' '
+	test_must_fail git clone "$HTTPD_URL/error/charset" 2>stderr &&
+	grep "this is the error message" stderr
+'
+
+test_expect_success 'http error messages are reencoded' '
+	test_must_fail git clone "$HTTPD_URL/error/utf16" 2>stderr &&
+	grep "this is the error message" stderr
+'
+
+test_expect_success 'reencoding is robust to whitespace oddities' '
+	test_must_fail git clone "$HTTPD_URL/error/odd-spacing" 2>stderr &&
+	grep "this is the error message" stderr
+'
+
 stop_httpd
 test_done
diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh
index e07eaf3..6cbc12d 100755
--- a/t/t5551-http-fetch-smart.sh
+++ b/t/t5551-http-fetch-smart.sh
@@ -213,8 +213,6 @@
 	test_cmp expect_cookies.txt cookies_tail.txt
 '
 
-test -n "$GIT_TEST_LONG" && test_set_prereq EXPENSIVE
-
 test_expect_success EXPENSIVE 'create 50,000 tags in the repo' '
 	(
 	cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
@@ -240,8 +238,7 @@
 '
 
 test_expect_success EXPENSIVE 'clone the 50,000 tag repo to check OS command line overflow' '
-	git clone $HTTPD_URL/smart/repo.git too-many-refs 2>err &&
-	test_line_count = 0 err &&
+	git clone $HTTPD_URL/smart/repo.git too-many-refs &&
 	(
 		cd too-many-refs &&
 		test $(git for-each-ref refs/tags | wc -l) = 50000
diff --git a/t/t5572-pull-submodule.sh b/t/t5572-pull-submodule.sh
new file mode 100755
index 0000000..accfa5c
--- /dev/null
+++ b/t/t5572-pull-submodule.sh
@@ -0,0 +1,45 @@
+#!/bin/sh
+
+test_description='pull can handle submodules'
+
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-submodule-update.sh
+
+reset_branch_to_HEAD () {
+	git branch -D "$1" &&
+	git checkout -b "$1" HEAD &&
+	git branch --set-upstream-to="origin/$1" "$1"
+}
+
+git_pull () {
+	reset_branch_to_HEAD "$1" &&
+	git pull
+}
+
+# pulls without conflicts
+test_submodule_switch "git_pull"
+
+git_pull_ff () {
+	reset_branch_to_HEAD "$1" &&
+	git pull --ff
+}
+
+test_submodule_switch "git_pull_ff"
+
+git_pull_ff_only () {
+	reset_branch_to_HEAD "$1" &&
+	git pull --ff-only
+}
+
+test_submodule_switch "git_pull_ff_only"
+
+git_pull_noff () {
+	reset_branch_to_HEAD "$1" &&
+	git pull --no-ff
+}
+
+KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1
+KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1
+test_submodule_switch "git_pull_noff"
+
+test_done
diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
index 5e67035..e4f10c0 100755
--- a/t/t5601-clone.sh
+++ b/t/t5601-clone.sh
@@ -318,7 +318,7 @@
 	expect_ssh myhost src
 '
 
-test_expect_success NOT_MINGW,NOT_CYGWIN 'clone local path foo:bar' '
+test_expect_success !MINGW,!CYGWIN 'clone local path foo:bar' '
 	cp -R src "foo:bar" &&
 	git clone "foo:bar" foobar &&
 	expect_ssh none
@@ -339,7 +339,7 @@
 	expect_ssh "$2" "$3"
 }
 
-test_expect_success NOT_MINGW 'clone c:temp is ssl' '
+test_expect_success !MINGW 'clone c:temp is ssl' '
 	test_clone_url c:temp c temp
 '
 
diff --git a/t/t5704-bundle.sh b/t/t5704-bundle.sh
index a45c316..348d9b3 100755
--- a/t/t5704-bundle.sh
+++ b/t/t5704-bundle.sh
@@ -14,7 +14,10 @@
 	git tag -d third
 '
 
-test_expect_success 'tags can be excluded by rev-list options' '
+test_expect_success 'annotated tags can be excluded by rev-list options' '
+	git bundle create bundle --all --since=7.Apr.2005.15:14:00.-0700 &&
+	git ls-remote bundle > output &&
+	grep tag output &&
 	git bundle create bundle --all --since=7.Apr.2005.15:16:00.-0700 &&
 	git ls-remote bundle > output &&
 	! grep tag output
diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh
index a00a660..2419407 100755
--- a/t/t5801-remote-helpers.sh
+++ b/t/t5801-remote-helpers.sh
@@ -87,13 +87,29 @@
 	compare_refs local HEAD server refs/heads/new-name
 '
 
-test_expect_failure 'push new branch with old:new refspec' '
+test_expect_success 'push new branch with old:new refspec' '
 	(cd local &&
 	 git push origin new-name:new-refspec
 	) &&
 	compare_refs local HEAD server refs/heads/new-refspec
 '
 
+test_expect_success 'push new branch with HEAD:new refspec' '
+	(cd local &&
+	 git checkout new-name
+	 git push origin HEAD:new-refspec-2
+	) &&
+	compare_refs local HEAD server refs/heads/new-refspec-2
+'
+
+test_expect_success 'push delete branch' '
+	(cd local &&
+	 git push origin :new-name
+	) &&
+	test_must_fail git --git-dir="server/.git" \
+	 rev-parse --verify refs/heads/new-name
+'
+
 test_expect_success 'forced push' '
 	(cd local &&
 	git checkout -b force-test &&
diff --git a/t/t6000-rev-list-misc.sh b/t/t6000-rev-list-misc.sh
index 3794e4c..2602086 100755
--- a/t/t6000-rev-list-misc.sh
+++ b/t/t6000-rev-list-misc.sh
@@ -73,4 +73,27 @@
 	test_cmp expect actual
 '
 
+test_expect_success 'rev-list can show index objects' '
+	# Of the blobs and trees in the index, note:
+	#
+	#   - we do not show two/three, because it is the
+	#     same blob as "one", and we show objects only once
+	#
+	#   - we do show the tree "two", because it has a valid cache tree
+	#     from the last commit
+	#
+	#   - we do not show the root tree; since we updated the index, it
+	#     does not have a valid cache tree
+	#
+	cat >expect <<-\EOF
+	8e4020bb5a8d8c873b25de15933e75cc0fc275df one
+	d9d3a7417b9605cfd88ee6306b28dadc29e6ab08 only-in-index
+	9200b628cf9dc883a85a7abc8d6e6730baee589c two
+	EOF
+	echo only-in-index >only-in-index &&
+	git add only-in-index &&
+	git rev-list --objects --indexed-objects >actual &&
+	test_cmp expect actual
+'
+
 test_done
diff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh
index 88ed319..a02a45a 100755
--- a/t/t6006-rev-list-format.sh
+++ b/t/t6006-rev-list-format.sh
@@ -35,13 +35,13 @@
 	: >foo &&
 	git add foo &&
 	git config i18n.commitEncoding $test_encoding &&
-	git commit -m "$added_iso88591" &&
+	echo "$added_iso88591" | git commit -F - &&
 	head1=$(git rev-parse --verify HEAD) &&
 	head1_short=$(git rev-parse --verify --short $head1) &&
 	tree1=$(git rev-parse --verify HEAD:) &&
 	tree1_short=$(git rev-parse --verify --short $tree1) &&
 	echo "$changed" > foo &&
-	git commit -a -m "$changed_iso88591" &&
+	echo "$changed_iso88591" | git commit -a -F - &&
 	head2=$(git rev-parse --verify HEAD) &&
 	head2_short=$(git rev-parse --verify --short $head2) &&
 	tree2=$(git rev-parse --verify HEAD:) &&
diff --git a/t/t6023-merge-file.sh b/t/t6023-merge-file.sh
index 432f086..3758961 100755
--- a/t/t6023-merge-file.sh
+++ b/t/t6023-merge-file.sh
@@ -77,12 +77,29 @@
 	"git merge-file --quiet test.txt orig.txt new2.txt"
 
 cp new1.txt test2.txt
-test_expect_success "merge without conflict (missing LF at EOF)" \
-	"git merge-file test2.txt orig.txt new2.txt"
+test_expect_failure "merge without conflict (missing LF at EOF)" \
+	"git merge-file test2.txt orig.txt new4.txt"
 
-test_expect_success "merge result added missing LF" \
+test_expect_failure "merge result added missing LF" \
 	"test_cmp test.txt test2.txt"
 
+cp new4.txt test3.txt
+test_expect_success "merge without conflict (missing LF at EOF, away from change in the other file)" \
+	"git merge-file --quiet test3.txt new2.txt new3.txt"
+
+cat > expect.txt << EOF
+DOMINUS regit me,
+et nihil mihi deerit.
+In loco pascuae ibi me collocavit,
+super aquam refectionis educavit me;
+animam meam convertit,
+deduxit me super semitas jusitiae,
+EOF
+printf "propter nomen suum." >> expect.txt
+
+test_expect_success "merge does not add LF away of change" \
+	"test_cmp test3.txt expect.txt"
+
 cp test.txt backup.txt
 test_expect_success "merge with conflicts" \
 	"test_must_fail git merge-file test.txt orig.txt new3.txt"
@@ -107,6 +124,55 @@
 test_expect_success "expected conflict markers" "test_cmp test.txt expect.txt"
 
 cp backup.txt test.txt
+
+cat > expect.txt << EOF
+Dominus regit me, et nihil mihi deerit.
+In loco pascuae ibi me collocavit,
+super aquam refectionis educavit me;
+animam meam convertit,
+deduxit me super semitas jusitiae,
+propter nomen suum.
+Nam et si ambulavero in medio umbrae mortis,
+non timebo mala, quoniam tu mecum es:
+virga tua et baculus tuus ipsa me consolata sunt.
+EOF
+test_expect_success "merge conflicting with --ours" \
+	"git merge-file --ours test.txt orig.txt new3.txt && test_cmp test.txt expect.txt"
+cp backup.txt test.txt
+
+cat > expect.txt << EOF
+DOMINUS regit me,
+et nihil mihi deerit.
+In loco pascuae ibi me collocavit,
+super aquam refectionis educavit me;
+animam meam convertit,
+deduxit me super semitas jusitiae,
+propter nomen suum.
+Nam et si ambulavero in medio umbrae mortis,
+non timebo mala, quoniam tu mecum es:
+virga tua et baculus tuus ipsa me consolata sunt.
+EOF
+test_expect_success "merge conflicting with --theirs" \
+	"git merge-file --theirs test.txt orig.txt new3.txt && test_cmp test.txt expect.txt"
+cp backup.txt test.txt
+
+cat > expect.txt << EOF
+Dominus regit me, et nihil mihi deerit.
+DOMINUS regit me,
+et nihil mihi deerit.
+In loco pascuae ibi me collocavit,
+super aquam refectionis educavit me;
+animam meam convertit,
+deduxit me super semitas jusitiae,
+propter nomen suum.
+Nam et si ambulavero in medio umbrae mortis,
+non timebo mala, quoniam tu mecum es:
+virga tua et baculus tuus ipsa me consolata sunt.
+EOF
+test_expect_success "merge conflicting with --union" \
+	"git merge-file --union test.txt orig.txt new3.txt && test_cmp test.txt expect.txt"
+cp backup.txt test.txt
+
 test_expect_success "merge with conflicts, using -L" \
 	"test_must_fail git merge-file -L 1 -L 2 test.txt orig.txt new3.txt"
 
@@ -260,4 +326,23 @@
 	test_cmp expect actual
 '
 
+printf "line1\nline2\nline3" >nolf-orig.txt
+printf "line1\nline2\nline3x" >nolf-diff1.txt
+printf "line1\nline2\nline3y" >nolf-diff2.txt
+
+test_expect_success 'conflict at EOF without LF resolved by --ours' \
+	'git merge-file -p --ours nolf-diff1.txt nolf-orig.txt nolf-diff2.txt >output.txt &&
+	 printf "line1\nline2\nline3x" >expect.txt &&
+	 test_cmp expect.txt output.txt'
+
+test_expect_success 'conflict at EOF without LF resolved by --theirs' \
+	'git merge-file -p --theirs nolf-diff1.txt nolf-orig.txt nolf-diff2.txt >output.txt &&
+	 printf "line1\nline2\nline3y" >expect.txt &&
+	 test_cmp expect.txt output.txt'
+
+test_expect_success 'conflict at EOF without LF resolved by --union' \
+	'git merge-file -p --union nolf-diff1.txt nolf-orig.txt nolf-diff2.txt >output.txt &&
+	 printf "line1\nline2\nline3x\nline3y" >expect.txt &&
+	 test_cmp expect.txt output.txt'
+
 test_done
diff --git a/t/t6031-merge-recursive.sh b/t/t6031-merge-recursive.sh
index a953f1b..6464a16 100755
--- a/t/t6031-merge-recursive.sh
+++ b/t/t6031-merge-recursive.sh
@@ -13,6 +13,7 @@
 	git commit -m a &&
 	git checkout -b b1 master &&
 	test_chmod +x file1 &&
+	git add file1 &&
 	git commit -m b1 &&
 	git checkout a1 &&
 	git merge-recursive master -- a1 b1 &&
diff --git a/t/t6038-merge-text-auto.sh b/t/t6038-merge-text-auto.sh
index d9c2d38..85c10b0 100755
--- a/t/t6038-merge-text-auto.sh
+++ b/t/t6038-merge-text-auto.sh
@@ -72,6 +72,10 @@
 	same line
 	EOF
 
+	if test_have_prereq NATIVE_CRLF; then
+		append_cr <expected >expected.temp &&
+		mv expected.temp expected
+	fi &&
 	git config merge.renormalize true &&
 	git rm -fr . &&
 	rm -f .gitattributes &&
@@ -86,6 +90,10 @@
 	same line
 	EOF
 
+	if test_have_prereq NATIVE_CRLF; then
+		append_cr <expected >expected.temp &&
+		mv expected.temp expected
+	fi &&
 	git config merge.renormalize true &&
 	git rm -fr . &&
 	rm -f .gitattributes &&
@@ -95,16 +103,19 @@
 '
 
 test_expect_success 'Detect CRLF/LF conflict after setting text=auto' '
-	q_to_cr <<-\EOF >expected &&
-	<<<<<<<
-	first line
-	same line
-	=======
-	first lineQ
-	same lineQ
-	>>>>>>>
-	EOF
-
+	echo "<<<<<<<" >expected &&
+	if test_have_prereq NATIVE_CRLF; then
+		echo first line | append_cr >>expected &&
+		echo same line | append_cr >>expected &&
+		echo ======= | append_cr >>expected
+	else
+		echo first line >>expected &&
+		echo same line >>expected &&
+		echo ======= >>expected
+	fi &&
+	echo first line | append_cr >>expected &&
+	echo same line | append_cr >>expected &&
+	echo ">>>>>>>" >>expected &&
 	git config merge.renormalize false &&
 	rm -f .gitattributes &&
 	git reset --hard a &&
@@ -114,16 +125,19 @@
 '
 
 test_expect_success 'Detect LF/CRLF conflict from addition of text=auto' '
-	q_to_cr <<-\EOF >expected &&
-	<<<<<<<
-	first lineQ
-	same lineQ
-	=======
-	first line
-	same line
-	>>>>>>>
-	EOF
-
+	echo "<<<<<<<" >expected &&
+	echo first line | append_cr >>expected &&
+	echo same line | append_cr >>expected &&
+	if test_have_prereq NATIVE_CRLF; then
+		echo ======= | append_cr >>expected &&
+		echo first line | append_cr >>expected &&
+		echo same line | append_cr >>expected
+	else
+		echo ======= >>expected &&
+		echo first line >>expected &&
+		echo same line >>expected
+	fi &&
+	echo ">>>>>>>" >>expected &&
 	git config merge.renormalize false &&
 	rm -f .gitattributes &&
 	git reset --hard b &&
diff --git a/t/t6041-bisect-submodule.sh b/t/t6041-bisect-submodule.sh
new file mode 100755
index 0000000..c6b7aa6
--- /dev/null
+++ b/t/t6041-bisect-submodule.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+test_description='bisect can handle submodules'
+
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-submodule-update.sh
+
+git_bisect () {
+	git status -su >expect &&
+	ls -1pR * >>expect &&
+	tar czf "$TRASH_DIRECTORY/tmp.tgz" * &&
+	GOOD=$(git rev-parse --verify HEAD) &&
+	git checkout "$1" &&
+	echo "foo" >bar &&
+	git add bar &&
+	git commit -m "bisect bad" &&
+	BAD=$(git rev-parse --verify HEAD) &&
+	git reset --hard HEAD^^ &&
+	git submodule update &&
+	git bisect start &&
+	git bisect good $GOOD &&
+	rm -rf * &&
+	tar xzf "$TRASH_DIRECTORY/tmp.tgz" &&
+	git status -su >actual &&
+	ls -1pR * >>actual &&
+	test_cmp expect actual &&
+	git bisect bad $BAD
+}
+
+test_submodule_switch "git_bisect"
+
+test_done
diff --git a/t/t6050-replace.sh b/t/t6050-replace.sh
index 719a116..4d5a25e 100755
--- a/t/t6050-replace.sh
+++ b/t/t6050-replace.sh
@@ -7,8 +7,9 @@
 exec </dev/null
 
 . ./test-lib.sh
+. "$TEST_DIRECTORY/lib-gpg.sh"
 
-add_and_commit_file()
+add_and_commit_file ()
 {
     _file="$1"
     _msg="$2"
@@ -18,6 +19,38 @@
     git commit --quiet -m "$_file: $_msg"
 }
 
+commit_buffer_contains_parents ()
+{
+    git cat-file commit "$1" >payload &&
+    sed -n -e '/^$/q' -e '/^parent /p' <payload >actual &&
+    shift &&
+    for _parent
+    do
+	echo "parent $_parent"
+    done >expected &&
+    test_cmp expected actual
+}
+
+commit_peeling_shows_parents ()
+{
+    _parent_number=1
+    _commit="$1"
+    shift &&
+    for _parent
+    do
+	_found=$(git rev-parse --verify $_commit^$_parent_number) || return 1
+	test "$_found" = "$_parent" || return 1
+	_parent_number=$(( $_parent_number + 1 ))
+    done &&
+    test_must_fail git rev-parse --verify $_commit^$_parent_number
+}
+
+commit_has_parents ()
+{
+    commit_buffer_contains_parents "$@" &&
+    commit_peeling_shows_parents "$@"
+}
+
 HASH1=
 HASH2=
 HASH3=
@@ -27,36 +60,36 @@
 HASH7=
 
 test_expect_success 'set up buggy branch' '
-     echo "line 1" >> hello &&
-     echo "line 2" >> hello &&
-     echo "line 3" >> hello &&
-     echo "line 4" >> hello &&
+     echo "line 1" >>hello &&
+     echo "line 2" >>hello &&
+     echo "line 3" >>hello &&
+     echo "line 4" >>hello &&
      add_and_commit_file hello "4 lines" &&
      HASH1=$(git rev-parse --verify HEAD) &&
-     echo "line BUG" >> hello &&
-     echo "line 6" >> hello &&
-     echo "line 7" >> hello &&
-     echo "line 8" >> hello &&
+     echo "line BUG" >>hello &&
+     echo "line 6" >>hello &&
+     echo "line 7" >>hello &&
+     echo "line 8" >>hello &&
      add_and_commit_file hello "4 more lines with a BUG" &&
      HASH2=$(git rev-parse --verify HEAD) &&
-     echo "line 9" >> hello &&
-     echo "line 10" >> hello &&
+     echo "line 9" >>hello &&
+     echo "line 10" >>hello &&
      add_and_commit_file hello "2 more lines" &&
      HASH3=$(git rev-parse --verify HEAD) &&
-     echo "line 11" >> hello &&
+     echo "line 11" >>hello &&
      add_and_commit_file hello "1 more line" &&
      HASH4=$(git rev-parse --verify HEAD) &&
-     sed -e "s/BUG/5/" hello > hello.new &&
+     sed -e "s/BUG/5/" hello >hello.new &&
      mv hello.new hello &&
      add_and_commit_file hello "BUG fixed" &&
      HASH5=$(git rev-parse --verify HEAD) &&
-     echo "line 12" >> hello &&
-     echo "line 13" >> hello &&
+     echo "line 12" >>hello &&
+     echo "line 13" >>hello &&
      add_and_commit_file hello "2 more lines" &&
      HASH6=$(git rev-parse --verify HEAD) &&
-     echo "line 14" >> hello &&
-     echo "line 15" >> hello &&
-     echo "line 16" >> hello &&
+     echo "line 14" >>hello &&
+     echo "line 15" >>hello &&
+     echo "line 16" >>hello &&
      add_and_commit_file hello "again 3 more lines" &&
      HASH7=$(git rev-parse --verify HEAD)
 '
@@ -95,7 +128,7 @@
 '
 
 test_expect_success '"git fsck" works' '
-     git fsck master > fsck_master.out &&
+     git fsck master >fsck_master.out &&
      grep "dangling commit $R" fsck_master.out &&
      grep "dangling tag $(cat .git/refs/tags/mytag)" fsck_master.out &&
      test -z "$(git fsck)"
@@ -217,14 +250,14 @@
      (
 	  cd clone_dir &&
 	  git fetch origin refs/heads/tofetch:refs/heads/parallel3 &&
-	  git log --pretty=oneline parallel3 > output.txt &&
+	  git log --pretty=oneline parallel3 >output.txt &&
 	  ! grep $PARA3 output.txt &&
-	  git show $PARA3 > para3.txt &&
+	  git show $PARA3 >para3.txt &&
 	  grep "A U Thor" para3.txt &&
 	  git fetch origin "refs/replace/*:refs/replace/*" &&
-	  git log --pretty=oneline parallel3 > output.txt &&
+	  git log --pretty=oneline parallel3 >output.txt &&
 	  grep $PARA3 output.txt &&
-	  git show $PARA3 > para3.txt &&
+	  git show $PARA3 >para3.txt &&
 	  grep "O Thor" para3.txt
      )
 '
@@ -302,7 +335,7 @@
 		echo "$PARA3 -> $S" &&
 		echo "$MYTAG -> $HASH1"
 	} | sort >expected &&
-	git replace -l --format medium | sort > actual &&
+	git replace -l --format medium | sort >actual &&
 	test_cmp expected actual
 '
 
@@ -314,14 +347,97 @@
 		echo "$PARA3 (commit) -> $S (commit)" &&
 		echo "$MYTAG (tag) -> $HASH1 (commit)"
 	} | sort >expected &&
-	git replace --format=long | sort > actual &&
+	git replace --format=long | sort >actual &&
 	test_cmp expected actual
 '
 
+test_expect_success 'setup a fake editor' '
+	write_script fakeeditor <<-\EOF
+		sed -e "s/A U Thor/A fake Thor/" "$1" >"$1.new"
+		mv "$1.new" "$1"
+	EOF
+'
+
+test_expect_success '--edit with and without already replaced object' '
+	test_must_fail env GIT_EDITOR=./fakeeditor git replace --edit "$PARA3" &&
+	GIT_EDITOR=./fakeeditor git replace --force --edit "$PARA3" &&
+	git replace -l | grep "$PARA3" &&
+	git cat-file commit "$PARA3" | grep "A fake Thor" &&
+	git replace -d "$PARA3" &&
+	GIT_EDITOR=./fakeeditor git replace --edit "$PARA3" &&
+	git replace -l | grep "$PARA3" &&
+	git cat-file commit "$PARA3" | grep "A fake Thor"
+'
+
+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" &&
+	GIT_EDITOR=./fakeeditor git replace --edit "$PARA3" &&
+	git replace -l | grep "$PARA3" &&
+	git cat-file commit "$PARA3" | grep "A fake Thor"
+'
+
 test_expect_success 'replace ref cleanup' '
 	test -n "$(git replace)" &&
 	git replace -d $(git replace) &&
 	test -z "$(git replace)"
 '
 
+test_expect_success '--graft with and without already replaced object' '
+	test $(git log --oneline | wc -l) = 7 &&
+	git replace --graft $HASH5 &&
+	test $(git log --oneline | wc -l) = 3 &&
+	commit_has_parents $HASH5 &&
+	test_must_fail git replace --graft $HASH5 $HASH4 $HASH3 &&
+	git replace --force -g $HASH5 $HASH4 $HASH3 &&
+	commit_has_parents $HASH5 $HASH4 $HASH3 &&
+	git replace -d $HASH5
+'
+
+test_expect_success GPG 'set up a signed commit' '
+	echo "line 17" >>hello &&
+	echo "line 18" >>hello &&
+	git add hello &&
+	test_tick &&
+	git commit --quiet -S -m "hello: 2 more lines in a signed commit" &&
+	HASH8=$(git rev-parse --verify HEAD) &&
+	git verify-commit $HASH8
+'
+
+test_expect_success GPG '--graft with a signed commit' '
+	git cat-file commit $HASH8 >orig &&
+	git replace --graft $HASH8 &&
+	git cat-file commit $HASH8 >repl &&
+	commit_has_parents $HASH8 &&
+	test_must_fail git verify-commit $HASH8 &&
+	sed -n -e "/^tree /p" -e "/^author /p" -e "/^committer /p" orig >expected &&
+	echo >>expected &&
+	sed -e "/^$/q" repl >actual &&
+	test_cmp expected actual &&
+	git replace -d $HASH8
+'
+
+test_expect_success GPG 'set up a merge commit with a mergetag' '
+	git reset --hard HEAD &&
+	git checkout -b test_branch HEAD~2 &&
+	echo "line 1 from test branch" >>hello &&
+	echo "line 2 from test branch" >>hello &&
+	git add hello &&
+	test_tick &&
+	git commit -m "hello: 2 more lines from a test branch" &&
+	HASH9=$(git rev-parse --verify HEAD) &&
+	git tag -s -m "tag for testing with a mergetag" test_tag HEAD &&
+	git checkout master &&
+	git merge -s ours test_tag &&
+	HASH10=$(git rev-parse --verify HEAD) &&
+	git cat-file commit $HASH10 | grep "^mergetag object"
+'
+
+test_expect_success GPG '--graft on a commit with a mergetag' '
+	test_must_fail git replace --graft $HASH10 $HASH8^1 &&
+	git replace --graft $HASH10 $HASH8^1 $HASH9 &&
+	git replace -d $HASH10
+'
+
 test_done
diff --git a/t/t6501-freshen-objects.sh b/t/t6501-freshen-objects.sh
new file mode 100755
index 0000000..157f3f9
--- /dev/null
+++ b/t/t6501-freshen-objects.sh
@@ -0,0 +1,132 @@
+#!/bin/sh
+#
+# This test covers the handling of objects which might have old
+# mtimes in the filesystem (because they were used previously)
+# and are just now becoming referenced again.
+#
+# We're going to do two things that are a little bit "fake" to
+# help make our simulation easier:
+#
+#   1. We'll turn off reflogs. You can still run into
+#      problems with reflogs on, but your objects
+#      don't get pruned until both the reflog expiration
+#      has passed on their references, _and_ they are out
+#      of prune's expiration period. Dropping reflogs
+#      means we only have to deal with one variable in our tests,
+#      but the results generalize.
+#
+#   2. We'll use a temporary index file to create our
+#      works-in-progress. Most workflows would mention
+#      referenced objects in the index, which prune takes
+#      into account. However, many operations don't. For
+#      example, a partial commit with "git commit foo"
+#      will use a temporary index. Or they may not need
+#      an index at all (e.g., creating a new commit
+#      to refer to an existing tree).
+
+test_description='check pruning of dependent objects'
+. ./test-lib.sh
+
+# We care about reachability, so we do not want to use
+# the normal test_commit, which creates extra tags.
+add () {
+	echo "$1" >"$1" &&
+	git add "$1"
+}
+commit () {
+	test_tick &&
+	add "$1" &&
+	git commit -m "$1"
+}
+
+maybe_repack () {
+	if test -n "$repack"; then
+		git repack -ad
+	fi
+}
+
+for repack in '' true; do
+	title=${repack:+repack}
+	title=${title:-loose}
+
+	test_expect_success "make repo completely empty ($title)" '
+		rm -rf .git &&
+		git init
+	'
+
+	test_expect_success "disable reflogs ($title)" '
+		git config core.logallrefupdates false &&
+		rm -rf .git/logs
+	'
+
+	test_expect_success "setup basic history ($title)" '
+		commit base
+	'
+
+	test_expect_success "create and abandon some objects ($title)" '
+		git checkout -b experiment &&
+		commit abandon &&
+		maybe_repack &&
+		git checkout master &&
+		git branch -D experiment
+	'
+
+	test_expect_success "simulate time passing ($title)" '
+		find .git/objects -type f |
+		xargs test-chmtime -v -86400
+	'
+
+	test_expect_success "start writing new commit with old blob ($title)" '
+		tree=$(
+			GIT_INDEX_FILE=index.tmp &&
+			export GIT_INDEX_FILE &&
+			git read-tree HEAD &&
+			add unrelated &&
+			add abandon &&
+			git write-tree
+		)
+	'
+
+	test_expect_success "simultaneous gc ($title)" '
+		git gc --prune=12.hours.ago
+	'
+
+	test_expect_success "finish writing out commit ($title)" '
+		commit=$(echo foo | git commit-tree -p HEAD $tree) &&
+		git update-ref HEAD $commit
+	'
+
+	# "abandon" blob should have been rescued by reference from new tree
+	test_expect_success "repository passes fsck ($title)" '
+		git fsck
+	'
+
+	test_expect_success "abandon objects again ($title)" '
+		git reset --hard HEAD^ &&
+		find .git/objects -type f |
+		xargs test-chmtime -v -86400
+	'
+
+	test_expect_success "start writing new commit with same tree ($title)" '
+		tree=$(
+			GIT_INDEX_FILE=index.tmp &&
+			export GIT_INDEX_FILE &&
+			git read-tree HEAD &&
+			add abandon &&
+			add unrelated &&
+			git write-tree
+		)
+	'
+
+	test_expect_success "simultaneous gc ($title)" '
+		git gc --prune=12.hours.ago
+	'
+
+	# tree should have been refreshed by write-tree
+	test_expect_success "finish writing out commit ($title)" '
+		commit=$(echo foo | git commit-tree -p HEAD $tree) &&
+		git update-ref HEAD $commit
+	'
+done
+
+test_done
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 54d7807..69f11bd 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -350,10 +350,11 @@
 '
 
 test_expect_success 'git mv moves a submodule with gitfile' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	mkdir mod &&
 	(
 		cd mod &&
 		git mv ../sub/ .
@@ -372,11 +373,12 @@
 '
 
 test_expect_success 'mv does not complain when no .gitmodules file is found' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	git rm .gitmodules &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	mkdir mod &&
 	git mv sub mod/sub 2>actual.err &&
 	! test -s actual.err &&
 	! test -e sub &&
@@ -390,11 +392,12 @@
 '
 
 test_expect_success 'mv will error out on a modified .gitmodules file unless staged' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	git config -f .gitmodules foo.bar true &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
+	mkdir mod &&
 	test_must_fail git mv sub mod/sub 2>actual.err &&
 	test -s actual.err &&
 	test -e sub &&
@@ -413,13 +416,14 @@
 '
 
 test_expect_success 'mv issues a warning when section is not found in .gitmodules' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
 	git config -f .gitmodules --remove-section submodule.sub &&
 	git add .gitmodules &&
 	entry="$(git ls-files --stage sub | cut -f 1)" &&
 	echo "warning: Could not find section in .gitmodules where path=sub" >expect.err &&
+	mkdir mod &&
 	git mv sub mod/sub 2>actual.err &&
 	test_i18ncmp expect.err actual.err &&
 	! test -e sub &&
@@ -433,9 +437,10 @@
 '
 
 test_expect_success 'mv --dry-run does not touch the submodule or .gitmodules' '
-	rm -rf mod/sub &&
+	rm -rf mod &&
 	git reset --hard &&
 	git submodule update &&
+	mkdir mod &&
 	git mv -n sub mod/sub 2>actual.err &&
 	test -f sub/.git &&
 	git diff-index --exit-code HEAD &&
diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh
index 143a8ea..796e9f7 100755
--- a/t/t7004-tag.sh
+++ b/t/t7004-tag.sh
@@ -1385,41 +1385,103 @@
 	git tag foo1.6 &&
 	git tag foo1.10 &&
 	git tag -l --sort=refname "foo*" >actual &&
-	cat >expect <<EOF &&
-foo1.10
-foo1.3
-foo1.6
-EOF
+	cat >expect <<-\EOF &&
+	foo1.10
+	foo1.3
+	foo1.6
+	EOF
 	test_cmp expect actual
 '
 
 test_expect_success 'version sort' '
 	git tag -l --sort=version:refname "foo*" >actual &&
-	cat >expect <<EOF &&
-foo1.3
-foo1.6
-foo1.10
-EOF
+	cat >expect <<-\EOF &&
+	foo1.3
+	foo1.6
+	foo1.10
+	EOF
 	test_cmp expect actual
 '
 
 test_expect_success 'reverse version sort' '
 	git tag -l --sort=-version:refname "foo*" >actual &&
-	cat >expect <<EOF &&
-foo1.10
-foo1.6
-foo1.3
-EOF
+	cat >expect <<-\EOF &&
+	foo1.10
+	foo1.6
+	foo1.3
+	EOF
 	test_cmp expect actual
 '
 
 test_expect_success 'reverse lexical sort' '
 	git tag -l --sort=-refname "foo*" >actual &&
-	cat >expect <<EOF &&
-foo1.6
-foo1.3
-foo1.10
-EOF
+	cat >expect <<-\EOF &&
+	foo1.6
+	foo1.3
+	foo1.10
+	EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'configured lexical sort' '
+	git config tag.sort "v:refname" &&
+	git tag -l "foo*" >actual &&
+	cat >expect <<-\EOF &&
+	foo1.3
+	foo1.6
+	foo1.10
+	EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'option override configured sort' '
+	git tag -l --sort=-refname "foo*" >actual &&
+	cat >expect <<-\EOF &&
+	foo1.6
+	foo1.3
+	foo1.10
+	EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'invalid sort parameter on command line' '
+	test_must_fail git tag -l --sort=notvalid "foo*" >actual
+'
+
+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
+'
+
+run_with_limited_stack () {
+	(ulimit -s 128 && "$@")
+}
+
+test_lazy_prereq ULIMIT 'run_with_limited_stack true'
+
+# we require ulimit, this excludes Windows
+test_expect_success ULIMIT '--contains works in a deep repo' '
+	>expect &&
+	i=1 &&
+	while test $i -lt 8000
+	do
+		echo "commit refs/heads/master
+committer A U Thor <author@example.com> $((1000000000 + $i * 100)) +0200
+data <<EOF
+commit #$i
+EOF"
+		test $i = 1 && echo "from refs/heads/master^0"
+		i=$(($i + 1))
+	done | git fast-import &&
+	git checkout master &&
+	git tag far-far-away HEAD^ &&
+	run_with_limited_stack git tag --contains HEAD >actual &&
 	test_cmp expect actual
 '
 
diff --git a/t/t7102-reset.sh b/t/t7102-reset.sh
index ee703be..98bcfe2 100755
--- a/t/t7102-reset.sh
+++ b/t/t7102-reset.sh
@@ -44,7 +44,9 @@
 
 	echo "1st line 2nd file" >secondfile &&
 	echo "2nd line 2nd file" >>secondfile &&
-	git -c "i18n.commitEncoding=$test_encoding" commit -a -m "$(commit_msg $test_encoding)" &&
+	# "git commit -m" would break MinGW, as Windows refuse to pass
+	# $test_encoding encoded parameter to git.
+	commit_msg $test_encoding | git -c "i18n.commitEncoding=$test_encoding" commit -a -F - &&
 	head5=$(git rev-parse --verify HEAD)
 '
 # git log --pretty=oneline # to see those SHA1 involved
@@ -334,7 +336,9 @@
 
 	echo "1st line 2nd file" >secondfile &&
 	echo "2nd line 2nd file" >>secondfile &&
-	git -c "i18n.commitEncoding=$test_encoding" commit -a -m "$(commit_msg $test_encoding)" &&
+	# "git commit -m" would break MinGW, as Windows refuse to pass
+	# $test_encoding encoded parameter to git.
+	commit_msg $test_encoding | git -c "i18n.commitEncoding=$test_encoding" commit -a -F - &&
 	check_changes $head5
 '
 
diff --git a/t/t7112-reset-submodule.sh b/t/t7112-reset-submodule.sh
new file mode 100755
index 0000000..2eda6ad
--- /dev/null
+++ b/t/t7112-reset-submodule.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+test_description='reset can handle submodules'
+
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-submodule-update.sh
+
+test_submodule_switch "git reset --keep"
+
+test_submodule_switch "git reset --merge"
+
+test_submodule_forced_switch "git reset --hard"
+
+test_done
diff --git a/t/t7201-co.sh b/t/t7201-co.sh
index 0c9ec0a..eae9e5a 100755
--- a/t/t7201-co.sh
+++ b/t/t7201-co.sh
@@ -223,6 +223,23 @@
 	test_cmp two expect
 '
 
+test_expect_success 'switch to another branch while carrying a deletion' '
+
+	git checkout -f master && git reset --hard && git clean -f &&
+	git rm two &&
+
+	test_must_fail git checkout simple 2>errs &&
+	test_i18ngrep overwritten errs &&
+
+	git checkout --merge simple 2>errs &&
+	test_i18ngrep ! overwritten errs &&
+	git ls-files -u &&
+	test_must_fail git cat-file -t :0:two &&
+	test "$(git cat-file -t :1:two)" = blob &&
+	test "$(git cat-file -t :2:two)" = blob &&
+	test_must_fail git cat-file -t :3:two
+'
+
 test_expect_success 'checkout to detach HEAD (with advice declined)' '
 
 	git config advice.detachedHead false &&
diff --git a/t/t7501-commit.sh b/t/t7501-commit.sh
index d58b097..63e0427 100755
--- a/t/t7501-commit.sh
+++ b/t/t7501-commit.sh
@@ -346,8 +346,21 @@
 
 '
 
-test_expect_success 'commit complains about bogus date' '
-	test_must_fail git commit --amend --date=10.11.2010
+test_expect_success 'commit mentions forced date in output' '
+	git commit --amend --date=2010-01-02T03:04:05 >output &&
+	grep "Date: *Sat Jan 2 03:04:05 2010" output
+'
+
+test_expect_success 'commit complains about completely bogus dates' '
+	test_must_fail git commit --amend --date=seventeen
+'
+
+test_expect_success 'commit --date allows approxidate' '
+	git commit --amend \
+		--date="midnight the 12th of october, anno domini 1979" &&
+	echo "Fri Oct 12 00:00:00 1979 +0000" >expect &&
+	git log -1 --format=%ad >actual &&
+	test_cmp expect actual
 '
 
 test_expect_success 'sign off (1)' '
diff --git a/t/t7502-commit.sh b/t/t7502-commit.sh
index 9a3f3a1..051489e 100755
--- a/t/t7502-commit.sh
+++ b/t/t7502-commit.sh
@@ -344,6 +344,13 @@
 	  .git/COMMIT_EDITMSG
 '
 
+test_expect_success 'message shows date when it is explicitly set' '
+	git commit --allow-empty -e -m foo --date="2010-01-02T03:04:05" &&
+	test_i18ngrep \
+	  "^# Date: *Sat Jan 2 03:04:05 2010 +0000" \
+	  .git/COMMIT_EDITMSG
+'
+
 test_expect_success AUTOIDENT 'message shows committer when it is automatic' '
 
 	echo >>negative &&
@@ -563,4 +570,30 @@
 	test_i18ngrep "^; Changes to be committed:" .git/COMMIT_EDITMSG
 '
 
+test_expect_success 'switch core.commentchar' '
+	test_commit "#foo" foo &&
+	GIT_EDITOR=.git/FAKE_EDITOR git -c core.commentChar=auto commit --amend &&
+	test_i18ngrep "^; Changes to be committed:" .git/COMMIT_EDITMSG
+'
+
+test_expect_success 'switch core.commentchar but out of options' '
+	cat >text <<\EOF &&
+# 1
+; 2
+@ 3
+! 4
+$ 5
+% 6
+^ 7
+& 8
+| 9
+: 10
+EOF
+	git commit --amend -F text &&
+	(
+		test_set_editor .git/FAKE_EDITOR &&
+		test_must_fail git -c core.commentChar=auto commit --amend
+	)
+'
+
 test_done
diff --git a/t/t7508-status.sh b/t/t7508-status.sh
index d480069..8ed5788 100755
--- a/t/t7508-status.sh
+++ b/t/t7508-status.sh
@@ -1350,8 +1350,7 @@
 
 test_expect_success "status (core.commentchar with two chars with submodule summary)" '
 	test_config core.commentchar ";;" &&
-	git -c status.displayCommentPrefix=true status >output &&
-	test_i18ncmp expect output
+	test_must_fail git -c status.displayCommentPrefix=true status
 '
 
 test_expect_success "--ignore-submodules=all suppresses submodule summary" '
diff --git a/t/t7510-signed-commit.sh b/t/t7510-signed-commit.sh
index e97477a..474dab3 100755
--- a/t/t7510-signed-commit.sh
+++ b/t/t7510-signed-commit.sh
@@ -48,10 +48,11 @@
 	git tag eighth-signed-alt
 '
 
-test_expect_success GPG 'show signatures' '
+test_expect_success GPG 'verify and show signatures' '
 	(
 		for commit in initial second merge fourth-signed fifth-signed sixth-signed seventh-signed
 		do
+			git verify-commit $commit &&
 			git show --pretty=short --show-signature $commit >actual &&
 			grep "Good signature from" actual &&
 			! grep "BAD signature from" actual &&
@@ -61,6 +62,7 @@
 	(
 		for commit in merge^2 fourth-unsigned sixth-unsigned seventh-unsigned
 		do
+			test_must_fail git verify-commit $commit &&
 			git show --pretty=short --show-signature $commit >actual &&
 			! grep "Good signature from" actual &&
 			! grep "BAD signature from" actual &&
@@ -79,11 +81,25 @@
 	)
 '
 
+test_expect_success GPG 'show signed commit with signature' '
+	git show -s initial >commit &&
+	git show -s --show-signature initial >show &&
+	git verify-commit -v initial >verify.1 2>verify.2 &&
+	git cat-file commit initial >cat &&
+	grep -v "gpg: " show >show.commit &&
+	grep "gpg: " show >show.gpg &&
+	grep -v "^ " cat | grep -v "^gpgsig " >cat.commit &&
+	test_cmp show.commit commit &&
+	test_cmp show.gpg verify.2 &&
+	test_cmp cat.commit verify.1
+'
+
 test_expect_success GPG 'detect fudged signature' '
 	git cat-file commit seventh-signed >raw &&
 
 	sed -e "s/seventh/7th forged/" raw >forged1 &&
 	git hash-object -w -t commit forged1 >forged1.commit &&
+	! git verify-commit $(cat forged1.commit) &&
 	git show --pretty=short --show-signature $(cat forged1.commit) >actual1 &&
 	grep "BAD signature from" actual1 &&
 	! grep "Good signature from" actual1
@@ -94,6 +110,7 @@
 	cat raw >forged2 &&
 	echo Qwik | tr "Q" "\000" >>forged2 &&
 	git hash-object -w -t commit forged2 >forged2.commit &&
+	! git verify-commit $(cat forged2.commit) &&
 	git show --pretty=short --show-signature $(cat forged2.commit) >actual2 &&
 	grep "BAD signature from" actual2 &&
 	! grep "Good signature from" actual2
@@ -102,6 +119,7 @@
 test_expect_success GPG 'amending already signed commit' '
 	git checkout fourth-signed^0 &&
 	git commit --amend -S --no-edit &&
+	git verify-commit HEAD &&
 	git show -s --show-signature HEAD >actual &&
 	grep "Good signature from" actual &&
 	! grep "BAD signature from" actual
diff --git a/t/t7513-interpret-trailers.sh b/t/t7513-interpret-trailers.sh
new file mode 100755
index 0000000..1efb880
--- /dev/null
+++ b/t/t7513-interpret-trailers.sh
@@ -0,0 +1,863 @@
+#!/bin/sh
+#
+# Copyright (c) 2013, 2014 Christian Couder
+#
+
+test_description='git interpret-trailers'
+
+. ./test-lib.sh
+
+# When we want one trailing space at the end of each line, let's use sed
+# to make sure that these spaces are not removed by any automatic tool.
+
+test_expect_success 'setup' '
+	: >empty &&
+	cat >basic_message <<-\EOF &&
+		subject
+
+		body
+	EOF
+	cat >complex_message_body <<-\EOF &&
+		my subject
+
+		my body which is long
+		and contains some special
+		chars like : = ? !
+
+	EOF
+	sed -e "s/ Z\$/ /" >complex_message_trailers <<-\EOF &&
+		Fixes: Z
+		Acked-by: Z
+		Reviewed-by: Z
+		Signed-off-by: Z
+	EOF
+	cat >basic_patch <<-\EOF
+		---
+		 foo.txt | 2 +-
+		 1 file changed, 1 insertion(+), 1 deletion(-)
+
+		diff --git a/foo.txt b/foo.txt
+		index 0353767..1d91aa1 100644
+		--- a/foo.txt
+		+++ b/foo.txt
+		@@ -1,3 +1,3 @@
+
+		-bar
+		+baz
+
+		--
+		1.9.rc0.11.ga562ddc
+
+	EOF
+'
+
+test_expect_success 'without config' '
+	sed -e "s/ Z\$/ /" >expected <<-\EOF &&
+
+		ack: Peff
+		Reviewed-by: Z
+		Acked-by: Johan
+	EOF
+	git interpret-trailers --trailer "ack = Peff" --trailer "Reviewed-by" \
+		--trailer "Acked-by: Johan" empty >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'without config in another order' '
+	sed -e "s/ Z\$/ /" >expected <<-\EOF &&
+
+		Acked-by: Johan
+		Reviewed-by: Z
+		ack: Peff
+	EOF
+	git interpret-trailers --trailer "Acked-by: Johan" --trailer "Reviewed-by" \
+		--trailer "ack = Peff" empty >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success '--trim-empty without config' '
+	cat >expected <<-\EOF &&
+
+		ack: Peff
+		Acked-by: Johan
+	EOF
+	git interpret-trailers --trim-empty --trailer ack=Peff \
+		--trailer "Reviewed-by" --trailer "Acked-by: Johan" \
+		--trailer "sob:" empty >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with config option on the command line' '
+	cat >expected <<-\EOF &&
+
+		Acked-by: Johan
+		Reviewed-by: Peff
+	EOF
+	echo "Acked-by: Johan" |
+	git -c "trailer.Acked-by.ifexists=addifdifferent" interpret-trailers \
+		--trailer "Reviewed-by: Peff" --trailer "Acked-by: Johan" >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with config setup' '
+	git config trailer.ack.key "Acked-by: " &&
+	cat >expected <<-\EOF &&
+
+		Acked-by: Peff
+	EOF
+	git interpret-trailers --trim-empty --trailer "ack = Peff" empty >actual &&
+	test_cmp expected actual &&
+	git interpret-trailers --trim-empty --trailer "Acked-by = Peff" empty >actual &&
+	test_cmp expected actual &&
+	git interpret-trailers --trim-empty --trailer "Acked-by :Peff" empty >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with config setup and ":=" as separators' '
+	git config trailer.separators ":=" &&
+	git config trailer.ack.key "Acked-by= " &&
+	cat >expected <<-\EOF &&
+
+		Acked-by= Peff
+	EOF
+	git interpret-trailers --trim-empty --trailer "ack = Peff" empty >actual &&
+	test_cmp expected actual &&
+	git interpret-trailers --trim-empty --trailer "Acked-by= Peff" empty >actual &&
+	test_cmp expected actual &&
+	git interpret-trailers --trim-empty --trailer "Acked-by : Peff" empty >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with config setup and "%" as separators' '
+	git config trailer.separators "%" &&
+	cat >expected <<-\EOF &&
+
+		bug% 42
+		count% 10
+		bug% 422
+	EOF
+	git interpret-trailers --trim-empty --trailer "bug = 42" \
+		--trailer count%10 --trailer "test: stuff" \
+		--trailer "bug % 422" empty >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with "%" as separators and a message with trailers' '
+	cat >special_message <<-\EOF &&
+		Special Message
+
+		bug% 42
+		count% 10
+		bug% 422
+	EOF
+	cat >expected <<-\EOF &&
+		Special Message
+
+		bug% 42
+		count% 10
+		bug% 422
+		count% 100
+	EOF
+	git interpret-trailers --trailer count%100 \
+		special_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with config setup and ":=#" as separators' '
+	git config trailer.separators ":=#" &&
+	git config trailer.bug.key "Bug #" &&
+	cat >expected <<-\EOF &&
+
+		Bug #42
+	EOF
+	git interpret-trailers --trim-empty --trailer "bug = 42" empty >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with commit basic message' '
+	cat basic_message >expected &&
+	echo >>expected &&
+	git interpret-trailers <basic_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with basic patch' '
+	cat basic_message >input &&
+	cat basic_patch >>input &&
+	cat basic_message >expected &&
+	echo >>expected &&
+	cat basic_patch >>expected &&
+	git interpret-trailers <input >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with commit complex message as argument' '
+	cat complex_message_body complex_message_trailers >complex_message &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Fixes: Z
+		Acked-by= Z
+		Reviewed-by: Z
+		Signed-off-by: Z
+	EOF
+	git interpret-trailers complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with 2 files arguments' '
+	cat basic_message >>expected &&
+	echo >>expected &&
+	cat basic_patch >>expected &&
+	git interpret-trailers complex_message input >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with message that has comments' '
+	cat basic_message >>message_with_comments &&
+	sed -e "s/ Z\$/ /" >>message_with_comments <<-\EOF &&
+		# comment
+
+		# other comment
+		Cc: Z
+		# yet another comment
+		Reviewed-by: Johan
+		Reviewed-by: Z
+		# last comment
+
+	EOF
+	cat basic_patch >>message_with_comments &&
+	cat basic_message >expected &&
+	cat >>expected <<-\EOF &&
+		# comment
+
+		Reviewed-by: Johan
+		Cc: Peff
+	EOF
+	cat basic_patch >>expected &&
+	git interpret-trailers --trim-empty --trailer "Cc: Peff" message_with_comments >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with commit complex message and trailer args' '
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Fixes: Z
+		Acked-by= Z
+		Reviewed-by: Z
+		Signed-off-by: Z
+		Acked-by= Peff
+		Bug #42
+	EOF
+	git interpret-trailers --trailer "ack: Peff" \
+		--trailer "bug: 42" <complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with complex patch, args and --trim-empty' '
+	cat complex_message >complex_patch &&
+	cat basic_patch >>complex_patch &&
+	cat complex_message_body >expected &&
+	cat >>expected <<-\EOF &&
+		Acked-by= Peff
+		Bug #42
+	EOF
+	cat basic_patch >>expected &&
+	git interpret-trailers --trim-empty --trailer "ack: Peff" \
+		--trailer "bug: 42" <complex_patch >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "where = before"' '
+	git config trailer.bug.where "before" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Fixes: Z
+		Acked-by= Z
+		Reviewed-by: Z
+		Signed-off-by: Z
+		Acked-by= Peff
+	EOF
+	git interpret-trailers --trailer "ack: Peff" \
+		--trailer "bug: 42" complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "where = after"' '
+	git config trailer.ack.where "after" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Fixes: Z
+		Acked-by= Z
+		Acked-by= Peff
+		Reviewed-by: Z
+		Signed-off-by: Z
+	EOF
+	git interpret-trailers --trailer "ack: Peff" \
+		--trailer "bug: 42" complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "where = end"' '
+	git config trailer.review.key "Reviewed-by" &&
+	git config trailer.review.where "end" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Fixes: Z
+		Acked-by= Z
+		Acked-by= Peff
+		Reviewed-by: Z
+		Signed-off-by: Z
+		Reviewed-by: Junio
+		Reviewed-by: Johannes
+	EOF
+	git interpret-trailers --trailer "ack: Peff" \
+		--trailer "Reviewed-by: Junio" --trailer "Reviewed-by: Johannes" \
+		complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "where = start"' '
+	git config trailer.review.key "Reviewed-by" &&
+	git config trailer.review.where "start" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Reviewed-by: Johannes
+		Reviewed-by: Junio
+		Fixes: Z
+		Acked-by= Z
+		Acked-by= Peff
+		Reviewed-by: Z
+		Signed-off-by: Z
+	EOF
+	git interpret-trailers --trailer "ack: Peff" \
+		--trailer "Reviewed-by: Junio" --trailer "Reviewed-by: Johannes" \
+		complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "where = before" for a token in the middle of the message' '
+	git config trailer.review.key "Reviewed-by:" &&
+	git config trailer.review.where "before" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Fixes: Z
+		Acked-by= Z
+		Acked-by= Peff
+		Reviewed-by:Johan
+		Reviewed-by:
+		Signed-off-by: Z
+	EOF
+	git interpret-trailers --trailer "ack: Peff" --trailer "bug: 42" \
+		--trailer "review: Johan" <complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "where = before" and --trim-empty' '
+	cat complex_message_body >expected &&
+	cat >>expected <<-\EOF &&
+		Bug #46
+		Bug #42
+		Acked-by= Peff
+		Reviewed-by:Johan
+	EOF
+	git interpret-trailers --trim-empty --trailer "ack: Peff" \
+		--trailer "bug: 42" --trailer "review: Johan" \
+		--trailer "Bug: 46" <complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'the default is "ifExists = addIfDifferentNeighbor"' '
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Fixes: Z
+		Acked-by= Z
+		Acked-by= Peff
+		Acked-by= Junio
+		Acked-by= Peff
+		Reviewed-by:
+		Signed-off-by: Z
+	EOF
+	git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
+		--trailer "ack: Junio" --trailer "bug: 42" --trailer "ack: Peff" \
+		--trailer "ack: Peff" <complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'default "ifExists" is now "addIfDifferent"' '
+	git config trailer.ifexists "addIfDifferent" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Fixes: Z
+		Acked-by= Z
+		Acked-by= Peff
+		Acked-by= Junio
+		Reviewed-by:
+		Signed-off-by: Z
+	EOF
+	git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
+		--trailer "ack: Junio" --trailer "bug: 42" --trailer "ack: Peff" \
+		--trailer "ack: Peff" <complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "ifExists = addIfDifferent" with "where = end"' '
+	git config trailer.ack.ifExists "addIfDifferent" &&
+	git config trailer.ack.where "end" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Fixes: Z
+		Acked-by= Z
+		Reviewed-by:
+		Signed-off-by: Z
+		Acked-by= Peff
+	EOF
+	git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
+		--trailer "bug: 42" --trailer "ack: Peff" \
+		<complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "ifExists = addIfDifferent" with "where = before"' '
+	git config trailer.ack.ifExists "addIfDifferent" &&
+	git config trailer.ack.where "before" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Fixes: Z
+		Acked-by= Peff
+		Acked-by= Z
+		Reviewed-by:
+		Signed-off-by: Z
+	EOF
+	git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
+		--trailer "bug: 42" --trailer "ack: Peff" \
+		<complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "ifExists = addIfDifferentNeighbor" with "where = end"' '
+	git config trailer.ack.ifExists "addIfDifferentNeighbor" &&
+	git config trailer.ack.where "end" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Fixes: Z
+		Acked-by= Z
+		Reviewed-by:
+		Signed-off-by: Z
+		Acked-by= Peff
+		Acked-by= Junio
+		Tested-by: Jakub
+		Acked-by= Junio
+		Acked-by= Peff
+	EOF
+	git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
+		--trailer "ack: Junio" --trailer "bug: 42" \
+		--trailer "Tested-by: Jakub" --trailer "ack: Junio" \
+		--trailer "ack: Junio" --trailer "ack: Peff" <complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "ifExists = addIfDifferentNeighbor"  with "where = after"' '
+	git config trailer.ack.ifExists "addIfDifferentNeighbor" &&
+	git config trailer.ack.where "after" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Fixes: Z
+		Acked-by= Z
+		Acked-by= Peff
+		Acked-by= Junio
+		Acked-by= Peff
+		Reviewed-by:
+		Signed-off-by: Z
+		Tested-by: Jakub
+	EOF
+	git interpret-trailers --trailer "ack: Peff" --trailer "review:" \
+		--trailer "ack: Junio" --trailer "bug: 42" \
+		--trailer "Tested-by: Jakub" --trailer "ack: Junio" \
+		--trailer "ack: Junio" --trailer "ack: Peff" <complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "ifExists = addIfDifferentNeighbor" and --trim-empty' '
+	git config trailer.ack.ifExists "addIfDifferentNeighbor" &&
+	cat complex_message_body >expected &&
+	cat >>expected <<-\EOF &&
+		Bug #42
+		Acked-by= Peff
+		Acked-by= Junio
+		Acked-by= Peff
+	EOF
+	git interpret-trailers --trim-empty --trailer "ack: Peff" \
+		--trailer "Acked-by= Peff" --trailer "review:" \
+		--trailer "ack: Junio" --trailer "bug: 42" \
+		--trailer "ack: Peff" <complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "ifExists = add" with "where = end"' '
+	git config trailer.ack.ifExists "add" &&
+	git config trailer.ack.where "end" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Fixes: Z
+		Acked-by= Z
+		Reviewed-by:
+		Signed-off-by: Z
+		Acked-by= Peff
+		Acked-by= Peff
+		Tested-by: Jakub
+		Acked-by= Junio
+		Tested-by: Johannes
+		Acked-by= Peff
+	EOF
+	git interpret-trailers --trailer "ack: Peff" \
+		--trailer "Acked-by= Peff" --trailer "review:" \
+		--trailer "Tested-by: Jakub" --trailer "ack: Junio" \
+		--trailer "bug: 42" --trailer "Tested-by: Johannes" \
+		--trailer "ack: Peff" <complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "ifExists = add" with "where = after"' '
+	git config trailer.ack.ifExists "add" &&
+	git config trailer.ack.where "after" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Fixes: Z
+		Acked-by= Z
+		Acked-by= Peff
+		Acked-by= Peff
+		Acked-by= Junio
+		Acked-by= Peff
+		Reviewed-by:
+		Signed-off-by: Z
+	EOF
+	git interpret-trailers --trailer "ack: Peff" \
+		--trailer "Acked-by= Peff" --trailer "review:" \
+		--trailer "ack: Junio" --trailer "bug: 42" \
+		--trailer "ack: Peff" <complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "ifExists = replace"' '
+	git config trailer.fix.key "Fixes: " &&
+	git config trailer.fix.ifExists "replace" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Acked-by= Z
+		Acked-by= Junio
+		Acked-by= Peff
+		Reviewed-by:
+		Signed-off-by: Z
+		Fixes: 22
+	EOF
+	git interpret-trailers --trailer "review:" \
+		--trailer "fix=53" --trailer "ack: Junio" --trailer "fix=22" \
+		--trailer "bug: 42" --trailer "ack: Peff" \
+		<complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "ifExists = replace" with "where = after"' '
+	git config trailer.fix.where "after" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Fixes: 22
+		Acked-by= Z
+		Acked-by= Junio
+		Acked-by= Peff
+		Reviewed-by:
+		Signed-off-by: Z
+	EOF
+	git interpret-trailers --trailer "review:" \
+		--trailer "fix=53" --trailer "ack: Junio" --trailer "fix=22" \
+		--trailer "bug: 42" --trailer "ack: Peff" \
+		<complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "ifExists = doNothing"' '
+	git config trailer.fix.ifExists "doNothing" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Fixes: Z
+		Acked-by= Z
+		Acked-by= Junio
+		Acked-by= Peff
+		Reviewed-by:
+		Signed-off-by: Z
+	EOF
+	git interpret-trailers --trailer "review:" --trailer "fix=53" \
+		--trailer "ack: Junio" --trailer "fix=22" \
+		--trailer "bug: 42" --trailer "ack: Peff" \
+		<complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'the default is "ifMissing = add"' '
+	git config trailer.cc.key "Cc: " &&
+	git config trailer.cc.where "before" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Cc: Linus
+		Fixes: Z
+		Acked-by= Z
+		Acked-by= Junio
+		Acked-by= Peff
+		Reviewed-by:
+		Signed-off-by: Z
+	EOF
+	git interpret-trailers --trailer "review:" --trailer "fix=53" \
+		--trailer "cc=Linus" --trailer "ack: Junio" \
+		--trailer "fix=22" --trailer "bug: 42" --trailer "ack: Peff" \
+		<complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'when default "ifMissing" is "doNothing"' '
+	git config trailer.ifmissing "doNothing" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Fixes: Z
+		Acked-by= Z
+		Acked-by= Junio
+		Acked-by= Peff
+		Reviewed-by:
+		Signed-off-by: Z
+	EOF
+	git interpret-trailers --trailer "review:" --trailer "fix=53" \
+		--trailer "cc=Linus" --trailer "ack: Junio" \
+		--trailer "fix=22" --trailer "bug: 42" --trailer "ack: Peff" \
+		<complex_message >actual &&
+	test_cmp expected actual &&
+	git config trailer.ifmissing "add"
+'
+
+test_expect_success 'using "ifMissing = add" with "where = end"' '
+	git config trailer.cc.key "Cc: " &&
+	git config trailer.cc.where "end" &&
+	git config trailer.cc.ifMissing "add" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Fixes: Z
+		Acked-by= Z
+		Acked-by= Junio
+		Acked-by= Peff
+		Reviewed-by:
+		Signed-off-by: Z
+		Cc: Linus
+	EOF
+	git interpret-trailers --trailer "review:" --trailer "fix=53" \
+		--trailer "ack: Junio" --trailer "fix=22" \
+		--trailer "bug: 42" --trailer "cc=Linus" --trailer "ack: Peff" \
+		<complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "ifMissing = add" with "where = before"' '
+	git config trailer.cc.key "Cc: " &&
+	git config trailer.cc.where "before" &&
+	git config trailer.cc.ifMissing "add" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Cc: Linus
+		Bug #42
+		Fixes: Z
+		Acked-by= Z
+		Acked-by= Junio
+		Acked-by= Peff
+		Reviewed-by:
+		Signed-off-by: Z
+	EOF
+	git interpret-trailers --trailer "review:" --trailer "fix=53" \
+		--trailer "ack: Junio" --trailer "fix=22" \
+		--trailer "bug: 42" --trailer "cc=Linus" --trailer "ack: Peff" \
+		<complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'using "ifMissing = doNothing"' '
+	git config trailer.cc.ifMissing "doNothing" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Fixes: Z
+		Acked-by= Z
+		Acked-by= Junio
+		Acked-by= Peff
+		Reviewed-by:
+		Signed-off-by: Z
+	EOF
+	git interpret-trailers --trailer "review:" --trailer "fix=53" \
+		--trailer "cc=Linus" --trailer "ack: Junio" \
+		--trailer "fix=22" --trailer "bug: 42" --trailer "ack: Peff" \
+		<complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'default "where" is now "after"' '
+	git config trailer.where "after" &&
+	git config --unset trailer.ack.where &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Bug #42
+		Fixes: Z
+		Acked-by= Z
+		Acked-by= Peff
+		Acked-by= Peff
+		Acked-by= Junio
+		Acked-by= Peff
+		Reviewed-by:
+		Signed-off-by: Z
+		Tested-by: Jakub
+		Tested-by: Johannes
+	EOF
+	git interpret-trailers --trailer "ack: Peff" \
+		--trailer "Acked-by= Peff" --trailer "review:" \
+		--trailer "Tested-by: Jakub" --trailer "ack: Junio" \
+		--trailer "bug: 42" --trailer "Tested-by: Johannes" \
+		--trailer "ack: Peff" <complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with simple command' '
+	git config trailer.sign.key "Signed-off-by: " &&
+	git config trailer.sign.where "after" &&
+	git config trailer.sign.ifExists "addIfDifferentNeighbor" &&
+	git config trailer.sign.command "echo \"A U Thor <author@example.com>\"" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Fixes: Z
+		Acked-by= Z
+		Reviewed-by:
+		Signed-off-by: Z
+		Signed-off-by: A U Thor <author@example.com>
+	EOF
+	git interpret-trailers --trailer "review:" --trailer "fix=22" \
+		<complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with command using commiter information' '
+	git config trailer.sign.ifExists "addIfDifferent" &&
+	git config trailer.sign.command "echo \"\$GIT_COMMITTER_NAME <\$GIT_COMMITTER_EMAIL>\"" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Fixes: Z
+		Acked-by= Z
+		Reviewed-by:
+		Signed-off-by: Z
+		Signed-off-by: C O Mitter <committer@example.com>
+	EOF
+	git interpret-trailers --trailer "review:" --trailer "fix=22" \
+		<complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with command using author information' '
+	git config trailer.sign.key "Signed-off-by: " &&
+	git config trailer.sign.where "after" &&
+	git config trailer.sign.ifExists "addIfDifferentNeighbor" &&
+	git config trailer.sign.command "echo \"\$GIT_AUTHOR_NAME <\$GIT_AUTHOR_EMAIL>\"" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-\EOF &&
+		Fixes: Z
+		Acked-by= Z
+		Reviewed-by:
+		Signed-off-by: Z
+		Signed-off-by: A U Thor <author@example.com>
+	EOF
+	git interpret-trailers --trailer "review:" --trailer "fix=22" \
+		<complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'setup a commit' '
+	echo "Content of the first commit." > a.txt &&
+	git add a.txt &&
+	git commit -m "Add file a.txt"
+'
+
+test_expect_success 'with command using $ARG' '
+	git config trailer.fix.ifExists "replace" &&
+	git config trailer.fix.command "git log -1 --oneline --format=\"%h (%s)\" --abbrev-commit --abbrev=14 \$ARG" &&
+	FIXED=$(git log -1 --oneline --format="%h (%s)" --abbrev-commit --abbrev=14 HEAD) &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-EOF &&
+		Fixes: $FIXED
+		Acked-by= Z
+		Reviewed-by:
+		Signed-off-by: Z
+		Signed-off-by: A U Thor <author@example.com>
+	EOF
+	git interpret-trailers --trailer "review:" --trailer "fix=HEAD" \
+		<complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with failing command using $ARG' '
+	git config trailer.fix.ifExists "replace" &&
+	git config trailer.fix.command "false \$ARG" &&
+	cat complex_message_body >expected &&
+	sed -e "s/ Z\$/ /" >>expected <<-EOF &&
+		Fixes: Z
+		Acked-by= Z
+		Reviewed-by:
+		Signed-off-by: Z
+		Signed-off-by: A U Thor <author@example.com>
+	EOF
+	git interpret-trailers --trailer "review:" --trailer "fix=HEAD" \
+		<complex_message >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'with empty tokens' '
+	git config --unset trailer.fix.command &&
+	cat >expected <<-EOF &&
+
+		Signed-off-by: A U Thor <author@example.com>
+	EOF
+	git interpret-trailers --trailer ":" --trailer ":test" >actual <<-EOF &&
+	EOF
+	test_cmp expected actual
+'
+
+test_expect_success 'with command but no key' '
+	git config --unset trailer.sign.key &&
+	cat >expected <<-EOF &&
+
+		sign: A U Thor <author@example.com>
+	EOF
+	git interpret-trailers >actual <<-EOF &&
+	EOF
+	test_cmp expected actual
+'
+
+test_expect_success 'with no command and no key' '
+	git config --unset trailer.review.key &&
+	cat >expected <<-EOF &&
+
+		review: Junio
+		sign: A U Thor <author@example.com>
+	EOF
+	git interpret-trailers --trailer "review:Junio" >actual <<-EOF &&
+	EOF
+	test_cmp expected actual
+'
+
+test_done
diff --git a/t/t7515-status-symlinks.sh b/t/t7515-status-symlinks.sh
new file mode 100755
index 0000000..9f989be
--- /dev/null
+++ b/t/t7515-status-symlinks.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+test_description='git status and symlinks'
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+	echo .gitignore >.gitignore &&
+	echo actual >>.gitignore &&
+	echo expect >>.gitignore &&
+	mkdir dir &&
+	echo x >dir/file1 &&
+	echo y >dir/file2 &&
+	git add dir &&
+	git commit -m initial &&
+	git tag initial
+'
+
+test_expect_success SYMLINKS 'symlink to a directory' '
+	test_when_finished "rm symlink" &&
+	ln -s dir symlink &&
+	echo "?? symlink" >expect &&
+	git status --porcelain >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success SYMLINKS 'symlink replacing a directory' '
+	test_when_finished "rm -rf copy && git reset --hard initial" &&
+	mkdir copy &&
+	cp dir/file1 copy/file1 &&
+	echo "changed in copy" >copy/file2 &&
+	git add copy &&
+	git commit -m second &&
+	rm -rf copy &&
+	ln -s dir copy &&
+	echo " D copy/file1" >expect &&
+	echo " D copy/file2" >>expect &&
+	echo "?? copy" >>expect &&
+	git status --porcelain >actual &&
+	test_cmp expect actual
+'
+
+test_done
diff --git a/t/t7610-mergetool.sh b/t/t7610-mergetool.sh
index 05d9db0..7eeb207 100755
--- a/t/t7610-mergetool.sh
+++ b/t/t7610-mergetool.sh
@@ -14,512 +14,527 @@
 # running mergetool
 
 test_expect_success 'setup' '
-    git config rerere.enabled true &&
-    echo master >file1 &&
-    echo master spaced >"spaced name" &&
-    echo master file11 >file11 &&
-    echo master file12 >file12 &&
-    echo master file13 >file13 &&
-    echo master file14 >file14 &&
-    mkdir subdir &&
-    echo master sub >subdir/file3 &&
-    test_create_repo submod &&
-    (
-	cd submod &&
-	: >foo &&
-	git add foo &&
-	git commit -m "Add foo"
-    ) &&
-    git submodule add git://example.com/submod submod &&
-    git add file1 "spaced name" file1[1-4] subdir/file3 .gitmodules submod &&
-    git commit -m "add initial versions" &&
+	test_config rerere.enabled true &&
+	echo master >file1 &&
+	echo master spaced >"spaced name" &&
+	echo master file11 >file11 &&
+	echo master file12 >file12 &&
+	echo master file13 >file13 &&
+	echo master file14 >file14 &&
+	mkdir subdir &&
+	echo master sub >subdir/file3 &&
+	test_create_repo submod &&
+	(
+		cd submod &&
+		: >foo &&
+		git add foo &&
+		git commit -m "Add foo"
+	) &&
+	git submodule add git://example.com/submod submod &&
+	git add file1 "spaced name" file1[1-4] subdir/file3 .gitmodules submod &&
+	git commit -m "add initial versions" &&
 
-    git checkout -b branch1 master &&
-    git submodule update -N &&
-    echo branch1 change >file1 &&
-    echo branch1 newfile >file2 &&
-    echo branch1 spaced >"spaced name" &&
-    echo branch1 both added >both &&
-    echo branch1 change file11 >file11 &&
-    echo branch1 change file13 >file13 &&
-    echo branch1 sub >subdir/file3 &&
-    (
-	cd submod &&
-	echo branch1 submodule >bar &&
-	git add bar &&
-	git commit -m "Add bar on branch1" &&
-	git checkout -b submod-branch1
-    ) &&
-    git add file1 "spaced name" file11 file13 file2 subdir/file3 submod &&
-    git add both &&
-    git rm file12 &&
-    git commit -m "branch1 changes" &&
+	git checkout -b branch1 master &&
+	git submodule update -N &&
+	echo branch1 change >file1 &&
+	echo branch1 newfile >file2 &&
+	echo branch1 spaced >"spaced name" &&
+	echo branch1 both added >both &&
+	echo branch1 change file11 >file11 &&
+	echo branch1 change file13 >file13 &&
+	echo branch1 sub >subdir/file3 &&
+	(
+		cd submod &&
+		echo branch1 submodule >bar &&
+		git add bar &&
+		git commit -m "Add bar on branch1" &&
+		git checkout -b submod-branch1
+	) &&
+	git add file1 "spaced name" file11 file13 file2 subdir/file3 submod &&
+	git add both &&
+	git rm file12 &&
+	git commit -m "branch1 changes" &&
 
-    git checkout -b stash1 master &&
-    echo stash1 change file11 >file11 &&
-    git add file11 &&
-    git commit -m "stash1 changes" &&
+	git checkout -b stash1 master &&
+	echo stash1 change file11 >file11 &&
+	git add file11 &&
+	git commit -m "stash1 changes" &&
 
-    git checkout -b stash2 master &&
-    echo stash2 change file11 >file11 &&
-    git add file11 &&
-    git commit -m "stash2 changes" &&
+	git checkout -b stash2 master &&
+	echo stash2 change file11 >file11 &&
+	git add file11 &&
+	git commit -m "stash2 changes" &&
 
-    git checkout master &&
-    git submodule update -N &&
-    echo master updated >file1 &&
-    echo master new >file2 &&
-    echo master updated spaced >"spaced name" &&
-    echo master both added >both &&
-    echo master updated file12 >file12 &&
-    echo master updated file14 >file14 &&
-    echo master new sub >subdir/file3 &&
-    (
-	cd submod &&
-	echo master submodule >bar &&
-	git add bar &&
-	git commit -m "Add bar on master" &&
-	git checkout -b submod-master
-    ) &&
-    git add file1 "spaced name" file12 file14 file2 subdir/file3 submod &&
-    git add both &&
-    git rm file11 &&
-    git commit -m "master updates" &&
+	git checkout master &&
+	git submodule update -N &&
+	echo master updated >file1 &&
+	echo master new >file2 &&
+	echo master updated spaced >"spaced name" &&
+	echo master both added >both &&
+	echo master updated file12 >file12 &&
+	echo master updated file14 >file14 &&
+	echo master new sub >subdir/file3 &&
+	(
+		cd submod &&
+		echo master submodule >bar &&
+		git add bar &&
+		git commit -m "Add bar on master" &&
+		git checkout -b submod-master
+	) &&
+	git add file1 "spaced name" file12 file14 file2 subdir/file3 submod &&
+	git add both &&
+	git rm file11 &&
+	git commit -m "master updates" &&
 
-    git config merge.tool mytool &&
-    git config mergetool.mytool.cmd "cat \"\$REMOTE\" >\"\$MERGED\"" &&
-    git config mergetool.mytool.trustExitCode true &&
-    git config mergetool.mybase.cmd "cat \"\$BASE\" >\"\$MERGED\"" &&
-    git config mergetool.mybase.trustExitCode true
+	git config merge.tool mytool &&
+	git config mergetool.mytool.cmd "cat \"\$REMOTE\" >\"\$MERGED\"" &&
+	git config mergetool.mytool.trustExitCode true &&
+	git config mergetool.mybase.cmd "cat \"\$BASE\" >\"\$MERGED\"" &&
+	git config mergetool.mybase.trustExitCode true
 '
 
 test_expect_success 'custom mergetool' '
-    git checkout -b test1 branch1 &&
-    git submodule update -N &&
-    test_must_fail git merge master >/dev/null 2>&1 &&
-    ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
-    ( yes "" | git mergetool file1 file1 ) &&
-    ( yes "" | git mergetool file2 "spaced name" >/dev/null 2>&1 ) &&
-    ( yes "" | git mergetool subdir/file3 >/dev/null 2>&1 ) &&
-    ( yes "d" | git mergetool file11 >/dev/null 2>&1 ) &&
-    ( yes "d" | git mergetool file12 >/dev/null 2>&1 ) &&
-    ( yes "l" | git mergetool submod >/dev/null 2>&1 ) &&
-    test "$(cat file1)" = "master updated" &&
-    test "$(cat file2)" = "master new" &&
-    test "$(cat subdir/file3)" = "master new sub" &&
-    test "$(cat submod/bar)" = "branch1 submodule" &&
-    git commit -m "branch1 resolved with mergetool"
+	git checkout -b test1 branch1 &&
+	git submodule update -N &&
+	test_must_fail git merge master >/dev/null 2>&1 &&
+	( yes "" | git mergetool both >/dev/null 2>&1 ) &&
+	( yes "" | git mergetool file1 file1 ) &&
+	( yes "" | git mergetool file2 "spaced name" >/dev/null 2>&1 ) &&
+	( yes "" | git mergetool subdir/file3 >/dev/null 2>&1 ) &&
+	( yes "d" | git mergetool file11 >/dev/null 2>&1 ) &&
+	( yes "d" | git mergetool file12 >/dev/null 2>&1 ) &&
+	( yes "l" | git mergetool submod >/dev/null 2>&1 ) &&
+	test "$(cat file1)" = "master updated" &&
+	test "$(cat file2)" = "master new" &&
+	test "$(cat subdir/file3)" = "master new sub" &&
+	test "$(cat submod/bar)" = "branch1 submodule" &&
+	git commit -m "branch1 resolved with mergetool"
 '
 
 test_expect_success 'mergetool crlf' '
-    git config core.autocrlf true &&
-    git checkout -b test2 branch1 &&
-    test_must_fail git merge master >/dev/null 2>&1 &&
-    ( yes "" | git mergetool file1 >/dev/null 2>&1 ) &&
-    ( yes "" | git mergetool file2 >/dev/null 2>&1 ) &&
-    ( yes "" | git mergetool "spaced name" >/dev/null 2>&1 ) &&
-    ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
-    ( yes "" | git mergetool subdir/file3 >/dev/null 2>&1 ) &&
-    ( yes "d" | git mergetool file11 >/dev/null 2>&1 ) &&
-    ( yes "d" | git mergetool file12 >/dev/null 2>&1 ) &&
-    ( yes "r" | git mergetool submod >/dev/null 2>&1 ) &&
-    test "$(printf x | cat file1 -)" = "$(printf "master updated\r\nx")" &&
-    test "$(printf x | cat file2 -)" = "$(printf "master new\r\nx")" &&
-    test "$(printf x | cat subdir/file3 -)" = "$(printf "master new sub\r\nx")" &&
-    git submodule update -N &&
-    test "$(cat submod/bar)" = "master submodule" &&
-    git commit -m "branch1 resolved with mergetool - autocrlf" &&
-    git config core.autocrlf false &&
-    git reset --hard
+	test_config core.autocrlf true &&
+	git checkout -b test2 branch1 &&
+	test_must_fail git merge master >/dev/null 2>&1 &&
+	( yes "" | git mergetool file1 >/dev/null 2>&1 ) &&
+	( yes "" | git mergetool file2 >/dev/null 2>&1 ) &&
+	( yes "" | git mergetool "spaced name" >/dev/null 2>&1 ) &&
+	( yes "" | git mergetool both >/dev/null 2>&1 ) &&
+	( yes "" | git mergetool subdir/file3 >/dev/null 2>&1 ) &&
+	( yes "d" | git mergetool file11 >/dev/null 2>&1 ) &&
+	( yes "d" | git mergetool file12 >/dev/null 2>&1 ) &&
+	( yes "r" | git mergetool submod >/dev/null 2>&1 ) &&
+	test "$(printf x | cat file1 -)" = "$(printf "master updated\r\nx")" &&
+	test "$(printf x | cat file2 -)" = "$(printf "master new\r\nx")" &&
+	test "$(printf x | cat subdir/file3 -)" = "$(printf "master new sub\r\nx")" &&
+	git submodule update -N &&
+	test "$(cat submod/bar)" = "master submodule" &&
+	git commit -m "branch1 resolved with mergetool - autocrlf" &&
+	test_config core.autocrlf false &&
+	git reset --hard
 '
 
 test_expect_success 'mergetool in subdir' '
-    git checkout -b test3 branch1 &&
-    git submodule update -N &&
-    (
-	cd subdir &&
-	test_must_fail git merge master >/dev/null 2>&1 &&
-	( yes "" | git mergetool file3 >/dev/null 2>&1 ) &&
-	test "$(cat file3)" = "master new sub"
-    )
+	git checkout -b test3 branch1 &&
+	git submodule update -N &&
+	(
+		cd subdir &&
+		test_must_fail git merge master >/dev/null 2>&1 &&
+		( yes "" | git mergetool file3 >/dev/null 2>&1 ) &&
+		test "$(cat file3)" = "master new sub"
+	)
 '
 
 test_expect_success 'mergetool on file in parent dir' '
-    (
-	cd subdir &&
-	( yes "" | git mergetool ../file1 >/dev/null 2>&1 ) &&
-	( yes "" | git mergetool ../file2 ../spaced\ name >/dev/null 2>&1 ) &&
-	( yes "" | git mergetool ../both >/dev/null 2>&1 ) &&
-	( yes "d" | git mergetool ../file11 >/dev/null 2>&1 ) &&
-	( yes "d" | git mergetool ../file12 >/dev/null 2>&1 ) &&
-	( yes "l" | git mergetool ../submod >/dev/null 2>&1 ) &&
-	test "$(cat ../file1)" = "master updated" &&
-	test "$(cat ../file2)" = "master new" &&
-	test "$(cat ../submod/bar)" = "branch1 submodule" &&
-	git commit -m "branch1 resolved with mergetool - subdir"
-    )
+	(
+		cd subdir &&
+		( yes "" | git mergetool ../file1 >/dev/null 2>&1 ) &&
+		( yes "" | git mergetool ../file2 ../spaced\ name >/dev/null 2>&1 ) &&
+		( yes "" | git mergetool ../both >/dev/null 2>&1 ) &&
+		( yes "d" | git mergetool ../file11 >/dev/null 2>&1 ) &&
+		( yes "d" | git mergetool ../file12 >/dev/null 2>&1 ) &&
+		( yes "l" | git mergetool ../submod >/dev/null 2>&1 ) &&
+		test "$(cat ../file1)" = "master updated" &&
+		test "$(cat ../file2)" = "master new" &&
+		test "$(cat ../submod/bar)" = "branch1 submodule" &&
+		git commit -m "branch1 resolved with mergetool - subdir"
+	)
 '
 
 test_expect_success 'mergetool skips autoresolved' '
-    git checkout -b test4 branch1 &&
-    git submodule update -N &&
-    test_must_fail git merge master &&
-    test -n "$(git ls-files -u)" &&
-    ( yes "d" | git mergetool file11 >/dev/null 2>&1 ) &&
-    ( yes "d" | git mergetool file12 >/dev/null 2>&1 ) &&
-    ( yes "l" | git mergetool submod >/dev/null 2>&1 ) &&
-    output="$(git mergetool --no-prompt)" &&
-    test "$output" = "No files need merging" &&
-    git reset --hard
+	git checkout -b test4 branch1 &&
+	git submodule update -N &&
+	test_must_fail git merge master &&
+	test -n "$(git ls-files -u)" &&
+	( yes "d" | git mergetool file11 >/dev/null 2>&1 ) &&
+	( yes "d" | git mergetool file12 >/dev/null 2>&1 ) &&
+	( yes "l" | git mergetool submod >/dev/null 2>&1 ) &&
+	output="$(git mergetool --no-prompt)" &&
+	test "$output" = "No files need merging" &&
+	git reset --hard
 '
 
 test_expect_success 'mergetool merges all from subdir' '
-    (
-	cd subdir &&
-	git config rerere.enabled false &&
-	test_must_fail git merge master &&
-	( yes "r" | git mergetool ../submod ) &&
-	( yes "d" "d" | git mergetool --no-prompt ) &&
-	test "$(cat ../file1)" = "master updated" &&
-	test "$(cat ../file2)" = "master new" &&
-	test "$(cat file3)" = "master new sub" &&
-	( cd .. && git submodule update -N ) &&
-	test "$(cat ../submod/bar)" = "master submodule" &&
-	git commit -m "branch2 resolved by mergetool from subdir"
-    )
+	(
+		cd subdir &&
+		test_config rerere.enabled false &&
+		test_must_fail git merge master &&
+		( yes "r" | git mergetool ../submod ) &&
+		( yes "d" "d" | git mergetool --no-prompt ) &&
+		test "$(cat ../file1)" = "master updated" &&
+		test "$(cat ../file2)" = "master new" &&
+		test "$(cat file3)" = "master new sub" &&
+		( cd .. && git submodule update -N ) &&
+		test "$(cat ../submod/bar)" = "master submodule" &&
+		git commit -m "branch2 resolved by mergetool from subdir"
+	)
 '
 
 test_expect_success 'mergetool skips resolved paths when rerere is active' '
-    git config rerere.enabled true &&
-    rm -rf .git/rr-cache &&
-    git checkout -b test5 branch1
-    git submodule update -N &&
-    test_must_fail git merge master >/dev/null 2>&1 &&
-    ( yes "l" | git mergetool --no-prompt submod >/dev/null 2>&1 ) &&
-    ( yes "d" "d" | git mergetool --no-prompt >/dev/null 2>&1 ) &&
-    git submodule update -N &&
-    output="$(yes "n" | git mergetool --no-prompt)" &&
-    test "$output" = "No files need merging" &&
-    git reset --hard
+	test_config rerere.enabled true &&
+	rm -rf .git/rr-cache &&
+	git checkout -b test5 branch1 &&
+	git submodule update -N &&
+	test_must_fail git merge master >/dev/null 2>&1 &&
+	( yes "l" | git mergetool --no-prompt submod >/dev/null 2>&1 ) &&
+	( yes "d" "d" | git mergetool --no-prompt >/dev/null 2>&1 ) &&
+	git submodule update -N &&
+	output="$(yes "n" | git mergetool --no-prompt)" &&
+	test "$output" = "No files need merging" &&
+	git reset --hard
 '
 
 test_expect_success 'conflicted stash sets up rerere'  '
-    git config rerere.enabled true &&
-    git checkout stash1 &&
-    echo "Conflicting stash content" >file11 &&
-    git stash &&
+	test_config rerere.enabled true &&
+	git checkout stash1 &&
+	echo "Conflicting stash content" >file11 &&
+	git stash &&
 
-    git checkout --detach stash2 &&
-    test_must_fail git stash apply &&
+	git checkout --detach stash2 &&
+	test_must_fail git stash apply &&
 
-    test -n "$(git ls-files -u)" &&
-    conflicts="$(git rerere remaining)" &&
-    test "$conflicts" = "file11" &&
-    output="$(git mergetool --no-prompt)" &&
-    test "$output" != "No files need merging" &&
+	test -n "$(git ls-files -u)" &&
+	conflicts="$(git rerere remaining)" &&
+	test "$conflicts" = "file11" &&
+	output="$(git mergetool --no-prompt)" &&
+	test "$output" != "No files need merging" &&
 
-    git commit -am "save the stash resolution" &&
+	git commit -am "save the stash resolution" &&
 
-    git reset --hard stash2 &&
-    test_must_fail git stash apply &&
+	git reset --hard stash2 &&
+	test_must_fail git stash apply &&
 
-    test -n "$(git ls-files -u)" &&
-    conflicts="$(git rerere remaining)" &&
-    test -z "$conflicts" &&
-    output="$(git mergetool --no-prompt)" &&
-    test "$output" = "No files need merging"
+	test -n "$(git ls-files -u)" &&
+	conflicts="$(git rerere remaining)" &&
+	test -z "$conflicts" &&
+	output="$(git mergetool --no-prompt)" &&
+	test "$output" = "No files need merging"
 '
 
 test_expect_success 'mergetool takes partial path' '
-    git reset --hard
-    git config rerere.enabled false &&
-    git checkout -b test12 branch1 &&
-    git submodule update -N &&
-    test_must_fail git merge master &&
+	git reset --hard &&
+	test_config rerere.enabled false &&
+	git checkout -b test12 branch1 &&
+	git submodule update -N &&
+	test_must_fail git merge master &&
 
-    #should not need these lines
-    #( yes "d" | git mergetool file11 >/dev/null 2>&1 ) &&
-    #( yes "d" | git mergetool file12 >/dev/null 2>&1 ) &&
-    #( yes "l" | git mergetool submod >/dev/null 2>&1 ) &&
-    #( yes "" | git mergetool file1 file2 >/dev/null 2>&1 ) &&
+	( yes "" | git mergetool subdir ) &&
 
-    ( yes "" | git mergetool subdir ) &&
-
-    test "$(cat subdir/file3)" = "master new sub" &&
-    git reset --hard
+	test "$(cat subdir/file3)" = "master new sub" &&
+	git reset --hard
 '
 
 test_expect_success 'deleted vs modified submodule' '
-    git checkout -b test6 branch1 &&
-    git submodule update -N &&
-    mv submod submod-movedaside &&
-    git rm --cached submod &&
-    git commit -m "Submodule deleted from branch" &&
-    git checkout -b test6.a test6 &&
-    test_must_fail git merge master &&
-    test -n "$(git ls-files -u)" &&
-    ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
-    ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
-    ( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) &&
-    ( yes "r" | git mergetool submod ) &&
-    rmdir submod && mv submod-movedaside submod &&
-    test "$(cat submod/bar)" = "branch1 submodule" &&
-    git submodule update -N &&
-    test "$(cat submod/bar)" = "master submodule" &&
-    output="$(git mergetool --no-prompt)" &&
-    test "$output" = "No files need merging" &&
-    git commit -m "Merge resolved by keeping module" &&
+	git checkout -b test6 branch1 &&
+	git submodule update -N &&
+	mv submod submod-movedaside &&
+	git rm --cached submod &&
+	git commit -m "Submodule deleted from branch" &&
+	git checkout -b test6.a test6 &&
+	test_must_fail git merge master &&
+	test -n "$(git ls-files -u)" &&
+	( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
+	( yes "" | git mergetool both >/dev/null 2>&1 ) &&
+	( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) &&
+	( yes "r" | git mergetool submod ) &&
+	rmdir submod && mv submod-movedaside submod &&
+	test "$(cat submod/bar)" = "branch1 submodule" &&
+	git submodule update -N &&
+	test "$(cat submod/bar)" = "master submodule" &&
+	output="$(git mergetool --no-prompt)" &&
+	test "$output" = "No files need merging" &&
+	git commit -m "Merge resolved by keeping module" &&
 
-    mv submod submod-movedaside &&
-    git checkout -b test6.b test6 &&
-    git submodule update -N &&
-    test_must_fail git merge master &&
-    test -n "$(git ls-files -u)" &&
-    ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
-    ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
-    ( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) &&
-    ( yes "l" | git mergetool submod ) &&
-    test ! -e submod &&
-    output="$(git mergetool --no-prompt)" &&
-    test "$output" = "No files need merging" &&
-    git commit -m "Merge resolved by deleting module" &&
+	mv submod submod-movedaside &&
+	git checkout -b test6.b test6 &&
+	git submodule update -N &&
+	test_must_fail git merge master &&
+	test -n "$(git ls-files -u)" &&
+	( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
+	( yes "" | git mergetool both >/dev/null 2>&1 ) &&
+	( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) &&
+	( yes "l" | git mergetool submod ) &&
+	test ! -e submod &&
+	output="$(git mergetool --no-prompt)" &&
+	test "$output" = "No files need merging" &&
+	git commit -m "Merge resolved by deleting module" &&
 
-    mv submod-movedaside submod &&
-    git checkout -b test6.c master &&
-    git submodule update -N &&
-    test_must_fail git merge test6 &&
-    test -n "$(git ls-files -u)" &&
-    ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
-    ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
-    ( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) &&
-    ( yes "r" | git mergetool submod ) &&
-    test ! -e submod &&
-    test -d submod.orig &&
-    git submodule update -N &&
-    output="$(git mergetool --no-prompt)" &&
-    test "$output" = "No files need merging" &&
-    git commit -m "Merge resolved by deleting module" &&
-    mv submod.orig submod &&
+	mv submod-movedaside submod &&
+	git checkout -b test6.c master &&
+	git submodule update -N &&
+	test_must_fail git merge test6 &&
+	test -n "$(git ls-files -u)" &&
+	( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
+	( yes "" | git mergetool both >/dev/null 2>&1 ) &&
+	( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) &&
+	( yes "r" | git mergetool submod ) &&
+	test ! -e submod &&
+	test -d submod.orig &&
+	git submodule update -N &&
+	output="$(git mergetool --no-prompt)" &&
+	test "$output" = "No files need merging" &&
+	git commit -m "Merge resolved by deleting module" &&
+	mv submod.orig submod &&
 
-    git checkout -b test6.d master &&
-    git submodule update -N &&
-    test_must_fail git merge test6 &&
-    test -n "$(git ls-files -u)" &&
-    ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
-    ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
-    ( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) &&
-    ( yes "l" | git mergetool submod ) &&
-    test "$(cat submod/bar)" = "master submodule" &&
-    git submodule update -N &&
-    test "$(cat submod/bar)" = "master submodule" &&
-    output="$(git mergetool --no-prompt)" &&
-    test "$output" = "No files need merging" &&
-    git commit -m "Merge resolved by keeping module" &&
-    git reset --hard HEAD
+	git checkout -b test6.d master &&
+	git submodule update -N &&
+	test_must_fail git merge test6 &&
+	test -n "$(git ls-files -u)" &&
+	( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
+	( yes "" | git mergetool both >/dev/null 2>&1 ) &&
+	( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) &&
+	( yes "l" | git mergetool submod ) &&
+	test "$(cat submod/bar)" = "master submodule" &&
+	git submodule update -N &&
+	test "$(cat submod/bar)" = "master submodule" &&
+	output="$(git mergetool --no-prompt)" &&
+	test "$output" = "No files need merging" &&
+	git commit -m "Merge resolved by keeping module" &&
+	git reset --hard HEAD
 '
 
 test_expect_success 'file vs modified submodule' '
-    git checkout -b test7 branch1 &&
-    git submodule update -N &&
-    mv submod submod-movedaside &&
-    git rm --cached submod &&
-    echo not a submodule >submod &&
-    git add submod &&
-    git commit -m "Submodule path becomes file" &&
-    git checkout -b test7.a branch1 &&
-    test_must_fail git merge master &&
-    test -n "$(git ls-files -u)" &&
-    ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
-    ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
-    ( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) &&
-    ( yes "r" | git mergetool submod ) &&
-    rmdir submod && mv submod-movedaside submod &&
-    test "$(cat submod/bar)" = "branch1 submodule" &&
-    git submodule update -N &&
-    test "$(cat submod/bar)" = "master submodule" &&
-    output="$(git mergetool --no-prompt)" &&
-    test "$output" = "No files need merging" &&
-    git commit -m "Merge resolved by keeping module" &&
+	git checkout -b test7 branch1 &&
+	git submodule update -N &&
+	mv submod submod-movedaside &&
+	git rm --cached submod &&
+	echo not a submodule >submod &&
+	git add submod &&
+	git commit -m "Submodule path becomes file" &&
+	git checkout -b test7.a branch1 &&
+	test_must_fail git merge master &&
+	test -n "$(git ls-files -u)" &&
+	( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
+	( yes "" | git mergetool both >/dev/null 2>&1 ) &&
+	( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) &&
+	( yes "r" | git mergetool submod ) &&
+	rmdir submod && mv submod-movedaside submod &&
+	test "$(cat submod/bar)" = "branch1 submodule" &&
+	git submodule update -N &&
+	test "$(cat submod/bar)" = "master submodule" &&
+	output="$(git mergetool --no-prompt)" &&
+	test "$output" = "No files need merging" &&
+	git commit -m "Merge resolved by keeping module" &&
 
-    mv submod submod-movedaside &&
-    git checkout -b test7.b test7 &&
-    test_must_fail git merge master &&
-    test -n "$(git ls-files -u)" &&
-    ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
-    ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
-    ( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) &&
-    ( yes "l" | git mergetool submod ) &&
-    git submodule update -N &&
-    test "$(cat submod)" = "not a submodule" &&
-    output="$(git mergetool --no-prompt)" &&
-    test "$output" = "No files need merging" &&
-    git commit -m "Merge resolved by keeping file" &&
+	mv submod submod-movedaside &&
+	git checkout -b test7.b test7 &&
+	test_must_fail git merge master &&
+	test -n "$(git ls-files -u)" &&
+	( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
+	( yes "" | git mergetool both >/dev/null 2>&1 ) &&
+	( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) &&
+	( yes "l" | git mergetool submod ) &&
+	git submodule update -N &&
+	test "$(cat submod)" = "not a submodule" &&
+	output="$(git mergetool --no-prompt)" &&
+	test "$output" = "No files need merging" &&
+	git commit -m "Merge resolved by keeping file" &&
 
-    git checkout -b test7.c master &&
-    rmdir submod && mv submod-movedaside submod &&
-    test ! -e submod.orig &&
-    git submodule update -N &&
-    test_must_fail git merge test7 &&
-    test -n "$(git ls-files -u)" &&
-    ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
-    ( yes "" | git mergetool both >/dev/null 2>&1 ) &&
-    ( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) &&
-    ( yes "r" | git mergetool submod ) &&
-    test -d submod.orig &&
-    git submodule update -N &&
-    test "$(cat submod)" = "not a submodule" &&
-    output="$(git mergetool --no-prompt)" &&
-    test "$output" = "No files need merging" &&
-    git commit -m "Merge resolved by keeping file" &&
+	git checkout -b test7.c master &&
+	rmdir submod && mv submod-movedaside submod &&
+	test ! -e submod.orig &&
+	git submodule update -N &&
+	test_must_fail git merge test7 &&
+	test -n "$(git ls-files -u)" &&
+	( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
+	( yes "" | git mergetool both >/dev/null 2>&1 ) &&
+	( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) &&
+	( yes "r" | git mergetool submod ) &&
+	test -d submod.orig &&
+	git submodule update -N &&
+	test "$(cat submod)" = "not a submodule" &&
+	output="$(git mergetool --no-prompt)" &&
+	test "$output" = "No files need merging" &&
+	git commit -m "Merge resolved by keeping file" &&
 
-    git checkout -b test7.d master &&
-    rmdir submod && mv submod.orig submod &&
-    git submodule update -N &&
-    test_must_fail git merge test7 &&
-    test -n "$(git ls-files -u)" &&
-    ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
-    ( yes "" | git mergetool both>/dev/null 2>&1 ) &&
-    ( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) &&
-    ( yes "l" | git mergetool submod ) &&
-    test "$(cat submod/bar)" = "master submodule" &&
-    git submodule update -N &&
-    test "$(cat submod/bar)" = "master submodule" &&
-    output="$(git mergetool --no-prompt)" &&
-    test "$output" = "No files need merging" &&
-    git commit -m "Merge resolved by keeping module"
+	git checkout -b test7.d master &&
+	rmdir submod && mv submod.orig submod &&
+	git submodule update -N &&
+	test_must_fail git merge test7 &&
+	test -n "$(git ls-files -u)" &&
+	( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) &&
+	( yes "" | git mergetool both>/dev/null 2>&1 ) &&
+	( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) &&
+	( yes "l" | git mergetool submod ) &&
+	test "$(cat submod/bar)" = "master submodule" &&
+	git submodule update -N &&
+	test "$(cat submod/bar)" = "master submodule" &&
+	output="$(git mergetool --no-prompt)" &&
+	test "$output" = "No files need merging" &&
+	git commit -m "Merge resolved by keeping module"
 '
 
 test_expect_success 'submodule in subdirectory' '
-    git checkout -b test10 branch1 &&
-    git submodule update -N &&
-    (
-	cd subdir &&
-	test_create_repo subdir_module &&
+	git checkout -b test10 branch1 &&
+	git submodule update -N &&
 	(
-	    cd subdir_module &&
-	    : >file15 &&
-	    git add file15 &&
-	    git commit -m "add initial versions"
-	)
-    ) &&
-    git submodule add git://example.com/subsubmodule subdir/subdir_module &&
-    git add subdir/subdir_module &&
-    git commit -m "add submodule in subdirectory" &&
+		cd subdir &&
+		test_create_repo subdir_module &&
+		(
+		cd subdir_module &&
+		: >file15 &&
+		git add file15 &&
+		git commit -m "add initial versions"
+		)
+	) &&
+	git submodule add git://example.com/subsubmodule subdir/subdir_module &&
+	git add subdir/subdir_module &&
+	git commit -m "add submodule in subdirectory" &&
 
-    git checkout -b test10.a test10 &&
-    git submodule update -N &&
-    (
+	git checkout -b test10.a test10 &&
+	git submodule update -N &&
+	(
 	cd subdir/subdir_module &&
-	git checkout -b super10.a &&
-	echo test10.a >file15 &&
-	git add file15 &&
-	git commit -m "on branch 10.a"
-    ) &&
-    git add subdir/subdir_module &&
-    git commit -m "change submodule in subdirectory on test10.a" &&
+		git checkout -b super10.a &&
+		echo test10.a >file15 &&
+		git add file15 &&
+		git commit -m "on branch 10.a"
+	) &&
+	git add subdir/subdir_module &&
+	git commit -m "change submodule in subdirectory on test10.a" &&
 
-    git checkout -b test10.b test10 &&
-    git submodule update -N &&
-    (
-	cd subdir/subdir_module &&
-	git checkout -b super10.b &&
-	echo test10.b >file15 &&
-	git add file15 &&
-	git commit -m "on branch 10.b"
-    ) &&
-    git add subdir/subdir_module &&
-    git commit -m "change submodule in subdirectory on test10.b" &&
+	git checkout -b test10.b test10 &&
+	git submodule update -N &&
+	(
+		cd subdir/subdir_module &&
+		git checkout -b super10.b &&
+		echo test10.b >file15 &&
+		git add file15 &&
+		git commit -m "on branch 10.b"
+	) &&
+	git add subdir/subdir_module &&
+	git commit -m "change submodule in subdirectory on test10.b" &&
 
-    test_must_fail git merge test10.a >/dev/null 2>&1 &&
-    (
-	cd subdir &&
-	( yes "l" | git mergetool subdir_module )
-    ) &&
-    test "$(cat subdir/subdir_module/file15)" = "test10.b" &&
-    git submodule update -N &&
-    test "$(cat subdir/subdir_module/file15)" = "test10.b" &&
-    git reset --hard &&
-    git submodule update -N &&
+	test_must_fail git merge test10.a >/dev/null 2>&1 &&
+	(
+		cd subdir &&
+		( yes "l" | git mergetool subdir_module )
+	) &&
+	test "$(cat subdir/subdir_module/file15)" = "test10.b" &&
+	git submodule update -N &&
+	test "$(cat subdir/subdir_module/file15)" = "test10.b" &&
+	git reset --hard &&
+	git submodule update -N &&
 
-    test_must_fail git merge test10.a >/dev/null 2>&1 &&
-    ( yes "r" | git mergetool subdir/subdir_module ) &&
-    test "$(cat subdir/subdir_module/file15)" = "test10.b" &&
-    git submodule update -N &&
-    test "$(cat subdir/subdir_module/file15)" = "test10.a" &&
-    git commit -m "branch1 resolved with mergetool" &&
-    rm -rf subdir/subdir_module
+	test_must_fail git merge test10.a >/dev/null 2>&1 &&
+	( yes "r" | git mergetool subdir/subdir_module ) &&
+	test "$(cat subdir/subdir_module/file15)" = "test10.b" &&
+	git submodule update -N &&
+	test "$(cat subdir/subdir_module/file15)" = "test10.a" &&
+	git commit -m "branch1 resolved with mergetool" &&
+	rm -rf subdir/subdir_module
 '
 
 test_expect_success 'directory vs modified submodule' '
-    git checkout -b test11 branch1 &&
-    mv submod submod-movedaside &&
-    git rm --cached submod &&
-    mkdir submod &&
-    echo not a submodule >submod/file16 &&
-    git add submod/file16 &&
-    git commit -m "Submodule path becomes directory" &&
+	git checkout -b test11 branch1 &&
+	mv submod submod-movedaside &&
+	git rm --cached submod &&
+	mkdir submod &&
+	echo not a submodule >submod/file16 &&
+	git add submod/file16 &&
+	git commit -m "Submodule path becomes directory" &&
 
-    test_must_fail git merge master &&
-    test -n "$(git ls-files -u)" &&
-    ( yes "l" | git mergetool submod ) &&
-    test "$(cat submod/file16)" = "not a submodule" &&
-    rm -rf submod.orig &&
+	test_must_fail git merge master &&
+	test -n "$(git ls-files -u)" &&
+	( yes "l" | git mergetool submod ) &&
+	test "$(cat submod/file16)" = "not a submodule" &&
+	rm -rf submod.orig &&
 
-    git reset --hard >/dev/null 2>&1 &&
-    test_must_fail git merge master &&
-    test -n "$(git ls-files -u)" &&
-    test ! -e submod.orig &&
-    ( yes "r" | git mergetool submod ) &&
-    test -d submod.orig &&
-    test "$(cat submod.orig/file16)" = "not a submodule" &&
-    rm -r submod.orig &&
-    mv submod-movedaside/.git submod &&
-    ( cd submod && git clean -f && git reset --hard ) &&
-    git submodule update -N &&
-    test "$(cat submod/bar)" = "master submodule" &&
-    git reset --hard >/dev/null 2>&1 && rm -rf submod-movedaside &&
+	git reset --hard >/dev/null 2>&1 &&
+	test_must_fail git merge master &&
+	test -n "$(git ls-files -u)" &&
+	test ! -e submod.orig &&
+	( yes "r" | git mergetool submod ) &&
+	test -d submod.orig &&
+	test "$(cat submod.orig/file16)" = "not a submodule" &&
+	rm -r submod.orig &&
+	mv submod-movedaside/.git submod &&
+	( cd submod && git clean -f && git reset --hard ) &&
+	git submodule update -N &&
+	test "$(cat submod/bar)" = "master submodule" &&
+	git reset --hard >/dev/null 2>&1 && rm -rf submod-movedaside &&
 
-    git checkout -b test11.c master &&
-    git submodule update -N &&
-    test_must_fail git merge test11 &&
-    test -n "$(git ls-files -u)" &&
-    ( yes "l" | git mergetool submod ) &&
-    git submodule update -N &&
-    test "$(cat submod/bar)" = "master submodule" &&
+	git checkout -b test11.c master &&
+	git submodule update -N &&
+	test_must_fail git merge test11 &&
+	test -n "$(git ls-files -u)" &&
+	( yes "l" | git mergetool submod ) &&
+	git submodule update -N &&
+	test "$(cat submod/bar)" = "master submodule" &&
 
-    git reset --hard >/dev/null 2>&1 &&
-    git submodule update -N &&
-    test_must_fail git merge test11 &&
-    test -n "$(git ls-files -u)" &&
-    test ! -e submod.orig &&
-    ( yes "r" | git mergetool submod ) &&
-    test "$(cat submod/file16)" = "not a submodule" &&
+	git reset --hard >/dev/null 2>&1 &&
+	git submodule update -N &&
+	test_must_fail git merge test11 &&
+	test -n "$(git ls-files -u)" &&
+	test ! -e submod.orig &&
+	( yes "r" | git mergetool submod ) &&
+	test "$(cat submod/file16)" = "not a submodule" &&
 
-    git reset --hard master >/dev/null 2>&1 &&
-    ( cd submod && git clean -f && git reset --hard ) &&
-    git submodule update -N
+	git reset --hard master >/dev/null 2>&1 &&
+	( cd submod && git clean -f && git reset --hard ) &&
+	git submodule update -N
 '
 
 test_expect_success 'file with no base' '
-    git checkout -b test13 branch1 &&
-    test_must_fail git merge master &&
-    git mergetool --no-prompt --tool mybase -- both &&
-    >expected &&
-    test_cmp both expected &&
-    git reset --hard master >/dev/null 2>&1
+	git checkout -b test13 branch1 &&
+	test_must_fail git merge master &&
+	git mergetool --no-prompt --tool mybase -- both &&
+	>expected &&
+	test_cmp both expected &&
+	git reset --hard master >/dev/null 2>&1
 '
 
 test_expect_success 'custom commands override built-ins' '
-    git checkout -b test14 branch1 &&
-    git config mergetool.defaults.cmd "cat \"\$REMOTE\" >\"\$MERGED\"" &&
-    git config mergetool.defaults.trustExitCode true &&
-    test_must_fail git merge master &&
-    git mergetool --no-prompt --tool defaults -- both &&
-    echo master both added >expected &&
-    test_cmp both expected &&
-    git config --unset mergetool.defaults.cmd &&
-    git config --unset mergetool.defaults.trustExitCode &&
-    git reset --hard master >/dev/null 2>&1
+	git checkout -b test14 branch1 &&
+	test_config mergetool.defaults.cmd "cat \"\$REMOTE\" >\"\$MERGED\"" &&
+	test_config mergetool.defaults.trustExitCode true &&
+	test_must_fail git merge master &&
+	git mergetool --no-prompt --tool defaults -- both &&
+	echo master both added >expected &&
+	test_cmp both expected &&
+	git reset --hard master >/dev/null 2>&1
+'
+
+test_expect_success 'filenames seen by tools start with ./' '
+	git checkout -b test15 branch1 &&
+	test_config mergetool.writeToTemp false &&
+	test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
+	test_config mergetool.myecho.trustExitCode true &&
+	test_must_fail git merge master &&
+	git mergetool --no-prompt --tool myecho -- both >actual &&
+	grep ^\./both_LOCAL_ actual >/dev/null &&
+	git reset --hard master >/dev/null 2>&1
+'
+
+test_expect_success 'temporary filenames are used with mergetool.writeToTemp' '
+	git checkout -b test16 branch1 &&
+	test_config mergetool.writeToTemp true &&
+	test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
+	test_config mergetool.myecho.trustExitCode true &&
+	test_must_fail git merge master &&
+	git mergetool --no-prompt --tool myecho -- both >actual &&
+	test_must_fail grep ^\./both_LOCAL_ actual >/dev/null &&
+	grep /both_LOCAL_ actual >/dev/null &&
+	git reset --hard master >/dev/null 2>&1
 '
 
 test_done
diff --git a/t/t7613-merge-submodule.sh b/t/t7613-merge-submodule.sh
new file mode 100755
index 0000000..d1e9fcc
--- /dev/null
+++ b/t/t7613-merge-submodule.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+test_description='merge can handle submodules'
+
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-submodule-update.sh
+
+# merges without conflicts
+test_submodule_switch "git merge"
+
+test_submodule_switch "git merge --ff"
+
+test_submodule_switch "git merge --ff-only"
+
+KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1
+KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1
+test_submodule_switch "git merge --no-ff"
+
+test_done
diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh
index 61e6ed3..021c547 100755
--- a/t/t7700-repack.sh
+++ b/t/t7700-repack.sh
@@ -21,7 +21,7 @@
 	objsha1=$(git verify-pack -v pack-$packsha1.idx | head -n 1 |
 		sed -e "s/^\([0-9a-f]\{40\}\).*/\1/") &&
 	mv pack-* .git/objects/pack/ &&
-	git repack --no-pack-kept-objects -A -d -l &&
+	git repack -A -d -l &&
 	git prune-packed &&
 	for p in .git/objects/pack/*.idx; do
 		idx=$(basename $p)
@@ -53,7 +53,7 @@
 
 test_expect_success 'writing bitmaps via config can duplicate .keep objects' '
 	# build on $objsha1, $packsha1, and .keep state from previous
-	git -c pack.writebitmaps=true repack -Adl &&
+	git -c repack.writebitmaps=true repack -Adl &&
 	test_when_finished "found_duplicate_object=" &&
 	for p in .git/objects/pack/*.idx; do
 		idx=$(basename $p)
diff --git a/t/t7701-repack-unpack-unreachable.sh b/t/t7701-repack-unpack-unreachable.sh
index b8d4cde..aad8a9c 100755
--- a/t/t7701-repack-unpack-unreachable.sh
+++ b/t/t7701-repack-unpack-unreachable.sh
@@ -109,4 +109,17 @@
 	test_must_fail git cat-file -p $obj2
 '
 
+test_expect_success 'keep packed objects found only in index' '
+	echo my-unique-content >file &&
+	git add file &&
+	git commit -m "make it reachable" &&
+	git gc &&
+	git reset HEAD^ &&
+	git reflog expire --expire=now --all &&
+	git add file &&
+	test-chmtime =-86400 .git/objects/pack/* &&
+	git gc --prune=1.hour.ago &&
+	git cat-file blob :file
+'
+
 test_done
diff --git a/t/t7702-repack-cyclic-alternate.sh b/t/t7702-repack-cyclic-alternate.sh
new file mode 100755
index 0000000..93b7486
--- /dev/null
+++ b/t/t7702-repack-cyclic-alternate.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# Copyright (c) 2014 Ephrim Khong
+#
+
+test_description='repack involving cyclic alternate'
+. ./test-lib.sh
+
+test_expect_success setup '
+	GIT_OBJECT_DIRECTORY=.git//../.git/objects &&
+	export GIT_OBJECT_DIRECTORY &&
+	touch a &&
+	git add a &&
+	git commit -m 1 &&
+	git repack -adl &&
+	echo "$(pwd)"/.git/objects/../objects >.git/objects/info/alternates
+'
+
+test_expect_success 're-packing repository with itsself as alternate' '
+	git repack -adl &&
+	git fsck
+'
+
+test_done
diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh
index 5a193c5..69bde7a 100755
--- a/t/t7800-difftool.sh
+++ b/t/t7800-difftool.sh
@@ -58,7 +58,7 @@
 
 test_expect_success PERL 'difftool ignores bad --tool values' '
 	: >expect &&
-	test_expect_code 1 \
+	test_must_fail \
 		git difftool --no-prompt --tool=bad-tool branch >actual &&
 	test_cmp expect actual
 '
@@ -76,6 +76,49 @@
 	rm for-diff
 '
 
+test_expect_success PERL 'difftool ignores exit code' '
+	test_config difftool.error.cmd false &&
+	git difftool -y -t error branch
+'
+
+test_expect_success PERL 'difftool forwards exit code with --trust-exit-code' '
+	test_config difftool.error.cmd false &&
+	test_must_fail git difftool -y --trust-exit-code -t error branch
+'
+
+test_expect_success PERL 'difftool honors difftool.trustExitCode = true' '
+	test_config difftool.error.cmd false &&
+	test_config difftool.trustExitCode true &&
+	test_must_fail git difftool -y -t error branch
+'
+
+test_expect_success PERL 'difftool honors difftool.trustExitCode = false' '
+	test_config difftool.error.cmd false &&
+	test_config difftool.trustExitCode false &&
+	git difftool -y -t error branch
+'
+
+test_expect_success PERL 'difftool ignores exit code with --no-trust-exit-code' '
+	test_config difftool.error.cmd false &&
+	test_config difftool.trustExitCode true &&
+	git difftool -y --no-trust-exit-code -t error branch
+'
+
+test_expect_success PERL 'difftool stops on error with --trust-exit-code' '
+	test_when_finished "rm -f for-diff .git/fail-right-file" &&
+	test_when_finished "git reset -- for-diff" &&
+	write_script .git/fail-right-file <<-\EOF &&
+	echo "$2"
+	exit 1
+	EOF
+	>for-diff &&
+	git add for-diff &&
+	echo file >expect &&
+	test_must_fail git difftool -y --trust-exit-code \
+		--extcmd .git/fail-right-file branch >actual &&
+	test_cmp expect actual
+'
+
 test_expect_success PERL 'difftool honors --gui' '
 	difftool_test_setup &&
 	test_config merge.tool bogus-tool &&
@@ -301,6 +344,14 @@
 	! grep br2 output
 '
 
+test_expect_success PERL 'ending prompt input with EOF' '
+	git difftool -x cat branch </dev/null >output &&
+	! grep master output &&
+	! grep branch output &&
+	! grep m2 output &&
+	! grep br2 output
+'
+
 test_expect_success PERL 'difftool --tool-help' '
 	git difftool --tool-help >output &&
 	grep tool output
diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh
index 40615de..028ffe4 100755
--- a/t/t7810-grep.sh
+++ b/t/t7810-grep.sh
@@ -1202,4 +1202,98 @@
 	test_cmp expected actual
 '
 
+cat >expected <<EOF
+space-line without leading space1
+space: line <RED>with <RESET>leading space1
+space: line <RED>with <RESET>leading <RED>space2<RESET>
+space: line <RED>with <RESET>leading space3
+space:line without leading <RED>space2<RESET>
+EOF
+
+test_expect_success 'grep --color -e A -e B with context' '
+	test_config color.grep.context		normal &&
+	test_config color.grep.filename		normal &&
+	test_config color.grep.function		normal &&
+	test_config color.grep.linenumber	normal &&
+	test_config color.grep.matchContext	normal &&
+	test_config color.grep.matchSelected	red &&
+	test_config color.grep.selected		normal &&
+	test_config color.grep.separator	normal &&
+
+	git grep --color=always -C2 -e "with " -e space2  space |
+	test_decode_color >actual &&
+	test_cmp expected actual
+'
+
+cat >expected <<EOF
+space-line without leading space1
+space- line with leading space1
+space: line <RED>with <RESET>leading <RED>space2<RESET>
+space- line with leading space3
+space-line without leading space2
+EOF
+
+test_expect_success 'grep --color -e A --and -e B with context' '
+	test_config color.grep.context		normal &&
+	test_config color.grep.filename		normal &&
+	test_config color.grep.function		normal &&
+	test_config color.grep.linenumber	normal &&
+	test_config color.grep.matchContext	normal &&
+	test_config color.grep.matchSelected	red &&
+	test_config color.grep.selected		normal &&
+	test_config color.grep.separator	normal &&
+
+	git grep --color=always -C2 -e "with " --and -e space2  space |
+	test_decode_color >actual &&
+	test_cmp expected actual
+'
+
+cat >expected <<EOF
+space-line without leading space1
+space: line <RED>with <RESET>leading space1
+space- line with leading space2
+space: line <RED>with <RESET>leading space3
+space-line without leading space2
+EOF
+
+test_expect_success 'grep --color -e A --and --not -e B with context' '
+	test_config color.grep.context		normal &&
+	test_config color.grep.filename		normal &&
+	test_config color.grep.function		normal &&
+	test_config color.grep.linenumber	normal &&
+	test_config color.grep.matchContext	normal &&
+	test_config color.grep.matchSelected	red &&
+	test_config color.grep.selected		normal &&
+	test_config color.grep.separator	normal &&
+
+	git grep --color=always -C2 -e "with " --and --not -e space2  space |
+	test_decode_color >actual &&
+	test_cmp expected actual
+'
+
+cat >expected <<EOF
+hello.c-#include <stdio.h>
+hello.c=int main(int argc, const char **argv)
+hello.c-{
+hello.c:	pr<RED>int<RESET>f("<RED>Hello<RESET> world.\n");
+hello.c-	return 0;
+hello.c-	/* char ?? */
+hello.c-}
+EOF
+
+test_expect_success 'grep --color -e A --and -e B -p with context' '
+	test_config color.grep.context		normal &&
+	test_config color.grep.filename		normal &&
+	test_config color.grep.function		normal &&
+	test_config color.grep.linenumber	normal &&
+	test_config color.grep.matchContext	normal &&
+	test_config color.grep.matchSelected	red &&
+	test_config color.grep.selected		normal &&
+	test_config color.grep.separator	normal &&
+
+	git grep --color=always -p -C3 -e int --and -e Hello --no-index hello.c |
+	test_decode_color >actual &&
+	test_cmp expected actual
+'
+
 test_done
diff --git a/t/t8005-blame-i18n.sh b/t/t8005-blame-i18n.sh
index cb39055..847d098 100755
--- a/t/t8005-blame-i18n.sh
+++ b/t/t8005-blame-i18n.sh
@@ -33,7 +33,7 @@
 summary $SJIS_MSG
 EOF
 
-test_expect_success \
+test_expect_success !MINGW \
 	'blame respects i18n.commitencoding' '
 	git blame --incremental file | \
 		egrep "^(author|summary) " > actual &&
@@ -49,7 +49,7 @@
 summary $EUC_JAPAN_MSG
 EOF
 
-test_expect_success \
+test_expect_success !MINGW \
 	'blame respects i18n.logoutputencoding' '
 	git config i18n.logoutputencoding eucJP &&
 	git blame --incremental file | \
@@ -66,7 +66,7 @@
 summary $UTF8_MSG
 EOF
 
-test_expect_success \
+test_expect_success !MINGW \
 	'blame respects --encoding=UTF-8' '
 	git blame --incremental --encoding=UTF-8 file | \
 		egrep "^(author|summary) " > actual &&
@@ -82,7 +82,7 @@
 summary $UTF8_MSG
 EOF
 
-test_expect_success \
+test_expect_success !MINGW \
 	'blame respects --encoding=none' '
 	git blame --incremental --encoding=none file | \
 		egrep "^(author|summary) " > actual &&
diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh
index 1ecdacb..19a3ced 100755
--- a/t/t9001-send-email.sh
+++ b/t/t9001-send-email.sh
@@ -1334,6 +1334,51 @@
 	test -n "$(ls msgtxt*)"
 '
 
+test_cover_addresses () {
+	header="$1"
+	shift
+	clean_fake_sendmail &&
+	rm -fr outdir &&
+	git format-patch --cover-letter -2 -o outdir &&
+	cover=`echo outdir/0000-*.patch` &&
+	mv $cover cover-to-edit.patch &&
+	perl -pe "s/^From:/$header: extra\@address.com\nFrom:/" cover-to-edit.patch >"$cover" &&
+	git send-email \
+	  --force \
+	  --from="Example <nobody@example.com>" \
+	  --no-to --no-cc \
+	  "$@" \
+	  --smtp-server="$(pwd)/fake.sendmail" \
+	  outdir/0000-*.patch \
+	  outdir/0001-*.patch \
+	  outdir/0002-*.patch \
+	  2>errors >out &&
+	grep "^$header: extra@address.com" msgtxt1 >to1 &&
+	grep "^$header: extra@address.com" msgtxt2 >to2 &&
+	grep "^$header: extra@address.com" msgtxt3 >to3 &&
+	test_line_count = 1 to1 &&
+	test_line_count = 1 to2 &&
+	test_line_count = 1 to3
+}
+
+test_expect_success $PREREQ 'to-cover adds To to all mail' '
+	test_cover_addresses "To" --to-cover
+'
+
+test_expect_success $PREREQ 'cc-cover adds Cc to all mail' '
+	test_cover_addresses "Cc" --cc-cover
+'
+
+test_expect_success $PREREQ 'tocover adds To to all mail' '
+	test_config sendemail.tocover true &&
+	test_cover_addresses "To"
+'
+
+test_expect_success $PREREQ 'cccover adds Cc to all mail' '
+	test_config sendemail.cccover true &&
+	test_cover_addresses "Cc"
+'
+
 test_expect_success $PREREQ 'sendemail.aliasfiletype=mailrc' '
 	clean_fake_sendmail &&
 	echo "alias sbd  somebody@example.org" >.mailrc &&
diff --git a/t/t9119-git-svn-info.sh b/t/t9119-git-svn-info.sh
index ff19695..f16f323 100755
--- a/t/t9119-git-svn-info.sh
+++ b/t/t9119-git-svn-info.sh
@@ -74,6 +74,36 @@
 	test_cmp_info expected.info-dot actual.info-dot
 	"
 
+test_expect_success 'info $(pwd)' '
+	(cd svnwc; svn info "$(pwd)") >expected.info-pwd &&
+	(cd gitwc; git svn info "$(pwd)") >actual.info-pwd &&
+	grep -v ^Path: <expected.info-pwd >expected.info-np &&
+	grep -v ^Path: <actual.info-pwd >actual.info-np &&
+	test_cmp_info expected.info-np actual.info-np &&
+	test "$(sed -ne \"/^Path:/ s!/svnwc!!\" <expected.info-pwd)" = \
+	     "$(sed -ne \"/^Path:/ s!/gitwc!!\" <actual.info-pwd)"
+	'
+
+test_expect_success 'info $(pwd)/../___wc' '
+	(cd svnwc; svn info "$(pwd)/../svnwc") >expected.info-pwd &&
+	(cd gitwc; git svn info "$(pwd)/../gitwc") >actual.info-pwd &&
+	grep -v ^Path: <expected.info-pwd >expected.info-np &&
+	grep -v ^Path: <actual.info-pwd >actual.info-np &&
+	test_cmp_info expected.info-np actual.info-np &&
+	test "$(sed -ne \"/^Path:/ s!/svnwc!!\" <expected.info-pwd)" = \
+	     "$(sed -ne \"/^Path:/ s!/gitwc!!\" <actual.info-pwd)"
+	'
+
+test_expect_success 'info $(pwd)/../___wc//file' '
+	(cd svnwc; svn info "$(pwd)/../svnwc//file") >expected.info-pwd &&
+	(cd gitwc; git svn info "$(pwd)/../gitwc//file") >actual.info-pwd &&
+	grep -v ^Path: <expected.info-pwd >expected.info-np &&
+	grep -v ^Path: <actual.info-pwd >actual.info-np &&
+	test_cmp_info expected.info-np actual.info-np &&
+	test "$(sed -ne \"/^Path:/ s!/svnwc!!\" <expected.info-pwd)" = \
+	     "$(sed -ne \"/^Path:/ s!/gitwc!!\" <actual.info-pwd)"
+	'
+
 test_expect_success 'info --url .' '
 	test "$(cd gitwc; git svn info --url .)" = "$quoted_svnrepo"
 	'
diff --git a/t/t9138-git-svn-authors-prog.sh b/t/t9138-git-svn-authors-prog.sh
index 83cc5fc..2937f4c 100755
--- a/t/t9138-git-svn-authors-prog.sh
+++ b/t/t9138-git-svn-authors-prog.sh
@@ -7,40 +7,39 @@
 
 . ./lib-git-svn.sh
 
-cat > svn-authors-prog <<'EOF'
-#!/usr/bin/perl
-$_ = shift;
-if (s/-sub$//)  {
-	print "$_ <$_\@sub.example.com>\n";
-}
-else {
-	print "$_ <$_\@example.com>\n";
-}
+write_script svn-authors-prog "$PERL_PATH" <<-\EOF
+	$_ = shift;
+	if (s/-sub$//)  {
+		print "$_ <$_\@sub.example.com>\n";
+	} else {
+		print "$_ <$_\@example.com>\n";
+	}
 EOF
-chmod +x svn-authors-prog
 
-cat > svn-authors <<'EOF'
-ff = FFFFFFF FFFFFFF <fFf@other.example.com>
-EOF
+test_expect_success 'svn-authors setup' '
+	cat >svn-authors <<-\EOF
+	ff = FFFFFFF FFFFFFF <fFf@other.example.com>
+	EOF
+'
 
 test_expect_success 'setup svnrepo' '
 	for i in aa bb cc-sub dd-sub ee-foo ff
 	do
 		svn mkdir -m $i --username $i "$svnrepo"/$i
 	done
-	'
+'
 
 test_expect_success 'import authors with prog and file' '
 	git svn clone --authors-prog=./svn-authors-prog \
 	    --authors-file=svn-authors "$svnrepo" x
-	'
+'
 
 test_expect_success 'imported 6 revisions successfully' '
 	(
 		cd x
 		test "`git rev-list refs/remotes/git-svn | wc -l`" -eq 6
 	)
-	'
+'
 
 test_expect_success 'authors-prog ran correctly' '
 	(
@@ -56,7 +55,7 @@
 		git rev-list -1 --pretty=raw refs/remotes/git-svn~5 | \
 		  grep "^author aa <aa@example\.com> "
 	)
-	'
+'
 
 test_expect_success 'authors-file overrode authors-prog' '
 	(
@@ -64,7 +63,7 @@
 		git rev-list -1 --pretty=raw refs/remotes/git-svn | \
 		  grep "^author FFFFFFF FFFFFFF <fFf@other\.example\.com> "
 	)
-	'
+'
 
 git --git-dir=x/.git config --unset svn.authorsfile
 git --git-dir=x/.git config --unset svn.authorsprog
diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh
index 27263df..37c2d63 100755
--- a/t/t9300-fast-import.sh
+++ b/t/t9300-fast-import.sh
@@ -347,36 +347,6 @@
 rm -f .git/objects/pack_* .git/objects/index_*
 
 cat >input <<INPUT_END
-commit .badbranchname
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-corrupt
-COMMIT
-
-from refs/heads/master
-
-INPUT_END
-test_expect_success 'B: fail on invalid branch name ".badbranchname"' '
-    test_must_fail git fast-import <input
-'
-rm -f .git/objects/pack_* .git/objects/index_*
-
-cat >input <<INPUT_END
-commit bad[branch]name
-committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
-data <<COMMIT
-corrupt
-COMMIT
-
-from refs/heads/master
-
-INPUT_END
-test_expect_success 'B: fail on invalid branch name "bad[branch]name"' '
-    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
@@ -2336,7 +2306,7 @@
 	test_must_fail git fast-import --cat-blob-fd=-1 </dev/null
 '
 
-test_expect_success NOT_MINGW 'R: print old blob' '
+test_expect_success !MINGW 'R: print old blob' '
 	blob=$(echo "yes it can" | git hash-object -w --stdin) &&
 	cat >expect <<-EOF &&
 	${blob} blob 11
@@ -2348,7 +2318,7 @@
 	test_cmp expect actual
 '
 
-test_expect_success NOT_MINGW 'R: in-stream cat-blob-fd not respected' '
+test_expect_success !MINGW 'R: in-stream cat-blob-fd not respected' '
 	echo hello >greeting &&
 	blob=$(git hash-object -w greeting) &&
 	cat >expect <<-EOF &&
@@ -2369,7 +2339,7 @@
 	test_cmp expect actual.1
 '
 
-test_expect_success NOT_MINGW 'R: print new blob' '
+test_expect_success !MINGW 'R: print new blob' '
 	blob=$(echo "yep yep yep" | git hash-object --stdin) &&
 	cat >expect <<-EOF &&
 	${blob} blob 12
@@ -2387,7 +2357,7 @@
 	test_cmp expect actual
 '
 
-test_expect_success NOT_MINGW 'R: print new blob by sha1' '
+test_expect_success !MINGW 'R: print new blob by sha1' '
 	blob=$(echo "a new blob named by sha1" | git hash-object --stdin) &&
 	cat >expect <<-EOF &&
 	${blob} blob 25
@@ -2687,7 +2657,7 @@
 test_expect_success \
 	'R: verify written objects' \
 	'git --git-dir=R/.git cat-file blob big-file:big1 >actual &&
-	 test_cmp expect 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'
@@ -2866,7 +2836,7 @@
 #
 # notemodify, mark in commit-ish
 #
-test_expect_success 'S: notemodify with garbarge after mark commit-ish must fail' '
+test_expect_success 'S: notemodify with garbage after mark commit-ish must fail' '
 	test_must_fail git fast-import --import-marks=marks <<-EOF 2>err &&
 	commit refs/heads/Snotes
 	committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
@@ -2999,4 +2969,126 @@
 	test_cmp expect actual
 '
 
+test_expect_success 'T: delete branch' '
+	git branch to-delete &&
+	git fast-import <<-EOF &&
+	reset refs/heads/to-delete
+	from 0000000000000000000000000000000000000000
+	EOF
+	test_must_fail git rev-parse --verify refs/heads/to-delete
+'
+
+test_expect_success 'T: empty reset doesnt delete branch' '
+	git branch not-to-delete &&
+	git fast-import <<-EOF &&
+	reset refs/heads/not-to-delete
+	EOF
+	git show-ref &&
+	git rev-parse --verify refs/heads/not-to-delete
+'
+
+###
+### 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' '
+	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' '
+	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' '
+	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' '
+	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' '
+	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 >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' '
+	compare_diff_raw expect actual
+'
+
 test_done
diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh
index 2312dec..66c8b0a 100755
--- a/t/t9350-fast-export.sh
+++ b/t/t9350-fast-export.sh
@@ -504,4 +504,22 @@
 	test_cmp expected actual
 '
 
+test_expect_success 'use refspec' '
+	git fast-export --refspec refs/heads/master:refs/heads/foobar master | \
+		grep "^commit " | sort | uniq > actual &&
+	echo "commit refs/heads/foobar" > expected &&
+	test_cmp expected actual
+'
+
+test_expect_success 'delete refspec' '
+	git branch to-delete &&
+	git fast-export --refspec :refs/heads/to-delete to-delete ^to-delete > actual &&
+	cat > expected <<-EOF &&
+	reset refs/heads/to-delete
+	from 0000000000000000000000000000000000000000
+
+	EOF
+	test_cmp expected actual
+'
+
 test_done
diff --git a/t/t9351-fast-export-anonymize.sh b/t/t9351-fast-export-anonymize.sh
new file mode 100755
index 0000000..897dc50
--- /dev/null
+++ b/t/t9351-fast-export-anonymize.sh
@@ -0,0 +1,112 @@
+#!/bin/sh
+
+test_description='basic tests for fast-export --anonymize'
+. ./test-lib.sh
+
+test_expect_success 'setup simple repo' '
+	test_commit base &&
+	test_commit foo &&
+	git checkout -b other HEAD^ &&
+	mkdir subdir &&
+	test_commit subdir/bar &&
+	test_commit subdir/xyzzy &&
+	git tag -m "annotated tag" mytag
+'
+
+test_expect_success 'export anonymized stream' '
+	git fast-export --anonymize --all >stream
+'
+
+# this also covers commit messages
+test_expect_success 'stream omits path names' '
+	! grep base stream &&
+	! grep foo stream &&
+	! grep subdir stream &&
+	! grep bar stream &&
+	! grep xyzzy stream
+'
+
+test_expect_success 'stream allows master as refname' '
+	grep master stream
+'
+
+test_expect_success 'stream omits other refnames' '
+	! grep other stream &&
+	! grep mytag stream
+'
+
+test_expect_success 'stream omits identities' '
+	! grep "$GIT_COMMITTER_NAME" stream &&
+	! grep "$GIT_COMMITTER_EMAIL" stream &&
+	! grep "$GIT_AUTHOR_NAME" stream &&
+	! grep "$GIT_AUTHOR_EMAIL" stream
+'
+
+test_expect_success 'stream omits tag message' '
+	! grep "annotated tag" stream
+'
+
+# NOTE: we chdir to the new, anonymized repository
+# after this. All further tests should assume this.
+test_expect_success 'import stream to new repository' '
+	git init new &&
+	cd new &&
+	git fast-import <../stream
+'
+
+test_expect_success 'result has two branches' '
+	git for-each-ref --format="%(refname)" refs/heads >branches &&
+	test_line_count = 2 branches &&
+	other_branch=$(grep -v refs/heads/master branches)
+'
+
+test_expect_success 'repo has original shape and timestamps' '
+	shape () {
+		git log --format="%m %ct" --left-right --boundary "$@"
+	} &&
+	(cd .. && shape master...other) >expect &&
+	shape master...$other_branch >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'root tree has original shape' '
+	# the output entries are not necessarily in the same
+	# order, but we know at least that we will have one tree
+	# and one blob, so just check the sorted order
+	cat >expect <<-\EOF &&
+	blob
+	tree
+	EOF
+	git ls-tree $other_branch >root &&
+	cut -d" " -f2 <root | sort >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'paths in subdir ended up in one tree' '
+	cat >expect <<-\EOF &&
+	blob
+	blob
+	EOF
+	tree=$(grep tree root | cut -f2) &&
+	git ls-tree $other_branch:$tree >tree &&
+	cut -d" " -f2 <tree >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'tag points to branch tip' '
+	git rev-parse $other_branch >expect &&
+	git for-each-ref --format="%(*objectname)" | grep . >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'idents are shared' '
+	git log --all --format="%an <%ae>" >authors &&
+	sort -u authors >unique &&
+	test_line_count = 1 unique &&
+	git log --all --format="%cn <%ce>" >committers &&
+	sort -u committers >unique &&
+	test_line_count = 1 unique &&
+	! test_cmp authors committers
+'
+
+test_done
diff --git a/t/t9800-git-p4-basic.sh b/t/t9800-git-p4-basic.sh
index 665607c..5b56212 100755
--- a/t/t9800-git-p4-basic.sh
+++ b/t/t9800-git-p4-basic.sh
@@ -145,7 +145,7 @@
 		test_expect_code 1 git p4 clone --dest="$git" //depot >errs 2>&1
 	) &&
 	cat errs &&
-	! test_i18ngrep Traceback errs
+	test_i18ngrep ! Traceback errs
 '
 
 # Hide a file from p4d, make sure we catch its complaint.  This won't fail in
diff --git a/t/t9807-git-p4-submit.sh b/t/t9807-git-p4-submit.sh
index 4caf36e..1f74a88 100755
--- a/t/t9807-git-p4-submit.sh
+++ b/t/t9807-git-p4-submit.sh
@@ -403,7 +403,8 @@
 		git commit -m "prep only add" &&
 		git p4 submit --prepare-p4-only >out &&
 		test_i18ngrep "prepared for submission" out &&
-		test_i18ngrep "must be deleted" out
+		test_i18ngrep "must be deleted" out &&
+		test_i18ngrep ! "everything below this line is just the diff" out
 	) &&
 	(
 		cd "$cli" &&
diff --git a/t/t9809-git-p4-client-view.sh b/t/t9809-git-p4-client-view.sh
index 23a827f..897b3c3 100755
--- a/t/t9809-git-p4-client-view.sh
+++ b/t/t9809-git-p4-client-view.sh
@@ -365,7 +365,7 @@
 	(
 		cd "$git" &&
 		echo git-wild-hash >dir1/git-wild#hash &&
-		if test_have_prereq NOT_MINGW NOT_CYGWIN
+		if test_have_prereq !MINGW,!CYGWIN
 		then
 			echo git-wild-star >dir1/git-wild\*star
 		fi &&
@@ -379,7 +379,7 @@
 	(
 		cd "$cli" &&
 		test_path_is_file dir1/git-wild#hash &&
-		if test_have_prereq NOT_MINGW NOT_CYGWIN
+		if test_have_prereq !MINGW,!CYGWIN
 		then
 			test_path_is_file dir1/git-wild\*star
 		fi &&
diff --git a/t/t9812-git-p4-wildcards.sh b/t/t9812-git-p4-wildcards.sh
index c7472cb..0206771 100755
--- a/t/t9812-git-p4-wildcards.sh
+++ b/t/t9812-git-p4-wildcards.sh
@@ -14,7 +14,7 @@
 		printf "file2\nhas\nsome\nrandom\ntext\n" >file2 &&
 		p4 add file2 &&
 		echo file-wild-hash >file-wild#hash &&
-		if test_have_prereq NOT_MINGW NOT_CYGWIN
+		if test_have_prereq !MINGW,!CYGWIN
 		then
 			echo file-wild-star >file-wild\*star
 		fi &&
@@ -31,7 +31,7 @@
 	(
 		cd "$git" &&
 		test -f file-wild#hash &&
-		if test_have_prereq NOT_MINGW NOT_CYGWIN
+		if test_have_prereq !MINGW,!CYGWIN
 		then
 			test -f file-wild\*star
 		fi &&
@@ -46,7 +46,7 @@
 	(
 		cd "$git" &&
 		echo git-wild-hash >git-wild#hash &&
-		if test_have_prereq NOT_MINGW NOT_CYGWIN
+		if test_have_prereq !MINGW,!CYGWIN
 		then
 			echo git-wild-star >git-wild\*star
 		fi &&
@@ -60,7 +60,7 @@
 	(
 		cd "$cli" &&
 		test_path_is_file git-wild#hash &&
-		if test_have_prereq NOT_MINGW NOT_CYGWIN
+		if test_have_prereq !MINGW,!CYGWIN
 		then
 			test_path_is_file git-wild\*star
 		fi &&
@@ -75,7 +75,7 @@
 	(
 		cd "$git" &&
 		echo new-line >>git-wild#hash &&
-		if test_have_prereq NOT_MINGW NOT_CYGWIN
+		if test_have_prereq !MINGW,!CYGWIN
 		then
 			echo new-line >>git-wild\*star
 		fi &&
@@ -89,7 +89,7 @@
 	(
 		cd "$cli" &&
 		test_line_count = 2 git-wild#hash &&
-		if test_have_prereq NOT_MINGW NOT_CYGWIN
+		if test_have_prereq !MINGW,!CYGWIN
 		then
 			test_line_count = 2 git-wild\*star
 		fi &&
@@ -152,7 +152,7 @@
 	(
 		cd "$cli" &&
 		test_path_is_missing git-wild#hash &&
-		if test_have_prereq NOT_MINGW NOT_CYGWIN
+		if test_have_prereq !MINGW,!CYGWIN
 		then
 			test_path_is_missing git-wild\*star
 		fi &&
diff --git a/t/t9814-git-p4-rename.sh b/t/t9814-git-p4-rename.sh
index be802e0..95f4421 100755
--- a/t/t9814-git-p4-rename.sh
+++ b/t/t9814-git-p4-rename.sh
@@ -177,7 +177,10 @@
 		level=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f1 | cut -d" " -f5 | sed "s/C0*//") &&
 		test -n "$level" && test "$level" -gt 0 && test "$level" -lt 98 &&
 		src=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f2) &&
-		test "$src" = file10 -o "$src" = file11 &&
+		case "$src" in
+		file10 | file11) : ;; # happy
+		*) false ;; # not
+		&&
 		git config git-p4.detectCopies $(($level + 2)) &&
 		git p4 submit &&
 		p4 filelog //depot/file12 &&
@@ -191,7 +194,10 @@
 		level=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f1 | cut -d" " -f5 | sed "s/C0*//") &&
 		test -n "$level" && test "$level" -gt 2 && test "$level" -lt 100 &&
 		src=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f2) &&
-		test "$src" = file10 -o "$src" = file11 -o "$src" = file12 &&
+		case "$src" in
+		file10 | file11 | file12) : ;; # happy
+		*) false ;; # not
+		&&
 		git config git-p4.detectCopies $(($level - 2)) &&
 		git p4 submit &&
 		p4 filelog //depot/file13 &&
diff --git a/t/t9815-git-p4-submit-fail.sh b/t/t9815-git-p4-submit-fail.sh
index 1243d96..4cff6a7 100755
--- a/t/t9815-git-p4-submit-fail.sh
+++ b/t/t9815-git-p4-submit-fail.sh
@@ -417,7 +417,7 @@
 		! p4 fstat -T action text &&
 		test_path_is_file text+x &&
 		! p4 fstat -T action text+x &&
-		if test_have_prereq NOT_CYGWIN
+		if test_have_prereq !CYGWIN
 		then
 			stat --format=%A text | egrep ^-r-- &&
 			stat --format=%A text+x | egrep ^-r-x
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 2d4beb5..f10a752 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -212,9 +212,18 @@
 	)
 '
 
+function pwd_P_W () {
+	if test_have_prereq MINGW
+	then
+		pwd -W
+	else
+		pwd -P
+	fi
+}
+
 test_expect_success '__gitdir - gitfile in cwd' '
-	echo "$(pwd -P)/otherrepo/.git" >expected &&
-	echo "gitdir: $TRASH_DIRECTORY/otherrepo/.git" >subdir/.git &&
+	echo "$(pwd_P_W)/otherrepo/.git" >expected &&
+	echo "gitdir: $(pwd_P_W)/otherrepo/.git" >subdir/.git &&
 	test_when_finished "rm -f subdir/.git" &&
 	(
 		cd subdir &&
@@ -224,8 +233,8 @@
 '
 
 test_expect_success '__gitdir - gitfile in parent' '
-	echo "$(pwd -P)/otherrepo/.git" >expected &&
-	echo "gitdir: $TRASH_DIRECTORY/otherrepo/.git" >subdir/.git &&
+	echo "$(pwd_P_W)/otherrepo/.git" >expected &&
+	echo "gitdir: $(pwd_P_W)/otherrepo/.git" >subdir/.git &&
 	test_when_finished "rm -f subdir/.git" &&
 	(
 		cd subdir/subsubdir &&
@@ -550,6 +559,33 @@
 	test_completion "git add mom" "momified"
 '
 
+test_expect_success "completion uses <cmd> completion for alias: !sh -c 'git <cmd> ...'" '
+	test_config alias.co "!sh -c '"'"'git checkout ...'"'"'" &&
+	test_completion "git co m" <<-\EOF
+	master Z
+	mybranch Z
+	mytag Z
+	EOF
+'
+
+test_expect_success 'completion uses <cmd> completion for alias: !f () { VAR=val git <cmd> ... }' '
+	test_config alias.co "!f () { VAR=val git checkout ... ; } f" &&
+	test_completion "git co m" <<-\EOF
+	master Z
+	mybranch Z
+	mytag Z
+	EOF
+'
+
+test_expect_success 'completion used <cmd> completion for alias: !f() { : git <cmd> ; ... }' '
+	test_config alias.co "!f() { : git checkout ; if ... } f" &&
+	test_completion "git co m" <<-\EOF
+	master Z
+	mybranch Z
+	mytag Z
+	EOF
+'
+
 test_expect_failure 'complete with tilde expansion' '
 	git init tmp && cd tmp &&
 	test_when_finished "cd .. && rm -rf tmp" &&
diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index cf7b41f..0d93e33 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -413,7 +413,7 @@
 		# test_run_, but keep its stdout on our stdout even in
 		# non-verbose mode.
 		"$@" 2>&4
-		if [ "$?" = 0 ]
+		if test "$?" = 0
 		then
 			if test $test_external_has_tap -eq 0; then
 				test_ok_ "$descr"
@@ -440,11 +440,12 @@
 	tmp=${TMPDIR:-/tmp}
 	stderr="$tmp/git-external-stderr.$$.tmp"
 	test_external "$@" 4> "$stderr"
-	[ -f "$stderr" ] || error "Internal error: $stderr disappeared."
+	test -f "$stderr" || error "Internal error: $stderr disappeared."
 	descr="no stderr: $1"
 	shift
 	say >&3 "# expecting no stderr from previous command"
-	if [ ! -s "$stderr" ]; then
+	if test ! -s "$stderr"
+	then
 		rm "$stderr"
 
 		if test $test_external_has_tap -eq 0; then
@@ -454,8 +455,9 @@
 			test_success=$(($test_success + 1))
 		fi
 	else
-		if [ "$verbose" = t ]; then
-			output=`echo; echo "# Stderr is:"; cat "$stderr"`
+		if test "$verbose" = t
+		then
+			output=$(echo; echo "# Stderr is:"; cat "$stderr")
 		else
 			output=
 		fi
@@ -474,7 +476,7 @@
 # The commands test the existence or non-existence of $1. $2 can be
 # given to provide a more precise diagnosis.
 test_path_is_file () {
-	if ! [ -f "$1" ]
+	if ! test -f "$1"
 	then
 		echo "File $1 doesn't exist. $*"
 		false
@@ -482,19 +484,31 @@
 }
 
 test_path_is_dir () {
-	if ! [ -d "$1" ]
+	if ! test -d "$1"
 	then
 		echo "Directory $1 doesn't exist. $*"
 		false
 	fi
 }
 
+# Check if the directory exists and is empty as expected, barf otherwise.
+test_dir_is_empty () {
+	test_path_is_dir "$1" &&
+	if test -n "$(ls -a1 "$1" | egrep -v '^\.\.?$')"
+	then
+		echo "Directory '$1' is not empty, it contains:"
+		ls -la "$1"
+		return 1
+	fi
+}
+
 test_path_is_missing () {
-	if [ -e "$1" ]
+	if test -e "$1"
 	then
 		echo "Path exists:"
 		ls -ld "$1"
-		if [ $# -ge 1 ]; then
+		if test $# -ge 1
+		then
 			echo "$*"
 		fi
 		false
@@ -542,7 +556,7 @@
 	if test $exit_code = 0; then
 		echo >&2 "test_must_fail: command succeeded: $*"
 		return 1
-	elif test $exit_code -gt 129 -a $exit_code -le 192; then
+	elif test $exit_code -gt 129 && test $exit_code -le 192; then
 		echo >&2 "test_must_fail: died by signal: $*"
 		return 1
 	elif test $exit_code = 127; then
@@ -569,7 +583,7 @@
 test_might_fail () {
 	"$@"
 	exit_code=$?
-	if test $exit_code -gt 129 -a $exit_code -le 192; then
+	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
@@ -623,6 +637,15 @@
 	cmp "$@"
 }
 
+# Call any command "$@" but be more verbose about its
+# failure. This is handy for commands like "test" which do
+# not output anything when they fail.
+verbose () {
+	"$@" && return 0
+	echo >&2 "command failed: $(git rev-parse --sq-quote "$@")"
+	return 1
+}
+
 # Check if the file expected to be empty is indeed empty, and barfs
 # otherwise.
 
@@ -646,9 +669,12 @@
 # similar to GNU seq(1), but the latter might not be available
 # everywhere (and does not do letters).  It may be used like:
 #
-#	for i in `test_seq 100`; do
-#		for j in `test_seq 10 20`; do
-#			for k in `test_seq a z`; do
+#	for i in $(test_seq 100)
+#	do
+#		for j in $(test_seq 10 20)
+#		do
+#			for k in $(test_seq a z)
+#			do
 #				echo $i-$j-$k
 #			done
 #		done
@@ -723,6 +749,11 @@
 	fi
 }
 
+# This function writes out its parameters, one per line
+test_write_lines () {
+	printf "%s\n" "$@"
+}
+
 perl () {
 	command "$PERL_PATH" "$@"
 }
diff --git a/t/test-lib.sh b/t/test-lib.sh
index c081668..cf19339 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -91,6 +91,7 @@
 		VALGRIND
 		UNZIP
 		PERF_
+		CURL_VERBOSE
 	));
 	my @vars = grep(/^GIT_/ && !/^GIT_($ok)/o, @env);
 	print join("\n", @vars);
@@ -108,6 +109,10 @@
 export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
 export EDITOR
 
+# Tests using GIT_TRACE typically don't want <timestamp> <file>:<line> output
+GIT_TRACE_BARE=1
+export GIT_TRACE_BARE
+
 if test -n "${TEST_GIT_INDEX_VERSION:+isset}"
 then
 	GIT_INDEX_VERSION="$TEST_GIT_INDEX_VERSION"
@@ -191,6 +196,14 @@
 		immediate=t; shift ;;
 	-l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests)
 		GIT_TEST_LONG=t; export GIT_TEST_LONG; shift ;;
+	-r)
+		shift; test "$#" -ne 0 || {
+			echo 'error: -r requires an argument' >&2;
+			exit 1;
+		}
+		run_list=$1; shift ;;
+	--run=*)
+		run_list=$(expr "z$1" : 'z[^=]*=\(.*\)'); shift ;;
 	-h|--h|--he|--hel|--help)
 		help=t; shift ;;
 	-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
@@ -220,6 +233,10 @@
 	--root=*)
 		root=$(expr "z$1" : 'z[^=]*=\(.*\)')
 		shift ;;
+	-x)
+		trace=t
+		verbose=t
+		shift ;;
 	*)
 		echo "error: unknown test option '$1'" >&2; exit 1 ;;
 	esac
@@ -366,6 +383,99 @@
 	return 1
 }
 
+match_test_selector_list () {
+	title="$1"
+	shift
+	arg="$1"
+	shift
+	test -z "$1" && return 0
+
+	# Both commas and whitespace are accepted as separators.
+	OLDIFS=$IFS
+	IFS=' 	,'
+	set -- $1
+	IFS=$OLDIFS
+
+	# If the first selector is negative we include by default.
+	include=
+	case "$1" in
+		!*) include=t ;;
+	esac
+
+	for selector
+	do
+		orig_selector=$selector
+
+		positive=t
+		case "$selector" in
+			!*)
+				positive=
+				selector=${selector##?}
+				;;
+		esac
+
+		test -z "$selector" && continue
+
+		case "$selector" in
+			*-*)
+				if expr "z${selector%%-*}" : "z[0-9]*[^0-9]" >/dev/null
+				then
+					echo "error: $title: invalid non-numeric in range" \
+						"start: '$orig_selector'" >&2
+					exit 1
+				fi
+				if expr "z${selector#*-}" : "z[0-9]*[^0-9]" >/dev/null
+				then
+					echo "error: $title: invalid non-numeric in range" \
+						"end: '$orig_selector'" >&2
+					exit 1
+				fi
+				;;
+			*)
+				if expr "z$selector" : "z[0-9]*[^0-9]" >/dev/null
+				then
+					echo "error: $title: invalid non-numeric in test" \
+						"selector: '$orig_selector'" >&2
+					exit 1
+				fi
+		esac
+
+		# Short cut for "obvious" cases
+		test -z "$include" && test -z "$positive" && continue
+		test -n "$include" && test -n "$positive" && continue
+
+		case "$selector" in
+			-*)
+				if test $arg -le ${selector#-}
+				then
+					include=$positive
+				fi
+				;;
+			*-)
+				if test $arg -ge ${selector%-}
+				then
+					include=$positive
+				fi
+				;;
+			*-*)
+				if test ${selector%%-*} -le $arg \
+					&& test $arg -le ${selector#*-}
+				then
+					include=$positive
+				fi
+				;;
+			*)
+				if test $arg -eq $selector
+				then
+					include=$positive
+				fi
+				;;
+		esac
+	done
+
+	test -n "$include"
+}
+
 maybe_teardown_verbose () {
 	test -z "$verbose_only" && return
 	exec 4>/dev/null 3>/dev/null
@@ -411,10 +521,39 @@
 	fi
 }
 
+# This is a separate function because some tests use
+# "return" to end a test_expect_success block early
+# (and we want to make sure we run any cleanup like
+# "set +x").
+test_eval_inner_ () {
+	# Do not add anything extra (including LF) after '$*'
+	eval "
+		test \"$trace\" = t && set -x
+		$*"
+}
+
 test_eval_ () {
-	# This is a separate function because some tests use
-	# "return" to end a test_expect_success block early.
-	eval </dev/null >&3 2>&4 "$*"
+	# We run this block with stderr redirected to avoid extra cruft
+	# during a "-x" trace. Once in "set -x" mode, we cannot prevent
+	# the shell from printing the "set +x" to turn it off (nor the saving
+	# of $? before that). But we can make sure that the output goes to
+	# /dev/null.
+	#
+	# The test itself is run with stderr put back to &4 (so either to
+	# /dev/null, or to the original stderr if --verbose was used).
+	{
+		test_eval_inner_ "$@" </dev/null >&3 2>&4
+		test_eval_ret_=$?
+		if test "$trace" = t
+		then
+			set +x
+			if test "$test_eval_ret_" != 0
+			then
+				say_color error >&4 "error: last command exited with \$?=$test_eval_ret_"
+			fi
+		fi
+	} 2>/dev/null
+	return $test_eval_ret_
 }
 
 test_run_ () {
@@ -425,7 +564,8 @@
 	eval_ret=$?
 	teardown_malloc_check
 
-	if test -z "$immediate" || test $eval_ret = 0 || test -n "$expecting_failure"
+	if test -z "$immediate" || test $eval_ret = 0 ||
+	   test -n "$expecting_failure" && test "$test_cleanup" != ":"
 	then
 		setup_malloc_check
 		test_eval_ "$test_cleanup"
@@ -452,25 +592,35 @@
 
 test_skip () {
 	to_skip=
+	skipped_reason=
 	if match_pattern_list $this_test.$test_count $GIT_SKIP_TESTS
 	then
 		to_skip=t
+		skipped_reason="GIT_SKIP_TESTS"
 	fi
 	if test -z "$to_skip" && test -n "$test_prereq" &&
 	   ! test_have_prereq "$test_prereq"
 	then
 		to_skip=t
-	fi
-	case "$to_skip" in
-	t)
+
 		of_prereq=
 		if test "$missing_prereq" != "$test_prereq"
 		then
 			of_prereq=" of $test_prereq"
 		fi
+		skipped_reason="missing $missing_prereq${of_prereq}"
+	fi
+	if test -z "$to_skip" && test -n "$run_list" &&
+		! match_test_selector_list '--run' $test_count "$run_list"
+	then
+		to_skip=t
+		skipped_reason="--run"
+	fi
 
+	case "$to_skip" in
+	t)
 		say_color skip >&3 "skipping test: $@"
-		say_color skip "ok $test_count # skip $1 (missing $missing_prereq${of_prereq})"
+		say_color skip "ok $test_count # skip $1 ($skipped_reason)"
 		: true
 		;;
 	*)
@@ -697,7 +847,8 @@
 }
 
 HOME="$TRASH_DIRECTORY"
-export HOME
+GNUPGHOME="$HOME/gnupg-home-not-used"
+export HOME GNUPGHOME
 
 if test -z "$TEST_NO_CREATE_REPO"
 then
@@ -754,7 +905,7 @@
 	# backslashes in pathspec are converted to '/'
 	# exec does not inherit the PID
 	test_set_prereq MINGW
-	test_set_prereq NOT_CYGWIN
+	test_set_prereq NATIVE_CRLF
 	test_set_prereq SED_STRIPS_CR
 	test_set_prereq GREP_STRIPS_CR
 	GIT_TEST_CMP=mingw_test_cmp
@@ -762,7 +913,6 @@
 *CYGWIN*)
 	test_set_prereq POSIXPERM
 	test_set_prereq EXECKEEPSPID
-	test_set_prereq NOT_MINGW
 	test_set_prereq CYGWIN
 	test_set_prereq SED_STRIPS_CR
 	test_set_prereq GREP_STRIPS_CR
@@ -771,8 +921,6 @@
 	test_set_prereq POSIXPERM
 	test_set_prereq BSLASHPSPEC
 	test_set_prereq EXECKEEPSPID
-	test_set_prereq NOT_MINGW
-	test_set_prereq NOT_CYGWIN
 	;;
 esac
 
@@ -864,6 +1012,14 @@
 	git var GIT_AUTHOR_IDENT
 '
 
+test_lazy_prereq EXPENSIVE '
+	test -n "$GIT_TEST_LONG"
+'
+
+test_lazy_prereq USR_BIN_TIME '
+	test -x /usr/bin/time
+'
+
 # When the tests are run as root, permission tests will report that
 # things are writable when they shouldn't be.
 test -w / || test_set_prereq SANITY
diff --git a/tag.c b/tag.c
index 82d841b..5b0ac62 100644
--- a/tag.c
+++ b/tag.c
@@ -4,9 +4,6 @@
 #include "tree.h"
 #include "blob.h"
 
-#define PGP_SIGNATURE "-----BEGIN PGP SIGNATURE-----"
-#define PGP_MESSAGE "-----BEGIN PGP MESSAGE-----"
-
 const char *tag_type = "tag";
 
 struct object *deref_tag(struct object *o, const char *warn, int warnlen)
@@ -143,20 +140,3 @@
 	free(data);
 	return ret;
 }
-
-/*
- * Look at a signed tag object, and return the offset where
- * the embedded detached signature begins, or the end of the
- * data when there is no such signature.
- */
-size_t parse_signature(const char *buf, unsigned long size)
-{
-	char *eol;
-	size_t len = 0;
-	while (len < size && !starts_with(buf + len, PGP_SIGNATURE) &&
-			!starts_with(buf + len, PGP_MESSAGE)) {
-		eol = memchr(buf + len, '\n', size - len);
-		len += eol ? eol - (buf + len) + 1 : size - len;
-	}
-	return len;
-}
diff --git a/tag.h b/tag.h
index bc8a1e4..f4580ae 100644
--- a/tag.h
+++ b/tag.h
@@ -17,6 +17,5 @@
 extern int parse_tag(struct tag *item);
 extern struct object *deref_tag(struct object *, const char *, int);
 extern struct object *deref_tag_noverify(struct object *);
-extern size_t parse_signature(const char *buf, unsigned long size);
 
 #endif /* TAG_H */
diff --git a/templates/hooks--pre-push.sample b/templates/hooks--pre-push.sample
index 1f3bceb..69e3c67 100755
--- a/templates/hooks--pre-push.sample
+++ b/templates/hooks--pre-push.sample
@@ -45,7 +45,7 @@
 		commit=`git rev-list -n 1 --grep '^WIP' "$range"`
 		if [ -n "$commit" ]
 		then
-			echo "Found WIP commit in $local_ref, not pushing"
+			echo >&2 "Found WIP commit in $local_ref, not pushing"
 			exit 1
 		fi
 	fi
diff --git a/test-config.c b/test-config.c
new file mode 100644
index 0000000..6a77552
--- /dev/null
+++ b/test-config.c
@@ -0,0 +1,152 @@
+#include "cache.h"
+#include "string-list.h"
+
+/*
+ * This program exposes the C API of the configuration mechanism
+ * as a set of simple commands in order to facilitate testing.
+ *
+ * Reads stdin and prints result of command to stdout:
+ *
+ * get_value -> prints the value with highest priority for the entered key
+ *
+ * get_value_multi -> prints all values for the entered key in increasing order
+ *		     of priority
+ *
+ * get_int -> print integer value for the entered key or die
+ *
+ * get_bool -> print bool value for the entered key or die
+ *
+ * get_string -> print string value for the entered key or die
+ *
+ * configset_get_value -> returns value with the highest priority for the entered key
+ * 			from a config_set constructed from files entered as arguments.
+ *
+ * configset_get_value_multi -> returns value_list for the entered key sorted in
+ * 				ascending order of priority from a config_set
+ * 				constructed from files entered as arguments.
+ *
+ * Examples:
+ *
+ * To print the value with highest priority for key "foo.bAr Baz.rock":
+ * 	test-config get_value "foo.bAr Baz.rock"
+ *
+ */
+
+
+int main(int argc, char **argv)
+{
+	int i, val;
+	const char *v;
+	const struct string_list *strptr;
+	struct config_set cs;
+	git_configset_init(&cs);
+
+	if (argc < 2) {
+		fprintf(stderr, "Please, provide a command name on the command-line\n");
+		goto exit1;
+	} else if (argc == 3 && !strcmp(argv[1], "get_value")) {
+		if (!git_config_get_value(argv[2], &v)) {
+			if (!v)
+				printf("(NULL)\n");
+			else
+				printf("%s\n", v);
+			goto exit0;
+		} else {
+			printf("Value not found for \"%s\"\n", argv[2]);
+			goto exit1;
+		}
+	} else if (argc == 3 && !strcmp(argv[1], "get_value_multi")) {
+		strptr = git_config_get_value_multi(argv[2]);
+		if (strptr) {
+			for (i = 0; i < strptr->nr; i++) {
+				v = strptr->items[i].string;
+				if (!v)
+					printf("(NULL)\n");
+				else
+					printf("%s\n", v);
+			}
+			goto exit0;
+		} else {
+			printf("Value not found for \"%s\"\n", argv[2]);
+			goto exit1;
+		}
+	} else if (argc == 3 && !strcmp(argv[1], "get_int")) {
+		if (!git_config_get_int(argv[2], &val)) {
+			printf("%d\n", val);
+			goto exit0;
+		} else {
+			printf("Value not found for \"%s\"\n", argv[2]);
+			goto exit1;
+		}
+	} else if (argc == 3 && !strcmp(argv[1], "get_bool")) {
+		if (!git_config_get_bool(argv[2], &val)) {
+			printf("%d\n", val);
+			goto exit0;
+		} else {
+			printf("Value not found for \"%s\"\n", argv[2]);
+			goto exit1;
+		}
+	} else if (argc == 3 && !strcmp(argv[1], "get_string")) {
+		if (!git_config_get_string_const(argv[2], &v)) {
+			printf("%s\n", v);
+			goto exit0;
+		} else {
+			printf("Value not found for \"%s\"\n", argv[2]);
+			goto exit1;
+		}
+	} else if (!strcmp(argv[1], "configset_get_value")) {
+		for (i = 3; i < argc; i++) {
+			int err;
+			if ((err = git_configset_add_file(&cs, argv[i]))) {
+				fprintf(stderr, "Error (%d) reading configuration file %s.\n", err, argv[i]);
+				goto exit2;
+			}
+		}
+		if (!git_configset_get_value(&cs, argv[2], &v)) {
+			if (!v)
+				printf("(NULL)\n");
+			else
+				printf("%s\n", v);
+			goto exit0;
+		} else {
+			printf("Value not found for \"%s\"\n", argv[2]);
+			goto exit1;
+		}
+	} else if (!strcmp(argv[1], "configset_get_value_multi")) {
+		for (i = 3; i < argc; i++) {
+			int err;
+			if ((err = git_configset_add_file(&cs, argv[i]))) {
+				fprintf(stderr, "Error (%d) reading configuration file %s.\n", err, argv[i]);
+				goto exit2;
+			}
+		}
+		strptr = git_configset_get_value_multi(&cs, argv[2]);
+		if (strptr) {
+			for (i = 0; i < strptr->nr; i++) {
+				v = strptr->items[i].string;
+				if (!v)
+					printf("(NULL)\n");
+				else
+					printf("%s\n", v);
+			}
+			goto exit0;
+		} else {
+			printf("Value not found for \"%s\"\n", argv[2]);
+			goto exit1;
+		}
+	}
+
+	die("%s: Please check the syntax and the function name", argv[0]);
+
+exit0:
+	git_configset_clear(&cs);
+	return 0;
+
+exit1:
+	git_configset_clear(&cs);
+	return 1;
+
+exit2:
+	git_configset_clear(&cs);
+	return 2;
+}
diff --git a/test-date.c b/test-date.c
index 10afaab..94a6997 100644
--- a/test-date.c
+++ b/test-date.c
@@ -19,19 +19,21 @@
 
 static void parse_dates(char **argv, struct timeval *now)
 {
+	struct strbuf result = STRBUF_INIT;
+
 	for (; *argv; argv++) {
-		char result[100];
 		unsigned long t;
 		int tz;
 
-		result[0] = 0;
-		parse_date(*argv, result, sizeof(result));
-		if (sscanf(result, "%lu %d", &t, &tz) == 2)
+		strbuf_reset(&result);
+		parse_date(*argv, &result);
+		if (sscanf(result.buf, "%lu %d", &t, &tz) == 2)
 			printf("%s -> %s\n",
 			       *argv, show_date(t, tz, DATE_ISO8601));
 		else
 			printf("%s -> bad\n", *argv);
 	}
+	strbuf_release(&result);
 }
 
 static void parse_approxidate(char **argv, struct timeval *now)
diff --git a/test-dump-cache-tree.c b/test-dump-cache-tree.c
index 47eab97..54c0872 100644
--- a/test-dump-cache-tree.c
+++ b/test-dump-cache-tree.c
@@ -26,16 +26,16 @@
 		return 0;
 
 	if (it->entry_count < 0) {
+		/* invalid */
 		dump_one(it, pfx, "");
 		dump_one(ref, pfx, "#(ref) ");
-		if (it->subtree_nr != ref->subtree_nr)
-			errs = 1;
 	}
 	else {
 		dump_one(it, pfx, "");
 		if (hashcmp(it->sha1, ref->sha1) ||
 		    ref->entry_count != it->entry_count ||
 		    ref->subtree_nr != it->subtree_nr) {
+			/* claims to be valid but is lying */
 			dump_one(ref, pfx, "#(ref) ");
 			errs = 1;
 		}
@@ -56,11 +56,12 @@
 
 int main(int ac, char **av)
 {
+	struct index_state istate;
 	struct cache_tree *another = cache_tree();
 	if (read_cache() < 0)
 		die("unable to read index file");
-	cache_tree_update(another,
-			  (const struct cache_entry * const *)active_cache,
-			  active_nr, WRITE_TREE_DRY_RUN);
+	istate = the_index;
+	istate.cache_tree = another;
+	cache_tree_update(&istate, WRITE_TREE_DRY_RUN);
 	return dump_cache_tree(active_cache_tree, another, "");
 }
diff --git a/test-dump-split-index.c b/test-dump-split-index.c
new file mode 100644
index 0000000..9cf3112
--- /dev/null
+++ b/test-dump-split-index.c
@@ -0,0 +1,34 @@
+#include "cache.h"
+#include "split-index.h"
+#include "ewah/ewok.h"
+
+static void show_bit(size_t pos, void *data)
+{
+	printf(" %d", (int)pos);
+}
+
+int main(int ac, char **av)
+{
+	struct split_index *si;
+	int i;
+
+	do_read_index(&the_index, av[1], 1);
+	printf("own %s\n", sha1_to_hex(the_index.sha1));
+	si = the_index.split_index;
+	if (!si) {
+		printf("not a split index\n");
+		return 0;
+	}
+	printf("base %s\n", sha1_to_hex(si->base_sha1));
+	for (i = 0; i < the_index.cache_nr; i++) {
+		struct cache_entry *ce = the_index.cache[i];
+		printf("%06o %s %d\t%s\n", ce->ce_mode,
+		       sha1_to_hex(ce->sha1), ce_stage(ce), ce->name);
+	}
+	printf("replacements:");
+	ewah_each_bit(si->replace_bitmap, show_bit, NULL);
+	printf("\ndeletions:");
+	ewah_each_bit(si->delete_bitmap, show_bit, NULL);
+	printf("\n");
+	return 0;
+}
diff --git a/test-hashmap.c b/test-hashmap.c
index f5183fb..07aa7ec 100644
--- a/test-hashmap.c
+++ b/test-hashmap.c
@@ -115,9 +115,8 @@
 
 		for (j = 0; j < rounds; j++) {
 			for (i = 0; i < TEST_SIZE; i++) {
-				struct hashmap_entry key;
-				hashmap_entry_init(&key, hashes[i]);
-				hashmap_get(&map, &key, entries[i]->key);
+				hashmap_get_from_hash(&map, hashes[i],
+						      entries[i]->key);
 			}
 		}
 
@@ -199,12 +198,8 @@
 
 		} else if (!strcmp("get", cmd) && l1) {
 
-			/* setup static key */
-			struct hashmap_entry key;
-			hashmap_entry_init(&key, hash);
-
 			/* lookup entry in hashmap */
-			entry = hashmap_get(&map, &key, p1);
+			entry = hashmap_get_from_hash(&map, hash, p1);
 
 			/* print result */
 			if (!entry)
@@ -239,6 +234,20 @@
 			/* print table sizes */
 			printf("%u %u\n", map.tablesize, map.size);
 
+		} else if (!strcmp("intern", cmd) && l1) {
+
+			/* test that strintern works */
+			const char *i1 = strintern(p1);
+			const char *i2 = strintern(p1);
+			if (strcmp(i1, p1))
+				printf("strintern(%s) returns %s\n", p1, i1);
+			else if (i1 == p1)
+				printf("strintern(%s) returns input pointer\n", p1);
+			else if (i1 != i2)
+				printf("strintern(%s) != strintern(%s)", i1, i2);
+			else
+				printf("%s\n", i1);
+
 		} else if (!strcmp("perfhashmap", cmd) && l1 && l2) {
 
 			perf_hashmap(atoi(p1), atoi(p2));
diff --git a/test-regex.c b/test-regex.c
index b5bfd54..0dc598e 100644
--- a/test-regex.c
+++ b/test-regex.c
@@ -1,4 +1,4 @@
-#include <git-compat-util.h>
+#include "git-compat-util.h"
 
 int main(int argc, char **argv)
 {
diff --git a/test-run-command.c b/test-run-command.c
index 37918e1..89c7de2 100644
--- a/test-run-command.c
+++ b/test-run-command.c
@@ -15,9 +15,7 @@
 
 int main(int argc, char **argv)
 {
-	struct child_process proc;
-
-	memset(&proc, 0, sizeof(proc));
+	struct child_process proc = CHILD_PROCESS_INIT;
 
 	if (argc < 3)
 		return 1;
diff --git a/test-scrap-cache-tree.c b/test-scrap-cache-tree.c
index 4728013..6efee31 100644
--- a/test-scrap-cache-tree.c
+++ b/test-scrap-cache-tree.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "lockfile.h"
 #include "tree.h"
 #include "cache-tree.h"
 
@@ -6,12 +7,11 @@
 
 int main(int ac, char **av)
 {
-	int fd = hold_locked_index(&index_lock, 1);
+	hold_locked_index(&index_lock, 1);
 	if (read_cache() < 0)
 		die("unable to read index file");
 	active_cache_tree = NULL;
-	if (write_cache(fd, active_cache, active_nr)
-	    || commit_lock_file(&index_lock))
+	if (write_locked_index(&the_index, &index_lock, COMMIT_LOCK))
 		die("unable to write index file");
 	return 0;
 }
diff --git a/test-sha1-array.c b/test-sha1-array.c
new file mode 100644
index 0000000..ddc491e
--- /dev/null
+++ b/test-sha1-array.c
@@ -0,0 +1,34 @@
+#include "cache.h"
+#include "sha1-array.h"
+
+static void print_sha1(const unsigned char sha1[20], void *data)
+{
+	puts(sha1_to_hex(sha1));
+}
+
+int main(int argc, char **argv)
+{
+	struct sha1_array array = SHA1_ARRAY_INIT;
+	struct strbuf line = STRBUF_INIT;
+
+	while (strbuf_getline(&line, stdin, '\n') != EOF) {
+		const char *arg;
+		unsigned char sha1[20];
+
+		if (skip_prefix(line.buf, "append ", &arg)) {
+			if (get_sha1_hex(arg, sha1))
+				die("not a hexadecimal SHA1: %s", arg);
+			sha1_array_append(&array, sha1);
+		} else if (skip_prefix(line.buf, "lookup ", &arg)) {
+			if (get_sha1_hex(arg, sha1))
+				die("not a hexadecimal SHA1: %s", arg);
+			printf("%d\n", sha1_array_lookup(&array, sha1));
+		} else if (!strcmp(line.buf, "clear"))
+			sha1_array_clear(&array);
+		else if (!strcmp(line.buf, "for_each_unique"))
+			sha1_array_for_each_unique(&array, print_sha1, NULL);
+		else
+			die("unknown command: %s", line.buf);
+	}
+	return 0;
+}
diff --git a/test-sigchain.c b/test-sigchain.c
index 42db234..e499fce 100644
--- a/test-sigchain.c
+++ b/test-sigchain.c
@@ -1,5 +1,5 @@
-#include "sigchain.h"
 #include "cache.h"
+#include "sigchain.h"
 
 #define X(f) \
 static void f(int sig) { \
diff --git a/test-subprocess.c b/test-subprocess.c
index 93525eb..56881a0 100644
--- a/test-subprocess.c
+++ b/test-subprocess.c
@@ -3,7 +3,7 @@
 
 int main(int argc, char **argv)
 {
-	struct child_process cp;
+	struct child_process cp = CHILD_PROCESS_INIT;
 	int nogit = 0;
 
 	setup_git_directory_gently(&nogit);
@@ -13,7 +13,6 @@
 		setup_work_tree();
 		argv++;
 	}
-	memset(&cp, 0, sizeof(cp));
 	cp.git_cmd = 1;
 	cp.argv = (const char **)argv + 1;
 	return run_command(&cp);
diff --git a/thread-utils.h b/thread-utils.h
index 6fb98c3..d9a769d 100644
--- a/thread-utils.h
+++ b/thread-utils.h
@@ -7,5 +7,9 @@
 extern int online_cpus(void);
 extern int init_recursive_mutex(pthread_mutex_t*);
 
+#else
+
+#define online_cpus() 1
+
 #endif
 #endif /* THREAD_COMPAT_H */
diff --git a/trace.c b/trace.c
index 08180a9..4778608 100644
--- a/trace.c
+++ b/trace.c
@@ -26,110 +26,250 @@
 #include "quote.h"
 
 /* Get a trace file descriptor from "key" env variable. */
-static int get_trace_fd(const char *key, int *need_close)
+static int get_trace_fd(struct trace_key *key)
 {
-	char *trace = getenv(key);
+	static struct trace_key trace_default = { "GIT_TRACE" };
+	const char *trace;
+
+	/* use default "GIT_TRACE" if NULL */
+	if (!key)
+		key = &trace_default;
+
+	/* don't open twice */
+	if (key->initialized)
+		return key->fd;
+
+	trace = getenv(key->key);
 
 	if (!trace || !strcmp(trace, "") ||
 	    !strcmp(trace, "0") || !strcasecmp(trace, "false"))
-		return 0;
-	if (!strcmp(trace, "1") || !strcasecmp(trace, "true"))
-		return STDERR_FILENO;
-	if (strlen(trace) == 1 && isdigit(*trace))
-		return atoi(trace);
-	if (is_absolute_path(trace)) {
+		key->fd = 0;
+	else if (!strcmp(trace, "1") || !strcasecmp(trace, "true"))
+		key->fd = STDERR_FILENO;
+	else if (strlen(trace) == 1 && isdigit(*trace))
+		key->fd = atoi(trace);
+	else if (is_absolute_path(trace)) {
 		int fd = open(trace, O_WRONLY | O_APPEND | O_CREAT, 0666);
 		if (fd == -1) {
 			fprintf(stderr,
 				"Could not open '%s' for tracing: %s\n"
 				"Defaulting to tracing on stderr...\n",
 				trace, strerror(errno));
-			return STDERR_FILENO;
+			key->fd = STDERR_FILENO;
+		} else {
+			key->fd = fd;
+			key->need_close = 1;
 		}
-		*need_close = 1;
-		return fd;
+	} else {
+		fprintf(stderr, "What does '%s' for %s mean?\n"
+			"If you want to trace into a file, then please set "
+			"%s to an absolute pathname (starting with /).\n"
+			"Defaulting to tracing on stderr...\n",
+			trace, key->key, key->key);
+		key->fd = STDERR_FILENO;
 	}
 
-	fprintf(stderr, "What does '%s' for %s mean?\n", trace, key);
-	fprintf(stderr, "If you want to trace into a file, "
-		"then please set %s to an absolute pathname "
-		"(starting with /).\n", key);
-	fprintf(stderr, "Defaulting to tracing on stderr...\n");
+	key->initialized = 1;
+	return key->fd;
+}
 
-	return STDERR_FILENO;
+void trace_disable(struct trace_key *key)
+{
+	if (key->need_close)
+		close(key->fd);
+	key->fd = 0;
+	key->initialized = 1;
+	key->need_close = 0;
 }
 
 static const char err_msg[] = "Could not trace into fd given by "
 	"GIT_TRACE environment variable";
 
-static void trace_vprintf(const char *key, const char *fmt, va_list ap)
+static int prepare_trace_line(const char *file, int line,
+			      struct trace_key *key, struct strbuf *buf)
 {
-	struct strbuf buf = STRBUF_INIT;
+	static struct trace_key trace_bare = TRACE_KEY_INIT(BARE);
+	struct timeval tv;
+	struct tm tm;
+	time_t secs;
 
 	if (!trace_want(key))
-		return;
+		return 0;
 
 	set_try_to_free_routine(NULL);	/* is never reset */
-	strbuf_vaddf(&buf, fmt, ap);
-	trace_strbuf(key, &buf);
-	strbuf_release(&buf);
+
+	/* unit tests may want to disable additional trace output */
+	if (trace_want(&trace_bare))
+		return 1;
+
+	/* print current timestamp */
+	gettimeofday(&tv, NULL);
+	secs = tv.tv_sec;
+	localtime_r(&secs, &tm);
+	strbuf_addf(buf, "%02d:%02d:%02d.%06ld ", tm.tm_hour, tm.tm_min,
+		    tm.tm_sec, (long) tv.tv_usec);
+
+#ifdef HAVE_VARIADIC_MACROS
+	/* print file:line */
+	strbuf_addf(buf, "%s:%d ", file, line);
+	/* align trace output (column 40 catches most files names in git) */
+	while (buf->len < 40)
+		strbuf_addch(buf, ' ');
+#endif
+
+	return 1;
 }
 
-__attribute__((format (printf, 2, 3)))
-void trace_printf_key(const char *key, const char *fmt, ...)
+static void print_trace_line(struct trace_key *key, struct strbuf *buf)
 {
-	va_list ap;
-	va_start(ap, fmt);
-	trace_vprintf(key, fmt, ap);
-	va_end(ap);
+	/* append newline if missing */
+	if (buf->len && buf->buf[buf->len - 1] != '\n')
+		strbuf_addch(buf, '\n');
+
+	write_or_whine_pipe(get_trace_fd(key), buf->buf, buf->len, err_msg);
+	strbuf_release(buf);
 }
 
-void trace_printf(const char *fmt, ...)
-{
-	va_list ap;
-	va_start(ap, fmt);
-	trace_vprintf("GIT_TRACE", fmt, ap);
-	va_end(ap);
-}
-
-void trace_strbuf(const char *key, const struct strbuf *buf)
-{
-	int fd, need_close = 0;
-
-	fd = get_trace_fd(key, &need_close);
-	if (!fd)
-		return;
-
-	write_or_whine_pipe(fd, buf->buf, buf->len, err_msg);
-
-	if (need_close)
-		close(fd);
-}
-
-void trace_argv_printf(const char **argv, const char *fmt, ...)
+static void trace_vprintf_fl(const char *file, int line, struct trace_key *key,
+			     const char *format, va_list ap)
 {
 	struct strbuf buf = STRBUF_INIT;
-	va_list ap;
-	int fd, need_close = 0;
 
-	fd = get_trace_fd("GIT_TRACE", &need_close);
-	if (!fd)
+	if (!prepare_trace_line(file, line, key, &buf))
 		return;
 
-	set_try_to_free_routine(NULL);	/* is never reset */
-	va_start(ap, fmt);
-	strbuf_vaddf(&buf, fmt, ap);
-	va_end(ap);
+	strbuf_vaddf(&buf, format, ap);
+	print_trace_line(key, &buf);
+}
+
+static void trace_argv_vprintf_fl(const char *file, int line,
+				  const char **argv, const char *format,
+				  va_list ap)
+{
+	struct strbuf buf = STRBUF_INIT;
+
+	if (!prepare_trace_line(file, line, NULL, &buf))
+		return;
+
+	strbuf_vaddf(&buf, format, ap);
 
 	sq_quote_argv(&buf, argv, 0);
-	strbuf_addch(&buf, '\n');
-	write_or_whine_pipe(fd, buf.buf, buf.len, err_msg);
-	strbuf_release(&buf);
-
-	if (need_close)
-		close(fd);
+	print_trace_line(NULL, &buf);
 }
 
+void trace_strbuf_fl(const char *file, int line, struct trace_key *key,
+		     const struct strbuf *data)
+{
+	struct strbuf buf = STRBUF_INIT;
+
+	if (!prepare_trace_line(file, line, key, &buf))
+		return;
+
+	strbuf_addbuf(&buf, data);
+	print_trace_line(key, &buf);
+}
+
+static struct trace_key trace_perf_key = TRACE_KEY_INIT(PERFORMANCE);
+
+static void trace_performance_vprintf_fl(const char *file, int line,
+					 uint64_t nanos, const char *format,
+					 va_list ap)
+{
+	struct strbuf buf = STRBUF_INIT;
+
+	if (!prepare_trace_line(file, line, &trace_perf_key, &buf))
+		return;
+
+	strbuf_addf(&buf, "performance: %.9f s", (double) nanos / 1000000000);
+
+	if (format && *format) {
+		strbuf_addstr(&buf, ": ");
+		strbuf_vaddf(&buf, format, ap);
+	}
+
+	print_trace_line(&trace_perf_key, &buf);
+}
+
+#ifndef HAVE_VARIADIC_MACROS
+
+void trace_printf(const char *format, ...)
+{
+	va_list ap;
+	va_start(ap, format);
+	trace_vprintf_fl(NULL, 0, NULL, format, ap);
+	va_end(ap);
+}
+
+void trace_printf_key(struct trace_key *key, const char *format, ...)
+{
+	va_list ap;
+	va_start(ap, format);
+	trace_vprintf_fl(NULL, 0, key, format, ap);
+	va_end(ap);
+}
+
+void trace_argv_printf(const char **argv, const char *format, ...)
+{
+	va_list ap;
+	va_start(ap, format);
+	trace_argv_vprintf_fl(NULL, 0, argv, format, ap);
+	va_end(ap);
+}
+
+void trace_strbuf(struct trace_key *key, const struct strbuf *data)
+{
+	trace_strbuf_fl(NULL, 0, key, data);
+}
+
+void trace_performance(uint64_t nanos, const char *format, ...)
+{
+	va_list ap;
+	va_start(ap, format);
+	trace_performance_vprintf_fl(NULL, 0, nanos, format, ap);
+	va_end(ap);
+}
+
+void trace_performance_since(uint64_t start, const char *format, ...)
+{
+	va_list ap;
+	va_start(ap, format);
+	trace_performance_vprintf_fl(NULL, 0, getnanotime() - start,
+				     format, ap);
+	va_end(ap);
+}
+
+#else
+
+void trace_printf_key_fl(const char *file, int line, struct trace_key *key,
+			 const char *format, ...)
+{
+	va_list ap;
+	va_start(ap, format);
+	trace_vprintf_fl(file, line, key, format, ap);
+	va_end(ap);
+}
+
+void trace_argv_printf_fl(const char *file, int line, const char **argv,
+			  const char *format, ...)
+{
+	va_list ap;
+	va_start(ap, format);
+	trace_argv_vprintf_fl(file, line, argv, format, ap);
+	va_end(ap);
+}
+
+void trace_performance_fl(const char *file, int line, uint64_t nanos,
+			      const char *format, ...)
+{
+	va_list ap;
+	va_start(ap, format);
+	trace_performance_vprintf_fl(file, line, nanos, format, ap);
+	va_end(ap);
+}
+
+#endif /* HAVE_VARIADIC_MACROS */
+
+
 static const char *quote_crnl(const char *path)
 {
 	static char new_path[PATH_MAX];
@@ -156,15 +296,14 @@
 /* FIXME: move prefix to startup_info struct and get rid of this arg */
 void trace_repo_setup(const char *prefix)
 {
-	static const char *key = "GIT_TRACE_SETUP";
+	static struct trace_key key = TRACE_KEY_INIT(SETUP);
 	const char *git_work_tree;
-	char cwd[PATH_MAX];
+	char *cwd;
 
-	if (!trace_want(key))
+	if (!trace_want(&key))
 		return;
 
-	if (!getcwd(cwd, PATH_MAX))
-		die("Unable to get current working directory");
+	cwd = xgetcwd();
 
 	if (!(git_work_tree = get_git_work_tree()))
 		git_work_tree = "(null)";
@@ -172,18 +311,119 @@
 	if (!prefix)
 		prefix = "(null)";
 
-	trace_printf_key(key, "setup: git_dir: %s\n", quote_crnl(get_git_dir()));
-	trace_printf_key(key, "setup: worktree: %s\n", quote_crnl(git_work_tree));
-	trace_printf_key(key, "setup: cwd: %s\n", quote_crnl(cwd));
-	trace_printf_key(key, "setup: prefix: %s\n", quote_crnl(prefix));
+	trace_printf_key(&key, "setup: git_dir: %s\n", quote_crnl(get_git_dir()));
+	trace_printf_key(&key, "setup: worktree: %s\n", quote_crnl(git_work_tree));
+	trace_printf_key(&key, "setup: cwd: %s\n", quote_crnl(cwd));
+	trace_printf_key(&key, "setup: prefix: %s\n", quote_crnl(prefix));
+
+	free(cwd);
 }
 
-int trace_want(const char *key)
+int trace_want(struct trace_key *key)
 {
-	const char *trace = getenv(key);
+	return !!get_trace_fd(key);
+}
 
-	if (!trace || !strcmp(trace, "") ||
-	    !strcmp(trace, "0") || !strcasecmp(trace, "false"))
+#ifdef HAVE_CLOCK_GETTIME
+
+static inline uint64_t highres_nanos(void)
+{
+	struct timespec ts;
+	if (clock_gettime(CLOCK_MONOTONIC, &ts))
 		return 0;
-	return 1;
+	return (uint64_t) ts.tv_sec * 1000000000 + ts.tv_nsec;
+}
+
+#elif defined (GIT_WINDOWS_NATIVE)
+
+static inline uint64_t highres_nanos(void)
+{
+	static uint64_t high_ns, scaled_low_ns;
+	static int scale;
+	LARGE_INTEGER cnt;
+
+	if (!scale) {
+		if (!QueryPerformanceFrequency(&cnt))
+			return 0;
+
+		/* high_ns = number of ns per cnt.HighPart */
+		high_ns = (1000000000LL << 32) / (uint64_t) cnt.QuadPart;
+
+		/*
+		 * Number of ns per cnt.LowPart is 10^9 / frequency (or
+		 * high_ns >> 32). For maximum precision, we scale this factor
+		 * so that it just fits within 32 bit (i.e. won't overflow if
+		 * multiplied with cnt.LowPart).
+		 */
+		scaled_low_ns = high_ns;
+		scale = 32;
+		while (scaled_low_ns >= 0x100000000LL) {
+			scaled_low_ns >>= 1;
+			scale--;
+		}
+	}
+
+	/* if QPF worked on initialization, we expect QPC to work as well */
+	QueryPerformanceCounter(&cnt);
+
+	return (high_ns * cnt.HighPart) +
+	       ((scaled_low_ns * cnt.LowPart) >> scale);
+}
+
+#else
+# define highres_nanos() 0
+#endif
+
+static inline uint64_t gettimeofday_nanos(void)
+{
+	struct timeval tv;
+	gettimeofday(&tv, NULL);
+	return (uint64_t) tv.tv_sec * 1000000000 + tv.tv_usec * 1000;
+}
+
+/*
+ * Returns nanoseconds since the epoch (01/01/1970), for performance tracing
+ * (i.e. favoring high precision over wall clock time accuracy).
+ */
+uint64_t getnanotime(void)
+{
+	static uint64_t offset;
+	if (offset > 1) {
+		/* initialization succeeded, return offset + high res time */
+		return offset + highres_nanos();
+	} else if (offset == 1) {
+		/* initialization failed, fall back to gettimeofday */
+		return gettimeofday_nanos();
+	} else {
+		/* initialize offset if high resolution timer works */
+		uint64_t now = gettimeofday_nanos();
+		uint64_t highres = highres_nanos();
+		if (highres)
+			offset = now - highres;
+		else
+			offset = 1;
+		return now;
+	}
+}
+
+static uint64_t command_start_time;
+static struct strbuf command_line = STRBUF_INIT;
+
+static void print_command_performance_atexit(void)
+{
+	trace_performance_since(command_start_time, "git command:%s",
+				command_line.buf);
+}
+
+void trace_command_performance(const char **argv)
+{
+	if (!trace_want(&trace_perf_key))
+		return;
+
+	if (!command_start_time)
+		atexit(print_command_performance_atexit);
+
+	strbuf_reset(&command_line);
+	sq_quote_argv(&command_line, argv, 0);
+	command_start_time = getnanotime();
 }
diff --git a/trace.h b/trace.h
new file mode 100644
index 0000000..ae6a332
--- /dev/null
+++ b/trace.h
@@ -0,0 +1,113 @@
+#ifndef TRACE_H
+#define TRACE_H
+
+#include "git-compat-util.h"
+#include "strbuf.h"
+
+struct trace_key {
+	const char * const key;
+	int fd;
+	unsigned int initialized : 1;
+	unsigned int  need_close : 1;
+};
+
+#define TRACE_KEY_INIT(name) { "GIT_TRACE_" #name, 0, 0, 0 }
+
+extern void trace_repo_setup(const char *prefix);
+extern int trace_want(struct trace_key *key);
+extern void trace_disable(struct trace_key *key);
+extern uint64_t getnanotime(void);
+extern void trace_command_performance(const char **argv);
+
+#ifndef HAVE_VARIADIC_MACROS
+
+__attribute__((format (printf, 1, 2)))
+extern void trace_printf(const char *format, ...);
+
+__attribute__((format (printf, 2, 3)))
+extern void trace_printf_key(struct trace_key *key, const char *format, ...);
+
+__attribute__((format (printf, 2, 3)))
+extern void trace_argv_printf(const char **argv, const char *format, ...);
+
+extern void trace_strbuf(struct trace_key *key, const struct strbuf *data);
+
+/* Prints elapsed time (in nanoseconds) if GIT_TRACE_PERFORMANCE is enabled. */
+__attribute__((format (printf, 2, 3)))
+extern void trace_performance(uint64_t nanos, const char *format, ...);
+
+/* Prints elapsed time since 'start' if GIT_TRACE_PERFORMANCE is enabled. */
+__attribute__((format (printf, 2, 3)))
+extern void trace_performance_since(uint64_t start, const char *format, ...);
+
+#else
+
+/*
+ * Macros to add file:line - see above for C-style declarations of how these
+ * should be used.
+ */
+
+/*
+ * TRACE_CONTEXT may be set to __FUNCTION__ if the compiler supports it. The
+ * default is __FILE__, as it is consistent with assert(), and static function
+ * names are not necessarily unique.
+ *
+ * __FILE__ ":" __FUNCTION__ doesn't work with GNUC, as __FILE__ is supplied
+ * by the preprocessor as a string literal, and __FUNCTION__ is filled in by
+ * the compiler as a string constant.
+ */
+#ifndef TRACE_CONTEXT
+# define TRACE_CONTEXT __FILE__
+#endif
+
+/*
+ * Note: with C99 variadic macros, __VA_ARGS__ must include the last fixed
+ * parameter ('format' in this case). Otherwise, a call without variable
+ * arguments will have a surplus ','. E.g.:
+ *
+ *  #define foo(format, ...) bar(format, __VA_ARGS__)
+ *  foo("test");
+ *
+ * will expand to
+ *
+ *  bar("test",);
+ *
+ * which is invalid (note the ',)'). With GNUC, '##__VA_ARGS__' drops the
+ * comma, but this is non-standard.
+ */
+
+#define trace_printf(...) \
+	trace_printf_key_fl(TRACE_CONTEXT, __LINE__, NULL, __VA_ARGS__)
+
+#define trace_printf_key(key, ...) \
+	trace_printf_key_fl(TRACE_CONTEXT, __LINE__, key, __VA_ARGS__)
+
+#define trace_argv_printf(argv, ...) \
+	trace_argv_printf_fl(TRACE_CONTEXT, __LINE__, argv, __VA_ARGS__)
+
+#define trace_strbuf(key, data) \
+	trace_strbuf_fl(TRACE_CONTEXT, __LINE__, key, data)
+
+#define trace_performance(nanos, ...) \
+	trace_performance_fl(TRACE_CONTEXT, __LINE__, nanos, __VA_ARGS__)
+
+#define trace_performance_since(start, ...) \
+	trace_performance_fl(TRACE_CONTEXT, __LINE__, getnanotime() - (start), \
+			     __VA_ARGS__)
+
+/* backend functions, use non-*fl macros instead */
+__attribute__((format (printf, 4, 5)))
+extern void trace_printf_key_fl(const char *file, int line, struct trace_key *key,
+				const char *format, ...);
+__attribute__((format (printf, 4, 5)))
+extern void trace_argv_printf_fl(const char *file, int line, const char **argv,
+				 const char *format, ...);
+extern void trace_strbuf_fl(const char *file, int line, struct trace_key *key,
+			    const struct strbuf *data);
+__attribute__((format (printf, 4, 5)))
+extern void trace_performance_fl(const char *file, int line,
+				 uint64_t nanos, const char *fmt, ...);
+
+#endif /* HAVE_VARIADIC_MACROS */
+
+#endif /* TRACE_H */
diff --git a/trailer.c b/trailer.c
new file mode 100644
index 0000000..6ae7865
--- /dev/null
+++ b/trailer.c
@@ -0,0 +1,850 @@
+#include "cache.h"
+#include "string-list.h"
+#include "run-command.h"
+#include "string-list.h"
+#include "trailer.h"
+/*
+ * Copyright (c) 2013, 2014 Christian Couder <chriscool@tuxfamily.org>
+ */
+
+enum action_where { WHERE_END, WHERE_AFTER, WHERE_BEFORE, WHERE_START };
+enum action_if_exists { EXISTS_ADD_IF_DIFFERENT_NEIGHBOR, EXISTS_ADD_IF_DIFFERENT,
+			EXISTS_ADD, EXISTS_REPLACE, EXISTS_DO_NOTHING };
+enum action_if_missing { MISSING_ADD, MISSING_DO_NOTHING };
+
+struct conf_info {
+	char *name;
+	char *key;
+	char *command;
+	enum action_where where;
+	enum action_if_exists if_exists;
+	enum action_if_missing if_missing;
+};
+
+static struct conf_info default_conf_info;
+
+struct trailer_item {
+	struct trailer_item *previous;
+	struct trailer_item *next;
+	const char *token;
+	const char *value;
+	struct conf_info conf;
+};
+
+static struct trailer_item *first_conf_item;
+
+static char *separators = ":";
+
+#define TRAILER_ARG_STRING "$ARG"
+
+static int after_or_end(enum action_where where)
+{
+	return (where == WHERE_AFTER) || (where == WHERE_END);
+}
+
+/*
+ * Return the length of the string not including any final
+ * punctuation. E.g., the input "Signed-off-by:" would return
+ * 13, stripping the trailing punctuation but retaining
+ * internal punctuation.
+ */
+static size_t token_len_without_separator(const char *token, size_t len)
+{
+	while (len > 0 && !isalnum(token[len - 1]))
+		len--;
+	return len;
+}
+
+static int same_token(struct trailer_item *a, struct trailer_item *b)
+{
+	size_t a_len = token_len_without_separator(a->token, strlen(a->token));
+	size_t b_len = token_len_without_separator(b->token, strlen(b->token));
+	size_t min_len = (a_len > b_len) ? b_len : a_len;
+
+	return !strncasecmp(a->token, b->token, min_len);
+}
+
+static int same_value(struct trailer_item *a, struct trailer_item *b)
+{
+	return !strcasecmp(a->value, b->value);
+}
+
+static int same_trailer(struct trailer_item *a, struct trailer_item *b)
+{
+	return same_token(a, b) && same_value(a, b);
+}
+
+static inline int contains_only_spaces(const char *str)
+{
+	const char *s = str;
+	while (*s && isspace(*s))
+		s++;
+	return !*s;
+}
+
+static inline void strbuf_replace(struct strbuf *sb, const char *a, const char *b)
+{
+	const char *ptr = strstr(sb->buf, a);
+	if (ptr)
+		strbuf_splice(sb, ptr - sb->buf, strlen(a), b, strlen(b));
+}
+
+static void free_trailer_item(struct trailer_item *item)
+{
+	free(item->conf.name);
+	free(item->conf.key);
+	free(item->conf.command);
+	free((char *)item->token);
+	free((char *)item->value);
+	free(item);
+}
+
+static char last_non_space_char(const char *s)
+{
+	int i;
+	for (i = strlen(s) - 1; i >= 0; i--)
+		if (!isspace(s[i]))
+			return s[i];
+	return '\0';
+}
+
+static void print_tok_val(const char *tok, const char *val)
+{
+	char c = last_non_space_char(tok);
+	if (!c)
+		return;
+	if (strchr(separators, c))
+		printf("%s%s\n", tok, val);
+	else
+		printf("%s%c %s\n", tok, separators[0], val);
+}
+
+static void print_all(struct trailer_item *first, int trim_empty)
+{
+	struct trailer_item *item;
+	for (item = first; item; item = item->next) {
+		if (!trim_empty || strlen(item->value) > 0)
+			print_tok_val(item->token, item->value);
+	}
+}
+
+static void update_last(struct trailer_item **last)
+{
+	if (*last)
+		while ((*last)->next != NULL)
+			*last = (*last)->next;
+}
+
+static void update_first(struct trailer_item **first)
+{
+	if (*first)
+		while ((*first)->previous != NULL)
+			*first = (*first)->previous;
+}
+
+static void add_arg_to_input_list(struct trailer_item *on_tok,
+				  struct trailer_item *arg_tok,
+				  struct trailer_item **first,
+				  struct trailer_item **last)
+{
+	if (after_or_end(arg_tok->conf.where)) {
+		arg_tok->next = on_tok->next;
+		on_tok->next = arg_tok;
+		arg_tok->previous = on_tok;
+		if (arg_tok->next)
+			arg_tok->next->previous = arg_tok;
+		update_last(last);
+	} else {
+		arg_tok->previous = on_tok->previous;
+		on_tok->previous = arg_tok;
+		arg_tok->next = on_tok;
+		if (arg_tok->previous)
+			arg_tok->previous->next = arg_tok;
+		update_first(first);
+	}
+}
+
+static int check_if_different(struct trailer_item *in_tok,
+			      struct trailer_item *arg_tok,
+			      int check_all)
+{
+	enum action_where where = arg_tok->conf.where;
+	do {
+		if (!in_tok)
+			return 1;
+		if (same_trailer(in_tok, arg_tok))
+			return 0;
+		/*
+		 * if we want to add a trailer after another one,
+		 * we have to check those before this one
+		 */
+		in_tok = after_or_end(where) ? in_tok->previous : in_tok->next;
+	} while (check_all);
+	return 1;
+}
+
+static void remove_from_list(struct trailer_item *item,
+			     struct trailer_item **first,
+			     struct trailer_item **last)
+{
+	struct trailer_item *next = item->next;
+	struct trailer_item *previous = item->previous;
+
+	if (next) {
+		item->next->previous = previous;
+		item->next = NULL;
+	} else if (last)
+		*last = previous;
+
+	if (previous) {
+		item->previous->next = next;
+		item->previous = NULL;
+	} else if (first)
+		*first = next;
+}
+
+static struct trailer_item *remove_first(struct trailer_item **first)
+{
+	struct trailer_item *item = *first;
+	*first = item->next;
+	if (item->next) {
+		item->next->previous = NULL;
+		item->next = NULL;
+	}
+	return item;
+}
+
+static int read_from_command(struct child_process *cp, struct strbuf *buf)
+{
+	if (run_command(cp))
+		return error("running trailer command '%s' failed", cp->argv[0]);
+	if (strbuf_read(buf, cp->out, 1024) < 1)
+		return error("reading from trailer command '%s' failed", cp->argv[0]);
+	strbuf_trim(buf);
+	return 0;
+}
+
+static const char *apply_command(const char *command, const char *arg)
+{
+	struct strbuf cmd = STRBUF_INIT;
+	struct strbuf buf = STRBUF_INIT;
+	struct child_process cp = CHILD_PROCESS_INIT;
+	const char *argv[] = {NULL, NULL};
+	const char *result;
+
+	strbuf_addstr(&cmd, command);
+	if (arg)
+		strbuf_replace(&cmd, TRAILER_ARG_STRING, arg);
+
+	argv[0] = cmd.buf;
+	cp.argv = argv;
+	cp.env = local_repo_env;
+	cp.no_stdin = 1;
+	cp.out = -1;
+	cp.use_shell = 1;
+
+	if (read_from_command(&cp, &buf)) {
+		strbuf_release(&buf);
+		result = xstrdup("");
+	} else
+		result = strbuf_detach(&buf, NULL);
+
+	strbuf_release(&cmd);
+	return result;
+}
+
+static void apply_item_command(struct trailer_item *in_tok, struct trailer_item *arg_tok)
+{
+	if (arg_tok->conf.command) {
+		const char *arg;
+		if (arg_tok->value && arg_tok->value[0]) {
+			arg = arg_tok->value;
+		} else {
+			if (in_tok && in_tok->value)
+				arg = xstrdup(in_tok->value);
+			else
+				arg = xstrdup("");
+		}
+		arg_tok->value = apply_command(arg_tok->conf.command, arg);
+		free((char *)arg);
+	}
+}
+
+static void apply_arg_if_exists(struct trailer_item *in_tok,
+				struct trailer_item *arg_tok,
+				struct trailer_item *on_tok,
+				struct trailer_item **in_tok_first,
+				struct trailer_item **in_tok_last)
+{
+	switch (arg_tok->conf.if_exists) {
+	case EXISTS_DO_NOTHING:
+		free_trailer_item(arg_tok);
+		break;
+	case EXISTS_REPLACE:
+		apply_item_command(in_tok, arg_tok);
+		add_arg_to_input_list(on_tok, arg_tok,
+				      in_tok_first, in_tok_last);
+		remove_from_list(in_tok, in_tok_first, in_tok_last);
+		free_trailer_item(in_tok);
+		break;
+	case EXISTS_ADD:
+		apply_item_command(in_tok, arg_tok);
+		add_arg_to_input_list(on_tok, arg_tok,
+				      in_tok_first, in_tok_last);
+		break;
+	case EXISTS_ADD_IF_DIFFERENT:
+		apply_item_command(in_tok, arg_tok);
+		if (check_if_different(in_tok, arg_tok, 1))
+			add_arg_to_input_list(on_tok, arg_tok,
+					      in_tok_first, in_tok_last);
+		else
+			free_trailer_item(arg_tok);
+		break;
+	case EXISTS_ADD_IF_DIFFERENT_NEIGHBOR:
+		apply_item_command(in_tok, arg_tok);
+		if (check_if_different(on_tok, arg_tok, 0))
+			add_arg_to_input_list(on_tok, arg_tok,
+					      in_tok_first, in_tok_last);
+		else
+			free_trailer_item(arg_tok);
+		break;
+	}
+}
+
+static void apply_arg_if_missing(struct trailer_item **in_tok_first,
+				 struct trailer_item **in_tok_last,
+				 struct trailer_item *arg_tok)
+{
+	struct trailer_item **in_tok;
+	enum action_where where;
+
+	switch (arg_tok->conf.if_missing) {
+	case MISSING_DO_NOTHING:
+		free_trailer_item(arg_tok);
+		break;
+	case MISSING_ADD:
+		where = arg_tok->conf.where;
+		in_tok = after_or_end(where) ? in_tok_last : in_tok_first;
+		apply_item_command(NULL, arg_tok);
+		if (*in_tok) {
+			add_arg_to_input_list(*in_tok, arg_tok,
+					      in_tok_first, in_tok_last);
+		} else {
+			*in_tok_first = arg_tok;
+			*in_tok_last = arg_tok;
+		}
+		break;
+	}
+}
+
+static int find_same_and_apply_arg(struct trailer_item **in_tok_first,
+				   struct trailer_item **in_tok_last,
+				   struct trailer_item *arg_tok)
+{
+	struct trailer_item *in_tok;
+	struct trailer_item *on_tok;
+	struct trailer_item *following_tok;
+
+	enum action_where where = arg_tok->conf.where;
+	int middle = (where == WHERE_AFTER) || (where == WHERE_BEFORE);
+	int backwards = after_or_end(where);
+	struct trailer_item *start_tok = backwards ? *in_tok_last : *in_tok_first;
+
+	for (in_tok = start_tok; in_tok; in_tok = following_tok) {
+		following_tok = backwards ? in_tok->previous : in_tok->next;
+		if (!same_token(in_tok, arg_tok))
+			continue;
+		on_tok = middle ? in_tok : start_tok;
+		apply_arg_if_exists(in_tok, arg_tok, on_tok,
+				    in_tok_first, in_tok_last);
+		return 1;
+	}
+	return 0;
+}
+
+static void process_trailers_lists(struct trailer_item **in_tok_first,
+				   struct trailer_item **in_tok_last,
+				   struct trailer_item **arg_tok_first)
+{
+	struct trailer_item *arg_tok;
+	struct trailer_item *next_arg;
+
+	if (!*arg_tok_first)
+		return;
+
+	for (arg_tok = *arg_tok_first; arg_tok; arg_tok = next_arg) {
+		int applied = 0;
+
+		next_arg = arg_tok->next;
+		remove_from_list(arg_tok, arg_tok_first, NULL);
+
+		applied = find_same_and_apply_arg(in_tok_first,
+						  in_tok_last,
+						  arg_tok);
+
+		if (!applied)
+			apply_arg_if_missing(in_tok_first,
+					     in_tok_last,
+					     arg_tok);
+	}
+}
+
+static int set_where(struct conf_info *item, const char *value)
+{
+	if (!strcasecmp("after", value))
+		item->where = WHERE_AFTER;
+	else if (!strcasecmp("before", value))
+		item->where = WHERE_BEFORE;
+	else if (!strcasecmp("end", value))
+		item->where = WHERE_END;
+	else if (!strcasecmp("start", value))
+		item->where = WHERE_START;
+	else
+		return -1;
+	return 0;
+}
+
+static int set_if_exists(struct conf_info *item, const char *value)
+{
+	if (!strcasecmp("addIfDifferent", value))
+		item->if_exists = EXISTS_ADD_IF_DIFFERENT;
+	else if (!strcasecmp("addIfDifferentNeighbor", value))
+		item->if_exists = EXISTS_ADD_IF_DIFFERENT_NEIGHBOR;
+	else if (!strcasecmp("add", value))
+		item->if_exists = EXISTS_ADD;
+	else if (!strcasecmp("replace", value))
+		item->if_exists = EXISTS_REPLACE;
+	else if (!strcasecmp("doNothing", value))
+		item->if_exists = EXISTS_DO_NOTHING;
+	else
+		return -1;
+	return 0;
+}
+
+static int set_if_missing(struct conf_info *item, const char *value)
+{
+	if (!strcasecmp("doNothing", value))
+		item->if_missing = MISSING_DO_NOTHING;
+	else if (!strcasecmp("add", value))
+		item->if_missing = MISSING_ADD;
+	else
+		return -1;
+	return 0;
+}
+
+static void duplicate_conf(struct conf_info *dst, struct conf_info *src)
+{
+	*dst = *src;
+	if (src->name)
+		dst->name = xstrdup(src->name);
+	if (src->key)
+		dst->key = xstrdup(src->key);
+	if (src->command)
+		dst->command = xstrdup(src->command);
+}
+
+static struct trailer_item *get_conf_item(const char *name)
+{
+	struct trailer_item *item;
+	struct trailer_item *previous;
+
+	/* Look up item with same name */
+	for (previous = NULL, item = first_conf_item;
+	     item;
+	     previous = item, item = item->next) {
+		if (!strcasecmp(item->conf.name, name))
+			return item;
+	}
+
+	/* Item does not already exists, create it */
+	item = xcalloc(sizeof(struct trailer_item), 1);
+	duplicate_conf(&item->conf, &default_conf_info);
+	item->conf.name = xstrdup(name);
+
+	if (!previous)
+		first_conf_item = item;
+	else {
+		previous->next = item;
+		item->previous = previous;
+	}
+
+	return item;
+}
+
+enum trailer_info_type { TRAILER_KEY, TRAILER_COMMAND, TRAILER_WHERE,
+			 TRAILER_IF_EXISTS, TRAILER_IF_MISSING };
+
+static struct {
+	const char *name;
+	enum trailer_info_type type;
+} trailer_config_items[] = {
+	{ "key", TRAILER_KEY },
+	{ "command", TRAILER_COMMAND },
+	{ "where", TRAILER_WHERE },
+	{ "ifexists", TRAILER_IF_EXISTS },
+	{ "ifmissing", TRAILER_IF_MISSING }
+};
+
+static int git_trailer_default_config(const char *conf_key, const char *value, void *cb)
+{
+	const char *trailer_item, *variable_name;
+
+	if (!skip_prefix(conf_key, "trailer.", &trailer_item))
+		return 0;
+
+	variable_name = strrchr(trailer_item, '.');
+	if (!variable_name) {
+		if (!strcmp(trailer_item, "where")) {
+			if (set_where(&default_conf_info, value) < 0)
+				warning(_("unknown value '%s' for key '%s'"),
+					value, conf_key);
+		} else if (!strcmp(trailer_item, "ifexists")) {
+			if (set_if_exists(&default_conf_info, value) < 0)
+				warning(_("unknown value '%s' for key '%s'"),
+					value, conf_key);
+		} else if (!strcmp(trailer_item, "ifmissing")) {
+			if (set_if_missing(&default_conf_info, value) < 0)
+				warning(_("unknown value '%s' for key '%s'"),
+					value, conf_key);
+		} else if (!strcmp(trailer_item, "separators")) {
+			separators = xstrdup(value);
+		}
+	}
+	return 0;
+}
+
+static int git_trailer_config(const char *conf_key, const char *value, void *cb)
+{
+	const char *trailer_item, *variable_name;
+	struct trailer_item *item;
+	struct conf_info *conf;
+	char *name = NULL;
+	enum trailer_info_type type;
+	int i;
+
+	if (!skip_prefix(conf_key, "trailer.", &trailer_item))
+		return 0;
+
+	variable_name = strrchr(trailer_item, '.');
+	if (!variable_name)
+		return 0;
+
+	variable_name++;
+	for (i = 0; i < ARRAY_SIZE(trailer_config_items); i++) {
+		if (strcmp(trailer_config_items[i].name, variable_name))
+			continue;
+		name = xstrndup(trailer_item,  variable_name - trailer_item - 1);
+		type = trailer_config_items[i].type;
+		break;
+	}
+
+	if (!name)
+		return 0;
+
+	item = get_conf_item(name);
+	conf = &item->conf;
+	free(name);
+
+	switch (type) {
+	case TRAILER_KEY:
+		if (conf->key)
+			warning(_("more than one %s"), conf_key);
+		conf->key = xstrdup(value);
+		break;
+	case TRAILER_COMMAND:
+		if (conf->command)
+			warning(_("more than one %s"), conf_key);
+		conf->command = xstrdup(value);
+		break;
+	case TRAILER_WHERE:
+		if (set_where(conf, value))
+			warning(_("unknown value '%s' for key '%s'"), value, conf_key);
+		break;
+	case TRAILER_IF_EXISTS:
+		if (set_if_exists(conf, value))
+			warning(_("unknown value '%s' for key '%s'"), value, conf_key);
+		break;
+	case TRAILER_IF_MISSING:
+		if (set_if_missing(conf, value))
+			warning(_("unknown value '%s' for key '%s'"), value, conf_key);
+		break;
+	default:
+		die("internal bug in trailer.c");
+	}
+	return 0;
+}
+
+static int parse_trailer(struct strbuf *tok, struct strbuf *val, const char *trailer)
+{
+	size_t len;
+	struct strbuf seps = STRBUF_INIT;
+	strbuf_addstr(&seps, separators);
+	strbuf_addch(&seps, '=');
+	len = strcspn(trailer, seps.buf);
+	strbuf_release(&seps);
+	if (len == 0)
+		return error(_("empty trailer token in trailer '%s'"), trailer);
+	if (len < strlen(trailer)) {
+		strbuf_add(tok, trailer, len);
+		strbuf_trim(tok);
+		strbuf_addstr(val, trailer + len + 1);
+		strbuf_trim(val);
+	} else {
+		strbuf_addstr(tok, trailer);
+		strbuf_trim(tok);
+	}
+	return 0;
+}
+
+static const char *token_from_item(struct trailer_item *item, char *tok)
+{
+	if (item->conf.key)
+		return item->conf.key;
+	if (tok)
+		return tok;
+	return item->conf.name;
+}
+
+static struct trailer_item *new_trailer_item(struct trailer_item *conf_item,
+					     char *tok, char *val)
+{
+	struct trailer_item *new = xcalloc(sizeof(*new), 1);
+	new->value = val ? val : xstrdup("");
+
+	if (conf_item) {
+		duplicate_conf(&new->conf, &conf_item->conf);
+		new->token = xstrdup(token_from_item(conf_item, tok));
+		free(tok);
+	} else {
+		duplicate_conf(&new->conf, &default_conf_info);
+		new->token = tok;
+	}
+
+	return new;
+}
+
+static int token_matches_item(const char *tok, struct trailer_item *item, int tok_len)
+{
+	if (!strncasecmp(tok, item->conf.name, tok_len))
+		return 1;
+	return item->conf.key ? !strncasecmp(tok, item->conf.key, tok_len) : 0;
+}
+
+static struct trailer_item *create_trailer_item(const char *string)
+{
+	struct strbuf tok = STRBUF_INIT;
+	struct strbuf val = STRBUF_INIT;
+	struct trailer_item *item;
+	int tok_len;
+
+	if (parse_trailer(&tok, &val, string))
+		return NULL;
+
+	tok_len = token_len_without_separator(tok.buf, tok.len);
+
+	/* Lookup if the token matches something in the config */
+	for (item = first_conf_item; item; item = item->next) {
+		if (token_matches_item(tok.buf, item, tok_len))
+			return new_trailer_item(item,
+						strbuf_detach(&tok, NULL),
+						strbuf_detach(&val, NULL));
+	}
+
+	return new_trailer_item(NULL,
+				strbuf_detach(&tok, NULL),
+				strbuf_detach(&val, NULL));
+}
+
+static void add_trailer_item(struct trailer_item **first,
+			     struct trailer_item **last,
+			     struct trailer_item *new)
+{
+	if (!new)
+		return;
+	if (!*last) {
+		*first = new;
+		*last = new;
+	} else {
+		(*last)->next = new;
+		new->previous = *last;
+		*last = new;
+	}
+}
+
+static struct trailer_item *process_command_line_args(struct string_list *trailers)
+{
+	struct trailer_item *arg_tok_first = NULL;
+	struct trailer_item *arg_tok_last = NULL;
+	struct string_list_item *tr;
+	struct trailer_item *item;
+
+	/* Add a trailer item for each configured trailer with a command */
+	for (item = first_conf_item; item; item = item->next) {
+		if (item->conf.command) {
+			struct trailer_item *new = new_trailer_item(item, NULL, NULL);
+			add_trailer_item(&arg_tok_first, &arg_tok_last, new);
+		}
+	}
+
+	/* Add a trailer item for each trailer on the command line */
+	for_each_string_list_item(tr, trailers) {
+		struct trailer_item *new = create_trailer_item(tr->string);
+		add_trailer_item(&arg_tok_first, &arg_tok_last, new);
+	}
+
+	return arg_tok_first;
+}
+
+static struct strbuf **read_input_file(const char *file)
+{
+	struct strbuf **lines;
+	struct strbuf sb = STRBUF_INIT;
+
+	if (file) {
+		if (strbuf_read_file(&sb, file, 0) < 0)
+			die_errno(_("could not read input file '%s'"), file);
+	} else {
+		if (strbuf_read(&sb, fileno(stdin), 0) < 0)
+			die_errno(_("could not read from stdin"));
+	}
+
+	lines = strbuf_split(&sb, '\n');
+
+	strbuf_release(&sb);
+
+	return lines;
+}
+
+/*
+ * Return the (0 based) index of the start of the patch or the line
+ * count if there is no patch in the message.
+ */
+static int find_patch_start(struct strbuf **lines, int count)
+{
+	int i;
+
+	/* Get the start of the patch part if any */
+	for (i = 0; i < count; i++) {
+		if (starts_with(lines[i]->buf, "---"))
+			return i;
+	}
+
+	return count;
+}
+
+/*
+ * Return the (0 based) index of the first trailer line or count if
+ * there are no trailers. Trailers are searched only in the lines from
+ * index (count - 1) down to index 0.
+ */
+static int find_trailer_start(struct strbuf **lines, int count)
+{
+	int start, only_spaces = 1;
+
+	/*
+	 * Get the start of the trailers by looking starting from the end
+	 * for a line with only spaces before lines with one separator.
+	 */
+	for (start = count - 1; start >= 0; start--) {
+		if (lines[start]->buf[0] == comment_line_char)
+			continue;
+		if (contains_only_spaces(lines[start]->buf)) {
+			if (only_spaces)
+				continue;
+			return start + 1;
+		}
+		if (strcspn(lines[start]->buf, separators) < lines[start]->len) {
+			if (only_spaces)
+				only_spaces = 0;
+			continue;
+		}
+		return count;
+	}
+
+	return only_spaces ? count : 0;
+}
+
+static int has_blank_line_before(struct strbuf **lines, int start)
+{
+	for (;start >= 0; start--) {
+		if (lines[start]->buf[0] == comment_line_char)
+			continue;
+		return contains_only_spaces(lines[start]->buf);
+	}
+	return 0;
+}
+
+static void print_lines(struct strbuf **lines, int start, int end)
+{
+	int i;
+	for (i = start; lines[i] && i < end; i++)
+		printf("%s", lines[i]->buf);
+}
+
+static int process_input_file(struct strbuf **lines,
+			      struct trailer_item **in_tok_first,
+			      struct trailer_item **in_tok_last)
+{
+	int count = 0;
+	int patch_start, trailer_start, i;
+
+	/* Get the line count */
+	while (lines[count])
+		count++;
+
+	patch_start = find_patch_start(lines, count);
+	trailer_start = find_trailer_start(lines, patch_start);
+
+	/* Print lines before the trailers as is */
+	print_lines(lines, 0, trailer_start);
+
+	if (!has_blank_line_before(lines, trailer_start - 1))
+		printf("\n");
+
+	/* Parse trailer lines */
+	for (i = trailer_start; i < patch_start; i++) {
+		struct trailer_item *new = create_trailer_item(lines[i]->buf);
+		add_trailer_item(in_tok_first, in_tok_last, new);
+	}
+
+	return patch_start;
+}
+
+static void free_all(struct trailer_item **first)
+{
+	while (*first) {
+		struct trailer_item *item = remove_first(first);
+		free_trailer_item(item);
+	}
+}
+
+void process_trailers(const char *file, int trim_empty, struct string_list *trailers)
+{
+	struct trailer_item *in_tok_first = NULL;
+	struct trailer_item *in_tok_last = NULL;
+	struct trailer_item *arg_tok_first;
+	struct strbuf **lines;
+	int patch_start;
+
+	/* Default config must be setup first */
+	git_config(git_trailer_default_config, NULL);
+	git_config(git_trailer_config, NULL);
+
+	lines = read_input_file(file);
+
+	/* Print the lines before the trailers */
+	patch_start = process_input_file(lines, &in_tok_first, &in_tok_last);
+
+	arg_tok_first = process_command_line_args(trailers);
+
+	process_trailers_lists(&in_tok_first, &in_tok_last, &arg_tok_first);
+
+	print_all(in_tok_first, trim_empty);
+
+	free_all(&in_tok_first);
+
+	/* Print the lines after the trailers as is */
+	print_lines(lines, patch_start, INT_MAX);
+
+	strbuf_list_free(lines);
+}
diff --git a/trailer.h b/trailer.h
new file mode 100644
index 0000000..8eb25d5
--- /dev/null
+++ b/trailer.h
@@ -0,0 +1,6 @@
+#ifndef TRAILER_H
+#define TRAILER_H
+
+void process_trailers(const char *file, int trim_empty, struct string_list *trailers);
+
+#endif /* TRAILER_H */
diff --git a/transport-helper.c b/transport-helper.c
index b9ba041..0224687 100644
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -101,7 +101,6 @@
 static struct child_process *get_helper(struct transport *transport)
 {
 	struct helper_data *data = transport->data;
-	struct argv_array argv = ARGV_ARRAY_INIT;
 	struct strbuf buf = STRBUF_INIT;
 	struct child_process *helper;
 	const char **refspecs = NULL;
@@ -109,29 +108,23 @@
 	int refspec_alloc = 0;
 	int duped;
 	int code;
-	char git_dir_buf[sizeof(GIT_DIR_ENVIRONMENT) + PATH_MAX + 1];
-	const char *helper_env[] = {
-		git_dir_buf,
-		NULL
-	};
-
 
 	if (data->helper)
 		return data->helper;
 
-	helper = xcalloc(1, sizeof(*helper));
+	helper = xmalloc(sizeof(*helper));
+	child_process_init(helper);
 	helper->in = -1;
 	helper->out = -1;
 	helper->err = 0;
-	argv_array_pushf(&argv, "git-remote-%s", data->name);
-	argv_array_push(&argv, transport->remote->name);
-	argv_array_push(&argv, remove_ext_force(transport->url));
-	helper->argv = argv_array_detach(&argv, NULL);
+	argv_array_pushf(&helper->args, "git-remote-%s", data->name);
+	argv_array_push(&helper->args, transport->remote->name);
+	argv_array_push(&helper->args, remove_ext_force(transport->url));
 	helper->git_cmd = 0;
 	helper->silent_exec_failure = 1;
 
-	snprintf(git_dir_buf, sizeof(git_dir_buf), "%s=%s", GIT_DIR_ENVIRONMENT, get_git_dir());
-	helper->env = helper_env;
+	argv_array_pushf(&helper->env_array, "%s=%s", GIT_DIR_ENVIRONMENT,
+			 get_git_dir());
 
 	code = start_command(helper);
 	if (code < 0 && errno == ENOENT)
@@ -155,7 +148,7 @@
 	write_constant(helper->in, "capabilities\n");
 
 	while (1) {
-		const char *capname;
+		const char *capname, *arg;
 		int mandatory = 0;
 		if (recvline(data, &buf))
 			exit(128);
@@ -185,19 +178,19 @@
 			data->export = 1;
 		else if (!strcmp(capname, "check-connectivity"))
 			data->check_connectivity = 1;
-		else if (!data->refspecs && starts_with(capname, "refspec ")) {
+		else if (!data->refspecs && skip_prefix(capname, "refspec ", &arg)) {
 			ALLOC_GROW(refspecs,
 				   refspec_nr + 1,
 				   refspec_alloc);
-			refspecs[refspec_nr++] = xstrdup(capname + strlen("refspec "));
+			refspecs[refspec_nr++] = xstrdup(arg);
 		} else if (!strcmp(capname, "connect")) {
 			data->connect = 1;
 		} else if (!strcmp(capname, "signed-tags")) {
 			data->signed_tags = 1;
-		} else if (starts_with(capname, "export-marks ")) {
-			data->export_marks = xstrdup(capname + strlen("export-marks "));
-		} else if (starts_with(capname, "import-marks")) {
-			data->import_marks = xstrdup(capname + strlen("import-marks "));
+		} else if (skip_prefix(capname, "export-marks ", &arg)) {
+			data->export_marks = xstrdup(arg);
+		} else if (skip_prefix(capname, "import-marks ", &arg)) {
+			data->import_marks = xstrdup(arg);
 		} else if (starts_with(capname, "no-private-update")) {
 			data->no_private_update = 1;
 		} else if (mandatory) {
@@ -245,7 +238,6 @@
 		close(data->helper->out);
 		fclose(data->out);
 		res = finish_command(data->helper);
-		argv_array_free_detached(data->helper->argv);
 		free(data->helper);
 		data->helper = NULL;
 	}
@@ -262,7 +254,8 @@
 static const char *boolean_options[] = {
 	TRANS_OPT_THIN,
 	TRANS_OPT_KEEP,
-	TRANS_OPT_FOLLOWTAGS
+	TRANS_OPT_FOLLOWTAGS,
+	TRANS_OPT_PUSH_CERT
 	};
 
 static int set_helper_option(struct transport *transport,
@@ -397,18 +390,16 @@
 {
 	struct child_process *helper = get_helper(transport);
 	struct helper_data *data = transport->data;
-	struct argv_array argv = ARGV_ARRAY_INIT;
 	int cat_blob_fd, code;
-	memset(fastimport, 0, sizeof(*fastimport));
+	child_process_init(fastimport);
 	fastimport->in = helper->out;
-	argv_array_push(&argv, "fast-import");
-	argv_array_push(&argv, debug ? "--stats" : "--quiet");
+	argv_array_push(&fastimport->args, "fast-import");
+	argv_array_push(&fastimport->args, debug ? "--stats" : "--quiet");
 
 	if (data->bidi_import) {
 		cat_blob_fd = xdup(helper->in);
-		argv_array_pushf(&argv, "--cat-blob-fd=%d", cat_blob_fd);
+		argv_array_pushf(&fastimport->args, "--cat-blob-fd=%d", cat_blob_fd);
 	}
-	fastimport->argv = argv.argv;
 	fastimport->git_cmd = 1;
 
 	code = start_command(fastimport);
@@ -421,30 +412,24 @@
 {
 	struct helper_data *data = transport->data;
 	struct child_process *helper = get_helper(transport);
-	int argc = 0, i;
-	struct strbuf tmp = STRBUF_INIT;
+	int i;
 
-	memset(fastexport, 0, sizeof(*fastexport));
+	child_process_init(fastexport);
 
 	/* we need to duplicate helper->in because we want to use it after
 	 * fastexport is done with it. */
 	fastexport->out = dup(helper->in);
-	fastexport->argv = xcalloc(6 + revlist_args->nr, sizeof(*fastexport->argv));
-	fastexport->argv[argc++] = "fast-export";
-	fastexport->argv[argc++] = "--use-done-feature";
-	fastexport->argv[argc++] = data->signed_tags ?
-		"--signed-tags=verbatim" : "--signed-tags=warn-strip";
-	if (data->export_marks) {
-		strbuf_addf(&tmp, "--export-marks=%s.tmp", data->export_marks);
-		fastexport->argv[argc++] = strbuf_detach(&tmp, NULL);
-	}
-	if (data->import_marks) {
-		strbuf_addf(&tmp, "--import-marks=%s", data->import_marks);
-		fastexport->argv[argc++] = strbuf_detach(&tmp, NULL);
-	}
+	argv_array_push(&fastexport->args, "fast-export");
+	argv_array_push(&fastexport->args, "--use-done-feature");
+	argv_array_push(&fastexport->args, data->signed_tags ?
+		"--signed-tags=verbatim" : "--signed-tags=warn-strip");
+	if (data->export_marks)
+		argv_array_pushf(&fastexport->args, "--export-marks=%s.tmp", data->export_marks);
+	if (data->import_marks)
+		argv_array_pushf(&fastexport->args, "--import-marks=%s", data->import_marks);
 
 	for (i = 0; i < revlist_args->nr; i++)
-		fastexport->argv[argc++] = revlist_args->items[i].string;
+		argv_array_push(&fastexport->args, revlist_args->items[i].string);
 
 	fastexport->git_cmd = 1;
 	return start_command(fastexport);
@@ -485,7 +470,6 @@
 
 	if (finish_command(&fastimport))
 		die("Error while running fast-import");
-	argv_array_free_detached(fastimport.argv);
 
 	/*
 	 * The fast-import stream of a remote helper that advertises
@@ -847,6 +831,9 @@
 	if (flags & TRANSPORT_PUSH_DRY_RUN) {
 		if (set_helper_option(transport, "dry-run", "true") != 0)
 			die("helper %s does not support dry-run", data->name);
+	} else if (flags & TRANSPORT_PUSH_CERT) {
+		if (set_helper_option(transport, TRANS_OPT_PUSH_CERT, "true") != 0)
+			die("helper %s does not support --signed", data->name);
 	}
 
 	strbuf_addch(&buf, '\n');
@@ -862,7 +849,7 @@
 	struct ref *ref;
 	struct child_process *helper, exporter;
 	struct helper_data *data = transport->data;
-	struct string_list revlist_args = STRING_LIST_INIT_NODUP;
+	struct string_list revlist_args = STRING_LIST_INIT_DUP;
 	struct strbuf buf = STRBUF_INIT;
 
 	if (!data->refspecs)
@@ -871,6 +858,9 @@
 	if (flags & TRANSPORT_PUSH_DRY_RUN) {
 		if (set_helper_option(transport, "dry-run", "true") != 0)
 			die("helper %s does not support dry-run", data->name);
+	} else if (flags & TRANSPORT_PUSH_CERT) {
+		if (set_helper_option(transport, TRANS_OPT_PUSH_CERT, "true") != 0)
+			die("helper %s does not support dry-run", data->name);
 	}
 
 	if (flags & TRANSPORT_PUSH_FORCE) {
@@ -882,15 +872,10 @@
 
 	write_constant(helper->in, "export\n");
 
-	strbuf_reset(&buf);
-
 	for (ref = remote_refs; ref; ref = ref->next) {
 		char *private;
 		unsigned char sha1[20];
 
-		if (ref->deletion)
-			die("remote-helpers do not support ref deletion");
-
 		private = apply_refspecs(data->refspecs, data->refspec_nr, ref->name);
 		if (private && !get_sha1(private, sha1)) {
 			strbuf_addf(&buf, "^%s", private);
@@ -900,15 +885,37 @@
 		free(private);
 
 		if (ref->peer_ref) {
-			if (strcmp(ref->peer_ref->name, ref->name))
-				die("remote-helpers do not support old:new syntax");
-			string_list_append(&revlist_args, ref->peer_ref->name);
+			if (strcmp(ref->name, ref->peer_ref->name)) {
+				if (!ref->deletion) {
+					const char *name;
+					int flag;
+
+					/* Follow symbolic refs (mainly for HEAD). */
+					name = resolve_ref_unsafe(
+						 ref->peer_ref->name,
+						 RESOLVE_REF_READING,
+						 sha1, &flag);
+					if (!name || !(flag & REF_ISSYMREF))
+						name = ref->peer_ref->name;
+
+					strbuf_addf(&buf, "%s:%s", name, ref->name);
+				} else
+					strbuf_addf(&buf, ":%s", ref->name);
+
+				string_list_append(&revlist_args, "--refspec");
+				string_list_append(&revlist_args, buf.buf);
+				strbuf_release(&buf);
+			}
+			if (!ref->deletion)
+				string_list_append(&revlist_args, ref->peer_ref->name);
 		}
 	}
 
 	if (get_exporter(transport, &exporter, &revlist_args))
 		die("Couldn't run fast-export");
 
+	string_list_clear(&revlist_args, 1);
+
 	if (finish_command(&exporter))
 		die("Error while running fast-export");
 	if (push_update_refs_status(data, remote_refs, flags))
diff --git a/transport.c b/transport.c
index 325f03e..70d38e4 100644
--- a/transport.c
+++ b/transport.c
@@ -168,7 +168,8 @@
 		/* Follow symbolic refs (mainly for HEAD). */
 		localname = ref->peer_ref->name;
 		remotename = ref->name;
-		tmp = resolve_ref_unsafe(localname, sha, 1, &flag);
+		tmp = resolve_ref_unsafe(localname, RESOLVE_REF_READING,
+					 sha, &flag);
 		if (tmp && flag & REF_ISSYMREF &&
 			starts_with(tmp, "refs/heads/"))
 			localname = tmp;
@@ -192,14 +193,16 @@
 
 static const char *rsync_url(const char *url)
 {
-	return !starts_with(url, "rsync://") ? skip_prefix(url, "rsync:") : url;
+	if (!starts_with(url, "rsync://"))
+		skip_prefix(url, "rsync:", &url);
+	return url;
 }
 
 static struct ref *get_refs_via_rsync(struct transport *transport, int for_push)
 {
 	struct strbuf buf = STRBUF_INIT, temp_dir = STRBUF_INIT;
 	struct ref dummy = {NULL}, *tail = &dummy;
-	struct child_process rsync;
+	struct child_process rsync = CHILD_PROCESS_INIT;
 	const char *args[5];
 	int temp_dir_len;
 
@@ -216,7 +219,6 @@
 	strbuf_addstr(&buf, rsync_url(transport->url));
 	strbuf_addstr(&buf, "/refs");
 
-	memset(&rsync, 0, sizeof(rsync));
 	rsync.argv = args;
 	rsync.stdout_to_stderr = 1;
 	args[0] = "rsync";
@@ -261,32 +263,19 @@
 static int fetch_objs_via_rsync(struct transport *transport,
 				int nr_objs, struct ref **to_fetch)
 {
-	struct strbuf buf = STRBUF_INIT;
-	struct child_process rsync;
-	const char *args[8];
-	int result;
+	struct child_process rsync = CHILD_PROCESS_INIT;
 
-	strbuf_addstr(&buf, rsync_url(transport->url));
-	strbuf_addstr(&buf, "/objects/");
-
-	memset(&rsync, 0, sizeof(rsync));
-	rsync.argv = args;
 	rsync.stdout_to_stderr = 1;
-	args[0] = "rsync";
-	args[1] = (transport->verbose > 1) ? "-rv" : "-r";
-	args[2] = "--ignore-existing";
-	args[3] = "--exclude";
-	args[4] = "info";
-	args[5] = buf.buf;
-	args[6] = get_object_directory();
-	args[7] = NULL;
+	argv_array_push(&rsync.args, "rsync");
+	argv_array_push(&rsync.args, (transport->verbose > 1) ? "-rv" : "-r");
+	argv_array_push(&rsync.args, "--ignore-existing");
+	argv_array_push(&rsync.args, "--exclude");
+	argv_array_push(&rsync.args, "info");
+	argv_array_pushf(&rsync.args, "%s/objects/", rsync_url(transport->url));
+	argv_array_push(&rsync.args, get_object_directory());
 
 	/* NEEDSWORK: handle one level of alternates */
-	result = run_command(&rsync);
-
-	strbuf_release(&buf);
-
-	return result;
+	return run_command(&rsync);
 }
 
 static int write_one_ref(const char *name, const unsigned char *sha1,
@@ -337,7 +326,7 @@
 {
 	struct strbuf buf = STRBUF_INIT, temp_dir = STRBUF_INIT;
 	int result = 0, i;
-	struct child_process rsync;
+	struct child_process rsync = CHILD_PROCESS_INIT;
 	const char *args[10];
 
 	if (flags & TRANSPORT_PUSH_MIRROR)
@@ -348,7 +337,6 @@
 	strbuf_addstr(&buf, rsync_url(transport->url));
 	strbuf_addch(&buf, '/');
 
-	memset(&rsync, 0, sizeof(rsync));
 	rsync.argv = args;
 	rsync.stdout_to_stderr = 1;
 	i = 0;
@@ -490,6 +478,9 @@
 				die("transport: invalid depth option '%s'", value);
 		}
 		return 0;
+	} else if (!strcmp(name, TRANS_OPT_PUSH_CERT)) {
+		opts->push_cert = !!value;
+		return 0;
 	}
 	return 1;
 }
@@ -753,7 +744,7 @@
 	unsigned char head_sha1[20];
 	char *head;
 
-	head = resolve_refdup("HEAD", head_sha1, 1, NULL);
+	head = resolve_refdup("HEAD", RESOLVE_REF_READING, head_sha1, NULL);
 
 	if (verbose) {
 		for (ref = refs; ref; ref = ref->next)
@@ -784,6 +775,7 @@
 			*reject_reasons |= REJECT_NEEDS_FORCE;
 		}
 	}
+	free(head);
 }
 
 void transport_verify_remote_names(int nr_heads, const char **heads)
@@ -833,6 +825,8 @@
 	args.progress = transport->progress;
 	args.dry_run = !!(flags & TRANSPORT_PUSH_DRY_RUN);
 	args.porcelain = !!(flags & TRANSPORT_PUSH_PORCELAIN);
+	args.push_cert = !!(flags & TRANSPORT_PUSH_CERT);
+	args.url = transport->url;
 
 	ret = send_pack(&args, data->fd, data->conn, remote_refs,
 			&data->extra_have);
@@ -1066,7 +1060,7 @@
 {
 	int ret = 0, x;
 	struct ref *r;
-	struct child_process proc;
+	struct child_process proc = CHILD_PROCESS_INIT;
 	struct strbuf buf;
 	const char *argv[4];
 
@@ -1077,7 +1071,6 @@
 	argv[2] = transport->url;
 	argv[3] = NULL;
 
-	memset(&proc, 0, sizeof(proc));
 	proc.argv = argv;
 	proc.in = -1;
 
@@ -1186,10 +1179,8 @@
 		if ((flags & (TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND |
 			      TRANSPORT_RECURSE_SUBMODULES_CHECK)) && !is_bare_repository()) {
 			struct ref *ref = remote_refs;
-			struct string_list needs_pushing;
+			struct string_list needs_pushing = STRING_LIST_INIT_DUP;
 
-			memset(&needs_pushing, 0, sizeof(struct string_list));
-			needs_pushing.strdup_strings = 1;
 			for (; ref; ref = ref->next)
 				if (!is_null_sha1(ref->new_sha1) &&
 				    find_unpushed_submodules(ref->new_sha1,
@@ -1369,11 +1360,11 @@
 	while (other[len-1] == '/')
 		other[--len] = '\0';
 	if (len < 8 || memcmp(other + len - 8, "/objects", 8))
-		return 0;
+		goto out;
 	/* Is this a git repository with refs? */
 	memcpy(other + len - 8, "/refs", 6);
 	if (!is_directory(other))
-		return 0;
+		goto out;
 	other[len - 8] = '\0';
 	remote = remote_get(other);
 	transport = transport_get(remote, other);
@@ -1382,6 +1373,7 @@
 	     extra = extra->next)
 		cb->fn(extra, cb->data);
 	transport_disconnect(transport);
+out:
 	free(other);
 	return 0;
 }
diff --git a/transport.h b/transport.h
index 02ea248..3e0091e 100644
--- a/transport.h
+++ b/transport.h
@@ -12,6 +12,7 @@
 	unsigned check_self_contained_and_connected : 1;
 	unsigned self_contained_and_connected : 1;
 	unsigned update_shallow : 1;
+	unsigned push_cert : 1;
 	int depth;
 	const char *uploadpack;
 	const char *receivepack;
@@ -123,6 +124,7 @@
 #define TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND 256
 #define TRANSPORT_PUSH_NO_HOOK 512
 #define TRANSPORT_PUSH_FOLLOW_TAGS 1024
+#define TRANSPORT_PUSH_CERT 2048
 
 #define TRANSPORT_SUMMARY_WIDTH (2 * DEFAULT_ABBREV + 3)
 #define TRANSPORT_SUMMARY(x) (int)(TRANSPORT_SUMMARY_WIDTH + strlen(x) - gettext_width(x)), (x)
@@ -156,6 +158,9 @@
 /* Accept refs that may update .git/shallow without --depth */
 #define TRANS_OPT_UPDATE_SHALLOW "updateshallow"
 
+/* Send push certificates */
+#define TRANS_OPT_PUSH_CERT "pushcert"
+
 /**
  * Returns 0 if the option was used, non-zero otherwise. Prints a
  * message to stderr if the option is not used.
diff --git a/tree-diff.c b/tree-diff.c
index 11c3550..e7b378c 100644
--- a/tree-diff.c
+++ b/tree-diff.c
@@ -6,121 +6,293 @@
 #include "diffcore.h"
 #include "tree.h"
 
-static void show_entry(struct diff_options *opt, const char *prefix,
-		       struct tree_desc *desc, struct strbuf *base);
+/*
+ * internal mode marker, saying a tree entry != entry of tp[imin]
+ * (see ll_diff_tree_paths for what it means there)
+ *
+ * we will update/use/emit entry for diff only with it unset.
+ */
+#define S_IFXMIN_NEQ	S_DIFFTREE_IFXMIN_NEQ
 
-static int compare_tree_entry(struct tree_desc *t1, struct tree_desc *t2,
-			      struct strbuf *base, struct diff_options *opt)
+
+static struct combine_diff_path *ll_diff_tree_paths(
+	struct combine_diff_path *p, const unsigned char *sha1,
+	const unsigned char **parents_sha1, int nparent,
+	struct strbuf *base, struct diff_options *opt);
+static int ll_diff_tree_sha1(const unsigned char *old, const unsigned char *new,
+			     struct strbuf *base, struct diff_options *opt);
+
+/*
+ * Compare two tree entries, taking into account only path/S_ISDIR(mode),
+ * but not their sha1's.
+ *
+ * NOTE files and directories *always* compare differently, even when having
+ *      the same name - thanks to base_name_compare().
+ *
+ * NOTE empty (=invalid) descriptor(s) take part in comparison as +infty,
+ *      so that they sort *after* valid tree entries.
+ *
+ *      Due to this convention, if trees are scanned in sorted order, all
+ *      non-empty descriptors will be processed first.
+ */
+static int tree_entry_pathcmp(struct tree_desc *t1, struct tree_desc *t2)
 {
-	unsigned mode1, mode2;
-	const char *path1, *path2;
-	const unsigned char *sha1, *sha2;
-	int cmp, pathlen1, pathlen2;
-	int old_baselen = base->len;
+	struct name_entry *e1, *e2;
+	int cmp;
 
-	sha1 = tree_entry_extract(t1, &path1, &mode1);
-	sha2 = tree_entry_extract(t2, &path2, &mode2);
-
-	pathlen1 = tree_entry_len(&t1->entry);
-	pathlen2 = tree_entry_len(&t2->entry);
-	cmp = base_name_compare(path1, pathlen1, mode1, path2, pathlen2, mode2);
-	if (cmp < 0) {
-		show_entry(opt, "-", t1, base);
+	/* empty descriptors sort after valid tree entries */
+	if (!t1->size)
+		return t2->size ? 1 : 0;
+	else if (!t2->size)
 		return -1;
-	}
-	if (cmp > 0) {
-		show_entry(opt, "+", t2, base);
-		return 1;
-	}
-	if (!DIFF_OPT_TST(opt, FIND_COPIES_HARDER) && !hashcmp(sha1, sha2) && mode1 == mode2)
-		return 0;
 
-	/*
-	 * If the filemode has changed to/from a directory from/to a regular
-	 * file, we need to consider it a remove and an add.
-	 */
-	if (S_ISDIR(mode1) != S_ISDIR(mode2)) {
-		show_entry(opt, "-", t1, base);
-		show_entry(opt, "+", t2, base);
-		return 0;
-	}
-
-	strbuf_add(base, path1, pathlen1);
-	if (DIFF_OPT_TST(opt, RECURSIVE) && S_ISDIR(mode1)) {
-		if (DIFF_OPT_TST(opt, TREE_IN_RECURSIVE)) {
-			opt->change(opt, mode1, mode2,
-				    sha1, sha2, 1, 1, base->buf, 0, 0);
-		}
-		strbuf_addch(base, '/');
-		diff_tree_sha1(sha1, sha2, base->buf, opt);
-	} else {
-		opt->change(opt, mode1, mode2, sha1, sha2, 1, 1, base->buf, 0, 0);
-	}
-	strbuf_setlen(base, old_baselen);
-	return 0;
+	e1 = &t1->entry;
+	e2 = &t2->entry;
+	cmp = base_name_compare(e1->path, tree_entry_len(e1), e1->mode,
+				e2->path, tree_entry_len(e2), e2->mode);
+	return cmp;
 }
 
-/* A whole sub-tree went away or appeared */
-static void show_tree(struct diff_options *opt, const char *prefix,
-		      struct tree_desc *desc, struct strbuf *base)
+
+/*
+ * convert path -> opt->diff_*() callbacks
+ *
+ * emits diff to first parent only, and tells diff tree-walker that we are done
+ * with p and it can be freed.
+ */
+static int emit_diff_first_parent_only(struct diff_options *opt, struct combine_diff_path *p)
 {
-	enum interesting match = entry_not_interesting;
-	for (; desc->size; update_tree_entry(desc)) {
-		if (match != all_entries_interesting) {
-			match = tree_entry_interesting(&desc->entry, base, 0,
-						       &opt->pathspec);
-			if (match == all_entries_not_interesting)
-				break;
-			if (match == entry_not_interesting)
-				continue;
-		}
-		show_entry(opt, prefix, desc, base);
+	struct combine_diff_parent *p0 = &p->parent[0];
+	if (p->mode && p0->mode) {
+		opt->change(opt, p0->mode, p->mode, p0->sha1, p->sha1,
+			1, 1, p->path, 0, 0);
 	}
+	else {
+		const unsigned char *sha1;
+		unsigned int mode;
+		int addremove;
+
+		if (p->mode) {
+			addremove = '+';
+			sha1 = p->sha1;
+			mode = p->mode;
+		} else {
+			addremove = '-';
+			sha1 = p0->sha1;
+			mode = p0->mode;
+		}
+
+		opt->add_remove(opt, addremove, mode, sha1, 1, p->path, 0);
+	}
+
+	return 0;	/* we are done with p */
 }
 
-/* A file entry went away or appeared */
-static void show_entry(struct diff_options *opt, const char *prefix,
-		       struct tree_desc *desc, struct strbuf *base)
+
+/*
+ * Make a new combine_diff_path from path/mode/sha1
+ * and append it to paths list tail.
+ *
+ * Memory for created elements could be reused:
+ *
+ *	- if last->next == NULL, the memory is allocated;
+ *
+ *	- if last->next != NULL, it is assumed that p=last->next was returned
+ *	  earlier by this function, and p->next was *not* modified.
+ *	  The memory is then reused from p.
+ *
+ * so for clients,
+ *
+ * - if you do need to keep the element
+ *
+ *	p = path_appendnew(p, ...);
+ *	process(p);
+ *	p->next = NULL;
+ *
+ * - if you don't need to keep the element after processing
+ *
+ *	pprev = p;
+ *	p = path_appendnew(p, ...);
+ *	process(p);
+ *	p = pprev;
+ *	; don't forget to free tail->next in the end
+ *
+ * p->parent[] remains uninitialized.
+ */
+static struct combine_diff_path *path_appendnew(struct combine_diff_path *last,
+	int nparent, const struct strbuf *base, const char *path, int pathlen,
+	unsigned mode, const unsigned char *sha1)
+{
+	struct combine_diff_path *p;
+	int len = base->len + pathlen;
+	int alloclen = combine_diff_path_size(nparent, len);
+
+	/* if last->next is !NULL - it is a pre-allocated memory, we can reuse */
+	p = last->next;
+	if (p && (alloclen > (intptr_t)p->next)) {
+		free(p);
+		p = NULL;
+	}
+
+	if (!p) {
+		p = xmalloc(alloclen);
+
+		/*
+		 * until we go to it next round, .next holds how many bytes we
+		 * allocated (for faster realloc - we don't need copying old data).
+		 */
+		p->next = (struct combine_diff_path *)(intptr_t)alloclen;
+	}
+
+	last->next = p;
+
+	p->path = (char *)&(p->parent[nparent]);
+	memcpy(p->path, base->buf, base->len);
+	memcpy(p->path + base->len, path, pathlen);
+	p->path[len] = 0;
+	p->mode = mode;
+	hashcpy(p->sha1, sha1 ? sha1 : null_sha1);
+
+	return p;
+}
+
+/*
+ * new path should be added to combine diff
+ *
+ * 3 cases on how/when it should be called and behaves:
+ *
+ *	 t, !tp		-> path added, all parents lack it
+ *	!t,  tp		-> path removed from all parents
+ *	 t,  tp		-> path modified/added
+ *			   (M for tp[i]=tp[imin], A otherwise)
+ */
+static struct combine_diff_path *emit_path(struct combine_diff_path *p,
+	struct strbuf *base, struct diff_options *opt, int nparent,
+	struct tree_desc *t, struct tree_desc *tp,
+	int imin)
 {
 	unsigned mode;
 	const char *path;
-	const unsigned char *sha1 = tree_entry_extract(desc, &path, &mode);
-	int pathlen = tree_entry_len(&desc->entry);
+	const unsigned char *sha1;
+	int pathlen;
 	int old_baselen = base->len;
+	int i, isdir, recurse = 0, emitthis = 1;
 
-	strbuf_add(base, path, pathlen);
-	if (DIFF_OPT_TST(opt, RECURSIVE) && S_ISDIR(mode)) {
-		enum object_type type;
-		struct tree_desc inner;
-		void *tree;
-		unsigned long size;
+	/* at least something has to be valid */
+	assert(t || tp);
 
-		tree = read_sha1_file(sha1, &type, &size);
-		if (!tree || type != OBJ_TREE)
-			die("corrupt tree sha %s", sha1_to_hex(sha1));
+	if (t) {
+		/* path present in resulting tree */
+		sha1 = tree_entry_extract(t, &path, &mode);
+		pathlen = tree_entry_len(&t->entry);
+		isdir = S_ISDIR(mode);
+	} else {
+		/*
+		 * a path was removed - take path from imin parent. Also take
+		 * mode from that parent, to decide on recursion(1).
+		 *
+		 * 1) all modes for tp[i]=tp[imin] should be the same wrt
+		 *    S_ISDIR, thanks to base_name_compare().
+		 */
+		tree_entry_extract(&tp[imin], &path, &mode);
+		pathlen = tree_entry_len(&tp[imin].entry);
 
-		if (DIFF_OPT_TST(opt, TREE_IN_RECURSIVE))
-			opt->add_remove(opt, *prefix, mode, sha1, 1, base->buf, 0);
+		isdir = S_ISDIR(mode);
+		sha1 = NULL;
+		mode = 0;
+	}
 
+	if (DIFF_OPT_TST(opt, RECURSIVE) && isdir) {
+		recurse = 1;
+		emitthis = DIFF_OPT_TST(opt, TREE_IN_RECURSIVE);
+	}
+
+	if (emitthis) {
+		int keep;
+		struct combine_diff_path *pprev = p;
+		p = path_appendnew(p, nparent, base, path, pathlen, mode, sha1);
+
+		for (i = 0; i < nparent; ++i) {
+			/*
+			 * tp[i] is valid, if present and if tp[i]==tp[imin] -
+			 * otherwise, we should ignore it.
+			 */
+			int tpi_valid = tp && !(tp[i].entry.mode & S_IFXMIN_NEQ);
+
+			const unsigned char *sha1_i;
+			unsigned mode_i;
+
+			p->parent[i].status =
+				!t ? DIFF_STATUS_DELETED :
+					tpi_valid ?
+						DIFF_STATUS_MODIFIED :
+						DIFF_STATUS_ADDED;
+
+			if (tpi_valid) {
+				sha1_i = tp[i].entry.sha1;
+				mode_i = tp[i].entry.mode;
+			}
+			else {
+				sha1_i = NULL;
+				mode_i = 0;
+			}
+
+			p->parent[i].mode = mode_i;
+			hashcpy(p->parent[i].sha1, sha1_i ? sha1_i : null_sha1);
+		}
+
+		keep = 1;
+		if (opt->pathchange)
+			keep = opt->pathchange(opt, p);
+
+		/*
+		 * If a path was filtered or consumed - we don't need to add it
+		 * to the list and can reuse its memory, leaving it as
+		 * pre-allocated element on the tail.
+		 *
+		 * On the other hand, if path needs to be kept, we need to
+		 * correct its .next to NULL, as it was pre-initialized to how
+		 * much memory was allocated.
+		 *
+		 * see path_appendnew() for details.
+		 */
+		if (!keep)
+			p = pprev;
+		else
+			p->next = NULL;
+	}
+
+	if (recurse) {
+		const unsigned char **parents_sha1;
+
+		parents_sha1 = xalloca(nparent * sizeof(parents_sha1[0]));
+		for (i = 0; i < nparent; ++i) {
+			/* same rule as in emitthis */
+			int tpi_valid = tp && !(tp[i].entry.mode & S_IFXMIN_NEQ);
+
+			parents_sha1[i] = tpi_valid ? tp[i].entry.sha1
+						    : NULL;
+		}
+
+		strbuf_add(base, path, pathlen);
 		strbuf_addch(base, '/');
-
-		init_tree_desc(&inner, tree, size);
-		show_tree(opt, prefix, &inner, base);
-		free(tree);
-	} else
-		opt->add_remove(opt, prefix[0], mode, sha1, 1, base->buf, 0);
+		p = ll_diff_tree_paths(p, sha1, parents_sha1, nparent, base, opt);
+		xalloca_free(parents_sha1);
+	}
 
 	strbuf_setlen(base, old_baselen);
+	return p;
 }
 
 static void skip_uninteresting(struct tree_desc *t, struct strbuf *base,
-			       struct diff_options *opt,
-			       enum interesting *match)
+			       struct diff_options *opt)
 {
+	enum interesting match;
+
 	while (t->size) {
-		*match = tree_entry_interesting(&t->entry, base, 0, &opt->pathspec);
-		if (*match) {
-			if (*match == all_entries_not_interesting)
+		match = tree_entry_interesting(&t->entry, base, 0, &opt->pathspec);
+		if (match) {
+			if (match == all_entries_not_interesting)
 				t->size = 0;
 			break;
 		}
@@ -128,55 +300,260 @@
 	}
 }
 
-int diff_tree(struct tree_desc *t1, struct tree_desc *t2,
-	      const char *base_str, struct diff_options *opt)
+
+/*
+ * generate paths for combined diff D(sha1,parents_sha1[])
+ *
+ * Resulting paths are appended to combine_diff_path linked list, and also, are
+ * emitted on the go via opt->pathchange() callback, so it is possible to
+ * process the result as batch or incrementally.
+ *
+ * The paths are generated scanning new tree and all parents trees
+ * simultaneously, similarly to what diff_tree() was doing for 2 trees.
+ * The theory behind such scan is as follows:
+ *
+ *
+ * D(T,P1...Pn) calculation scheme
+ * -------------------------------
+ *
+ * D(T,P1...Pn) = D(T,P1) ^ ... ^ D(T,Pn)	(regarding resulting paths set)
+ *
+ *	D(T,Pj)		- diff between T..Pj
+ *	D(T,P1...Pn)	- combined diff from T to parents P1,...,Pn
+ *
+ *
+ * We start from all trees, which are sorted, and compare their entries in
+ * lock-step:
+ *
+ *	 T     P1       Pn
+ *	 -     -        -
+ *	|t|   |p1|     |pn|
+ *	|-|   |--| ... |--|      imin = argmin(p1...pn)
+ *	| |   |  |     |  |
+ *	|-|   |--|     |--|
+ *	|.|   |. |     |. |
+ *	 .     .        .
+ *	 .     .        .
+ *
+ * at any time there could be 3 cases:
+ *
+ *	1)  t < p[imin];
+ *	2)  t > p[imin];
+ *	3)  t = p[imin].
+ *
+ * Schematic deduction of what every case means, and what to do, follows:
+ *
+ * 1)  t < p[imin]  ->  ∀j t ∉ Pj  ->  "+t" ∈ D(T,Pj)  ->  D += "+t";  t↓
+ *
+ * 2)  t > p[imin]
+ *
+ *     2.1) ∃j: pj > p[imin]  ->  "-p[imin]" ∉ D(T,Pj)  ->  D += ø;  ∀ pi=p[imin]  pi↓
+ *     2.2) ∀i  pi = p[imin]  ->  pi ∉ T  ->  "-pi" ∈ D(T,Pi)  ->  D += "-p[imin]";  ∀i pi↓
+ *
+ * 3)  t = p[imin]
+ *
+ *     3.1) ∃j: pj > p[imin]  ->  "+t" ∈ D(T,Pj)  ->  only pi=p[imin] remains to investigate
+ *     3.2) pi = p[imin]  ->  investigate δ(t,pi)
+ *      |
+ *      |
+ *      v
+ *
+ *     3.1+3.2) looking at δ(t,pi) ∀i: pi=p[imin] - if all != ø  ->
+ *
+ *                       ⎧δ(t,pi)  - if pi=p[imin]
+ *              ->  D += ⎨
+ *                       ⎩"+t"     - if pi>p[imin]
+ *
+ *
+ *     in any case t↓  ∀ pi=p[imin]  pi↓
+ *
+ *
+ * ~~~~~~~~
+ *
+ * NOTE
+ *
+ *	Usual diff D(A,B) is by definition the same as combined diff D(A,[B]),
+ *	so this diff paths generator can, and is used, for plain diffs
+ *	generation too.
+ *
+ *	Please keep attention to the common D(A,[B]) case when working on the
+ *	code, in order not to slow it down.
+ *
+ * NOTE
+ *	nparent must be > 0.
+ */
+
+
+/* ∀ pi=p[imin]  pi↓ */
+static inline void update_tp_entries(struct tree_desc *tp, int nparent)
 {
-	struct strbuf base;
-	int baselen = strlen(base_str);
-	enum interesting t1_match = entry_not_interesting;
-	enum interesting t2_match = entry_not_interesting;
+	int i;
+	for (i = 0; i < nparent; ++i)
+		if (!(tp[i].entry.mode & S_IFXMIN_NEQ))
+			update_tree_entry(&tp[i]);
+}
+
+static struct combine_diff_path *ll_diff_tree_paths(
+	struct combine_diff_path *p, const unsigned char *sha1,
+	const unsigned char **parents_sha1, int nparent,
+	struct strbuf *base, struct diff_options *opt)
+{
+	struct tree_desc t, *tp;
+	void *ttree, **tptree;
+	int i;
+
+	tp     = xalloca(nparent * sizeof(tp[0]));
+	tptree = xalloca(nparent * sizeof(tptree[0]));
+
+	/*
+	 * load parents first, as they are probably already cached.
+	 *
+	 * ( log_tree_diff() parses commit->parent before calling here via
+	 *   diff_tree_sha1(parent, commit) )
+	 */
+	for (i = 0; i < nparent; ++i)
+		tptree[i] = fill_tree_descriptor(&tp[i], parents_sha1[i]);
+	ttree = fill_tree_descriptor(&t, sha1);
 
 	/* Enable recursion indefinitely */
 	opt->pathspec.recursive = DIFF_OPT_TST(opt, RECURSIVE);
 
-	strbuf_init(&base, PATH_MAX);
-	strbuf_add(&base, base_str, baselen);
-
 	for (;;) {
+		int imin, cmp;
+
 		if (diff_can_quit_early(opt))
 			break;
+
 		if (opt->pathspec.nr) {
-			skip_uninteresting(t1, &base, opt, &t1_match);
-			skip_uninteresting(t2, &base, opt, &t2_match);
+			skip_uninteresting(&t, base, opt);
+			for (i = 0; i < nparent; i++)
+				skip_uninteresting(&tp[i], base, opt);
 		}
-		if (!t1->size) {
-			if (!t2->size)
+
+		/* comparing is finished when all trees are done */
+		if (!t.size) {
+			int done = 1;
+			for (i = 0; i < nparent; ++i)
+				if (tp[i].size) {
+					done = 0;
+					break;
+				}
+			if (done)
 				break;
-			show_entry(opt, "+", t2, &base);
-			update_tree_entry(t2);
-			continue;
 		}
-		if (!t2->size) {
-			show_entry(opt, "-", t1, &base);
-			update_tree_entry(t1);
-			continue;
+
+		/*
+		 * lookup imin = argmin(p1...pn),
+		 * mark entries whether they =p[imin] along the way
+		 */
+		imin = 0;
+		tp[0].entry.mode &= ~S_IFXMIN_NEQ;
+
+		for (i = 1; i < nparent; ++i) {
+			cmp = tree_entry_pathcmp(&tp[i], &tp[imin]);
+			if (cmp < 0) {
+				imin = i;
+				tp[i].entry.mode &= ~S_IFXMIN_NEQ;
+			}
+			else if (cmp == 0) {
+				tp[i].entry.mode &= ~S_IFXMIN_NEQ;
+			}
+			else {
+				tp[i].entry.mode |= S_IFXMIN_NEQ;
+			}
 		}
-		switch (compare_tree_entry(t1, t2, &base, opt)) {
-		case -1:
-			update_tree_entry(t1);
-			continue;
-		case 0:
-			update_tree_entry(t1);
-			/* Fallthrough */
-		case 1:
-			update_tree_entry(t2);
-			continue;
+
+		/* fixup markings for entries before imin */
+		for (i = 0; i < imin; ++i)
+			tp[i].entry.mode |= S_IFXMIN_NEQ;	/* pi > p[imin] */
+
+
+
+		/* compare t vs p[imin] */
+		cmp = tree_entry_pathcmp(&t, &tp[imin]);
+
+		/* t = p[imin] */
+		if (cmp == 0) {
+			/* are either pi > p[imin] or diff(t,pi) != ø ? */
+			if (!DIFF_OPT_TST(opt, FIND_COPIES_HARDER)) {
+				for (i = 0; i < nparent; ++i) {
+					/* p[i] > p[imin] */
+					if (tp[i].entry.mode & S_IFXMIN_NEQ)
+						continue;
+
+					/* diff(t,pi) != ø */
+					if (hashcmp(t.entry.sha1, tp[i].entry.sha1) ||
+					    (t.entry.mode != tp[i].entry.mode))
+						continue;
+
+					goto skip_emit_t_tp;
+				}
+			}
+
+			/* D += {δ(t,pi) if pi=p[imin];  "+a" if pi > p[imin]} */
+			p = emit_path(p, base, opt, nparent,
+					&t, tp, imin);
+
+		skip_emit_t_tp:
+			/* t↓,  ∀ pi=p[imin]  pi↓ */
+			update_tree_entry(&t);
+			update_tp_entries(tp, nparent);
 		}
-		die("git diff-tree: internal error");
+
+		/* t < p[imin] */
+		else if (cmp < 0) {
+			/* D += "+t" */
+			p = emit_path(p, base, opt, nparent,
+					&t, /*tp=*/NULL, -1);
+
+			/* t↓ */
+			update_tree_entry(&t);
+		}
+
+		/* t > p[imin] */
+		else {
+			/* ∀i pi=p[imin] -> D += "-p[imin]" */
+			if (!DIFF_OPT_TST(opt, FIND_COPIES_HARDER)) {
+				for (i = 0; i < nparent; ++i)
+					if (tp[i].entry.mode & S_IFXMIN_NEQ)
+						goto skip_emit_tp;
+			}
+
+			p = emit_path(p, base, opt, nparent,
+					/*t=*/NULL, tp, imin);
+
+		skip_emit_tp:
+			/* ∀ pi=p[imin]  pi↓ */
+			update_tp_entries(tp, nparent);
+		}
 	}
 
-	strbuf_release(&base);
-	return 0;
+	free(ttree);
+	for (i = nparent-1; i >= 0; i--)
+		free(tptree[i]);
+	xalloca_free(tptree);
+	xalloca_free(tp);
+
+	return p;
+}
+
+struct combine_diff_path *diff_tree_paths(
+	struct combine_diff_path *p, const unsigned char *sha1,
+	const unsigned char **parents_sha1, int nparent,
+	struct strbuf *base, struct diff_options *opt)
+{
+	p = ll_diff_tree_paths(p, sha1, parents_sha1, nparent, base, opt);
+
+	/*
+	 * free pre-allocated last element, if any
+	 * (see path_appendnew() for details about why)
+	 */
+	if (p->next) {
+		free(p->next);
+		p->next = NULL;
+	}
+
+	return p;
 }
 
 /*
@@ -190,7 +567,7 @@
 		!DIFF_FILE_VALID(diff_queued_diff.queue[0]->one);
 }
 
-static void try_to_follow_renames(struct tree_desc *t1, struct tree_desc *t2, const char *base, struct diff_options *opt)
+static void try_to_follow_renames(const unsigned char *old, const unsigned char *new, struct strbuf *base, struct diff_options *opt)
 {
 	struct diff_options diff_opts;
 	struct diff_queue_struct *q = &diff_queued_diff;
@@ -228,7 +605,7 @@
 	diff_opts.break_opt = opt->break_opt;
 	diff_opts.rename_score = opt->rename_score;
 	diff_setup_done(&diff_opts);
-	diff_tree(t1, t2, base, &diff_opts);
+	ll_diff_tree_sha1(old, new, base, &diff_opts);
 	diffcore_std(&diff_opts);
 	free_pathspec(&diff_opts.pathspec);
 
@@ -287,25 +664,40 @@
 	q->nr = 1;
 }
 
-int diff_tree_sha1(const unsigned char *old, const unsigned char *new, const char *base, struct diff_options *opt)
+static int ll_diff_tree_sha1(const unsigned char *old, const unsigned char *new,
+			     struct strbuf *base, struct diff_options *opt)
 {
-	void *tree1, *tree2;
-	struct tree_desc t1, t2;
-	unsigned long size1, size2;
+	struct combine_diff_path phead, *p;
+	pathchange_fn_t pathchange_old = opt->pathchange;
+
+	phead.next = NULL;
+	opt->pathchange = emit_diff_first_parent_only;
+	diff_tree_paths(&phead, new, &old, 1, base, opt);
+
+	for (p = phead.next; p;) {
+		struct combine_diff_path *pprev = p;
+		p = p->next;
+		free(pprev);
+	}
+
+	opt->pathchange = pathchange_old;
+	return 0;
+}
+
+int diff_tree_sha1(const unsigned char *old, const unsigned char *new, const char *base_str, struct diff_options *opt)
+{
+	struct strbuf base;
 	int retval;
 
-	tree1 = fill_tree_descriptor(&t1, old);
-	tree2 = fill_tree_descriptor(&t2, new);
-	size1 = t1.size;
-	size2 = t2.size;
-	retval = diff_tree(&t1, &t2, base, opt);
-	if (!*base && DIFF_OPT_TST(opt, FOLLOW_RENAMES) && diff_might_be_rename()) {
-		init_tree_desc(&t1, tree1, size1);
-		init_tree_desc(&t2, tree2, size2);
-		try_to_follow_renames(&t1, &t2, base, opt);
-	}
-	free(tree1);
-	free(tree2);
+	strbuf_init(&base, PATH_MAX);
+	strbuf_addstr(&base, base_str);
+
+	retval = ll_diff_tree_sha1(old, new, &base, opt);
+	if (!*base_str && DIFF_OPT_TST(opt, FOLLOW_RENAMES) && diff_might_be_rename())
+		try_to_follow_renames(old, new, &base, opt);
+
+	strbuf_release(&base);
+
 	return retval;
 }
 
diff --git a/tree-walk.c b/tree-walk.c
index 4dc86c7..5dd9a71 100644
--- a/tree-walk.c
+++ b/tree-walk.c
@@ -144,16 +144,6 @@
 	struct tree_desc_skip *skip;
 };
 
-static int name_compare(const char *a, int a_len,
-			const char *b, int b_len)
-{
-	int len = (a_len < b_len) ? a_len : b_len;
-	int cmp = memcmp(a, b, len);
-	if (cmp)
-		return cmp;
-	return (a_len - b_len);
-}
-
 static int check_entry_match(const char *a, int a_len, const char *b, int b_len)
 {
 	/*
diff --git a/unicode_width.h b/unicode_width.h
new file mode 100644
index 0000000..47cdd23
--- /dev/null
+++ b/unicode_width.h
@@ -0,0 +1,323 @@
+static const struct interval zero_width[] = {
+{ 0x0300, 0x036F },
+{ 0x0483, 0x0489 },
+{ 0x0591, 0x05BD },
+{ 0x05BF, 0x05BF },
+{ 0x05C1, 0x05C2 },
+{ 0x05C4, 0x05C5 },
+{ 0x05C7, 0x05C7 },
+{ 0x0600, 0x0605 },
+{ 0x0610, 0x061A },
+{ 0x061C, 0x061C },
+{ 0x064B, 0x065F },
+{ 0x0670, 0x0670 },
+{ 0x06D6, 0x06DD },
+{ 0x06DF, 0x06E4 },
+{ 0x06E7, 0x06E8 },
+{ 0x06EA, 0x06ED },
+{ 0x070F, 0x070F },
+{ 0x0711, 0x0711 },
+{ 0x0730, 0x074A },
+{ 0x07A6, 0x07B0 },
+{ 0x07EB, 0x07F3 },
+{ 0x0816, 0x0819 },
+{ 0x081B, 0x0823 },
+{ 0x0825, 0x0827 },
+{ 0x0829, 0x082D },
+{ 0x0859, 0x085B },
+{ 0x08E4, 0x0902 },
+{ 0x093A, 0x093A },
+{ 0x093C, 0x093C },
+{ 0x0941, 0x0948 },
+{ 0x094D, 0x094D },
+{ 0x0951, 0x0957 },
+{ 0x0962, 0x0963 },
+{ 0x0981, 0x0981 },
+{ 0x09BC, 0x09BC },
+{ 0x09C1, 0x09C4 },
+{ 0x09CD, 0x09CD },
+{ 0x09E2, 0x09E3 },
+{ 0x0A01, 0x0A02 },
+{ 0x0A3C, 0x0A3C },
+{ 0x0A41, 0x0A42 },
+{ 0x0A47, 0x0A48 },
+{ 0x0A4B, 0x0A4D },
+{ 0x0A51, 0x0A51 },
+{ 0x0A70, 0x0A71 },
+{ 0x0A75, 0x0A75 },
+{ 0x0A81, 0x0A82 },
+{ 0x0ABC, 0x0ABC },
+{ 0x0AC1, 0x0AC5 },
+{ 0x0AC7, 0x0AC8 },
+{ 0x0ACD, 0x0ACD },
+{ 0x0AE2, 0x0AE3 },
+{ 0x0B01, 0x0B01 },
+{ 0x0B3C, 0x0B3C },
+{ 0x0B3F, 0x0B3F },
+{ 0x0B41, 0x0B44 },
+{ 0x0B4D, 0x0B4D },
+{ 0x0B56, 0x0B56 },
+{ 0x0B62, 0x0B63 },
+{ 0x0B82, 0x0B82 },
+{ 0x0BC0, 0x0BC0 },
+{ 0x0BCD, 0x0BCD },
+{ 0x0C00, 0x0C00 },
+{ 0x0C3E, 0x0C40 },
+{ 0x0C46, 0x0C48 },
+{ 0x0C4A, 0x0C4D },
+{ 0x0C55, 0x0C56 },
+{ 0x0C62, 0x0C63 },
+{ 0x0C81, 0x0C81 },
+{ 0x0CBC, 0x0CBC },
+{ 0x0CBF, 0x0CBF },
+{ 0x0CC6, 0x0CC6 },
+{ 0x0CCC, 0x0CCD },
+{ 0x0CE2, 0x0CE3 },
+{ 0x0D01, 0x0D01 },
+{ 0x0D41, 0x0D44 },
+{ 0x0D4D, 0x0D4D },
+{ 0x0D62, 0x0D63 },
+{ 0x0DCA, 0x0DCA },
+{ 0x0DD2, 0x0DD4 },
+{ 0x0DD6, 0x0DD6 },
+{ 0x0E31, 0x0E31 },
+{ 0x0E34, 0x0E3A },
+{ 0x0E47, 0x0E4E },
+{ 0x0EB1, 0x0EB1 },
+{ 0x0EB4, 0x0EB9 },
+{ 0x0EBB, 0x0EBC },
+{ 0x0EC8, 0x0ECD },
+{ 0x0F18, 0x0F19 },
+{ 0x0F35, 0x0F35 },
+{ 0x0F37, 0x0F37 },
+{ 0x0F39, 0x0F39 },
+{ 0x0F71, 0x0F7E },
+{ 0x0F80, 0x0F84 },
+{ 0x0F86, 0x0F87 },
+{ 0x0F8D, 0x0F97 },
+{ 0x0F99, 0x0FBC },
+{ 0x0FC6, 0x0FC6 },
+{ 0x102D, 0x1030 },
+{ 0x1032, 0x1037 },
+{ 0x1039, 0x103A },
+{ 0x103D, 0x103E },
+{ 0x1058, 0x1059 },
+{ 0x105E, 0x1060 },
+{ 0x1071, 0x1074 },
+{ 0x1082, 0x1082 },
+{ 0x1085, 0x1086 },
+{ 0x108D, 0x108D },
+{ 0x109D, 0x109D },
+{ 0x1160, 0x11FF },
+{ 0x135D, 0x135F },
+{ 0x1712, 0x1714 },
+{ 0x1732, 0x1734 },
+{ 0x1752, 0x1753 },
+{ 0x1772, 0x1773 },
+{ 0x17B4, 0x17B5 },
+{ 0x17B7, 0x17BD },
+{ 0x17C6, 0x17C6 },
+{ 0x17C9, 0x17D3 },
+{ 0x17DD, 0x17DD },
+{ 0x180B, 0x180E },
+{ 0x18A9, 0x18A9 },
+{ 0x1920, 0x1922 },
+{ 0x1927, 0x1928 },
+{ 0x1932, 0x1932 },
+{ 0x1939, 0x193B },
+{ 0x1A17, 0x1A18 },
+{ 0x1A1B, 0x1A1B },
+{ 0x1A56, 0x1A56 },
+{ 0x1A58, 0x1A5E },
+{ 0x1A60, 0x1A60 },
+{ 0x1A62, 0x1A62 },
+{ 0x1A65, 0x1A6C },
+{ 0x1A73, 0x1A7C },
+{ 0x1A7F, 0x1A7F },
+{ 0x1AB0, 0x1ABE },
+{ 0x1B00, 0x1B03 },
+{ 0x1B34, 0x1B34 },
+{ 0x1B36, 0x1B3A },
+{ 0x1B3C, 0x1B3C },
+{ 0x1B42, 0x1B42 },
+{ 0x1B6B, 0x1B73 },
+{ 0x1B80, 0x1B81 },
+{ 0x1BA2, 0x1BA5 },
+{ 0x1BA8, 0x1BA9 },
+{ 0x1BAB, 0x1BAD },
+{ 0x1BE6, 0x1BE6 },
+{ 0x1BE8, 0x1BE9 },
+{ 0x1BED, 0x1BED },
+{ 0x1BEF, 0x1BF1 },
+{ 0x1C2C, 0x1C33 },
+{ 0x1C36, 0x1C37 },
+{ 0x1CD0, 0x1CD2 },
+{ 0x1CD4, 0x1CE0 },
+{ 0x1CE2, 0x1CE8 },
+{ 0x1CED, 0x1CED },
+{ 0x1CF4, 0x1CF4 },
+{ 0x1CF8, 0x1CF9 },
+{ 0x1DC0, 0x1DF5 },
+{ 0x1DFC, 0x1DFF },
+{ 0x200B, 0x200F },
+{ 0x202A, 0x202E },
+{ 0x2060, 0x2064 },
+{ 0x2066, 0x206F },
+{ 0x20D0, 0x20F0 },
+{ 0x2CEF, 0x2CF1 },
+{ 0x2D7F, 0x2D7F },
+{ 0x2DE0, 0x2DFF },
+{ 0x302A, 0x302D },
+{ 0x3099, 0x309A },
+{ 0xA66F, 0xA672 },
+{ 0xA674, 0xA67D },
+{ 0xA69F, 0xA69F },
+{ 0xA6F0, 0xA6F1 },
+{ 0xA802, 0xA802 },
+{ 0xA806, 0xA806 },
+{ 0xA80B, 0xA80B },
+{ 0xA825, 0xA826 },
+{ 0xA8C4, 0xA8C4 },
+{ 0xA8E0, 0xA8F1 },
+{ 0xA926, 0xA92D },
+{ 0xA947, 0xA951 },
+{ 0xA980, 0xA982 },
+{ 0xA9B3, 0xA9B3 },
+{ 0xA9B6, 0xA9B9 },
+{ 0xA9BC, 0xA9BC },
+{ 0xA9E5, 0xA9E5 },
+{ 0xAA29, 0xAA2E },
+{ 0xAA31, 0xAA32 },
+{ 0xAA35, 0xAA36 },
+{ 0xAA43, 0xAA43 },
+{ 0xAA4C, 0xAA4C },
+{ 0xAA7C, 0xAA7C },
+{ 0xAAB0, 0xAAB0 },
+{ 0xAAB2, 0xAAB4 },
+{ 0xAAB7, 0xAAB8 },
+{ 0xAABE, 0xAABF },
+{ 0xAAC1, 0xAAC1 },
+{ 0xAAEC, 0xAAED },
+{ 0xAAF6, 0xAAF6 },
+{ 0xABE5, 0xABE5 },
+{ 0xABE8, 0xABE8 },
+{ 0xABED, 0xABED },
+{ 0xFB1E, 0xFB1E },
+{ 0xFE00, 0xFE0F },
+{ 0xFE20, 0xFE2D },
+{ 0xFEFF, 0xFEFF },
+{ 0xFFF9, 0xFFFB },
+{ 0x101FD, 0x101FD },
+{ 0x102E0, 0x102E0 },
+{ 0x10376, 0x1037A },
+{ 0x10A01, 0x10A03 },
+{ 0x10A05, 0x10A06 },
+{ 0x10A0C, 0x10A0F },
+{ 0x10A38, 0x10A3A },
+{ 0x10A3F, 0x10A3F },
+{ 0x10AE5, 0x10AE6 },
+{ 0x11001, 0x11001 },
+{ 0x11038, 0x11046 },
+{ 0x1107F, 0x11081 },
+{ 0x110B3, 0x110B6 },
+{ 0x110B9, 0x110BA },
+{ 0x110BD, 0x110BD },
+{ 0x11100, 0x11102 },
+{ 0x11127, 0x1112B },
+{ 0x1112D, 0x11134 },
+{ 0x11173, 0x11173 },
+{ 0x11180, 0x11181 },
+{ 0x111B6, 0x111BE },
+{ 0x1122F, 0x11231 },
+{ 0x11234, 0x11234 },
+{ 0x11236, 0x11237 },
+{ 0x112DF, 0x112DF },
+{ 0x112E3, 0x112EA },
+{ 0x11301, 0x11301 },
+{ 0x1133C, 0x1133C },
+{ 0x11340, 0x11340 },
+{ 0x11366, 0x1136C },
+{ 0x11370, 0x11374 },
+{ 0x114B3, 0x114B8 },
+{ 0x114BA, 0x114BA },
+{ 0x114BF, 0x114C0 },
+{ 0x114C2, 0x114C3 },
+{ 0x115B2, 0x115B5 },
+{ 0x115BC, 0x115BD },
+{ 0x115BF, 0x115C0 },
+{ 0x11633, 0x1163A },
+{ 0x1163D, 0x1163D },
+{ 0x1163F, 0x11640 },
+{ 0x116AB, 0x116AB },
+{ 0x116AD, 0x116AD },
+{ 0x116B0, 0x116B5 },
+{ 0x116B7, 0x116B7 },
+{ 0x16AF0, 0x16AF4 },
+{ 0x16B30, 0x16B36 },
+{ 0x16F8F, 0x16F92 },
+{ 0x1BC9D, 0x1BC9E },
+{ 0x1BCA0, 0x1BCA3 },
+{ 0x1D167, 0x1D169 },
+{ 0x1D173, 0x1D182 },
+{ 0x1D185, 0x1D18B },
+{ 0x1D1AA, 0x1D1AD },
+{ 0x1D242, 0x1D244 },
+{ 0x1E8D0, 0x1E8D6 },
+{ 0xE0001, 0xE0001 },
+{ 0xE0020, 0xE007F },
+{ 0xE0100, 0xE01EF }
+};
+static const struct interval double_width[] = {
+{ /* plane */ 0x0, 0x1C },
+{ /* plane */ 0x1C, 0x21 },
+{ /* plane */ 0x21, 0x22 },
+{ /* plane */ 0x22, 0x23 },
+{ /* plane */ 0x0, 0x0 },
+{ /* plane */ 0x0, 0x0 },
+{ /* plane */ 0x0, 0x0 },
+{ /* plane */ 0x0, 0x0 },
+{ /* plane */ 0x0, 0x0 },
+{ /* plane */ 0x0, 0x0 },
+{ /* plane */ 0x0, 0x0 },
+{ /* plane */ 0x0, 0x0 },
+{ /* plane */ 0x0, 0x0 },
+{ /* plane */ 0x0, 0x0 },
+{ /* plane */ 0x0, 0x0 },
+{ /* plane */ 0x0, 0x0 },
+{ /* plane */ 0x0, 0x0 },
+{ 0x1100, 0x115F },
+{ 0x2329, 0x232A },
+{ 0x2E80, 0x2E99 },
+{ 0x2E9B, 0x2EF3 },
+{ 0x2F00, 0x2FD5 },
+{ 0x2FF0, 0x2FFB },
+{ 0x3000, 0x303E },
+{ 0x3041, 0x3096 },
+{ 0x3099, 0x30FF },
+{ 0x3105, 0x312D },
+{ 0x3131, 0x318E },
+{ 0x3190, 0x31BA },
+{ 0x31C0, 0x31E3 },
+{ 0x31F0, 0x321E },
+{ 0x3220, 0x3247 },
+{ 0x3250, 0x32FE },
+{ 0x3300, 0x4DBF },
+{ 0x4E00, 0xA48C },
+{ 0xA490, 0xA4C6 },
+{ 0xA960, 0xA97C },
+{ 0xAC00, 0xD7A3 },
+{ 0xF900, 0xFAFF },
+{ 0xFE10, 0xFE19 },
+{ 0xFE30, 0xFE52 },
+{ 0xFE54, 0xFE66 },
+{ 0xFE68, 0xFE6B },
+{ 0xFF01, 0xFF60 },
+{ 0xFFE0, 0xFFE6 },
+{ 0x1B000, 0x1B001 },
+{ 0x1F200, 0x1F202 },
+{ 0x1F210, 0x1F23A },
+{ 0x1F240, 0x1F248 },
+{ 0x1F250, 0x1F251 },
+{ 0x20000, 0x2FFFD },
+{ 0x30000, 0x3FFFD }
+};
diff --git a/unix-socket.c b/unix-socket.c
index 01f119f..19ed48b 100644
--- a/unix-socket.c
+++ b/unix-socket.c
@@ -18,12 +18,12 @@
 }
 
 struct unix_sockaddr_context {
-	char orig_dir[PATH_MAX];
+	char *orig_dir;
 };
 
 static void unix_sockaddr_cleanup(struct unix_sockaddr_context *ctx)
 {
-	if (!ctx->orig_dir[0])
+	if (!ctx->orig_dir)
 		return;
 	/*
 	 * If we fail, we can't just return an error, since we have
@@ -32,6 +32,7 @@
 	 */
 	if (chdir(ctx->orig_dir) < 0)
 		die("unable to restore original working directory");
+	free(ctx->orig_dir);
 }
 
 static int unix_sockaddr_init(struct sockaddr_un *sa, const char *path,
@@ -39,10 +40,11 @@
 {
 	int size = strlen(path) + 1;
 
-	ctx->orig_dir[0] = '\0';
+	ctx->orig_dir = NULL;
 	if (size > sizeof(sa->sun_path)) {
 		const char *slash = find_last_dir_sep(path);
 		const char *dir;
+		struct strbuf cwd = STRBUF_INIT;
 
 		if (!slash) {
 			errno = ENAMETOOLONG;
@@ -56,11 +58,9 @@
 			errno = ENAMETOOLONG;
 			return -1;
 		}
-
-		if (!getcwd(ctx->orig_dir, sizeof(ctx->orig_dir))) {
-			errno = ENAMETOOLONG;
+		if (strbuf_getcwd(&cwd))
 			return -1;
-		}
+		ctx->orig_dir = strbuf_detach(&cwd, NULL);
 		if (chdir_len(dir, slash - dir) < 0)
 			return -1;
 	}
@@ -99,11 +99,12 @@
 	struct sockaddr_un sa;
 	struct unix_sockaddr_context ctx;
 
+	unlink(path);
+
 	if (unix_sockaddr_init(&sa, path, &ctx) < 0)
 		return -1;
 	fd = unix_stream_socket();
 
-	unlink(path);
 	if (bind(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0)
 		goto fail;
 
diff --git a/unpack-trees.c b/unpack-trees.c
index 97fc995..629c658 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -8,6 +8,7 @@
 #include "progress.h"
 #include "refs.h"
 #include "attr.h"
+#include "split-index.h"
 
 /*
  * Error messages expected by scripts out of plumbing commands such as
@@ -56,17 +57,15 @@
 	int i;
 	const char **msgs = opts->msgs;
 	const char *msg;
-	char *tmp;
 	const char *cmd2 = strcmp(cmd, "checkout") ? cmd : "switch branches";
+
 	if (advice_commit_before_merge)
 		msg = "Your local changes to the following files would be overwritten by %s:\n%%s"
 			"Please, commit your changes or stash them before you can %s.";
 	else
 		msg = "Your local changes to the following files would be overwritten by %s:\n%%s";
-	tmp = xmalloc(strlen(msg) + strlen(cmd) + strlen(cmd2) - 2);
-	sprintf(tmp, msg, cmd, cmd2);
-	msgs[ERROR_WOULD_OVERWRITE] = tmp;
-	msgs[ERROR_NOT_UPTODATE_FILE] = tmp;
+	msgs[ERROR_WOULD_OVERWRITE] = msgs[ERROR_NOT_UPTODATE_FILE] =
+		xstrfmt(msg, cmd, cmd2);
 
 	msgs[ERROR_NOT_UPTODATE_DIR] =
 		"Updating the following directories would lose untracked files in it:\n%s";
@@ -76,12 +75,9 @@
 			"Please move or remove them before you can %s.";
 	else
 		msg = "The following untracked working tree files would be %s by %s:\n%%s";
-	tmp = xmalloc(strlen(msg) + strlen(cmd) + strlen("removed") + strlen(cmd2) - 4);
-	sprintf(tmp, msg, "removed", cmd, cmd2);
-	msgs[ERROR_WOULD_LOSE_UNTRACKED_REMOVED] = tmp;
-	tmp = xmalloc(strlen(msg) + strlen(cmd) + strlen("overwritten") + strlen(cmd2) - 4);
-	sprintf(tmp, msg, "overwritten", cmd, cmd2);
-	msgs[ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN] = tmp;
+
+	msgs[ERROR_WOULD_LOSE_UNTRACKED_REMOVED] = xstrfmt(msg, "removed", cmd, cmd2);
+	msgs[ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN] = xstrfmt(msg, "overwritten", cmd, cmd2);
 
 	/*
 	 * Special case: ERROR_BIND_OVERLAP refers to a pair of paths, we
@@ -246,7 +242,9 @@
 				enum unpack_trees_error_types,
 				struct unpack_trees_options *o);
 
-static int apply_sparse_checkout(struct cache_entry *ce, struct unpack_trees_options *o)
+static int apply_sparse_checkout(struct index_state *istate,
+				 struct cache_entry *ce,
+				 struct unpack_trees_options *o)
 {
 	int was_skip_worktree = ce_skip_worktree(ce);
 
@@ -254,6 +252,10 @@
 		ce->ce_flags |= CE_SKIP_WORKTREE;
 	else
 		ce->ce_flags &= ~CE_SKIP_WORKTREE;
+	if (was_skip_worktree != ce_skip_worktree(ce)) {
+		ce->ce_flags |= CE_UPDATE_IN_BASE;
+		istate->cache_changed |= CE_ENTRY_CHANGED;
+	}
 
 	/*
 	 * if (!was_skip_worktree && !ce_skip_worktree()) {
@@ -622,17 +624,6 @@
 	return -1;
 }
 
-/* NEEDSWORK: give this a better name and share with tree-walk.c */
-static int name_compare(const char *a, int a_len,
-			const char *b, int b_len)
-{
-	int len = (a_len < b_len) ? a_len : b_len;
-	int cmp = memcmp(a, b, len);
-	if (cmp)
-		return cmp;
-	return (a_len - b_len);
-}
-
 /*
  * The tree traversal is looking at name p.  If we have a matching entry,
  * return it.  If name p is a directory in the index, do not return
@@ -1025,6 +1016,7 @@
 	state.force = 1;
 	state.quiet = 1;
 	state.refresh_cache = 1;
+	state.istate = &o->result;
 
 	memset(&el, 0, sizeof(el));
 	if (!core_apply_sparse_checkout || !o->update)
@@ -1041,6 +1033,10 @@
 	o->result.timestamp.sec = o->src_index->timestamp.sec;
 	o->result.timestamp.nsec = o->src_index->timestamp.nsec;
 	o->result.version = o->src_index->version;
+	o->result.split_index = o->src_index->split_index;
+	if (o->result.split_index)
+		o->result.split_index->refcount++;
+	hashcpy(o->result.sha1, o->src_index->sha1);
 	o->merge_size = len;
 	mark_all_ce_unused(o->src_index);
 
@@ -1131,7 +1127,7 @@
 				ret = -1;
 			}
 
-			if (apply_sparse_checkout(ce, o)) {
+			if (apply_sparse_checkout(&o->result, ce, o)) {
 				if (!o->show_all_errors)
 					goto return_failed;
 				ret = -1;
@@ -1180,7 +1176,8 @@
 static int reject_merge(const struct cache_entry *ce,
 			struct unpack_trees_options *o)
 {
-	return add_rejected_path(o, ERROR_WOULD_OVERWRITE, ce->name);
+	return o->gently ? -1 :
+		add_rejected_path(o, ERROR_WOULD_OVERWRITE, ce->name);
 }
 
 static int same(const struct cache_entry *a, const struct cache_entry *b)
@@ -1259,7 +1256,7 @@
 			       struct unpack_trees_options *o)
 {
 	if (ce)
-		cache_tree_invalidate_path(o->src_index->cache_tree, ce->name);
+		cache_tree_invalidate_path(o->src_index, ce->name);
 }
 
 /*
@@ -1635,7 +1632,7 @@
 	/* #14, #14ALT, #2ALT */
 	if (remote && !df_conflict_head && head_match && !remote_match) {
 		if (index && !same(index, remote) && !same(index, head))
-			return o->gently ? -1 : reject_merge(index, o);
+			return reject_merge(index, o);
 		return merged_entry(remote, index, o);
 	}
 	/*
@@ -1643,7 +1640,7 @@
 	 * make sure that it matches head.
 	 */
 	if (index && !same(index, head))
-		return o->gently ? -1 : reject_merge(index, o);
+		return reject_merge(index, o);
 
 	if (head) {
 		/* #5ALT, #15 */
@@ -1772,9 +1769,8 @@
 				else
 					return merged_entry(newtree, current, o);
 			}
-			return o->gently ? -1 : reject_merge(current, o);
-		}
-		else if ((!oldtree && !newtree) || /* 4 and 5 */
+			return reject_merge(current, o);
+		} else if ((!oldtree && !newtree) || /* 4 and 5 */
 			 (!oldtree && newtree &&
 			  same(current, newtree)) || /* 6 and 7 */
 			 (oldtree && newtree &&
@@ -1783,26 +1779,15 @@
 			  !same(oldtree, newtree) && /* 18 and 19 */
 			  same(current, newtree))) {
 			return keep_entry(current, o);
-		}
-		else if (oldtree && !newtree && same(current, oldtree)) {
+		} else if (oldtree && !newtree && same(current, oldtree)) {
 			/* 10 or 11 */
 			return deleted_entry(oldtree, current, o);
-		}
-		else if (oldtree && newtree &&
+		} else if (oldtree && newtree &&
 			 same(current, oldtree) && !same(current, newtree)) {
 			/* 20 or 21 */
 			return merged_entry(newtree, current, o);
-		}
-		else {
-			/* all other failures */
-			if (oldtree)
-				return o->gently ? -1 : reject_merge(oldtree, o);
-			if (current)
-				return o->gently ? -1 : reject_merge(current, o);
-			if (newtree)
-				return o->gently ? -1 : reject_merge(newtree, o);
-			return -1;
-		}
+		} else
+			return reject_merge(current, o);
 	}
 	else if (newtree) {
 		if (oldtree && !o->initial_checkout) {
diff --git a/update_unicode.sh b/update_unicode.sh
new file mode 100755
index 0000000..000b937
--- /dev/null
+++ b/update_unicode.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+#See http://www.unicode.org/reports/tr44/
+#
+#Me Enclosing_Mark  an enclosing combining mark
+#Mn Nonspacing_Mark a nonspacing combining mark (zero advance width)
+#Cf Format          a format control character
+#
+UNICODEWIDTH_H=../unicode_width.h
+if ! test -d unicode; then
+	mkdir unicode
+fi &&
+( cd unicode &&
+	if ! test -f UnicodeData.txt; then
+		wget http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt
+	fi &&
+	if ! test -f EastAsianWidth.txt; then
+		wget http://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txt
+	fi &&
+	if ! test -d uniset; then
+		git clone https://github.com/depp/uniset.git
+	fi &&
+	(
+		cd uniset &&
+		if ! test -x uniset; then
+			autoreconf -i &&
+			./configure --enable-warnings=-Werror CFLAGS='-O0 -ggdb'
+		fi &&
+		make
+	) &&
+	echo "static const struct interval zero_width[] = {" >$UNICODEWIDTH_H &&
+	UNICODE_DIR=. ./uniset/uniset --32 cat:Me,Mn,Cf + U+1160..U+11FF - U+00AD |
+	grep -v plane >>$UNICODEWIDTH_H &&
+	echo "};" >>$UNICODEWIDTH_H &&
+	echo "static const struct interval double_width[] = {" >>$UNICODEWIDTH_H &&
+	UNICODE_DIR=. ./uniset/uniset --32 eaw:F,W >>$UNICODEWIDTH_H &&
+	echo "};" >>$UNICODEWIDTH_H
+)
diff --git a/upload-pack.c b/upload-pack.c
index 01de944..ac9ac15 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -80,7 +80,7 @@
 
 static void create_pack_file(void)
 {
-	struct child_process pack_objects;
+	struct child_process pack_objects = CHILD_PROCESS_INIT;
 	char data[8193], progress[128];
 	char abort_msg[] = "aborting due to possible repository "
 		"corruption on the remote side.";
@@ -108,7 +108,6 @@
 		argv[arg++] = "--include-tag";
 	argv[arg++] = NULL;
 
-	memset(&pack_objects, 0, sizeof(pack_objects));
 	pack_objects.in = -1;
 	pack_objects.out = -1;
 	pack_objects.err = -1;
@@ -167,7 +166,9 @@
 		if (!pollsize)
 			break;
 
-		ret = poll(pfd, pollsize, 1000 * keepalive);
+		ret = poll(pfd, pollsize,
+			keepalive < 0 ? -1 : 1000 * keepalive);
+
 		if (ret < 0) {
 			if (errno != EINTR) {
 				error("poll failed, resuming: %s",
@@ -448,7 +449,7 @@
 	static const char *argv[] = {
 		"rev-list", "--stdin", NULL,
 	};
-	static struct child_process cmd;
+	static struct child_process cmd = CHILD_PROCESS_INIT;
 	struct object *o;
 	char namebuf[42]; /* ^ + SHA-1 + LF */
 	int i;
@@ -743,7 +744,7 @@
 
 	if ((flag & REF_ISSYMREF) == 0)
 		return 0;
-	symref_target = resolve_ref_unsafe(refname, unused, 0, &flag);
+	symref_target = resolve_ref_unsafe(refname, 0, unused, &flag);
 	if (!symref_target || (flag & REF_ISSYMREF) == 0)
 		die("'%s' is a symref but it is not?", refname);
 	item = string_list_append(cb_data, refname);
diff --git a/url.c b/url.c
index 335d97d..7ca2a69 100644
--- a/url.c
+++ b/url.c
@@ -121,7 +121,7 @@
 {
 	strbuf_addstr(buf, url);
 	if (buf->len && buf->buf[buf->len - 1] != '/')
-		strbuf_addstr(buf, "/");
+		strbuf_addch(buf, '/');
 }
 
 void str_end_url_with_slash(const char *url, char **dest) {
diff --git a/urlmatch.c b/urlmatch.c
index ec87cba..618d216 100644
--- a/urlmatch.c
+++ b/urlmatch.c
@@ -43,11 +43,11 @@
 		from_len--;
 		if (ch == '%') {
 			if (from_len < 2 ||
-			    !isxdigit((unsigned char)from[0]) ||
-			    !isxdigit((unsigned char)from[1]))
+			    !isxdigit(from[0]) ||
+			    !isxdigit(from[1]))
 				return 0;
-			ch = hexval_table[(unsigned char)*from++] << 4;
-			ch |= hexval_table[(unsigned char)*from++];
+			ch = hexval(*from++) << 4;
+			ch |= hexval(*from++);
 			from_len -= 2;
 			was_esc = 1;
 		}
@@ -483,8 +483,7 @@
 	int user_matched = 0;
 	int retval;
 
-	key = skip_prefix(var, collect->section);
-	if (!key || *(key++) != '.') {
+	if (!skip_prefix(var, collect->section, &key) || *(key++) != '.') {
 		if (collect->cascade_fn)
 			return collect->cascade_fn(var, value, cb);
 		return 0; /* not interested */
diff --git a/utf8.c b/utf8.c
index 77c28d4..4541777 100644
--- a/utf8.c
+++ b/utf8.c
@@ -80,52 +80,8 @@
 {
 	/*
 	 * Sorted list of non-overlapping intervals of non-spacing characters,
-	 * generated by
-	 *   "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c".
 	 */
-	static const struct interval combining[] = {
-		{ 0x0300, 0x036F }, { 0x0483, 0x0489 }, { 0x0591, 0x05BD },
-		{ 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, { 0x05C4, 0x05C5 },
-		{ 0x05C7, 0x05C7 }, { 0x0600, 0x0604 }, { 0x0610, 0x061A },
-		{ 0x064B, 0x065F }, { 0x0670, 0x0670 }, { 0x06D6, 0x06E4 },
-		{ 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, { 0x070F, 0x070F },
-		{ 0x0711, 0x0711 }, { 0x0730, 0x074A }, { 0x07A6, 0x07B0 },
-		{ 0x0901, 0x0902 }, { 0x093C, 0x093C }, { 0x0941, 0x0948 },
-		{ 0x094D, 0x094D }, { 0x0951, 0x0954 }, { 0x0962, 0x0963 },
-		{ 0x0981, 0x0981 }, { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 },
-		{ 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 },
-		{ 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 },
-		{ 0x0A4B, 0x0A4D }, { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 },
-		{ 0x0ABC, 0x0ABC }, { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 },
-		{ 0x0ACD, 0x0ACD }, { 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 },
-		{ 0x0B3C, 0x0B3C }, { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 },
-		{ 0x0B4D, 0x0B4D }, { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 },
-		{ 0x0BC0, 0x0BC0 }, { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 },
-		{ 0x0C46, 0x0C48 }, { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 },
-		{ 0x0CBC, 0x0CBC }, { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 },
-		{ 0x0CCC, 0x0CCD }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D },
-		{ 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 },
-		{ 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E },
-		{ 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC },
-		{ 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 },
-		{ 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E },
-		{ 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 },
-		{ 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 },
-		{ 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 },
-		{ 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x1712, 0x1714 },
-		{ 0x1732, 0x1734 }, { 0x1752, 0x1753 }, { 0x1772, 0x1773 },
-		{ 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD }, { 0x17C6, 0x17C6 },
-		{ 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD }, { 0x180B, 0x180D },
-		{ 0x18A9, 0x18A9 }, { 0x1920, 0x1922 }, { 0x1927, 0x1928 },
-		{ 0x1932, 0x1932 }, { 0x1939, 0x193B }, { 0x200B, 0x200F },
-		{ 0x202A, 0x202E }, { 0x2060, 0x2063 }, { 0x206A, 0x206F },
-		{ 0x20D0, 0x20EA }, { 0x302A, 0x302F }, { 0x3099, 0x309A },
-		{ 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F }, { 0xFE20, 0xFE23 },
-		{ 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB }, { 0x1D167, 0x1D169 },
-		{ 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B },
-		{ 0x1D1AA, 0x1D1AD }, { 0xE0001, 0xE0001 },
-		{ 0xE0020, 0xE007F }, { 0xE0100, 0xE01EF }
-	};
+#include "unicode_width.h"
 
 	/* test for 8-bit control characters */
 	if (ch == 0)
@@ -134,34 +90,16 @@
 		return -1;
 
 	/* binary search in table of non-spacing characters */
-	if (bisearch(ch, combining, sizeof(combining)
+	if (bisearch(ch, zero_width, sizeof(zero_width)
 				/ sizeof(struct interval) - 1))
 		return 0;
 
-	/*
-	 * If we arrive here, ch is neither a combining nor a C0/C1
-	 * control character.
-	 */
+	/* binary search in table of double width characters */
+	if (bisearch(ch, double_width, sizeof(double_width)
+				/ sizeof(struct interval) - 1))
+		return 2;
 
-	return 1 +
-		(ch >= 0x1100 &&
-                    /* Hangul Jamo init. consonants */
-		 (ch <= 0x115f ||
-		  ch == 0x2329 || ch == 0x232a ||
-                  /* CJK ... Yi */
-		  (ch >= 0x2e80 && ch <= 0xa4cf &&
-		   ch != 0x303f) ||
-		  /* Hangul Syllables */
-		  (ch >= 0xac00 && ch <= 0xd7a3) ||
-		  /* CJK Compatibility Ideographs */
-		  (ch >= 0xf900 && ch <= 0xfaff) ||
-		  /* CJK Compatibility Forms */
-		  (ch >= 0xfe30 && ch <= 0xfe6f) ||
-		  /* Fullwidth Forms */
-		  (ch >= 0xff00 && ch <= 0xff60) ||
-		  (ch >= 0xffe0 && ch <= 0xffe6) ||
-		  (ch >= 0x20000 && ch <= 0x2fffd) ||
-		  (ch >= 0x30000 && ch <= 0x3fffd)));
+	return 1;
 }
 
 /*
@@ -301,13 +239,6 @@
 	return 1;
 }
 
-static void strbuf_addchars(struct strbuf *sb, int c, size_t n)
-{
-	strbuf_grow(sb, n);
-	memset(sb->buf + sb->len, c, n);
-	strbuf_setlen(sb, sb->len + n);
-}
-
 static void strbuf_add_indented_text(struct strbuf *buf, const char *text,
 				     int indent, int indent2)
 {
@@ -444,6 +375,9 @@
 			dst += n;
 		}
 
+		if (src >= end)
+			break;
+
 		old = src;
 		n = utf8_width((const char**)&src, NULL);
 		if (!src) 	/* broken utf-8, do nothing */
diff --git a/varint.c b/varint.c
index 4ed7729..409c497 100644
--- a/varint.c
+++ b/varint.c
@@ -1,3 +1,4 @@
+#include "git-compat-util.h"
 #include "varint.h"
 
 uintmax_t decode_varint(const unsigned char **bufp)
diff --git a/varint.h b/varint.h
index 0321195..c1c44d9 100644
--- a/varint.h
+++ b/varint.h
@@ -1,8 +1,6 @@
 #ifndef VARINT_H
 #define VARINT_H
 
-#include "git-compat-util.h"
-
 extern int encode_varint(uintmax_t, unsigned char *);
 extern uintmax_t decode_varint(const unsigned char **);
 
diff --git a/walker.c b/walker.c
index 1dd86b8..f149371 100644
--- a/walker.c
+++ b/walker.c
@@ -205,7 +205,7 @@
 	struct commit *commit = lookup_commit_reference_gently(sha1, 1);
 	if (commit) {
 		commit->object.flags |= COMPLETE;
-		commit_list_insert_by_date(commit, &complete);
+		commit_list_insert(commit, &complete);
 	}
 	return 0;
 }
@@ -228,8 +228,8 @@
 
 		if (targets >= targets_alloc) {
 			targets_alloc = targets_alloc ? targets_alloc * 2 : 64;
-			*target = xrealloc(*target, targets_alloc * sizeof(**target));
-			*write_ref = xrealloc(*write_ref, targets_alloc * sizeof(**write_ref));
+			REALLOC_ARRAY(*target, targets_alloc);
+			REALLOC_ARRAY(*write_ref, targets_alloc);
 		}
 		(*target)[targets] = xstrdup(tg_one);
 		(*write_ref)[targets] = rf_one ? xstrdup(rf_one) : NULL;
@@ -251,64 +251,75 @@
 int walker_fetch(struct walker *walker, int targets, char **target,
 		 const char **write_ref, const char *write_ref_log_details)
 {
-	struct ref_lock **lock = xcalloc(targets, sizeof(struct ref_lock *));
+	struct strbuf refname = STRBUF_INIT;
+	struct strbuf err = STRBUF_INIT;
+	struct ref_transaction *transaction = NULL;
 	unsigned char *sha1 = xmalloc(targets * 20);
-	char *msg;
-	int ret;
-	int i;
+	char *msg = NULL;
+	int i, ret = -1;
 
 	save_commit_buffer = 0;
 
-	for (i = 0; i < targets; i++) {
-		if (!write_ref || !write_ref[i])
-			continue;
-
-		lock[i] = lock_ref_sha1(write_ref[i], NULL);
-		if (!lock[i]) {
-			error("Can't lock ref %s", write_ref[i]);
-			goto unlock_and_fail;
+	if (write_ref) {
+		transaction = ref_transaction_begin(&err);
+		if (!transaction) {
+			error("%s", err.buf);
+			goto done;
 		}
 	}
 
-	if (!walker->get_recover)
+	if (!walker->get_recover) {
 		for_each_ref(mark_complete, NULL);
+		commit_list_sort_by_date(&complete);
+	}
 
 	for (i = 0; i < targets; i++) {
 		if (interpret_target(walker, target[i], &sha1[20 * i])) {
 			error("Could not interpret response from server '%s' as something to pull", target[i]);
-			goto unlock_and_fail;
+			goto done;
 		}
 		if (process(walker, lookup_unknown_object(&sha1[20 * i])))
-			goto unlock_and_fail;
+			goto done;
 	}
 
 	if (loop(walker))
-		goto unlock_and_fail;
-
+		goto done;
+	if (!write_ref) {
+		ret = 0;
+		goto done;
+	}
 	if (write_ref_log_details) {
-		msg = xmalloc(strlen(write_ref_log_details) + 12);
-		sprintf(msg, "fetch from %s", write_ref_log_details);
+		msg = xstrfmt("fetch from %s", write_ref_log_details);
 	} else {
 		msg = NULL;
 	}
 	for (i = 0; i < targets; i++) {
-		if (!write_ref || !write_ref[i])
+		if (!write_ref[i])
 			continue;
-		ret = write_ref_sha1(lock[i], &sha1[20 * i], msg ? msg : "fetch (unknown)");
-		lock[i] = NULL;
-		if (ret)
-			goto unlock_and_fail;
+		strbuf_reset(&refname);
+		strbuf_addf(&refname, "refs/%s", write_ref[i]);
+		if (ref_transaction_update(transaction, refname.buf,
+					   &sha1[20 * i], NULL, 0, 0,
+					   msg ? msg : "fetch (unknown)",
+					   &err)) {
+			error("%s", err.buf);
+			goto done;
+		}
 	}
+	if (ref_transaction_commit(transaction, &err)) {
+		error("%s", err.buf);
+		goto done;
+	}
+
+	ret = 0;
+
+done:
+	ref_transaction_free(transaction);
 	free(msg);
-
-	return 0;
-
-unlock_and_fail:
-	for (i = 0; i < targets; i++)
-		if (lock[i])
-			unlock_ref(lock[i]);
-
-	return -1;
+	free(sha1);
+	strbuf_release(&err);
+	strbuf_release(&refname);
+	return ret;
 }
 
 void walker_free(struct walker *walker)
diff --git a/wrapper.c b/wrapper.c
index bc1bfb8..007ec0d 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -9,16 +9,24 @@
 
 static void (*try_to_free_routine)(size_t size) = do_nothing;
 
-static void memory_limit_check(size_t size)
+static int memory_limit_check(size_t size, int gentle)
 {
-	static int limit = -1;
-	if (limit == -1) {
-		const char *env = getenv("GIT_ALLOC_LIMIT");
-		limit = env ? atoi(env) * 1024 : 0;
+	static size_t limit = 0;
+	if (!limit) {
+		limit = git_env_ulong("GIT_ALLOC_LIMIT", 0);
+		if (!limit)
+			limit = SIZE_MAX;
 	}
-	if (limit && size > limit)
-		die("attempting to allocate %"PRIuMAX" over limit %d",
-		    (intmax_t)size, limit);
+	if (size > limit) {
+		if (gentle) {
+			error("attempting to allocate %"PRIuMAX" over limit %"PRIuMAX,
+			      (uintmax_t)size, (uintmax_t)limit);
+			return -1;
+		} else
+			die("attempting to allocate %"PRIuMAX" over limit %"PRIuMAX,
+			    (uintmax_t)size, (uintmax_t)limit);
+	}
+	return 0;
 }
 
 try_to_free_t set_try_to_free_routine(try_to_free_t routine)
@@ -42,11 +50,12 @@
 	return ret;
 }
 
-void *xmalloc(size_t size)
+static void *do_xmalloc(size_t size, int gentle)
 {
 	void *ret;
 
-	memory_limit_check(size);
+	if (memory_limit_check(size, gentle))
+		return NULL;
 	ret = malloc(size);
 	if (!ret && !size)
 		ret = malloc(1);
@@ -55,9 +64,16 @@
 		ret = malloc(size);
 		if (!ret && !size)
 			ret = malloc(1);
-		if (!ret)
-			die("Out of memory, malloc failed (tried to allocate %lu bytes)",
-			    (unsigned long)size);
+		if (!ret) {
+			if (!gentle)
+				die("Out of memory, malloc failed (tried to allocate %lu bytes)",
+				    (unsigned long)size);
+			else {
+				error("Out of memory, malloc failed (tried to allocate %lu bytes)",
+				      (unsigned long)size);
+				return NULL;
+			}
+		}
 	}
 #ifdef XMALLOC_POISON
 	memset(ret, 0xA5, size);
@@ -65,16 +81,37 @@
 	return ret;
 }
 
-void *xmallocz(size_t size)
+void *xmalloc(size_t size)
+{
+	return do_xmalloc(size, 0);
+}
+
+static void *do_xmallocz(size_t size, int gentle)
 {
 	void *ret;
-	if (unsigned_add_overflows(size, 1))
-		die("Data too large to fit into virtual memory space.");
-	ret = xmalloc(size + 1);
-	((char*)ret)[size] = 0;
+	if (unsigned_add_overflows(size, 1)) {
+		if (gentle) {
+			error("Data too large to fit into virtual memory space.");
+			return NULL;
+		} else
+			die("Data too large to fit into virtual memory space.");
+	}
+	ret = do_xmalloc(size + 1, gentle);
+	if (ret)
+		((char*)ret)[size] = 0;
 	return ret;
 }
 
+void *xmallocz(size_t size)
+{
+	return do_xmallocz(size, 0);
+}
+
+void *xmallocz_gently(size_t size)
+{
+	return do_xmallocz(size, 1);
+}
+
 /*
  * xmemdupz() allocates (len + 1) bytes of memory, duplicates "len" bytes of
  * "data" to the allocated memory, zero terminates the allocated memory,
@@ -96,7 +133,7 @@
 {
 	void *ret;
 
-	memory_limit_check(size);
+	memory_limit_check(size, 0);
 	ret = realloc(ptr, size);
 	if (!ret && !size)
 		ret = realloc(ptr, 1);
@@ -115,7 +152,7 @@
 {
 	void *ret;
 
-	memory_limit_check(size * nmemb);
+	memory_limit_check(size * nmemb, 0);
 	ret = calloc(nmemb, size);
 	if (!ret && (!nmemb || !size))
 		ret = calloc(1, 1);
@@ -429,17 +466,29 @@
 
 static int warn_if_unremovable(const char *op, const char *file, int rc)
 {
-	if (rc < 0) {
-		int err = errno;
-		if (ENOENT != err) {
-			warning("unable to %s %s: %s",
-				op, file, strerror(errno));
-			errno = err;
-		}
-	}
+	int err;
+	if (!rc || errno == ENOENT)
+		return 0;
+	err = errno;
+	warning("unable to %s %s: %s", op, file, strerror(errno));
+	errno = err;
 	return rc;
 }
 
+int unlink_or_msg(const char *file, struct strbuf *err)
+{
+	int rc = unlink(file);
+
+	assert(err);
+
+	if (!rc || errno == ENOENT)
+		return 0;
+
+	strbuf_addf(err, "unable to unlink %s: %s",
+		    file, strerror(errno));
+	return -1;
+}
+
 int unlink_or_warn(const char *file)
 {
 	return warn_if_unremovable("unlink", file, unlink(file));
@@ -493,3 +542,11 @@
 		    errno ? strerror(errno) : _("no such user"));
 	return pw;
 }
+
+char *xgetcwd(void)
+{
+	struct strbuf sb = STRBUF_INIT;
+	if (strbuf_getcwd(&sb))
+		die_errno(_("unable to get current working directory"));
+	return strbuf_detach(&sb, NULL);
+}
diff --git a/write_or_die.c b/write_or_die.c
index b50f99a..e7afe7a 100644
--- a/write_or_die.c
+++ b/write_or_die.c
@@ -49,6 +49,21 @@
 	}
 }
 
+void fprintf_or_die(FILE *f, const char *fmt, ...)
+{
+	va_list ap;
+	int ret;
+
+	va_start(ap, fmt);
+	ret = vfprintf(f, fmt, ap);
+	va_end(ap);
+
+	if (ret < 0) {
+		check_pipe(errno);
+		die_errno("write error");
+	}
+}
+
 void fsync_or_die(int fd, const char *msg)
 {
 	if (fsync(fd) < 0) {
diff --git a/wt-status.c b/wt-status.c
index 86fec89..cdbc8d7 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -128,7 +128,7 @@
 	s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
 	s->use_color = -1;
 	s->relative_paths = 1;
-	s->branch = resolve_refdup("HEAD", sha1, 0, NULL);
+	s->branch = resolve_refdup("HEAD", 0, sha1, NULL);
 	s->reference = "HEAD";
 	s->fp = stdout;
 	s->index_file = get_index_file();
@@ -188,7 +188,7 @@
 	} else {
 		status_printf_ln(s, c, _("  (use \"git add/rm <file>...\" as appropriate to mark resolution)"));
 	}
-	status_printf_ln(s, c, "");
+	status_printf_ln(s, c, "%s", "");
 }
 
 static void wt_status_print_cached_header(struct wt_status *s)
@@ -204,7 +204,7 @@
 		status_printf_ln(s, c, _("  (use \"git reset %s <file>...\" to unstage)"), s->reference);
 	else
 		status_printf_ln(s, c, _("  (use \"git rm --cached <file>...\" to unstage)"));
-	status_printf_ln(s, c, "");
+	status_printf_ln(s, c, "%s", "");
 }
 
 static void wt_status_print_dirty_header(struct wt_status *s,
@@ -223,7 +223,7 @@
 	status_printf_ln(s, c, _("  (use \"git checkout -- <file>...\" to discard changes in working directory)"));
 	if (has_dirty_submodules)
 		status_printf_ln(s, c, _("  (commit or discard the untracked or modified content in submodules)"));
-	status_printf_ln(s, c, "");
+	status_printf_ln(s, c, "%s", "");
 }
 
 static void wt_status_print_other_header(struct wt_status *s,
@@ -235,12 +235,12 @@
 	if (!s->hints)
 		return;
 	status_printf_ln(s, c, _("  (use \"git %s <file>...\" to include in what will be committed)"), how);
-	status_printf_ln(s, c, "");
+	status_printf_ln(s, c, "%s", "");
 }
 
 static void wt_status_print_trailer(struct wt_status *s)
 {
-	status_printf_ln(s, color(WT_STATUS_HEADER, s), "");
+	status_printf_ln(s, color(WT_STATUS_HEADER, s), "%s", "");
 }
 
 #define quote_path quote_path_relative
@@ -574,14 +574,11 @@
 {
 	int i;
 	struct dir_struct dir;
-	struct timeval t_begin;
+	uint64_t t_begin = getnanotime();
 
 	if (!s->show_untracked_files)
 		return;
 
-	if (advice_status_u_option)
-		gettimeofday(&t_begin, NULL);
-
 	memset(&dir, 0, sizeof(dir));
 	if (s->show_untracked_files != SHOW_ALL_UNTRACKED_FILES)
 		dir.flags |=
@@ -612,13 +609,8 @@
 	free(dir.ignored);
 	clear_directory(&dir);
 
-	if (advice_status_u_option) {
-		struct timeval t_end;
-		gettimeofday(&t_end, NULL);
-		s->untracked_in_ms =
-			(uint64_t)t_end.tv_sec * 1000 + t_end.tv_usec / 1000 -
-			((uint64_t)t_begin.tv_sec * 1000 + t_begin.tv_usec / 1000);
-	}
+	if (advice_status_u_option)
+		s->untracked_in_ms = (getnanotime() - t_begin) / 1000000;
 }
 
 void wt_status_collect(struct wt_status *s)
@@ -733,32 +725,26 @@
 
 static void wt_status_print_submodule_summary(struct wt_status *s, int uncommitted)
 {
-	struct child_process sm_summary;
-	char summary_limit[64];
-	char index[PATH_MAX];
-	const char *env[] = { NULL, NULL };
+	struct child_process sm_summary = CHILD_PROCESS_INIT;
 	struct argv_array argv = ARGV_ARRAY_INIT;
 	struct strbuf cmd_stdout = STRBUF_INIT;
 	struct strbuf summary = STRBUF_INIT;
 	char *summary_content;
 	size_t len;
 
-	sprintf(summary_limit, "%d", s->submodule_summary);
-	snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", s->index_file);
+	argv_array_pushf(&sm_summary.env_array, "GIT_INDEX_FILE=%s",
+			 s->index_file);
 
-	env[0] = index;
 	argv_array_push(&argv, "submodule");
 	argv_array_push(&argv, "summary");
 	argv_array_push(&argv, uncommitted ? "--files" : "--cached");
 	argv_array_push(&argv, "--for-status");
 	argv_array_push(&argv, "--summary-limit");
-	argv_array_push(&argv, summary_limit);
+	argv_array_pushf(&argv, "%d", s->submodule_summary);
 	if (!uncommitted)
 		argv_array_push(&argv, s->amend ? "HEAD^" : "HEAD");
 
-	memset(&sm_summary, 0, sizeof(sm_summary));
 	sm_summary.argv = argv.argv;
-	sm_summary.env = env;
 	sm_summary.git_cmd = 1;
 	sm_summary.no_stdin = 1;
 	fflush(s->fp);
@@ -836,7 +822,7 @@
 	string_list_clear(&output, 0);
 	strbuf_release(&buf);
 conclude:
-	status_printf_ln(s, GIT_COLOR_NORMAL, "");
+	status_printf_ln(s, GIT_COLOR_NORMAL, "%s", "");
 }
 
 void wt_status_truncate_message_at_cut_line(struct strbuf *buf)
@@ -923,7 +909,7 @@
 		color_fprintf_ln(s->fp, color(WT_STATUS_HEADER, s), "%c",
 				 comment_line_char);
 	else
-		fprintf_ln(s->fp, "");
+		fputs("", s->fp);
 }
 
 static int has_unmerged(struct wt_status *s)
@@ -1339,7 +1325,7 @@
 				on_what = _("Not currently on any branch.");
 			}
 		}
-		status_printf(s, color(WT_STATUS_HEADER, s), "");
+		status_printf(s, color(WT_STATUS_HEADER, s), "%s", "");
 		status_printf_more(s, branch_status_color, "%s", on_what);
 		status_printf_more(s, branch_color, "%s\n", branch_name);
 		if (!s->is_initial)
@@ -1352,9 +1338,9 @@
 	free(state.detached_from);
 
 	if (s->is_initial) {
-		status_printf_ln(s, color(WT_STATUS_HEADER, s), "");
+		status_printf_ln(s, color(WT_STATUS_HEADER, s), "%s", "");
 		status_printf_ln(s, color(WT_STATUS_HEADER, s), _("Initial commit"));
-		status_printf_ln(s, color(WT_STATUS_HEADER, s), "");
+		status_printf_ln(s, color(WT_STATUS_HEADER, s), "%s", "");
 	}
 
 	wt_status_print_updated(s);
@@ -1371,7 +1357,7 @@
 		if (s->show_ignored_files)
 			wt_status_print_other(s, &s->ignored, _("Ignored files"), "add -f");
 		if (advice_status_u_option && 2000 < s->untracked_in_ms) {
-			status_printf_ln(s, GIT_COLOR_NORMAL, "");
+			status_printf_ln(s, GIT_COLOR_NORMAL, "%s", "");
 			status_printf_ln(s, GIT_COLOR_NORMAL,
 					 _("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"
diff --git a/xdiff/xmerge.c b/xdiff/xmerge.c
index 9e13b25..625198e 100644
--- a/xdiff/xmerge.c
+++ b/xdiff/xmerge.c
@@ -245,11 +245,11 @@
 					      dest ? dest + size : NULL);
 			/* Postimage from side #1 */
 			if (m->mode & 1)
-				size += xdl_recs_copy(xe1, m->i1, m->chg1, 1,
+				size += xdl_recs_copy(xe1, m->i1, m->chg1, (m->mode & 2),
 						      dest ? dest + size : NULL);
 			/* Postimage from side #2 */
 			if (m->mode & 2)
-				size += xdl_recs_copy(xe2, m->i2, m->chg2, 1,
+				size += xdl_recs_copy(xe2, m->i2, m->chg2, 0,
 						      dest ? dest + size : NULL);
 		} else
 			continue;