Merge branch 'jc/rev-parse-argh-dashed-multi-words'
authorJunio C Hamano <gitster@pobox.com>
Mon, 9 Jun 2014 18:26:49 +0000 (11:26 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 9 Jun 2014 18:26:49 +0000 (11:26 -0700)
"update-index --cacheinfo" in 2.0 crashes on a malformed command line.

* jc/rev-parse-argh-dashed-multi-words:
update-index: fix segfault with missing --cacheinfo argument

387 files changed:
.gitignore
Documentation/CodingGuidelines
Documentation/Makefile
Documentation/RelNotes/1.9.2.txt [new file with mode: 0644]
Documentation/RelNotes/1.9.3.txt [new file with mode: 0644]
Documentation/RelNotes/1.9.4.txt [new file with mode: 0644]
Documentation/RelNotes/2.0.0.txt
Documentation/RelNotes/2.1.0.txt [new file with mode: 0644]
Documentation/config.txt
Documentation/diff-config.txt
Documentation/diff-generate-patch.txt
Documentation/diff-options.txt
Documentation/everyday.txt
Documentation/git-add.txt
Documentation/git-am.txt
Documentation/git-bisect.txt
Documentation/git-commit.txt
Documentation/git-config.txt
Documentation/git-count-objects.txt
Documentation/git-daemon.txt
Documentation/git-diff.txt
Documentation/git-fast-import.txt
Documentation/git-gc.txt
Documentation/git-grep.txt
Documentation/git-help.txt
Documentation/git-http-backend.txt
Documentation/git-ls-files.txt
Documentation/git-merge.txt
Documentation/git-mergetool.txt
Documentation/git-prune.txt
Documentation/git-push.txt
Documentation/git-read-tree.txt
Documentation/git-reset.txt
Documentation/git-rev-parse.txt
Documentation/git-send-email.txt
Documentation/git-shell.txt
Documentation/git-show-branch.txt
Documentation/git-show-ref.txt
Documentation/git-status.txt
Documentation/git-submodule.txt
Documentation/git-svn.txt
Documentation/git-update-ref.txt
Documentation/git-web--browse.txt
Documentation/git.txt
Documentation/gitcli.txt
Documentation/gitk.txt
Documentation/gitmodules.txt
Documentation/gitweb.conf.txt
Documentation/howto-index.sh
Documentation/howto/keep-canonical-history-correct.txt [new file with mode: 0644]
Documentation/howto/rebase-from-internal-branch.txt
Documentation/howto/revert-a-faulty-merge.txt
Documentation/howto/revert-branch-rebase.txt
Documentation/howto/setup-git-server-over-http.txt
Documentation/install-webdoc.sh
Documentation/merge-options.txt
Documentation/merge-strategies.txt
Documentation/pretty-formats.txt
Documentation/pretty-options.txt
Documentation/rev-list-options.txt
Documentation/revisions.txt
Documentation/technical/api-builtin.txt
Documentation/technical/api-gitattributes.txt
Documentation/technical/api-hashmap.txt
Documentation/technical/api-parse-options.txt
Documentation/technical/api-strbuf.txt
Documentation/technical/http-protocol.txt
Documentation/technical/pack-protocol.txt
Documentation/technical/protocol-common.txt
Documentation/user-manual.txt
GIT-VERSION-GEN
Makefile
RelNotes
bisect.c
branch.c
builtin/add.c
builtin/apply.c
builtin/blame.c
builtin/cat-file.c
builtin/checkout.c
builtin/clean.c
builtin/clone.c
builtin/commit.c
builtin/gc.c
builtin/grep.c
builtin/index-pack.c
builtin/init-db.c
builtin/log.c
builtin/merge.c
builtin/mv.c
builtin/notes.c
builtin/pack-objects.c
builtin/reflog.c
builtin/rerere.c
builtin/reset.c
builtin/tag.c
builtin/update-ref.c
bundle.c
cache.h
check-builtins.sh
column.c
combine-diff.c
commit.c
commit.h
compat/gmtime.c [new file with mode: 0644]
compat/mmap.c
compat/poll/poll.c
compat/vcbuild/include/alloca.h [deleted file]
compat/vcbuild/scripts/clink.pl
compat/win32/alloca.h [new file with mode: 0644]
config.c
config.mak.uname
configure.ac
connect.c
contrib/completion/git-completion.bash
contrib/completion/git-completion.zsh
contrib/completion/git-prompt.sh
contrib/diffall/README [deleted file]
contrib/diffall/git-diffall [deleted file]
contrib/examples/builtin-fetch--tool.c
contrib/examples/git-checkout.sh
contrib/examples/git-clone.sh
contrib/examples/git-commit.sh
contrib/examples/git-fetch.sh
contrib/examples/git-ls-remote.sh
contrib/examples/git-merge.sh
contrib/examples/git-repack.sh
contrib/examples/git-reset.sh
contrib/examples/git-resolve.sh
contrib/examples/git-revert.sh
contrib/examples/git-tag.sh
contrib/fast-import/import-directories.perl
contrib/hooks/multimail/CHANGES [new file with mode: 0644]
contrib/hooks/multimail/README
contrib/hooks/multimail/README.Git
contrib/hooks/multimail/git_multimail.py
contrib/hooks/multimail/post-receive
contrib/mw-to-git/git-remote-mediawiki.perl
contrib/mw-to-git/t/install-wiki.sh
contrib/mw-to-git/t/t9360-mw-to-git-clone.sh
contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh
contrib/mw-to-git/t/t9363-mw-to-git-export-import.sh
contrib/mw-to-git/t/t9365-continuing-queries.sh
contrib/mw-to-git/t/test-gitmw-lib.sh
contrib/remote-helpers/Makefile [deleted file]
contrib/remote-helpers/README [new file with mode: 0644]
contrib/remote-helpers/git-remote-bzr
contrib/remote-helpers/git-remote-hg
contrib/remote-helpers/test-bzr.sh [deleted file]
contrib/remote-helpers/test-hg-bidi.sh [deleted file]
contrib/remote-helpers/test-hg-hg-git.sh [deleted file]
contrib/remote-helpers/test-hg.sh [deleted file]
contrib/subtree/Makefile
contrib/subtree/git-subtree.sh
contrib/subtree/t/t7900-subtree.sh
contrib/svn-fe/svn-fe.txt
contrib/svn-fe/svnrdump_sim.py
contrib/thunderbird-patch-inline/appp.sh
contrib/vim/README [deleted file]
date.c
delta.h
diff-no-index.c
diff.c
diff.h
diffcore-pickaxe.c
dir.c
entry.c
environment.c
ewah/ewah_bitmap.c
fetch-pack.c
fsck.c
git-add--interactive.perl
git-am.sh
git-compat-util.h
git-gui/git-gui.sh
git-mergetool.sh
git-p4.py
git-pull.sh
git-rebase--am.sh
git-rebase--interactive.sh
git-rebase--merge.sh
git-rebase.sh
git-remote-testgit.sh
git-request-pull.sh
git-send-email.perl
git-sh-setup.sh
git-stash.sh
git-submodule.sh
git-svn.perl
git-web--browse.sh
git.c
gitweb/gitweb.perl
grep.c
http-push.c
http.h
imap-send.c
list-objects.c
log-tree.c
merge-recursive.c
mergetools/gvimdiff3 [new file with mode: 0644]
mergetools/vimdiff
mergetools/vimdiff3 [new file with mode: 0644]
notes-cache.c
notes-utils.c
object.h
pack-bitmap.c
pager.c
parse-options.c
parse-options.h
perl/Git/SVN.pm
perl/Git/SVN/Log.pm
perl/Git/SVN/Migration.pm
pkt-line.h
po/bg.po
po/de.po
po/fr.po
po/git.pot
po/sv.po
po/vi.po
po/zh_CN.po
pretty.c
read-cache.c
refs.c
refs.h
remote.c
revision.c
revision.h
run-command.c
run-command.h
sequencer.c
setup.c
sha1_file.c
sha1_name.c
strbuf.c
t/Makefile
t/check-non-portable-shell.pl
t/lib-credential.sh
t/lib-cvs.sh
t/lib-gpg.sh
t/lib-terminal.sh
t/perf/p5302-pack-index.sh
t/t0001-init.sh
t/t0010-racy-git.sh
t/t0020-crlf.sh
t/t0025-crlf-auto.sh
t/t0026-eol-config.sh
t/t0030-stripspace.sh
t/t0040-parse-options.sh
t/t0300-credentials.sh
t/t1000-read-tree-m-3way.sh
t/t1001-read-tree-m-2way.sh
t/t1002-read-tree-m-u-2way.sh
t/t1003-read-tree-prefix.sh
t/t1004-read-tree-m-u-wf.sh
t/t1020-subdirectory.sh
t/t1050-large.sh
t/t1300-repo-config.sh
t/t1302-repo-version.sh
t/t1400-update-ref.sh
t/t1410-reflog.sh
t/t1507-rev-parse-upstream.sh
t/t1510-repo-setup.sh
t/t3032-merge-recursive-options.sh
t/t3200-branch.sh
t/t3301-notes.sh
t/t3400-rebase.sh
t/t3404-rebase-interactive.sh
t/t3413-rebase-hook.sh
t/t3508-cherry-pick-many-commits.sh
t/t3600-rm.sh
t/t3905-stash-include-untracked.sh
t/t3910-mac-os-precompose.sh
t/t4005-diff-rename-2.sh
t/t4006-diff-mode.sh
t/t4009-diff-rename-4.sh
t/t4010-diff-pathspec.sh
t/t4012-diff-binary.sh
t/t4013-diff-various.sh
t/t4014-format-patch.sh
t/t4018-diff-funcname.sh
t/t4018/README [new file with mode: 0644]
t/t4018/cpp-c++-function [new file with mode: 0644]
t/t4018/cpp-class-constructor [new file with mode: 0644]
t/t4018/cpp-class-constructor-mem-init [new file with mode: 0644]
t/t4018/cpp-class-definition [new file with mode: 0644]
t/t4018/cpp-class-definition-derived [new file with mode: 0644]
t/t4018/cpp-class-destructor [new file with mode: 0644]
t/t4018/cpp-function-returning-global-type [new file with mode: 0644]
t/t4018/cpp-function-returning-nested [new file with mode: 0644]
t/t4018/cpp-function-returning-pointer [new file with mode: 0644]
t/t4018/cpp-function-returning-reference [new file with mode: 0644]
t/t4018/cpp-gnu-style-function [new file with mode: 0644]
t/t4018/cpp-namespace-definition [new file with mode: 0644]
t/t4018/cpp-operator-definition [new file with mode: 0644]
t/t4018/cpp-skip-access-specifiers [new file with mode: 0644]
t/t4018/cpp-skip-comment-block [new file with mode: 0644]
t/t4018/cpp-skip-labels [new file with mode: 0644]
t/t4018/cpp-struct-definition [new file with mode: 0644]
t/t4018/cpp-struct-single-line [new file with mode: 0644]
t/t4018/cpp-template-function-definition [new file with mode: 0644]
t/t4018/cpp-union-definition [new file with mode: 0644]
t/t4018/cpp-void-c-function [new file with mode: 0644]
t/t4018/custom1-pattern [new file with mode: 0644]
t/t4018/custom2-match-to-end-of-line [new file with mode: 0644]
t/t4018/custom3-alternation-in-pattern [new file with mode: 0644]
t/t4018/java-class-member-function [new file with mode: 0644]
t/t4018/perl-skip-end-of-heredoc [new file with mode: 0644]
t/t4018/perl-skip-forward-decl [new file with mode: 0644]
t/t4018/perl-skip-sub-in-pod [new file with mode: 0644]
t/t4018/perl-sub-definition [new file with mode: 0644]
t/t4018/perl-sub-definition-kr-brace [new file with mode: 0644]
t/t4036-format-patch-signer-mime.sh
t/t4038-diff-combined.sh
t/t4057-diff-combined-paths.sh
t/t4107-apply-ignore-whitespace.sh
t/t4116-apply-reverse.sh
t/t4119-apply-config.sh
t/t4204-patch-id.sh
t/t4209-log-pickaxe.sh
t/t4212-log-corrupt.sh
t/t5000-tar-tree.sh
t/t5150-request-pull.sh
t/t5304-prune.sh
t/t5305-include-tag.sh
t/t5310-pack-bitmaps.sh
t/t5510-fetch.sh
t/t5537-fetch-shallow.sh
t/t5560-http-backend-noserver.sh
t/t5602-clone-remote-exec.sh
t/t5701-clone-local.sh
t/t5801-remote-helpers.sh
t/t6006-rev-list-format.sh
t/t6036-recursive-corner-cases.sh
t/t6039-merge-ignorecase.sh [new file with mode: 0755]
t/t7001-mv.sh
t/t7004-tag.sh
t/t7006-pager.sh
t/t7007-show.sh
t/t7104-reset-hard.sh
t/t7400-submodule-basic.sh
t/t7406-submodule-update.sh
t/t7500-commit.sh
t/t7501-commit.sh
t/t7502-commit.sh
t/t7505-prepare-commit-msg-hook.sh
t/t7508-status.sh
t/t7514-commit-patch.sh [new file with mode: 0755]
t/t7600-merge.sh
t/t7800-difftool.sh
t/t8003-blame-corner-cases.sh
t/t9107-git-svn-migrate.sh
t/t9114-git-svn-dcommit-merge.sh
t/t9116-git-svn-log.sh
t/t9117-git-svn-init-clone.sh
t/t9118-git-svn-funky-branch-names.sh
t/t9120-git-svn-clone-with-percent-escapes.sh
t/t9125-git-svn-multi-glob-branch-names.sh
t/t9128-git-svn-cmd-branch.sh
t/t9130-git-svn-authors-file.sh
t/t9135-git-svn-moved-branch-empty-file.sh
t/t9141-git-svn-multiple-branches.sh
t/t9145-git-svn-master-branch.sh
t/t9154-git-svn-fancy-glob.sh
t/t9155-git-svn-fetch-deleted-tag.sh
t/t9156-git-svn-fetch-deleted-tag-2.sh
t/t9161-git-svn-mergeinfo-push.sh
t/t9163-git-svn-reset-clears-caches.sh
t/t9165-git-svn-fetch-merge-branch-of-branch.sh
t/t9166-git-svn-fetch-merge-branch-of-branch2.sh
t/t9167-git-svn-cmd-branch-subproject.sh
t/t9400-git-cvsserver-server.sh
t/t9807-git-p4-submit.sh
t/t9903-bash-prompt.sh
t/test-lib.sh
test-chmtime.c
test-parse-options.c
transport-helper.c
tree-diff.c
unicode_width.h [new file with mode: 0644]
update_unicode.sh [new file with mode: 0755]
upload-pack.c
userdiff.c
utf8.c
walker.c
wrapper.c
wt-status.c
wt-status.h
index dc600f9b36d09f0668064e044520c7ce633f09d8..42294e59a1fcf5d744199b6a0feafd4ca6e3eda1 100644 (file)
 /config.mak.autogen
 /config.mak.append
 /configure
+/unicode
 /tags
 /TAGS
 /cscope*
index ed432a80ca62eeb6a75e08870d9c8f8eaf4ab6d8..4d90c77c7bd643b11df8d3094efe142493df53b9 100644 (file)
@@ -18,6 +18,14 @@ code.  For Git in general, three rough rules are:
    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 @@ For shell scripts specifically (not exhaustive):
 
  - 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 @@ For shell scripts specifically (not exhaustive):
    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,23 +107,42 @@ For shell scripts specifically (not exhaustive):
    "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\},
-   [::], [==], nor [..]) for portability.
+   [::], [==], or [..]) for portability.
 
    - We do not use \{m,n\};
 
    - We do not use -E;
 
-   - We do not use ? nor + (which are \{0,1\} and \{1,\}
+   - We do not use ? or + (which are \{0,1\} and \{1,\}
      respectively in BRE) but that goes without saying as these
      are ERE elements not BRE (note that \? and \+ are not even part
      of BRE -- making them accessible from BRE is a GNU extension).
@@ -106,6 +151,19 @@ For shell scripts specifically (not exhaustive):
    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 @@ For C programs:
    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
@@ -164,9 +222,101 @@ For C programs:
         * multi-line comment.
         */
 
+   Note however that a comment that explains a translatable string to
+   translators uses a convention of starting with a magic token
+   "TRANSLATORS: " immediately after the opening delimiter, even when
+   it spans multiple lines.  We do not add an asterisk at the beginning
+   of each line, either.  E.g.
+
+       /* TRANSLATORS: here is a comment that explains the string
+          to be translated, that follows immediately after it */
+       _("Here is a translatable string explained by the above.");
+
  - Double negation is often harder to understand than no negation
    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.
index fc6b2cf9ec0d2582b89d65ab6976275c4756bca5..cea0e7ae3db37dcd366e094abdd2a2f32514a247 100644 (file)
@@ -59,6 +59,7 @@ SP_ARTICLES += howto/recover-corrupted-blob-object
 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)
diff --git a/Documentation/RelNotes/1.9.2.txt b/Documentation/RelNotes/1.9.2.txt
new file mode 100644 (file)
index 0000000..47a34ca
--- /dev/null
@@ -0,0 +1,67 @@
+Git v1.9.2 Release Notes
+========================
+
+Fixes since v1.9.1
+------------------
+
+ * Documentation and in-code comments had many instances of mistaken
+   use of "nor", which have been corrected.
+
+ * "git fetch --prune", when the right-hand-side of multiple fetch
+   refspecs overlap (e.g. storing "refs/heads/*" to
+   "refs/remotes/origin/*", while storing "refs/frotz/*" to
+   "refs/remotes/origin/fr/*"), aggressively thought that lack of
+   "refs/heads/fr/otz" on the origin site meant we should remove
+   "refs/remotes/origin/fr/otz" from us, without checking their
+   "refs/frotz/otz" first.
+
+   Note that such a configuration is inherently unsafe (think what
+   should happen when "refs/heads/fr/otz" does appear on the origin
+   site), but that is not a reason not to be extra careful.
+
+ * "git update-ref --stdin" did not fail a request to create a ref
+   when the ref already existed.
+
+ * "git diff --no-index -Mq a b" fell into an infinite loop.
+
+ * When it is not necessary to edit a commit log message (e.g. "git
+   commit -m" is given a message without specifying "-e"), we used to
+   disable the spawning of the editor by overriding GIT_EDITOR, but
+   this means all the uses of the editor, other than to edit the
+   commit log message, are also affected.
+
+ * "git status --porcelain --branch" showed its output with labels
+   "ahead/behind/gone" translated to the user's locale.
+
+ * "git mv" that moves a submodule forgot to adjust the array that
+   uses to keep track of which submodules were to be moved to update
+   its configuration.
+
+ * Length limit for the pathname used when removing a path in a deep
+   subdirectory has been removed to avoid buffer overflows.
+
+ * The test helper lib-terminal always run an actual test_expect_*
+   when included, which screwed up with the use of skil-all that may
+   have to be done later.
+
+ * "git index-pack" used a wrong variable to name the keep-file in an
+   error message when the file cannot be written or closed.
+
+ * "rebase -i" produced a broken insn sheet when the title of a commit
+   happened to contain '\n' (or ended with '\c') due to a careless use
+   of 'echo'.
+
+ * There were a few instances of 'git-foo' remaining in the
+   documentation that should have been spelled 'git foo'.
+
+ * Serving objects from a shallow repository needs to write a
+   new file to hold the temporary shallow boundaries but it was not
+   cleaned when we exit due to die() or a signal.
+
+ * When "git stash pop" stops after failing to apply the stash
+   (e.g. due to conflicting changes), the stash is not dropped. State
+   that explicitly in the output to let the users know.
+
+ * The labels in "git status" output that describe the nature of
+   conflicts (e.g. "both deleted") were limited to 20 bytes, which was
+   too short for some l10n (e.g. fr).
diff --git a/Documentation/RelNotes/1.9.3.txt b/Documentation/RelNotes/1.9.3.txt
new file mode 100644 (file)
index 0000000..17b05ca
--- /dev/null
@@ -0,0 +1,21 @@
+Git v1.9.3 Release Notes
+========================
+
+Fixes since v1.9.2
+------------------
+
+ * "git p4" dealing with changes in binary files were broken by a
+   change in 1.9 release.
+
+ * The shell prompt script (in contrib/), when using the PROMPT_COMMAND
+   interface, used an unsafe construct when showing the branch name in
+   $PS1.
+
+ * "git rebase" used a POSIX shell construct FreeBSD /bin/sh does not
+   work well with.
+
+ * Some more Unicode codepoints defined in Unicode 6.3 as having
+   zero width have been taught to our display column counting logic.
+
+ * Some tests used shell constructs that did not work well on
+   FreeBSD.
diff --git a/Documentation/RelNotes/1.9.4.txt b/Documentation/RelNotes/1.9.4.txt
new file mode 100644 (file)
index 0000000..e1d1835
--- /dev/null
@@ -0,0 +1,16 @@
+Git v1.9.4 Release Notes
+========================
+
+Fixes since v1.9.3
+------------------
+
+ * Commands that take pathspecs on the command line misbehaved when
+   the pathspec is given as an absolute pathname (which is a
+   practice not particularly encouraged) that points at a symbolic
+   link in the working tree.
+
+ * An earlier fix to the shell prompt script (in contrib/) for using
+   the PROMPT_COMMAND interface did not correctly check if the extra
+   code path needs to trigger, causing the branch name not to appear
+   when 'promptvars' option is disabled in bash or PROMPT_SUBST is
+   unset in zsh.
index 5dc11f405f81d45df452dbb2400ffd00506f58d2..2617372a0c50391985b02595f43e148ff46df73f 100644 (file)
@@ -41,17 +41,50 @@ with "git diff-files --diff-filter=d").
 
 "git request-pull" lost a few "heuristics" that often led to mistakes.
 
+The default prefix for "git svn" has changed in Git 2.0.  For a long
+time, "git svn" created its remote-tracking branches directly under
+refs/remotes, but it now places them under refs/remotes/origin/ unless
+it is told otherwise with its "--prefix" option.
+
 
 Updates since v1.9 series
 -------------------------
 
 UI, Workflows & Features
 
+ * The "multi-mail" post-receive hook (in contrib/) has been updated
+   to a more recent version from upstream.
+
+ * The "remote-hg/bzr" remote-helper interfaces (used to be in
+   contrib/) are no more.  They are now maintained separately as
+   third-party plug-ins in their own repositories.
+
+ * "git gc --aggressive" learned "--depth" option and
+   "gc.aggressiveDepth" configuration variable to allow use of a less
+   insane depth than the built-in default value of 250.
+
+ * "git log" learned the "--show-linear-break" option to show where a
+   single strand-of-pearls is broken in its output.
+
+ * The "rev-parse --parseopt" mechanism used by scripted Porcelains to
+   parse command-line options and to give help text learned to take
+   the argv-help (the placeholder string for an option parameter,
+   e.g. "key-id" in "--gpg-sign=<key-id>").
+
+ * The pattern to find where the function begins in C/C++ used in
+   "diff" and "grep -p" has been updated to improve viewing C++
+   sources.
+
+ * "git rebase" learned to interpret a lone "-" as "@{-1}", the
+   branch that we were previously on.
+
+ * "git commit --cleanup=<mode>" learned a new mode, scissors.
+
  * "git tag --list" output can be sorted using "version sort" with
    "--sort=version:refname".
 
  * Discard the accumulated "heuristics" to guess from which branch the
-   result wants to be pulled from and make sure what the end user
+   result wants to be pulled from and make sure that what the end user
    specified is not second-guessed by "git request-pull", to avoid
    mistakes.  When you pushed out your 'master' branch to your public
    repository as 'for-linus', use the new "master:for-linus" syntax to
@@ -60,9 +93,9 @@ UI, Workflows & Features
  * "git grep" learned to behave in a way similar to native grep when
    "-h" (no header) and "-c" (count) options are given.
 
- * transport-helper, fast-import and fast-export have been updated to
-   allow the ref mapping and ref deletion in a way similar to the
-   natively supported transports.
+ * "git push" via transport-helper interface has been updated to
+   allow forced ref updates in a way similar to the natively
+   supported transports.
 
  * The "simple" mode is the default for "git push".
 
@@ -70,7 +103,7 @@ UI, Workflows & Features
    tree-wide operation even when run inside a subdirectory of a
    working tree.
 
- * "git add <path> is the same as "git add -A <path>" now.
+ * "git add <path>" is the same as "git add -A <path>" now.
 
  * "core.statinfo" configuration variable, which is a
    never-advertised synonym to "core.checkstat", has been removed.
@@ -86,55 +119,53 @@ UI, Workflows & Features
  * The progress indicators from various time-consuming commands have
    been marked for i18n/l10n.
 
- * "git notes -C <blob>" diagnoses an attempt to use an object that
-   is not a blob as an error.
+ * "git notes -C <blob>" diagnoses as an error an attempt to use an
+   object that is not a blob.
 
  * "git config" learned to read from the standard input when "-" is
    given as the value to its "--file" parameter (attempting an
-   operation to update the configuration in the standard input of
-   course is rejected).
+   operation to update the configuration in the standard input is
+   rejected, of course).
 
  * Trailing whitespaces in .gitignore files, unless they are quoted
    for fnmatch(3), e.g. "path\ ", are warned and ignored.  Strictly
-   speaking, this is a backward incompatible change, but very unlikely
+   speaking, this is a backward-incompatible change, but very unlikely
    to bite any sane user and adjusting should be obvious and easy.
 
- * Many commands that create commits, e.g. "pull", "rebase",
-   learned to take the --gpg-sign option on the command line.
+ * Many commands that create commits, e.g. "pull" and "rebase",
+   learned to take the "--gpg-sign" option on the command line.
 
  * "git commit" can be told to always GPG sign the resulting commit
-   by setting "commit.gpgsign" configuration variable to true (the
-   command line option --no-gpg-sign should override it).
+   by setting the "commit.gpgsign" configuration variable to "true"
+   (the command-line option "--no-gpg-sign" should override it).
 
  * "git pull" can be told to only accept fast-forward by setting the
-   new "pull.ff" configuration.
+   new "pull.ff" configuration variable.
 
- * "git reset" learned "-N" option, which does not reset the index
+ * "git reset" learned the "-N" option, which does not reset the index
    fully for paths the index knows about but the tree-ish the command
    resets to does not (these paths are kept as intend-to-add entries).
 
- * Newly cloned submodule repositories by "git submodule update",
-   when the "checkout" update mode is used, will be on a local
-   branch instead of on a detached HEAD, just like submodules added
-   with "git submodule add".
-
 
 Performance, Internal Implementation, etc.
 
+ * The compilation options to port to AIX and to MSVC have been
+   updated.
+
  * We started using wildmatch() in place of fnmatch(3) a few releases
    ago; complete the process and stop using fnmatch(3).
 
  * Uses of curl's "multi" interface and "easy" interface do not mix
    well when we attempt to reuse outgoing connections.  Teach the RPC
-   over http code, used in the smart HTTP transport, not to use the
+   over HTTP code, used in the smart HTTP transport, not to use the
    "easy" interface.
 
  * The bitmap-index feature from JGit has been ported, which should
-   significantly improve performance when serving objects form a
+   significantly improve performance when serving objects from a
    repository that uses it.
 
  * The way "git log --cc" shows a combined diff against multiple
-   parents have been optimized.
+   parents has been optimized.
 
  * The prefixcmp() and suffixcmp() functions are gone.  Use
    starts_with() and ends_with(), and also consider if skip_prefix()
@@ -153,8 +184,95 @@ Unless otherwise noted, all the fixes since v1.9 in the maintenance
 track are contained in this release (see the maintenance releases'
 notes for details).
 
+ * "git p4" was broken in 1.9 release to deal with changes in binary
+   files.
+   (merge 749b668 cl/p4-use-diff-tree later to maint).
+
+ * The shell prompt script (in contrib/), when using the PROMPT_COMMAND
+   interface, used an unsafe construct when showing the branch name in
+   $PS1.
+   (merge 1e4119c8 rh/prompt-pcmode-avoid-eval-on-refname later to maint).
+
+ * "git rebase" used a POSIX shell construct FreeBSD's /bin/sh does not
+   work well with.
+   (merge 8cd6596 km/avoid-non-function-return-in-rebase later to maint).
+
+ * zsh prompt (in contrib/) leaked unnecessary error messages.
+
+ * Bash completion (in contrib/) did not complete the refs and remotes
+   correctly given "git pu<TAB>" when "pu" is aliased to "push".
+
+ * Some more Unicode code points, defined in Unicode 6.3 as having zero
+   width, have been taught to our display column counting logic.
+   (merge d813ab9 tb/unicode-6.3-zero-width later to maint).
+
+ * Some tests used shell constructs that did not work well on FreeBSD
+   (merge ff7a1c6 km/avoid-bs-in-shell-glob later to maint).
+   (merge 00764ca km/avoid-cp-a later to maint).
+
+ * "git update-ref --stdin" did not fail a request to create a ref
+   when the ref already existed.
+   (merge b9d56b5 mh/update-ref-batch-create-fix later to maint).
+
+ * "git diff --no-index -Mq a b" fell into an infinite loop.
+   (merge ad1c3fb jc/fix-diff-no-index-diff-opt-parse later to maint).
+
+ * "git fetch --prune", when the right-hand side of multiple fetch
+   refspecs overlap (e.g. storing "refs/heads/*" to
+   "refs/remotes/origin/*", while storing "refs/frotz/*" to
+   "refs/remotes/origin/fr/*"), aggressively thought that lack of
+   "refs/heads/fr/otz" on the origin site meant we should remove
+   "refs/remotes/origin/fr/otz" from us, without checking their
+   "refs/frotz/otz" first.
+
+   Note that such a configuration is inherently unsafe (think what
+   should happen when "refs/heads/fr/otz" does appear on the origin
+   site), but that is not a reason not to be extra careful.
+   (merge e6f6371 cn/fetch-prune-overlapping-destination later to maint).
+
+ * "git status --porcelain --branch" showed its output with labels
+   "ahead/behind/gone" translated to the user's locale.
+   (merge 7a76c28 mm/status-porcelain-format-i18n-fix later to maint).
+
+ * A stray environment variable $prefix could have leaked into and
+   affected the behaviour of the "subtree" script (in contrib/).
+
+ * When it is not necessary to edit a commit log message (e.g. "git
+   commit -m" is given a message without specifying "-e"), we used to
+   disable the spawning of the editor by overriding GIT_EDITOR, but
+   this means all the uses of the editor, other than to edit the
+   commit log message, are also affected.
+   (merge b549be0 bp/commit-p-editor later to maint).
+
+ * "git mv" that moves a submodule forgot to adjust the array that
+   uses to keep track of which submodules were to be moved to update
+   its configuration.
+   (merge fb8a4e8 jk/mv-submodules-fix later to maint).
+
+ * Length limit for the pathname used when removing a path in a deep
+   subdirectory has been removed to avoid buffer overflows.
+   (merge 2f29e0c mh/remove-subtree-long-pathname-fix later to maint).
+
+ * The test helper lib-terminal always run an actual test_expect_*
+   when included, which screwed up with the use of skil-all that may
+   have to be done later.
+   (merge 7e27173 jk/lib-terminal-lazy later to maint).
+
+ * "git index-pack" used a wrong variable to name the keep-file in an
+   error message when the file cannot be written or closed.
+   (merge de983a0 nd/index-pack-error-message later to maint).
+
+ * "rebase -i" produced a broken insn sheet when the title of a commit
+   happened to contain '\n' (or ended with '\c') due to a careless use
+   of 'echo'.
+   (merge cb1aefd us/printf-not-echo later to maint).
+
+ * There were a few instances of 'git-foo' remaining in the
+   documentation that should have been spelled 'git foo'.
+   (merge 3c3e6f5 rr/doc-merge-strategies later to maint).
+
  * Serving objects from a shallow repository needs to write a
-   new file to hold the temporary shallow boundaries but it was not
+   new file to hold the temporary shallow boundaries, but it was not
    cleaned when we exit due to die() or a signal.
    (merge 7839632 jk/shallow-update-fix later to maint).
 
@@ -177,19 +295,19 @@ notes for details).
    ".git" tells us where it is.
    (merge fcfec8b da/difftool-git-files later to maint).
 
- * "git push" did not pay attention to branch.*.pushremote if it is
-   defined earlier than remote.pushdefault; the order of these two
+ * "git push" did not pay attention to "branch.*.pushremote" if it is
+   defined earlier than "remote.pushdefault"; the order of these two
    variables in the configuration file should not matter, but it did
    by mistake.
    (merge 98b406f jk/remote-pushremote-config-reading later to maint).
 
- * Codepaths that parse timestamps in commit objects have been
+ * Code paths that parse timestamps in commit objects have been
    tightened.
-   (merge 3f419d4 jk/commit-dates-parsing-fix later to maint).
+   (merge f80d1f9 jk/commit-dates-parsing-fix later to maint).
 
  * "git diff --external-diff" incorrectly fed the submodule directory
-   in the working tree to the external diff driver when it knew it is
-   the same as one of the versions being compared.
+   in the working tree to the external diff driver when it knew that it
+   is the same as one of the versions being compared.
    (merge aba4727 tr/diff-submodule-no-reuse-worktree later to maint).
 
  * "git reset" needs to refresh the index when working in a working
@@ -200,7 +318,7 @@ notes for details).
 
  * "git check-attr" when working on a repository with a working tree
    did not work well when the working tree was specified via the
-   --work-tree (and obviously with --git-dir) option.
+   "--work-tree" (and obviously with "--git-dir") option.
    (merge cdbf623 jc/check-attr-honor-working-tree later to maint).
 
  * "merge-recursive" was broken in 1.7.7 era and stopped working in
@@ -208,12 +326,12 @@ notes for details).
    involved.  This has been corrected.
    (merge 6e2068a bk/refresh-missing-ok-in-merge-recursive later to maint.)
 
- * "git rev-parse" was loose in rejecting command line arguments
+ * "git rev-parse" was loose in rejecting command-line arguments
    that do not make sense, e.g. "--default" without the required
    value for that option.
    (merge a43219f ds/rev-parse-required-args later to maint.)
 
- * include.path variable (or any variable that expects a path that
+ * "include.path" variable (or any variable that expects a path that
    can use ~username expansion) in the configuration file is not a
    boolean, but the code failed to check it.
    (merge 67beb60 jk/config-path-include-fix later to maint.)
@@ -222,21 +340,25 @@ notes for details).
    the pathspec is given as an absolute pathname (which is a
    practice not particularly encouraged) that points at a symbolic
    link in the working tree.
-   (merge later 655ee9e mw/symlinks to maint.)
+   (merge 6127ff6 mw/symlinks later to maint.)
 
  * "git diff --quiet -- pathspec1 pathspec2" sometimes did not return
-   correct status value.
+   the correct status value.
    (merge f34b205 nd/diff-quiet-stat-dirty later to maint.)
 
  * Attempting to deepen a shallow repository by fetching over smart
-   HTTP transport failed in the protocol exchange, when no-done
+   HTTP transport failed in the protocol exchange, when the no-done
    extension was used.  The fetching side waited for the list of
-   shallow boundary commits after the sending end stopped talking to
+   shallow boundary commits after the sending side stopped talking to
    it.
    (merge 0232852 nd/http-fetch-shallow-fix later to maint.)
 
  * Allow "git cmd path/", when the 'path' is where a submodule is
    bound to the top-level working tree, to match 'path', despite the
    extra and unnecessary trailing slash (such a slash is often
-   given by command line completion).
+   given by command-line completion).
    (merge 2e70c01 nd/submodule-pathspec-ending-with-slash later to maint.)
+
+ * Documentation and in-code comments had many instances of mistaken
+   use of "nor", which have been corrected.
+   (merge 235e8d5 jl/nor-or-nand-and later to maint).
diff --git a/Documentation/RelNotes/2.1.0.txt b/Documentation/RelNotes/2.1.0.txt
new file mode 100644 (file)
index 0000000..527b07e
--- /dev/null
@@ -0,0 +1,173 @@
+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 the 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 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 6.3 better.
+
+ * "git commit --date=<date>" option learned to read from more
+   timestamp formats, including "--date=now".
+
+ * The `core.commentChar` configuration variable is used to specify a
+   custom comment character other than the default "#" to be used in
+   the commit log editor.  This can be set to `auto` to attempt to
+   choose a different character that does not conflict with what
+   already starts a line in the message being edited for cases like
+   "git commit --amend".
+
+ * "git grep" learned grep.fullname configuration variable to force
+   "--full-name" to be default.  This may cause regressions on
+   scripted users that do not expect this new behaviour.
+
+ * "git imap-send" learned to ask the credential helper for auth
+   material.
+
+ * "git merge" without 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?".  Among the two
+   purposes this prompt serves, ignore the use case to confirm that
+   the user wants to view particular path with the named tool, and
+   redefine the meaning of the prompt only to confirm the choice of
+   the tool made by the autodetection (for those who configured the
+   tool explicitly, the prompt shown for the latter purpose is
+   simply annoying).
+
+   Strictly speaking, this is a backward incompatible change and the
+   users need to explicitly set the variable to 'true' if they want
+   to resurrect the now-ignored use case.
+
+ * "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.
+
+
+Performance, Internal Implementation, etc.
+
+ * Build procedure for 'subtree' (in contrib/) has been cleaned up.
+
+ * 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, thanks
+   to David Karstrup <dak@gnu.org>.
+
+ * "git diff" that compares 3-or-more trees (e.g. parents and the
+   result of a merge) have 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.
+
+
+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).
+
+ * "--ignore-space-change" option of "git apply" ignored the spaces
+   at the beginning of line too aggressively, which is inconsistent
+   with the option of the same name "diff" and "git diff" have.
+   (merge 14d3bb4 jc/apply-ignore-whitespace later to maint).
+
+ * "git blame" miscounted number of columns needed to show localized
+   timestamps, resulting in jaggy left-side-edge of 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 commit --allow-empty-messag -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 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).
+
+ * 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).
+
+ * "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 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 modify 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).
index 73c8973aae5bfad789a998e5623fc219959edaf6..cd2d6514e144d29e0eed5491e026f41d744162a3 100644 (file)
@@ -78,8 +78,8 @@ be escaped: use `\"` for `"` and `\\` for `\`.
 
 The following escape sequences (beside `\"` and `\\`) are recognized:
 `\n` for newline character (NL), `\t` for horizontal tabulation (HT, TAB)
-and `\b` for backspace (BS).  No other char escape sequence, nor octal
-char sequences are valid.
+and `\b` for backspace (BS).  Other char escape sequences (including octal
+escape sequences) are invalid.
 
 Variable values ending in a `\` are continued on the next line in the
 customary UNIX fashion.
@@ -131,8 +131,13 @@ Variables
 
 Note that this list is non-comprehensive and not necessarily complete.
 For command-specific variables, you will find a more detailed description
-in the appropriate manual page. You will find a description of non-core
-porcelain configuration variables in the respective porcelain documentation.
+in the appropriate manual page.
+
+Other git-related tools may and do use their own variables.  When
+inventing new variables for use in your own tool, make sure their
+names do not conflict with those that are used by Git itself and
+other popular tools, and describe them in your documentation.
+
 
 advice.*::
        These variables control various optional help messages designed to
@@ -376,7 +381,7 @@ false), while all other repositories are assumed to be bare (bare
 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.
@@ -484,7 +489,7 @@ core.deltaBaseCacheLimit::
        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.
 +
@@ -518,7 +523,7 @@ core.askpass::
        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
@@ -539,6 +544,9 @@ core.commentchar::
        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.
@@ -553,14 +561,19 @@ core.pager::
        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
@@ -821,7 +834,7 @@ color.diff::
        commands will only use color when output is to the terminal.
        Defaults to false.
 +
-This does not affect linkgit:git-format-patch[1] nor the
+This does not affect linkgit:git-format-patch[1] or the
 'git-diff-{asterisk}' plumbing commands.  Can be overridden on the
 command line with the `--color[=<when>]` option.
 
@@ -1151,6 +1164,11 @@ filter.<driver>.smudge::
        object to a worktree file upon checkout.  See
        linkgit:gitattributes[5] for details.
 
+gc.aggressiveDepth::
+       The depth parameter used in the delta compression
+       algorithm used by 'git gc --aggressive'.  This defaults
+       to 250.
+
 gc.aggressiveWindow::
        The window size parameter used in the delta compression
        algorithm used by 'git gc --aggressive'.  This defaults
@@ -1314,7 +1332,7 @@ grep.extendedRegexp::
 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
@@ -1330,6 +1348,10 @@ gui.diffcontext::
        Specifies how many context lines should be used in calls to diff
        made by the linkgit:git-gui[1]. The default is "5".
 
+gui.displayuntracked::
+       Determines if linkgit::git-gui[1] shows untracked files
+       in the file list. The default is "true".
+
 gui.encoding::
        Specifies the default encoding to use for displaying of
        file contents in linkgit:git-gui[1] and linkgit:gitk[1].
@@ -2281,7 +2303,7 @@ status.submodulesummary::
        submodules when `diff.ignoreSubmodules` is set to 'all' or only
        for those submodules where `submodule.<name>.ignore=all`. 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.
 
@@ -2303,7 +2325,7 @@ submodule.<name>.branch::
 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.
 
index f07b4513ed76978e3bb7ef02ebf31d504f7098ff..b0017795208d971eb40001ff20bd2516c8d9a58e 100644 (file)
@@ -76,7 +76,7 @@ diff.ignoreSubmodules::
        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::
index 55f499a160094d3135ba2e09fc558ef186fdaef2..843a20bac2bb50916210fa8b055201bfcd1aabd9 100644 (file)
@@ -174,7 +174,7 @@ added, from the point of view of that parent).
 In the above example output, the function signature was changed
 from both files (hence two `-` removals from both file1 and
 file2, plus `++` to mean one line that was added does not appear
-in either file1 nor file2).  Also eight other lines are the same
+in either file1 or file2).  Also eight other lines are the same
 from file1 but do not appear in file2 (hence prefixed with `+`).
 
 When shown by `git diff-tree -c`, it compares the parents of a
index 9b37b2a10b94449b73aeceadae175d52ee081e4e..6cb083aae58018084c8da689bf2bfe5ccc136de5 100644 (file)
@@ -358,7 +358,7 @@ endif::git-log[]
 --irreversible-delete::
        Omit the preimage for deletes, i.e. print only the header but not
        the diff between the preimage and `/dev/null`. The resulting patch
-       is not meant to be applied with `patch` nor `git apply`; this is
+       is not meant to be applied with `patch` or `git apply`; this is
        solely for people who want to just concentrate on reviewing the
        text after the change. In addition, the output obviously lack
        enough information to apply such a patch in reverse, even manually,
index 2a18c1f6f24fbe7d78f17f662440c9b6d903e55e..b2548ef4e6758867b31a24b0a3a6c20769a3461a 100644 (file)
@@ -263,7 +263,7 @@ that are not quite ready.
 <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, nor exposed as a part of a stable branch.
+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.
index 895922e27cc4250d26818b4ca4ba42f1d2004fed..96315261102953b8f34694e0a793f023eea795f5 100644 (file)
@@ -300,9 +300,9 @@ patch::
 
        y - stage this hunk
        n - do not stage this hunk
-       q - quit; do not stage this hunk nor any of the remaining ones
+       q - quit; do not stage this hunk or any of the remaining ones
        a - stage this hunk and all later hunks in the file
-       d - do not stage this hunk nor any of the later hunks in the file
+       d - do not stage this hunk or any of the later hunks in the file
        g - select a hunk to go to
        / - search for a hunk matching the given regex
        j - leave this hunk undecided, see next undecided hunk
index a2b97582fe010ffcab70db30e006a7a94d6b767b..9adce372ec6e6ec0d371c411da1e5002baea5f51 100644 (file)
@@ -14,7 +14,7 @@ SYNOPSIS
         [--ignore-date] [--ignore-space-change | --ignore-whitespace]
         [--whitespace=<option>] [-C<n>] [-p<n>] [--directory=<dir>]
         [--exclude=<path>] [--include=<path>] [--reject] [-q | --quiet]
-        [--[no-]scissors] [-S[<keyid>]]
+        [--[no-]scissors] [-S[<keyid>]] [--patch-format=<format>]
         [(<mbox> | <Maildir>)...]
 'git am' (--continue | --skip | --abort)
 
@@ -97,6 +97,12 @@ default.   You can use `--no-utf8` to override this.
        program that applies
        the patch.
 
+--patch-format::
+       By default the command will try to detect the patch format
+       automatically. This option allows the user to bypass the automatic
+       detection and specify the patch format that the patch(es) should be
+       interpreted as. Valid formats are mbox, stgit, stgit-series and hg.
+
 -i::
 --interactive::
        Run interactively.
index f986c5cb3a09989aebefcd9ba28f419280ffc544..4cb52a7302077e17d5a05983a5e6c924b4694194 100644 (file)
@@ -117,7 +117,7 @@ $ git bisect visualize
 `view` may also be used as a synonym for `visualize`.
 
 If the 'DISPLAY' environment variable is not set, 'git log' is used
-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`.
 
 ------------
index d58758fe1f87f3261d4ca3898d44e1dd4562f5e0..0bbc8f55f9bb558033abb877bf0bc6cd10335edd 100644 (file)
@@ -176,7 +176,7 @@ OPTIONS
 --cleanup=<mode>::
        This option determines how the supplied commit message should be
        cleaned up before committing.  The '<mode>' can be `strip`,
-       `whitespace`, `verbatim`, or `default`.
+       `whitespace`, `verbatim`, `scissors` or `default`.
 +
 --
 strip::
@@ -186,6 +186,12 @@ whitespace::
        Same as `strip` except #commentary is not removed.
 verbatim::
        Do not change the message at all.
+scissors::
+       Same as `whitespace`, except that everything from (and
+       including) the line
+       "`# ------------------------ >8 ------------------------`"
+       is truncated if the message is to be edited. "`#`" can be
+       customized with core.commentChar.
 default::
        Same as `strip` if the message is to be edited.
        Otherwise `whitespace`.
index e9917b89a91b36c87892ea1c08522f17be3c0d89..9dfa1a5ce265eacd64febc3775cb05525b58d7f0 100644 (file)
@@ -256,7 +256,7 @@ All writing options will per default write to the repository specific
 configuration file. Note that this also affects options like '--replace-all'
 and '--unset'. *'git config' will only ever change one file at a time*.
 
-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.
index b300e846f13d6a7f340286b4624dc3b0da4ac740..2ff35683e5daac368f959ad6f53d22a77d0d5185 100644 (file)
@@ -33,8 +33,8 @@ size-pack: disk space consumed by the packs, in KiB (unless -H is specified)
 prune-packable: the number of loose objects that are also present in
 the packs. These objects could be pruned using `git prune-packed`.
 +
-garbage: the number of files in object database that are not valid
-loose objects nor valid packs
+garbage: the number of files in object database that are neither valid loose
+objects nor valid packs
 +
 size-garbage: disk space consumed by garbage files, in KiB (unless -H is
 specified)
index 223f7315236be845a158f63d5909804f965837ba..a69b3616ec3bdc9686114f4d0b7a851c0ce93339 100644 (file)
@@ -169,7 +169,7 @@ Git configuration files in that directory are readable by `<user>`.
 --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 @@ Git configuration files in that directory are readable by `<user>`.
        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 @@ SERVICES
 --------
 
 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
index 56fb7e532227fa8a69b9e9ada92a1d8eb330c7d6..bbab35fcaff35ccd5459251550924a42ce2c871e 100644 (file)
@@ -158,8 +158,8 @@ $ git diff --name-status                <2>
 $ git diff arch/i386 include/asm-i386   <3>
 ------------
 +
-<1> Show only modification, rename and copy, but not addition
-nor deletion.
+<1> Show only modification, rename, and copy, but not addition
+or deletion.
 <2> Show only names and the nature of change, but not actual
 diff output.
 <3> Limit diff output to named subtrees.
index fd22a9a0c1312382a972a39e06063e7ff77b027d..3ffa2fa2c8b38d2657b7ef21dfabbc2d816ade18 100644 (file)
@@ -231,7 +231,7 @@ Date Formats
 ~~~~~~~~~~~~
 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 @@ and control the current import process.  More detailed discussion
 `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 @@ the email address from the other fields in the line.  Note that
 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.
 
@@ -1085,7 +1085,7 @@ Option commands must be the first commands on the input (not counting
 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 +1099,7 @@ not be passed as option:
 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.
 
index e158a3b31fce6b7573a3f549a3d9e0ecbf1cdff2..273c4663c8736aa14678b35e3bf4a8de68b78faf 100644 (file)
@@ -124,6 +124,9 @@ the value, the more time is spent optimizing the delta compression.  See
 the documentation for the --window' option in linkgit:git-repack[1] for
 more details.  This defaults to 250.
 
+Similarly, the optional configuration variable 'gc.aggressiveDepth'
+controls --depth option in linkgit:git-repack[1]. This defaults to 250.
+
 The optional configuration variable 'gc.pruneExpire' controls how old
 the unreferenced loose objects have to be before they are pruned.  The
 default is "2 weeks ago".
index f83733490f5a881f6f197b3b62000337c500ef9d..31811f16bdaac49d01d38dcdea82bb191942b1cf 100644 (file)
@@ -53,6 +53,9 @@ grep.extendedRegexp::
        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
 -------
index b21e9d79be22cf134cf4e5f009fc8d71a635cc73..3956525218bf45f2968fe2039e4dfb75a6f2222b 100644 (file)
@@ -80,9 +80,9 @@ CONFIGURATION VARIABLES
 help.format
 ~~~~~~~~~~~
 
-If no command line option is passed, the 'help.format' configuration
+If no command-line option is passed, the 'help.format' configuration
 variable will be checked. The following values are supported for this
-variable; they make 'git help' behave as their corresponding command
+variable; they make 'git help' behave as their corresponding command-
 line option:
 
 * "man" corresponds to '-m|--man',
@@ -93,15 +93,15 @@ help.browser, web.browser and browser.<tool>.path
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 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 @@ For example, this configuration:
                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
index e8c13f60aea59c1c0575f1c0802a11fcc35ecb3c..d422ba4b59acf31151f149c8067c18e541e5bdb2 100644 (file)
@@ -191,7 +191,7 @@ ScriptAlias /git/ /var/www/cgi-bin/gitweb.cgi/
 ----------------------------------------------------------------
 
 Lighttpd::
-       Ensure that `mod_cgi`, `mod_alias, `mod_auth`, `mod_setenv` are
+       Ensure that `mod_cgi`, `mod_alias`, `mod_auth`, `mod_setenv` are
        loaded, then set `GIT_PROJECT_ROOT` appropriately and redirect
        all requests to the CGI:
 +
index c0856a6e0a0a625fcc4c394057597d633a0487ac..e26f01fb1d1aec3526879059fe6ee20438965f68 100644 (file)
@@ -185,15 +185,15 @@ specifies the format of exclude patterns.
 
 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
index a3c1fa332abb8d65051f6f6d5df6a14708fba980..cf2c374b710673e891f8337cb9bcc90d72be460a 100644 (file)
@@ -101,9 +101,8 @@ commit or stash your changes before running 'git merge'.
        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.
 
 
index 07137f252b0fd57a671ef69884bea893cdd7767c..e846c2ed7f7f862f5324c0e95a2b17dabcaac58d 100644 (file)
@@ -71,11 +71,13 @@ success of the resolution after the custom tool has exited.
 --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
 ---------------
index 058ac0dc854bfd55a13dd0776beaf36b37e8b8a9..7a493c80f776092265abd4fb2575639e683bcf5c 100644 (file)
@@ -56,7 +56,7 @@ OPTIONS
 EXAMPLE
 -------
 
-To prune objects not used by your repository nor another that
+To prune objects not used by your repository or another that
 borrows from your repository via its
 `.git/objects/info/alternates`:
 
index 14862fb203b8c269fc391eee886520b1675e540a..21cd455508b85f943b45181286adeb2e0066e685 100644 (file)
@@ -385,7 +385,7 @@ will now start building on top of B.
 The command by default does not allow an update that is not a fast-forward
 to prevent such loss of history.
 
-If you do not want to lose your work (history from X to B) nor the work by
+If you do not want to lose your work (history from X to B) or the work by
 the other person (history from X to A), you would need to first fetch the
 history from the repository, create a history that contains changes done
 by both parties, and push the result back.
index c4bde6509e5a2f652dca9345a3a28e9e674c216a..fa1d557e5b98eb6dc40e3baa65964138b4cc0621 100644 (file)
@@ -57,7 +57,7 @@ OPTIONS
 -n::
 --dry-run::
        Check if the command would error out, without updating the index
-       nor the files in the working tree for real.
+       or the files in the working tree for real.
 
 -v::
        Show the progress of checking files out.
@@ -283,7 +283,7 @@ merge. The different stages represent the "result tree" (stage 0, aka
 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:
 
index a077ba0ddc81cf499d38f8b541406ac4583bcd1e..25432d9257f9c06773edc8ca3d24ddae16bddf99 100644 (file)
@@ -21,7 +21,7 @@ to HEAD in all forms.
 
 'git reset' [-q] [<tree-ish>] [--] <paths>...::
        This form resets the index entries for all <paths> to their
-       state at <tree-ish>.  (It does not affect the working tree, nor
+       state at <tree-ish>.  (It does not affect the working tree or
        the current branch.)
 +
 This means that `git reset <paths>` is the opposite of `git add
@@ -51,7 +51,7 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode.
 +
 --
 --soft::
-       Does not touch the index file nor the working tree at all (but
+       Does not touch the index file or the working tree at all (but
        resets the head to <commit>, just like all modes do). This leaves
        all your changed files "Changes to be committed", as 'git status'
        would put it.
@@ -118,7 +118,7 @@ and changes with these files are distracting.
 <2> Somebody asks you to pull, and the changes sounds worthy of merging.
 <3> However, you already dirtied the index (i.e. your index does
 not match the HEAD commit).  But you know the pull you are going
-to make does not affect frotz.c nor filfre.c, so you revert the
+to make does not affect frotz.c or filfre.c, so you revert the
 index changes for these two files.  Your changes in working tree
 remain there.
 <4> Then you can pull and merge, leaving frotz.c and filfre.c
index c452f33a366fd1c85da8e4288fa6722263545a55..987395d22af915832c535840ef59927fc5125294 100644 (file)
@@ -363,7 +363,7 @@ usage: some-command [options] <args>...
     -h, --help            show the help
     --foo                 some nifty option --foo
     --bar ...             some cool option --bar with an argument
-    --bar <arg>           another cool option --baz with a named argument
+    --baz <arg>           another cool option --baz with a named argument
     --qux[=<path>]        qux may take a path argument but has meaning by itself
 
 An option group Header
index f0e57a597b6e551d891c064fa69837db632237c6..d0fa18aaa8b14f9171800a05742fb1fe326b547b 100644 (file)
@@ -20,7 +20,7 @@ files in the directory), or directly as a revision list.  In the
 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 @@ The --cc option must be repeated for each user you want on the cc list.
 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 @@ See the CONFIGURATION section for 'sendemail.multiedit'.
 --from=<address>::
        Specify the sender of the emails.  If not specified on the command line,
        the value of the 'sendemail.from' configuration option is used.  If
-       neither the command line option nor 'sendemail.from' are set, then the
+       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".
index c35051ba58b63cdc489b0ee3f4ffb72631b619e3..e4bdd2235ca4ea9b853e1b568203411da1cc3b84 100644 (file)
@@ -66,7 +66,7 @@ EXAMPLE
 -------
 
 To disable interactive logins, displaying a greeting instead:
-+
+
 ----------------
 $ chsh -s /usr/bin/git-shell
 $ mkdir $HOME/git-shell-commands
index a515648ab018b849897dd3506183f57359be598a..b91d4e545b07e21931ac44a04cffea8824c8c7a2 100644 (file)
@@ -25,7 +25,7 @@ and/or refs/tags) semi-visually.
 It cannot show more than 29 branches and commits at a time.
 
 It uses `showbranch.default` multi-valued configuration items if
-no <rev> nor <glob> is given on the command line.
+no <rev> or <glob> is given on the command line.
 
 
 OPTIONS
index ffd1b03a9c0ee583effe6200fbabd327e7ac60f6..2a6f89b235f10ea6d41047a2a42a133531ea3cab 100644 (file)
@@ -89,7 +89,7 @@ OPTIONS
        Show references matching one or more patterns. Patterns are matched from
        the end of the full name, and only complete parts are matched, e.g.
        'master' matches 'refs/heads/master', 'refs/remotes/origin/master',
-       'refs/tags/jedi/master' but not 'refs/heads/mymaster' nor
+       'refs/tags/jedi/master' but not 'refs/heads/mymaster' or
        'refs/remotes/master/jedi'.
 
 OUTPUT
index a4acaa038cd4255c91df1a03c16c6a396f0c1219..def635f57879c467d85f43d44aafac90c7f72a9a 100644 (file)
@@ -97,7 +97,7 @@ configuration variable documented in linkgit:git-config[1].
 OUTPUT
 ------
 The output from this command is designed to be used as a commit
-template comment, and all the output lines are prefixed with '#'.
+template comment.
 The default, long format, is designed to be human readable,
 verbose and descriptive.  Its contents and format are subject to change
 at any time.
index 46c1eebb938dad182aeafafd9e680226c253dd65..89c4d3e39474ed601255371c30b98bdd569f671d 100644 (file)
@@ -15,7 +15,7 @@ SYNOPSIS
 'git submodule' [--quiet] init [--] [<path>...]
 'git submodule' [--quiet] deinit [-f|--force] [--] <path>...
 'git submodule' [--quiet] update [--init] [--remote] [-N|--no-fetch]
-             [-f|--force] [--checkout|--rebase|--merge] [--reference <repository>]
+             [-f|--force] [--rebase|--merge] [--reference <repository>]
              [--depth <depth>] [--recursive] [--] [<path>...]
 'git submodule' [--quiet] summary [--cached|--files] [(-n|--summary-limit) <n>]
              [commit] [--] [<path>...]
@@ -155,31 +155,13 @@ it contains local modifications.
 
 update::
        Update the registered submodules, i.e. clone missing submodules and
-       checkout the commit specified in the index of the containing
-       repository.  The update mode defaults to `checkout`, but can be
-       configured with the `submodule.<name>.update` setting or the
-       `--rebase`, `--merge`, or `--checkout` options.
-+
-For updates that clone missing submodules, checkout-mode updates will
-create submodules with detached HEADs; all other modes will create
-submodules with a local branch named after `submodule.<path>.branch`.
-+
-For updates that do not clone missing submodules, the submodule's HEAD
-is only touched when the remote reference does not match the
-submodule's HEAD (for none-mode updates, the submodule is never
-touched).  The remote reference is usually the gitlinked commit from
-the superproject's tree, but with `--remote` it is the upstream
-subproject's `submodule.<name>.branch`.  This remote reference is
-integrated with the submodule's HEAD using the specified update mode.
-For checkout-mode updates, that will result in a detached HEAD.  For
-rebase- and merge-mode updates, the commit referenced by the
-submodule's HEAD may change, but the symbolic reference will remain
-unchanged (i.e. checked-out branches will still be checked-out
-branches, and detached HEADs will still be detached HEADs).  If none
-of the builtin modes fit your needs, set `submodule.<name>.update` to
-`!command` to configure a custom integration command.  `command` can
-be any arbitrary shell command that takes a single argument, namely
-the sha1 to update to.
+       checkout the commit specified in the index of the containing repository.
+       This will make the submodules HEAD be detached unless `--rebase` or
+       `--merge` is specified or the key `submodule.$name.update` is set to
+       `rebase`, `merge` or `none`. `none` can be overridden by specifying
+       `--checkout`. Setting the key `submodule.$name.update` to `!command`
+       will cause `command` to be run. `command` can be any arbitrary shell
+       command that takes a single argument, namely the sha1 to update to.
 +
 If the submodule is not yet initialized, and you just want to use the
 setting as stored in .gitmodules, you can automatically initialize the
@@ -247,7 +229,7 @@ OPTIONS
 -b::
 --branch::
        Branch of repository to add as submodule.
-       The name of the branch is recorded as `submodule.<path>.branch` in
+       The name of the branch is recorded as `submodule.<name>.branch` in
        `.gitmodules` for `update --remote`.
 
 -f::
index 30c5ee256463eca3f38cb5a62191ed194304d35b..44c970ce18143e2a45c9f5364535e26508b50317 100644 (file)
@@ -86,13 +86,14 @@ COMMANDS
        (refs/remotes/$remote/*). Setting a prefix is also useful
        if you wish to track multiple projects that share a common
        repository.
+       By default, the prefix is set to 'origin/'.
 +
-NOTE: In Git v2.0, the default prefix will CHANGE from "" (no prefix)
-to "origin/". This is done to put SVN-tracking refs at
-"refs/remotes/origin/*" instead of "refs/remotes/*", and make them
-more compatible with how Git's own remote-tracking refs are organized
-(i.e. refs/remotes/$remote/*). You can enjoy the same benefits today,
-by using the --prefix option.
+NOTE: Before Git v2.0, the default prefix was "" (no prefix). This
+meant that SVN-tracking refs were put at "refs/remotes/*", which is
+incompatible with how Git's own remote-tracking refs are organized.
+If you still want the old default, you can get it by passing
+`--prefix ""` on the command line (`--prefix=""` may not work if
+your Perl's Getopt::Long is < v2.37).
 
 --ignore-paths=<regex>;;
        When passed to 'init' or 'clone' this regular expression will
@@ -147,8 +148,8 @@ the same local time zone.
 [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:
 +
@@ -994,16 +995,6 @@ without giving any repository layout options.  If the full history with
 branches and tags is required, the options '--trunk' / '--branches' /
 '--tags' must be used.
 
-When using the options for describing the repository layout (--trunk,
---tags, --branches, --stdlayout), please also specify the --prefix
-option (e.g. '--prefix=origin/') to cause your SVN-tracking refs to be
-placed at refs/remotes/origin/* rather than the default refs/remotes/*.
-The former is more compatible with the layout of Git's "regular"
-remote-tracking refs (refs/remotes/$remote/*), and may potentially
-prevent similarly named SVN branches and Git remotes from clobbering
-each other. In Git v2.0 the default prefix used (i.e. when no --prefix
-is given) will change from "" (no prefix) to "origin/".
-
 When using multiple --branches or --tags, 'git svn' does not automatically
 handle name collisions (for example, if two branches from different paths have
 the same name, or if a branch and a tag have the same name).  In these cases,
index 0a0a5512b3c62eb1179a3d5a9687949c39b2a9ef..c8f5ae5cb362276de94aa867af59818a75b04595 100644 (file)
@@ -68,7 +68,12 @@ performs all modifications together.  Specify commands of the form:
        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 @@ code.  Alternatively, use `-z` to specify commands without quoting:
        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 @@ option::
        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
index 2de575f5beed10ed616289d88929c466a0fcb296..16ede5b4c36d3a231d6af3849f7eeb8f404daf98 100644 (file)
@@ -62,7 +62,7 @@ CONF.VAR (from -c option) and web.browser
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 The web browser can be specified using a configuration variable passed
-with the -c (or --config) command line option, or the 'web.browser'
+with the -c (or --config) command-line option, or the 'web.browser'
 configuration variable if the former is not used.
 
 browser.<tool>.path
@@ -87,7 +87,7 @@ the URLs passed as arguments.
 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.
 
index e5f8ed0940d296613a05d3b23981215e39a5ba1a..3bd68b016791ac082e2a556a4835b22ba241b92f 100644 (file)
@@ -29,7 +29,7 @@ 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,13 +39,21 @@ ifdef::stalenotes[]
 ============
 
 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:v1.9.1/git.html[documentation for release 1.9.1]
+* link:v2.0.0/git.html[documentation for release 2.0]
 
 * release notes for
+  link:RelNotes/2.0.0.txt[2.0.0].
+
+* link:v1.9.4/git.html[documentation for release 1.9.4]
+
+* release notes for
+  link:RelNotes/1.9.4.txt[1.9.4],
+  link:RelNotes/1.9.3.txt[1.9.3],
+  link:RelNotes/1.9.2.txt[1.9.2],
   link:RelNotes/1.9.1.txt[1.9.1],
   link:RelNotes/1.9.0.txt[1.9.0].
 
@@ -747,7 +755,7 @@ Git so take care if using Cogito etc.
 
 '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'::
@@ -872,7 +880,7 @@ for further details.
 '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].
 
index 1c3e109cb3d30e69121f9b6681e870a66cf04609..dfe7d8372723c7a4970b8a7100764d1becc7f830 100644 (file)
@@ -3,7 +3,7 @@ gitcli(7)
 
 NAME
 ----
-gitcli - Git command line interface and conventions
+gitcli - Git command-line interface and conventions
 
 SYNOPSIS
 --------
@@ -66,13 +66,13 @@ you will.
 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 @@ Here is a list of the facilities provided by this option parser.
 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.
index 1e9e38ae40e8396af82c2d6f47d3e8e8508a921d..7ae50aa26aff26cb9dd619abc7c29372c4156bcc 100644 (file)
@@ -27,7 +27,7 @@ gitk-specific options.
 
 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
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -166,8 +166,14 @@ gitk --max-count=100 --all \-- Makefile::
 
 Files
 -----
-Gitk creates the .gitk file in your $HOME directory to store preferences
-such as display options, font, and colors.
+User configuration and preferences are stored at:
+
+* '$XDG_CONFIG_HOME/git/gitk' if it exists, otherwise
+* '$HOME/.gitk' if it exists
+
+If neither of the above exist then '$XDG_CONFIG_HOME/git/gitk' is created and
+used by default. If '$XDG_CONFIG_HOME' is not set it defaults to
+'$HOME/.config' in all cases.
 
 History
 -------
index f539e3f66a8b4c9b2603b0e2f63a89dd2adf1bfe..347a9f76ee809c3691dc6580b0fba3ebde0b0e3c 100644 (file)
@@ -55,10 +55,6 @@ submodule.<name>.branch::
        A remote branch name for tracking updates in the upstream submodule.
        If the option is not specified, it defaults to 'master'.  See the
        `--remote` documentation in linkgit:git-submodule[1] for details.
-+
-This branch name is also used for the local branch created by
-non-checkout cloning updates.  See the `update` documentation in
-linkgit:git-submodule[1] for details.
 
 submodule.<name>.fetchRecurseSubmodules::
        This option can be used to control recursive fetching of this
index 952f503afb6dd8e65ffeaf09425a0968593f39b5..ebe7a6c24cfef75441906a3e4de550b9fd296c0b 100644 (file)
@@ -904,7 +904,7 @@ the following in your GITWEB_CONFIG file:
        $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:
index a2340864b534b4eaa7c8f9a6197563b8d939c544..167b363668b8b53d752d5971798d3ca26c8f7f1f 100755 (executable)
@@ -11,8 +11,8 @@ EOF
 
 for txt
 do
-       title=`expr "$txt" : '.*/\(.*\)\.txt$'`
-       from=`sed -ne '
+       title=$(expr "$txt" : '.*/\(.*\)\.txt$')
+       from=$(sed -ne '
        /^$/q
        /^From:[        ]/{
                s///
@@ -21,9 +21,9 @@ do
                s/^/by /
                p
        }
-       ' "$txt"`
+       ' "$txt")
 
-       abstract=`sed -ne '
+       abstract=$(sed -ne '
        /^Abstract:[    ]/{
                s/^[^   ]*//
                x
@@ -39,11 +39,11 @@ do
                x
                p
                q
-       }' "$txt"`
+       }' "$txt")
 
        if grep 'Content-type: text/asciidoc' >/dev/null $txt
        then
-               file=`expr "$txt" : '\(.*\)\.txt$'`.html
+               file=$(expr "$txt" : '\(.*\)\.txt$').html
        else
                file="$txt"
        fi
diff --git a/Documentation/howto/keep-canonical-history-correct.txt b/Documentation/howto/keep-canonical-history-correct.txt
new file mode 100644 (file)
index 0000000..35d48ef
--- /dev/null
@@ -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
index 19ab604f1f859fa3a40e8bd0da2675548056a2c5..02cb5f758d6f65c61e216c89fa758f7345526f96 100644 (file)
@@ -139,7 +139,7 @@ You fetch from upstream, but not merge.
     $ git fetch upstream
 
 This leaves the updated upstream head in .git/FETCH_HEAD but
-does not touch your .git/HEAD nor .git/refs/heads/master.
+does not touch your .git/HEAD or .git/refs/heads/master.
 You run "git rebase" now.
 
     $ git rebase FETCH_HEAD master
index acf3e477e59f1bab9addde756274afe15d39a8ed..462255ed5d8053cbb4dadeec224cb81d14c4ada6 100644 (file)
@@ -54,7 +54,7 @@ where C and D are to fix what was broken in A and B, and you may already
 have some other changes on the mainline after W.
 
 If you merge the updated side branch (with D at its tip), none of the
-changes made in A nor B will be in the result, because they were reverted
+changes made in A or B will be in the result, because they were reverted
 by W.  That is what Alan saw.
 
 Linus explains the situation:
@@ -90,7 +90,7 @@ with:
     $ git revert W
 
 This history would (ignoring possible conflicts between what W and W..Y
-changed) be equivalent to not having W nor Y at all in the history:
+changed) be equivalent to not having W or Y at all in the history:
 
  ---o---o---o---M---x---x-------x----
               /
index 85f69dbac9187ff504d4656cfab5efe074223161..149508e13bdacf70488b1a7049bf6aef502c36e3 100644 (file)
@@ -137,7 +137,7 @@ $ make clean test ;# make sure it did not cause other breakage.
 ------------------------------------------------
 
 Everything is in the good order.  I do not need the temporary branch
-nor tag anymore, so remove them:
+or tag anymore, so remove them:
 
 ------------------------------------------------
 $ rm -f .git/refs/tags/pu-anchor
index 6de4f3c4875e3d9607754d5ca76a17e00c8f5841..f44e5e9458592a0554e4e2e163a6b029c1435f80 100644 (file)
@@ -181,7 +181,7 @@ On Debian:
 
    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://...".
 
index 76d69a907b48a961906e0b85c59a75e9c0c8986d..ed8b4ff3e5874eac2f8ffe3486abe9d9668b27ce 100755 (executable)
@@ -18,17 +18,17 @@ do
        else
                echo >&2 "# install $h $T/$h"
                rm -f "$T/$h"
-               mkdir -p `dirname "$T/$h"`
+               mkdir -p $(dirname "$T/$h")
                cp "$h" "$T/$h"
        fi
 done
-strip_leading=`echo "$T/" | sed -e 's|.|.|g'`
+strip_leading=$(echo "$T/" | sed -e 's|.|.|g')
 for th in \
        "$T"/*.html "$T"/*.txt \
        "$T"/howto/*.txt "$T"/howto/*.html \
        "$T"/technical/*.txt "$T"/technical/*.html
 do
-       h=`expr "$th" : "$strip_leading"'\(.*\)'`
+       h=$(expr "$th" : "$strip_leading"'\(.*\)')
        case "$h" in
        RelNotes-*.txt | index.html) continue ;;
        esac
index e1343155fad7b2709d2f3700ea3d5b4c4d1a7a89..f08e9b80c562faa1de2408cd4cfdb7253d3be1f2 100644 (file)
@@ -63,14 +63,13 @@ merge.
 
 --squash::
 --no-squash::
-       Produce the working tree and index state as if a real
-       merge happened (except for the merge information),
-       but do not actually make a commit or
-       move the `HEAD`, nor record `$GIT_DIR/MERGE_HEAD` to
-       cause the next `git commit` command to create a merge
-       commit.  This allows you to create a single commit on
-       top of the current branch whose effect is the same as
-       merging another branch (or more in case of an octopus).
+       Produce the working tree and index state as if a real merge
+       happened (except for the merge information), but do not actually
+       make a commit, move the `HEAD`, or record `$GIT_DIR/MERGE_HEAD`
+       (to cause the next `git commit` command to create a merge
+       commit).  This allows you to create a single commit on top of
+       the current branch whose effect is the same as merging another
+       branch (or more in case of an octopus).
 +
 With --no-squash perform the merge and commit the result. This
 option can be used to override --squash.
index 350949810e224c9963278cbc73351011448e9b56..7bbd19b30032ca76966cbcf44a0b5b738c8f5ced 100644 (file)
@@ -1,10 +1,10 @@
 MERGE STRATEGIES
 ----------------
 
-The merge mechanism ('git-merge' and 'git-pull' commands) allows the
+The merge mechanism (`git merge` and `git pull` commands) allows the
 backend 'merge strategies' to be chosen with `-s` option.  Some strategies
 can also take their own options, which can be passed by giving `-X<option>`
-arguments to 'git-merge' and/or 'git-pull'.
+arguments to `git merge` and/or `git pull`.
 
 resolve::
        This can only resolve two heads (i.e. the current branch
index 1d174fd0b6fa7f9fae3eb1523c8c6e2192e71e45..85d63532a3e165110717ca2602e9dd806f10bd9f 100644 (file)
@@ -78,7 +78,7 @@ The 'raw' format shows the entire commit exactly as
 stored in the commit object.  Notably, the SHA-1s are
 displayed in full, regardless of whether --abbrev or
 --no-abbrev are used, and 'parents' information show the
-true parent commits, without taking grafts nor history
+true parent commits, without taking grafts or history
 simplification into account.
 
 * 'format:<string>'
index eea0e306a83834e75f44c1b932e5a7747195f85c..8569e29d08784cb5eb053af919e4b7514b1c296b 100644 (file)
@@ -39,7 +39,7 @@ people using 80-column terminals.
        Show the notes (see linkgit:git-notes[1]) that annotate the
        commit, when showing the commit log message.  This is the default
        for `git log`, `git show` and `git whatchanged` commands when
-       there is no `--pretty`, `--format` nor `--oneline` option given
+       there is no `--pretty`, `--format`or `--oneline` option given
        on the command line.
 +
 By default, the notes shown are from the notes refs listed in the
index 9a3da3646e58f6155a6ff3397eddfd239703447a..deb8cca9173ccbaf8c15ade3f8b3312fb6bdcbad 100644 (file)
@@ -237,7 +237,7 @@ list.
        reflog entries from the most recent one to older ones.
        When this option is used you cannot specify commits to
        exclude (that is, '{caret}commit', 'commit1..commit2',
-       nor 'commit1\...commit2' notations cannot be used).
+       and 'commit1\...commit2' notations cannot be used).
 +
 With `--pretty` format other than `oneline` (for obvious reasons),
 this causes the output to have two extra lines of information
@@ -758,6 +758,13 @@ This enables parent rewriting, see 'History Simplification' below.
 This implies the `--topo-order` option by default, but the
 `--date-order` option may also be specified.
 
+--show-linear-break[=<barrier>]::
+       When --graph is not used, all history branches are flattened
+       which can make it hard to see that the two consecutive commits
+       do not belong to a linear branch. This option puts a barrier
+       in between them in that case. If `<barrier>` is specified, it
+       is the string that will be shown instead of the default one.
+
 ifdef::git-rev-list[]
 --count::
        Print a number stating how many commits would have been
index 5a286d0d61ffc5b3daa00d7d550d5931a91b35ec..07961185fe0cddf78822aee75b43f206cbcd4579 100644 (file)
@@ -94,7 +94,9 @@ some output processing may assume ref names in UTF-8.
 '<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
index e3d6e7a79a6c2136a796c5409d16feb8058e96d2..22a39b929932b78653d1d0b1a59fe35e5d5e75f5 100644 (file)
@@ -22,11 +22,14 @@ Git:
 where options is the bitwise-or of:
 
 `RUN_SETUP`::
-
-       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.
+       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.
+
+`RUN_SETUP_GENTLY`::
+       If there is a Git directory, chdir as per RUN_SETUP, otherwise,
+       don't chdir anywhere.
 
 `USE_PAGER`::
 
index ce363b6305ec117810d66308b0066814871f54e1..260266867768a549e58e540eaa95d3bbe422e5c0 100644 (file)
@@ -99,7 +99,7 @@ static void setup_check(void)
                The attribute is Unset, by listing the name of the
                attribute prefixed with a dash - for the path.
        } else if (ATTR_UNSET(value)) {
-               The attribute is not set nor unset for the path.
+               The attribute is neither set nor unset for the path.
        } else if (!strcmp(value, "input")) {
                If none of ATTR_TRUE(), ATTR_FALSE(), or ATTR_UNSET() is
                true, the value is a string set in the gitattributes
index 42ca2347edd2e13c5e3132a077ac96777bbefa11..b977ae8bbb1f46ebb40d1d315e79262fe344f1c2 100644 (file)
@@ -166,7 +166,6 @@ Usage example
 -------------
 
 Here's a simple usage example that maps long keys to double values.
-[source,c]
 ------------
 struct hashmap map;
 
index be50cf4de35c856da051f985eb42c22dbaac88e4..1f2db313122ccb18223f3be429620fa3385cec51 100644 (file)
@@ -160,10 +160,6 @@ There are some macros to easily define options:
        `int_var` is set to `integer` with `--option`, and
        reset to zero with `--no-option`.
 
-`OPT_SET_PTR(short, long, &ptr_var, description, ptr)`::
-       Introduce a boolean option.
-       If used, set `ptr_var` to `ptr`.
-
 `OPT_STRING(short, long, &str_var, arg_str, description)`::
        Introduce an option with string argument.
        The string argument is put into `str_var`.
index 3350d97dda2408f92dc44c1e3216facc50257a50..4396be9dda07dfad679f834120b7f1aa2adb16c5 100644 (file)
@@ -121,10 +121,19 @@ Functions
 
 * 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_cmp`::
 
        Compare two buffers. Returns an integer less than, equal to, or greater
index 20525d98bb67cd3710c9738f99020c01f2d1d885..59be59b0ebba8c24875643521c9135ab907a33ce 100644 (file)
@@ -374,7 +374,7 @@ C: Send one `$GIT_URL/git-upload-pack` request:
    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
index 39c64105a61a3743da0c8c3b04ee31106090cfa7..18dea8d15fa159b719a38588a0a346e58120ac61 100644 (file)
@@ -237,10 +237,10 @@ The client now sends the maximum commit history depth it wants for
 this transaction, which is the number of commits it wants from the
 tip of the history, if any, as a 'deepen' line.  A depth of 0 is the
 same as not making a depth request. The client does not want to receive
-any commits beyond this depth, nor objects needed only to complete
-those commits. Commits whose parents are not received as a result are
-defined as shallow and marked as such in the server. This information
-is sent back to the client in the next step.
+any commits beyond this depth, nor does it want objects needed only to
+complete those commits. Commits whose parents are not received as a
+result are defined as shallow and marked as such in the server. This
+information is sent back to the client in the next step.
 
 Once all the 'want's and 'shallow's (and optional 'deepen') are
 transferred, clients MUST send a flush-pkt, to tell the server side
index fb7ff084f8e55a06b349db6f7e47c3f64a886a0e..889985f7076da80f94c02b4a7e2760633d500980 100644 (file)
@@ -39,7 +39,7 @@ More specifically, they:
   caret `^`, colon `:`, question-mark `?`, asterisk `*`,
   or open bracket `[` anywhere.
 
-. They cannot end with a slash `/` nor a dot `.`.
+. They cannot end with a slash `/` or a dot `.`.
 
 . They cannot end with the sequence `.lock`.
 
index d4f980446250befbd788394598de599824630d2f..d33f8849b5af3a6946811fea1f78684726e7cde4 100644 (file)
@@ -4074,7 +4074,7 @@ the `HEAD` tree, and stage 3 to the `$target` tree.
 
 Earlier we said that trivial merges are done inside
 `git read-tree -m`.  For example, if the file did not change
-from `$orig` to `HEAD` nor `$target`, or if the file changed
+from `$orig` to `HEAD` or `$target`, or if the file changed
 from `$orig` to `HEAD` and `$orig` to `$target` the same way,
 obviously the final outcome is what is in `HEAD`.  What the
 above example shows is that file `hello.c` was changed from
@@ -4231,9 +4231,9 @@ Most of what `git rev-list` did is contained in `revision.c` and
 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()`.
index a651d68656617182ef79e9bad5d539d74346b83c..40adbf7bf79ad7d7800b71d2ca79418cdbddd3ed 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v1.9.0.GIT
+DEF_VER=v2.0.0.GIT
 
 LF='
 '
index 36463919afd6ee40c3a0487e481ebbaadce7b6d8..07ea1058379ab963648d0df7fd2917e0d2efa8a7 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -30,6 +30,8 @@ all::
 # 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).
@@ -59,9 +61,9 @@ all::
 # FreeBSD can use either, but MinGW and some others need to use
 # libcharset.h's locale_charset() instead.
 #
-# Define CHARSET_LIB to you need to link with library other than -liconv to
+# Define CHARSET_LIB to the library you need to link with in order to
 # use locale_charset() function.  On some platforms this needs to set to
-# -lcharset
+# -lcharset, on others to -liconv .
 #
 # Define LIBC_CONTAINS_LIBINTL if your gettext implementation doesn't
 # need -lintl when linking.
@@ -151,7 +153,7 @@ all::
 #
 # Define NEEDS_LIBINTL_BEFORE_LIBICONV if you need libintl before libiconv.
 #
-# Define NO_INTPTR_T if you don't have intptr_t nor uintptr_t.
+# Define NO_INTPTR_T if you don't have intptr_t or uintptr_t.
 #
 # Define NO_UINTMAX_T if you don't have uintmax_t.
 #
@@ -183,9 +185,6 @@ all::
 # Define NO_STRUCT_ITIMERVAL if you don't have struct itimerval
 # This also implies NO_SETITIMER
 #
-# Define NO_THREAD_SAFE_PREAD if your pread() implementation is not
-# thread-safe. (e.g. compat/pread.c or cygwin)
-#
 # Define NO_FAST_WORKING_DIRECTORY if accessing objects in pack files is
 # generally faster on your platform than accessing the working directory.
 #
@@ -338,6 +337,9 @@ all::
 # Define TEST_GIT_INDEX_VERSION to 2, 3 or 4 to run the test suite
 # with a different indexfile format version.  If it isn't set the index
 # file format used is index-v[23].
+#
+# Define GMTIME_UNRELIABLE_ERRORS if your gmtime() function does not
+# return NULL when it receives a bogus time_t.
 
 GIT-VERSION-FILE: FORCE
        @$(SHELL_PATH) ./GIT-VERSION-GEN
@@ -727,6 +729,7 @@ LIB_H += transport.h
 LIB_H += tree-walk.h
 LIB_H += tree.h
 LIB_H += unpack-trees.h
+LIB_H += unicode_width.h
 LIB_H += url.h
 LIB_H += urlmatch.h
 LIB_H += userdiff.h
@@ -1108,6 +1111,10 @@ ifdef USE_LIBPCRE
        EXTLIBS += -lpcre
 endif
 
+ifdef HAVE_ALLOCA_H
+       BASIC_CFLAGS += -DHAVE_ALLOCA_H
+endif
+
 ifdef NO_CURL
        BASIC_CFLAGS += -DNO_CURL
        REMOTE_CURL_PRIMARY =
@@ -1336,10 +1343,6 @@ endif
 ifdef NO_PREAD
        COMPAT_CFLAGS += -DNO_PREAD
        COMPAT_OBJS += compat/pread.o
-       NO_THREAD_SAFE_PREAD = YesPlease
-endif
-ifdef NO_THREAD_SAFE_PREAD
-       BASIC_CFLAGS += -DNO_THREAD_SAFE_PREAD
 endif
 ifdef NO_FAST_WORKING_DIRECTORY
        BASIC_CFLAGS += -DNO_FAST_WORKING_DIRECTORY
@@ -1489,6 +1492,11 @@ ifneq (,$(XDL_FAST_HASH))
        BASIC_CFLAGS += -DXDL_FAST_HASH
 endif
 
+ifdef GMTIME_UNRELIABLE_ERRORS
+       COMPAT_OBJS += compat/gmtime.o
+       BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
+endif
+
 ifeq ($(TCLTK_PATH),)
 NO_TCLTK = NoThanks
 endif
@@ -2094,7 +2102,7 @@ pdf:
 
 XGETTEXT_FLAGS = \
        --force-po \
-       --add-comments \
+       --add-comments=TRANSLATORS: \
        --msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
        --from-code=UTF-8
 XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
index e50885caa1043665dfe2d995e0a2f7a7a7bb51ca..bf760914010786c830233effc8b96ddacfb114fd 120000 (symlink)
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/2.0.0.txt
\ No newline at end of file
+Documentation/RelNotes/2.1.0.txt
\ No newline at end of file
index 8448d27877e3d77fcae01b1354d192121e050528..d6e851d783c3541eb21edd47170ce7a32e082e61 100644 (file)
--- a/bisect.c
+++ b/bisect.c
@@ -21,8 +21,7 @@ static const char *argv_checkout[] = {"checkout", "-q", NULL, "--", NULL};
 static const char *argv_show_branch[] = {"show-branch", NULL, NULL};
 static const char *argv_update_ref[] = {"update-ref", "--no-deref", "BISECT_HEAD", NULL, NULL};
 
-/* bits #0-15 in revision.h */
-
+/* Remember to update object flag allocation in object.h */
 #define COUNTED                (1u<<16)
 
 /*
index 8eecb1d8c08b9793399b7eb834b2529c590b9a20..660097bc29a682c4481308ba245e5e02f0661681 100644 (file)
--- a/branch.c
+++ b/branch.c
@@ -77,29 +77,29 @@ void install_branch_config(int flag, const char *local, const char *origin, cons
        strbuf_release(&key);
 
        if (flag & BRANCH_CONFIG_VERBOSE) {
-               if (shortname && origin)
-                       printf_ln(rebasing ?
-                                 _("Branch %s set up to track remote branch %s from %s by rebasing.") :
-                                 _("Branch %s set up to track remote branch %s from %s."),
-                                 local, shortname, origin);
-               else if (shortname && !origin)
-                       printf_ln(rebasing ?
-                                 _("Branch %s set up to track local branch %s by rebasing.") :
-                                 _("Branch %s set up to track local branch %s."),
-                                 local, shortname);
-               else if (!shortname && origin)
-                       printf_ln(rebasing ?
-                                 _("Branch %s set up to track remote ref %s by rebasing.") :
-                                 _("Branch %s set up to track remote ref %s."),
-                                 local, remote);
-               else if (!shortname && !origin)
-                       printf_ln(rebasing ?
-                                 _("Branch %s set up to track local ref %s by rebasing.") :
-                                 _("Branch %s set up to track local ref %s."),
-                                 local, remote);
-               else
-                       die("BUG: impossible combination of %p and %p",
-                           shortname, origin);
+               if (shortname) {
+                       if (origin)
+                               printf_ln(rebasing ?
+                                         _("Branch %s set up to track remote branch %s from %s by rebasing.") :
+                                         _("Branch %s set up to track remote branch %s from %s."),
+                                         local, shortname, origin);
+                       else
+                               printf_ln(rebasing ?
+                                         _("Branch %s set up to track local branch %s by rebasing.") :
+                                         _("Branch %s set up to track local branch %s."),
+                                         local, shortname);
+               } else {
+                       if (origin)
+                               printf_ln(rebasing ?
+                                         _("Branch %s set up to track remote ref %s by rebasing.") :
+                                         _("Branch %s set up to track remote ref %s."),
+                                         local, remote);
+                       else
+                               printf_ln(rebasing ?
+                                         _("Branch %s set up to track local ref %s by rebasing.") :
+                                         _("Branch %s set up to track local ref %s."),
+                                         local, remote);
+               }
        }
 }
 
index 4b045bace12c1fa951785dc09c05a46b09cd9fc7..459208a326cd4cebfa813168d81a06c27fc54fc5 100644 (file)
@@ -15,6 +15,7 @@
 #include "diffcore.h"
 #include "revision.h"
 #include "bulk-checkin.h"
+#include "argv-array.h"
 
 static const char * const builtin_add_usage[] = {
        N_("git add [options] [--] <pathspec>..."),
@@ -141,23 +142,21 @@ static void refresh(int verbose, const struct pathspec *pathspec)
 int run_add_interactive(const char *revision, const char *patch_mode,
                        const struct pathspec *pathspec)
 {
-       int status, ac, i;
-       const char **args;
+       int status, i;
+       struct argv_array argv = ARGV_ARRAY_INIT;
 
-       args = xcalloc(sizeof(const char *), (pathspec->nr + 6));
-       ac = 0;
-       args[ac++] = "add--interactive";
+       argv_array_push(&argv, "add--interactive");
        if (patch_mode)
-               args[ac++] = patch_mode;
+               argv_array_push(&argv, patch_mode);
        if (revision)
-               args[ac++] = revision;
-       args[ac++] = "--";
+               argv_array_push(&argv, revision);
+       argv_array_push(&argv, "--");
        for (i = 0; i < pathspec->nr; i++)
                /* pass original pathspec, to be re-parsed */
-               args[ac++] = pathspec->items[i].original;
+               argv_array_push(&argv, pathspec->items[i].original);
 
-       status = run_command_v_opt(args, RUN_GIT_CMD);
-       free(args);
+       status = run_command_v_opt(argv.argv, RUN_GIT_CMD);
+       argv_array_clear(&argv);
        return status;
 }
 
index 0189523798f31711ad74eaf3dd90ece9c12fa61a..9c5724eaccfaee62ff10eb097adc39ace351cade 100644 (file)
@@ -300,11 +300,13 @@ static int fuzzy_matchlines(const char *s1, size_t n1,
        while ((*last2 == '\r') || (*last2 == '\n'))
                last2--;
 
-       /* skip leading whitespace */
-       while (isspace(*s1) && (s1 <= last1))
-               s1++;
-       while (isspace(*s2) && (s2 <= last2))
-               s2++;
+       /* skip leading whitespaces, if both begin with whitespace */
+       if (s1 <= last1 && s2 <= last2 && isspace(*s1) && isspace(*s2)) {
+               while (isspace(*s1) && (s1 <= last1))
+                       s1++;
+               while (isspace(*s2) && (s2 <= last2))
+                       s2++;
+       }
        /* early return if both lines are empty */
        if ((s1 > last1) && (s2 > last2))
                return 1;
@@ -4061,7 +4063,7 @@ static int write_out_one_reject(struct patch *patch)
                return error(_("cannot open %s: %s"), namebuf, strerror(errno));
 
        /* Normal git tools never deal with .rej, so do not pretend
-        * this is a git patch by saying --git nor give extended
+        * this is a git patch by saying --git or giving extended
         * headers.  While at it, maybe please "kompare" that wants
         * the trailing TAB and some garbage at the end of line ;-).
         */
index e5b5d71bad8653f4b9d19044c3c36dc2ab8b42f1..a52a279144bec14f2b2a0795f30e0c5871f60c1b 100644 (file)
@@ -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"
@@ -74,7 +77,7 @@ static unsigned blame_copy_score;
 #define BLAME_DEFAULT_MOVE_SCORE       20
 #define BLAME_DEFAULT_COPY_SCORE       40
 
-/* bits #0..7 in revision.h, #8..11 used for merge_bases() in commit.c */
+/* Remember to update object flag allocation in object.h */
 #define METAINFO_SHOWN         (1u<<12)
 #define MORE_THAN_ONE_PATH     (1u<<13)
 
@@ -83,11 +86,42 @@ static unsigned blame_copy_score;
  */
 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 inline struct origin *origin_incref(struct origin *o)
 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 @@ static void drop_origin_blob(struct origin *o)
 
 /*
  * 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 @@ struct blame_entry {
        /* 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.
         */
@@ -230,12 +271,113 @@ struct blame_entry {
        unsigned score;
 };
 
+/*
+ * 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 @@ static void coalesce(struct scoreboard *sb)
 
        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;
@@ -283,6 +424,30 @@ static void coalesce(struct scoreboard *sb)
                sanity_check_refcnt(sb);
 }
 
+/*
+ * 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
@@ -295,23 +460,32 @@ static struct origin *make_origin(struct commit *commit, const char *path)
        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 @@ static struct origin *find_origin(struct scoreboard *sb,
                                  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 @@ static struct origin *find_origin(struct scoreboard *sb,
        }
        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 @@ static struct origin *find_rename(struct scoreboard *sb,
 }
 
 /*
- * 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 @@ static void split_overlap(struct blame_entry *split,
 
 /*
  * 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 @@ static void split_blame(struct scoreboard *sb,
 
        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 @@ static void decref_split(struct blame_entry *split)
 }
 
 /*
- * 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)
-{
-       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)
+static struct blame_entry *reverse_blame(struct blame_entry *head,
+                                        struct blame_entry *tail)
 {
-       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 @@ static int blame_chunk_cb(long start_a, long count_a,
  * 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 @@ static void find_copy_in_blob(struct scoreboard *sb,
        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 @@ struct blame_list {
  * 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 @@ static int find_copy_in_parent(struct scoreboard *sb,
        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 @@ static int find_copy_in_parent(struct scoreboard *sb,
                        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 int find_copy_in_parent(struct scoreboard *sb,
 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);
 }
 
 /*
@@ -1184,6 +1378,27 @@ static int num_scapegoats(struct rev_info *revs, struct commit *commit)
        return cnt;
 }
 
+/* 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
 
 static void pass_blame(struct scoreboard *sb, struct origin *origin, int opt)
@@ -1194,6 +1409,8 @@ static void pass_blame(struct scoreboard *sb, struct origin *origin, int opt)
        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 +1472,71 @@ static void pass_blame(struct scoreboard *sb, struct origin *origin, int opt)
                        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 +1731,11 @@ static int emit_one_suspect_detail(struct origin *suspect, int repeat)
 }
 
 /*
- * 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 +1749,34 @@ static void found_guilty_entry(struct blame_entry *ent)
 }
 
 /*
- * 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 +1792,22 @@ static void assign_blame(struct scoreboard *sb, int opt)
                        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 */
@@ -1556,22 +1818,29 @@ static void assign_blame(struct scoreboard *sb, int opt)
 static const char *format_time(unsigned long time, const char *tz_str,
                               int show_raw_time)
 {
-       static char time_buf[128];
+       static struct strbuf time_buf = STRBUF_INIT;
 
+       strbuf_reset(&time_buf);
        if (show_raw_time) {
-               snprintf(time_buf, sizeof(time_buf), "%lu %s", time, tz_str);
+               strbuf_addf(&time_buf, "%lu %s", time, tz_str);
        }
        else {
                const char *time_str;
-               int time_len;
+               size_t time_width;
                int tz;
                tz = atoi(tz_str);
                time_str = show_date(time, tz, blame_date_mode);
-               time_len = strlen(time_str);
-               memcpy(time_buf, time_str, time_len);
-               memset(time_buf + time_len, ' ', blame_date_width - time_len);
+               strbuf_addstr(&time_buf, time_str);
+               /*
+                * Add space paddings to time_buf to display a fixed width
+                * string, and use time_width for display width calibration.
+                */
+               for (time_width = utf8_strwidth(time_str);
+                    time_width < blame_date_width;
+                    time_width++)
+                       strbuf_addch(&time_buf, ' ');
        }
-       return time_buf;
+       return time_buf.buf;
 }
 
 #define OUTPUT_ANNOTATE_COMPAT 001
@@ -1602,9 +1871,8 @@ static void emit_porcelain(struct scoreboard *sb, struct blame_entry *ent,
        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);
@@ -1717,17 +1985,16 @@ static void output(struct scoreboard *sb, int option)
 
        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;
+                               }
                        }
                }
        }
@@ -2088,11 +2355,9 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
                if (strbuf_read(&buf, 0, 0) < 0)
                        die_errno("failed to read from stdin");
        }
-       convert_to_git(path, buf.buf, buf.len, &buf, 0);
        origin->file.ptr = buf.buf;
        origin->file.size = buf.len;
        pretend_sha1_file(buf.buf, buf.len, OBJ_BLOB, origin->blob_sha1);
-       commit->util = origin;
 
        /*
         * Read the current index, replace the path entry with
@@ -2331,7 +2596,14 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
                blame_date_width = sizeof("2006-10-19");
                break;
        case DATE_RELATIVE:
-               /* "normal" is used as the fallback for "relative" */
+               /* TRANSLATORS: This string is used to tell us the maximum
+                  display width for a relative timestamp in "git blame"
+                  output.  For C locale, "4 years, 11 months ago", which
+                  takes 22 places, is the longest among various forms of
+                  relative timestamps, but your language may need more or
+                  fewer display columns. */
+               blame_date_width = utf8_strwidth(_("4 years, 11 months ago")) + 1; /* add the null */
+               break;
        case DATE_LOCAL:
        case DATE_NORMAL:
                blame_date_width = sizeof("Thu Oct 19 16:00:04 2006 -0700");
@@ -2403,12 +2675,16 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
        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) {
                /*
@@ -2497,12 +2773,16 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
                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);
@@ -2515,6 +2795,8 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
        if (incremental)
                return 0;
 
+       sb.ent = blame_sort(sb.ent, compare_blame_final);
+
        coalesce(&sb);
 
        if (!(output_option & OUTPUT_PORCELAIN))
index d5a93e0e911ccbe4560a03ed78436bfb174e0f68..707330499fad66a0bddbb5cf96ff0569e2fe3433 100644 (file)
@@ -269,6 +269,8 @@ static int batch_objects(struct batch_options *opt)
 {
        struct strbuf buf = STRBUF_INIT;
        struct expand_data data;
+       int save_warning;
+       int retval = 0;
 
        if (!opt->format)
                opt->format = "%(objectname) %(objecttype) %(objectsize)";
@@ -297,11 +299,10 @@ static int batch_objects(struct batch_options *opt)
         * warn) ends up dwarfing the actual cost of the object lookups
         * themselves. We can work around it by just turning off the warning.
         */
+       save_warning = warn_on_object_refname_ambiguity;
        warn_on_object_refname_ambiguity = 0;
 
        while (strbuf_getline(&buf, stdin, '\n') != EOF) {
-               int error;
-
                if (data.split_on_whitespace) {
                        /*
                         * Split at first whitespace, tying off the beginning
@@ -316,12 +317,14 @@ static int batch_objects(struct batch_options *opt)
                        data.rest = p;
                }
 
-               error = batch_one_object(buf.buf, opt, &data);
-               if (error)
-                       return error;
+               retval = batch_one_object(buf.buf, opt, &data);
+               if (retval)
+                       break;
        }
 
-       return 0;
+       strbuf_release(&buf);
+       warn_on_object_refname_ambiguity = save_warning;
+       return retval;
 }
 
 static const char * const cat_file_usage[] = {
index a0e72d21e0489c5bed53a4feedc05c4defb6e470..f1dc56e55f7b2200412142b10517458ccfda2952 100644 (file)
@@ -53,10 +53,10 @@ struct checkout_opts {
 static int post_checkout_hook(struct commit *old, struct commit *new,
                              int changed)
 {
-       return run_hook(NULL, "post-checkout",
-                       sha1_to_hex(old ? old->object.sha1 : null_sha1),
-                       sha1_to_hex(new ? new->object.sha1 : null_sha1),
-                       changed ? "1" : "0", NULL);
+       return run_hook_le(NULL, "post-checkout",
+                          sha1_to_hex(old ? old->object.sha1 : null_sha1),
+                          sha1_to_hex(new ? new->object.sha1 : null_sha1),
+                          changed ? "1" : "0", NULL);
        /* "new" can be NULL when checking out from the index before
           a commit exists. */
 
@@ -624,7 +624,7 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
                /* 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 +651,8 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
                        }
                }
                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();
@@ -895,7 +891,7 @@ static int parse_branchname_arg(int argc, const char **argv,
         *       between A and B, A...B names that merge base.
         *
         *   (b) If <something> is _not_ a commit, either "--" is present
-        *       or <something> is not a path, no -t nor -b was given, and
+        *       or <something> is not a path, no -t or -b was given, and
         *       and there is a tracking branch whose name is <something>
         *       in one and only one remote, then this is a short-hand to
         *       fork local <something> from that remote-tracking branch.
index cf76b1f412e5423df42528c928c557764f31ad02..9a9151575d3a8d4eb16d73e432835d3cda4374b8 100644 (file)
@@ -904,11 +904,11 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
 
        if (!interactive && !dry_run && !force) {
                if (config_set)
-                       die(_("clean.requireForce set to true and neither -i, -n nor -f given; "
+                       die(_("clean.requireForce set to true and neither -i, -n, nor -f given; "
                                  "refusing to clean"));
                else
-                       die(_("clean.requireForce defaults to true and neither -i, -n nor -f given; "
-                                 "refusing to clean"));
+                       die(_("clean.requireForce defaults to true and neither -i, -n, nor -f given;"
+                                 " refusing to clean"));
        }
 
        if (force > 1)
index 43e772ccdbaba3172f7ee1a969f92b300cb9d5a1..b12989d1caecb48128e8a468014f07b237b1a4cc 100644 (file)
@@ -521,7 +521,7 @@ static void write_followtags(const struct ref *refs, const char *msg)
                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);
        }
 }
 
@@ -589,14 +589,15 @@ static void update_head(const struct ref *our, const struct ref *remote,
                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 +605,7 @@ static void update_head(const struct ref *our, const struct ref *remote,
                 * 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);
        }
 }
 
@@ -660,8 +661,8 @@ static int checkout(void)
            commit_locked_index(lock_file))
                die(_("unable to write new index file"));
 
-       err |= run_hook(NULL, "post-checkout", sha1_to_hex(null_sha1),
-                       sha1_to_hex(sha1), "1", NULL);
+       err |= run_hook_le(NULL, "post-checkout", sha1_to_hex(null_sha1),
+                          sha1_to_hex(sha1), "1", NULL);
 
        if (!err && option_recursive)
                err = run_command_v_opt(argv_submodule, RUN_GIT_CMD);
index 96bf7620c52a2c853d5d7701395168aeb6be8d94..99c20446352edb477d19122fae2b2821e10d689f 100644 (file)
@@ -113,6 +113,7 @@ static char *sign_commit;
 static enum {
        CLEANUP_SPACE,
        CLEANUP_NONE,
+       CLEANUP_SCISSORS,
        CLEANUP_ALL
 } cleanup_mode;
 static const char *cleanup_arg;
@@ -525,10 +526,29 @@ static int sane_ident_split(struct ident_split *person)
        return 1;
 }
 
+static int parse_force_date(const char *in, char *out, int len)
+{
+       if (len < 1)
+               return -1;
+       *out++ = '@';
+       len--;
+
+       if (parse_date(in, out, len) < 0) {
+               int errors = 0;
+               unsigned long t = approxidate_careful(in, &errors);
+               if (errors)
+                       return -1;
+               snprintf(out, len, "%lu", t);
+       }
+
+       return 0;
+}
+
 static void determine_author_info(struct strbuf *author_ident)
 {
        char *name, *email, *date;
        struct ident_split author;
+       char date_buf[64];
 
        name = getenv("GIT_AUTHOR_NAME");
        email = getenv("GIT_AUTHOR_EMAIL");
@@ -573,8 +593,12 @@ static void determine_author_info(struct strbuf *author_ident)
                email = xstrndup(lb + 2, rb - (lb + 2));
        }
 
-       if (force_date)
-               date = force_date;
+       if (force_date) {
+               if (parse_force_date(force_date, date_buf, sizeof(date_buf)))
+                       die(_("invalid date format: %s"), force_date);
+               date = date_buf;
+       }
+
        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)) {
@@ -584,13 +608,46 @@ static void determine_author_info(struct strbuf *author_ident)
        }
 }
 
-static char *cut_ident_timestamp_part(char *string)
+static void split_ident_or_die(struct ident_split *id, const struct strbuf *buf)
+{
+       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)
 {
-       char *ket = strrchr(string, '>');
-       if (!ket || ket[1] != ' ')
-               die(_("Malformed ident string: '%s'"), string);
-       *++ket = '\0';
-       return ket;
+       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,
@@ -610,7 +667,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
        /* This checks and barfs if author is badly specified */
        determine_author_info(author_ident);
 
-       if (!no_verify && run_hook(index_file, "pre-commit", NULL))
+       if (!no_verify && run_commit_hook(use_editor, index_file, "pre-commit", NULL))
                return 0;
 
        if (squash_message) {
@@ -649,9 +706,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
        } else if (use_message) {
                char *buffer;
                buffer = strstr(use_message_buffer, "\n\n");
-               if (!use_editor && (!buffer || buffer[2] == '\0'))
-                       die(_("commit has empty message"));
-               strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
+               if (buffer)
+                       strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
                hook_arg1 = "commit";
                hook_arg2 = use_message;
        } else if (fixup_message) {
@@ -747,6 +803,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
        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,8 +812,11 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
        if (use_editor && include_status) {
                int ident_shown = 0;
                int saved_color_setting;
-               char *ai_tmp, *ci_tmp;
-               if (whence != FROM_COMMIT)
+               struct ident_split ci, ai;
+
+               if (whence != FROM_COMMIT) {
+                       if (cleanup_mode == CLEANUP_SCISSORS)
+                               wt_status_add_cut_line(s->fp);
                        status_printf_ln(s, GIT_COLOR_NORMAL,
                            whence == FROM_MERGE
                                ? _("\n"
@@ -771,6 +832,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                                git_path(whence == FROM_MERGE
                                         ? "MERGE_HEAD"
                                         : "CHERRY_PICK_HEAD"));
+               }
 
                fprintf(s->fp, "\n");
                if (cleanup_mode == CLEANUP_ALL)
@@ -778,6 +840,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                                _("Please enter the commit message for your changes."
                                  " Lines starting\nwith '%c' will be ignored, and an empty"
                                  " message aborts the commit.\n"), comment_line_char);
+               else if (cleanup_mode == CLEANUP_SCISSORS && whence == FROM_COMMIT)
+                       wt_status_add_cut_line(s->fp);
                else /* CLEANUP_SPACE, that is. */
                        status_printf(s, GIT_COLOR_NORMAL,
                                _("Please enter the commit message for your changes."
@@ -789,32 +853,39 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                        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";
@@ -867,8 +938,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                return 0;
        }
 
-       if (run_hook(index_file, "prepare-commit-msg",
-                    git_path(commit_editmsg), hook_arg1, hook_arg2, NULL))
+       if (run_commit_hook(use_editor, index_file, "prepare-commit-msg",
+                           git_path(commit_editmsg), hook_arg1, hook_arg2, NULL))
                return 0;
 
        if (use_editor) {
@@ -884,7 +955,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
        }
 
        if (!no_verify &&
-           run_hook(index_file, "commit-msg", git_path(commit_editmsg), NULL)) {
+           run_commit_hook(use_editor, index_file, "commit-msg", git_path(commit_editmsg), NULL)) {
                return 0;
        }
 
@@ -1068,8 +1139,6 @@ static int parse_and_validate_options(int argc, const char *argv[],
                use_editor = 0;
        if (0 <= edit_flag)
                use_editor = edit_flag;
-       if (!use_editor)
-               setenv("GIT_EDITOR", ":", 1);
 
        /* Sanity check options */
        if (amend && !current_head)
@@ -1124,7 +1193,7 @@ static int parse_and_validate_options(int argc, const char *argv[],
        if (argc == 0 && only && amend)
                only_include_assumed = _("Clever... amending the last one with dirty index.");
        if (argc > 0 && !also && !only)
-               only_include_assumed = _("Explicit paths specified without -i nor -o; assuming --only paths...");
+               only_include_assumed = _("Explicit paths specified without -i or -o; assuming --only paths...");
        if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
                cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE;
        else if (!strcmp(cleanup_arg, "verbatim"))
@@ -1133,6 +1202,8 @@ static int parse_and_validate_options(int argc, const char *argv[],
                cleanup_mode = CLEANUP_SPACE;
        else if (!strcmp(cleanup_arg, "strip"))
                cleanup_mode = CLEANUP_ALL;
+       else if (!strcmp(cleanup_arg, "scissors"))
+               cleanup_mode = use_editor ? CLEANUP_SCISSORS : CLEANUP_SPACE;
        else
                die(_("Invalid cleanup mode %s"), cleanup_arg);
 
@@ -1350,6 +1421,13 @@ static void print_summary(const char *prefix, const unsigned char *sha1,
                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);
@@ -1450,6 +1528,29 @@ static int run_rewrite_hook(const unsigned char *oldsha1,
        return finish_command(&proc);
 }
 
+int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...)
+{
+       const char *hook_env[3] =  { NULL };
+       char index[PATH_MAX];
+       va_list args;
+       int ret;
+
+       snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
+       hook_env[0] = index;
+
+       /*
+        * Let the hook know that no editor will be launched.
+        */
+       if (!editor_is_used)
+               hook_env[1] = "GIT_EDITOR=:";
+
+       va_start(args, name);
+       ret = run_hook_ve(hook_env, name, args);
+       va_end(args);
+
+       return ret;
+}
+
 int cmd_commit(int argc, const char **argv, const char *prefix)
 {
        static struct wt_status s;
@@ -1605,8 +1706,8 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
                die(_("could not read commit message: %s"), strerror(saved_errno));
        }
 
-       /* Truncate the message just before the diff, if any. */
-       if (verbose)
+       if (verbose || /* Truncate the message just before the diff, if any. */
+           cleanup_mode == CLEANUP_SCISSORS)
                wt_status_truncate_message_at_cut_line(&sb);
 
        if (cleanup_mode != CLEANUP_NONE)
@@ -1643,6 +1744,10 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
                                           ? NULL
                                           : current_head->object.sha1,
                                           0, NULL);
+       if (!ref_lock) {
+               rollback_index_files();
+               die(_("cannot lock HEAD ref"));
+       }
 
        nl = strchr(sb.buf, '\n');
        if (nl)
@@ -1652,10 +1757,6 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
        strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
        strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
 
-       if (!ref_lock) {
-               rollback_index_files();
-               die(_("cannot lock HEAD ref"));
-       }
        if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) {
                rollback_index_files();
                die(_("cannot update HEAD ref"));
@@ -1674,7 +1775,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
                     "not exceeded, and then \"git reset HEAD\" to recover."));
 
        rerere(0);
-       run_hook(get_index_file(), "post-commit", NULL);
+       run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
        if (amend && !no_post_rewrite) {
                struct notes_rewrite_cfg *cfg;
                cfg = init_copy_notes_for_rewrite("amend");
index 63d400bcb2092b1751427994b35057f72b04de17..85f5c2bc62ec1ead593f5aa2e3d7077e65f2f061 100644 (file)
@@ -26,6 +26,7 @@ static const char * const builtin_gc_usage[] = {
 };
 
 static int pack_refs = 1;
+static int aggressive_depth = 250;
 static int aggressive_window = 250;
 static int gc_auto_threshold = 6700;
 static int gc_auto_pack_limit = 50;
@@ -66,6 +67,10 @@ static int gc_config(const char *var, const char *value, void *cb)
                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;
@@ -184,7 +189,7 @@ static int need_to_gc(void)
        else if (!too_many_loose_objects())
                return 0;
 
-       if (run_hook(NULL, "pre-auto-gc", NULL))
+       if (run_hook_le(NULL, "pre-auto-gc", NULL))
                return 0;
        return 1;
 }
@@ -294,7 +299,8 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
 
        if (aggressive) {
                argv_array_push(&repack, "-f");
-               argv_array_push(&repack, "--depth=250");
+               if (aggressive_depth > 0)
+                       argv_array_pushf(&repack, "--depth=%d", aggressive_depth);
                if (aggressive_window > 0)
                        argv_array_pushf(&repack, "--window=%d", aggressive_window);
        }
index 69ac2d8797ec32dc206425db0a2f3d7356810cfe..c86a142f308d614daefd459fd9f9ddebe03f4cb8 100644 (file)
@@ -361,9 +361,7 @@ static void run_pager(struct grep_opt *opt, const char *prefix)
                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);
@@ -874,6 +872,9 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
                if (len > 4 && is_dir_sep(pager[len - 5]))
                        pager += len - 4;
 
+               if (opt.ignore_case && !strcmp("less", pager))
+                       string_list_append(&path_list, "-I");
+
                if (!strcmp("less", pager) || !strcmp("vi", pager)) {
                        struct strbuf buf = STRBUF_INIT;
                        strbuf_addf(&buf, "+/%s%s",
index a6b1c17996da28cef97560378e7586bbf1bd8b6b..18f57de58b02de33909a40ea9720e6602cc9dcb5 100644 (file)
@@ -40,17 +40,13 @@ struct base_data {
        int ofs_first, ofs_last;
 };
 
-#if !defined(NO_PTHREADS) && defined(NO_THREAD_SAFE_PREAD)
-/* pread() emulation is not thread-safe. Disable threading. */
-#define NO_PTHREADS
-#endif
-
 struct thread_local {
 #ifndef NO_PTHREADS
        pthread_t thread;
 #endif
        struct base_data *base_cache;
        size_t base_cache_used;
+       int pack_fd;
 };
 
 /*
@@ -91,7 +87,8 @@ static off_t consumed_bytes;
 static unsigned deepest_delta;
 static git_SHA_CTX input_ctx;
 static uint32_t input_crc32;
-static int input_fd, output_fd, pack_fd;
+static int input_fd, output_fd;
+static const char *curr_pack;
 
 #ifndef NO_PTHREADS
 
@@ -134,6 +131,7 @@ static inline void unlock_mutex(pthread_mutex_t *mutex)
  */
 static void init_thread(void)
 {
+       int i;
        init_recursive_mutex(&read_mutex);
        pthread_mutex_init(&counter_mutex, NULL);
        pthread_mutex_init(&work_mutex, NULL);
@@ -141,11 +139,18 @@ static void init_thread(void)
                pthread_mutex_init(&deepest_delta_mutex, NULL);
        pthread_key_create(&key, NULL);
        thread_data = xcalloc(nr_threads, sizeof(*thread_data));
+       for (i = 0; i < nr_threads; i++) {
+               thread_data[i].pack_fd = open(curr_pack, O_RDONLY);
+               if (thread_data[i].pack_fd == -1)
+                       die_errno(_("unable to open %s"), curr_pack);
+       }
+
        threads_active = 1;
 }
 
 static void cleanup_thread(void)
 {
+       int i;
        if (!threads_active)
                return;
        threads_active = 0;
@@ -154,6 +159,8 @@ static void cleanup_thread(void)
        pthread_mutex_destroy(&work_mutex);
        if (show_stat)
                pthread_mutex_destroy(&deepest_delta_mutex);
+       for (i = 0; i < nr_threads; i++)
+               close(thread_data[i].pack_fd);
        pthread_key_delete(key);
        free(thread_data);
 }
@@ -200,8 +207,13 @@ static unsigned check_object(struct object *obj)
        if (!(obj->flags & FLAG_CHECKED)) {
                unsigned long size;
                int type = sha1_object_info(obj->sha1, &size);
-               if (type != obj->type || type <= 0)
-                       die(_("object of unexpected type"));
+               if (type <= 0)
+                       die(_("did not receive expected object %s"),
+                             sha1_to_hex(obj->sha1));
+               if (type != obj->type)
+                       die(_("object %s: expected type %s, found %s"),
+                           sha1_to_hex(obj->sha1),
+                           typename(obj->type), typename(type));
                obj->flags |= FLAG_CHECKED;
                return 1;
        }
@@ -288,13 +300,13 @@ static const char *open_pack_file(const char *pack_name)
                        output_fd = open(pack_name, O_CREAT|O_EXCL|O_RDWR, 0600);
                if (output_fd < 0)
                        die_errno(_("unable to create '%s'"), pack_name);
-               pack_fd = output_fd;
+               nothread_data.pack_fd = output_fd;
        } else {
                input_fd = open(pack_name, O_RDONLY);
                if (input_fd < 0)
                        die_errno(_("cannot open packfile '%s'"), pack_name);
                output_fd = -1;
-               pack_fd = input_fd;
+               nothread_data.pack_fd = input_fd;
        }
        git_SHA1_Init(&input_ctx);
        return pack_name;
@@ -542,7 +554,7 @@ static void *unpack_data(struct object_entry *obj,
 
        do {
                ssize_t n = (len < 64*1024) ? len : 64*1024;
-               n = pread(pack_fd, inbuf, n, from);
+               n = xpread(get_thread_data()->pack_fd, inbuf, n, from);
                if (n < 0)
                        die_errno(_("cannot pread pack file"));
                if (!n)
@@ -1291,7 +1303,7 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
                if (keep_fd < 0) {
                        if (errno != EEXIST)
                                die_errno(_("cannot write keep file '%s'"),
-                                         keep_name);
+                                         keep_name ? keep_name : name);
                } else {
                        if (keep_msg_len > 0) {
                                write_or_die(keep_fd, keep_msg, keep_msg_len);
@@ -1299,7 +1311,7 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
                        }
                        if (close(keep_fd) != 0)
                                die_errno(_("cannot close written keep file '%s'"),
-                                   keep_name);
+                                         keep_name ? keep_name : name);
                        report = "keep";
                }
        }
@@ -1490,7 +1502,7 @@ static void show_pack_info(int stat_only)
 int cmd_index_pack(int argc, const char **argv, const char *prefix)
 {
        int i, fix_thin_pack = 0, verify = 0, stat_only = 0;
-       const char *curr_pack, *curr_index;
+       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;
index c7c76bbf21fd5b5c9200b2535875b912e4d49000..56f85e239ae0d2607c38e3c46013007ba9e71b12 100644 (file)
@@ -412,11 +412,9 @@ int init_db(const char *template_dir, unsigned int flags)
        if (!(flags & INIT_DB_QUIET)) {
                int len = strlen(git_dir);
 
-               /*
-                * TRANSLATORS: The first '%s' is either "Reinitialized
-                * existing" or "Initialized empty", the second " shared" or
-                * "", and the last '%s%s' is the verbatim directory name.
-                */
+               /* TRANSLATORS: The first '%s' is either "Reinitialized
+                  existing" or "Initialized empty", the second " shared" or
+                  "", and the last '%s%s' is the verbatim directory name. */
                printf(_("%s%s Git repository in %s%s\n"),
                       reinit ? _("Reinitialized existing") : _("Initialized empty"),
                       shared_repository ? _(" shared") : "",
index b97373da3b2687e18b5eba96382049382d1536fd..39e883635279ad21f3ddd7b224f484b9b04700b0 100644 (file)
@@ -503,7 +503,7 @@ static void show_rev_tweak_rev(struct rev_info *rev, struct setup_revision_opt *
                /* There was no "-m" on the command line */
                rev->ignore_merges = 0;
                if (!rev->first_parent_only && !rev->combine_merges) {
-                       /* No "--first-parent", "-c", nor "--cc" */
+                       /* No "--first-parent", "-c", or "--cc" */
                        rev->combine_merges = 1;
                        rev->dense_combined_merges = 1;
                }
index 2a144e1200d6ee0ddbe2ff13aea6f99157a4b291..428ca247bd17e0f18776b46d40a09282b0b955de 100644 (file)
@@ -63,7 +63,7 @@ static int verbosity;
 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[] = {
@@ -398,7 +398,7 @@ static void finish(struct commit *head_commit,
                        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.
@@ -421,7 +421,7 @@ static void finish(struct commit *head_commit,
        }
 
        /* Run a post-merge hook */
-       run_hook(NULL, "post-merge", squash ? "1" : "0", NULL);
+       run_hook_le(NULL, "post-merge", squash ? "1" : "0", NULL);
 
        strbuf_release(&reflog_message);
 }
@@ -824,8 +824,8 @@ static void prepare_to_commit(struct commit_list *remoteheads)
        if (0 < option_edit)
                strbuf_commented_addf(&msg, _(merge_editor_comment), comment_line_char);
        write_merge_msg(&msg);
-       if (run_hook(get_index_file(), "prepare-commit-msg",
-                    git_path("MERGE_MSG"), "merge", NULL, NULL))
+       if (run_commit_hook(0 < option_edit, get_index_file(), "prepare-commit-msg",
+                           git_path("MERGE_MSG"), "merge", NULL))
                abort_commit(remoteheads, NULL);
        if (0 < option_edit) {
                if (launch_editor(git_path("MERGE_MSG"), NULL, NULL))
@@ -1222,7 +1222,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                        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;
@@ -1339,7 +1339,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
        }
 
        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. */
index 7e26eb5229a0c8a526314cecb9860c3dfb0fed00..180ef99127d47d0e8fe9f12a590fd9ba9e524f08 100644 (file)
@@ -180,6 +180,9 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
                                                modes = xrealloc(modes,
                                                                (argc + last - first)
                                                                * sizeof(enum update_mode));
+                                               submodule_gitfile = xrealloc(submodule_gitfile,
+                                                               (argc + last - first)
+                                                               * sizeof(char *));
                                        }
 
                                        dst = add_slash(dst);
@@ -193,13 +196,15 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
                                                        prefix_path(dst, dst_len,
                                                                path + length + 1);
                                                modes[argc + j] = INDEX;
+                                               submodule_gitfile[argc + j] = NULL;
                                        }
                                        argc += last - first;
                                }
                        }
                } else if (cache_name_pos(src, length) < 0)
                        bad = _("not under version control");
-               else if (lstat(dst, &st) == 0) {
+               else if (lstat(dst, &st) == 0 &&
+                        (!ignore_case || strcasecmp(src, dst))) {
                        bad = _("destination exists");
                        if (force) {
                                /*
@@ -228,6 +233,11 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
                                        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
index 39c8573cde00bc15e673ae549fcd0f22ea67d29f..820c34135cab439e2168dd08947bd79d7ed7ae71 100644 (file)
@@ -717,7 +717,7 @@ static int merge_commit(struct notes_merge_options *o)
        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 +812,11 @@ static int merge(int argc, const char **argv, const char *prefix)
        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)",
index 0ee5f1ff94e1689b099f04fff8a05728c70f2f4f..de36c60ca11d248013c2de42d196f1aff8a2937b 100644 (file)
@@ -708,7 +708,7 @@ static struct object_entry **compute_write_order(void)
 static off_t write_reused_pack(struct sha1file *f)
 {
        unsigned char buffer[8192];
-       off_t to_write;
+       off_t to_write, total;
        int fd;
 
        if (!is_pack_valid(reuse_packfile))
@@ -725,7 +725,7 @@ static off_t write_reused_pack(struct sha1file *f)
        if (reuse_packfile_offset < 0)
                reuse_packfile_offset = reuse_packfile->pack_size - 20;
 
-       to_write = reuse_packfile_offset - sizeof(struct pack_header);
+       total = to_write = reuse_packfile_offset - sizeof(struct pack_header);
 
        while (to_write) {
                int read_pack = xread(fd, buffer, sizeof(buffer));
@@ -738,10 +738,23 @@ static off_t write_reused_pack(struct sha1file *f)
 
                sha1write(f, buffer, read_pack);
                to_write -= read_pack;
+
+               /*
+                * We don't know the actual number of objects written,
+                * only how many bytes written, how many bytes total, and
+                * how many objects total. So we can fake it by pretending all
+                * objects we are writing are the same size. This gives us a
+                * smooth progress meter, and at the end it matches the true
+                * answer.
+                */
+               written = reuse_packfile_objects *
+                               (((double)(total - to_write)) / total);
+               display_progress(progress_state, written);
        }
 
        close(fd);
-       written += reuse_packfile_objects;
+       written = reuse_packfile_objects;
+       display_progress(progress_state, written);
        return reuse_packfile_offset - sizeof(struct pack_header);
 }
 
@@ -995,6 +1008,10 @@ static void create_object_entry(const unsigned char *sha1,
        entry->no_try_delta = no_try_delta;
 }
 
+static const char no_closure_warning[] = N_(
+"disabling bitmap writing, as some objects are not being packed"
+);
+
 static int add_object_entry(const unsigned char *sha1, enum object_type type,
                            const char *name, int exclude)
 {
@@ -1005,14 +1022,20 @@ static int add_object_entry(const unsigned char *sha1, enum object_type type,
        if (have_duplicate_entry(sha1, exclude, &index_pos))
                return 0;
 
-       if (!want_object_in_pack(sha1, exclude, &found_pack, &found_offset))
+       if (!want_object_in_pack(sha1, exclude, &found_pack, &found_offset)) {
+               /* The pack is missing an object, so it will not have closure */
+               if (write_bitmap_index) {
+                       warning(_(no_closure_warning));
+                       write_bitmap_index = 0;
+               }
                return 0;
+       }
 
        create_object_entry(sha1, type, pack_name_hash(name),
                            exclude, name && no_try_delta(name),
                            index_pos, found_pack, found_offset);
 
-       display_progress(progress_state, to_pack.nr_objects);
+       display_progress(progress_state, nr_result);
        return 1;
 }
 
@@ -1028,7 +1051,7 @@ static int add_object_entry_from_bitmap(const unsigned char *sha1,
 
        create_object_entry(sha1, type, name_hash, 0, 0, index_pos, pack, offset);
 
-       display_progress(progress_state, to_pack.nr_objects);
+       display_progress(progress_state, nr_result);
        return 1;
 }
 
@@ -1053,7 +1076,7 @@ static int pbase_tree_cache_ix_incr(int ix)
 static struct pbase_tree {
        struct pbase_tree *next;
        /* This is a phony "cache" entry; we are not
-        * going to evict it nor find it through _get()
+        * going to evict it or find it through _get()
         * mechanism -- this is for the toplevel node that
         * would almost always change with any commit.
         */
@@ -2416,23 +2439,29 @@ static void loosen_unused_packed_objects(struct rev_info *revs)
        }
 }
 
+/*
+ * This tracks any options which a reader of the pack might
+ * not understand, and which would therefore prevent blind reuse
+ * of what we have on disk.
+ */
+static int pack_options_allow_reuse(void)
+{
+       return allow_ofs_delta;
+}
+
 static int get_object_list_from_bitmap(struct rev_info *revs)
 {
        if (prepare_bitmap_walk(revs) < 0)
                return -1;
 
-       if (!reuse_partial_packfile_from_bitmap(
+       if (pack_options_allow_reuse() &&
+           !reuse_partial_packfile_from_bitmap(
                        &reuse_packfile,
                        &reuse_packfile_objects,
                        &reuse_packfile_offset)) {
                assert(reuse_packfile_objects);
                nr_result += reuse_packfile_objects;
-
-               if (progress) {
-                       fprintf(stderr, "Reusing existing pack: %d, done.\n",
-                               reuse_packfile_objects);
-                       fflush(stderr);
-               }
+               display_progress(progress_state, nr_result);
        }
 
        traverse_bitmap_commit_list(&add_object_entry_from_bitmap);
index c12a9784e6b45d50129b786a45bb5f4e4dd0801a..e8a8fb13b9ffc8d3276048131e33e9874bc3bdea 100644 (file)
@@ -369,7 +369,7 @@ static int expire_reflog(const char *ref, const unsigned char *sha1, int unused,
        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);
index 4e51addb3e135465bdb728bb00c5dc3dd53b7c51..98eb8c5404914e4046fdb886866b611351deeacf 100644 (file)
@@ -60,6 +60,8 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)
 
        argc = parse_options(argc, argv, prefix, options, rerere_usage, 0);
 
+       git_config(git_xmerge_config, NULL);
+
        if (autoupdate == 1)
                flags = RERERE_AUTOUPDATE;
        if (autoupdate == 0)
index f4e087596b6337d2306af4cf45119752b4a049ea..f368266762fae1e6c783d7351e289e423e408b3c 100644 (file)
@@ -252,11 +252,13 @@ static int reset_refs(const char *rev, const unsigned char *sha1)
        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;
 }
index 6c7c6bde9de9cbc0ace94aa75df30b7b88b43aca..c6e8a7112700c03b2615f9c99c9858884128ab25 100644 (file)
@@ -80,11 +80,19 @@ static int in_commit_list(const struct commit_list *want, struct commit *c)
        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 +100,78 @@ static int contains_recurse(struct commit *candidate,
        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)
+{
+       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)
 {
-       return contains_recurse(candidate, 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,11 +338,11 @@ static int do_sign(struct strbuf *buffer)
 }
 
 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");
 
@@ -378,9 +438,9 @@ static void create_tag(const unsigned char *object, const char *tag,
                        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);
                }
index 1292cfea11d87e8c98ba64ffae9d6a1aeffaca9f..405267f6e2776b3b2bf5c91c1102e090f5ac68f0 100644 (file)
@@ -12,237 +12,329 @@ static const char * const git_update_ref_usage[] = {
        NULL
 };
 
-static int updates_alloc;
-static int updates_count;
-static const struct ref_update **updates;
+static struct ref_transaction *transaction;
 
 static char line_termination = '\n';
 static int update_flags;
 
-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;
+               }
        }
-       return next;
+
+       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);
 }
 
-static void parse_cmd_update(const char *next)
+
+/*
+ * 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 strbuf *input, const char *next)
 {
-       struct strbuf ref = STRBUF_INIT;
-       struct strbuf newvalue = STRBUF_INIT;
-       struct strbuf oldvalue = STRBUF_INIT;
-       struct ref_update *update;
+       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("update: 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, "update", refname,
+                           PARSE_SHA1_ALLOW_EMPTY))
+               die("update %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);
+       have_old = !parse_next_sha1(input, &next, old_sha1, "update", refname,
+                                   PARSE_SHA1_OLD);
 
-       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("update %s: extra input: %s", refname, next);
 
-       if (next && *next)
-               die("update %s has extra input: %s", ref.buf, next);
+       ref_transaction_update(transaction, refname, new_sha1, old_sha1,
+                              update_flags, have_old);
+
+       update_flags = 0;
+       free(refname);
+
+       return next;
 }
 
-static void parse_cmd_create(const char *next)
+static const char *parse_cmd_create(struct strbuf *input, const char *next)
 {
-       struct strbuf ref = STRBUF_INIT;
-       struct strbuf newvalue = STRBUF_INIT;
-       struct ref_update *update;
+       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("create 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("create %s missing <newvalue>", ref.buf);
-       if (is_null_sha1(update->new_sha1))
-               die("create %s given zero new value", ref.buf);
+       if (is_null_sha1(new_sha1))
+               die("create %s: zero <newvalue>", refname);
+
+       if (*next != line_termination)
+               die("create %s: extra input: %s", refname, next);
 
-       if (next && *next)
-               die("create %s has extra input: %s", ref.buf, next);
+       ref_transaction_create(transaction, refname, new_sha1, update_flags);
+
+       update_flags = 0;
+       free(refname);
+
+       return next;
 }
 
-static void parse_cmd_delete(const char *next)
+static const char *parse_cmd_delete(struct strbuf *input, const char *next)
 {
-       struct strbuf ref = STRBUF_INIT;
-       struct strbuf oldvalue = STRBUF_INIT;
-       struct ref_update *update;
+       char *refname;
+       unsigned char old_sha1[20];
+       int have_old;
 
-       update = update_alloc();
+       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("delete 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 != line_termination)
+               die("delete %s: extra input: %s", refname, next);
 
-       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);
+       ref_transaction_delete(transaction, refname, old_sha1,
+                              update_flags, have_old);
 
-       if (next && *next)
-               die("delete %s has extra input: %s", ref.buf, next);
+       update_flags = 0;
+       free(refname);
+
+       return next;
 }
 
-static void parse_cmd_verify(const char *next)
+static const char *parse_cmd_verify(struct strbuf *input, const char *next)
 {
-       struct strbuf ref = STRBUF_INIT;
-       struct strbuf value = STRBUF_INIT;
-       struct ref_update *update;
+       char *refname;
+       unsigned char new_sha1[20];
+       unsigned char old_sha1[20];
+       int have_old;
+
+       refname = parse_refname(input, &next);
+       if (!refname)
+               die("verify: 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;
+       }
 
-       update = update_alloc();
+       if (*next != line_termination)
+               die("verify %s: extra input: %s", refname, next);
 
-       if ((next = parse_first_arg(next, &ref)) != NULL && ref.buf[0])
-               update_store_ref_name(update, ref.buf);
-       else
-               die("verify line missing <ref>");
+       ref_transaction_update(transaction, refname, new_sha1, old_sha1,
+                              update_flags, have_old);
 
-       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);
+       update_flags = 0;
+       free(refname);
 
-       if (next && *next)
-               die("verify %s has extra input: %s", ref.buf, next);
+       return next;
 }
 
-static void parse_cmd_option(const char *next)
+static const char *parse_cmd_option(struct strbuf *input, 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)
 {
-       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(&input, next + 7);
+               else if (starts_with(next, "create "))
+                       next = parse_cmd_create(&input, next + 7);
+               else if (starts_with(next, "delete "))
+                       next = parse_cmd_delete(&input, next + 7);
+               else if (starts_with(next, "verify "))
+                       next = parse_cmd_verify(&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);
+
+               next++;
+       }
 
-       strbuf_release(&cmd);
+       strbuf_release(&input);
 }
 
 int cmd_update_ref(int argc, const char **argv, const char *prefix)
@@ -267,12 +359,17 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
                die("Refusing to perform update with empty message.");
 
        if (read_stdin) {
+               int ret;
+               transaction = ref_transaction_begin();
+
                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);
+               ret = ref_transaction_commit(transaction, msg,
+                                            UPDATE_REFS_DIE_ON_ERR);
+               return ret;
        }
 
        if (end_null)
@@ -304,5 +401,5 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
                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);
 }
index a85e0e4532ad10934b3d9c510db9e26b338f14f1..1222952075fe4c9f3c25373123d8793b7c1692ef 100644 (file)
--- a/bundle.c
+++ b/bundle.c
@@ -120,6 +120,7 @@ static int list_refs(struct ref_list *r, int argc, const char **argv)
        return 0;
 }
 
+/* Remember to update object flag allocation in object.h */
 #define PREREQ_MARK (1u<<16)
 
 int verify_bundle(struct bundle_header *header, int verbose)
diff --git a/cache.h b/cache.h
index 107ac61b68f15b1e15532c09fda9e9799f830e44..1e4b4f06e1ee013db0cb696115ead61a76087f4e 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -74,6 +74,21 @@ unsigned long git_deflate_bound(git_zstream *, unsigned long);
 #define S_IFGITLINK    0160000
 #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
@@ -279,6 +294,7 @@ struct index_state {
                 initialized : 1;
        struct hashmap name_hash;
        struct hashmap dir_hash;
+       unsigned char sha1[20];
 };
 
 extern struct index_state the_index;
@@ -602,6 +618,7 @@ extern int precomposed_unicode;
  * that is subject to stripspace.
  */
 extern char comment_line_char;
+extern int auto_comment_line_char;
 
 enum branch_track {
        BRANCH_TRACK_UNSPECIFIED = -1,
@@ -1045,6 +1062,13 @@ struct ident_split {
  */
 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.
@@ -1271,8 +1295,8 @@ extern int check_repository_format_version(const char *var, const char *value, v
 extern int git_env_bool(const char *, int);
 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);
@@ -1322,6 +1346,8 @@ extern void fsync_or_die(int fd, const char *);
 
 extern ssize_t read_in_full(int fd, void *buf, size_t count);
 extern ssize_t write_in_full(int fd, const void *buf, size_t count);
+extern ssize_t pread_in_full(int fd, void *buf, size_t count, off_t offset);
+
 static inline ssize_t write_str_in_full(int fd, const char *str)
 {
        return write_in_full(fd, str, strlen(str));
index d6fe6cf1749ebcd6189fa36cbb4e14a532d2d17b..07cff69d8e5c5fdbca47b603dbc2e9c067d369fd 100755 (executable)
@@ -14,8 +14,8 @@ sort |
     bad=0
     while read builtin
     do
-       base=`expr "$builtin" : 'git-\(.*\)'`
-       x=`sed -ne 's/.*{ "'$base'", \(cmd_[^, ]*\).*/'$base'   \1/p' git.c`
+       base=$(expr "$builtin" : 'git-\(.*\)')
+       x=$(sed -ne 's/.*{ "'$base'", \(cmd_[^, ]*\).*/'$base'  \1/p' git.c)
        if test -z "$x"
        then
                echo "$base is builtin but not listed in git.c command list"
index 9367ba5db589e63b770c431121176ff046603d06..8d1ce88d1493cf18436b03f843c6d90190d47bb2 100644 (file)
--- a/column.c
+++ b/column.c
@@ -311,8 +311,8 @@ static int parse_config(unsigned int *colopts, const char *value)
                value += strspn(value, sep);
        }
        /*
-        * Setting layout implies "always" if neither always, never
-        * nor auto is specified.
+        * If none of "always", "never", and "auto" is specified, then setting
+        * layout implies "always".
         *
         * Current value in COL_ENABLE_MASK is disregarded. This means if
         * you set column.ui = auto and pass --column=row, then "auto"
index 24ca7e2334b68e06afd24051ad1aafcc129bcba4..f9975d2c2ebc83e8ecfc953c8df907fbff7858f5 100644 (file)
@@ -1301,6 +1301,81 @@ static const char *path_path(void *obj)
        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,49 +1383,83 @@ void diff_tree_combined(const unsigned char *sha1,
 {
        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;
+
+       /* nothing to do, if no parents */
+       if (!num_parent)
+               return;
+
+       show_log_first = !!rev->loginfo && !rev->no_commit_id;
+       needsep = 0;
+       if (show_log_first) {
+               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);
+       }
 
        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;
 
-       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
+       /* 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)
-                               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 */
index 0f28902bc351fef9d621cfe290f887921ec779c4..f4793316a21fe5f3ee1932f7e24cf4ab0920b04c 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -721,7 +721,7 @@ void sort_in_topological_order(struct commit_list **list, enum rev_sort_order so
 
 /* merge-base stuff */
 
-/* bits #0..15 in revision.h */
+/* Remember to update object flag allocation in object.h */
 #define PARENT1                (1u<<16)
 #define PARENT2                (1u<<17)
 #define STALE          (1u<<18)
index 55631f191f2a01276e8a16192117fb3cf25bc958..a9f177ba488a7002409eb2cdee1f7e9c3673529f 100644 (file)
--- a/commit.h
+++ b/commit.h
@@ -304,4 +304,7 @@ extern void check_commit_signature(const struct commit* commit, struct signature
 
 int compare_commits_by_commit_date(const void *a_, const void *b_, void *unused);
 
+LAST_ARG_MUST_BE_NULL
+extern int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...);
+
 #endif /* COMMIT_H */
diff --git a/compat/gmtime.c b/compat/gmtime.c
new file mode 100644 (file)
index 0000000..e8362dd
--- /dev/null
@@ -0,0 +1,29 @@
+#include "../git-compat-util.h"
+#undef gmtime
+#undef gmtime_r
+
+struct tm *git_gmtime(const time_t *timep)
+{
+       static struct tm result;
+       return git_gmtime_r(timep, &result);
+}
+
+struct tm *git_gmtime_r(const time_t *timep, struct tm *result)
+{
+       struct tm *ret;
+
+       memset(result, 0, sizeof(*result));
+       ret = gmtime_r(timep, result);
+
+       /*
+        * Rather than NULL, FreeBSD gmtime simply leaves the "struct tm"
+        * untouched when it encounters overflow. Since "mday" cannot otherwise
+        * be zero, we can test this very quickly.
+        */
+       if (ret && !ret->tm_mday) {
+               ret = NULL;
+               errno = EOVERFLOW;
+       }
+
+       return ret;
+}
index c9d46d174259f42a3e2a2eb073475aba517044be..7f662fef7bcb408045eb1536afed058a607ae97b 100644 (file)
@@ -14,7 +14,7 @@ void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t of
        }
 
        while (n < length) {
-               ssize_t count = pread(fd, (char *)start + n, length - n, offset + n);
+               ssize_t count = xpread(fd, (char *)start + n, length - n, offset + n);
 
                if (count == 0) {
                        memset((char *)start+n, 0, length-n);
@@ -22,8 +22,6 @@ void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t of
                }
 
                if (count < 0) {
-                       if (errno == EAGAIN || errno == EINTR)
-                               continue;
                        free(start);
                        errno = EACCES;
                        return MAP_FAILED;
index 31163f2ae7b71857889f561dea0b3ffecff61989..a9b41d89f465208b6f0e417672077403bf30898f 100644 (file)
@@ -605,7 +605,7 @@ poll (struct pollfd *pfd, nfds_t nfd, int timeout)
 
   if (!rc && timeout == INFTIM)
     {
-      SwitchToThread();
+      SleepEx (1, TRUE);
       goto restart;
     }
 
diff --git a/compat/vcbuild/include/alloca.h b/compat/vcbuild/include/alloca.h
deleted file mode 100644 (file)
index c0d7985..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <malloc.h>
index 4374771df202ed3c9d96439ec4695ccd55998167..a87d0da512e095ad261bef868a866a7e6f5e3bef 100755 (executable)
@@ -33,6 +33,8 @@
                push(@args, "libeay32.lib");
        } elsif ("$arg" eq "-lssl") {
                push(@args, "ssleay32.lib");
+       } elsif ("$arg" eq "-lcurl") {
+               push(@args, "libcurl.lib");
        } elsif ("$arg" =~ /^-L/ && "$arg" ne "-LTCG") {
                $arg =~ s/^-L/-LIBPATH:/;
                push(@args, $arg);
diff --git a/compat/win32/alloca.h b/compat/win32/alloca.h
new file mode 100644 (file)
index 0000000..c0d7985
--- /dev/null
@@ -0,0 +1 @@
+#include <malloc.h>
index 6821cef00a0da56fbdadbd34d179ba5bd125c3a6..3c3e31448e5be385f9302ccce9c6993667014e5b 100644 (file)
--- a/config.c
+++ b/config.c
@@ -557,6 +557,7 @@ int git_parse_ulong(const char *value, unsigned long *ret)
        return 1;
 }
 
+NORETURN
 static void die_bad_number(const char *name, const char *value)
 {
        const char *reason = errno == ERANGE ?
@@ -825,9 +826,16 @@ static int git_default_core_config(const char *var, const char *value)
        if (!strcmp(var, "core.commentchar")) {
                const char *comment;
                int ret = git_config_string(&comment, var, value);
-               if (!ret)
+               if (ret)
+                       return ret;
+               else if (!strcasecmp(comment, "auto"))
+                       auto_comment_line_char = 1;
+               else if (comment[0] && !comment[1]) {
                        comment_line_char = comment[0];
-               return ret;
+                       auto_comment_line_char = 0;
+               } else
+                       return error("core.commentChar should only be one character");
+               return 0;
        }
 
        if (!strcmp(var, "core.askpass"))
@@ -1635,6 +1643,13 @@ int git_config_set_multivar_in_file(const char *config_filename,
                        MAP_PRIVATE, in_fd, 0);
                close(in_fd);
 
+               if (fchmod(fd, st.st_mode & 07777) < 0) {
+                       error("fchmod on %s failed: %s",
+                               lock->filename, strerror(errno));
+                       ret = CONFIG_NO_WRITE;
+                       goto out_free;
+               }
+
                if (store.seen == 0)
                        store.seen = 1;
 
@@ -1783,6 +1798,7 @@ int git_config_rename_section_in_file(const char *config_filename,
        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);
@@ -1804,6 +1820,14 @@ int git_config_rename_section_in_file(const char *config_filename,
                goto unlock_and_out;
        }
 
+       fstat(fileno(config_file), &st);
+
+       if (fchmod(out_fd, st.st_mode & 07777) < 0) {
+               ret = error("fchmod on %s failed: %s",
+                               lock->filename, strerror(errno));
+               goto out;
+       }
+
        while (fgets(buf, sizeof(buf), config_file)) {
                int i;
                int length;
index 6069a4435008e02b5043927e11439aabf64c3e2d..1ae675b05344912d8798b9856b60b03c282cf908 100644 (file)
@@ -28,6 +28,7 @@ ifeq ($(uname_S),OSF1)
        NO_NSEC = YesPlease
 endif
 ifeq ($(uname_S),Linux)
+       HAVE_ALLOCA_H = YesPlease
        NO_STRLCPY = YesPlease
        NO_MKSTEMPS = YesPlease
        HAVE_PATHS_H = YesPlease
@@ -35,6 +36,7 @@ ifeq ($(uname_S),Linux)
        HAVE_DEV_TTY = YesPlease
 endif
 ifeq ($(uname_S),GNU/kFreeBSD)
+       HAVE_ALLOCA_H = YesPlease
        NO_STRLCPY = YesPlease
        NO_MKSTEMPS = YesPlease
        HAVE_PATHS_H = YesPlease
@@ -103,6 +105,7 @@ ifeq ($(uname_S),SunOS)
        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 +148,7 @@ ifeq ($(uname_S),SunOS)
        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)
@@ -157,7 +160,6 @@ ifeq ($(uname_O),Cygwin)
                NO_SYMLINK_HEAD = YesPlease
                NO_IPV6 = YesPlease
                OLD_ICONV = UnfortunatelyYes
-               NO_THREAD_SAFE_PREAD = YesPlease
                # There are conflicting reports about this.
                # On some boxes NO_MMAP is needed, and not so elsewhere.
                # Try commenting this out if you suspect MMAP is more efficient
@@ -165,6 +167,7 @@ ifeq ($(uname_O),Cygwin)
        else
                NO_REGEX = UnfortunatelyYes
        endif
+       HAVE_ALLOCA_H = YesPlease
        NEEDS_LIBICONV = YesPlease
        NO_FAST_WORKING_DIRECTORY = UnfortunatelyYes
        NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
@@ -187,6 +190,7 @@ ifeq ($(uname_S),FreeBSD)
        endif
        PYTHON_PATH = /usr/local/bin/python
        HAVE_PATHS_H = YesPlease
+       GMTIME_UNRELIABLE_ERRORS = UnfortunatelyYes
 endif
 ifeq ($(uname_S),OpenBSD)
        NO_STRCASESTR = YesPlease
@@ -238,6 +242,7 @@ ifeq ($(uname_S),AIX)
 endif
 ifeq ($(uname_S),GNU)
        # GNU/Hurd
+       HAVE_ALLOCA_H = YesPlease
        NO_STRLCPY = YesPlease
        NO_MKSTEMPS = YesPlease
        HAVE_PATHS_H = YesPlease
@@ -312,6 +317,7 @@ endif
 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
@@ -331,7 +337,6 @@ ifeq ($(uname_S),Windows)
        NO_MKSTEMPS = YesPlease
        SNPRINTF_RETURNS_BOGUS = YesPlease
        NO_SVN_TESTS = YesPlease
-       NO_PERL_MAKEMAKER = YesPlease
        RUNTIME_PREFIX = YesPlease
        NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
        NO_NSEC = YesPlease
@@ -340,7 +345,6 @@ ifeq ($(uname_S),Windows)
        UNRELIABLE_FSTAT = UnfortunatelyYes
        OBJECT_CREATION_USES_RENAMES = UnfortunatelyNeedsTo
        NO_REGEX = YesPlease
-       NO_CURL = YesPlease
        NO_GETTEXT = YesPlease
        NO_PYTHON = YesPlease
        BLK_SHA1 = YesPlease
@@ -358,17 +362,17 @@ ifeq ($(uname_S),Windows)
        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
-       EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.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
@@ -466,6 +470,7 @@ ifeq ($(uname_S),NONSTOP_KERNEL)
 endif
 ifneq (,$(findstring MINGW,$(uname_S)))
        pathsep = ;
+       HAVE_ALLOCA_H = YesPlease
        NO_PREAD = YesPlease
        NEEDS_CRYPTO_WITH_SSL = YesPlease
        NO_LIBGEN_H = YesPlease
index 24ab7383aecf36e010f838d04b671903d1d8a79f..4b1ae7c3c9f5ff5080dc026a6eb835d579d29949 100644 (file)
@@ -272,6 +272,14 @@ AS_HELP_STRING([],           [ARG can be also prefix for libpcre library and hea
        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.
@@ -890,7 +898,7 @@ GIT_CONF_SUBST([HAVE_STRINGS_H])
 # and libcharset does
 CHARSET_LIB=
 AC_CHECK_LIB([iconv], [locale_charset],
-       [],
+       [CHARSET_LIB=-liconv],
        [AC_CHECK_LIB([charset], [locale_charset],
                      [CHARSET_LIB=-lcharset])])
 GIT_CONF_SUBST([CHARSET_LIB])
index 4150412e2c0ebf6129137baf41c9d268d50c60bd..a983d061a90f0b720afa1a9b50247da299164d79 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -727,7 +727,7 @@ struct child_process *git_connect(int fd[2], const char *url,
                                *arg++ = port;
                        }
                        *arg++ = ssh_host;
-               }       else {
+               } else {
                        /* remove repo-local variables from the environment */
                        conn->env = local_repo_env;
                        conn->use_shell = 1;
index 87de809d23146c2cee818555028cf8a24dc6c908..2c59a76bc2cf2d0fefb633efe805b6c7c15ad7ec 100644 (file)
@@ -2564,6 +2564,7 @@ __git_main ()
 
        local expansion=$(__git_aliased_command "$command")
        if [ -n "$expansion" ]; then
+               words[1]=$expansion
                completion_func="_git_${expansion//-/_}"
                declare -f $completion_func >/dev/null && $completion_func
        fi
index 6b779685722916f8032dce9b3b46220eb6a19414..9f6f0fa5581002a2371e062fd5def0978733edc1 100644 (file)
@@ -104,6 +104,7 @@ __git_zsh_bash_func ()
 
        local expansion=$(__git_aliased_command "$command")
        if [ -n "$expansion" ]; then
+               words[1]=$expansion
                completion_func="_git_${expansion//-/_}"
                declare -f $completion_func >/dev/null && $completion_func
        fi
index 7b732d2aeba0e3bca3b42d28f2f8f5730a08ccee..9d684b10a67ea663410db3ba68482c1a52bbc367 100644 (file)
@@ -207,7 +207,16 @@ __git_ps1_show_upstream ()
                        p=" u+${count#* }-${count%      *}" ;;
                esac
                if [[ -n "$count" && -n "$name" ]]; then
-                       p="$p $(git rev-parse --abbrev-ref "$upstream" 2>/dev/null)"
+                       __git_ps1_upstream_name=$(git rev-parse \
+                               --abbrev-ref "$upstream" 2>/dev/null)
+                       if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then
+                               p="$p \${__git_ps1_upstream_name}"
+                       else
+                               p="$p ${__git_ps1_upstream_name}"
+                               # not needed anymore; keep user's
+                               # environment clean
+                               unset __git_ps1_upstream_name
+                       fi
                fi
        fi
 
@@ -259,6 +268,13 @@ __git_ps1_colorize_gitstring ()
        r="$c_clear$r"
 }
 
+__git_eread ()
+{
+       f="$1"
+       shift
+       test -r "$f" && read "$@" <"$f"
+}
+
 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
 # when called from PS1 using command substitution
 # in this mode it prints text to add to bash PS1 prompt (includes branch name)
@@ -290,6 +306,43 @@ __git_ps1 ()
                ;;
        esac
 
+       # ps1_expanded:  This variable is set to 'yes' if the shell
+       # subjects the value of PS1 to parameter expansion:
+       #
+       #   * bash does unless the promptvars option is disabled
+       #   * zsh does not unless the PROMPT_SUBST option is set
+       #   * POSIX shells always do
+       #
+       # If the shell would expand the contents of PS1 when drawing
+       # the prompt, a raw ref name must not be included in PS1.
+       # This protects the user from arbitrary code execution via
+       # specially crafted ref names.  For example, a ref named
+       # 'refs/heads/$(IFS=_;cmd=sudo_rm_-rf_/;$cmd)' might cause the
+       # shell to execute 'sudo rm -rf /' when the prompt is drawn.
+       #
+       # Instead, the ref name should be placed in a separate global
+       # variable (in the __git_ps1_* namespace to avoid colliding
+       # with the user's environment) and that variable should be
+       # referenced from PS1.  For example:
+       #
+       #     __git_ps1_foo=$(do_something_to_get_ref_name)
+       #     PS1="...stuff...\${__git_ps1_foo}...stuff..."
+       #
+       # If the shell does not expand the contents of PS1, the raw
+       # ref name must be included in PS1.
+       #
+       # The value of this variable is only relevant when in pcmode.
+       #
+       # Assume that the shell follows the POSIX specification and
+       # expands PS1 unless determined otherwise.  (This is more
+       # likely to be correct if the user has a non-bash, non-zsh
+       # shell and safer than the alternative if the assumption is
+       # incorrect.)
+       #
+       local ps1_expanded=yes
+       [ -z "$ZSH_VERSION" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no
+       [ -z "$BASH_VERSION" ] || shopt -q promptvars || ps1_expanded=no
+
        local repo_info rev_parse_exit_code
        repo_info="$(git rev-parse --git-dir --is-inside-git-dir \
                --is-bare-repository --is-inside-work-tree \
@@ -321,9 +374,9 @@ __git_ps1 ()
        local step=""
        local total=""
        if [ -d "$g/rebase-merge" ]; then
-               read b 2>/dev/null <"$g/rebase-merge/head-name"
-               read step 2>/dev/null <"$g/rebase-merge/msgnum"
-               read total 2>/dev/null <"$g/rebase-merge/end"
+               __git_eread "$g/rebase-merge/head-name" b
+               __git_eread "$g/rebase-merge/msgnum" step
+               __git_eread "$g/rebase-merge/end" total
                if [ -f "$g/rebase-merge/interactive" ]; then
                        r="|REBASE-i"
                else
@@ -331,10 +384,10 @@ __git_ps1 ()
                fi
        else
                if [ -d "$g/rebase-apply" ]; then
-                       read step 2>/dev/null <"$g/rebase-apply/next"
-                       read total 2>/dev/null <"$g/rebase-apply/last"
+                       __git_eread "$g/rebase-apply/next" step
+                       __git_eread "$g/rebase-apply/last" total
                        if [ -f "$g/rebase-apply/rebasing" ]; then
-                               read b 2>/dev/null <"$g/rebase-apply/head-name"
+                               __git_eread "$g/rebase-apply/head-name" b
                                r="|REBASE"
                        elif [ -f "$g/rebase-apply/applying" ]; then
                                r="|AM"
@@ -358,7 +411,7 @@ __git_ps1 ()
                        b="$(git symbolic-ref HEAD 2>/dev/null)"
                else
                        local head=""
-                       if ! read head 2>/dev/null <"$g/HEAD"; then
+                       if ! __git_eread "$g/HEAD" head; then
                                if [ $pcmode = yes ]; then
                                        PS1="$ps1pc_start$ps1pc_end"
                                fi
@@ -438,8 +491,14 @@ __git_ps1 ()
                __git_ps1_colorize_gitstring
        fi
 
+       b=${b##refs/heads/}
+       if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then
+               __git_ps1_branch_name=$b
+               b="\${__git_ps1_branch_name}"
+       fi
+
        local f="$w$i$s$u"
-       local gitstring="$c${b##refs/heads/}${f:+$z$f}$r$p"
+       local gitstring="$c$b${f:+$z$f}$r$p"
 
        if [ $pcmode = yes ]; then
                if [ "${__git_printf_supports_v-}" != yes ]; then
diff --git a/contrib/diffall/README b/contrib/diffall/README
deleted file mode 100644 (file)
index 507f17d..0000000
+++ /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 (executable)
index 84f2b65..0000000
+++ /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
index 8bc8c7533a8678e2a43d3ddd49bc9aa8d670897d..ee1916641e46c1adfaac31e27c78c11b023d6ffa 100644 (file)
@@ -31,7 +31,8 @@ static int update_ref_env(const char *action,
                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,
index 1a7689a48f07a6ed2bb156f745bfea19a10e3eb9..683cae7c3fad09bec012351b530b7e909d70890f 100755 (executable)
@@ -168,7 +168,7 @@ cd_to_toplevel
 # branch.  However, if "git checkout HEAD" detaches the HEAD
 # from the current branch, even though that may be logically
 # correct, it feels somewhat funny.  More importantly, we do not
-# want "git checkout" nor "git checkout -f" to detach HEAD.
+# want "git checkout" or "git checkout -f" to detach HEAD.
 
 detached=
 detach_warn=
@@ -222,7 +222,7 @@ else
 
        # Match the index to the working tree, and do a three-way.
        git diff-files --name-only | git update-index --remove --stdin &&
-       work=`git write-tree` &&
+       work=$(git write-tree) &&
        git read-tree $v --reset -u $new || exit
 
        eval GITHEAD_$new='${new_name:-${branch:-$new}}' &&
@@ -233,7 +233,7 @@ else
        # Do not register the cleanly merged paths in the index yet.
        # this is not a real merge before committing, but just carrying
        # the working tree changes along.
-       unmerged=`git ls-files -u`
+       unmerged=$(git ls-files -u)
        git read-tree $v --reset $new
        case "$unmerged" in
        '')     ;;
@@ -269,7 +269,7 @@ if [ "$?" -eq 0 ]; then
        fi
        if test -n "$branch"
        then
-               old_branch_name=`expr "z$oldbranch" : 'zrefs/heads/\(.*\)'`
+               old_branch_name=$(expr "z$oldbranch" : 'zrefs/heads/\(.*\)')
                GIT_DIR="$GIT_DIR" git symbolic-ref -m "checkout: moving from ${old_branch_name:-$old} to $branch" HEAD "refs/heads/$branch"
                if test -n "$quiet"
                then
@@ -282,7 +282,7 @@ if [ "$?" -eq 0 ]; then
                fi
        elif test -n "$detached"
        then
-               old_branch_name=`expr "z$oldbranch" : 'zrefs/heads/\(.*\)'`
+               old_branch_name=$(expr "z$oldbranch" : 'zrefs/heads/\(.*\)')
                git update-ref --no-deref -m "checkout: moving from ${old_branch_name:-$old} to $arg" HEAD "$detached" ||
                        die "Cannot detach HEAD"
                if test -n "$detach_warn"
index 547228e13ce60e575d0b4a10a322edfff6c0622c..b4c9376a2cf1611d777e3f995cae9f20e6616e4d 100755 (executable)
@@ -40,7 +40,7 @@ eval "$(echo "$OPTIONS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)
 
 get_repo_base() {
        (
-               cd "`/bin/pwd`" &&
+               cd "$(/bin/pwd)" &&
                cd "$1" || cd "$1.git" &&
                {
                        cd .git
@@ -50,7 +50,7 @@ get_repo_base() {
 }
 
 if [ -n "$GIT_SSL_NO_VERIFY" -o \
-       "`git config --bool http.sslVerify`" = false ]; then
+       "$(git config --bool http.sslVerify)" = false ]; then
     curl_extra_args="-k"
 fi
 
@@ -70,7 +70,7 @@ clone_dumb_http () {
        clone_tmp="$GIT_DIR/clone-tmp" &&
        mkdir -p "$clone_tmp" || exit 1
        if [ -n "$GIT_CURL_FTP_NO_EPSV" -o \
-               "`git config --bool http.noEPSV`" = true ]; then
+               "$(git config --bool http.noEPSV)" = true ]; then
                curl_extra_args="${curl_extra_args} --disable-epsv"
        fi
        http_fetch "$1/info/refs" "$clone_tmp/refs" ||
@@ -79,7 +79,7 @@ Perhaps git-update-server-info needs to be run there?"
        test "z$quiet" = z && v=-v || v=
        while read sha1 refname
        do
-               name=`expr "z$refname" : 'zrefs/\(.*\)'` &&
+               name=$(expr "z$refname" : 'zrefs/\(.*\)') &&
                case "$name" in
                *^*)    continue;;
                esac
@@ -88,7 +88,7 @@ Perhaps git-update-server-info needs to be run there?"
                *)      continue ;;
                esac
                if test -n "$use_separate_remote" &&
-                  branch_name=`expr "z$name" : 'zheads/\(.*\)'`
+                  branch_name=$(expr "z$name" : 'zheads/\(.*\)')
                then
                        tname="remotes/$origin/$branch_name"
                else
@@ -100,7 +100,7 @@ Perhaps git-update-server-info needs to be run there?"
        http_fetch "$1/HEAD" "$GIT_DIR/REMOTE_HEAD" ||
        rm -f "$GIT_DIR/REMOTE_HEAD"
        if test -f "$GIT_DIR/REMOTE_HEAD"; then
-               head_sha1=`cat "$GIT_DIR/REMOTE_HEAD"`
+               head_sha1=$(cat "$GIT_DIR/REMOTE_HEAD")
                case "$head_sha1" in
                'ref: refs/'*)
                        ;;
@@ -444,15 +444,15 @@ then
        # a non-bare repository is always in separate-remote layout
        remote_top="refs/remotes/$origin"
        head_sha1=
-       test ! -r "$GIT_DIR/REMOTE_HEAD" || head_sha1=`cat "$GIT_DIR/REMOTE_HEAD"`
+       test ! -r "$GIT_DIR/REMOTE_HEAD" || head_sha1=$(cat "$GIT_DIR/REMOTE_HEAD")
        case "$head_sha1" in
        'ref: refs/'*)
                # Uh-oh, the remote told us (http transport done against
                # new style repository with a symref HEAD).
                # Ideally we should skip the guesswork but for now
                # opt for minimum change.
-               head_sha1=`expr "z$head_sha1" : 'zref: refs/heads/\(.*\)'`
-               head_sha1=`cat "$GIT_DIR/$remote_top/$head_sha1"`
+               head_sha1=$(expr "z$head_sha1" : 'zref: refs/heads/\(.*\)')
+               head_sha1=$(cat "$GIT_DIR/$remote_top/$head_sha1")
                ;;
        esac
 
@@ -467,7 +467,7 @@ then
                while read name
                do
                        test t = $done && continue
-                       branch_tip=`cat "$GIT_DIR/$remote_top/$name"`
+                       branch_tip=$(cat "$GIT_DIR/$remote_top/$name")
                        if test "$head_sha1" = "$branch_tip"
                        then
                                echo "$name"
index 23ffb028d1ece96d8c363ddeacca83d2b20b628f..5cafe2eb7715123ba0d748be308f35731ea89ddb 100755 (executable)
@@ -91,7 +91,7 @@ signoff=
 force_author=
 only_include_assumed=
 untracked_files=
-templatefile="`git config commit.template`"
+templatefile="$(git config commit.template)"
 while test $# != 0
 do
        case "$1" in
@@ -280,7 +280,7 @@ case "$#,$also,$only,$amend" in
 0,,,*)
        ;;
 *,,,*)
-       only_include_assumed="# Explicit paths specified without -i nor -o; assuming --only paths..."
+       only_include_assumed="# Explicit paths specified without -i or -o; assuming --only paths..."
        also=
        ;;
 esac
@@ -350,7 +350,7 @@ t,)
                TMP_INDEX="$GIT_DIR/tmp-index$$"
                W=
                test -z "$initial_commit" && W=--with-tree=HEAD
-               commit_only=`git ls-files --error-unmatch $W -- "$@"` || exit
+               commit_only=$(git ls-files --error-unmatch $W -- "$@") || exit
 
                # Build a temporary index and update the real index
                # the same way.
@@ -475,8 +475,8 @@ then
 fi
 if test '' != "$force_author"
 then
-       GIT_AUTHOR_NAME=`expr "z$force_author" : 'z\(.*[^ ]\) *<.*'` &&
-       GIT_AUTHOR_EMAIL=`expr "z$force_author" : '.*\(<.*\)'` &&
+       GIT_AUTHOR_NAME=$(expr "z$force_author" : 'z\(.*[^ ]\) *<.*') &&
+       GIT_AUTHOR_EMAIL=$(expr "z$force_author" : '.*\(<.*\)') &&
        test '' != "$GIT_AUTHOR_NAME" &&
        test '' != "$GIT_AUTHOR_EMAIL" ||
        die "malformed --author parameter"
@@ -489,7 +489,7 @@ then
        rloga='commit'
        if [ -f "$GIT_DIR/MERGE_HEAD" ]; then
                rloga='commit (merge)'
-               PARENTS="-p HEAD "`sed -e 's/^/-p /' "$GIT_DIR/MERGE_HEAD"`
+               PARENTS="-p HEAD "$(sed -e 's/^/-p /' "$GIT_DIR/MERGE_HEAD")
        elif test -n "$amend"; then
                rloga='commit (amend)'
                PARENTS=$(git cat-file commit HEAD |
index a314273bd51a865d9d5fc5cd899a51ffa70388a5..554070909cca4d229325a6ca6f401af8bc603cb2 100755 (executable)
@@ -67,7 +67,7 @@ do
                keep='-k -k'
                ;;
        --depth=*)
-               shallow_depth="--depth=`expr "z$1" : 'z-[^=]*=\(.*\)'`"
+               shallow_depth="--depth=$(expr "z$1" : 'z-[^=]*=\(.*\)')"
                ;;
        --depth)
                shift
@@ -262,12 +262,12 @@ fetch_per_ref () {
       http://* | https://* | ftp://*)
          test -n "$shallow_depth" &&
                die "shallow clone with http not supported"
-         proto=`expr "$remote" : '\([^:]*\):'`
+         proto=$(expr "$remote" : '\([^:]*\):')
          if [ -n "$GIT_SSL_NO_VERIFY" ]; then
              curl_extra_args="-k"
          fi
          if [ -n "$GIT_CURL_FTP_NO_EPSV" -o \
-               "`git config --bool http.noEPSV`" = true ]; then
+               "$(git config --bool http.noEPSV)" = true ]; then
              noepsv_opt="--disable-epsv"
          fi
 
index fec70bbf88c614a2dadfc40950fdd7abdf7f2c63..2aa89a7df8ecd1ca8655fda650a4abd4a08a4cc6 100755 (executable)
@@ -55,11 +55,11 @@ tmpdir=$tmp-d
 case "$peek_repo" in
 http://* | https://* | ftp://* )
        if [ -n "$GIT_SSL_NO_VERIFY" -o \
-               "`git config --bool http.sslVerify`" = false ]; then
+               "$(git config --bool http.sslVerify)" = false ]; then
                curl_extra_args="-k"
        fi
        if [ -n "$GIT_CURL_FTP_NO_EPSV" -o \
-               "`git config --bool http.noEPSV`" = true ]; then
+               "$(git config --bool http.noEPSV)" = true ]; then
                curl_extra_args="${curl_extra_args} --disable-epsv"
        fi
        curl -nsf $curl_extra_args --header "Pragma: no-cache" "$peek_repo/info/refs" ||
index a5e42a9f0124afcced9b639879f24916e0714e1c..7e40f40c78e2b040ae5b85adb27ebd4828f42b4d 100755 (executable)
@@ -341,7 +341,7 @@ case "$use_strategies" in
 '')
        case "$#" in
        1)
-               var="`git config --get pull.twohead`"
+               var="$(git config --get pull.twohead)"
                if test -n "$var"
                then
                        use_strategies="$var"
@@ -349,7 +349,7 @@ case "$use_strategies" in
                        use_strategies="$default_twohead_strategies"
                fi ;;
        *)
-               var="`git config --get pull.octopus`"
+               var="$(git config --get pull.octopus)"
                if test -n "$var"
                then
                        use_strategies="$var"
index 757933174e4c17136f14a1fdd7c8c67c0a8bca50..f312405a251ddc42f0483fb3d1ccc92d8a266fd1 100755 (executable)
@@ -49,7 +49,7 @@ do
        shift
 done
 
-case "`git config --bool repack.usedeltabaseoffset || echo true`" in
+case "$(git config --bool repack.usedeltabaseoffset || echo true)" in
 true)
        extra="$extra --delta-base-offset" ;;
 esac
index bafeb52cd113ad8a07ffd1912191f2bc17a7ef7a..cb1bbf3b90e911ac5fea09e00d6e0189b8ee7104 100755 (executable)
@@ -40,7 +40,7 @@ case "$1" in --) shift ;; esac
 
 # git reset --mixed tree [--] paths... can be used to
 # load chosen paths from the tree into the index without
-# affecting the working tree nor HEAD.
+# affecting the working tree or HEAD.
 if test $# != 0
 then
        test "$reset_type" = "--mixed" ||
@@ -60,7 +60,7 @@ then
        update=-u
 fi
 
-# Soft reset does not touch the index file nor the working tree
+# Soft reset does not touch the index file or the working tree
 # at all, but requires them in a good order.  Other resets reset
 # the index file to the tree object we are switching to.
 if test "$reset_type" = "--soft"
index 8f98142f77b5d6eda44b301082da20604a893db0..48d0fc971f9e7ec3b4b15608950217ad71c5ba94 100755 (executable)
@@ -75,7 +75,7 @@ case "$common" in
                GIT_INDEX_FILE=$G git read-tree -m $c $head $merge \
                        2>/dev/null || continue
                # Count the paths that are unmerged.
-               cnt=`GIT_INDEX_FILE=$G git ls-files --unmerged | wc -l`
+               cnt=$(GIT_INDEX_FILE=$G git ls-files --unmerged | wc -l)
                if test $best_cnt -le 0 -o $cnt -le $best_cnt
                then
                        best=$c
index 6bf155cbdb61498bdaf84712a2dea6fb05361ce2..7e2aad549103c0c2cdaa452a60a16706f0c7e117 100755 (executable)
@@ -137,7 +137,7 @@ cherry-pick)
                q
        }'
 
-       logmsg=`git show -s --pretty=raw --encoding="$encoding" "$commit"`
+       logmsg=$(git show -s --pretty=raw --encoding="$encoding" "$commit")
        set_author_env=`echo "$logmsg" |
        LANG=C LC_ALL=C sed -ne "$pick_author_script"`
        eval "$set_author_env"
index 2c15bc955b5bdf64119cdef87ad7519900cdd35f..1bd8f3c58d4508e5f7afc20619430d59b50582ff 100755 (executable)
@@ -156,7 +156,7 @@ prev=0000000000000000000000000000000000000000
 if git show-ref --verify --quiet -- "refs/tags/$name"
 then
     test -n "$force" || die "tag '$name' already exists"
-    prev=`git rev-parse "refs/tags/$name"`
+    prev=$(git rev-parse "refs/tags/$name")
 fi
 shift
 git check-ref-format "tags/$name" ||
index 7f3afa5ac4a4ca979a4e5dd63ebc59344f20857b..4dec1f18e425bd755052ca5645651eec47821cc0 100755 (executable)
@@ -109,8 +109,8 @@ =head3 Revision contents section
 be removed.
 
 If an on-disk revision is incomplete, you can point to files from
-a previous revision. There are no restriction as to where the source
-files are located, nor to the names of them.
+a previous revision. There are no restrictions on where the source
+files are located, nor on their names.
 
  [3.files]
  ; the key is the path inside the repository, the value is the path
diff --git a/contrib/hooks/multimail/CHANGES b/contrib/hooks/multimail/CHANGES
new file mode 100644 (file)
index 0000000..3603d56
--- /dev/null
@@ -0,0 +1,33 @@
+Release 1.0.0
+=============
+
+* Fix encoding of non-ASCII email addresses in email headers.
+
+* Fix backwards-compatibility bugs for older Python 2.x versions.
+
+* Fix a backwards-compatibility bug for Git 1.7.1.
+
+* Add an option commitDiffOpts to customize logs for revisions.
+
+* Pass "-oi" to sendmail by default to prevent premature termination
+  on a line containing only ".".
+
+* Stagger email "Date:" values in an attempt to help mail clients
+  thread the emails in the right order.
+
+* If a mailing list setting is missing, just skip sending the
+  corresponding email (with a warning) instead of failing.
+
+* Add a X-Git-Host header that can be used for email filtering.
+
+* Allow the sender's fully-qualified domain name to be configured.
+
+* Minor documentation improvements.
+
+* Add this CHANGES file.
+
+
+Release 0.9.0
+=============
+
+* Initial release.
index 9904396710e1a9faca84f8cb707043080d3b451b..477d65fed3b7fd2fc2b0aa128b4e6542ffc41025 100644 (file)
@@ -91,9 +91,10 @@ Requirements
   been tested; if you do so, please report your results.)
 
 * To send emails using the default configuration, a standard sendmail
-  program must be located at '/usr/sbin/sendmail' and configured
-  correctly to send emails.  If this is not the case, see the
-  multimailhook.mailer configuration variable below for how to
+  program must be located at '/usr/sbin/sendmail' or
+  '/usr/lib/sendmail' and must be configured correctly to send emails.
+  If this is not the case, set multimailhook.sendmailCommand, or see
+  the multimailhook.mailer configuration variable below for how to
   configure git-multimail to send emails via an SMTP server.
 
 
@@ -169,7 +170,7 @@ multimailhook.repoName
     for gitolite repositories, or otherwise to derive this value from
     the repository path name.
 
-multimailhook.mailinglist
+multimailhook.mailingList
 
     The list of email addresses to which notification emails should be
     sent, as RFC 2822 email addresses separated by commas.  This
@@ -184,26 +185,29 @@ multimailhook.refchangeList
     reference changes should be sent, as RFC 2822 email addresses
     separated by commas.  This configuration option can be
     multivalued.  The default is the value in
-    multimailhook.mailinglist.  Set this value to the empty string to
-    prevent reference change emails from being sent.
+    multimailhook.mailingList.  Set this value to the empty string to
+    prevent reference change emails from being sent even if
+    multimailhook.mailingList is set.
 
 multimailhook.announceList
 
     The list of email addresses to which emails about new annotated
     tags should be sent, as RFC 2822 email addresses separated by
     commas.  This configuration option can be multivalued.  The
-    default is the value in multimailhook.refchangelist or
-    multimailhook.mailinglist.  Set this value to the empty string to
-    prevent annotated tag announcement emails from being sent.
+    default is the value in multimailhook.refchangeList or
+    multimailhook.mailingList.  Set this value to the empty string to
+    prevent annotated tag announcement emails from being sent even if
+    one of the other values is set.
 
 multimailhook.commitList
 
     The list of email addresses to which emails about individual new
     commits should be sent, as RFC 2822 email addresses separated by
     commas.  This configuration option can be multivalued.  The
-    default is the value in multimailhook.mailinglist.  Set this value
+    default is the value in multimailhook.mailingList.  Set this value
     to the empty string to prevent notification emails about
-    individual commits from being sent.
+    individual commits from being sent even if
+    multimailhook.mailingList is set.
 
 multimailhook.announceShortlog
 
@@ -237,10 +241,11 @@ multimailhook.mailer
            quoting is allowed in the value of this setting, but remember that
            Git requires double-quotes to be escaped; e.g.,
 
-             git config multimailhook.sendmailcommand '/usr/sbin/sendmail -t -F \"Git Repo\"'
+             git config multimailhook.sendmailcommand '/usr/sbin/sendmail -oi -t -F \"Git Repo\"'
 
-           Default is '/usr/sbin/sendmail -t' or '/usr/lib/sendmail
-           -t' (depending on which file is present and executable).
+           Default is '/usr/sbin/sendmail -oi -t' or
+           '/usr/lib/sendmail -oi -t' (depending on which file is
+           present and executable).
 
        multimailhook.envelopeSender
 
@@ -344,6 +349,14 @@ multimailhook.logOpts
       [multimailhook]
               logopts = --pretty=format:\"%h %aN <%aE>%n%s%n%n%b%n\"
 
+multimailhook.commitLogOpts
+
+    Options passed to "git log" to generate additional info for
+    revision change emails.  For example, adding --ignore-all-spaces
+    will suppress whitespace changes.  The default options are "-C
+    --stat -p --cc".  Shell quoting is allowed; see
+    multimailhook.logOpts for details.
+
 multimailhook.emailDomain
 
     Domain name appended to the username of the person doing the push
@@ -381,8 +394,8 @@ Email filtering aids
 
 All emails include extra headers to enable fine tuned filtering and
 give information for debugging.  All emails include the headers
-"X-Git-Repo", "X-Git-Refname", and "X-Git-Reftype".  ReferenceChange
-emails also include headers "X-Git-Oldrev" and "X-Git-Newrev";
+"X-Git-Host", "X-Git-Repo", "X-Git-Refname", and "X-Git-Reftype".
+ReferenceChange emails also include headers "X-Git-Oldrev" and "X-Git-Newrev";
 Revision emails also include header "X-Git-Rev".
 
 
@@ -463,6 +476,7 @@ The git-multimail project itself is currently hosted on GitHub:
 We use the GitHub issue tracker to keep track of bugs and feature
 requests, and GitHub pull requests to exchange patches (though, if you
 prefer, you can send patches via the Git mailing list with cc to me).
+Please sign off your patches as per the Git project practice.
 
 Please note that although a copy of git-multimail will probably be
 distributed in the "contrib" section of the main Git project,
index 9c2e66a69a1049479c1aeef3b51618cbb6d92170..129b771410cdf1cb020e634b305db8a429bf3caf 100644 (file)
@@ -6,10 +6,10 @@ website:
     https://github.com/mhagger/git-multimail
 
 The version in this directory was obtained from the upstream project
-on 2013-07-14 and consists of the "git-multimail" subdirectory from
+on 2014-04-07 and consists of the "git-multimail" subdirectory from
 revision
 
-    1a5cb09c698a74d15a715a86b09ead5f56bf4b06
+    1b32653bafc4f902535b9fc1cd9cae911325b870
 
 Please see the README file in this directory for information about how
 to report bugs or contribute to git-multimail.
index 81c6a5170615c083eb44762e6ed143c503701fd4..8b58ed644423932309c3193ac46a5213ea29ca73 100755 (executable)
@@ -1,6 +1,6 @@
 #! /usr/bin/env python2
 
-# Copyright (c) 2012,2013 Michael Haggerty
+# Copyright (c) 2012-2014 Michael Haggerty and others
 # Derived from contrib/hooks/post-receive-email, which is
 # Copyright (c) 2007 Andy Parkins
 # and also includes contributions by other authors.
 import os
 import re
 import bisect
+import socket
 import subprocess
 import shlex
 import optparse
 import smtplib
+import time
 
 try:
     from email.utils import make_msgid
     from email.utils import getaddresses
     from email.utils import formataddr
+    from email.utils import formatdate
     from email.header import Header
 except ImportError:
     # Prior to Python 2.5, the email module used different names:
     from email.Utils import make_msgid
     from email.Utils import getaddresses
     from email.Utils import formataddr
+    from email.Utils import formatdate
     from email.Header import Header
 
 
@@ -73,6 +77,7 @@
 LOGBEGIN = '- Log -----------------------------------------------------------------\n'
 LOGEND = '-----------------------------------------------------------------------\n'
 
+ADDR_HEADERS = set(['from', 'to', 'cc', 'bcc', 'reply-to', 'sender'])
 
 # It is assumed in many places that the encoding is uniformly UTF-8,
 # so changing these constants is unsupported.  But define them here
     )
 
 REFCHANGE_HEADER_TEMPLATE = """\
+Date: %(send_date)s
 To: %(recipients)s
 Subject: %(subject)s
 MIME-Version: 1.0
 Message-ID: %(msgid)s
 From: %(fromaddr)s
 Reply-To: %(reply_to)s
+X-Git-Host: %(fqdn)s
 X-Git-Repo: %(repo_shortname)s
 X-Git-Refname: %(refname)s
 X-Git-Reftype: %(refname_type)s
 
 
 REVISION_HEADER_TEMPLATE = """\
+Date: %(send_date)s
 To: %(recipients)s
 Subject: %(emailprefix)s%(num)02d/%(tot)02d: %(oneline)s
 MIME-Version: 1.0
 Reply-To: %(reply_to)s
 In-Reply-To: %(reply_to_msgid)s
 References: %(reply_to_msgid)s
+X-Git-Host: %(fqdn)s
 X-Git-Repo: %(repo_shortname)s
 X-Git-Refname: %(refname)s
 X-Git-Reftype: %(refname_type)s
@@ -263,13 +272,43 @@ class ConfigurationException(Exception):
     pass
 
 
+# The "git" program (this could be changed to include a full path):
+GIT_EXECUTABLE = 'git'
+
+
+# How "git" should be invoked (including global arguments), as a list
+# of words.  This variable is usually initialized automatically by
+# read_git_output() via choose_git_command(), but if a value is set
+# here then it will be used unconditionally.
+GIT_CMD = None
+
+
+def choose_git_command():
+    """Decide how to invoke git, and record the choice in GIT_CMD."""
+
+    global GIT_CMD
+
+    if GIT_CMD is None:
+        try:
+            # Check to see whether the "-c" option is accepted (it was
+            # only added in Git 1.7.2).  We don't actually use the
+            # output of "git --version", though if we needed more
+            # specific version information this would be the place to
+            # do it.
+            cmd = [GIT_EXECUTABLE, '-c', 'foo.bar=baz', '--version']
+            read_output(cmd)
+            GIT_CMD = [GIT_EXECUTABLE, '-c', 'i18n.logoutputencoding=%s' % (ENCODING,)]
+        except CommandError:
+            GIT_CMD = [GIT_EXECUTABLE]
+
+
 def read_git_output(args, input=None, keepends=False, **kw):
     """Read the output of a Git command."""
 
-    return read_output(
-        ['git', '-c', 'i18n.logoutputencoding=%s' % (ENCODING,)] + args,
-        input=input, keepends=keepends, **kw
-        )
+    if GIT_CMD is None:
+        choose_git_command()
+
+    return read_output(GIT_CMD + args, input=input, keepends=keepends, **kw)
 
 
 def read_output(cmd, input=None, keepends=False, **kw):
@@ -297,6 +336,31 @@ def read_git_lines(args, keepends=False, **kw):
     return read_git_output(args, keepends=True, **kw).splitlines(keepends)
 
 
+def header_encode(text, header_name=None):
+    """Encode and line-wrap the value of an email header field."""
+
+    try:
+        if isinstance(text, str):
+            text = text.decode(ENCODING, 'replace')
+        return Header(text, header_name=header_name).encode()
+    except UnicodeEncodeError:
+        return Header(text, header_name=header_name, charset=CHARSET,
+                      errors='replace').encode()
+
+
+def addr_header_encode(text, header_name=None):
+    """Encode and line-wrap the value of an email header field containing
+    email addresses."""
+
+    return Header(
+        ', '.join(
+            formataddr((header_encode(name), emailaddr))
+            for name, emailaddr in getaddresses([text])
+            ),
+        header_name=header_name
+        ).encode()
+
+
 class Config(object):
     def __init__(self, section, git_config=None):
         """Represent a section of the git configuration.
@@ -578,11 +642,11 @@ def expand_header_lines(self, template, **extra_values):
                         % (e.args[0], line,)
                         )
             else:
-                try:
-                    h = Header(value, header_name=name)
-                except UnicodeDecodeError:
-                    h = Header(value, header_name=name, charset=CHARSET, errors='replace')
-                for splitline in ('%s: %s\n' % (name, h.encode(),)).splitlines(True):
+                if name.lower() in ADDR_HEADERS:
+                    value = addr_header_encode(value, name)
+                else:
+                    value = header_encode(value, name)
+                for splitline in ('%s: %s\n' % (name, value)).splitlines(True):
                     yield splitline
 
     def generate_email_header(self):
@@ -616,15 +680,19 @@ def generate_email_footer(self):
 
         raise NotImplementedError()
 
-    def generate_email(self, push, body_filter=None):
+    def generate_email(self, push, body_filter=None, extra_header_values={}):
         """Generate an email describing this change.
 
         Iterate over the lines (including the header lines) of an
         email describing this change.  If body_filter is not None,
         then use it to filter the lines that are intended for the
-        email body."""
+        email body.
+
+        The extra_header_values field is received as a dict and not as
+        **kwargs, to allow passing other keyword arguments in the
+        future (e.g. passing extra values to generate_email_intro()"""
 
-        for line in self.generate_email_header():
+        for line in self.generate_email_header(**extra_header_values):
             yield line
         yield '\n'
         for line in self.generate_email_intro():
@@ -680,8 +748,10 @@ def _compute_values(self):
 
         return values
 
-    def generate_email_header(self):
-        for line in self.expand_header_lines(REVISION_HEADER_TEMPLATE):
+    def generate_email_header(self, **extra_values):
+        for line in self.expand_header_lines(
+            REVISION_HEADER_TEMPLATE, **extra_values
+            ):
             yield line
 
     def generate_email_intro(self):
@@ -692,11 +762,7 @@ def generate_email_body(self, push):
         """Show this revision."""
 
         return read_git_lines(
-            [
-                'log', '-C',
-                 '--stat', '-p', '--cc',
-                '-1', self.rev.sha1,
-                ],
+            ['log'] + self.environment.commitlogopts + ['-1', self.rev.sha1],
             keepends=True,
             )
 
@@ -800,6 +866,7 @@ def __init__(self, environment, refname, short_refname, old, new, rev):
         self.msgid = make_msgid()
         self.diffopts = environment.diffopts
         self.logopts = environment.logopts
+        self.commitlogopts = environment.commitlogopts
         self.showlog = environment.refchange_showlog
 
     def _compute_values(self):
@@ -835,9 +902,12 @@ def get_subject(self):
             }[self.change_type]
         return self.expand(template)
 
-    def generate_email_header(self):
+    def generate_email_header(self, **extra_values):
+        if 'subject' not in extra_values:
+            extra_values['subject'] = self.get_subject()
+
         for line in self.expand_header_lines(
-            REFCHANGE_HEADER_TEMPLATE, subject=self.get_subject(),
+            REFCHANGE_HEADER_TEMPLATE, **extra_values
             ):
             yield line
 
@@ -1273,7 +1343,7 @@ def send(self, lines, to_addrs):
 
 
 class SendMailer(Mailer):
-    """Send emails using 'sendmail -t'."""
+    """Send emails using 'sendmail -oi -t'."""
 
     SENDMAIL_CANDIDATES = [
         '/usr/sbin/sendmail',
@@ -1302,7 +1372,7 @@ def __init__(self, command=None, envelopesender=None):
         if command:
             self.command = command[:]
         else:
-            self.command = [self.find_sendmail(), '-t']
+            self.command = [self.find_sendmail(), '-oi', '-t']
 
         if envelopesender:
             self.command.extend(['-f', envelopesender])
@@ -1495,6 +1565,12 @@ class Environment(object):
             'git log' when generating the detailed log for a set of
             commits (see refchange_showlog)
 
+        commitlogopts (list of strings)
+
+            The options that should be passed to 'git log' for each
+            commit mail.  The value should be a list of strings
+            representing words to be passed to the command.
+
     """
 
     REPO_NAME_RE = re.compile(r'^(?P<name>.+?)(?:\.git)$')
@@ -1506,6 +1582,7 @@ def __init__(self, osenv=None):
         self.diffopts = ['--stat', '--summary', '--find-copies-harder']
         self.logopts = []
         self.refchange_showlog = False
+        self.commitlogopts = ['-C', '--stat', '-p', '--cc']
 
         self.COMPUTED_KEYS = [
             'administrator',
@@ -1672,6 +1749,10 @@ def __init__(self, config, **kw):
         if logopts is not None:
             self.logopts = shlex.split(logopts)
 
+        commitlogopts = config.get('commitlogopts')
+        if commitlogopts is not None:
+            self.commitlogopts = shlex.split(commitlogopts)
+
         reply_to = config.get('replyTo')
         self.__reply_to_refchange = config.get('replyToRefchange', default=reply_to)
         if (
@@ -1829,6 +1910,47 @@ def __init__(self, config, **kw):
             )
 
 
+class FQDNEnvironmentMixin(Environment):
+    """A mixin that sets the host's FQDN to its constructor argument."""
+
+    def __init__(self, fqdn, **kw):
+        super(FQDNEnvironmentMixin, self).__init__(**kw)
+        self.COMPUTED_KEYS += ['fqdn']
+        self.__fqdn = fqdn
+
+    def get_fqdn(self):
+        """Return the fully-qualified domain name for this host.
+
+        Return None if it is unavailable or unwanted."""
+
+        return self.__fqdn
+
+
+class ConfigFQDNEnvironmentMixin(
+    ConfigEnvironmentMixin,
+    FQDNEnvironmentMixin,
+    ):
+    """Read the FQDN from the config."""
+
+    def __init__(self, config, **kw):
+        fqdn = config.get('fqdn')
+        super(ConfigFQDNEnvironmentMixin, self).__init__(
+            config=config,
+            fqdn=fqdn,
+            **kw
+            )
+
+
+class ComputeFQDNEnvironmentMixin(FQDNEnvironmentMixin):
+    """Get the FQDN by calling socket.getfqdn()."""
+
+    def __init__(self, **kw):
+        super(ComputeFQDNEnvironmentMixin, self).__init__(
+            fqdn=socket.getfqdn(),
+            **kw
+            )
+
+
 class PusherDomainEnvironmentMixin(ConfigEnvironmentMixin):
     """Deduce pusher_email from pusher by appending an emaildomain."""
 
@@ -1861,6 +1983,10 @@ def __init__(
         # actual *contents* of the change being reported, we only
         # choose based on the *type* of the change.  Therefore we can
         # compute them once and for all:
+        if not (refchange_recipients
+                or announce_recipients
+                or revision_recipients):
+            raise ConfigurationException('No email recipients configured!')
         self.__refchange_recipients = refchange_recipients
         self.__announce_recipients = announce_recipients
         self.__revision_recipients = revision_recipients
@@ -1911,17 +2037,8 @@ def _get_recipients(self, config, *names):
             retval = config.get_recipients(name)
             if retval is not None:
                 return retval
-        if len(names) == 1:
-            hint = 'Please set "%s.%s"' % (config.section, name)
         else:
-            hint = (
-                'Please set one of the following:\n    "%s"'
-                % ('"\n    "'.join('%s.%s' % (config.section, name) for name in names))
-                )
-
-        raise ConfigurationException(
-            'The list of recipients for %s is not configured.\n%s' % (names[0], hint)
-            )
+            return ''
 
 
 class ProjectdescEnvironmentMixin(Environment):
@@ -1956,6 +2073,7 @@ def get_pusher(self):
 class GenericEnvironment(
     ProjectdescEnvironmentMixin,
     ConfigMaxlinesEnvironmentMixin,
+    ComputeFQDNEnvironmentMixin,
     ConfigFilterLinesEnvironmentMixin,
     ConfigRecipientsEnvironmentMixin,
     PusherDomainEnvironmentMixin,
@@ -1980,9 +2098,27 @@ def get_pusher(self):
         return self.osenv.get('GL_USER', 'unknown user')
 
 
+class IncrementalDateTime(object):
+    """Simple wrapper to give incremental date/times.
+
+    Each call will result in a date/time a second later than the
+    previous call.  This can be used to falsify email headers, to
+    increase the likelihood that email clients sort the emails
+    correctly."""
+
+    def __init__(self):
+        self.time = time.time()
+
+    def next(self):
+        formatted = formatdate(self.time, True)
+        self.time += 1
+        return formatted
+
+
 class GitoliteEnvironment(
     ProjectdescEnvironmentMixin,
     ConfigMaxlinesEnvironmentMixin,
+    ComputeFQDNEnvironmentMixin,
     ConfigFilterLinesEnvironmentMixin,
     ConfigRecipientsEnvironmentMixin,
     PusherDomainEnvironmentMixin,
@@ -2187,6 +2323,7 @@ def send_emails(self, mailer, body_filter=None):
         # guarantee that one (and only one) email is generated for
         # each new commit.
         unhandled_sha1s = set(self.get_new_commits())
+        send_date = IncrementalDateTime()
         for change in self.changes:
             # Check if we've got anyone to send to
             if not change.recipients:
@@ -2197,7 +2334,11 @@ def send_emails(self, mailer, body_filter=None):
                     )
             else:
                 sys.stderr.write('Sending notification emails to: %s\n' % (change.recipients,))
-                mailer.send(change.generate_email(self, body_filter), change.recipients)
+                extra_values = {'send_date' : send_date.next()}
+                mailer.send(
+                    change.generate_email(self, body_filter, extra_values),
+                    change.recipients,
+                    )
 
             sha1s = []
             for sha1 in reversed(list(self.get_new_commits(change))):
@@ -2217,7 +2358,11 @@ def send_emails(self, mailer, body_filter=None):
             for (num, sha1) in enumerate(sha1s):
                 rev = Revision(change, GitObject(sha1), num=num+1, tot=len(sha1s))
                 if rev.recipients:
-                    mailer.send(rev.generate_email(self, body_filter), rev.recipients)
+                    extra_values = {'send_date' : send_date.next()}
+                    mailer.send(
+                        rev.generate_email(self, body_filter, extra_values),
+                        rev.recipients,
+                        )
 
         # Consistency check:
         if unhandled_sha1s:
@@ -2288,6 +2433,7 @@ def choose_environment(config, osenv=None, env=None, recipients=None):
     environment_mixins = [
         ProjectdescEnvironmentMixin,
         ConfigMaxlinesEnvironmentMixin,
+        ComputeFQDNEnvironmentMixin,
         ConfigFilterLinesEnvironmentMixin,
         PusherDomainEnvironmentMixin,
         ConfigOptionsEnvironmentMixin,
index 93ebb437d17a2cde8a48419ae98d588b3e25f0b5..4d46828ba5574aba988e8a89d99386b5558b299a 100755 (executable)
@@ -66,10 +66,10 @@ mailer = git_multimail.choose_mailer(config, environment)
 # Alternatively, you may hardcode the mailer using code like one of
 # the following:
 
-# Use "/usr/sbin/sendmail -t" to send emails.  The envelopesender
+# Use "/usr/sbin/sendmail -oi -t" to send emails.  The envelopesender
 # argument is optional:
 #mailer = git_multimail.SendMailer(
-#    command=['/usr/sbin/sendmail', '-t'],
+#    command=['/usr/sbin/sendmail', '-oi', '-t'],
 #    envelopesender='git-repo@example.com',
 #    )
 
index 3f8d993afaca53024aa75b4118da9ee80e6a6313..8dd74a9a406e9cfd685ea1af3947e4bea4c82f90 100755 (executable)
@@ -461,7 +461,12 @@ sub download_mw_mediafile {
 
        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";
index 70a53f67fd06bd2ce6f2f544655b03b99c6b2ee9..c215213c4bfddb583fb3de0eb624e0cffdb8cc7c 100755 (executable)
@@ -20,6 +20,8 @@ usage () {
        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 @@ case "$1" in
                wiki_delete
                exit 0
                ;;
+       "start" | "-s")
+               start_lighttpd
+               exit
+               ;;
+       "stop")
+               stop_lighttpd
+               exit
+               ;;
        "--help" | "-h")
                usage
                exit 0
index 811a90c9ae16cec2c99f01daa9d5e1254c9952d8..22f069db4896efcf0fd2a1a8912e72d9db3569ae 100755 (executable)
@@ -191,10 +191,10 @@ test_expect_success 'Git clone works with the shallow option' '
        test_path_is_file mw_dir_11/Main_Page.mw &&
        (
                cd mw_dir_11 &&
-               test `git log --oneline Nyan.mw | wc -l` -eq 1 &&
-               test `git log --oneline Foo.mw | wc -l` -eq 1 &&
-               test `git log --oneline Bar.mw | wc -l` -eq 1 &&
-               test `git log --oneline Main_Page.mw | wc -l ` -eq 1
+               test $(git log --oneline Nyan.mw | wc -l) -eq 1 &&
+               test $(git log --oneline Foo.mw | wc -l) -eq 1 &&
+               test $(git log --oneline Bar.mw | wc -l) -eq 1 &&
+               test $(git log --oneline Main_Page.mw | wc -l ) -eq 1
        ) &&
        wiki_check_content mw_dir_11/Nyan.mw Nyan &&
        wiki_check_content mw_dir_11/Foo.mw Foo &&
@@ -218,9 +218,9 @@ test_expect_success 'Git clone works with the shallow option with a delete page'
        test_path_is_file mw_dir_12/Main_Page.mw &&
        (
                cd mw_dir_12 &&
-               test `git log --oneline Nyan.mw | wc -l` -eq 1 &&
-               test `git log --oneline Bar.mw | wc -l` -eq 1 &&
-               test `git log --oneline Main_Page.mw | wc -l ` -eq 1
+               test $(git log --oneline Nyan.mw | wc -l) -eq 1 &&
+               test $(git log --oneline Bar.mw | wc -l) -eq 1 &&
+               test $(git log --oneline Main_Page.mw | wc -l ) -eq 1
        ) &&
        wiki_check_content mw_dir_12/Nyan.mw Nyan &&
        wiki_check_content mw_dir_12/Bar.mw Bar &&
index 37021e200a32d36e37f5c0ca7f6cacdca7d80187..6b0dbdac4d355cb1a2c952977be2b3cf84aa17a7 100755 (executable)
@@ -70,8 +70,8 @@ test_expect_success 'The shallow option works with accents' '
        test_path_is_file mw_dir_4/Main_Page.mw &&
        (
                cd mw_dir_4 &&
-               test `git log --oneline Néoà.mw | wc -l` -eq 1 &&
-               test `git log --oneline Main_Page.mw | wc -l ` -eq 1
+               test $(git log --oneline Néoà.mw | wc -l) -eq 1 &&
+               test $(git log --oneline Main_Page.mw | wc -l ) -eq 1
        ) &&
        wiki_check_content mw_dir_4/Néoà.mw Néoà &&
        wiki_check_content mw_dir_4/Main_Page.mw Main_Page
index 5a0373935f1f4b66c4521158e4b3c41508c908ea..3ff3a095670ecdf578dc9f4d51841c102c5a10fd 100755 (executable)
@@ -58,6 +58,25 @@ test_expect_success 'git clone works on previously created wiki with media files
        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 &&
index 27e267f532974914d1b214920bcfb8e2d4e3de6c..016454749f8dfa8539c7af1ca7fe4338414ab661 100755 (executable)
@@ -9,7 +9,7 @@ test_check_precond
 
 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
index 3372b2af346ac23a73a7723ac6d0c81fb8c5e705..6546294f159e940eb8f7adc3e695f16d9395eebc 100755 (executable)
@@ -90,7 +90,7 @@ test_diff_directories () {
 #
 # 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 @@ start_lighttpd () {
 # 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 @@ wiki_install () {
                        "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_reset () {
 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/remote-helpers/Makefile b/contrib/remote-helpers/Makefile
deleted file mode 100644 (file)
index 239161d..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-TESTS := $(wildcard test*.sh)
-
-export T := $(addprefix $(CURDIR)/,$(TESTS))
-export MAKE := $(MAKE) -e
-export PATH := $(CURDIR):$(PATH)
-export TEST_LINT := test-lint-executable test-lint-shell-syntax
-
-test:
-       $(MAKE) -C ../../t $@
-
-$(TESTS):
-       $(MAKE) -C ../../t $(CURDIR)/$@
-
-.PHONY: $(TESTS)
diff --git a/contrib/remote-helpers/README b/contrib/remote-helpers/README
new file mode 100644 (file)
index 0000000..ac72332
--- /dev/null
@@ -0,0 +1,15 @@
+The remote-helper bridges to access data stored in Mercurial and
+Bazaar are maintained outside the git.git tree in the repositories
+of their primary author:
+
+    https://github.com/felipec/git-remote-hg (for Mercurial)
+    https://github.com/felipec/git-remote-bzr (for Bazaar)
+
+You can pick a directory on your $PATH and download them from these
+repositories, e.g.:
+
+  $ wget -O $HOME/bin/git-remote-hg \
+    https://raw.github.com/felipec/git-remote-hg/master/git-remote-hg
+  $ wget -O $HOME/bin/git-remote-bzr \
+    https://raw.github.com/felipec/git-remote-bzr/master/git-remote-bzr
+  $ chmod +x $HOME/bin/git-remote-hg $HOME/bin/git-remote-bzr
index 5f4b2e3e160f60955e25f8b8fedf8c122dd5c73c..712a1377e208f717b61df44f0b5ea0ba99dc72d1 100755 (executable)
 #!/usr/bin/env python
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-
-#
-# Just copy to your ~/bin, or anywhere in your $PATH.
-# Then you can clone with:
-# % git clone bzr::/path/to/bzr/repo/or/url
-#
-# For example:
-# % git clone bzr::$HOME/myrepo
-# or
-# % git clone bzr::lp:myrepo
-#
-# If you want to specify which branches you want to track (per repo):
-# % git config remote.origin.bzr-branches 'trunk, devel, test'
-#
-# Where 'origin' is the name of the repository you want to specify the
-# branches.
-#
-
-import sys
-
-import bzrlib
-if hasattr(bzrlib, "initialize"):
-    bzrlib.initialize()
-
-import bzrlib.plugin
-bzrlib.plugin.load_plugins()
-
-import bzrlib.generate_ids
-import bzrlib.transport
-import bzrlib.errors
-import bzrlib.ui
-import bzrlib.urlutils
-import bzrlib.branch
 
 import sys
-import os
-import json
-import re
-import StringIO
-import atexit, shutil, hashlib, urlparse, subprocess
-
-NAME_RE = re.compile('^([^<>]+)')
-AUTHOR_RE = re.compile('^([^<>]+?)? ?[<>]([^<>]*)(?:$|>)')
-EMAIL_RE = re.compile(r'([^ \t<>]+@[^ \t<>]+)')
-RAW_AUTHOR_RE = re.compile('^(\w+) (.+)? <(.*)> (\d+) ([+-]\d+)')
-
-def die(msg, *args):
-    sys.stderr.write('ERROR: %s\n' % (msg % args))
-    sys.exit(1)
-
-def warn(msg, *args):
-    sys.stderr.write('WARNING: %s\n' % (msg % args))
-
-def gittz(tz):
-    return '%+03d%02d' % (tz / 3600, tz % 3600 / 60)
-
-def get_config(config):
-    cmd = ['git', 'config', '--get', config]
-    process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
-    output, _ = process.communicate()
-    return output
-
-class Marks:
-
-    def __init__(self, path):
-        self.path = path
-        self.tips = {}
-        self.marks = {}
-        self.rev_marks = {}
-        self.last_mark = 0
-        self.load()
-
-    def load(self):
-        if not os.path.exists(self.path):
-            return
-
-        tmp = json.load(open(self.path))
-        self.tips = tmp['tips']
-        self.marks = tmp['marks']
-        self.last_mark = tmp['last-mark']
-
-        for rev, mark in self.marks.iteritems():
-            self.rev_marks[mark] = rev
-
-    def dict(self):
-        return { 'tips': self.tips, 'marks': self.marks, 'last-mark' : self.last_mark }
-
-    def store(self):
-        json.dump(self.dict(), open(self.path, 'w'))
-
-    def __str__(self):
-        return str(self.dict())
-
-    def from_rev(self, rev):
-        return self.marks[rev]
-
-    def to_rev(self, mark):
-        return str(self.rev_marks[mark])
-
-    def next_mark(self):
-        self.last_mark += 1
-        return self.last_mark
-
-    def get_mark(self, rev):
-        self.last_mark += 1
-        self.marks[rev] = self.last_mark
-        return self.last_mark
-
-    def is_marked(self, rev):
-        return rev in self.marks
-
-    def new_mark(self, rev, mark):
-        self.marks[rev] = mark
-        self.rev_marks[mark] = rev
-        self.last_mark = mark
-
-    def get_tip(self, branch):
-        try:
-            return str(self.tips[branch])
-        except KeyError:
-            return None
-
-    def set_tip(self, branch, tip):
-        self.tips[branch] = tip
-
-class Parser:
-
-    def __init__(self, repo):
-        self.repo = repo
-        self.line = self.get_line()
-
-    def get_line(self):
-        return sys.stdin.readline().strip()
-
-    def __getitem__(self, i):
-        return self.line.split()[i]
-
-    def check(self, word):
-        return self.line.startswith(word)
-
-    def each_block(self, separator):
-        while self.line != separator:
-            yield self.line
-            self.line = self.get_line()
-
-    def __iter__(self):
-        return self.each_block('')
-
-    def next(self):
-        self.line = self.get_line()
-        if self.line == 'done':
-            self.line = None
-
-    def get_mark(self):
-        i = self.line.index(':') + 1
-        return int(self.line[i:])
-
-    def get_data(self):
-        if not self.check('data'):
-            return None
-        i = self.line.index(' ') + 1
-        size = int(self.line[i:])
-        return sys.stdin.read(size)
-
-    def get_author(self):
-        m = RAW_AUTHOR_RE.match(self.line)
-        if not m:
-            return None
-        _, name, email, date, tz = m.groups()
-        name = name.decode('utf-8')
-        committer = '%s <%s>' % (name, email)
-        tz = int(tz)
-        tz = ((tz / 100) * 3600) + ((tz % 100) * 60)
-        return (committer, int(date), tz)
-
-def rev_to_mark(rev):
-    return marks.from_rev(rev)
-
-def mark_to_rev(mark):
-    return marks.to_rev(mark)
-
-def fixup_user(user):
-    name = mail = None
-    user = user.replace('"', '')
-    m = AUTHOR_RE.match(user)
-    if m:
-        name = m.group(1)
-        mail = m.group(2).strip()
-    else:
-        m = EMAIL_RE.match(user)
-        if m:
-            mail = m.group(1)
-        else:
-            m = NAME_RE.match(user)
-            if m:
-                name = m.group(1).strip()
-
-    if not name:
-        name = 'unknown'
-    if not mail:
-        mail = 'Unknown'
-
-    return '%s <%s>' % (name, mail)
-
-def get_filechanges(cur, prev):
-    modified = {}
-    removed = {}
-
-    changes = cur.changes_from(prev)
-
-    def u(s):
-        return s.encode('utf-8')
-
-    for path, fid, kind in changes.added:
-        modified[u(path)] = fid
-    for path, fid, kind in changes.removed:
-        removed[u(path)] = None
-    for path, fid, kind, mod, _ in changes.modified:
-        modified[u(path)] = fid
-    for oldpath, newpath, fid, kind, mod, _ in changes.renamed:
-        removed[u(oldpath)] = None
-        if kind == 'directory':
-            lst = cur.list_files(from_dir=newpath, recursive=True)
-            for path, file_class, kind, fid, entry in lst:
-                if kind != 'directory':
-                    modified[u(newpath + '/' + path)] = fid
-        else:
-            modified[u(newpath)] = fid
-
-    return modified, removed
-
-def export_files(tree, files):
-    final = []
-    for path, fid in files.iteritems():
-        kind = tree.kind(fid)
-
-        h = tree.get_file_sha1(fid)
-
-        if kind == 'symlink':
-            d = tree.get_symlink_target(fid)
-            mode = '120000'
-        elif kind == 'file':
-
-            if tree.is_executable(fid):
-                mode = '100755'
-            else:
-                mode = '100644'
-
-            # is the blob already exported?
-            if h in filenodes:
-                mark = filenodes[h]
-                final.append((mode, mark, path))
-                continue
-
-            d = tree.get_file_text(fid)
-        elif kind == 'directory':
-            continue
-        else:
-            die("Unhandled kind '%s' for path '%s'" % (kind, path))
-
-        mark = marks.next_mark()
-        filenodes[h] = mark
-
-        print "blob"
-        print "mark :%u" % mark
-        print "data %d" % len(d)
-        print d
-
-        final.append((mode, mark, path))
-
-    return final
-
-def export_branch(repo, name):
-    ref = '%s/heads/%s' % (prefix, name)
-    tip = marks.get_tip(name)
-
-    branch = get_remote_branch(name)
-    repo = branch.repository
-
-    branch.lock_read()
-    revs = branch.iter_merge_sorted_revisions(None, tip, 'exclude', 'forward')
-    try:
-        tip_revno = branch.revision_id_to_revno(tip)
-        last_revno, _ = branch.last_revision_info()
-        total = last_revno - tip_revno
-    except bzrlib.errors.NoSuchRevision:
-        tip_revno = 0
-        total = 0
-
-    for revid, _, seq, _ in revs:
-
-        if marks.is_marked(revid):
-            continue
-
-        rev = repo.get_revision(revid)
-        revno = seq[0]
-
-        parents = rev.parent_ids
-        time = rev.timestamp
-        tz = rev.timezone
-        committer = rev.committer.encode('utf-8')
-        committer = "%s %u %s" % (fixup_user(committer), time, gittz(tz))
-        authors = rev.get_apparent_authors()
-        if authors:
-            author = authors[0].encode('utf-8')
-            author = "%s %u %s" % (fixup_user(author), time, gittz(tz))
-        else:
-            author = committer
-        msg = rev.message.encode('utf-8')
-
-        msg += '\n'
-
-        if len(parents) == 0:
-            parent = bzrlib.revision.NULL_REVISION
-        else:
-            parent = parents[0]
-
-        cur_tree = repo.revision_tree(revid)
-        prev = repo.revision_tree(parent)
-        modified, removed = get_filechanges(cur_tree, prev)
-
-        modified_final = export_files(cur_tree, modified)
-
-        if len(parents) == 0:
-            print 'reset %s' % ref
-
-        print "commit %s" % ref
-        print "mark :%d" % (marks.get_mark(revid))
-        print "author %s" % (author)
-        print "committer %s" % (committer)
-        print "data %d" % (len(msg))
-        print msg
-
-        for i, p in enumerate(parents):
-            try:
-                m = rev_to_mark(p)
-            except KeyError:
-                # ghost?
-                continue
-            if i == 0:
-                print "from :%s" % m
-            else:
-                print "merge :%s" % m
-
-        for f in removed:
-            print "D %s" % (f,)
-        for f in modified_final:
-            print "M %s :%u %s" % f
-        print
-
-        if len(seq) > 1:
-            # let's skip branch revisions from the progress report
-            continue
-
-        progress = (revno - tip_revno)
-        if (progress % 100 == 0):
-            if total:
-                print "progress revision %d '%s' (%d/%d)" % (revno, name, progress, total)
-            else:
-                print "progress revision %d '%s' (%d)" % (revno, name, progress)
-
-    branch.unlock()
-
-    revid = branch.last_revision()
-
-    # make sure the ref is updated
-    print "reset %s" % ref
-    print "from :%u" % rev_to_mark(revid)
-    print
-
-    marks.set_tip(name, revid)
-
-def export_tag(repo, name):
-    ref = '%s/tags/%s' % (prefix, name)
-    print "reset %s" % ref
-    print "from :%u" % rev_to_mark(tags[name])
-    print
-
-def do_import(parser):
-    repo = parser.repo
-    path = os.path.join(dirname, 'marks-git')
-
-    print "feature done"
-    if os.path.exists(path):
-        print "feature import-marks=%s" % path
-    print "feature export-marks=%s" % path
-    print "feature force"
-    sys.stdout.flush()
-
-    while parser.check('import'):
-        ref = parser[1]
-        if ref.startswith('refs/heads/'):
-            name = ref[len('refs/heads/'):]
-            export_branch(repo, name)
-        if ref.startswith('refs/tags/'):
-            name = ref[len('refs/tags/'):]
-            export_tag(repo, name)
-        parser.next()
-
-    print 'done'
-
-    sys.stdout.flush()
-
-def parse_blob(parser):
-    parser.next()
-    mark = parser.get_mark()
-    parser.next()
-    data = parser.get_data()
-    blob_marks[mark] = data
-    parser.next()
-
-class CustomTree():
-
-    def __init__(self, branch, revid, parents, files):
-        self.updates = {}
-        self.branch = branch
-
-        def copy_tree(revid):
-            files = files_cache[revid] = {}
-            branch.lock_read()
-            tree = branch.repository.revision_tree(revid)
-            try:
-                for path, entry in tree.iter_entries_by_dir():
-                    files[path] = [entry.file_id, None]
-            finally:
-                branch.unlock()
-            return files
-
-        if len(parents) == 0:
-            self.base_id = bzrlib.revision.NULL_REVISION
-            self.base_files = {}
-        else:
-            self.base_id = parents[0]
-            self.base_files = files_cache.get(self.base_id, None)
-            if not self.base_files:
-                self.base_files = copy_tree(self.base_id)
-
-        self.files = files_cache[revid] = self.base_files.copy()
-        self.rev_files = {}
-
-        for path, data in self.files.iteritems():
-            fid, mark = data
-            self.rev_files[fid] = [path, mark]
-
-        for path, f in files.iteritems():
-            fid, mark = self.files.get(path, [None, None])
-            if not fid:
-                fid = bzrlib.generate_ids.gen_file_id(path)
-            f['path'] = path
-            self.rev_files[fid] = [path, mark]
-            self.updates[fid] = f
-
-    def last_revision(self):
-        return self.base_id
-
-    def iter_changes(self):
-        changes = []
-
-        def get_parent(dirname, basename):
-            parent_fid, mark = self.base_files.get(dirname, [None, None])
-            if parent_fid:
-                return parent_fid
-            parent_fid, mark = self.files.get(dirname, [None, None])
-            if parent_fid:
-                return parent_fid
-            if basename == '':
-                return None
-            fid = bzrlib.generate_ids.gen_file_id(path)
-            add_entry(fid, dirname, 'directory')
-            return fid
-
-        def add_entry(fid, path, kind, mode=None):
-            dirname, basename = os.path.split(path)
-            parent_fid = get_parent(dirname, basename)
-
-            executable = False
-            if mode == '100755':
-                executable = True
-            elif mode == '120000':
-                kind = 'symlink'
-
-            change = (fid,
-                    (None, path),
-                    True,
-                    (False, True),
-                    (None, parent_fid),
-                    (None, basename),
-                    (None, kind),
-                    (None, executable))
-            self.files[path] = [change[0], None]
-            changes.append(change)
-
-        def update_entry(fid, path, kind, mode=None):
-            dirname, basename = os.path.split(path)
-            parent_fid = get_parent(dirname, basename)
-
-            executable = False
-            if mode == '100755':
-                executable = True
-            elif mode == '120000':
-                kind = 'symlink'
-
-            change = (fid,
-                    (path, path),
-                    True,
-                    (True, True),
-                    (None, parent_fid),
-                    (None, basename),
-                    (None, kind),
-                    (None, executable))
-            self.files[path] = [change[0], None]
-            changes.append(change)
-
-        def remove_entry(fid, path, kind):
-            dirname, basename = os.path.split(path)
-            parent_fid = get_parent(dirname, basename)
-            change = (fid,
-                    (path, None),
-                    True,
-                    (True, False),
-                    (parent_fid, None),
-                    (None, None),
-                    (None, None),
-                    (None, None))
-            del self.files[path]
-            changes.append(change)
-
-        for fid, f in self.updates.iteritems():
-            path = f['path']
-
-            if 'deleted' in f:
-                remove_entry(fid, path, 'file')
-                continue
-
-            if path in self.base_files:
-                update_entry(fid, path, 'file', f['mode'])
-            else:
-                add_entry(fid, path, 'file', f['mode'])
-
-            self.files[path][1] = f['mark']
-            self.rev_files[fid][1] = f['mark']
-
-        return changes
-
-    def get_content(self, file_id):
-        path, mark = self.rev_files[file_id]
-        if mark:
-            return blob_marks[mark]
-
-        # last resort
-        tree = self.branch.repository.revision_tree(self.base_id)
-        return tree.get_file_text(file_id)
-
-    def get_file_with_stat(self, file_id, path=None):
-        content = self.get_content(file_id)
-        return (StringIO.StringIO(content), None)
-
-    def get_symlink_target(self, file_id):
-        return self.get_content(file_id)
-
-    def id2path(self, file_id):
-        path, mark = self.rev_files[file_id]
-        return path
-
-def c_style_unescape(string):
-    if string[0] == string[-1] == '"':
-        return string.decode('string-escape')[1:-1]
-    return string
-
-def parse_commit(parser):
-    parents = []
-
-    ref = parser[1]
-    parser.next()
-
-    if ref.startswith('refs/heads/'):
-        name = ref[len('refs/heads/'):]
-        branch = get_remote_branch(name)
-    else:
-        die('unknown ref')
-
-    commit_mark = parser.get_mark()
-    parser.next()
-    author = parser.get_author()
-    parser.next()
-    committer = parser.get_author()
-    parser.next()
-    data = parser.get_data()
-    parser.next()
-    if parser.check('from'):
-        parents.append(parser.get_mark())
-        parser.next()
-    while parser.check('merge'):
-        parents.append(parser.get_mark())
-        parser.next()
-
-    # fast-export adds an extra newline
-    if data[-1] == '\n':
-        data = data[:-1]
-
-    files = {}
-
-    for line in parser:
-        if parser.check('M'):
-            t, m, mark_ref, path = line.split(' ', 3)
-            mark = int(mark_ref[1:])
-            f = { 'mode' : m, 'mark' : mark }
-        elif parser.check('D'):
-            t, path = line.split(' ', 1)
-            f = { 'deleted' : True }
-        else:
-            die('Unknown file command: %s' % line)
-        path = c_style_unescape(path).decode('utf-8')
-        files[path] = f
-
-    committer, date, tz = committer
-    parents = [mark_to_rev(p) for p in parents]
-    revid = bzrlib.generate_ids.gen_revision_id(committer, date)
-    props = {}
-    props['branch-nick'] = branch.nick
-
-    mtree = CustomTree(branch, revid, parents, files)
-    changes = mtree.iter_changes()
-
-    branch.lock_write()
-    try:
-        builder = branch.get_commit_builder(parents, None, date, tz, committer, props, revid)
-        try:
-            list(builder.record_iter_changes(mtree, mtree.last_revision(), changes))
-            builder.finish_inventory()
-            builder.commit(data.decode('utf-8', 'replace'))
-        except Exception, e:
-            builder.abort()
-            raise
-    finally:
-        branch.unlock()
-
-    parsed_refs[ref] = revid
-    marks.new_mark(revid, commit_mark)
-
-def parse_reset(parser):
-    ref = parser[1]
-    parser.next()
-
-    # ugh
-    if parser.check('commit'):
-        parse_commit(parser)
-        return
-    if not parser.check('from'):
-        return
-    from_mark = parser.get_mark()
-    parser.next()
-
-    parsed_refs[ref] = mark_to_rev(from_mark)
-
-def do_export(parser):
-    parser.next()
-
-    for line in parser.each_block('done'):
-        if parser.check('blob'):
-            parse_blob(parser)
-        elif parser.check('commit'):
-            parse_commit(parser)
-        elif parser.check('reset'):
-            parse_reset(parser)
-        elif parser.check('tag'):
-            pass
-        elif parser.check('feature'):
-            pass
-        else:
-            die('unhandled export command: %s' % line)
-
-    for ref, revid in parsed_refs.iteritems():
-        if ref.startswith('refs/heads/'):
-            name = ref[len('refs/heads/'):]
-            branch = get_remote_branch(name)
-            branch.generate_revision_history(revid, marks.get_tip(name))
-
-            if name in peers:
-                peer = bzrlib.branch.Branch.open(peers[name],
-                                                 possible_transports=transports)
-                try:
-                    peer.bzrdir.push_branch(branch, revision_id=revid,
-                                            overwrite=force)
-                except bzrlib.errors.DivergedBranches:
-                    print "error %s non-fast forward" % ref
-                    continue
-
-            try:
-                wt = branch.bzrdir.open_workingtree()
-                wt.update()
-            except bzrlib.errors.NoWorkingTree:
-                pass
-        elif ref.startswith('refs/tags/'):
-            # TODO: implement tag push
-            print "error %s pushing tags not supported" % ref
-            continue
-        else:
-            # transport-helper/fast-export bugs
-            continue
-
-        print "ok %s" % ref
-
-    print
-
-def do_capabilities(parser):
-    print "import"
-    print "export"
-    print "refspec refs/heads/*:%s/heads/*" % prefix
-    print "refspec refs/tags/*:%s/tags/*" % prefix
-
-    path = os.path.join(dirname, 'marks-git')
-
-    if os.path.exists(path):
-        print "*import-marks %s" % path
-    print "*export-marks %s" % path
-
-    print "option"
-    print
-
-class InvalidOptionValue(Exception):
-    pass
-
-def get_bool_option(val):
-    if val == 'true':
-        return True
-    elif val == 'false':
-        return False
-    else:
-        raise InvalidOptionValue()
-
-def do_option(parser):
-    global force
-    opt, val = parser[1:3]
-    try:
-        if opt == 'force':
-            force = get_bool_option(val)
-            print 'ok'
-        else:
-            print 'unsupported'
-    except InvalidOptionValue:
-        print "error '%s' is not a valid value for option '%s'" % (val, opt)
-
-def ref_is_valid(name):
-    return not True in [c in name for c in '~^: \\']
-
-def do_list(parser):
-    master_branch = None
-
-    for name in branches:
-        if not master_branch:
-            master_branch = name
-        print "? refs/heads/%s" % name
-
-    branch = get_remote_branch(master_branch)
-    branch.lock_read()
-    for tag, revid in branch.tags.get_tag_dict().items():
-        try:
-            branch.revision_id_to_dotted_revno(revid)
-        except bzrlib.errors.NoSuchRevision:
-            continue
-        if not ref_is_valid(tag):
-            continue
-        print "? refs/tags/%s" % tag
-        tags[tag] = revid
-    branch.unlock()
-
-    print "@refs/heads/%s HEAD" % master_branch
-    print
-
-def clone(path, remote_branch):
-    try:
-        bdir = bzrlib.bzrdir.BzrDir.create(path, possible_transports=transports)
-    except bzrlib.errors.AlreadyControlDirError:
-        bdir = bzrlib.bzrdir.BzrDir.open(path, possible_transports=transports)
-    repo = bdir.find_repository()
-    repo.fetch(remote_branch.repository)
-    return remote_branch.sprout(bdir, repository=repo)
-
-def get_remote_branch(name):
-    remote_branch = bzrlib.branch.Branch.open(branches[name],
-                                              possible_transports=transports)
-    if isinstance(remote_branch.user_transport, bzrlib.transport.local.LocalTransport):
-        return remote_branch
-
-    branch_path = os.path.join(dirname, 'clone', name)
-
-    try:
-        branch = bzrlib.branch.Branch.open(branch_path,
-                                           possible_transports=transports)
-    except bzrlib.errors.NotBranchError:
-        # clone
-        branch = clone(branch_path, remote_branch)
-    else:
-        # pull
-        try:
-            branch.pull(remote_branch, overwrite=True)
-        except bzrlib.errors.DivergedBranches:
-            # use remote branch for now
-            return remote_branch
-
-    return branch
-
-def find_branches(repo):
-    transport = repo.bzrdir.root_transport
-
-    for fn in transport.iter_files_recursive():
-        if not fn.endswith('.bzr/branch-format'):
-            continue
-
-        name = subdir = fn[:-len('/.bzr/branch-format')]
-        name = name if name != '' else 'master'
-        name = name.replace('/', '+')
-
-        try:
-            cur = transport.clone(subdir)
-            branch = bzrlib.branch.Branch.open_from_transport(cur)
-        except bzrlib.errors.NotBranchError:
-            continue
-        else:
-            yield name, branch.base
-
-def get_repo(url, alias):
-    normal_url = bzrlib.urlutils.normalize_url(url)
-    origin = bzrlib.bzrdir.BzrDir.open(url, possible_transports=transports)
-    is_local = isinstance(origin.transport, bzrlib.transport.local.LocalTransport)
-
-    shared_path = os.path.join(gitdir, 'bzr')
-    try:
-        shared_dir = bzrlib.bzrdir.BzrDir.open(shared_path,
-                                               possible_transports=transports)
-    except bzrlib.errors.NotBranchError:
-        shared_dir = bzrlib.bzrdir.BzrDir.create(shared_path,
-                                                 possible_transports=transports)
-    try:
-        shared_repo = shared_dir.open_repository()
-    except bzrlib.errors.NoRepositoryPresent:
-        shared_repo = shared_dir.create_repository(shared=True)
-
-    if not is_local:
-        clone_path = os.path.join(dirname, 'clone')
-        if not os.path.exists(clone_path):
-            os.mkdir(clone_path)
-        else:
-            # check and remove old organization
-            try:
-                bdir = bzrlib.bzrdir.BzrDir.open(clone_path,
-                                                 possible_transports=transports)
-                bdir.destroy_repository()
-            except bzrlib.errors.NotBranchError:
-                pass
-            except bzrlib.errors.NoRepositoryPresent:
-                pass
-
-    wanted = get_config('remote.%s.bzr-branches' % alias).rstrip().split(', ')
-    # stupid python
-    wanted = [e for e in wanted if e]
-    if not wanted:
-        wanted = get_config('remote-bzr.branches').rstrip().split(', ')
-        # stupid python
-        wanted = [e for e in wanted if e]
-
-    if not wanted:
-        try:
-            repo = origin.open_repository()
-            if not repo.user_transport.listable():
-                # this repository is not usable for us
-                raise bzrlib.errors.NoRepositoryPresent(repo.bzrdir)
-        except bzrlib.errors.NoRepositoryPresent:
-            wanted = ['master']
-
-    if wanted:
-        def list_wanted(url, wanted):
-            for name in wanted:
-                subdir = name if name != 'master' else ''
-                yield name, bzrlib.urlutils.join(url, subdir)
-
-        branch_list = list_wanted(url, wanted)
-    else:
-        branch_list = find_branches(repo)
-
-    for name, url in branch_list:
-        if not is_local:
-            peers[name] = url
-        branches[name] = url
-
-    return origin
-
-def fix_path(alias, orig_url):
-    url = urlparse.urlparse(orig_url, 'file')
-    if url.scheme != 'file' or os.path.isabs(url.path):
-        return
-    abs_url = urlparse.urljoin("%s/" % os.getcwd(), orig_url)
-    cmd = ['git', 'config', 'remote.%s.url' % alias, "bzr::%s" % abs_url]
-    subprocess.call(cmd)
-
-def main(args):
-    global marks, prefix, gitdir, dirname
-    global tags, filenodes
-    global blob_marks
-    global parsed_refs
-    global files_cache
-    global is_tmp
-    global branches, peers
-    global transports
-    global force
-
-    marks = None
-    is_tmp = False
-    gitdir = os.environ.get('GIT_DIR', None)
-
-    if len(args) < 3:
-        die('Not enough arguments.')
-
-    if not gitdir:
-        die('GIT_DIR not set')
-
-    alias = args[1]
-    url = args[2]
-
-    tags = {}
-    filenodes = {}
-    blob_marks = {}
-    parsed_refs = {}
-    files_cache = {}
-    branches = {}
-    peers = {}
-    transports = []
-    force = False
-
-    if alias[5:] == url:
-        is_tmp = True
-        alias = hashlib.sha1(alias).hexdigest()
-
-    prefix = 'refs/bzr/%s' % alias
-    dirname = os.path.join(gitdir, 'bzr', alias)
-
-    if not is_tmp:
-        fix_path(alias, url)
-
-    if not os.path.exists(dirname):
-        os.makedirs(dirname)
-
-    if hasattr(bzrlib.ui.ui_factory, 'be_quiet'):
-        bzrlib.ui.ui_factory.be_quiet(True)
-
-    repo = get_repo(url, alias)
-
-    marks_path = os.path.join(dirname, 'marks-int')
-    marks = Marks(marks_path)
-
-    parser = Parser(repo)
-    for line in parser:
-        if parser.check('capabilities'):
-            do_capabilities(parser)
-        elif parser.check('list'):
-            do_list(parser)
-        elif parser.check('import'):
-            do_import(parser)
-        elif parser.check('export'):
-            do_export(parser)
-        elif parser.check('option'):
-            do_option(parser)
-        else:
-            die('unhandled command: %s' % line)
-        sys.stdout.flush()
 
-def bye():
-    if not marks:
-        return
-    if not is_tmp:
-        marks.store()
-    else:
-        shutil.rmtree(dirname)
+sys.stderr.write('WARNING: git-remote-bzr is now maintained independently.\n')
+sys.stderr.write('WARNING: For more information visit https://github.com/felipec/git-remote-bzr\n')
 
-atexit.register(bye)
-sys.exit(main(sys.argv))
+sys.stderr.write('''WARNING:
+WARNING: You can pick a directory on your $PATH and download it, e.g.:
+WARNING:   $ wget -O $HOME/bin/git-remote-bzr \\
+WARNING:     https://raw.github.com/felipec/git-remote-bzr/master/git-remote-bzr
+WARNING:   $ chmod +x $HOME/bin/git-remote-bzr
+''')
index eb89ef67798e70fd77eff341e3dda5385d3cde48..4255ad6312ec027b65ffd4dfc456bc0ed5dd533f 100755 (executable)
 #!/usr/bin/env python
-#
-# Copyright (c) 2012 Felipe Contreras
-#
 
-# Inspired by Rocco Rutte's hg-fast-export
-
-# Just copy to your ~/bin, or anywhere in your $PATH.
-# Then you can clone with:
-# git clone hg::/path/to/mercurial/repo/
-#
-# For remote repositories a local clone is stored in
-# "$GIT_DIR/hg/origin/clone/.hg/".
-
-from mercurial import hg, ui, bookmarks, context, encoding, node, error, extensions, discovery, util
-
-import re
 import sys
-import os
-import json
-import shutil
-import subprocess
-import urllib
-import atexit
-import urlparse, hashlib
-import time as ptime
-
-#
-# If you want to see Mercurial revisions as Git commit notes:
-# git config core.notesRef refs/notes/hg
-#
-# If you are not in hg-git-compat mode and want to disable the tracking of
-# named branches:
-# git config --global remote-hg.track-branches false
-#
-# If you want the equivalent of hg's clone/pull--insecure option:
-# git config --global remote-hg.insecure true
-#
-# If you want to switch to hg-git compatibility mode:
-# git config --global remote-hg.hg-git-compat true
-#
-# git:
-# Sensible defaults for git.
-# hg bookmarks are exported as git branches, hg branches are prefixed
-# with 'branches/', HEAD is a special case.
-#
-# hg:
-# Emulate hg-git.
-# Only hg bookmarks are exported as git branches.
-# Commits are modified to preserve hg information and allow bidirectionality.
-#
-
-NAME_RE = re.compile('^([^<>]+)')
-AUTHOR_RE = re.compile('^([^<>]+?)? ?[<>]([^<>]*)(?:$|>)')
-EMAIL_RE = re.compile(r'([^ \t<>]+@[^ \t<>]+)')
-AUTHOR_HG_RE = re.compile('^(.*?) ?<(.*?)(?:>(.+)?)?$')
-RAW_AUTHOR_RE = re.compile('^(\w+) (?:(.+)? )?<(.*)> (\d+) ([+-]\d+)')
-
-VERSION = 2
-
-def die(msg, *args):
-    sys.stderr.write('ERROR: %s\n' % (msg % args))
-    sys.exit(1)
-
-def warn(msg, *args):
-    sys.stderr.write('WARNING: %s\n' % (msg % args))
-
-def gitmode(flags):
-    return 'l' in flags and '120000' or 'x' in flags and '100755' or '100644'
-
-def gittz(tz):
-    return '%+03d%02d' % (-tz / 3600, -tz % 3600 / 60)
-
-def hgmode(mode):
-    m = { '100755': 'x', '120000': 'l' }
-    return m.get(mode, '')
-
-def hghex(n):
-    return node.hex(n)
-
-def hgbin(n):
-    return node.bin(n)
-
-def hgref(ref):
-    return ref.replace('___', ' ')
-
-def gitref(ref):
-    return ref.replace(' ', '___')
-
-def check_version(*check):
-    if not hg_version:
-        return True
-    return hg_version >= check
-
-def get_config(config):
-    cmd = ['git', 'config', '--get', config]
-    process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
-    output, _ = process.communicate()
-    return output
-
-def get_config_bool(config, default=False):
-    value = get_config(config).rstrip('\n')
-    if value == "true":
-        return True
-    elif value == "false":
-        return False
-    else:
-        return default
-
-class Marks:
-
-    def __init__(self, path, repo):
-        self.path = path
-        self.repo = repo
-        self.clear()
-        self.load()
-
-        if self.version < VERSION:
-            if self.version == 1:
-                self.upgrade_one()
-
-            # upgraded?
-            if self.version < VERSION:
-                self.clear()
-                self.version = VERSION
-
-    def clear(self):
-        self.tips = {}
-        self.marks = {}
-        self.rev_marks = {}
-        self.last_mark = 0
-        self.version = 0
-        self.last_note = 0
-
-    def load(self):
-        if not os.path.exists(self.path):
-            return
-
-        tmp = json.load(open(self.path))
-
-        self.tips = tmp['tips']
-        self.marks = tmp['marks']
-        self.last_mark = tmp['last-mark']
-        self.version = tmp.get('version', 1)
-        self.last_note = tmp.get('last-note', 0)
-
-        for rev, mark in self.marks.iteritems():
-            self.rev_marks[mark] = rev
-
-    def upgrade_one(self):
-        def get_id(rev):
-            return hghex(self.repo.changelog.node(int(rev)))
-        self.tips = dict((name, get_id(rev)) for name, rev in self.tips.iteritems())
-        self.marks = dict((get_id(rev), mark) for rev, mark in self.marks.iteritems())
-        self.rev_marks = dict((mark, get_id(rev)) for mark, rev in self.rev_marks.iteritems())
-        self.version = 2
-
-    def dict(self):
-        return { 'tips': self.tips, 'marks': self.marks, 'last-mark' : self.last_mark, 'version' : self.version, 'last-note' : self.last_note }
-
-    def store(self):
-        json.dump(self.dict(), open(self.path, 'w'))
-
-    def __str__(self):
-        return str(self.dict())
-
-    def from_rev(self, rev):
-        return self.marks[rev]
-
-    def to_rev(self, mark):
-        return str(self.rev_marks[mark])
-
-    def next_mark(self):
-        self.last_mark += 1
-        return self.last_mark
-
-    def get_mark(self, rev):
-        self.last_mark += 1
-        self.marks[rev] = self.last_mark
-        return self.last_mark
-
-    def new_mark(self, rev, mark):
-        self.marks[rev] = mark
-        self.rev_marks[mark] = rev
-        self.last_mark = mark
-
-    def is_marked(self, rev):
-        return rev in self.marks
-
-    def get_tip(self, branch):
-        return str(self.tips[branch])
-
-    def set_tip(self, branch, tip):
-        self.tips[branch] = tip
-
-class Parser:
-
-    def __init__(self, repo):
-        self.repo = repo
-        self.line = self.get_line()
-
-    def get_line(self):
-        return sys.stdin.readline().strip()
-
-    def __getitem__(self, i):
-        return self.line.split()[i]
-
-    def check(self, word):
-        return self.line.startswith(word)
-
-    def each_block(self, separator):
-        while self.line != separator:
-            yield self.line
-            self.line = self.get_line()
-
-    def __iter__(self):
-        return self.each_block('')
-
-    def next(self):
-        self.line = self.get_line()
-        if self.line == 'done':
-            self.line = None
-
-    def get_mark(self):
-        i = self.line.index(':') + 1
-        return int(self.line[i:])
-
-    def get_data(self):
-        if not self.check('data'):
-            return None
-        i = self.line.index(' ') + 1
-        size = int(self.line[i:])
-        return sys.stdin.read(size)
-
-    def get_author(self):
-        ex = None
-        m = RAW_AUTHOR_RE.match(self.line)
-        if not m:
-            return None
-        _, name, email, date, tz = m.groups()
-        if name and 'ext:' in name:
-            m = re.match('^(.+?) ext:\((.+)\)$', name)
-            if m:
-                name = m.group(1)
-                ex = urllib.unquote(m.group(2))
-
-        if email != bad_mail:
-            if name:
-                user = '%s <%s>' % (name, email)
-            else:
-                user = '<%s>' % (email)
-        else:
-            user = name
-
-        if ex:
-            user += ex
-
-        tz = int(tz)
-        tz = ((tz / 100) * 3600) + ((tz % 100) * 60)
-        return (user, int(date), -tz)
-
-def fix_file_path(path):
-    if not os.path.isabs(path):
-        return path
-    return os.path.relpath(path, '/')
-
-def export_files(files):
-    final = []
-    for f in files:
-        fid = node.hex(f.filenode())
-
-        if fid in filenodes:
-            mark = filenodes[fid]
-        else:
-            mark = marks.next_mark()
-            filenodes[fid] = mark
-            d = f.data()
-
-            print "blob"
-            print "mark :%u" % mark
-            print "data %d" % len(d)
-            print d
-
-        path = fix_file_path(f.path())
-        final.append((gitmode(f.flags()), mark, path))
-
-    return final
-
-def get_filechanges(repo, ctx, parent):
-    modified = set()
-    added = set()
-    removed = set()
-
-    # load earliest manifest first for caching reasons
-    prev = parent.manifest().copy()
-    cur = ctx.manifest()
-
-    for fn in cur:
-        if fn in prev:
-            if (cur.flags(fn) != prev.flags(fn) or cur[fn] != prev[fn]):
-                modified.add(fn)
-            del prev[fn]
-        else:
-            added.add(fn)
-    removed |= set(prev.keys())
-
-    return added | modified, removed
-
-def fixup_user_git(user):
-    name = mail = None
-    user = user.replace('"', '')
-    m = AUTHOR_RE.match(user)
-    if m:
-        name = m.group(1)
-        mail = m.group(2).strip()
-    else:
-        m = EMAIL_RE.match(user)
-        if m:
-            mail = m.group(1)
-        else:
-            m = NAME_RE.match(user)
-            if m:
-                name = m.group(1).strip()
-    return (name, mail)
-
-def fixup_user_hg(user):
-    def sanitize(name):
-        # stole this from hg-git
-        return re.sub('[<>\n]', '?', name.lstrip('< ').rstrip('> '))
-
-    m = AUTHOR_HG_RE.match(user)
-    if m:
-        name = sanitize(m.group(1))
-        mail = sanitize(m.group(2))
-        ex = m.group(3)
-        if ex:
-            name += ' ext:(' + urllib.quote(ex) + ')'
-    else:
-        name = sanitize(user)
-        if '@' in user:
-            mail = name
-        else:
-            mail = None
-
-    return (name, mail)
-
-def fixup_user(user):
-    if mode == 'git':
-        name, mail = fixup_user_git(user)
-    else:
-        name, mail = fixup_user_hg(user)
-
-    if not name:
-        name = bad_name
-    if not mail:
-        mail = bad_mail
-
-    return '%s <%s>' % (name, mail)
-
-def updatebookmarks(repo, peer):
-    remotemarks = peer.listkeys('bookmarks')
-    localmarks = repo._bookmarks
-
-    if not remotemarks:
-        return
-
-    for k, v in remotemarks.iteritems():
-        localmarks[k] = hgbin(v)
-
-    if hasattr(localmarks, 'write'):
-        localmarks.write()
-    else:
-        bookmarks.write(repo)
-
-def get_repo(url, alias):
-    global peer
-
-    myui = ui.ui()
-    myui.setconfig('ui', 'interactive', 'off')
-    myui.fout = sys.stderr
-
-    if get_config_bool('remote-hg.insecure'):
-        myui.setconfig('web', 'cacerts', '')
-
-    extensions.loadall(myui)
-
-    if hg.islocal(url) and not os.environ.get('GIT_REMOTE_HG_TEST_REMOTE'):
-        repo = hg.repository(myui, url)
-        if not os.path.exists(dirname):
-            os.makedirs(dirname)
-    else:
-        shared_path = os.path.join(gitdir, 'hg')
-
-        # check and upgrade old organization
-        hg_path = os.path.join(shared_path, '.hg')
-        if os.path.exists(shared_path) and not os.path.exists(hg_path):
-            repos = os.listdir(shared_path)
-            for x in repos:
-                local_hg = os.path.join(shared_path, x, 'clone', '.hg')
-                if not os.path.exists(local_hg):
-                    continue
-                if not os.path.exists(hg_path):
-                    shutil.move(local_hg, hg_path)
-                shutil.rmtree(os.path.join(shared_path, x, 'clone'))
-
-        # setup shared repo (if not there)
-        try:
-            hg.peer(myui, {}, shared_path, create=True)
-        except error.RepoError:
-            pass
-
-        if not os.path.exists(dirname):
-            os.makedirs(dirname)
-
-        local_path = os.path.join(dirname, 'clone')
-        if not os.path.exists(local_path):
-            hg.share(myui, shared_path, local_path, update=False)
-        else:
-            # make sure the shared path is always up-to-date
-            util.writefile(os.path.join(local_path, '.hg', 'sharedpath'), hg_path)
-
-        repo = hg.repository(myui, local_path)
-        try:
-            peer = hg.peer(myui, {}, url)
-        except:
-            die('Repository error')
-        repo.pull(peer, heads=None, force=True)
-
-        updatebookmarks(repo, peer)
-
-    return repo
-
-def rev_to_mark(rev):
-    return marks.from_rev(rev.hex())
-
-def mark_to_rev(mark):
-    return marks.to_rev(mark)
-
-def export_ref(repo, name, kind, head):
-    ename = '%s/%s' % (kind, name)
-    try:
-        tip = marks.get_tip(ename)
-        tip = repo[tip].rev()
-    except:
-        tip = 0
-
-    revs = xrange(tip, head.rev() + 1)
-    total = len(revs)
-
-    for rev in revs:
-
-        c = repo[rev]
-        node = c.node()
-
-        if marks.is_marked(c.hex()):
-            continue
-
-        (manifest, user, (time, tz), files, desc, extra) = repo.changelog.read(node)
-        rev_branch = extra['branch']
-
-        author = "%s %d %s" % (fixup_user(user), time, gittz(tz))
-        if 'committer' in extra:
-            user, time, tz = extra['committer'].rsplit(' ', 2)
-            committer = "%s %s %s" % (user, time, gittz(int(tz)))
-        else:
-            committer = author
-
-        parents = [repo[p] for p in repo.changelog.parentrevs(rev) if p >= 0]
-
-        if len(parents) == 0:
-            modified = c.manifest().keys()
-            removed = []
-        else:
-            modified, removed = get_filechanges(repo, c, parents[0])
-
-        desc += '\n'
-
-        if mode == 'hg':
-            extra_msg = ''
-
-            if rev_branch != 'default':
-                extra_msg += 'branch : %s\n' % rev_branch
-
-            renames = []
-            for f in c.files():
-                if f not in c.manifest():
-                    continue
-                rename = c.filectx(f).renamed()
-                if rename:
-                    renames.append((rename[0], f))
-
-            for e in renames:
-                extra_msg += "rename : %s => %s\n" % e
-
-            for key, value in extra.iteritems():
-                if key in ('author', 'committer', 'encoding', 'message', 'branch', 'hg-git'):
-                    continue
-                else:
-                    extra_msg += "extra : %s : %s\n" % (key, urllib.quote(value))
-
-            if extra_msg:
-                desc += '\n--HG--\n' + extra_msg
-
-        if len(parents) == 0 and rev:
-            print 'reset %s/%s' % (prefix, ename)
-
-        modified_final = export_files(c.filectx(f) for f in modified)
-
-        print "commit %s/%s" % (prefix, ename)
-        print "mark :%d" % (marks.get_mark(c.hex()))
-        print "author %s" % (author)
-        print "committer %s" % (committer)
-        print "data %d" % (len(desc))
-        print desc
-
-        if len(parents) > 0:
-            print "from :%s" % (rev_to_mark(parents[0]))
-            if len(parents) > 1:
-                print "merge :%s" % (rev_to_mark(parents[1]))
-
-        for f in removed:
-            print "D %s" % (fix_file_path(f))
-        for f in modified_final:
-            print "M %s :%u %s" % f
-        print
-
-        progress = (rev - tip)
-        if (progress % 100 == 0):
-            print "progress revision %d '%s' (%d/%d)" % (rev, name, progress, total)
-
-    # make sure the ref is updated
-    print "reset %s/%s" % (prefix, ename)
-    print "from :%u" % rev_to_mark(head)
-    print
-
-    pending_revs = set(revs) - notes
-    if pending_revs:
-        note_mark = marks.next_mark()
-        ref = "refs/notes/hg"
-
-        print "commit %s" % ref
-        print "mark :%d" % (note_mark)
-        print "committer remote-hg <> %d %s" % (ptime.time(), gittz(ptime.timezone))
-        desc = "Notes for %s\n" % (name)
-        print "data %d" % (len(desc))
-        print desc
-        if marks.last_note:
-            print "from :%u" % marks.last_note
-
-        for rev in pending_revs:
-            notes.add(rev)
-            c = repo[rev]
-            print "N inline :%u" % rev_to_mark(c)
-            msg = c.hex()
-            print "data %d" % (len(msg))
-            print msg
-        print
-
-        marks.last_note = note_mark
-
-    marks.set_tip(ename, head.hex())
-
-def export_tag(repo, tag):
-    export_ref(repo, tag, 'tags', repo[hgref(tag)])
-
-def export_bookmark(repo, bmark):
-    head = bmarks[hgref(bmark)]
-    export_ref(repo, bmark, 'bookmarks', head)
-
-def export_branch(repo, branch):
-    tip = get_branch_tip(repo, branch)
-    head = repo[tip]
-    export_ref(repo, branch, 'branches', head)
-
-def export_head(repo):
-    export_ref(repo, g_head[0], 'bookmarks', g_head[1])
-
-def do_capabilities(parser):
-    print "import"
-    print "export"
-    print "refspec refs/heads/branches/*:%s/branches/*" % prefix
-    print "refspec refs/heads/*:%s/bookmarks/*" % prefix
-    print "refspec refs/tags/*:%s/tags/*" % prefix
-
-    path = os.path.join(dirname, 'marks-git')
-
-    if os.path.exists(path):
-        print "*import-marks %s" % path
-    print "*export-marks %s" % path
-    print "option"
-
-    print
-
-def branch_tip(branch):
-    return branches[branch][-1]
-
-def get_branch_tip(repo, branch):
-    heads = branches.get(hgref(branch), None)
-    if not heads:
-        return None
-
-    # verify there's only one head
-    if (len(heads) > 1):
-        warn("Branch '%s' has more than one head, consider merging" % branch)
-        return branch_tip(hgref(branch))
-
-    return heads[0]
-
-def list_head(repo, cur):
-    global g_head, fake_bmark
-
-    if 'default' not in branches:
-        # empty repo
-        return
-
-    node = repo[branch_tip('default')]
-    head = 'master' if not 'master' in bmarks else 'default'
-    fake_bmark = head
-    bmarks[head] = node
-
-    head = gitref(head)
-    print "@refs/heads/%s HEAD" % head
-    g_head = (head, node)
-
-def do_list(parser):
-    repo = parser.repo
-    for bmark, node in bookmarks.listbookmarks(repo).iteritems():
-        bmarks[bmark] = repo[node]
-
-    cur = repo.dirstate.branch()
-    orig = peer if peer else repo
-
-    for branch, heads in orig.branchmap().iteritems():
-        # only open heads
-        heads = [h for h in heads if 'close' not in repo.changelog.read(h)[5]]
-        if heads:
-            branches[branch] = heads
-
-    list_head(repo, cur)
-
-    if track_branches:
-        for branch in branches:
-            print "? refs/heads/branches/%s" % gitref(branch)
-
-    for bmark in bmarks:
-        print "? refs/heads/%s" % gitref(bmark)
-
-    for tag, node in repo.tagslist():
-        if tag == 'tip':
-            continue
-        print "? refs/tags/%s" % gitref(tag)
-
-    print
-
-def do_import(parser):
-    repo = parser.repo
-
-    path = os.path.join(dirname, 'marks-git')
-
-    print "feature done"
-    if os.path.exists(path):
-        print "feature import-marks=%s" % path
-    print "feature export-marks=%s" % path
-    print "feature force"
-    sys.stdout.flush()
-
-    tmp = encoding.encoding
-    encoding.encoding = 'utf-8'
-
-    # lets get all the import lines
-    while parser.check('import'):
-        ref = parser[1]
-
-        if (ref == 'HEAD'):
-            export_head(repo)
-        elif ref.startswith('refs/heads/branches/'):
-            branch = ref[len('refs/heads/branches/'):]
-            export_branch(repo, branch)
-        elif ref.startswith('refs/heads/'):
-            bmark = ref[len('refs/heads/'):]
-            export_bookmark(repo, bmark)
-        elif ref.startswith('refs/tags/'):
-            tag = ref[len('refs/tags/'):]
-            export_tag(repo, tag)
-
-        parser.next()
-
-    encoding.encoding = tmp
-
-    print 'done'
-
-def parse_blob(parser):
-    parser.next()
-    mark = parser.get_mark()
-    parser.next()
-    data = parser.get_data()
-    blob_marks[mark] = data
-    parser.next()
-
-def get_merge_files(repo, p1, p2, files):
-    for e in repo[p1].files():
-        if e not in files:
-            if e not in repo[p1].manifest():
-                continue
-            f = { 'ctx' : repo[p1][e] }
-            files[e] = f
-
-def c_style_unescape(string):
-    if string[0] == string[-1] == '"':
-        return string.decode('string-escape')[1:-1]
-    return string
-
-def parse_commit(parser):
-    from_mark = merge_mark = None
-
-    ref = parser[1]
-    parser.next()
-
-    commit_mark = parser.get_mark()
-    parser.next()
-    author = parser.get_author()
-    parser.next()
-    committer = parser.get_author()
-    parser.next()
-    data = parser.get_data()
-    parser.next()
-    if parser.check('from'):
-        from_mark = parser.get_mark()
-        parser.next()
-    if parser.check('merge'):
-        merge_mark = parser.get_mark()
-        parser.next()
-        if parser.check('merge'):
-            die('octopus merges are not supported yet')
-
-    # fast-export adds an extra newline
-    if data[-1] == '\n':
-        data = data[:-1]
-
-    files = {}
-
-    for line in parser:
-        if parser.check('M'):
-            t, m, mark_ref, path = line.split(' ', 3)
-            mark = int(mark_ref[1:])
-            f = { 'mode' : hgmode(m), 'data' : blob_marks[mark] }
-        elif parser.check('D'):
-            t, path = line.split(' ', 1)
-            f = { 'deleted' : True }
-        else:
-            die('Unknown file command: %s' % line)
-        path = c_style_unescape(path)
-        files[path] = f
-
-    # only export the commits if we are on an internal proxy repo
-    if dry_run and not peer:
-        parsed_refs[ref] = None
-        return
-
-    def getfilectx(repo, memctx, f):
-        of = files[f]
-        if 'deleted' in of:
-            raise IOError
-        if 'ctx' in of:
-            return of['ctx']
-        is_exec = of['mode'] == 'x'
-        is_link = of['mode'] == 'l'
-        rename = of.get('rename', None)
-        return context.memfilectx(f, of['data'],
-                is_link, is_exec, rename)
-
-    repo = parser.repo
-
-    user, date, tz = author
-    extra = {}
-
-    if committer != author:
-        extra['committer'] = "%s %u %u" % committer
-
-    if from_mark:
-        p1 = mark_to_rev(from_mark)
-    else:
-        p1 = '0' * 40
-
-    if merge_mark:
-        p2 = mark_to_rev(merge_mark)
-    else:
-        p2 = '0' * 40
-
-    #
-    # If files changed from any of the parents, hg wants to know, but in git if
-    # nothing changed from the first parent, nothing changed.
-    #
-    if merge_mark:
-        get_merge_files(repo, p1, p2, files)
-
-    # Check if the ref is supposed to be a named branch
-    if ref.startswith('refs/heads/branches/'):
-        branch = ref[len('refs/heads/branches/'):]
-        extra['branch'] = hgref(branch)
-
-    if mode == 'hg':
-        i = data.find('\n--HG--\n')
-        if i >= 0:
-            tmp = data[i + len('\n--HG--\n'):].strip()
-            for k, v in [e.split(' : ', 1) for e in tmp.split('\n')]:
-                if k == 'rename':
-                    old, new = v.split(' => ', 1)
-                    files[new]['rename'] = old
-                elif k == 'branch':
-                    extra[k] = v
-                elif k == 'extra':
-                    ek, ev = v.split(' : ', 1)
-                    extra[ek] = urllib.unquote(ev)
-            data = data[:i]
-
-    ctx = context.memctx(repo, (p1, p2), data,
-            files.keys(), getfilectx,
-            user, (date, tz), extra)
-
-    tmp = encoding.encoding
-    encoding.encoding = 'utf-8'
-
-    node = hghex(repo.commitctx(ctx))
-
-    encoding.encoding = tmp
-
-    parsed_refs[ref] = node
-    marks.new_mark(node, commit_mark)
-
-def parse_reset(parser):
-    ref = parser[1]
-    parser.next()
-    # ugh
-    if parser.check('commit'):
-        parse_commit(parser)
-        return
-    if not parser.check('from'):
-        return
-    from_mark = parser.get_mark()
-    parser.next()
-
-    try:
-        rev = mark_to_rev(from_mark)
-    except KeyError:
-        rev = None
-    parsed_refs[ref] = rev
-
-def parse_tag(parser):
-    name = parser[1]
-    parser.next()
-    from_mark = parser.get_mark()
-    parser.next()
-    tagger = parser.get_author()
-    parser.next()
-    data = parser.get_data()
-    parser.next()
-
-    parsed_tags[name] = (tagger, data)
-
-def write_tag(repo, tag, node, msg, author):
-    branch = repo[node].branch()
-    tip = branch_tip(branch)
-    tip = repo[tip]
-
-    def getfilectx(repo, memctx, f):
-        try:
-            fctx = tip.filectx(f)
-            data = fctx.data()
-        except error.ManifestLookupError:
-            data = ""
-        content = data + "%s %s\n" % (node, tag)
-        return context.memfilectx(f, content, False, False, None)
-
-    p1 = tip.hex()
-    p2 = '0' * 40
-    if author:
-        user, date, tz = author
-        date_tz = (date, tz)
-    else:
-        cmd = ['git', 'var', 'GIT_COMMITTER_IDENT']
-        process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
-        output, _ = process.communicate()
-        m = re.match('^.* <.*>', output)
-        if m:
-            user = m.group(0)
-        else:
-            user = repo.ui.username()
-        date_tz = None
-
-    ctx = context.memctx(repo, (p1, p2), msg,
-            ['.hgtags'], getfilectx,
-            user, date_tz, {'branch' : branch})
-
-    tmp = encoding.encoding
-    encoding.encoding = 'utf-8'
-
-    tagnode = repo.commitctx(ctx)
-
-    encoding.encoding = tmp
-
-    return (tagnode, branch)
-
-def checkheads_bmark(repo, ref, ctx):
-    bmark = ref[len('refs/heads/'):]
-    if not bmark in bmarks:
-        # new bmark
-        return True
-
-    ctx_old = bmarks[bmark]
-    ctx_new = ctx
-    if not repo.changelog.descendant(ctx_old.rev(), ctx_new.rev()):
-        if force_push:
-            print "ok %s forced update" % ref
-        else:
-            print "error %s non-fast forward" % ref
-            return False
-
-    return True
-
-def checkheads(repo, remote, p_revs):
-
-    remotemap = remote.branchmap()
-    if not remotemap:
-        # empty repo
-        return True
-
-    new = {}
-    ret = True
-
-    for node, ref in p_revs.iteritems():
-        ctx = repo[node]
-        branch = ctx.branch()
-        if not branch in remotemap:
-            # new branch
-            continue
-        if not ref.startswith('refs/heads/branches'):
-            if ref.startswith('refs/heads/'):
-                if not checkheads_bmark(repo, ref, ctx):
-                    ret = False
-
-            # only check branches
-            continue
-        new.setdefault(branch, []).append(ctx.rev())
-
-    for branch, heads in new.iteritems():
-        old = [repo.changelog.rev(x) for x in remotemap[branch]]
-        for rev in heads:
-            if check_version(2, 3):
-                ancestors = repo.changelog.ancestors([rev], stoprev=min(old))
-            else:
-                ancestors = repo.changelog.ancestors(rev)
-            found = False
-
-            for x in old:
-                if x in ancestors:
-                    found = True
-                    break
-
-            if found:
-                continue
-
-            node = repo.changelog.node(rev)
-            ref = p_revs[node]
-            if force_push:
-                print "ok %s forced update" % ref
-            else:
-                print "error %s non-fast forward" % ref
-                ret = False
-
-    return ret
-
-def push_unsafe(repo, remote, parsed_refs, p_revs):
-
-    force = force_push
-
-    fci = discovery.findcommonincoming
-    commoninc = fci(repo, remote, force=force)
-    common, _, remoteheads = commoninc
-
-    if not checkheads(repo, remote, p_revs):
-        return None
-
-    cg = repo.getbundle('push', heads=list(p_revs), common=common)
-
-    unbundle = remote.capable('unbundle')
-    if unbundle:
-        if force:
-            remoteheads = ['force']
-        return remote.unbundle(cg, remoteheads, 'push')
-    else:
-        return remote.addchangegroup(cg, 'push', repo.url())
-
-def push(repo, remote, parsed_refs, p_revs):
-    if hasattr(remote, 'canpush') and not remote.canpush():
-        print "error cannot push"
-
-    if not p_revs:
-        # nothing to push
-        return
-
-    lock = None
-    unbundle = remote.capable('unbundle')
-    if not unbundle:
-        lock = remote.lock()
-    try:
-        ret = push_unsafe(repo, remote, parsed_refs, p_revs)
-    finally:
-        if lock is not None:
-            lock.release()
-
-    return ret
-
-def check_tip(ref, kind, name, heads):
-    try:
-        ename = '%s/%s' % (kind, name)
-        tip = marks.get_tip(ename)
-    except KeyError:
-        return True
-    else:
-        return tip in heads
-
-def do_export(parser):
-    p_bmarks = []
-    p_revs = {}
-
-    parser.next()
-
-    for line in parser.each_block('done'):
-        if parser.check('blob'):
-            parse_blob(parser)
-        elif parser.check('commit'):
-            parse_commit(parser)
-        elif parser.check('reset'):
-            parse_reset(parser)
-        elif parser.check('tag'):
-            parse_tag(parser)
-        elif parser.check('feature'):
-            pass
-        else:
-            die('unhandled export command: %s' % line)
-
-    need_fetch = False
-
-    for ref, node in parsed_refs.iteritems():
-        bnode = hgbin(node) if node else None
-        if ref.startswith('refs/heads/branches'):
-            branch = ref[len('refs/heads/branches/'):]
-            if branch in branches and bnode in branches[branch]:
-                # up to date
-                continue
-
-            if peer:
-                remotemap = peer.branchmap()
-                if remotemap and branch in remotemap:
-                    heads = [hghex(e) for e in remotemap[branch]]
-                    if not check_tip(ref, 'branches', branch, heads):
-                        print "error %s fetch first" % ref
-                        need_fetch = True
-                        continue
-
-            p_revs[bnode] = ref
-            print "ok %s" % ref
-        elif ref.startswith('refs/heads/'):
-            bmark = ref[len('refs/heads/'):]
-            new = node
-            old = bmarks[bmark].hex() if bmark in bmarks else ''
-
-            if old == new:
-                continue
-
-            print "ok %s" % ref
-            if bmark != fake_bmark and \
-                    not (bmark == 'master' and bmark not in parser.repo._bookmarks):
-                p_bmarks.append((ref, bmark, old, new))
-
-            if peer:
-                remote_old = peer.listkeys('bookmarks').get(bmark)
-                if remote_old:
-                    if not check_tip(ref, 'bookmarks', bmark, remote_old):
-                        print "error %s fetch first" % ref
-                        need_fetch = True
-                        continue
-
-            p_revs[bnode] = ref
-        elif ref.startswith('refs/tags/'):
-            if dry_run:
-                print "ok %s" % ref
-                continue
-            tag = ref[len('refs/tags/'):]
-            tag = hgref(tag)
-            author, msg = parsed_tags.get(tag, (None, None))
-            if mode == 'git':
-                if not msg:
-                    msg = 'Added tag %s for changeset %s' % (tag, node[:12])
-                tagnode, branch = write_tag(parser.repo, tag, node, msg, author)
-                p_revs[tagnode] = 'refs/heads/branches/' + gitref(branch)
-            else:
-                fp = parser.repo.opener('localtags', 'a')
-                fp.write('%s %s\n' % (node, tag))
-                fp.close()
-            p_revs[bnode] = ref
-            print "ok %s" % ref
-        else:
-            # transport-helper/fast-export bugs
-            continue
-
-    if need_fetch:
-        print
-        return
-
-    if dry_run:
-        if peer and not force_push:
-            checkheads(parser.repo, peer, p_revs)
-        print
-        return
-
-    if peer:
-        if not push(parser.repo, peer, parsed_refs, p_revs):
-            # do not update bookmarks
-            print
-            return
-
-        # update remote bookmarks
-        remote_bmarks = peer.listkeys('bookmarks')
-        for ref, bmark, old, new in p_bmarks:
-            if force_push:
-                old = remote_bmarks.get(bmark, '')
-            if not peer.pushkey('bookmarks', bmark, old, new):
-                print "error %s" % ref
-    else:
-        # update local bookmarks
-        for ref, bmark, old, new in p_bmarks:
-            if not bookmarks.pushbookmark(parser.repo, bmark, old, new):
-                print "error %s" % ref
-
-    print
-
-def do_option(parser):
-    global dry_run, force_push
-    _, key, value = parser.line.split(' ')
-    if key == 'dry-run':
-        dry_run = (value == 'true')
-        print 'ok'
-    elif key == 'force':
-        force_push = (value == 'true')
-        print 'ok'
-    else:
-        print 'unsupported'
-
-def fix_path(alias, repo, orig_url):
-    url = urlparse.urlparse(orig_url, 'file')
-    if url.scheme != 'file' or os.path.isabs(os.path.expanduser(url.path)):
-        return
-    abs_url = urlparse.urljoin("%s/" % os.getcwd(), orig_url)
-    cmd = ['git', 'config', 'remote.%s.url' % alias, "hg::%s" % abs_url]
-    subprocess.call(cmd)
-
-def main(args):
-    global prefix, gitdir, dirname, branches, bmarks
-    global marks, blob_marks, parsed_refs
-    global peer, mode, bad_mail, bad_name
-    global track_branches, force_push, is_tmp
-    global parsed_tags
-    global filenodes
-    global fake_bmark, hg_version
-    global dry_run
-    global notes, alias
-
-    marks = None
-    is_tmp = False
-    gitdir = os.environ.get('GIT_DIR', None)
-
-    if len(args) < 3:
-        die('Not enough arguments.')
-
-    if not gitdir:
-        die('GIT_DIR not set')
-
-    alias = args[1]
-    url = args[2]
-    peer = None
-
-    hg_git_compat = get_config_bool('remote-hg.hg-git-compat')
-    track_branches = get_config_bool('remote-hg.track-branches', True)
-    force_push = False
-
-    if hg_git_compat:
-        mode = 'hg'
-        bad_mail = 'none@none'
-        bad_name = ''
-    else:
-        mode = 'git'
-        bad_mail = 'unknown'
-        bad_name = 'Unknown'
-
-    if alias[4:] == url:
-        is_tmp = True
-        alias = hashlib.sha1(alias).hexdigest()
-
-    dirname = os.path.join(gitdir, 'hg', alias)
-    branches = {}
-    bmarks = {}
-    blob_marks = {}
-    parsed_refs = {}
-    parsed_tags = {}
-    filenodes = {}
-    fake_bmark = None
-    try:
-        hg_version = tuple(int(e) for e in util.version().split('.'))
-    except:
-        hg_version = None
-    dry_run = False
-    notes = set()
-
-    repo = get_repo(url, alias)
-    prefix = 'refs/hg/%s' % alias
-
-    if not is_tmp:
-        fix_path(alias, peer or repo, url)
-
-    marks_path = os.path.join(dirname, 'marks-hg')
-    marks = Marks(marks_path, repo)
-
-    if sys.platform == 'win32':
-        import msvcrt
-        msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
-
-    parser = Parser(repo)
-    for line in parser:
-        if parser.check('capabilities'):
-            do_capabilities(parser)
-        elif parser.check('list'):
-            do_list(parser)
-        elif parser.check('import'):
-            do_import(parser)
-        elif parser.check('export'):
-            do_export(parser)
-        elif parser.check('option'):
-            do_option(parser)
-        else:
-            die('unhandled command: %s' % line)
-        sys.stdout.flush()
 
-def bye():
-    if not marks:
-        return
-    if not is_tmp:
-        marks.store()
-    else:
-        shutil.rmtree(dirname)
+sys.stderr.write('WARNING: git-remote-hg is now maintained independently.\n')
+sys.stderr.write('WARNING: For more information visit https://github.com/felipec/git-remote-hg\n')
 
-atexit.register(bye)
-sys.exit(main(sys.argv))
+sys.stderr.write('''WARNING:
+WARNING: You can pick a directory on your $PATH and download it, e.g.:
+WARNING:   $ wget -O $HOME/bin/git-remote-hg \\
+WARNING:     https://raw.github.com/felipec/git-remote-hg/master/git-remote-hg
+WARNING:   $ chmod +x $HOME/bin/git-remote-hg
+''')
diff --git a/contrib/remote-helpers/test-bzr.sh b/contrib/remote-helpers/test-bzr.sh
deleted file mode 100755 (executable)
index 4f379c2..0000000
+++ /dev/null
@@ -1,414 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-
-test_description='Test remote-bzr'
-
-test -n "$TEST_DIRECTORY" || TEST_DIRECTORY=${0%/*}/../../t
-. "$TEST_DIRECTORY"/test-lib.sh
-
-if ! test_have_prereq PYTHON
-then
-       skip_all='skipping remote-bzr tests; python not available'
-       test_done
-fi
-
-if ! python -c 'import bzrlib'
-then
-       skip_all='skipping remote-bzr tests; bzr not available'
-       test_done
-fi
-
-check () {
-       echo $3 >expected &&
-       git --git-dir=$1/.git log --format='%s' -1 $2 >actual
-       test_cmp expected actual
-}
-
-bzr whoami "A U Thor <author@example.com>"
-
-test_expect_success 'cloning' '
-       (
-       bzr init bzrrepo &&
-       cd bzrrepo &&
-       echo one >content &&
-       bzr add content &&
-       bzr commit -m one
-       ) &&
-
-       git clone "bzr::bzrrepo" gitrepo &&
-       check gitrepo HEAD one
-'
-
-test_expect_success 'pulling' '
-       (
-       cd bzrrepo &&
-       echo two >content &&
-       bzr commit -m two
-       ) &&
-
-       (cd gitrepo && git pull) &&
-
-       check gitrepo HEAD two
-'
-
-test_expect_success 'pushing' '
-       (
-       cd gitrepo &&
-       echo three >content &&
-       git commit -a -m three &&
-       git push
-       ) &&
-
-       echo three >expected &&
-       cat bzrrepo/content >actual &&
-       test_cmp expected actual
-'
-
-test_expect_success 'forced pushing' '
-       (
-       cd gitrepo &&
-       echo three-new >content &&
-       git commit -a --amend -m three-new &&
-       git push -f
-       ) &&
-
-       (
-       cd bzrrepo &&
-       # the forced update overwrites the bzr branch but not the bzr
-       # working directory (it tries to merge instead)
-       bzr revert
-       ) &&
-
-       echo three-new >expected &&
-       cat bzrrepo/content >actual &&
-       test_cmp expected actual
-'
-
-test_expect_success 'roundtrip' '
-       (
-       cd gitrepo &&
-       git pull &&
-       git log --format="%s" -1 origin/master >actual
-       ) &&
-       echo three-new >expected &&
-       test_cmp expected actual &&
-
-       (cd gitrepo && git push && git pull) &&
-
-       (
-       cd bzrrepo &&
-       echo four >content &&
-       bzr commit -m four
-       ) &&
-
-       (cd gitrepo && git pull && git push) &&
-
-       check gitrepo HEAD four &&
-
-       (
-       cd gitrepo &&
-       echo five >content &&
-       git commit -a -m five &&
-       git push && git pull
-       ) &&
-
-       (cd bzrrepo && bzr revert) &&
-
-       echo five >expected &&
-       cat bzrrepo/content >actual &&
-       test_cmp expected actual
-'
-
-cat >expected <<\EOF
-100644 blob 54f9d6da5c91d556e6b54340b1327573073030af   content
-100755 blob 68769579c3eaadbe555379b9c3538e6628bae1eb   executable
-120000 blob 6b584e8ece562ebffc15d38808cd6b98fc3d97ea   link
-EOF
-
-test_expect_success 'special modes' '
-       (
-       cd bzrrepo &&
-       echo exec >executable
-       chmod +x executable &&
-       bzr add executable
-       bzr commit -m exec &&
-       ln -s content link
-       bzr add link
-       bzr commit -m link &&
-       mkdir dir &&
-       bzr add dir &&
-       bzr commit -m dir
-       ) &&
-
-       (
-       cd gitrepo &&
-       git pull
-       git ls-tree HEAD >../actual
-       ) &&
-
-       test_cmp expected actual &&
-
-       (
-       cd gitrepo &&
-       git cat-file -p HEAD:link >../actual
-       ) &&
-
-       printf content >expected &&
-       test_cmp expected actual
-'
-
-cat >expected <<\EOF
-100644 blob 54f9d6da5c91d556e6b54340b1327573073030af   content
-100755 blob 68769579c3eaadbe555379b9c3538e6628bae1eb   executable
-120000 blob 6b584e8ece562ebffc15d38808cd6b98fc3d97ea   link
-040000 tree 35c0caa46693cef62247ac89a680f0c5ce32b37b   movedir-new
-EOF
-
-test_expect_success 'moving directory' '
-       (
-       cd bzrrepo &&
-       mkdir movedir &&
-       echo one >movedir/one &&
-       echo two >movedir/two &&
-       bzr add movedir &&
-       bzr commit -m movedir &&
-       bzr mv movedir movedir-new &&
-       bzr commit -m movedir-new
-       ) &&
-
-       (
-       cd gitrepo &&
-       git pull &&
-       git ls-tree HEAD >../actual
-       ) &&
-
-       test_cmp expected actual
-'
-
-test_expect_success 'different authors' '
-       (
-       cd bzrrepo &&
-       echo john >>content &&
-       bzr commit -m john \
-         --author "Jane Rey <jrey@example.com>" \
-         --author "John Doe <jdoe@example.com>"
-       ) &&
-
-       (
-       cd gitrepo &&
-       git pull &&
-       git show --format="%an <%ae>, %cn <%ce>" --quiet >../actual
-       ) &&
-
-       echo "Jane Rey <jrey@example.com>, A U Thor <author@example.com>" >expected &&
-       test_cmp expected actual
-'
-
-# cleanup previous stuff
-rm -rf bzrrepo gitrepo
-
-test_expect_success 'fetch utf-8 filenames' '
-       test_when_finished "rm -rf bzrrepo gitrepo && LC_ALL=C" &&
-
-       LC_ALL=en_US.UTF-8
-       export LC_ALL
-
-       (
-       bzr init bzrrepo &&
-       cd bzrrepo &&
-
-       echo test >>"ærø" &&
-       bzr add "ærø" &&
-       echo test >>"ø~?" &&
-       bzr add "ø~?" &&
-       bzr commit -m add-utf-8 &&
-       echo test >>"ærø" &&
-       bzr commit -m test-utf-8 &&
-       bzr rm "ø~?" &&
-       bzr mv "ærø" "ø~?" &&
-       bzr commit -m bzr-mv-utf-8
-       ) &&
-
-       (
-       git clone "bzr::bzrrepo" gitrepo &&
-       cd gitrepo &&
-       git -c core.quotepath=false ls-files >../actual
-       ) &&
-       echo "ø~?" >expected &&
-       test_cmp expected actual
-'
-
-test_expect_success 'push utf-8 filenames' '
-       test_when_finished "rm -rf bzrrepo gitrepo && LC_ALL=C" &&
-
-       mkdir -p tmp && cd tmp &&
-
-       LC_ALL=en_US.UTF-8
-       export LC_ALL
-
-       (
-       bzr init bzrrepo &&
-       cd bzrrepo &&
-
-       echo one >>content &&
-       bzr add content &&
-       bzr commit -m one
-       ) &&
-
-       (
-       git clone "bzr::bzrrepo" gitrepo &&
-       cd gitrepo &&
-
-       echo test >>"ærø" &&
-       git add "ærø" &&
-       git commit -m utf-8 &&
-
-       git push
-       ) &&
-
-       (cd bzrrepo && bzr ls >../actual) &&
-       printf "content\nærø\n" >expected &&
-       test_cmp expected actual
-'
-
-test_expect_success 'pushing a merge' '
-       test_when_finished "rm -rf bzrrepo gitrepo" &&
-
-       (
-       bzr init bzrrepo &&
-       cd bzrrepo &&
-       echo one >content &&
-       bzr add content &&
-       bzr commit -m one
-       ) &&
-
-       git clone "bzr::bzrrepo" gitrepo &&
-
-       (
-       cd bzrrepo &&
-       echo two >content &&
-       bzr commit -m two
-       ) &&
-
-       (
-       cd gitrepo &&
-       echo three >content &&
-       git commit -a -m three &&
-       git fetch &&
-       git merge origin/master || true &&
-       echo three >content &&
-       git commit -a --no-edit &&
-       git push
-       ) &&
-
-       echo three >expected &&
-       cat bzrrepo/content >actual &&
-       test_cmp expected actual
-'
-
-cat >expected <<\EOF
-origin/HEAD
-origin/branch
-origin/trunk
-EOF
-
-test_expect_success 'proper bzr repo' '
-       test_when_finished "rm -rf bzrrepo gitrepo" &&
-
-       bzr init-repo bzrrepo &&
-
-       (
-       bzr init bzrrepo/trunk &&
-       cd bzrrepo/trunk &&
-       echo one >>content &&
-       bzr add content &&
-       bzr commit -m one
-       ) &&
-
-       (
-       bzr branch bzrrepo/trunk bzrrepo/branch &&
-       cd bzrrepo/branch &&
-       echo two >>content &&
-       bzr commit -m one
-       ) &&
-
-       (
-       git clone "bzr::bzrrepo" gitrepo &&
-       cd gitrepo &&
-       git for-each-ref --format "%(refname:short)" refs/remotes/origin >../actual
-       ) &&
-
-       test_cmp expected actual
-'
-
-test_expect_success 'strip' '
-       test_when_finished "rm -rf bzrrepo gitrepo" &&
-
-       (
-       bzr init bzrrepo &&
-       cd bzrrepo &&
-
-       echo one >>content &&
-       bzr add content &&
-       bzr commit -m one &&
-
-       echo two >>content &&
-       bzr commit -m two
-       ) &&
-
-       git clone "bzr::bzrrepo" gitrepo &&
-
-       (
-       cd bzrrepo &&
-       bzr uncommit --force &&
-
-       echo three >>content &&
-       bzr commit -m three &&
-
-       echo four >>content &&
-       bzr commit -m four &&
-       bzr log --line | sed -e "s/^[0-9][0-9]*: //" >../expected
-       ) &&
-
-       (
-       cd gitrepo &&
-       git fetch &&
-       git log --format="%an %ad %s" --date=short origin/master >../actual
-       ) &&
-
-       test_cmp expected actual
-'
-
-test_expect_success 'export utf-8 authors' '
-       test_when_finished "rm -rf bzrrepo gitrepo && LC_ALL=C && unset GIT_COMMITTER_NAME" &&
-
-       LC_ALL=en_US.UTF-8
-       export LC_ALL
-
-       GIT_COMMITTER_NAME="Grégoire"
-       export GIT_COMMITTER_NAME
-
-       bzr init bzrrepo &&
-
-       (
-       git init gitrepo &&
-       cd gitrepo &&
-       echo greg >>content &&
-       git add content &&
-       git commit -m one &&
-       git remote add bzr "bzr::../bzrrepo" &&
-       git push bzr master
-       ) &&
-
-       (
-       cd bzrrepo &&
-       bzr log | grep "^committer: " >../actual
-       ) &&
-
-       echo "committer: Grégoire <committer@example.com>" >expected &&
-       test_cmp expected actual
-'
-
-test_done
diff --git a/contrib/remote-helpers/test-hg-bidi.sh b/contrib/remote-helpers/test-hg-bidi.sh
deleted file mode 100755 (executable)
index e24c51d..0000000
+++ /dev/null
@@ -1,242 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-# Base commands from hg-git tests:
-# https://bitbucket.org/durin42/hg-git/src
-#
-
-test_description='Test bidirectionality of remote-hg'
-
-. ./test-lib.sh
-
-if ! test_have_prereq PYTHON
-then
-       skip_all='skipping remote-hg tests; python not available'
-       test_done
-fi
-
-if ! python -c 'import mercurial'
-then
-       skip_all='skipping remote-hg tests; mercurial not available'
-       test_done
-fi
-
-# clone to a git repo
-git_clone () {
-       git clone -q "hg::$1" $2
-}
-
-# clone to an hg repo
-hg_clone () {
-       (
-       hg init $2 &&
-       cd $1 &&
-       git push -q "hg::../$2" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*'
-       ) &&
-
-       (cd $2 && hg -q update)
-}
-
-# push an hg repo
-hg_push () {
-       (
-       cd $2
-       git checkout -q -b tmp &&
-       git fetch -q "hg::../$1" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' &&
-       git checkout -q @{-1} &&
-       git branch -q -D tmp 2>/dev/null || true
-       )
-}
-
-hg_log () {
-       hg -R $1 log --graph --debug
-}
-
-setup () {
-       (
-       echo "[ui]"
-       echo "username = A U Thor <author@example.com>"
-       echo "[defaults]"
-       echo "backout = -d \"0 0\""
-       echo "commit = -d \"0 0\""
-       echo "debugrawcommit = -d \"0 0\""
-       echo "tag = -d \"0 0\""
-       echo "[extensions]"
-       echo "graphlog ="
-       ) >>"$HOME"/.hgrc &&
-       git config --global remote-hg.hg-git-compat true
-       git config --global remote-hg.track-branches true
-
-       HGEDITOR=/usr/bin/true
-       GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0230"
-       GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
-       export HGEDITOR GIT_AUTHOR_DATE GIT_COMMITTER_DATE
-}
-
-setup
-
-test_expect_success 'encoding' '
-       test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
-       (
-       git init -q gitrepo &&
-       cd gitrepo &&
-
-       echo alpha >alpha &&
-       git add alpha &&
-       git commit -m "add älphà" &&
-
-       GIT_AUTHOR_NAME="tést èncödîng" &&
-       export GIT_AUTHOR_NAME &&
-       echo beta >beta &&
-       git add beta &&
-       git commit -m "add beta" &&
-
-       echo gamma >gamma &&
-       git add gamma &&
-       git commit -m "add gämmâ" &&
-
-       : TODO git config i18n.commitencoding latin-1 &&
-       echo delta >delta &&
-       git add delta &&
-       git commit -m "add déltà"
-       ) &&
-
-       hg_clone gitrepo hgrepo &&
-       git_clone hgrepo gitrepo2 &&
-       hg_clone gitrepo2 hgrepo2 &&
-
-       HGENCODING=utf-8 hg_log hgrepo >expected &&
-       HGENCODING=utf-8 hg_log hgrepo2 >actual &&
-
-       test_cmp expected actual
-'
-
-test_expect_success 'file removal' '
-       test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
-       (
-       git init -q gitrepo &&
-       cd gitrepo &&
-       echo alpha >alpha &&
-       git add alpha &&
-       git commit -m "add alpha" &&
-       echo beta >beta &&
-       git add beta &&
-       git commit -m "add beta"
-       mkdir foo &&
-       echo blah >foo/bar &&
-       git add foo &&
-       git commit -m "add foo" &&
-       git rm alpha &&
-       git commit -m "remove alpha" &&
-       git rm foo/bar &&
-       git commit -m "remove foo/bar"
-       ) &&
-
-       hg_clone gitrepo hgrepo &&
-       git_clone hgrepo gitrepo2 &&
-       hg_clone gitrepo2 hgrepo2 &&
-
-       hg_log hgrepo >expected &&
-       hg_log hgrepo2 >actual &&
-
-       test_cmp expected actual
-'
-
-test_expect_success 'git tags' '
-       test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
-       (
-       git init -q gitrepo &&
-       cd gitrepo &&
-       git config receive.denyCurrentBranch ignore &&
-       echo alpha >alpha &&
-       git add alpha &&
-       git commit -m "add alpha" &&
-       git tag alpha &&
-
-       echo beta >beta &&
-       git add beta &&
-       git commit -m "add beta" &&
-       git tag -a -m "added tag beta" beta
-       ) &&
-
-       hg_clone gitrepo hgrepo &&
-       git_clone hgrepo gitrepo2 &&
-       hg_clone gitrepo2 hgrepo2 &&
-
-       hg_log hgrepo >expected &&
-       hg_log hgrepo2 >actual &&
-
-       test_cmp expected actual
-'
-
-test_expect_success 'hg branch' '
-       test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
-       (
-       git init -q gitrepo &&
-       cd gitrepo &&
-
-       echo alpha >alpha &&
-       git add alpha &&
-       git commit -q -m "add alpha" &&
-       git checkout -q -b not-master
-       ) &&
-
-       (
-       hg_clone gitrepo hgrepo &&
-
-       cd hgrepo &&
-       hg -q co default &&
-       hg mv alpha beta &&
-       hg -q commit -m "rename alpha to beta" &&
-       hg branch gamma | grep -v "permanent and global" &&
-       hg -q commit -m "started branch gamma"
-       ) &&
-
-       hg_push hgrepo gitrepo &&
-       hg_clone gitrepo hgrepo2 &&
-
-       : Back to the common revision &&
-       (cd hgrepo && hg checkout default) &&
-
-       hg_log hgrepo >expected &&
-       hg_log hgrepo2 >actual &&
-
-       test_cmp expected actual
-'
-
-test_expect_success 'hg tags' '
-       test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
-       (
-       git init -q gitrepo &&
-       cd gitrepo &&
-
-       echo alpha >alpha &&
-       git add alpha &&
-       git commit -m "add alpha" &&
-       git checkout -q -b not-master
-       ) &&
-
-       (
-       hg_clone gitrepo hgrepo &&
-
-       cd hgrepo &&
-       hg co default &&
-       hg tag alpha
-       ) &&
-
-       hg_push hgrepo gitrepo &&
-       hg_clone gitrepo hgrepo2 &&
-
-       hg_log hgrepo >expected &&
-       hg_log hgrepo2 >actual &&
-
-       test_cmp expected actual
-'
-
-test_done
diff --git a/contrib/remote-helpers/test-hg-hg-git.sh b/contrib/remote-helpers/test-hg-hg-git.sh
deleted file mode 100755 (executable)
index 6dcd95d..0000000
+++ /dev/null
@@ -1,541 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-# Base commands from hg-git tests:
-# https://bitbucket.org/durin42/hg-git/src
-#
-
-test_description='Test remote-hg output compared to hg-git'
-
-. ./test-lib.sh
-
-if ! test_have_prereq PYTHON
-then
-       skip_all='skipping remote-hg tests; python not available'
-       test_done
-fi
-
-if ! python -c 'import mercurial'
-then
-       skip_all='skipping remote-hg tests; mercurial not available'
-       test_done
-fi
-
-if ! python -c 'import hggit'
-then
-       skip_all='skipping remote-hg tests; hg-git not available'
-       test_done
-fi
-
-# clone to a git repo with git
-git_clone_git () {
-       git clone -q "hg::$1" $2 &&
-       (cd $2 && git checkout master && git branch -D default)
-}
-
-# clone to an hg repo with git
-hg_clone_git () {
-       (
-       hg init $2 &&
-       hg -R $2 bookmark -i master &&
-       cd $1 &&
-       git push -q "hg::../$2" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*'
-       ) &&
-
-       (cd $2 && hg -q update)
-}
-
-# clone to a git repo with hg
-git_clone_hg () {
-       (
-       git init -q $2 &&
-       cd $1 &&
-       hg bookmark -i -f -r tip master &&
-       hg -q push -r master ../$2 || true
-       )
-}
-
-# clone to an hg repo with hg
-hg_clone_hg () {
-       hg -q clone $1 $2
-}
-
-# push an hg repo with git
-hg_push_git () {
-       (
-       cd $2
-       git checkout -q -b tmp &&
-       git fetch -q "hg::../$1" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' &&
-       git branch -D default &&
-       git checkout -q @{-1} &&
-       git branch -q -D tmp 2>/dev/null || true
-       )
-}
-
-# push an hg git repo with hg
-hg_push_hg () {
-       (
-       cd $1 &&
-       hg -q push ../$2 || true
-       )
-}
-
-hg_log () {
-       hg -R $1 log --graph --debug >log &&
-       grep -v 'tag: *default/' log
-}
-
-git_log () {
-       git --git-dir=$1/.git fast-export --branches
-}
-
-setup () {
-       (
-       echo "[ui]"
-       echo "username = A U Thor <author@example.com>"
-       echo "[defaults]"
-       echo "backout = -d \"0 0\""
-       echo "commit = -d \"0 0\""
-       echo "debugrawcommit = -d \"0 0\""
-       echo "tag = -d \"0 0\""
-       echo "[extensions]"
-       echo "hgext.bookmarks ="
-       echo "hggit ="
-       echo "graphlog ="
-       ) >>"$HOME"/.hgrc &&
-       git config --global receive.denycurrentbranch warn
-       git config --global remote-hg.hg-git-compat true
-       git config --global remote-hg.track-branches false
-
-       HGEDITOR=true
-       HGMERGE=true
-
-       GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0230"
-       GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
-       export HGEDITOR HGMERGE GIT_AUTHOR_DATE GIT_COMMITTER_DATE
-}
-
-setup
-
-test_expect_success 'executable bit' '
-       test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
-       (
-       git init -q gitrepo &&
-       cd gitrepo &&
-       echo alpha >alpha &&
-       chmod 0644 alpha &&
-       git add alpha &&
-       git commit -m "add alpha" &&
-       chmod 0755 alpha &&
-       git add alpha &&
-       git commit -m "set executable bit" &&
-       chmod 0644 alpha &&
-       git add alpha &&
-       git commit -m "clear executable bit"
-       ) &&
-
-       for x in hg git
-       do
-               (
-               hg_clone_$x gitrepo hgrepo-$x &&
-               cd hgrepo-$x &&
-               hg_log . &&
-               hg manifest -r 1 -v &&
-               hg manifest -v
-               ) >"output-$x" &&
-
-               git_clone_$x hgrepo-$x gitrepo2-$x &&
-               git_log gitrepo2-$x >"log-$x"
-       done &&
-
-       test_cmp output-hg output-git &&
-       test_cmp log-hg log-git
-'
-
-test_expect_success 'symlink' '
-       test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
-       (
-       git init -q gitrepo &&
-       cd gitrepo &&
-       echo alpha >alpha &&
-       git add alpha &&
-       git commit -m "add alpha" &&
-       ln -s alpha beta &&
-       git add beta &&
-       git commit -m "add beta"
-       ) &&
-
-       for x in hg git
-       do
-               (
-               hg_clone_$x gitrepo hgrepo-$x &&
-               cd hgrepo-$x &&
-               hg_log . &&
-               hg manifest -v
-               ) >"output-$x" &&
-
-               git_clone_$x hgrepo-$x gitrepo2-$x &&
-               git_log gitrepo2-$x >"log-$x"
-       done &&
-
-       test_cmp output-hg output-git &&
-       test_cmp log-hg log-git
-'
-
-test_expect_success 'merge conflict 1' '
-       test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
-       (
-       hg init hgrepo1 &&
-       cd hgrepo1 &&
-       echo A >afile &&
-       hg add afile &&
-       hg ci -m "origin" &&
-
-       echo B >afile &&
-       hg ci -m "A->B" &&
-
-       hg up -r0 &&
-       echo C >afile &&
-       hg ci -m "A->C" &&
-
-       hg merge -r1 &&
-       echo C >afile &&
-       hg resolve -m afile &&
-       hg ci -m "merge to C"
-       ) &&
-
-       for x in hg git
-       do
-               git_clone_$x hgrepo1 gitrepo-$x &&
-               hg_clone_$x gitrepo-$x hgrepo2-$x &&
-               hg_log hgrepo2-$x >"hg-log-$x" &&
-               git_log gitrepo-$x >"git-log-$x"
-       done &&
-
-       test_cmp hg-log-hg hg-log-git &&
-       test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'merge conflict 2' '
-       test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
-       (
-       hg init hgrepo1 &&
-       cd hgrepo1 &&
-       echo A >afile &&
-       hg add afile &&
-       hg ci -m "origin" &&
-
-       echo B >afile &&
-       hg ci -m "A->B" &&
-
-       hg up -r0 &&
-       echo C >afile &&
-       hg ci -m "A->C" &&
-
-       hg merge -r1 || true &&
-       echo B >afile &&
-       hg resolve -m afile &&
-       hg ci -m "merge to B"
-       ) &&
-
-       for x in hg git
-       do
-               git_clone_$x hgrepo1 gitrepo-$x &&
-               hg_clone_$x gitrepo-$x hgrepo2-$x &&
-               hg_log hgrepo2-$x >"hg-log-$x" &&
-               git_log gitrepo-$x >"git-log-$x"
-       done &&
-
-       test_cmp hg-log-hg hg-log-git &&
-       test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'converged merge' '
-       test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
-       (
-       hg init hgrepo1 &&
-       cd hgrepo1 &&
-       echo A >afile &&
-       hg add afile &&
-       hg ci -m "origin" &&
-
-       echo B >afile &&
-       hg ci -m "A->B" &&
-
-       echo C >afile &&
-       hg ci -m "B->C" &&
-
-       hg up -r0 &&
-       echo C >afile &&
-       hg ci -m "A->C" &&
-
-       hg merge -r2 || true &&
-       hg ci -m "merge"
-       ) &&
-
-       for x in hg git
-       do
-               git_clone_$x hgrepo1 gitrepo-$x &&
-               hg_clone_$x gitrepo-$x hgrepo2-$x &&
-               hg_log hgrepo2-$x >"hg-log-$x" &&
-               git_log gitrepo-$x >"git-log-$x"
-       done &&
-
-       test_cmp hg-log-hg hg-log-git &&
-       test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'encoding' '
-       test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
-       (
-       git init -q gitrepo &&
-       cd gitrepo &&
-
-       echo alpha >alpha &&
-       git add alpha &&
-       git commit -m "add älphà" &&
-
-       GIT_AUTHOR_NAME="tést èncödîng" &&
-       export GIT_AUTHOR_NAME &&
-       echo beta >beta &&
-       git add beta &&
-       git commit -m "add beta" &&
-
-       echo gamma >gamma &&
-       git add gamma &&
-       git commit -m "add gämmâ" &&
-
-       : TODO git config i18n.commitencoding latin-1 &&
-       echo delta >delta &&
-       git add delta &&
-       git commit -m "add déltà"
-       ) &&
-
-       for x in hg git
-       do
-               hg_clone_$x gitrepo hgrepo-$x &&
-               git_clone_$x hgrepo-$x gitrepo2-$x &&
-
-               HGENCODING=utf-8 hg_log hgrepo-$x >"hg-log-$x" &&
-               git_log gitrepo2-$x >"git-log-$x"
-       done &&
-
-       test_cmp hg-log-hg hg-log-git &&
-       test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'file removal' '
-       test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
-       (
-       git init -q gitrepo &&
-       cd gitrepo &&
-       echo alpha >alpha &&
-       git add alpha &&
-       git commit -m "add alpha" &&
-       echo beta >beta &&
-       git add beta &&
-       git commit -m "add beta"
-       mkdir foo &&
-       echo blah >foo/bar &&
-       git add foo &&
-       git commit -m "add foo" &&
-       git rm alpha &&
-       git commit -m "remove alpha" &&
-       git rm foo/bar &&
-       git commit -m "remove foo/bar"
-       ) &&
-
-       for x in hg git
-       do
-               (
-               hg_clone_$x gitrepo hgrepo-$x &&
-               cd hgrepo-$x &&
-               hg_log . &&
-               hg manifest -r 3 &&
-               hg manifest
-               ) >"output-$x" &&
-
-               git_clone_$x hgrepo-$x gitrepo2-$x &&
-               git_log gitrepo2-$x >"log-$x"
-       done &&
-
-       test_cmp output-hg output-git &&
-       test_cmp log-hg log-git
-'
-
-test_expect_success 'git tags' '
-       test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
-       (
-       git init -q gitrepo &&
-       cd gitrepo &&
-       git config receive.denyCurrentBranch ignore &&
-       echo alpha >alpha &&
-       git add alpha &&
-       git commit -m "add alpha" &&
-       git tag alpha &&
-
-       echo beta >beta &&
-       git add beta &&
-       git commit -m "add beta" &&
-       git tag -a -m "added tag beta" beta
-       ) &&
-
-       for x in hg git
-       do
-               hg_clone_$x gitrepo hgrepo-$x &&
-               hg_log hgrepo-$x >"log-$x"
-       done &&
-
-       test_cmp log-hg log-git
-'
-
-test_expect_success 'hg author' '
-       test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
-       for x in hg git
-       do
-               (
-               git init -q gitrepo-$x &&
-               cd gitrepo-$x &&
-
-               echo alpha >alpha &&
-               git add alpha &&
-               git commit -m "add alpha" &&
-               git checkout -q -b not-master
-               ) &&
-
-               (
-               hg_clone_$x gitrepo-$x hgrepo-$x &&
-               cd hgrepo-$x &&
-
-               hg co master &&
-               echo beta >beta &&
-               hg add beta &&
-               hg commit -u "test" -m "add beta" &&
-
-               echo gamma >>beta &&
-               hg commit -u "test <test@example.com> (comment)" -m "modify beta" &&
-
-               echo gamma >gamma &&
-               hg add gamma &&
-               hg commit -u "<test@example.com>" -m "add gamma" &&
-
-               echo delta >delta &&
-               hg add delta &&
-               hg commit -u "name<test@example.com>" -m "add delta" &&
-
-               echo epsilon >epsilon &&
-               hg add epsilon &&
-               hg commit -u "name <test@example.com" -m "add epsilon" &&
-
-               echo zeta >zeta &&
-               hg add zeta &&
-               hg commit -u " test " -m "add zeta" &&
-
-               echo eta >eta &&
-               hg add eta &&
-               hg commit -u "test < test@example.com >" -m "add eta" &&
-
-               echo theta >theta &&
-               hg add theta &&
-               hg commit -u "test >test@example.com>" -m "add theta" &&
-
-               echo iota >iota &&
-               hg add iota &&
-               hg commit -u "test <test <at> example <dot> com>" -m "add iota"
-               ) &&
-
-               hg_push_$x hgrepo-$x gitrepo-$x &&
-               hg_clone_$x gitrepo-$x hgrepo2-$x &&
-
-               hg_log hgrepo2-$x >"hg-log-$x" &&
-               git_log gitrepo-$x >"git-log-$x"
-       done &&
-
-       test_cmp hg-log-hg hg-log-git &&
-       test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'hg branch' '
-       test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
-       for x in hg git
-       do
-               (
-               git init -q gitrepo-$x &&
-               cd gitrepo-$x &&
-
-               echo alpha >alpha &&
-               git add alpha &&
-               git commit -q -m "add alpha" &&
-               git checkout -q -b not-master
-               ) &&
-
-               (
-               hg_clone_$x gitrepo-$x hgrepo-$x &&
-
-               cd hgrepo-$x &&
-               hg -q co master &&
-               hg mv alpha beta &&
-               hg -q commit -m "rename alpha to beta" &&
-               hg branch gamma | grep -v "permanent and global" &&
-               hg -q commit -m "started branch gamma"
-               ) &&
-
-               hg_push_$x hgrepo-$x gitrepo-$x &&
-               hg_clone_$x gitrepo-$x hgrepo2-$x &&
-
-               hg_log hgrepo2-$x >"hg-log-$x" &&
-               git_log gitrepo-$x >"git-log-$x"
-       done &&
-
-       test_cmp hg-log-hg hg-log-git &&
-       test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'hg tags' '
-       test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
-       for x in hg git
-       do
-               (
-               git init -q gitrepo-$x &&
-               cd gitrepo-$x &&
-
-               echo alpha >alpha &&
-               git add alpha &&
-               git commit -m "add alpha" &&
-               git checkout -q -b not-master
-               ) &&
-
-               (
-               hg_clone_$x gitrepo-$x hgrepo-$x &&
-
-               cd hgrepo-$x &&
-               hg co master &&
-               hg tag alpha
-               ) &&
-
-               hg_push_$x hgrepo-$x gitrepo-$x &&
-               hg_clone_$x gitrepo-$x hgrepo2-$x &&
-
-               (
-               git --git-dir=gitrepo-$x/.git tag -l &&
-               hg_log hgrepo2-$x &&
-               cat hgrepo2-$x/.hgtags
-               ) >"output-$x"
-       done &&
-
-       test_cmp output-hg output-git
-'
-
-test_done
diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh
deleted file mode 100755 (executable)
index a933b1e..0000000
+++ /dev/null
@@ -1,775 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-# Base commands from hg-git tests:
-# https://bitbucket.org/durin42/hg-git/src
-#
-
-test_description='Test remote-hg'
-
-test -n "$TEST_DIRECTORY" || TEST_DIRECTORY=${0%/*}/../../t
-. "$TEST_DIRECTORY"/test-lib.sh
-
-if ! test_have_prereq PYTHON
-then
-       skip_all='skipping remote-hg tests; python not available'
-       test_done
-fi
-
-if ! python -c 'import mercurial'
-then
-       skip_all='skipping remote-hg tests; mercurial not available'
-       test_done
-fi
-
-check () {
-       echo $3 >expected &&
-       git --git-dir=$1/.git log --format='%s' -1 $2 >actual
-       test_cmp expected actual
-}
-
-check_branch () {
-       if test -n "$3"
-       then
-               echo $3 >expected &&
-               hg -R $1 log -r $2 --template '{desc}\n' >actual &&
-               test_cmp expected actual
-       else
-               hg -R $1 branches >out &&
-               ! grep $2 out
-       fi
-}
-
-check_bookmark () {
-       if test -n "$3"
-       then
-               echo $3 >expected &&
-               hg -R $1 log -r "bookmark('$2')" --template '{desc}\n' >actual &&
-               test_cmp expected actual
-       else
-               hg -R $1 bookmarks >out &&
-               ! grep $2 out
-       fi
-}
-
-check_push () {
-       expected_ret=$1 ret=0 ref_ret=0
-
-       shift
-       git push origin "$@" 2>error
-       ret=$?
-       cat error
-
-       while IFS=':' read branch kind
-       do
-               case "$kind" in
-               'new')
-                       grep "^ \* \[new branch\] *${branch} -> ${branch}$" error || ref_ret=1
-                       ;;
-               'non-fast-forward')
-                       grep "^ ! \[rejected\] *${branch} -> ${branch} (non-fast-forward)$" error || ref_ret=1
-                       ;;
-               'fetch-first')
-                       grep "^ ! \[rejected\] *${branch} -> ${branch} (fetch first)$" error || ref_ret=1
-                       ;;
-               'forced-update')
-                       grep "^ + [a-f0-9]*\.\.\.[a-f0-9]* *${branch} -> ${branch} (forced update)$" error || ref_ret=1
-                       ;;
-               '')
-                       grep "^   [a-f0-9]*\.\.[a-f0-9]* *${branch} -> ${branch}$" error || ref_ret=1
-                       ;;
-               esac
-               test $ref_ret -ne 0 && echo "match for '$branch' failed" && break
-       done
-
-       if test $expected_ret -ne $ret || test $ref_ret -ne 0
-       then
-               return 1
-       fi
-
-       return 0
-}
-
-setup () {
-       (
-       echo "[ui]"
-       echo "username = H G Wells <wells@example.com>"
-       echo "[extensions]"
-       echo "mq ="
-       ) >>"$HOME"/.hgrc &&
-
-       GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0230" &&
-       GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE" &&
-       export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
-}
-
-setup
-
-test_expect_success 'cloning' '
-       test_when_finished "rm -rf gitrepo*" &&
-
-       (
-       hg init hgrepo &&
-       cd hgrepo &&
-       echo zero >content &&
-       hg add content &&
-       hg commit -m zero
-       ) &&
-
-       git clone "hg::hgrepo" gitrepo &&
-       check gitrepo HEAD zero
-'
-
-test_expect_success 'cloning with branches' '
-       test_when_finished "rm -rf gitrepo*" &&
-
-       (
-       cd hgrepo &&
-       hg branch next &&
-       echo next >content &&
-       hg commit -m next
-       ) &&
-
-       git clone "hg::hgrepo" gitrepo &&
-       check gitrepo origin/branches/next next
-'
-
-test_expect_success 'cloning with bookmarks' '
-       test_when_finished "rm -rf gitrepo*" &&
-
-       (
-       cd hgrepo &&
-       hg checkout default &&
-       hg bookmark feature-a &&
-       echo feature-a >content &&
-       hg commit -m feature-a
-       ) &&
-
-       git clone "hg::hgrepo" gitrepo &&
-       check gitrepo origin/feature-a feature-a
-'
-
-test_expect_success 'update bookmark' '
-       test_when_finished "rm -rf gitrepo*" &&
-
-       (
-       cd hgrepo &&
-       hg bookmark devel
-       ) &&
-
-       (
-       git clone "hg::hgrepo" gitrepo &&
-       cd gitrepo &&
-       git checkout --quiet devel &&
-       echo devel >content &&
-       git commit -a -m devel &&
-       git push --quiet
-       ) &&
-
-       check_bookmark hgrepo devel devel
-'
-
-test_expect_success 'new bookmark' '
-       test_when_finished "rm -rf gitrepo*" &&
-
-       (
-       git clone "hg::hgrepo" gitrepo &&
-       cd gitrepo &&
-       git checkout --quiet -b feature-b &&
-       echo feature-b >content &&
-       git commit -a -m feature-b &&
-       git push --quiet origin feature-b
-       ) &&
-
-       check_bookmark hgrepo feature-b feature-b
-'
-
-# cleanup previous stuff
-rm -rf hgrepo
-
-author_test () {
-       echo $1 >>content &&
-       hg commit -u "$2" -m "add $1" &&
-       echo "$3" >>../expected
-}
-
-test_expect_success 'authors' '
-       test_when_finished "rm -rf hgrepo gitrepo" &&
-
-       (
-       hg init hgrepo &&
-       cd hgrepo &&
-
-       touch content &&
-       hg add content &&
-
-       >../expected &&
-       author_test alpha "" "H G Wells <wells@example.com>" &&
-       author_test beta "beta" "beta <unknown>" &&
-       author_test gamma "gamma <test@example.com> (comment)" "gamma <test@example.com>" &&
-       author_test delta "<delta@example.com>" "Unknown <delta@example.com>" &&
-       author_test epsilon "epsilon<test@example.com>" "epsilon <test@example.com>" &&
-       author_test zeta "zeta <test@example.com" "zeta <test@example.com>" &&
-       author_test eta " eta " "eta <unknown>" &&
-       author_test theta "theta < test@example.com >" "theta <test@example.com>" &&
-       author_test iota "iota >test@example.com>" "iota <test@example.com>" &&
-       author_test kappa "kappa < test <at> example <dot> com>" "kappa <unknown>" &&
-       author_test lambda "lambda@example.com" "Unknown <lambda@example.com>" &&
-       author_test mu "mu.mu@example.com" "Unknown <mu.mu@example.com>"
-       ) &&
-
-       git clone "hg::hgrepo" gitrepo &&
-       git --git-dir=gitrepo/.git log --reverse --format="%an <%ae>" >actual &&
-
-       test_cmp expected actual
-'
-
-test_expect_success 'strip' '
-       test_when_finished "rm -rf hgrepo gitrepo" &&
-
-       (
-       hg init hgrepo &&
-       cd hgrepo &&
-
-       echo one >>content &&
-       hg add content &&
-       hg commit -m one &&
-
-       echo two >>content &&
-       hg commit -m two
-       ) &&
-
-       git clone "hg::hgrepo" gitrepo &&
-
-       (
-       cd hgrepo &&
-       hg strip 1 &&
-
-       echo three >>content &&
-       hg commit -m three &&
-
-       echo four >>content &&
-       hg commit -m four
-       ) &&
-
-       (
-       cd gitrepo &&
-       git fetch &&
-       git log --format="%s" origin/master >../actual
-       ) &&
-
-       hg -R hgrepo log --template "{desc}\n" >expected &&
-       test_cmp actual expected
-'
-
-test_expect_success 'remote push with master bookmark' '
-       test_when_finished "rm -rf hgrepo gitrepo*" &&
-
-       (
-       hg init hgrepo &&
-       cd hgrepo &&
-       echo zero >content &&
-       hg add content &&
-       hg commit -m zero &&
-       hg bookmark master &&
-       echo one >content &&
-       hg commit -m one
-       ) &&
-
-       (
-       git clone "hg::hgrepo" gitrepo &&
-       cd gitrepo &&
-       echo two >content &&
-       git commit -a -m two &&
-       git push
-       ) &&
-
-       check_branch hgrepo default two
-'
-
-cat >expected <<\EOF
-changeset:   0:6e2126489d3d
-tag:         tip
-user:        A U Thor <author@example.com>
-date:        Mon Jan 01 00:00:00 2007 +0230
-summary:     one
-
-EOF
-
-test_expect_success 'remote push from master branch' '
-       test_when_finished "rm -rf hgrepo gitrepo*" &&
-
-       hg init hgrepo &&
-
-       (
-       git init gitrepo &&
-       cd gitrepo &&
-       git remote add origin "hg::../hgrepo" &&
-       echo one >content &&
-       git add content &&
-       git commit -a -m one &&
-       git push origin master
-       ) &&
-
-       hg -R hgrepo log >actual &&
-       cat actual &&
-       test_cmp expected actual &&
-
-       check_branch hgrepo default one
-'
-
-GIT_REMOTE_HG_TEST_REMOTE=1
-export GIT_REMOTE_HG_TEST_REMOTE
-
-test_expect_success 'remote cloning' '
-       test_when_finished "rm -rf gitrepo*" &&
-
-       (
-       hg init hgrepo &&
-       cd hgrepo &&
-       echo zero >content &&
-       hg add content &&
-       hg commit -m zero
-       ) &&
-
-       git clone "hg::hgrepo" gitrepo &&
-       check gitrepo HEAD zero
-'
-
-test_expect_success 'moving remote clone' '
-       test_when_finished "rm -rf gitrepo*" &&
-
-       (
-       git clone "hg::hgrepo" gitrepo &&
-       mv gitrepo gitrepo2 &&
-       cd gitrepo2 &&
-       git fetch
-       )
-'
-
-test_expect_success 'remote update bookmark' '
-       test_when_finished "rm -rf gitrepo*" &&
-
-       (
-       cd hgrepo &&
-       hg bookmark devel
-       ) &&
-
-       (
-       git clone "hg::hgrepo" gitrepo &&
-       cd gitrepo &&
-       git checkout --quiet devel &&
-       echo devel >content &&
-       git commit -a -m devel &&
-       git push --quiet
-       ) &&
-
-       check_bookmark hgrepo devel devel
-'
-
-test_expect_success 'remote new bookmark' '
-       test_when_finished "rm -rf gitrepo*" &&
-
-       (
-       git clone "hg::hgrepo" gitrepo &&
-       cd gitrepo &&
-       git checkout --quiet -b feature-b &&
-       echo feature-b >content &&
-       git commit -a -m feature-b &&
-       git push --quiet origin feature-b
-       ) &&
-
-       check_bookmark hgrepo feature-b feature-b
-'
-
-test_expect_success 'remote push diverged' '
-       test_when_finished "rm -rf gitrepo*" &&
-
-       git clone "hg::hgrepo" gitrepo &&
-
-       (
-       cd hgrepo &&
-       hg checkout default &&
-       echo bump >content &&
-       hg commit -m bump
-       ) &&
-
-       (
-       cd gitrepo &&
-       echo diverge >content &&
-       git commit -a -m diverged &&
-       check_push 1 <<-\EOF
-       master:non-fast-forward
-       EOF
-       ) &&
-
-       check_branch hgrepo default bump
-'
-
-test_expect_success 'remote update bookmark diverge' '
-       test_when_finished "rm -rf gitrepo*" &&
-
-       (
-       cd hgrepo &&
-       hg checkout tip^ &&
-       hg bookmark diverge
-       ) &&
-
-       git clone "hg::hgrepo" gitrepo &&
-
-       (
-       cd hgrepo &&
-       echo "bump bookmark" >content &&
-       hg commit -m "bump bookmark"
-       ) &&
-
-       (
-       cd gitrepo &&
-       git checkout --quiet diverge &&
-       echo diverge >content &&
-       git commit -a -m diverge &&
-       check_push 1 <<-\EOF
-       diverge:fetch-first
-       EOF
-       ) &&
-
-       check_bookmark hgrepo diverge "bump bookmark"
-'
-
-test_expect_success 'remote new bookmark multiple branch head' '
-       test_when_finished "rm -rf gitrepo*" &&
-
-       (
-       git clone "hg::hgrepo" gitrepo &&
-       cd gitrepo &&
-       git checkout --quiet -b feature-c HEAD^ &&
-       echo feature-c >content &&
-       git commit -a -m feature-c &&
-       git push --quiet origin feature-c
-       ) &&
-
-       check_bookmark hgrepo feature-c feature-c
-'
-
-# cleanup previous stuff
-rm -rf hgrepo
-
-test_expect_success 'fetch special filenames' '
-       test_when_finished "rm -rf hgrepo gitrepo && LC_ALL=C" &&
-
-       LC_ALL=en_US.UTF-8
-       export LC_ALL
-
-       (
-       hg init hgrepo &&
-       cd hgrepo &&
-
-       echo test >> "æ rø" &&
-       hg add "æ rø" &&
-       echo test >> "ø~?" &&
-       hg add "ø~?" &&
-       hg commit -m add-utf-8 &&
-       echo test >> "æ rø" &&
-       hg commit -m test-utf-8 &&
-       hg rm "ø~?" &&
-       hg mv "æ rø" "ø~?" &&
-       hg commit -m hg-mv-utf-8
-       ) &&
-
-       (
-       git clone "hg::hgrepo" gitrepo &&
-       cd gitrepo &&
-       git -c core.quotepath=false ls-files > ../actual
-       ) &&
-       echo "ø~?" > expected &&
-       test_cmp expected actual
-'
-
-test_expect_success 'push special filenames' '
-       test_when_finished "rm -rf hgrepo gitrepo && LC_ALL=C" &&
-
-       mkdir -p tmp && cd tmp &&
-
-       LC_ALL=en_US.UTF-8
-       export LC_ALL
-
-       (
-       hg init hgrepo &&
-       cd hgrepo &&
-
-       echo one >> content &&
-       hg add content &&
-       hg commit -m one
-       ) &&
-
-       (
-       git clone "hg::hgrepo" gitrepo &&
-       cd gitrepo &&
-
-       echo test >> "æ rø" &&
-       git add "æ rø" &&
-       git commit -m utf-8 &&
-
-       git push
-       ) &&
-
-       (cd hgrepo &&
-       hg update &&
-       hg manifest > ../actual
-       ) &&
-
-       printf "content\næ rø\n" > expected &&
-       test_cmp expected actual
-'
-
-setup_big_push () {
-       (
-       hg init hgrepo &&
-       cd hgrepo &&
-       echo zero >content &&
-       hg add content &&
-       hg commit -m zero &&
-       hg bookmark bad_bmark1 &&
-       echo one >content &&
-       hg commit -m one &&
-       hg bookmark bad_bmark2 &&
-       hg bookmark good_bmark &&
-       hg bookmark -i good_bmark &&
-       hg -q branch good_branch &&
-       echo "good branch" >content &&
-       hg commit -m "good branch" &&
-       hg -q branch bad_branch &&
-       echo "bad branch" >content &&
-       hg commit -m "bad branch"
-       ) &&
-
-       git clone "hg::hgrepo" gitrepo &&
-
-       (
-       cd gitrepo &&
-       echo two >content &&
-       git commit -q -a -m two &&
-
-       git checkout -q good_bmark &&
-       echo three >content &&
-       git commit -q -a -m three &&
-
-       git checkout -q bad_bmark1 &&
-       git reset --hard HEAD^ &&
-       echo four >content &&
-       git commit -q -a -m four &&
-
-       git checkout -q bad_bmark2 &&
-       git reset --hard HEAD^ &&
-       echo five >content &&
-       git commit -q -a -m five &&
-
-       git checkout -q -b new_bmark master &&
-       echo six >content &&
-       git commit -q -a -m six &&
-
-       git checkout -q branches/good_branch &&
-       echo seven >content &&
-       git commit -q -a -m seven &&
-       echo eight >content &&
-       git commit -q -a -m eight &&
-
-       git checkout -q branches/bad_branch &&
-       git reset --hard HEAD^ &&
-       echo nine >content &&
-       git commit -q -a -m nine &&
-
-       git checkout -q -b branches/new_branch master &&
-       echo ten >content &&
-       git commit -q -a -m ten
-       )
-}
-
-test_expect_success 'remote big push' '
-       test_when_finished "rm -rf hgrepo gitrepo*" &&
-
-       setup_big_push
-
-       (
-       cd gitrepo &&
-
-       check_push 1 --all <<-\EOF
-       master
-       good_bmark
-       branches/good_branch
-       new_bmark:new
-       branches/new_branch:new
-       bad_bmark1:non-fast-forward
-       bad_bmark2:non-fast-forward
-       branches/bad_branch:non-fast-forward
-       EOF
-       ) &&
-
-       check_branch hgrepo default one &&
-       check_branch hgrepo good_branch "good branch" &&
-       check_branch hgrepo bad_branch "bad branch" &&
-       check_branch hgrepo new_branch '' &&
-       check_bookmark hgrepo good_bmark one &&
-       check_bookmark hgrepo bad_bmark1 one &&
-       check_bookmark hgrepo bad_bmark2 one &&
-       check_bookmark hgrepo new_bmark ''
-'
-
-test_expect_success 'remote big push fetch first' '
-       test_when_finished "rm -rf hgrepo gitrepo*" &&
-
-       (
-       hg init hgrepo &&
-       cd hgrepo &&
-       echo zero >content &&
-       hg add content &&
-       hg commit -m zero &&
-       hg bookmark bad_bmark &&
-       hg bookmark good_bmark &&
-       hg bookmark -i good_bmark &&
-       hg -q branch good_branch &&
-       echo "good branch" >content &&
-       hg commit -m "good branch" &&
-       hg -q branch bad_branch &&
-       echo "bad branch" >content &&
-       hg commit -m "bad branch"
-       ) &&
-
-       git clone "hg::hgrepo" gitrepo &&
-
-       (
-       cd hgrepo &&
-       hg bookmark -f bad_bmark &&
-       echo update_bmark >content &&
-       hg commit -m "update bmark"
-       ) &&
-
-       (
-       cd gitrepo &&
-       echo two >content &&
-       git commit -q -a -m two &&
-
-       git checkout -q good_bmark &&
-       echo three >content &&
-       git commit -q -a -m three &&
-
-       git checkout -q bad_bmark &&
-       echo four >content &&
-       git commit -q -a -m four &&
-
-       git checkout -q branches/bad_branch &&
-       echo five >content &&
-       git commit -q -a -m five &&
-
-       check_push 1 --all <<-\EOF &&
-       master
-       good_bmark
-       bad_bmark:fetch-first
-       branches/bad_branch:festch-first
-       EOF
-
-       git fetch &&
-
-       check_push 1 --all <<-\EOF
-       master
-       good_bmark
-       bad_bmark:non-fast-forward
-       branches/bad_branch:non-fast-forward
-       EOF
-       )
-'
-
-test_expect_success 'remote big push force' '
-       test_when_finished "rm -rf hgrepo gitrepo*" &&
-
-       setup_big_push
-
-       (
-       cd gitrepo &&
-
-       check_push 0 --force --all <<-\EOF
-       master
-       good_bmark
-       branches/good_branch
-       new_bmark:new
-       branches/new_branch:new
-       bad_bmark1:forced-update
-       bad_bmark2:forced-update
-       branches/bad_branch:forced-update
-       EOF
-       ) &&
-
-       check_branch hgrepo default six &&
-       check_branch hgrepo good_branch eight &&
-       check_branch hgrepo bad_branch nine &&
-       check_branch hgrepo new_branch ten &&
-       check_bookmark hgrepo good_bmark three &&
-       check_bookmark hgrepo bad_bmark1 four &&
-       check_bookmark hgrepo bad_bmark2 five &&
-       check_bookmark hgrepo new_bmark six
-'
-
-test_expect_success 'remote big push dry-run' '
-       test_when_finished "rm -rf hgrepo gitrepo*" &&
-
-       setup_big_push
-
-       (
-       cd gitrepo &&
-
-       check_push 1 --dry-run --all <<-\EOF &&
-       master
-       good_bmark
-       branches/good_branch
-       new_bmark:new
-       branches/new_branch:new
-       bad_bmark1:non-fast-forward
-       bad_bmark2:non-fast-forward
-       branches/bad_branch:non-fast-forward
-       EOF
-
-       check_push 0 --dry-run master good_bmark new_bmark branches/good_branch branches/new_branch <<-\EOF
-       master
-       good_bmark
-       branches/good_branch
-       new_bmark:new
-       branches/new_branch:new
-       EOF
-       ) &&
-
-       check_branch hgrepo default one &&
-       check_branch hgrepo good_branch "good branch" &&
-       check_branch hgrepo bad_branch "bad branch" &&
-       check_branch hgrepo new_branch '' &&
-       check_bookmark hgrepo good_bmark one &&
-       check_bookmark hgrepo bad_bmark1 one &&
-       check_bookmark hgrepo bad_bmark2 one &&
-       check_bookmark hgrepo new_bmark ''
-'
-
-test_expect_success 'remote double failed push' '
-       test_when_finished "rm -rf hgrepo gitrepo*" &&
-
-       (
-       hg init hgrepo &&
-       cd hgrepo &&
-       echo zero >content &&
-       hg add content &&
-       hg commit -m zero &&
-       echo one >content &&
-       hg commit -m one
-       ) &&
-
-       (
-       git clone "hg::hgrepo" gitrepo &&
-       cd gitrepo &&
-       git reset --hard HEAD^ &&
-       echo two >content &&
-       git commit -a -m two &&
-       test_expect_code 1 git push &&
-       test_expect_code 1 git push
-       )
-'
-
-test_done
index 4030a168986d29bdbb2cd982a2e819ce009580f6..d888d4516114c719e46ab7f2aeb24e63618b7fac 100644 (file)
@@ -3,17 +3,23 @@
 
 prefix ?= /usr/local
 mandir ?= $(prefix)/share/man
-libexecdir ?= $(prefix)/libexec/git-core
-gitdir ?= $(shell git --exec-path)
+gitexecdir ?= $(prefix)/libexec/git-core
 man1dir ?= $(mandir)/man1
 
-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 = asciidoc
+XMLTO    = xmlto
 
-ASCIIDOC_CONF      = ../../Documentation/asciidoc.conf
-MANPAGE_NORMAL_XSL =  ../../Documentation/manpage-normal.xsl
+ASCIIDOC_CONF = ../../Documentation/asciidoc.conf
+MANPAGE_XSL   = ../../Documentation/manpage-normal.xsl
 
 GIT_SUBTREE_SH := git-subtree.sh
 GIT_SUBTREE    := git-subtree
@@ -31,8 +37,8 @@ $(GIT_SUBTREE): $(GIT_SUBTREE_SH)
 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
 
@@ -41,19 +47,21 @@ install-man: $(GIT_SUBTREE_DOC)
        $(INSTALL) -m 644 $^ $(DESTDIR)$(man1dir)
 
 $(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
index dc59a91031ea6815456e5c86f5494bf56858c0d1..fa1a5839af2d0c423adb51238fb330f555dc4dff 100755 (executable)
@@ -46,6 +46,7 @@ ignore_joins=
 annotate=
 squash=
 message=
+prefix=
 
 debug()
 {
@@ -557,8 +558,9 @@ cmd_add_commit()
                commit=$(add_squashed_msg "$rev" "$dir" |
                         git commit-tree $tree $headp -p "$rev") || exit $?
        else
+               revp=$(peel_committish "$rev") &&
                commit=$(add_msg "$dir" "$headrev" "$rev" |
-                        git commit-tree $tree $headp -p "$rev") || exit $?
+                        git commit-tree $tree $headp -p "$revp") || exit $?
        fi
        git reset "$commit" || exit $?
        
index 66ce4b07c2dc2d2d56dc260883f86d8672d2ac69..6309d124ca2c97b2b1b9262c7b9470c576870069 100755 (executable)
@@ -8,7 +8,8 @@ This test verifies the basic operation of the merge, pull, add
 and split subcommands of git subtree.
 '
 
-export TEST_DIRECTORY=$(pwd)/../../../t
+TEST_DIRECTORY=$(pwd)/../../../t
+export TEST_DIRECTORY
 
 . ../../../t/test-lib.sh
 
@@ -76,7 +77,7 @@ test_expect_success 'add sub1' '
 
 # 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 &&
index 1128ab2ce46c42c5b5c9bf2adb3425ebc2720944..a3425f4770c5cd829b72134080b05aeb1174ff33 100644 (file)
@@ -40,8 +40,8 @@ manual page.
 NOTES
 -----
 Subversion dumps do not record a separate author and committer for
-each revision, nor a separate display name and email address for
-each author.  Like git-svn(1), 'svn-fe' will use the name
+each revision, nor do they record a separate display name and email
+address for each author.  Like git-svn(1), 'svn-fe' will use the name
 
 ---------
 user <user@UUID>
index 4e78a1c3cda15659256c7aa64eb98cab7737c61f..11ac6f692733fbfde96a44cc553002ad748065db 100755 (executable)
@@ -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)
index 5eb4a5164397e3a34be10690025a9cd472261db9..8dc73ece15a075bb60971da577d2da272c8f7c14 100755 (executable)
@@ -10,7 +10,7 @@ CONFFILE=~/.appprc
 
 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 @@ fi
 
 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 @@ if [ "x${BODY}x" != "xx" ] ; then
 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 (file)
index 8f16d06..0000000
+++ /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/date.c b/date.c
index e1a2cee5688a64555d7820e8e02e3e86839c9641..782de95d90c6ac1a02ddfa0df81ca93ecdf910c4 100644 (file)
--- a/date.c
+++ b/date.c
@@ -144,8 +144,8 @@ void show_date_relative(unsigned long time, int tz,
                if (months) {
                        struct strbuf sb = STRBUF_INIT;
                        strbuf_addf(&sb, Q_("%lu year", "%lu years", years), years);
-                       /* TRANSLATORS: "%s" is "<n> years" */
                        strbuf_addf(timebuf,
+                                /* TRANSLATORS: "%s" is "<n> years" */
                                 Q_("%s, %lu month ago", "%s, %lu months ago", months),
                                 sb.buf, months);
                        strbuf_release(&sb);
diff --git a/delta.h b/delta.h
index b9d333dd5a1c64ab35159ed608cf942951504f84..9b67531dfa4e6511d0c7a4d6d400a3d3719603bc 100644 (file)
--- a/delta.h
+++ b/delta.h
@@ -9,7 +9,7 @@ struct delta_index;
  *
  * This returns a pointer to a struct delta_index that should be passed to
  * subsequent create_delta() calls, or to free_delta_index().  A NULL pointer
- * is returned on failure.  The given buffer must not be freed nor altered
+ * is returned on failure.  The given buffer must not be freed or altered
  * before free_delta_index() is called.  The returned pointer must be freed
  * using free_delta_index().
  */
index 8e10bff30e5269687e67866c2d3c66d62e3bb883..265709ba8c51a4390fad11c7d1aa23551a4fd266 100644 (file)
@@ -15,8 +15,9 @@
 #include "log-tree.h"
 #include "builtin.h"
 #include "string-list.h"
+#include "dir.h"
 
-static int read_directory(const char *path, struct string_list *list)
+static int read_directory_contents(const char *path, struct string_list *list)
 {
        DIR *dir;
        struct dirent *e;
@@ -25,7 +26,7 @@ static int read_directory(const char *path, struct string_list *list)
                return error("Could not open directory %s", path);
 
        while ((e = readdir(dir)))
-               if (strcmp(".", e->d_name) && strcmp("..", e->d_name))
+               if (!is_dot_or_dotdot(e->d_name))
                        string_list_insert(list, e->d_name);
 
        closedir(dir);
@@ -107,9 +108,9 @@ static int queue_diff(struct diff_options *o,
                int i1, i2, ret = 0;
                size_t len1 = 0, len2 = 0;
 
-               if (name1 && read_directory(name1, &p1))
+               if (name1 && read_directory_contents(name1, &p1))
                        return -1;
-               if (name2 && read_directory(name2, &p2)) {
+               if (name2 && read_directory_contents(name2, &p2)) {
                        string_list_clear(&p1, 0);
                        return -1;
                }
@@ -197,7 +198,7 @@ void diff_no_index(struct rev_info *revs,
                        i++;
                else {
                        j = diff_opt_parse(&revs->diffopt, argv + i, argc - i);
-                       if (!j)
+                       if (j <= 0)
                                die("invalid diff option/value: %s", argv[i]);
                        i += j;
                }
diff --git a/diff.c b/diff.c
index e343191bdaba0dbf63a841a79287cbb5f56fc18a..f66716fab4b477c58434126b4aaa4b4372ce163a 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -16,6 +16,7 @@
 #include "submodule.h"
 #include "ll-merge.h"
 #include "string-list.h"
+#include "argv-array.h"
 
 #ifdef NO_FAST_WORKING_DIRECTORY
 #define FAST_WORKING_DIRECTORY 0
@@ -1461,20 +1462,12 @@ int print_stat_summary(FILE *fp, int files, int insertions, int deletions)
         * but nothing about added/removed lines? Is this a bug in Git?").
         */
        if (insertions || deletions == 0) {
-               /*
-                * TRANSLATORS: "+" in (+) is a line addition marker;
-                * do not translate it.
-                */
                strbuf_addf(&sb,
                            (insertions == 1) ? ", %d insertion(+)" : ", %d insertions(+)",
                            insertions);
        }
 
        if (deletions || insertions == 0) {
-               /*
-                * TRANSLATORS: "-" in (-) is a line removal marker;
-                * do not translate it.
-                */
                strbuf_addf(&sb,
                            (deletions == 1) ? ", %d deletion(-)" : ", %d deletions(-)",
                            deletions);
@@ -2887,6 +2880,16 @@ static struct diff_tempfile *prepare_temp_file(const char *name,
        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 \
@@ -2902,50 +2905,33 @@ static void run_external_diff(const char *pgm,
                              int complete_rewrite,
                              struct diff_options *o)
 {
-       const char *spawn_arg[10];
-       int retval;
-       const char **arg = &spawn_arg[0];
+       struct argv_array argv = ARGV_ARRAY_INIT;
+       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);
-               *arg++ = pgm;
-               *arg++ = name;
-               *arg++ = temp_one->name;
-               *arg++ = temp_one->hex;
-               *arg++ = temp_one->mode;
-               *arg++ = temp_two->name;
-               *arg++ = temp_two->hex;
-               *arg++ = temp_two->mode;
-               if (other) {
-                       *arg++ = other;
-                       *arg++ = xfrm_msg;
+               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 {
-               *arg++ = pgm;
-               *arg++ = name;
        }
-       *arg = NULL;
-       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);
+
+       if (run_command_v_opt_cd_env(argv.argv, RUN_USING_SHELL, NULL, env.argv))
+               die(_("external diff died, stopping at %s"), name);
 
-       retval = run_command_v_opt_cd_env(spawn_arg, RUN_USING_SHELL, NULL, env);
        remove_tempfile();
-       if (retval) {
-               fprintf(stderr, "external diff died, stopping at %s.\n", name);
-               exit(1);
-       }
+       argv_array_clear(&argv);
+       argv_array_clear(&env);
 }
 
 static int similarity_index(struct diff_filepair *p)
@@ -3213,6 +3199,7 @@ void diff_setup(struct diff_options *options)
        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;
@@ -3927,7 +3914,7 @@ static int diff_scoreopt_parse(const char *opt)
                }
        }
        if (cmd != 'M' && cmd != 'C' && cmd != 'B')
-               return -1; /* that is not a -M, -C nor -B option */
+               return -1; /* that is not a -M, -Cor -B option */
 
        opt1 = parse_rename_score(&opt);
        if (cmd != 'B')
@@ -4757,6 +4744,7 @@ void diffcore_fix_diff_index(struct diff_options *options)
 
 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) {
diff --git a/diff.h b/diff.h
index a24a767db78d8e864175cf342f03fc48e159e06e..b4a624d235748bf13be44e7479f086880dcf574f 100644 (file)
--- a/diff.h
+++ b/diff.h
@@ -15,6 +15,10 @@ struct diff_filespec;
 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 @@ struct diff_options {
        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 @@ const char *diff_line_prefix(struct diff_options *);
 
 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,
index 401eb72c619d432c92fc66b470fae778117bcace..185f86b2840d3337eac9fb2b17b260ca0c53fbab 100644 (file)
@@ -12,47 +12,6 @@ typedef int (*pickaxe_fn)(mmfile_t *one, mmfile_t *two,
                          struct diff_options *o,
                          regex_t *regexp, kwset_t kws);
 
-static int pickaxe_match(struct diff_filepair *p, struct diff_options *o,
-                        regex_t *regexp, kwset_t kws, pickaxe_fn fn);
-
-static void pickaxe(struct diff_queue_struct *q, struct diff_options *o,
-                   regex_t *regexp, kwset_t kws, pickaxe_fn fn)
-{
-       int i;
-       struct diff_queue_struct outq;
-
-       DIFF_QUEUE_CLEAR(&outq);
-
-       if (o->pickaxe_opts & DIFF_PICKAXE_ALL) {
-               /* Showing the whole changeset if needle exists */
-               for (i = 0; i < q->nr; i++) {
-                       struct diff_filepair *p = q->queue[i];
-                       if (pickaxe_match(p, o, regexp, kws, fn))
-                               return; /* do not munge the queue */
-               }
-
-               /*
-                * Otherwise we will clear the whole queue by copying
-                * the empty outq at the end of this function, but
-                * first clear the current entries in the queue.
-                */
-               for (i = 0; i < q->nr; i++)
-                       diff_free_filepair(q->queue[i]);
-       } else {
-               /* Showing only the filepairs that has the needle */
-               for (i = 0; i < q->nr; i++) {
-                       struct diff_filepair *p = q->queue[i];
-                       if (pickaxe_match(p, o, regexp, kws, fn))
-                               diff_q(&outq, p);
-                       else
-                               diff_free_filepair(p);
-               }
-       }
-
-       free(q->queue);
-       *q = outq;
-}
-
 struct diffgrep_cb {
        regex_t *regexp;
        int hit;
@@ -108,29 +67,6 @@ static int diff_grep(mmfile_t *one, mmfile_t *two,
        return ecbdata.hit;
 }
 
-static void diffcore_pickaxe_grep(struct diff_options *o)
-{
-       int err;
-       regex_t regex;
-       int cflags = REG_EXTENDED | REG_NEWLINE;
-
-       if (DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE))
-               cflags |= REG_ICASE;
-
-       err = regcomp(&regex, o->pickaxe, cflags);
-       if (err) {
-               char errbuf[1024];
-               regerror(err, &regex, errbuf, 1024);
-               regfree(&regex);
-               die("invalid regex: %s", errbuf);
-       }
-
-       pickaxe(&diff_queued_diff, o, &regex, NULL, diff_grep);
-
-       regfree(&regex);
-       return;
-}
-
 static unsigned int contains(mmfile_t *mf, regex_t *regexp, kwset_t kws)
 {
        unsigned int cnt;
@@ -158,13 +94,10 @@ static unsigned int contains(mmfile_t *mf, regex_t *regexp, kwset_t kws)
                while (sz) {
                        struct kwsmatch kwsm;
                        size_t offset = kwsexec(kws, data, sz, &kwsm);
-                       const char *found;
                        if (offset == -1)
                                break;
-                       else
-                               found = data + offset;
-                       sz -= found - data + kwsm.size[0];
-                       data = found + kwsm.size[0];
+                       sz -= offset + kwsm.size[0];
+                       data += offset + kwsm.size[0];
                        cnt++;
                }
        }
@@ -227,17 +160,57 @@ static int pickaxe_match(struct diff_filepair *p, struct diff_options *o,
        return ret;
 }
 
-static void diffcore_pickaxe_count(struct diff_options *o)
+static void pickaxe(struct diff_queue_struct *q, struct diff_options *o,
+                   regex_t *regexp, kwset_t kws, pickaxe_fn fn)
+{
+       int i;
+       struct diff_queue_struct outq;
+
+       DIFF_QUEUE_CLEAR(&outq);
+
+       if (o->pickaxe_opts & DIFF_PICKAXE_ALL) {
+               /* Showing the whole changeset if needle exists */
+               for (i = 0; i < q->nr; i++) {
+                       struct diff_filepair *p = q->queue[i];
+                       if (pickaxe_match(p, o, regexp, kws, fn))
+                               return; /* do not munge the queue */
+               }
+
+               /*
+                * Otherwise we will clear the whole queue by copying
+                * the empty outq at the end of this function, but
+                * first clear the current entries in the queue.
+                */
+               for (i = 0; i < q->nr; i++)
+                       diff_free_filepair(q->queue[i]);
+       } else {
+               /* Showing only the filepairs that has the needle */
+               for (i = 0; i < q->nr; i++) {
+                       struct diff_filepair *p = q->queue[i];
+                       if (pickaxe_match(p, o, regexp, kws, fn))
+                               diff_q(&outq, p);
+                       else
+                               diff_free_filepair(p);
+               }
+       }
+
+       free(q->queue);
+       *q = outq;
+}
+
+void diffcore_pickaxe(struct diff_options *o)
 {
        const char *needle = o->pickaxe;
        int opts = o->pickaxe_opts;
-       unsigned long len = strlen(needle);
        regex_t regex, *regexp = NULL;
        kwset_t kws = NULL;
 
-       if (opts & DIFF_PICKAXE_REGEX) {
+       if (opts & (DIFF_PICKAXE_REGEX | DIFF_PICKAXE_KIND_G)) {
                int err;
-               err = regcomp(&regex, needle, REG_EXTENDED | REG_NEWLINE);
+               int cflags = REG_EXTENDED | REG_NEWLINE;
+               if (DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE))
+                       cflags |= REG_ICASE;
+               err = regcomp(&regex, needle, cflags);
                if (err) {
                        /* The POSIX.2 people are surely sick */
                        char errbuf[1024];
@@ -249,24 +222,17 @@ static void diffcore_pickaxe_count(struct diff_options *o)
        } else {
                kws = kwsalloc(DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE)
                               ? tolower_trans_tbl : NULL);
-               kwsincr(kws, needle, len);
+               kwsincr(kws, needle, strlen(needle));
                kwsprep(kws);
        }
 
-       pickaxe(&diff_queued_diff, o, regexp, kws, has_changes);
+       /* Might want to warn when both S and G are on; I don't care... */
+       pickaxe(&diff_queued_diff, o, regexp, kws,
+               (opts & DIFF_PICKAXE_KIND_G) ? diff_grep : has_changes);
 
-       if (opts & DIFF_PICKAXE_REGEX)
-               regfree(&regex);
+       if (regexp)
+               regfree(regexp);
        else
                kwsfree(kws);
        return;
 }
-
-void diffcore_pickaxe(struct diff_options *o)
-{
-       /* Might want to warn when both S and G are on; I don't care... */
-       if (o->pickaxe_opts & DIFF_PICKAXE_KIND_G)
-               diffcore_pickaxe_grep(o);
-       else
-               diffcore_pickaxe_count(o);
-}
diff --git a/dir.c b/dir.c
index 99f53033ba174301437c65b1dfa8f8cceb74f517..eb6f581270f81a2e844e3396f966e67d06d27f41 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -54,9 +54,9 @@ int fnmatch_icase(const char *pattern, const char *string, int flags)
                         NULL);
 }
 
-inline int git_fnmatch(const struct pathspec_item *item,
-                      const char *pattern, const char *string,
-                      int prefix)
+int git_fnmatch(const struct pathspec_item *item,
+               const char *pattern, const char *string,
+               int prefix)
 {
        if (prefix > 0) {
                if (ps_strncmp(item, pattern, string, prefix))
diff --git a/entry.c b/entry.c
index 7b7aa8167adade20f38cfb2709e02b3ed31f11a4..77c688262477e783b4bcbc237ef281eecab0661d 100644 (file)
--- a/entry.c
+++ b/entry.c
@@ -44,33 +44,33 @@ static void create_directories(const char *path, int path_len,
        free(buf);
 }
 
-static void remove_subtree(const char *path)
+static void remove_subtree(struct strbuf *path)
 {
-       DIR *dir = opendir(path);
+       DIR *dir = opendir(path->buf);
        struct dirent *de;
-       char pathbuf[PATH_MAX];
-       char *name;
+       int origlen = path->len;
 
        if (!dir)
-               die_errno("cannot opendir '%s'", path);
-       strcpy(pathbuf, path);
-       name = pathbuf + strlen(path);
-       *name++ = '/';
+               die_errno("cannot opendir '%s'", path->buf);
        while ((de = readdir(dir)) != NULL) {
                struct stat st;
+
                if (is_dot_or_dotdot(de->d_name))
                        continue;
-               strcpy(name, de->d_name);
-               if (lstat(pathbuf, &st))
-                       die_errno("cannot lstat '%s'", pathbuf);
+
+               strbuf_addch(path, '/');
+               strbuf_addstr(path, de->d_name);
+               if (lstat(path->buf, &st))
+                       die_errno("cannot lstat '%s'", path->buf);
                if (S_ISDIR(st.st_mode))
-                       remove_subtree(pathbuf);
-               else if (unlink(pathbuf))
-                       die_errno("cannot unlink '%s'", pathbuf);
+                       remove_subtree(path);
+               else if (unlink(path->buf))
+                       die_errno("cannot unlink '%s'", path->buf);
+               strbuf_setlen(path, origlen);
        }
        closedir(dir);
-       if (rmdir(path))
-               die_errno("cannot rmdir '%s'", path);
+       if (rmdir(path->buf))
+               die_errno("cannot rmdir '%s'", path->buf);
 }
 
 static int create_file(const char *path, unsigned int mode)
@@ -245,27 +245,25 @@ static int check_path(const char *path, int len, struct stat *st, int skiplen)
 int checkout_entry(struct cache_entry *ce,
                   const struct checkout *state, char *topath)
 {
-       static struct strbuf path_buf = STRBUF_INIT;
-       char *path;
+       static struct strbuf path = STRBUF_INIT;
        struct stat st;
-       int len;
 
        if (topath)
                return write_entry(ce, topath, state, 1);
 
-       strbuf_reset(&path_buf);
-       strbuf_add(&path_buf, state->base_dir, state->base_dir_len);
-       strbuf_add(&path_buf, ce->name, ce_namelen(ce));
-       path = path_buf.buf;
-       len = path_buf.len;
+       strbuf_reset(&path);
+       strbuf_add(&path, state->base_dir, state->base_dir_len);
+       strbuf_add(&path, ce->name, ce_namelen(ce));
 
-       if (!check_path(pathlen, &st, state->base_dir_len)) {
+       if (!check_path(path.buf, path.len, &st, state->base_dir_len)) {
                unsigned changed = ce_match_stat(ce, &st, CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE);
                if (!changed)
                        return 0;
                if (!state->force) {
                        if (!state->quiet)
-                               fprintf(stderr, "%s already exists, no checkout\n", path);
+                               fprintf(stderr,
+                                       "%s already exists, no checkout\n",
+                                       path.buf);
                        return -1;
                }
 
@@ -280,12 +278,14 @@ int checkout_entry(struct cache_entry *ce,
                        if (S_ISGITLINK(ce->ce_mode))
                                return 0;
                        if (!state->force)
-                               return error("%s is a directory", path);
-                       remove_subtree(path);
-               } else if (unlink(path))
-                       return error("unable to unlink old '%s' (%s)", path, strerror(errno));
+                               return error("%s is a directory", path.buf);
+                       remove_subtree(&path);
+               } else if (unlink(path.buf))
+                       return error("unable to unlink old '%s' (%s)",
+                                    path.buf, strerror(errno));
        } else if (state->not_new)
                return 0;
-       create_directories(path, len, state);
-       return write_entry(ce, path, state, 0);
+
+       create_directories(path.buf, path.len, state);
+       return write_entry(ce, path.buf, state, 0);
 }
index c3c860603da817b75d73bc446d03944e1963e874..c648ac3d3af1f86889ccc34e7f794683bd1951ea 100644 (file)
@@ -37,7 +37,7 @@ int core_compression_seen;
 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,6 +69,7 @@ unsigned long pack_size_limit_cfg;
  * that is subject to stripspace.
  */
 char comment_line_char = '#';
+int auto_comment_line_char;
 
 /* Parallel index stat data preload? */
 int core_preload_index = 0;
@@ -237,7 +238,7 @@ int odb_mkstemp(char *template, size_t limit, const char *pattern)
        return xmkstemp_mode(template, mode);
 }
 
-int odb_pack_keep(char *name, size_t namesz, unsigned char *sha1)
+int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1)
 {
        int fd;
 
index 9ced2dadfe92c2a3cf89ab34a09af85af11de581..fccb42b52cbcbbfd2b5ec9f7f535f2e82a327090 100644 (file)
@@ -41,7 +41,7 @@ static inline void buffer_grow(struct ewah_bitmap *self, size_t new_size)
        self->alloc_size = new_size;
        self->buffer = ewah_realloc(self->buffer,
                self->alloc_size * sizeof(eword_t));
-       self->rlw = self->buffer + (rlw_offset / sizeof(size_t));
+       self->rlw = self->buffer + (rlw_offset / sizeof(eword_t));
 }
 
 static inline void buffer_push(struct ewah_bitmap *self, eword_t value)
index 90d47da8a902f24bb6a7ae63654a104626751b1e..eeee2bb7e08a21dfe091a30c8378da6d488228f5 100644 (file)
@@ -26,6 +26,7 @@ static int agent_supported;
 static struct lock_file shallow_lock;
 static const char *alternate_shallow_file;
 
+/* Remember to update object flag allocation in object.h */
 #define COMPLETE       (1U << 0)
 #define COMMON         (1U << 1)
 #define COMMON_REF     (1U << 2)
diff --git a/fsck.c b/fsck.c
index 64bf279fd7e42da1921a65d725007c52c7ddc5fb..abed62bac77c67e7c7447a18fea75f228406baac 100644 (file)
--- a/fsck.c
+++ b/fsck.c
@@ -165,18 +165,12 @@ static int fsck_tree(struct tree *item, int strict, fsck_error error_func)
 
                sha1 = tree_entry_extract(&desc, &name, &mode);
 
-               if (is_null_sha1(sha1))
-                       has_null_sha1 = 1;
-               if (strchr(name, '/'))
-                       has_full_path = 1;
-               if (!*name)
-                       has_empty_name = 1;
-               if (!strcmp(name, "."))
-                       has_dot = 1;
-               if (!strcmp(name, ".."))
-                       has_dotdot = 1;
-               if (!strcmp(name, ".git"))
-                       has_dotgit = 1;
+               has_null_sha1 |= is_null_sha1(sha1);
+               has_full_path |= !!strchr(name, '/');
+               has_empty_name |= !*name;
+               has_dot |= !strcmp(name, ".");
+               has_dotdot |= !strcmp(name, "..");
+               has_dotgit |= !strcmp(name, ".git");
                has_zero_pad |= *(char *)desc.buffer == '0';
                update_tree_entry(&desc);
 
@@ -243,7 +237,7 @@ static int fsck_tree(struct tree *item, int strict, fsck_error error_func)
        return retval;
 }
 
-static int fsck_ident(char **ident, struct object *obj, fsck_error error_func)
+static int fsck_ident(const char **ident, struct object *obj, fsck_error error_func)
 {
        char *end;
 
@@ -284,21 +278,23 @@ static int fsck_ident(char **ident, struct object *obj, fsck_error error_func)
 
 static int fsck_commit(struct commit *commit, fsck_error error_func)
 {
-       char *buffer = commit->buffer;
+       const char *buffer = commit->buffer, *tmp;
        unsigned char tree_sha1[20], sha1[20];
        struct commit_graft *graft;
        int parents = 0;
        int err;
 
-       if (memcmp(buffer, "tree ", 5))
+       buffer = skip_prefix(buffer, "tree ");
+       if (!buffer)
                return error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'tree' line");
-       if (get_sha1_hex(buffer+5, tree_sha1) || buffer[45] != '\n')
+       if (get_sha1_hex(buffer, tree_sha1) || buffer[40] != '\n')
                return error_func(&commit->object, FSCK_ERROR, "invalid 'tree' line format - bad sha1");
-       buffer += 46;
-       while (!memcmp(buffer, "parent ", 7)) {
-               if (get_sha1_hex(buffer+7, sha1) || buffer[47] != '\n')
+       buffer += 41;
+       while ((tmp = skip_prefix(buffer, "parent "))) {
+               buffer = tmp;
+               if (get_sha1_hex(buffer, sha1) || buffer[40] != '\n')
                        return error_func(&commit->object, FSCK_ERROR, "invalid 'parent' line format - bad sha1");
-               buffer += 48;
+               buffer += 41;
                parents++;
        }
        graft = lookup_commit_graft(commit->object.sha1);
@@ -322,15 +318,15 @@ static int fsck_commit(struct commit *commit, fsck_error error_func)
                if (p || parents)
                        return error_func(&commit->object, FSCK_ERROR, "parent objects missing");
        }
-       if (memcmp(buffer, "author ", 7))
+       buffer = skip_prefix(buffer, "author ");
+       if (!buffer)
                return error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'author' line");
-       buffer += 7;
        err = fsck_ident(&buffer, &commit->object, error_func);
        if (err)
                return err;
-       if (memcmp(buffer, "committer ", strlen("committer ")))
+       buffer = skip_prefix(buffer, "committer ");
+       if (!buffer)
                return error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'committer' line");
-       buffer += strlen("committer ");
        err = fsck_ident(&buffer, &commit->object, error_func);
        if (err)
                return err;
index d3bca1261110014b2b969f6d2fc1d73dca424204..1fadd69f8809f91337a27b98f244a3cf7183b23f 100755 (executable)
@@ -1159,9 +1159,9 @@ sub help_patch_cmd {
        print colored $help_color, <<EOF ;
 y - $verb this hunk$target
 n - do not $verb this hunk$target
-q - quit; do not $verb this hunk nor any of the remaining ones
+q - quit; do not $verb this hunk or any of the remaining ones
 a - $verb this hunk and all later hunks in the file
-d - do not $verb this hunk nor any of the later hunks in the file
+d - do not $verb this hunk or any of the later hunks in the file
 g - select a hunk to go to
 / - search for a hunk matching the given regex
 j - leave this hunk undecided, see next undecided hunk
index 78517f254f7e772145ff419bb3f000507458ff60..ee61a77d717a7210a1cf614914ab62788fd5e4fc 100755 (executable)
--- a/git-am.sh
+++ b/git-am.sh
@@ -125,7 +125,7 @@ cannot_fallback () {
 }
 
 fall_back_3way () {
-    O_OBJECT=`cd "$GIT_OBJECT_DIRECTORY" && pwd`
+    O_OBJECT=$(cd "$GIT_OBJECT_DIRECTORY" && pwd)
 
     rm -fr "$dotest"/patch-merge-*
     mkdir "$dotest/patch-merge-tmp-dir"
@@ -275,7 +275,7 @@ split_patches () {
                then
                        clean_abort "$(gettext "Only one StGIT patch series can be applied at once")"
                fi
-               series_dir=`dirname "$1"`
+               series_dir=$(dirname "$1")
                series_file="$1"
                shift
                {
@@ -298,8 +298,8 @@ split_patches () {
                this=0
                for stgit in "$@"
                do
-                       this=`expr "$this" + 1`
-                       msgnum=`printf "%0${prec}d" $this`
+                       this=$(expr "$this" + 1)
+                       msgnum=$(printf "%0${prec}d" $this)
                        # Perl version of StGIT parse_patch. The first nonemptyline
                        # not starting with Author, From or Date is the
                        # subject, and the body starts with the next nonempty
@@ -530,7 +530,7 @@ Use \"git am --abort\" to remove it.")"
                esac
        fi
 
-       # Make sure we are not given --skip, --continue, nor --abort
+       # Make sure we are not given --skip, --continue, or --abort
        test "$skip$resolved$abort" = "" ||
                die "$(gettext "Resolve operation not in progress, we are not resuming.")"
 
@@ -644,26 +644,26 @@ fi
 git_apply_opt=$(cat "$dotest/apply-opt")
 if test "$(cat "$dotest/sign")" = t
 then
-       SIGNOFF=`git var GIT_COMMITTER_IDENT | sed -e '
+       SIGNOFF=$(git var GIT_COMMITTER_IDENT | sed -e '
                        s/>.*/>/
                        s/^/Signed-off-by: /'
-               `
+               )
 else
        SIGNOFF=
 fi
 
-last=`cat "$dotest/last"`
-this=`cat "$dotest/next"`
+last=$(cat "$dotest/last")
+this=$(cat "$dotest/next")
 if test "$skip" = t
 then
-       this=`expr "$this" + 1`
+       this=$(expr "$this" + 1)
        resume=
 fi
 
 while test "$this" -le "$last"
 do
-       msgnum=`printf "%0${prec}d" $this`
-       next=`expr "$this" + 1`
+       msgnum=$(printf "%0${prec}d" $this)
+       next=$(expr "$this" + 1)
        test -f "$dotest/$msgnum" || {
                resume=
                go_next
@@ -739,16 +739,16 @@ To restore the original branch and stop patching run \"\$cmdline --abort\"."
        '')
            if test '' != "$SIGNOFF"
            then
-               LAST_SIGNED_OFF_BY=`
+               LAST_SIGNED_OFF_BY=$(
                    sed -ne '/^Signed-off-by: /p' \
                    "$dotest/msg-clean" |
                    sed -ne '$p'
-               `
-               ADD_SIGNOFF=`
+               )
+               ADD_SIGNOFF=$(
                    test "$LAST_SIGNED_OFF_BY" = "$SIGNOFF" || {
                    test '' = "$LAST_SIGNED_OFF_BY" && echo
                    echo "$SIGNOFF"
-               }`
+               })
            else
                ADD_SIGNOFF=
            fi
index 892032bc79b88c9180f9f4c8ba171407d7c784ed..7849d314051a1de351c9c985516135397042a091 100644 (file)
@@ -330,8 +330,12 @@ extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)))
  * 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));
@@ -521,6 +525,14 @@ 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);
@@ -531,12 +543,13 @@ extern void *xcalloc(size_t nmemb, size_t size);
 extern void *xmmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
 extern ssize_t xread(int fd, void *buf, size_t len);
 extern ssize_t xwrite(int fd, const void *buf, size_t len);
+extern ssize_t xpread(int fd, void *buf, size_t len, off_t offset);
 extern int xdup(int fd);
 extern FILE *xfdopen(int fd, const char *mode);
 extern int xmkstemp(char *template);
 extern int xmkstemp_mode(char *template, int mode);
 extern int odb_mkstemp(char *template, size_t limit, const char *pattern);
-extern int odb_pack_keep(char *name, size_t namesz, unsigned char *sha1);
+extern int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1);
 
 static inline size_t xsize_t(off_t len)
 {
@@ -716,4 +729,11 @@ void warn_on_inaccessible(const char *path);
 /* Get the passwd entry for the UID of the current process. */
 struct passwd *xgetpwuid_self(void);
 
+#ifdef GMTIME_UNRELIABLE_ERRORS
+struct tm *git_gmtime(const time_t *);
+struct tm *git_gmtime_r(const time_t *, struct tm *);
+#define gmtime git_gmtime
+#define gmtime_r git_gmtime_r
+#endif
+
 #endif
index cf2209b4f201b990cffab6d454599b9fa6932fc0..6a8907e7b327d066c616f8f77c2bc2096d618e06 100755 (executable)
@@ -1283,7 +1283,7 @@ load_config 0
 apply_config
 
 # v1.7.0 introduced --show-toplevel to return the canonical work-tree
-if {[package vsatisfies $_git_version 1.7.0]} {
+if {[package vsatisfies $_git_version 1.7.0-]} {
        if { [is_Cygwin] } {
                catch {set _gitworktree [exec cygpath --windows [git rev-parse --show-toplevel]]}
        } else {
@@ -1539,7 +1539,7 @@ proc rescan_stage2 {fd after} {
                close $fd
        }
 
-       if {[package vsatisfies $::_git_version 1.6.3]} {
+       if {[package vsatisfies $::_git_version 1.6.3-]} {
                set ls_others [list --exclude-standard]
        } else {
                set ls_others [list --exclude-per-directory=.gitignore]
index 332528ff4556116f9ff22c257e49825954a183fb..d08dc92589b366746965a0eab0727ce2befc579d 100755 (executable)
@@ -277,7 +277,7 @@ merge_file () {
        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,7 +315,8 @@ merge_file () {
        return 0
 }
 
-prompt=$(git config --bool mergetool.prompt || echo true)
+prompt=$(git config --bool mergetool.prompt)
+guessed_merge_tool=false
 
 while test $# != 0
 do
@@ -373,7 +374,14 @@ prompt_after_failed_merge () {
 
 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)"
index cdfa2df5d8e0add0363f3e246362b437b72c4d58..7bb0f7313bc9d4d2ad1ae43ec68afe761334a59a 100755 (executable)
--- a/git-p4.py
+++ b/git-p4.py
@@ -1238,6 +1238,28 @@ def edit_template(self, template_file):
             if response == 'n':
                 return False
 
+    def get_diff_description(self, editedFiles):
+        # 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
+
     def applyCommit(self, id):
         """Apply one commit, return True if it succeeded."""
 
@@ -1311,7 +1333,7 @@ def applyCommit(self, id):
             else:
                 die("unknown modifier %s for %s" % (modifier, path))
 
-        diffcmd = "git diff-tree -p \"%s\"" % (id)
+        diffcmd = "git diff-tree --full-index -p \"%s\"" % (id)
         patchcmd = diffcmd + " | git apply "
         tryPatchCmd = patchcmd + "--check -"
         applyPatchCmd = patchcmd + "--check --apply -"
@@ -1398,34 +1420,15 @@ def applyCommit(self, id):
             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)
 
-        # 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+")
         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:
@@ -3086,7 +3089,7 @@ def rebase(self):
         print "Rebasing the current branch onto %s" % upstream
         oldHead = read_pipe("git rev-parse HEAD").strip()
         system("git rebase %s" % upstream)
-        system("git diff-tree --stat --summary -M %s HEAD" % oldHead)
+        system("git diff-tree --stat --summary -M %s HEAD --" % oldHead)
         return True
 
 class P4Clone(P4Sync):
index 6cd8ebc534c174dfe613f62047424dc7491d75fa..cfc589dc15061c8ed1797c2d91ec420b1d6f33fe 100755 (executable)
@@ -108,7 +108,7 @@ do
        -s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy)
                case "$#,$1" in
                *,*=*)
-                       strategy=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;;
+                       strategy=$(expr "z$1" : 'z-[^=]*=\(.*\)') ;;
                1,*)
                        usage ;;
                *)
index df46f4ca9629253238e94ae31ae26c77b452dde3..ca20e1e66fbda7c27a8a4cfff03ecf02841e1002 100644 (file)
@@ -4,6 +4,17 @@
 # Copyright (c) 2010 Junio C Hamano.
 #
 
+# The whole contents of this file is run by dot-sourcing it from
+# inside a shell function.  It used to be that "return"s we see
+# below were not inside any function, and expected to return
+# to the function that dot-sourced us.
+#
+# However, FreeBSD /bin/sh misbehaves on such a construct and
+# continues to run the statements that follow such a "return".
+# As a work-around, we introduce an extra layer of a function
+# here, and immediately call it after defining it.
+git_rebase__am () {
+
 case "$action" in
 continue)
        git am --resolved --resolvemsg="$resolvemsg" \
@@ -75,3 +86,7 @@ then
 fi
 
 move_to_original_branch
+
+}
+# ... and then we call the whole thing.
+git_rebase__am
index a1adae83131b5918ec6f994043f3f3ccd3b8c3d8..6ec9d3cb40b1e96f75132a11eb625fd42e64885d 100644 (file)
@@ -749,7 +749,7 @@ rearrange_squash () {
                                        ;;
                                esac
                        done
-                       echo "$sha1 $action $prefix $rest"
+                       printf '%s %s %s %s\n' "$sha1" "$action" "$prefix" "$rest"
                        # if it's a single word, try to resolve to a full sha1 and
                        # emit a second copy. This allows us to match on both message
                        # and on sha1 prefix
@@ -820,6 +820,17 @@ add_exec_commands () {
        mv "$1.new" "$1"
 }
 
+# The whole contents of this file is run by dot-sourcing it from
+# inside a shell function.  It used to be that "return"s we see
+# below were not inside any function, and expected to return
+# to the function that dot-sourced us.
+#
+# However, FreeBSD /bin/sh misbehaves on such a construct and
+# continues to run the statements that follow such a "return".
+# As a work-around, we introduce an extra layer of a function
+# here, and immediately call it after defining it.
+git_rebase__interactive () {
+
 case "$action" in
 continue)
        # do we have anything to commit?
@@ -1055,3 +1066,7 @@ GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name"
 output git checkout $onto || die_abort "could not detach HEAD"
 git update-ref ORIG_HEAD $orig_head
 do_rest
+
+}
+# ... and then we call the whole thing.
+git_rebase__interactive
index 5381857c59968c38526140d53e3150f19e8d0b0c..6d77b3ca9118e6fdd36615757a24c109cf0530ee 100644 (file)
@@ -24,7 +24,7 @@ continue_merge () {
                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"
@@ -101,6 +101,17 @@ finish_rb_merge () {
        say All done.
 }
 
+# The whole contents of this file is run by dot-sourcing it from
+# inside a shell function.  It used to be that "return"s we see
+# below were not inside any function, and expected to return
+# to the function that dot-sourced us.
+#
+# However, FreeBSD /bin/sh misbehaves on such a construct and
+# continues to run the statements that follow such a "return".
+# As a work-around, we introduce an extra layer of a function
+# here, and immediately call it after defining it.
+git_rebase__merge () {
+
 case "$action" in
 continue)
        read_state
@@ -132,7 +143,7 @@ echo "$onto_name" > "$state_dir/onto_name"
 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"
@@ -151,3 +162,7 @@ do
 done
 
 finish_rb_merge
+
+}
+# ... and then we call the whole thing.
+git_rebase__merge
index 5f6732bf3dce78966da1cbb83d4094d584f92598..5c7a0a1a583552de49ee2e094e80f80ee18fd68c 100755 (executable)
@@ -175,22 +175,13 @@ You can run "git stash pop" or "git stash drop" at any time.
        rm -rf "$state_dir"
 }
 
-run_specific_rebase_internal () {
+run_specific_rebase () {
        if [ "$interactive_rebase" = implied ]; then
                GIT_EDITOR=:
                export GIT_EDITOR
                autosquash=
        fi
-       # On FreeBSD, the shell's "return" returns from the current
-       # function, not from the current file inclusion.
-       # run_specific_rebase_internal has the file inclusion as a
-       # last statement, so POSIX and FreeBSD's return will do the
-       # same thing.
        . git-rebase--$type
-}
-
-run_specific_rebase () {
-       run_specific_rebase_internal
        ret=$?
        if test $ret -eq 0
        then
@@ -453,6 +444,10 @@ then
                test "$fork_point" = auto && fork_point=t
                ;;
        *)      upstream_name="$1"
+               if test "$upstream_name" = "-"
+               then
+                       upstream_name="@{-1}"
+               fi
                shift
                ;;
        esac
@@ -462,8 +457,8 @@ then
 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
@@ -521,10 +516,10 @@ case "$#" in
        ;;
 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
index 1c006a0518e247d58759df98602f6dae3935caf6..a9c75a2360fec7a9ce5f22877a471f70bc405ff1 100755 (executable)
@@ -13,7 +13,8 @@ refspec="${GIT_REMOTE_TESTGIT_REFSPEC-$default_refspec}"
 
 test -z "$refspec" && prefix="refs"
 
-export GIT_DIR="$url/.git"
+GIT_DIR="$url/.git"
+export GIT_DIR
 
 force=
 
index 5c1599752314696ef1f317095d1786493fbfc935..d5500fde4658410db477008617730cb5799f310e 100755 (executable)
@@ -119,6 +119,12 @@ then
        status=1
 fi
 
+# Special case: turn "for_linus" to "tags/for_linus" when it is correct
+if test "$ref" = "refs/tags/$pretty_remote"
+then
+       pretty_remote=tags/$pretty_remote
+fi
+
 url=$(git ls-remote --get-url "$url")
 
 git show -s --format='The following changes since commit %H:
index fdb0029b597898559376b1b28d692450794251f3..abd62b484cdaef8e6ab5ba366551c03959c08beb 100755 (executable)
@@ -1113,6 +1113,18 @@ sub ssl_verify_params {
        }
 }
 
+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 +1209,7 @@ sub send_message {
 
        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 +1283,7 @@ sub send_message {
                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) {
index 5f28b32dc7ff75830bde919b2f4776f7a9b017e2..9447980330ce7892757f9b11fa45cfeb3e6fcb34 100644 (file)
@@ -160,7 +160,7 @@ git_pager() {
        else
                GIT_PAGER=cat
        fi
-       : ${LESS=-FRSX}
+       : ${LESS=-FRX}
        : ${LV=-c}
        export LESS LV
 
index 4798bcf0e51b705005215e9a6339310defe16d03..bcc757b3900b02595e5b432edcfd590e312b48ce 100755 (executable)
@@ -13,7 +13,7 @@ USAGE="list [<options>]
 
 SUBDIRECTORY_OK=Yes
 OPTIONS_SPEC=
-START_DIR=`pwd`
+START_DIR=$(pwd)
 . git-sh-setup
 . git-sh-i18n
 require_work_tree
@@ -94,7 +94,8 @@ create_stash () {
                # ease of unpacking later.
                u_commit=$(
                        untracked_files | (
-                               export GIT_INDEX_FILE="$TMPindex"
+                               GIT_INDEX_FILE="$TMPindex" &&
+                               export GIT_INDEX_FILE &&
                                rm -f "$TMPindex" &&
                                git update-index -z --add --remove --stdin &&
                                u_tree=$(git write-tree) &&
index 6135cfa9127c1da094df59236f926c01721ae58b..e146b833d163ab58984fec3d6fb9f45b148e0171 100755 (executable)
@@ -246,9 +246,6 @@ module_name()
 # $3 = URL to clone
 # $4 = reference repository to reuse (empty for independent)
 # $5 = depth argument for shallow clones (empty for deep)
-# $6 = (remote-tracking) starting point for the local branch (empty for HEAD)
-# $7 = local branch to create (empty for a detached HEAD, unless $6 is
-#      also empty, in which case the local branch is left unchanged)
 #
 # Prior to calling, cmd_update checks that a possibly existing
 # path is not a git repository.
@@ -262,8 +259,6 @@ module_clone()
        url=$3
        reference="$4"
        depth="$5"
-       start_point="$6"
-       local_branch="$7"
        quiet=
        if test -n "$GIT_QUIET"
        then
@@ -296,9 +291,6 @@ module_clone()
        # 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")"
@@ -317,16 +309,7 @@ module_clone()
        echo "gitdir: $rel/$a" >"$sm_path/.git"
 
        rel=$(echo $a | sed -e 's|[^/][^/]*|..|g')
-       (
-               clear_local_git_env
-               cd "$sm_path" &&
-               GIT_WORK_TREE=. git config core.worktree "$rel/$b" &&
-               # ash fails to wordsplit ${local_branch:+-B "$local_branch"...}
-               case "$local_branch" in
-               '') git checkout -f -q ${start_point:+"$start_point"} ;;
-               ?*) git checkout -f -q -B "$local_branch" ${start_point:+"$start_point"} ;;
-               esac
-       ) || die "$(eval_gettext "Unable to setup cloned submodule '\$sm_path'")"
+       (clear_local_git_env; cd "$sm_path" && GIT_WORK_TREE=. git config core.worktree "$rel/$b")
 }
 
 isnumber()
@@ -489,15 +472,16 @@ Use -f if you really want to add it." >&2
                                echo "$(eval_gettext "Reactivating local git directory for submodule '\$sm_name'.")"
                        fi
                fi
-               if test -n "$branch"
-               then
-                       start_point="origin/$branch"
-                       local_branch="$branch"
-               else
-                       start_point=""
-                       local_branch=""
-               fi
-               module_clone "$sm_path" "$sm_name" "$realrepo" "$reference" "$depth" "$start_point" "$local_branch" || exit
+               module_clone "$sm_path" "$sm_name" "$realrepo" "$reference" "$depth" || exit
+               (
+                       clear_local_git_env
+                       cd "$sm_path" &&
+                       # ash fails to wordsplit ${branch:+-b "$branch"...}
+                       case "$branch" in
+                       '') git checkout -f -q ;;
+                       ?*) git checkout -f -q -B "$branch" "origin/$branch" ;;
+                       esac
+               ) || die "$(eval_gettext "Unable to checkout submodule '\$sm_path'")"
        fi
        git config submodule."$sm_name".url "$realrepo"
 
@@ -818,9 +802,7 @@ cmd_update()
                fi
                name=$(module_name "$sm_path") || exit
                url=$(git config submodule."$name".url)
-               config_branch=$(get_submodule_config "$name" branch)
-               branch="${config_branch:-master}"
-               local_branch="$branch"
+               branch=$(get_submodule_config "$name" branch master)
                if ! test -z "$update"
                then
                        update_module=$update
@@ -834,19 +816,11 @@ cmd_update()
 
                displaypath=$(relative_path "$prefix$sm_path")
 
-               case "$update_module" in
-               none)
+               if test "$update_module" = "none"
+               then
                        echo "Skipping submodule '$displaypath'"
                        continue
-                       ;;
-               checkout)
-                       local_branch=""
-                       ;;
-               rebase | merge | !*)
-                       ;;
-               *)
-                       die "$(eval_gettext "Invalid update mode '$update_module' for submodule '$name'")"
-               esac
+               fi
 
                if test -z "$url"
                then
@@ -860,8 +834,7 @@ Maybe you want to use 'update --init'?")"
 
                if ! test -d "$sm_path"/.git -o -f "$sm_path"/.git
                then
-                       start_point="origin/${branch}"
-                       module_clone "$sm_path" "$name" "$url" "$reference" "$depth" "$start_point" "$local_branch" || exit
+                       module_clone "$sm_path" "$name" "$url" "$reference" "$depth" || exit
                        cloned_modules="$cloned_modules;$name"
                        subsha1=
                else
@@ -907,7 +880,7 @@ Maybe you want to use 'update --init'?")"
                        case ";$cloned_modules;" in
                        *";$name;"*)
                                # then there is no local change to integrate
-                               update_module='!git reset --hard -q'
+                               update_module=checkout ;;
                        esac
 
                        must_die_on_failure=
index 7349ffea5ad36f5677e7127fd693a72d155b1fa5..0a323722a601b2cb900385e531d315558b6d3fe9 100755 (executable)
@@ -1389,17 +1389,7 @@ sub cmd_multi_init {
                usage(1);
        }
 
-       unless (defined $_prefix) {
-               $_prefix = '';
-               warn <<EOF
-WARNING: --prefix is not given, defaulting to empty prefix.
-         This is probably not what you want! In order to stay compatible
-         with regular remote-tracking refs, provide a prefix like
-         --prefix=origin/ (remember the trailing slash), which will cause
-         the SVN-tracking refs to be placed at refs/remotes/origin/*.
-NOTE: In Git v2.0, the default prefix will change from empty to 'origin/'.
-EOF
-       }
+       $_prefix = 'origin/' unless defined $_prefix;
        if (defined $url) {
                $url = canonicalize_url($url);
                init_subdir(@_);
index ebdfba6c94db947f66add0c1b4840319c12252ea..ae152534f5026d50fa32b568d1bdd591629bc59d 100755 (executable)
@@ -59,7 +59,7 @@ do
        -b|--browser*|-t|--tool*)
                case "$#,$1" in
                *,*=*)
-                       browser=`expr "z$1" : 'z-[^=]*=\(.*\)'`
+                       browser=$(expr "z$1" : 'z-[^=]*=\(.*\)')
                        ;;
                1,*)
                        usage ;;
@@ -71,7 +71,7 @@ do
        -c|--config*)
                case "$#,$1" in
                *,*=*)
-                       conf=`expr "z$1" : 'z-[^=]*=\(.*\)'`
+                       conf=$(expr "z$1" : 'z-[^=]*=\(.*\)')
                        ;;
                1,*)
                        usage ;;
@@ -100,7 +100,7 @@ then
        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 9efd1a3ec1f2af63fe575f9c755dff685d9b1e51..778057294892d68b3dee58869cf22265223cab83 100644 (file)
--- a/git.c
+++ b/git.c
@@ -290,7 +290,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
        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);
                }
index 79057b7d0e4f6c76a9d9853be14bbef60fa9c1c0..a9f57d6f9024b2c23d6a2a67d33d84638e3bfb07 100755 (executable)
@@ -1490,7 +1490,7 @@ sub is_valid_pathname {
        my $input = shift;
 
        return undef unless defined $input;
-       # no '.' or '..' as elements of path, i.e. no '.' nor '..'
+       # no '.' or '..' as elements of path, i.e. no '.' or '..'
        # at the beginning, at the end, and between slashes.
        # also this catches doubled slashes
        if ($input =~ m!(^|/)(|\.|\.\.)(/|$)!) {
diff --git a/grep.c b/grep.c
index 4aef0a69d084deee61486e43bc62ae2da6b6b440..99217dc04f5d04c761f094069f1053cb090baaf1 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -86,6 +86,11 @@ int grep_config(const char *var, const char *value, void *cb)
                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"))
index d4b40c9c60e8caa2b8f8e676ac18b678b6ca2ed6..f2c56c84544be36414686ed2e27c8b08e8946e53 100644 (file)
@@ -64,8 +64,7 @@ enum XML_Status {
 #define LOCK_TIME 600
 #define LOCK_REFRESH 30
 
-/* bits #0-15 in revision.h */
-
+/* Remember to update object flag allocation in object.h */
 #define LOCAL    (1u<<16)
 #define REMOTE   (1u<<17)
 #define FETCHING (1u<<18)
diff --git a/http.h b/http.h
index a82888445e9f04acfe27e36b1f274ffb9659cddf..e64084fe6d455652bde1b02012b52879327e2c0a 100644 (file)
--- a/http.h
+++ b/http.h
@@ -13,8 +13,7 @@
 /*
  * We detect based on the cURL version if multi-transfer is
  * usable in this implementation and define this symbol accordingly.
- * This is not something Makefile should set nor users should pass
- * via CFLAGS.
+ * This shouldn't be set by the Makefile or by the user (e.g. via CFLAGS).
  */
 #undef USE_CURL_MULTI
 
index 0bc6f7fae151ea364e9d141b30b8e68d544a4448..5c4f336330e416379a15cee75b593f0aea451025 100644 (file)
@@ -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
@@ -946,6 +946,7 @@ static int auth_cram_md5(struct imap_store *ctx, struct imap_cmd *cmd, const cha
 
 static struct imap_store *imap_open_store(struct imap_server_conf *srvc)
 {
+       struct credential cred = CREDENTIAL_INIT;
        struct imap_store *ctx;
        struct imap *imap;
        char *arg, *rsp;
@@ -1096,25 +1097,23 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc)
                }
 #endif
                imap_info("Logging in...\n");
-               if (!srvc->user) {
-                       fprintf(stderr, "Skipping server %s, no user\n", srvc->host);
-                       goto bail;
-               }
-               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 (!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 (CAP(NOLOGIN)) {
                        fprintf(stderr, "Skipping account %s@%s, server forbids LOGIN\n", srvc->user, srvc->host);
                        goto bail;
@@ -1153,10 +1152,18 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc)
                }
        } /* !preauth */
 
+       if (cred.username)
+               credential_approve(&cred);
+       credential_clear(&cred);
+
        ctx->prefix = "";
        return ctx;
 
 bail:
+       if (cred.username)
+               credential_reject(&cred);
+       credential_clear(&cred);
+
        imap_close_store(ctx);
        return NULL;
 }
index 206816fa9c47eb419775bcf2005f9cd5144bc297..3595ee7a22c4d6099ea9b995ffe1c61c60bb77cd 100644 (file)
@@ -81,8 +81,11 @@ static void process_tree(struct rev_info *revs,
                die("bad tree object");
        if (obj->flags & (UNINTERESTING | SEEN))
                return;
-       if (parse_tree(tree) < 0)
+       if (parse_tree(tree) < 0) {
+               if (revs->ignore_missing_links)
+                       return;
                die("bad tree object %s", sha1_to_hex(obj->sha1));
+       }
        obj->flags |= SEEN;
        show(obj, path, name, cb_data);
        me.up = path;
index 5ce217d5eba33a54419ac8b29223cc16aa1f905e..cf2f86c86632c6df8862fc065299e6cc35aa4829 100644 (file)
@@ -805,12 +805,16 @@ int log_tree_commit(struct rev_info *opt, struct commit *commit)
        if (opt->line_level_traverse)
                return line_log_print(opt, commit);
 
+       if (opt->track_linear && !opt->linear && !opt->reverse_output_stage)
+               printf("\n%s\n", opt->break_bar);
        shown = log_tree_diff(opt, commit, &log);
        if (!shown && opt->loginfo && opt->always_show_header) {
                log.parent = NULL;
                show_log(opt);
                shown = 1;
        }
+       if (opt->track_linear && !opt->linear && opt->reverse_output_stage)
+               printf("\n%s\n", opt->break_bar);
        opt->loginfo = NULL;
        maybe_flush_or_die(stdout, "stdout");
        return shown;
index 41770929420da4cba934b0b86b9cd2f55f9cab31..cab16fafb5c2b7792c78d3a7fbace1f43ab099cc 100644 (file)
@@ -589,6 +589,12 @@ static int remove_file(struct merge_options *o, int clean,
                        return -1;
        }
        if (update_working_directory) {
+               if (ignore_case) {
+                       struct cache_entry *ce;
+                       ce = cache_file_exists(path, strlen(path), ignore_case);
+                       if (ce && ce_stage(ce) == 0)
+                               return 0;
+               }
                if (remove_path(path))
                        return -1;
        }
diff --git a/mergetools/gvimdiff3 b/mergetools/gvimdiff3
new file mode 100644 (file)
index 0000000..04a5bb0
--- /dev/null
@@ -0,0 +1 @@
+. "$MERGE_TOOLS_DIR/vimdiff"
index 39d032771b8525253d3828fd68b2c7f6d6df8478..1ddfbfcd782d3b8d0e479cb0c5e29abce86e63c9 100644 (file)
@@ -20,16 +20,26 @@ merge_cmd () {
                "$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 (file)
index 0000000..04a5bb0
--- /dev/null
@@ -0,0 +1 @@
+. "$MERGE_TOOLS_DIR/vimdiff"
index eabe4a0d9bf44050dba43cbd821642cdfd3fb40b..97dfd63c9bf564ac052addc4a3f62a325bbc1303 100644 (file)
@@ -62,7 +62,7 @@ int notes_cache_write(struct notes_cache *c)
        if (commit_tree(&msg, tree_sha1, NULL, 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;
index 4aa7023903374aa3ccea23d5fc9ae82c9c67bca7..a0b1d7be98253368921a6e95653ceb36dbda28b2 100644 (file)
@@ -48,7 +48,8 @@ void commit_notes(struct notes_tree *t, const char *msg)
 
        create_notes_commit(t, NULL, &buf, 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);
 }
index 732bf4d7e7012ce56045ec52404ac92b077305a6..6e12f2c7f4582b5121a4be18be5fedaecd30f38f 100644 (file)
--- a/object.h
+++ b/object.h
@@ -26,6 +26,19 @@ struct object_array {
 #define OBJECT_ARRAY_INIT { 0, 0, NULL }
 
 #define TYPE_BITS   3
+/*
+ * object flag allocation:
+ * revision.h:      0---------10                                26
+ * fetch-pack.c:    0---4
+ * walker.c:        0-2
+ * upload-pack.c:               11----------------19
+ * builtin/blame.c:               12-13
+ * bisect.c:                               16
+ * bundle.c:                               16
+ * http-push.c:                            16-----19
+ * commit.c:                               16-----19
+ * sha1_name.c:                                     20
+ */
 #define FLAG_BITS  27
 
 /*
index ae0b57b95011af835d3b47f253572e8c44f6482e..91e41015316e8d5c166cdee92c453ec23a483dab 100644 (file)
@@ -727,8 +727,10 @@ int prepare_bitmap_walk(struct rev_info *revs)
        revs->pending.objects = NULL;
 
        if (haves) {
+               revs->ignore_missing_links = 1;
                haves_bitmap = find_objects(revs, haves, NULL);
                reset_revision_walk();
+               revs->ignore_missing_links = 0;
 
                if (haves_bitmap == NULL)
                        die("BUG: failed to perform bitmap walk");
diff --git a/pager.c b/pager.c
index 0cc75a8eee32a0195a74c6819a04745f341e45e3..8b5cbc56e4fd57a1b9d2cad3e668df4c508a7b17 100644 (file)
--- a/pager.c
+++ b/pager.c
@@ -64,7 +64,7 @@ void setup_pager(void)
 {
        const char *pager = git_pager(isatty(1));
 
-       if (!pager || pager_in_use())
+       if (!pager)
                return;
 
        /*
@@ -85,7 +85,7 @@ void setup_pager(void)
                int i = 0;
 
                if (!getenv("LESS"))
-                       env[i++] = "LESS=FRSX";
+                       env[i++] = "LESS=FRX";
                if (!getenv("LV"))
                        env[i++] = "LV=-c";
                env[i] = NULL;
index c81d3a06550a1015ab0f4f7284bb48dce0293ab2..b536896f2689dee23afae7d3a169c065592aaabe 100644 (file)
@@ -127,10 +127,6 @@ static int get_value(struct parse_opt_ctx_t *p,
                *(int *)opt->value = opt->defval;
                return 0;
 
-       case OPTION_SET_PTR:
-               *(void **)opt->value = unset ? NULL : (void *)opt->defval;
-               return 0;
-
        case OPTION_STRING:
                if (unset)
                        *(const char **)opt->value = NULL;
@@ -367,7 +363,6 @@ static void parse_options_check(const struct option *opts)
                case OPTION_BIT:
                case OPTION_NEGBIT:
                case OPTION_SET_INT:
-               case OPTION_SET_PTR:
                case OPTION_NUMBER:
                        if ((opts->flags & PARSE_OPT_OPTARG) ||
                            !(opts->flags & PARSE_OPT_NOARG))
index 8fa02dc9a947b9bc56f929b81a71f122f2457dc1..7940bc71af4c6dacd65d042091454c8fa83c53c7 100644 (file)
@@ -12,7 +12,6 @@ enum parse_opt_type {
        OPTION_NEGBIT,
        OPTION_COUNTUP,
        OPTION_SET_INT,
-       OPTION_SET_PTR,
        OPTION_CMDMODE,
        /* options with arguments (usually) */
        OPTION_STRING,
@@ -96,7 +95,7 @@ typedef int parse_opt_ll_cb(struct parse_opt_ctx_t *ctx,
  *
  * `defval`::
  *   default value to fill (*->value) with for PARSE_OPT_OPTARG.
- *   OPTION_{BIT,SET_INT,SET_PTR} store the {mask,integer,pointer} to put in
+ *   OPTION_{BIT,SET_INT} store the {mask,integer,pointer} to put in
  *   the value when met.
  *   CALLBACKS can use it like they want.
  */
@@ -128,8 +127,6 @@ struct option {
 #define OPT_BOOL(s, l, v, h)        OPT_SET_INT(s, l, v, h, 1)
 #define OPT_HIDDEN_BOOL(s, l, v, h) { OPTION_SET_INT, (s), (l), (v), NULL, \
                                      (h), PARSE_OPT_NOARG | PARSE_OPT_HIDDEN, NULL, 1}
-#define OPT_SET_PTR(s, l, v, h, p)  { OPTION_SET_PTR, (s), (l), (v), NULL, \
-                                     (h), PARSE_OPT_NOARG, NULL, (p) }
 #define OPT_CMDMODE(s, l, v, h, i) { OPTION_CMDMODE, (s), (l), (v), NULL, \
                                      (h), PARSE_OPT_NOARG|PARSE_OPT_NONEG, NULL, (i) }
 #define OPT_INTEGER(s, l, v, h)     { OPTION_INTEGER, (s), (l), (v), N_("n"), (h) }
@@ -179,8 +176,8 @@ extern NORETURN void usage_msg_opt(const char *msg,
 
 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 -----*/
index 6e804a271ca4c6b38b9769f16ace4fb9bc0b88cd..09cff135efd98a486ff767485602d9383e7c3c23 100644 (file)
@@ -480,8 +480,8 @@ sub refname {
        # It cannot end with a slash /, we'll throw up on this because
        # SVN can't have directories with a slash in their name, either:
        if ($refname =~ m{/$}) {
-               die "ref: '$refname' ends with a trailing slash, this is ",
-                   "not permitted by git nor Subversion\n";
+               die "ref: '$refname' ends with a trailing slash; this is ",
+                   "not permitted by git or Subversion\n";
        }
 
        # It cannot have ASCII control character space, tilde ~, caret ^,
@@ -1191,7 +1191,7 @@ sub do_fetch {
                # we can have a branch that was deleted, then re-added
                # under the same name but copied from another path, in
                # which case we'll have multiple parents (we don't
-               # want to break the original ref, nor lose copypath info):
+               # want to break the original ref or lose copypath info):
                if (my $log_entry = $self->find_parent_branch($paths, $rev)) {
                        push @{$log_entry->{parents}}, $lc;
                        return $log_entry;
@@ -1321,7 +1321,7 @@ sub get_untracked {
 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.
 
index 34f2869ab5995e3f9143af8cc2c46a4717ae8be8..664105357c0031e869b3348a09d91777a42c1cdf 100644 (file)
@@ -116,7 +116,7 @@ sub run_pager {
                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)";
 }
index 30daf354655f0b4cc02d08e7ba5af43133a09b95..cf6ffa7581310986b7618da36346dc499a9fb098 100644 (file)
@@ -1,6 +1,6 @@
 package Git::SVN::Migration;
 # these version numbers do NOT correspond to actual version numbers
-# of git nor git-svn.  They are just relative.
+# of git or git-svn.  They are just relative.
 #
 # v0 layout: .git/$id/info/url, refs/heads/$id-HEAD
 #
index 0a838d1656171019c07fe802d615ecaf78412003..3cb9d91baaa5bbd09e1ca55e8754e1c4edb6bd97 100644 (file)
@@ -28,10 +28,10 @@ void packet_buf_write(struct strbuf *buf, const char *fmt, ...) __attribute__((f
  * Read a packetized line into the buffer, which must be at least size bytes
  * long. The return value specifies the number of bytes read into the buffer.
  *
- * If src_buffer is not NULL (and nor is *src_buffer), it should point to a
- * buffer containing the packet data to parse, of at least *src_len bytes.
- * After the function returns, src_buf will be incremented and src_len
- * decremented by the number of bytes consumed.
+ * If src_buffer and *src_buffer are not NULL, it should point to a buffer
+ * containing the packet data to parse, of at least *src_len bytes.  After the
+ * function returns, src_buf will be incremented and src_len decremented by the
+ * number of bytes consumed.
  *
  * If src_buffer (or *src_buffer) is NULL, then data is read from the
  * descriptor "fd".
index fb450b241498bdddb3e60b096aa0fd9c1ef3521a..e862e106047d9e646e21efeb8dcb39465bb10928 100644 (file)
--- a/po/bg.po
+++ b/po/bg.po
 # rebase пребазирам
 # force (push) принудително изтласквам
 # stash/index индекс
+# squash commits смачкване на подавания
+# root commit начално подаване
+# fixup вкарвам подаване в предното без следа
+# remote-tracking branch следящ клон
+# git bundle архив на git
+# bisect двоично търсене
+# am прилагам поредица от кръпки
+# working directory/tree — винаги работно дърво, git следи цялото дърво, а не директории
+# switch to branch прехвърлям се/преминавам към клон
+# sparse entry частично изтеглена директория/път
+# revision range диапазон на версиите
+# cover letter придружаващо писмо
+# reference repository еталонно хранилище
+# grafted repository хранилище с присаждане
+# thin pack съкратен пакет
+# stat (a file) получавам информация чрез „stat“ (за файл)
+# mixed reset смесено зануляване (индекса и указателя „HEAD“, без работното дърво)
+# soft reset меко зануляване (само указателя „HEAD“, без индекса и работното дърво)
+# hard reset пълно зануляване (указателя „HEAD“, индекса и работното дърво)
+# merge reset слято зануляване (целия индекс и отчасти работното дърво — без файловете с промени между работното дърво и индекса)
+# keep reset запазващо зануляване (отчасти индекса и работното дърво — файловете с промени от подаването и „HEAD“)
+# commit-ish указател към подаване
+# sequence последователност/поредица
+# whitespace symbol знаци за интервали
+# shortlog съкратения журнал
+# ----
+# FAILED to parse неуспешен анализ на... -> неразпозната стойност на
+#
+# ========================
+# „“…—
 # ========================
 # RECHECK
 # ------------------------
 # grep ^#: bg.po | cut -c4- |tr ' ' '\n'| sed -e 's/:[0-9][0-9]*//'  -e 's%.*/%%' -e 's/[.][^.]*$//' > OUT
 # sort -u OUT > UNIQUE
 # for i in `cat UNIQUE`; do echo   `grep "^$i$" OUT | wc -l` $i ; done | sort -nr > STATS
+#
 # ========================
-# DONE strings
-# ------------------------
-# 222
-# ========================
-# REMAINING strings
+# FIND NON FULLY TRANSLATED
 # ------------------------
-# 1988
+# msgattrib  --untranslated bg.po > untranslated.po
+# msgattrib  --only-fuzzy bg.po > fuzzy.po
+# msgcat.exe untranslated.po fuzzy.po > new.po
+# grep ^#: new.po | cut -c4- |tr ' ' '\n'| sed -e 's/:[0-9][0-9]*//'  -e 's%.*/%%' -e 's/[.][^.]*$//' | sort -u
+#
 # ========================
-# DONE alphabetical ordering
+# STRINGS statistics
 # ------------------------
-#
-# advice, fsck, gc, help, parse-options, reflog, remote, rm, run-command
+# 1307t,0f,921u
 #
 # ========================
-# REMAINING alphabetical ordering
+# MOST IMPORTANT name asc ordering
 # ------------------------
-#
-# add, apply, archive, attr, bisect--helper, blame, branch, bundle, cat-file, check-attr, check-ignore, check-mailmap,
-# checkout, checkout-index, clean, clone, column, commit, common-cmds, config, connected, count-objects, date, describe,
-# diff, diffcore-order, fast-export, fetch, fmt-merge-msg, for-each-ref, git, git-am, git-bisect, git-pull, git-rebase,
-# git-stash, git-submodule, gpg-interface, grep, hash-object, index-pack, init-db, log, ls-files, ls-tree, merge,
-# merge-base, merge-file, merge-recursive, mktree, mv, name-rev, notes, notes-utils, object, obstack, pack-objects,
-# pack-refs, pathspec, precompose_utf8, prune, prune-packed, push, read-tree, repack, replace, rerere, reset, revert,
-# rev-parse, sequencer, sha1_name, shortlog, show-branch, show-ref, submodule, symbolic-ref, tag, update-index,
-# update-ref, update-server-info, urlmatch, verify-pack, verify-tag, wrapper, write-tree, wt-status
-#
+# 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
 #
 # ========================
-# MOST IMPORTANT strings ordering
+# IMPORTANT strings desc, name asc ordering
 # ------------------------
-# 144 [remote]    68 fetch       28 blame         16 [parse-options]
-# 137 commit      64 grep        27 git-rebase    12 [gc]
-# 115 branch      46 push        24 revert        12 [fsck]
-# 102 wt-status   38 add         21 common-cmds   3 reflog
-#  78 checkout    34 config      21 [rm]
-#  77 log         33 reset       21 mv
-#  69 clone       29 git-stash   13 diff
+# 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
 #
 # ========================
-# WHOLE STATISTICS strings ordering
+# WHOLE STATISTICS strings desc, name asc ordering
 # ------------------------
-# 144 remote           54 git-submodule  27 ls-files        12 pathspec         8 replace         3 prune-packed
-# 137 commit           48 push           27 git-rebase      12 name-rev         8 git-pull        3 pack-refs
-# 115 branch           41 help           24 revert          12 gc               8 fmt-merge-msg   3 count-objects
-# 111 apply            40 pack-objects   24 mv              12 fsck             7 symbolic-ref    3 connected
-# 102 wt-status        39 init-db        21 rm              12 checkout-index   6 gpg-interface   3 bisect--helper
-# 100 notes            38 add            21 common-cmds     11 date             6 check-attr      2 verify-tag
-#  97 merge            35 archive        19 show-branch     11 column           5 write-tree      2 update-server-info
-#  78 checkout         34 config         19 read-tree       10 urlmatch         5 sha1_name       2 run-command
-#  77 log              33 reset          19 bundle          10 shortlog         5 rev-parse       2 rerere
-#  69 clone            32 clean          17 repack          10 merge-file       5 prune           2 obstack
-#  68 index-pack       30 git-am         16 parse-options   10 merge-base       4 wrapper         2 advice
-#  68 fetch            30 describe       14 submodule       10 ls-tree          4 notes-utils     1 precompose_utf8
-#  64 grep             29 git-stash      14 show-ref        10 hash-object      4 mktree          1 object
-#  58 tag              29 git-bisect     14 fast-export     10 for-each-ref     4 check-mailmap   1 git
-#  56 sequencer        28 update-index   13 diff            10 cat-file         3 verify-pack     1 diffcore-order
-#  55 merge-recursive  28 blame          13 check-ignore     9 update-ref       3 reflog          1 attr
+# 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]
+#
 msgid ""
 msgstr ""
 "Project-Id-Version: git master\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-01-18 07:42+0800\n"
-"PO-Revision-Date: 2014-01-28 19:05+0200\n"
+"POT-Creation-Date: 2014-04-19 12:50+0800\n"
+"PO-Revision-Date: 2014-05-11 17:06+0300\n"
 "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
 "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
 "Language: bg\n"
@@ -97,16 +117,12 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: advice.c:57
+#: advice.c:55
 #, c-format
 msgid "hint: %.*s\n"
 msgstr "Подсказка: %.*s\n"
 
-#.
-#. * Message used both when 'git commit' fails and when
-#. * other commands doing a merge do.
-#.
-#: advice.c:87
+#: advice.c:85
 msgid ""
 "Fix them up in the work tree,\n"
 "and then use 'git add/rm <file>' as\n"
@@ -135,76 +151,76 @@ msgstr ""
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr ""
 
-#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328
+#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "пътят „%s“ не съвпада с никой файл"
 
-#: archive.c:327
+#: archive.c:328
 msgid "fmt"
 msgstr ""
 
-#: archive.c:327
+#: archive.c:328
 msgid "archive format"
 msgstr ""
 
-#: archive.c:328 builtin/log.c:1193
+#: archive.c:329 builtin/log.c:1193
 msgid "prefix"
-msgstr ""
+msgstr "префикс"
 
-#: archive.c:329
+#: archive.c:330
 msgid "prepend prefix to each pathname in the archive"
 msgstr ""
 
-#: archive.c:330 builtin/archive.c:88 builtin/blame.c:2265
-#: builtin/blame.c:2266 builtin/config.c:58 builtin/fast-export.c:680
-#: builtin/fast-export.c:682 builtin/grep.c:716 builtin/hash-object.c:77
-#: builtin/ls-files.c:486 builtin/ls-files.c:489 builtin/notes.c:408
-#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:154
+#: 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
 msgid "file"
 msgstr "файл"
 
-#: archive.c:331 builtin/archive.c:89
+#: archive.c:332 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr ""
 
-#: archive.c:333
+#: archive.c:334
 msgid "read .gitattributes in working directory"
 msgstr ""
 
-#: archive.c:334
+#: archive.c:335
 msgid "report archived files on stderr"
 msgstr ""
 
-#: archive.c:335
+#: archive.c:336
 msgid "store only"
 msgstr ""
 
-#: archive.c:336
+#: archive.c:337
 msgid "compress faster"
 msgstr ""
 
-#: archive.c:344
+#: archive.c:345
 msgid "compress better"
 msgstr ""
 
-#: archive.c:347
+#: archive.c:348
 msgid "list supported archive formats"
 msgstr ""
 
-#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
 msgid "repo"
-msgstr ""
+msgstr "хранилище"
 
-#: archive.c:350 builtin/archive.c:91
+#: archive.c:351 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr ""
 
-#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487
+#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
 msgid "command"
 msgstr ""
 
-#: archive.c:352 builtin/archive.c:93
+#: archive.c:353 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr ""
 
@@ -213,87 +229,88 @@ msgid ""
 "Negative patterns are ignored in git attributes\n"
 "Use '\\!' for literal leading exclamation."
 msgstr ""
+"Отрицателните шаблони се игнорират в атрибутите на git.\n"
+"Ако ви трябва начална удивителна, ползвайте „\\!“."
 
 #: branch.c:60
 #, c-format
 msgid "Not setting branch %s as its own upstream."
 msgstr ""
+"Клонът „%s“ не може да служи като източник за собствената си синхронизация."
 
-#: branch.c:82
+#: branch.c:83
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr ""
+"Клонът „%s“ ще следи клона „%s“ от отдалеченото хранилище „%s“ чрез "
+"пребазиране."
 
-#: branch.c:83
+#: branch.c:84
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
-msgstr ""
+msgstr "Клонът „%s“ ще следи клона „%s“ от отдалеченото хранилище „%s“."
 
-#: branch.c:87
+#: branch.c:88
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr ""
+"Клонът „%s“ ще следи клона „%s“ от локалното хранилище чрез пребазиране."
 
-#: branch.c:88
+#: branch.c:89
 #, c-format
 msgid "Branch %s set up to track local branch %s."
-msgstr ""
+msgstr "Клонът „%s“ ще следи клона „%s“ от локалното хранилище."
 
-#: branch.c:92
+#: branch.c:94
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr ""
+msgstr "Клонът „%s“ ще следи отдалечения указател „%s“ чрез пребазиране."
 
-#: branch.c:93
+#: branch.c:95
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
-msgstr ""
+msgstr "Клонът „%s“ ще следи отдалечения указател „%s“."
 
-#: branch.c:97
+#: branch.c:99
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
-msgstr ""
+msgstr "Клонът „%s“ ще следи локалния указател „%s“ чрез пребазиране."
 
-#: branch.c:98
+#: branch.c:100
 #, c-format
 msgid "Branch %s set up to track local ref %s."
-msgstr ""
-
-#: branch.c:118
-#, c-format
-msgid "Tracking not set up: name too long: %s"
-msgstr ""
+msgstr "Клонът „%s“ ще следи локалния указател „%s“."
 
-#: branch.c:137
+#: branch.c:133
 #, c-format
 msgid "Not tracking: ambiguous information for ref %s"
-msgstr ""
+msgstr "Няма следене: двусмислена информация за указателя „%s“"
 
-#: branch.c:182
+#: branch.c:178
 #, c-format
 msgid "'%s' is not a valid branch name."
-msgstr ""
+msgstr "„%s“ не е позволено име за клон."
 
-#: branch.c:187
+#: branch.c:183
 #, c-format
 msgid "A branch named '%s' already exists."
-msgstr ""
+msgstr "Вече съществува клон с име „%s“."
 
-#: branch.c:195
+#: branch.c:191
 msgid "Cannot force update the current branch."
-msgstr ""
+msgstr "Текущият клон не може да бъде принудително обновен."
 
-#: branch.c:215
+#: branch.c:211
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr ""
+msgstr "Зададените настройки за следенето са грешни — началото „%s“ не е клон."
 
-#: branch.c:217
+#: branch.c:213
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
-msgstr ""
+msgstr "заявеният отдалечен клон „%s“ не съществува"
 
-#: branch.c:219
+#: branch.c:215
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -304,135 +321,142 @@ msgid ""
 "will track its remote counterpart, you may want to use\n"
 "\"git push -u\" to set the upstream config as you push."
 msgstr ""
+"\n"
+"Ако искате да базирате работата си на клон от отдалечено хранилище, може \n"
+"да се наложи да изпълните „git fetch“, за да получите информацията за него.\n"
+"\n"
+"Ако искате да изтласкате нов, локален клон, който да следи отдалечен клон,\n"
+"може да използвате „git push -u“, за да настроите към кой клон да се "
+"изтласква."
 
-#: branch.c:264
+#: branch.c:260
 #, c-format
 msgid "Not a valid object name: '%s'."
-msgstr ""
+msgstr "Неправилно име на обект: „%s“"
 
-#: branch.c:284
+#: branch.c:280
 #, c-format
 msgid "Ambiguous object name: '%s'."
-msgstr ""
+msgstr "Двусмислено име на обект: „%s“"
 
-#: branch.c:289
+#: branch.c:285
 #, c-format
 msgid "Not a valid branch point: '%s'."
-msgstr ""
+msgstr "Неправилно място за начало на клон: „%s“"
 
-#: branch.c:295
+#: branch.c:291
 msgid "Failed to lock ref for update"
-msgstr ""
+msgstr "Указателят не може да бъде заключен, за да бъде обновен"
 
-#: branch.c:313
+#: branch.c:309
 msgid "Failed to write ref"
-msgstr ""
+msgstr "Указателят не може да бъде записан"
 
-#: bundle.c:37
+#: bundle.c:33
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
-msgstr ""
+msgstr "Файлът „%s“ не изглежда да е архив на git версия 2"
 
-#: bundle.c:64
+#: bundle.c:60
 #, c-format
 msgid "unrecognized header: %s%s (%d)"
 msgstr ""
 
-#: bundle.c:90 builtin/commit.c:706
+#: bundle.c:86 builtin/commit.c:706
 #, c-format
 msgid "could not open '%s'"
-msgstr ""
+msgstr "„%s“ не може да се отвори"
 
-#: bundle.c:141
+#: bundle.c:138
 msgid "Repository lacks these prerequisite commits:"
 msgstr ""
 
-#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332
+#: 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
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
-msgstr ""
+msgstr "неуспешно настройване на обхождането на версиите"
 
-#: bundle.c:187
+#: bundle.c:184
 #, c-format
 msgid "The bundle contains this ref:"
 msgid_plural "The bundle contains these %d refs:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: bundle.c:194
+#: bundle.c:191
 msgid "The bundle records a complete history."
 msgstr ""
 
-#: bundle.c:196
+#: bundle.c:193
 #, c-format
 msgid "The bundle requires this ref:"
 msgid_plural "The bundle requires these %d refs:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: bundle.c:296
+#: bundle.c:293
 msgid "rev-list died"
 msgstr ""
 
-#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
-msgstr ""
+msgstr "непознат аргумент: %s"
 
-#: bundle.c:337
+#: bundle.c:334
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr ""
 
-#: bundle.c:382
+#: bundle.c:379
 msgid "Refusing to create empty bundle."
 msgstr ""
 
-#: bundle.c:398
+#: bundle.c:395
 msgid "Could not spawn pack-objects"
 msgstr ""
 
-#: bundle.c:416
+#: bundle.c:413
 msgid "pack-objects died"
 msgstr ""
 
-#: bundle.c:419
+#: bundle.c:416
 #, c-format
 msgid "cannot create '%s'"
 msgstr ""
 
-#: bundle.c:441
+#: bundle.c:438
 msgid "index-pack died"
 msgstr ""
 
-#: commit.c:53
+#: commit.c:54
 #, c-format
 msgid "could not parse %s"
-msgstr ""
+msgstr "„%s“ не може да се анализира"
 
-#: commit.c:55
+#: commit.c:56
 #, c-format
 msgid "%s %s is not a commit!"
-msgstr ""
+msgstr "%s %s не е подаване!"
 
 #: compat/obstack.c:406 compat/obstack.c:408
 msgid "memory exhausted"
-msgstr ""
+msgstr "паметта свърши"
 
 #: connected.c:70
 msgid "Could not run 'git rev-list'"
-msgstr ""
+msgstr "Командата „git rev-list“ не може да бъде изпълнена."
 
 #: connected.c:90
 #, c-format
 msgid "failed write to rev-list: %s"
-msgstr ""
+msgstr "неуспешен запис в списъка с версиите: %s"
 
 #: connected.c:98
 #, c-format
 msgid "failed to close rev-list's stdin: %s"
-msgstr ""
+msgstr "стандартният вход на списъка с версиите не може да бъде затворен: %s"
 
 #: date.c:95
 msgid "in the future"
@@ -487,6 +511,7 @@ msgid_plural "%lu years"
 msgstr[0] ""
 msgstr[1] ""
 
+#. TRANSLATORS: "%s" is "<n> years"
 #: date.c:149
 #, c-format
 msgid "%s, %lu month ago"
@@ -504,22 +529,28 @@ msgstr[1] ""
 #: diffcore-order.c:24
 #, c-format
 msgid "failed to read orderfile '%s'"
-msgstr ""
+msgstr "файлът с подредбата на съответствията „%s“ не може да бъде прочетен"
+
+#: diffcore-rename.c:517
+msgid "Performing inexact rename detection"
+msgstr "Търсене на преименувания на обекти съчетани с промени"
 
 #: diff.c:113
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr ""
+"  Неуспешно разпознаване на „%s“ като процент-праг за статистиката по "
+"директории\n"
 
 #: diff.c:118
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
-msgstr ""
+msgstr "  Непознат параметър „%s“ за статистиката по директории'\n"
 
 #: diff.c:213
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr ""
+msgstr "Непозната стойност „%s“ за настройката „diff.submodule“"
 
 #: diff.c:263
 #, c-format
@@ -527,70 +558,74 @@ msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
 "%s"
 msgstr ""
+"Грешки в настройката „diff.dirstat“:\n"
+"%s"
 
-#: diff.c:3509
+#: diff.c:3495
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
 "%s"
 msgstr ""
+"Неразпознат параметър към опцията „--dirstat/-X“:\n"
+"%s"
 
-#: diff.c:3523
+#: diff.c:3509
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr ""
+msgstr "Неразпознат параметър към опцията „--submodule“: „%s“"
 
 #: gpg-interface.c:59 gpg-interface.c:131
 msgid "could not run gpg."
-msgstr ""
+msgstr "Програмата „gpg“ не може да бъде стартирана."
 
 #: gpg-interface.c:71
 msgid "gpg did not accept the data"
-msgstr ""
+msgstr "Програмата „gpg“ не прие подадените данни."
 
 #: gpg-interface.c:82
 msgid "gpg failed to sign the data"
-msgstr ""
+msgstr "Програмата „gpg“ не подписа данните."
 
 #: gpg-interface.c:115
 #, c-format
 msgid "could not create temporary file '%s': %s"
-msgstr ""
+msgstr "Програмата „gpg“ не успя да създаде временния файл „%s“: %s"
 
 #: gpg-interface.c:118
 #, c-format
 msgid "failed writing detached signature to '%s': %s"
-msgstr ""
+msgstr "Програмата „gpg“ не успя да запише самостоятелния подпис към „%s“: %s"
 
-#: grep.c:1695
+#: grep.c:1698
 #, c-format
 msgid "'%s': unable to read %s"
-msgstr ""
+msgstr "„%s“: файлът сочен от „%s“ не може да бъде прочетен"
 
-#: grep.c:1712
+#: grep.c:1715
 #, c-format
 msgid "'%s': %s"
-msgstr ""
+msgstr "„%s“: „%s“"
 
-#: grep.c:1723
+#: grep.c:1726
 #, c-format
 msgid "'%s': short read %s"
-msgstr ""
+msgstr "„%s“: изчитането на „%s“ върна по-малко байтове от заявените"
 
-#: help.c:210
+#: help.c:209
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "налични команди на git от „%s“"
 
-#: help.c:217
+#: help.c:216
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "команди на git от други директории от пътя „$PATH“"
 
-#: help.c:233
+#: help.c:232
 msgid "The most commonly used git commands are:"
 msgstr "Най-често употребяваните команди на git са:"
 
-#: help.c:290
+#: help.c:289
 #, c-format
 msgid ""
 "'%s' appears to be a git command, but we were not\n"
@@ -599,11 +634,12 @@ msgstr ""
 "Изглежда, че „%s“ е команда на git, но тя не може да\n"
 "бъде изпълнена. Вероятно пакетът „git-%s“ е повреден."
 
-#: help.c:347
+# FIXME bad message
+#: help.c:346
 msgid "Uh oh. Your system reports no Git commands at all."
 msgstr "Странно, изглежда, че на системата ви няма нито една команда на git."
 
-#: help.c:369
+#: help.c:368
 #, c-format
 msgid ""
 "WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -614,17 +650,17 @@ msgstr ""
 "съществува. Изпълнението автоматично продължава, като се счита, че имате "
 "предвид „%s“"
 
-#: help.c:374
+#: help.c:373
 #, c-format
 msgid "in %0.1f seconds automatically..."
 msgstr "след %0.1f секунди…"
 
-#: help.c:381
+#: help.c:380
 #, c-format
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git: „%s“ не е команда на git. Вижте изхода от „git --help“."
 
-#: help.c:385 help.c:444
+#: help.c:384 help.c:443
 msgid ""
 "\n"
 "Did you mean this?"
@@ -638,7 +674,7 @@ msgstr[1] ""
 "\n"
 "Команди с подобно име са:"
 
-#: help.c:440
+#: help.c:439
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %s — %s"
@@ -647,305 +683,305 @@ msgstr "%s: %s — %s"
 msgid "failed to read the cache"
 msgstr ""
 
-#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559
+#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
 #: builtin/clone.c:661
 msgid "unable to write new index file"
-msgstr ""
+msgstr "неуспешно записване на новия индекс"
 
 #: merge-recursive.c:190
 #, c-format
 msgid "(bad commit)\n"
 msgstr ""
 
-#: merge-recursive.c:206
+#: merge-recursive.c:208
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr ""
 
-#: merge-recursive.c:269
+#: merge-recursive.c:271
 msgid "error building trees"
 msgstr ""
 
-#: merge-recursive.c:673
+#: merge-recursive.c:675
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr ""
 
-#: merge-recursive.c:684
+#: merge-recursive.c:686
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr ""
 
-#. something else exists
-#. .. but not some other error (who really cares what?)
-#: merge-recursive.c:698 merge-recursive.c:719
+#: merge-recursive.c:700 merge-recursive.c:721
 msgid ": perhaps a D/F conflict?"
 msgstr ""
 
-#: merge-recursive.c:709
+#: merge-recursive.c:711
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr ""
 
-#: merge-recursive.c:749
+#: merge-recursive.c:751
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr ""
 
-#: merge-recursive.c:751
+#: merge-recursive.c:753
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr ""
 
-#: merge-recursive.c:774 builtin/clone.c:317
+#: merge-recursive.c:776 builtin/clone.c:317
 #, c-format
 msgid "failed to open '%s'"
-msgstr ""
+msgstr "директорията „%s“ не може да бъде отворена"
 
-#: merge-recursive.c:782
+#: merge-recursive.c:784
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr ""
 
-#: merge-recursive.c:785
+#: merge-recursive.c:787
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr ""
 
-#: merge-recursive.c:923
+#: merge-recursive.c:925
 msgid "Failed to execute internal merge"
 msgstr ""
 
-#: merge-recursive.c:927
+#: merge-recursive.c:929
 #, c-format
 msgid "Unable to add %s to database"
 msgstr ""
 
-#: merge-recursive.c:943
+#: merge-recursive.c:945
 msgid "unsupported object type in the tree"
 msgstr ""
 
-#: merge-recursive.c:1022 merge-recursive.c:1036
+#: merge-recursive.c:1024 merge-recursive.c:1038
 #, 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:1028 merge-recursive.c:1041
+#: merge-recursive.c:1030 merge-recursive.c:1043
 #, 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:1082
+#: merge-recursive.c:1084
 msgid "rename"
 msgstr ""
 
-#: merge-recursive.c:1082 wt-status.c:283
+#: merge-recursive.c:1084
 msgid "renamed"
-msgstr ""
+msgstr "преименуван"
 
-#: merge-recursive.c:1138
+#: merge-recursive.c:1140
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr ""
 
-#: merge-recursive.c:1160
+#: merge-recursive.c:1162
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
 "\"->\"%s\" in \"%s\"%s"
 msgstr ""
 
-#: merge-recursive.c:1165
+#: merge-recursive.c:1167
 msgid " (left unresolved)"
 msgstr ""
 
-#: merge-recursive.c:1219
+#: merge-recursive.c:1221
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 
-#: merge-recursive.c:1249
+#: merge-recursive.c:1251
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr ""
 
-#: merge-recursive.c:1448
+#: merge-recursive.c:1450
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 
-#: merge-recursive.c:1458
+#: merge-recursive.c:1460
 #, c-format
 msgid "Adding merged %s"
 msgstr ""
 
-#: merge-recursive.c:1463 merge-recursive.c:1661
+#: merge-recursive.c:1465 merge-recursive.c:1663
 #, c-format
 msgid "Adding as %s instead"
 msgstr ""
 
-#: merge-recursive.c:1514
+#: merge-recursive.c:1516
 #, c-format
 msgid "cannot read object %s"
 msgstr ""
 
-#: merge-recursive.c:1517
+#: merge-recursive.c:1519
 #, c-format
 msgid "object %s is not a blob"
 msgstr ""
 
-#: merge-recursive.c:1565
+#: merge-recursive.c:1567
 msgid "modify"
 msgstr ""
 
-#: merge-recursive.c:1565 wt-status.c:281
+#: merge-recursive.c:1567
 msgid "modified"
-msgstr ""
+msgstr "променен"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1577
 msgid "content"
 msgstr ""
 
-#: merge-recursive.c:1582
+#: merge-recursive.c:1584
 msgid "add/add"
 msgstr ""
 
-#: merge-recursive.c:1616
+#: merge-recursive.c:1618
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr ""
 
-#: merge-recursive.c:1630
+#: merge-recursive.c:1632
 #, c-format
 msgid "Auto-merging %s"
 msgstr ""
 
-#: merge-recursive.c:1634 git-submodule.sh:1148
+#: merge-recursive.c:1636 git-submodule.sh:1149
 msgid "submodule"
-msgstr ""
+msgstr "ПОДМОДУЛ"
 
-#: merge-recursive.c:1635
+#: merge-recursive.c:1637
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr ""
 
-#: merge-recursive.c:1725
+#: merge-recursive.c:1727
 #, c-format
 msgid "Removing %s"
-msgstr ""
+msgstr "Изтриване на „%s“"
 
-#: merge-recursive.c:1750
+#: merge-recursive.c:1752
 msgid "file/directory"
 msgstr ""
 
-#: merge-recursive.c:1756
+#: merge-recursive.c:1758
 msgid "directory/file"
 msgstr ""
 
-#: merge-recursive.c:1761
+#: merge-recursive.c:1763
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 
-#: merge-recursive.c:1771
+#: merge-recursive.c:1773
 #, c-format
 msgid "Adding %s"
 msgstr ""
 
-#: merge-recursive.c:1788
+#: merge-recursive.c:1790
 msgid "Fatal merge failure, shouldn't happen."
 msgstr ""
 
-#: merge-recursive.c:1807
+#: merge-recursive.c:1809
 msgid "Already up-to-date!"
 msgstr ""
 
-#: merge-recursive.c:1816
+#: merge-recursive.c:1818
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr ""
 
-#: merge-recursive.c:1846
+#: merge-recursive.c:1848
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr ""
 
-#: merge-recursive.c:1891
+#: merge-recursive.c:1893
 msgid "Merging:"
 msgstr ""
 
-#: merge-recursive.c:1904
+#: merge-recursive.c:1906
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: merge-recursive.c:1941
+#: merge-recursive.c:1943
 msgid "merge returned no commit"
 msgstr ""
 
-#: merge-recursive.c:1998
+#: merge-recursive.c:2000
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr ""
 
-#: merge-recursive.c:2010 builtin/merge.c:665
+#: merge-recursive.c:2012 builtin/merge.c:668
 msgid "Unable to write index."
 msgstr ""
 
 #: notes-utils.c:40
 msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr ""
+"Неинициализирано или нереферирано дърво за бележки не може да бъде подадено"
 
 #: notes-utils.c:81
 #, c-format
 msgid "Bad notes.rewriteMode value: '%s'"
-msgstr ""
+msgstr "Лоша стойност за „notes.rewriteMode“: „%s“"
 
 #: notes-utils.c:91
 #, 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
 #, c-format
 msgid "Bad %s value: '%s'"
-msgstr ""
+msgstr "Зададена е лоша стойност на променливата „%s“: „%s“"
 
-#: object.c:202
+#: object.c:229
 #, c-format
 msgid "unable to parse object: %s"
-msgstr ""
+msgstr "обектът „%s“ не може да бъде анализиран"
 
-#: parse-options.c:537
+#: parse-options.c:532
 msgid "..."
 msgstr "…"
 
-#: parse-options.c:555
+#: parse-options.c:550
 #, c-format
 msgid "usage: %s"
 msgstr "употреба: %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:559
+#: parse-options.c:554
 #, c-format
 msgid "   or: %s"
 msgstr "     или: %s"
 
-#: parse-options.c:562
+#: parse-options.c:557
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:596
+#: parse-options.c:591
 msgid "-NUM"
 msgstr "-ЧИСЛО"
 
@@ -993,11 +1029,6 @@ msgstr ""
 msgid "Pathspec '%s' is in submodule '%.*s'"
 msgstr ""
 
-#.
-#. * We may want to substitute "this command" with a command
-#. * name. E.g. when add--interactive dies when running
-#. * "checkout -p"
-#.
 #: pathspec.c:353
 #, c-format
 msgid "%s: pathspec magic not supported by this command: %s"
@@ -1014,56 +1045,74 @@ msgid ""
 "Perhaps you forgot to add either ':/' or '.' ?"
 msgstr ""
 
-#: remote.c:753
+#: progress.c:224
+msgid "done"
+msgstr "действието завърши"
+
+#: read-cache.c:1238
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"Зададена е неправилна стойност на настройката „index.version“.\n"
+"Ще се ползва версия %i"
+
+#: read-cache.c:1248
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"Зададена е неправилна стойност на променливата на средата "
+"„GIT_INDEX_VERSION“.\n"
+"Ще се ползва версия %i"
+
+#: remote.c:758
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "Невъзможно е да се доставят едновременно и „%s“, и „%s“ към „%s“"
 
-#: remote.c:757
+#: remote.c:762
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "„%s“ обикновено следи „%s“, а не „%s“"
 
-#: remote.c:761
+#: remote.c:766
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "„%s“ следи както „%s“, така и „%s“"
 
-#.
-#. * This last possibility doesn't occur because
-#. * FETCH_HEAD_IGNORE entries always appear at
-#. * the end of the list.
-#.
-#: remote.c:769
+#: remote.c:774
 msgid "Internal error"
 msgstr "Вътрешна грешка"
 
-#: remote.c:1871
+#: remote.c:1948
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "Този клон следи „%s“, но следеният клон е изтрит.\n"
 
-#: remote.c:1875
+#: remote.c:1952
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr "  (за да коригирате това използвайте „git branch --unset-upstream“)\n"
+msgstr "  (за да коригирате това, използвайте „git branch --unset-upstream“)\n"
 
-#: remote.c:1878
+#: remote.c:1955
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "Клонът е актуализиран както „%s“.\n"
 
-#: remote.c:1882
+#: remote.c:1959
 #, 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:1888
+#: remote.c:1965
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (публикувайте локалните си промени чрез „git push“)\n"
 
-#: remote.c:1891
+#: remote.c:1968
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1073,11 +1122,11 @@ msgstr[0] ""
 msgstr[1] ""
 "Клонът ви е с %2$d подавания след „%1$s“ и може да бъде тривиално слят.\n"
 
-#: remote.c:1899
+#: remote.c:1976
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (обновете локалния си клон чрез „git pull“)\n"
 
-#: remote.c:1902
+#: remote.c:1979
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1092,7 +1141,7 @@ msgstr[1] ""
 "Текущият клон се е отделил от „%s“,\n"
 "двата имат съответно по %d и %d несъвпадащи подавания.\n"
 
-#: remote.c:1912
+#: remote.c:1989
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr "  (слейте отдалечения клон в локалния чрез „git pull“)\n"
 
@@ -1105,14 +1154,14 @@ msgstr "неуспешно отваряне на „/dev/null“"
 msgid "dup2(%d,%d) failed"
 msgstr "неуспешно изпълнение на dup2(%d,%d)"
 
-#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896
-#: builtin/merge.c:1006 builtin/merge.c:1016
+#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
+#: builtin/merge.c:1009 builtin/merge.c:1019
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr ""
 
-#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786
-#: builtin/merge.c:1008 builtin/merge.c:1021
+#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
+#: builtin/merge.c:1011 builtin/merge.c:1024
 #, c-format
 msgid "Could not write to '%s'"
 msgstr ""
@@ -1130,7 +1179,7 @@ msgid ""
 "and commit the result with 'git commit'"
 msgstr ""
 
-#: sequencer.c:245 sequencer.c:870 sequencer.c:953
+#: sequencer.c:245 sequencer.c:879 sequencer.c:962
 #, c-format
 msgid "Could not write to %s"
 msgstr ""
@@ -1156,7 +1205,7 @@ msgstr ""
 #: sequencer.c:325
 #, c-format
 msgid "%s: Unable to write new index file"
-msgstr ""
+msgstr "%s: новият индекс не може да бъде запазен"
 
 #: sequencer.c:356
 msgid "Could not resolve HEAD commit\n"
@@ -1166,184 +1215,184 @@ msgstr ""
 msgid "Unable to update cache tree\n"
 msgstr ""
 
-#: sequencer.c:423
+#: sequencer.c:430
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr ""
 
-#: sequencer.c:428
+#: sequencer.c:435
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr ""
 
-#: sequencer.c:494
+#: sequencer.c:501
 msgid "Your index file is unmerged."
-msgstr ""
+msgstr "Индексът не е слят."
 
-#: sequencer.c:513
+#: sequencer.c:520
 #, c-format
 msgid "Commit %s is a merge but no -m option was given."
 msgstr ""
 
-#: sequencer.c:521
+#: sequencer.c:528
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr ""
 
-#: sequencer.c:525
+#: sequencer.c:532
 #, 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:538
+#: sequencer.c:545
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr ""
 
-#: sequencer.c:542
+#: sequencer.c:549
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr ""
 
-#: sequencer.c:628
+#: sequencer.c:635
 #, c-format
 msgid "could not revert %s... %s"
 msgstr ""
 
-#: sequencer.c:629
+#: sequencer.c:636
 #, c-format
 msgid "could not apply %s... %s"
 msgstr ""
 
-#: sequencer.c:665
+#: sequencer.c:672
 msgid "empty commit set passed"
 msgstr ""
 
-#: sequencer.c:673
+#: sequencer.c:680
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr ""
 
-#: sequencer.c:678
+#: sequencer.c:685
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr ""
 
-#: sequencer.c:736
+#: sequencer.c:743
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr ""
 
-#: sequencer.c:758
+#: sequencer.c:765
 #, c-format
 msgid "Could not parse line %d."
 msgstr ""
 
-#: sequencer.c:763
+#: sequencer.c:770
 msgid "No commits parsed."
 msgstr ""
 
-#: sequencer.c:776
+#: sequencer.c:783
 #, c-format
 msgid "Could not open %s"
 msgstr ""
 
-#: sequencer.c:780
+#: sequencer.c:787
 #, c-format
 msgid "Could not read %s."
 msgstr ""
 
-#: sequencer.c:787
+#: sequencer.c:794
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr ""
 
-#: sequencer.c:815
+#: sequencer.c:824
 #, c-format
 msgid "Invalid key: %s"
 msgstr ""
 
-#: sequencer.c:818
+#: sequencer.c:827
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr ""
 
-#: sequencer.c:830
+#: sequencer.c:839
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr ""
 
-#: sequencer.c:851
+#: sequencer.c:860
 msgid "a cherry-pick or revert is already in progress"
 msgstr ""
 
-#: sequencer.c:852
+#: sequencer.c:861
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr ""
 
-#: sequencer.c:856
+#: sequencer.c:865
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr ""
 
-#: sequencer.c:872 sequencer.c:957
+#: sequencer.c:881 sequencer.c:966
 #, c-format
 msgid "Error wrapping up %s."
 msgstr ""
 
-#: sequencer.c:891 sequencer.c:1025
+#: sequencer.c:900 sequencer.c:1036
 msgid "no cherry-pick or revert in progress"
 msgstr ""
 
-#: sequencer.c:893
+#: sequencer.c:902
 msgid "cannot resolve HEAD"
 msgstr ""
 
-#: sequencer.c:895
+#: sequencer.c:904
 msgid "cannot abort from a branch yet to be born"
 msgstr ""
 
-#: sequencer.c:917 builtin/apply.c:4061
+#: sequencer.c:926 builtin/apply.c:4061
 #, c-format
 msgid "cannot open %s: %s"
 msgstr ""
 
-#: sequencer.c:920
+#: sequencer.c:929
 #, c-format
 msgid "cannot read %s: %s"
 msgstr ""
 
-#: sequencer.c:921
+#: sequencer.c:930
 msgid "unexpected end of file"
 msgstr ""
 
-#: sequencer.c:927
+#: sequencer.c:936
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr ""
 
-#: sequencer.c:950
+#: sequencer.c:959
 #, c-format
 msgid "Could not format %s."
 msgstr ""
 
-#: sequencer.c:1093
+#: sequencer.c:1104
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr ""
 
-#: sequencer.c:1096
+#: sequencer.c:1107
 #, c-format
 msgid "%s: bad revision"
 msgstr ""
 
-#: sequencer.c:1130
+#: sequencer.c:1141
 msgid "Can't revert as initial commit"
 msgstr ""
 
-#: sequencer.c:1131
+#: sequencer.c:1142
 msgid "Can't cherry-pick into empty head"
 msgstr ""
 
@@ -1359,80 +1408,76 @@ msgid ""
 "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"
+"\n"
+"  git checkout -b $BRANCH $(git rev-parse…)\n"
+"\n"
+"където стойността на променливата на средата BRANCH е празна, при което се\n"
+"създава подобен указател. Прегледайте тези указатели и ги изтрийте. Можете "
+"да\n"
+"спрете това съобщение като изпълнете „git config advice.objectNameWarning "
+"false“"
 
-#: sha1_name.c:1109
+#: sha1_name.c:1072
 msgid "HEAD does not point to a branch"
-msgstr ""
+msgstr "Указателят „HEAD“ не сочи към клон"
 
-#: sha1_name.c:1112
+#: sha1_name.c:1075
 #, c-format
 msgid "No such branch: '%s'"
-msgstr ""
+msgstr "Не съществува клон на име „%s“"
 
-#: sha1_name.c:1114
+#: sha1_name.c:1077
 #, c-format
 msgid "No upstream configured for branch '%s'"
-msgstr ""
+msgstr "Не е зададен клон-източник за клона „%s“"
 
-#: sha1_name.c:1118
+#: sha1_name.c:1081
 #, c-format
 msgid "Upstream branch '%s' not stored as a remote-tracking branch"
-msgstr ""
+msgstr "Клонът-източник „%s“ не е съхранен като следящ клон"
 
 #: submodule.c:64 submodule.c:98
 msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
 msgstr ""
+"Неслетите файлове „.gitmodules“ не могат да бъдат променяни. Първо "
+"коригирайте конфликтите"
 
 #: submodule.c:68 submodule.c:102
 #, c-format
 msgid "Could not find section in .gitmodules where path=%s"
-msgstr ""
+msgstr "Във файла „.gitmodules“ липсва раздел за директория „path=%s“"
 
-#. Maybe the user already did that, don't error out here
 #: submodule.c:76
 #, c-format
 msgid "Could not update .gitmodules entry %s"
-msgstr ""
+msgstr "Записът „%s“ във файла „.gitmodules“ не може да бъде променен"
 
-#. Maybe the user already did that, don't error out here
 #: submodule.c:109
 #, c-format
 msgid "Could not remove .gitmodules entry for %s"
-msgstr ""
-
-#: submodule.c:127
-msgid "could not find .gitmodules in index"
-msgstr ""
-
-#: submodule.c:133
-msgid "reading updated .gitmodules failed"
-msgstr ""
-
-#: submodule.c:135
-msgid "unable to stat updated .gitmodules"
-msgstr ""
+msgstr "Записът „%s“ във файла „.gitmodules“ не може да бъде изтрит"
 
-#: submodule.c:139
-msgid "unable to remove .gitmodules from index"
-msgstr ""
-
-#: submodule.c:141
-msgid "adding updated .gitmodules failed"
-msgstr ""
-
-#: submodule.c:143
+#: submodule.c:120
 msgid "staging updated .gitmodules failed"
-msgstr ""
+msgstr "неуспешно добавяне в индекса на променения файл „.gitmodules“"
 
-#: submodule.c:1144 builtin/init-db.c:363
+#: submodule.c:1121 builtin/init-db.c:363
 #, c-format
 msgid "Could not create git link %s"
-msgstr ""
+msgstr "Връзката в Git „%s“ не може да бъде създадена"
 
-#: submodule.c:1155
+#: submodule.c:1132
 #, c-format
 msgid "Could not set core.worktree in %s"
-msgstr ""
+msgstr "В „%s“ не може да се зададе настройката „core.worktree“"
+
+#: unpack-trees.c:206
+msgid "Checking out files"
+msgstr "Изтегляне на файлове"
 
 #: urlmatch.c:120
 msgid "invalid URL scheme name or missing '://' suffix"
@@ -1466,623 +1511,623 @@ msgstr ""
 #: wrapper.c:422
 #, c-format
 msgid "unable to access '%s': %s"
-msgstr ""
+msgstr "няма достъп до „%s“: %s"
 
 #: wrapper.c:443
 #, c-format
 msgid "unable to access '%s'"
-msgstr ""
+msgstr "няма достъп до „%s“"
 
 #: wrapper.c:454
 #, c-format
 msgid "unable to look up current user in the passwd file: %s"
-msgstr ""
+msgstr "текущият потребител не може да бъде открит във файла „/etc/passwd“: %s"
 
 #: wrapper.c:455
 msgid "no such user"
-msgstr ""
+msgstr "такъв потребител не съществува"
 
 #: wt-status.c:150
 msgid "Unmerged paths:"
-msgstr ""
+msgstr "Неслети пътища:"
 
 #: wt-status.c:177 wt-status.c:204
 #, c-format
 msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr ""
+msgstr "  (използвайте „git reset %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)"
 
 #: wt-status.c:179 wt-status.c:206
 msgid "  (use \"git rm --cached <file>...\" to unstage)"
 msgstr ""
+"  (използвайте „git rm --cached %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)"
 
 #: wt-status.c:183
 msgid "  (use \"git add <file>...\" to mark resolution)"
 msgstr ""
+"  (използвайте „git add ФАЙЛ…“, за да укажете разрешаването на конфликта)"
 
 #: wt-status.c:185 wt-status.c:189
 msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
 msgstr ""
+"  (използвайте „git add/rm ФАЙЛ…“, според решението, което избирате за "
+"конфликта)"
 
 #: wt-status.c:187
 msgid "  (use \"git rm <file>...\" to mark resolution)"
 msgstr ""
+"  (използвайте „git rm ФАЙЛ…“, за да укажете разрешаването на конфликта)"
 
 #: wt-status.c:198
 msgid "Changes to be committed:"
-msgstr ""
+msgstr "Промени, които ще бъдат подадени:"
 
 #: wt-status.c:216
 msgid "Changes not staged for commit:"
-msgstr ""
+msgstr "Промени, които не са в индекса за подаване:"
 
 #: wt-status.c:220
 msgid "  (use \"git add <file>...\" to update what will be committed)"
 msgstr ""
+"  (използвайте „git add ФАЙЛ…“, за да обновите съдържанието за подаване)"
 
 #: wt-status.c:222
 msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
 msgstr ""
+"  (използвайте „git add/rm ФАЙЛ…“, за да обновите съдържанието за подаване)"
 
 #: wt-status.c:223
 msgid ""
 "  (use \"git checkout -- <file>...\" to discard changes in working directory)"
 msgstr ""
+"  (използвайте „git checkout -- ФАЙЛ…“, за да отхвърлите промените в "
+"работното дърво)"
 
 #: wt-status.c:225
 msgid "  (commit or discard the untracked or modified content in submodules)"
 msgstr ""
+"  (подайте или отхвърлете неследеното или промененото съдържание в "
+"подмодулите)"
 
 #: wt-status.c:237
 #, c-format
 msgid "  (use \"git %s <file>...\" to include in what will be committed)"
 msgstr ""
+"  (използвайте „git %s ФАЙЛ…“, за да определите какво включвате в подаването)"
 
-#: wt-status.c:254
-msgid "bug"
-msgstr ""
-
-#: wt-status.c:259
+#: wt-status.c:252
 msgid "both deleted:"
-msgstr ""
+msgstr "изтрити в двата случая:"
 
-#: wt-status.c:260
+#: wt-status.c:254
 msgid "added by us:"
-msgstr ""
+msgstr "добавени от вас:"
 
-#: wt-status.c:261
+#: wt-status.c:256
 msgid "deleted by them:"
-msgstr ""
+msgstr "изтрити от тях:"
 
-#: wt-status.c:262
+#: wt-status.c:258
 msgid "added by them:"
-msgstr ""
+msgstr "добавени от тях:"
 
-#: wt-status.c:263
+#: wt-status.c:260
 msgid "deleted by us:"
-msgstr ""
+msgstr "изтрити от нас:"
 
-#: wt-status.c:264
+#: wt-status.c:262
 msgid "both added:"
-msgstr ""
+msgstr "добавени и в двата случая:"
 
-#: wt-status.c:265
+#: wt-status.c:264
 msgid "both modified:"
-msgstr ""
+msgstr "променени и в двата случая:"
 
-#: wt-status.c:275
-msgid "new file"
-msgstr ""
+#: wt-status.c:266
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr "грешка: състоянието на промяната „%x“ не може да бъде обработено"
 
-#: wt-status.c:277
-msgid "copied"
-msgstr ""
+#: wt-status.c:274
+msgid "new file:"
+msgstr "нов файл:"
 
-#: wt-status.c:279
-msgid "deleted"
-msgstr ""
+#: wt-status.c:276
+msgid "copied:"
+msgstr "копиран:"
 
-#: wt-status.c:285
-msgid "typechange"
-msgstr ""
+#: wt-status.c:278
+msgid "deleted:"
+msgstr "изтрит:"
 
-#: wt-status.c:287
-msgid "unknown"
-msgstr ""
+#: wt-status.c:280
+msgid "modified:"
+msgstr "променен:"
 
-#: wt-status.c:289
-msgid "unmerged"
-msgstr ""
+#: wt-status.c:282
+msgid "renamed:"
+msgstr "преименуван:"
 
-#: wt-status.c:336
+#: wt-status.c:284
+msgid "typechange:"
+msgstr "смяна на вида:"
+
+#: wt-status.c:286
+msgid "unknown:"
+msgstr "непозната промяна:"
+
+#: wt-status.c:288
+msgid "unmerged:"
+msgstr "неслят:"
+
+#: wt-status.c:370
 msgid "new commits, "
-msgstr ""
+msgstr "нови подавания, "
 
-#: wt-status.c:338
+#: wt-status.c:372
 msgid "modified content, "
-msgstr ""
+msgstr "променено съдържание, "
 
-#: wt-status.c:340
+#: wt-status.c:374
 msgid "untracked content, "
-msgstr ""
+msgstr "неследено съдържание, "
 
-#: wt-status.c:357
+#: wt-status.c:391
 #, c-format
 msgid "bug: unhandled diff status %c"
-msgstr ""
+msgstr "грешка: състоянието на промяната „%c“ не може да бъде обработено"
 
-#: wt-status.c:732
+#: wt-status.c:765
 msgid "Submodules changed but not updated:"
-msgstr ""
+msgstr "Подмодулите са променени, но не са обновени:"
 
-#: wt-status.c:734
+#: wt-status.c:767
 msgid "Submodule changes to be committed:"
-msgstr ""
+msgstr "Промени в подмодулите за подаване:"
 
-#: wt-status.c:836
+#: wt-status.c:846
 msgid ""
 "Do not touch the line above.\n"
 "Everything below will be removed."
 msgstr ""
+"Не променяйте горния ред.\n"
+"Всичко отдолу ще бъде изтрито."
 
-#: wt-status.c:899
+#: wt-status.c:937
 msgid "You have unmerged paths."
-msgstr ""
+msgstr "Някои пътища не са слети."
 
-#: wt-status.c:902
+#: wt-status.c:940
 msgid "  (fix conflicts and run \"git commit\")"
-msgstr ""
+msgstr "  (коригирайте конфликтите и изпълнете „git commit“)"
 
-#: wt-status.c:905
+#: wt-status.c:943
 msgid "All conflicts fixed but you are still merging."
-msgstr ""
+msgstr "Всички конфликти са решени, но продължавате сливането."
 
-#: wt-status.c:908
+#: wt-status.c:946
 msgid "  (use \"git commit\" to conclude merge)"
-msgstr ""
+msgstr "  (използвайте „git commit“, за да завършите сливането)"
 
-#: wt-status.c:918
+#: wt-status.c:956
 msgid "You are in the middle of an am session."
-msgstr ""
+msgstr "В момента прилагате поредица от кръпки чрез „git am“."
 
-#: wt-status.c:921
+#: wt-status.c:959
 msgid "The current patch is empty."
-msgstr ""
+msgstr "Текущата кръпка е празна."
 
-#: wt-status.c:925
+#: wt-status.c:963
 msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr ""
+msgstr "  (коригирайте конфликтите и изпълнете „git am --continue“)"
 
-#: wt-status.c:927
+#: wt-status.c:965
 msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr ""
+msgstr "  (използвайте „git am --skip“, за да пропуснете тази кръпка)"
 
-#: wt-status.c:929
+#: wt-status.c:967
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr ""
+"  (използвайте „git am --abort“, за да възстановите първоначалния клон)"
 
-#: wt-status.c:989 wt-status.c:1006
+#: wt-status.c:1027 wt-status.c:1044
 #, c-format
 msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr ""
+msgstr "В момента пребазирате клона „%s“ върху „%s“."
 
-#: wt-status.c:994 wt-status.c:1011
+#: wt-status.c:1032 wt-status.c:1049
 msgid "You are currently rebasing."
-msgstr ""
+msgstr "В момента пребазирате."
 
-#: wt-status.c:997
+#: wt-status.c:1035
 msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr ""
+msgstr "  (коригирайте конфликтите и използвайте „git rebase --continue“)"
 
-#: wt-status.c:999
+#: wt-status.c:1037
 msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr ""
+msgstr "  (използвайте „git rebase --skip“, за да пропуснете тази кръпка)"
 
-#: wt-status.c:1001
+#: wt-status.c:1039
 msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr ""
+"  (използвайте „git rebase --abort“, за да възстановите първоначалния клон)"
 
-#: wt-status.c:1014
+#: wt-status.c:1052
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr ""
+msgstr "  (всички конфликти са коригирани: изпълнете „git rebase --continue“)"
 
-#: wt-status.c:1018
+#: wt-status.c:1056
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr ""
+msgstr "В момента разделяте подаване докато пребазирате клона „%s“ върху „%s“."
 
-#: wt-status.c:1023
+#: wt-status.c:1061
 msgid "You are currently splitting a commit during a rebase."
-msgstr ""
+msgstr "В момента разделяте подаване докато пребазирате."
 
-#: wt-status.c:1026
+#: wt-status.c:1064
 msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr ""
+"  (След като работното ви дърво стане чисто, използвайте „git rebase --"
+"continue“)"
 
-#: wt-status.c:1030
+#: wt-status.c:1068
 #, c-format
 msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr ""
+"В момента редактирате подаване докато пребазирате клона „%s“ върху „%s“."
 
-#: wt-status.c:1035
+#: wt-status.c:1073
 msgid "You are currently editing a commit during a rebase."
-msgstr ""
+msgstr "В момента редактирате подаване докато пребазирате."
 
-#: wt-status.c:1038
+#: wt-status.c:1076
 msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr ""
+"  (използвайте „git commit --amend“, за да редактирате текущото подаване)"
 
-#: wt-status.c:1040
+#: wt-status.c:1078
 msgid ""
 "  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr ""
+"  (използвайте „git rebase --continue“, след като завършите промените си)"
 
-#: wt-status.c:1050
+#: wt-status.c:1088
 #, c-format
 msgid "You are currently cherry-picking commit %s."
-msgstr ""
+msgstr "В момента отбирате подаването „%s“."
 
-#: wt-status.c:1055
+#: wt-status.c:1093
 msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr ""
+msgstr "  (коригирайте конфликтите и изпълнете „git cherry-pick --continue“)"
 
-#: wt-status.c:1058
+#: wt-status.c:1096
 msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr ""
+"  (всички конфликти са коригирани, изпълнете „git cherry-pick --continue“)"
 
-#: wt-status.c:1060
+#: wt-status.c:1098
 msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr ""
+"  (използвайте „git cherry-pick --abort“, за да отмените всички действия с "
+"отбиране)"
 
-#: wt-status.c:1069
+#: wt-status.c:1107
 #, c-format
 msgid "You are currently reverting commit %s."
-msgstr ""
+msgstr "В момента отменяте подаване „%s“."
 
-#: wt-status.c:1074
+#: wt-status.c:1112
 msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr ""
+msgstr "  (коригирайте конфликтите и изпълнете „git revert --continue“)"
 
-#: wt-status.c:1077
+#: wt-status.c:1115
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr ""
+msgstr "  (всички конфликти са коригирани, изпълнете „git revert --continue“)"
 
-#: wt-status.c:1079
+#: wt-status.c:1117
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr ""
+"  (използвайте „git revert --abort“, за да преустановите отмяната на "
+"подаване)"
 
-#: wt-status.c:1090
+#: wt-status.c:1128
 #, c-format
 msgid "You are currently bisecting, started from branch '%s'."
-msgstr ""
+msgstr "В момента търсите двоично, като сте стартирали от клон „%s“."
 
-#: wt-status.c:1094
+#: wt-status.c:1132
 msgid "You are currently bisecting."
-msgstr ""
+msgstr "В момента търсите двоично."
 
-#: wt-status.c:1097
+#: wt-status.c:1135
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr ""
+"  (използвайте „git bisect reset“, за да се върнете към първоначалното "
+"състояние и клон)"
 
-#: wt-status.c:1272
+#: wt-status.c:1310
 msgid "On branch "
-msgstr ""
+msgstr "На клон "
 
-#: wt-status.c:1279
+#: wt-status.c:1317
 msgid "rebase in progress; onto "
-msgstr ""
+msgstr "извършвате пребазиране върху "
 
-#: wt-status.c:1286
+#: wt-status.c:1324
 msgid "HEAD detached at "
-msgstr ""
+msgstr "Указателят „HEAD“ не е свързан и е на подаване "
 
-#: wt-status.c:1288
+#: wt-status.c:1326
 msgid "HEAD detached from "
-msgstr ""
+msgstr "Указателят „HEAD“ не е свързан и е отделѐн от "
 
-#: wt-status.c:1291
+#: wt-status.c:1329
 msgid "Not currently on any branch."
-msgstr ""
+msgstr "Извън всички клони"
 
-#: wt-status.c:1308
+#: wt-status.c:1346
 msgid "Initial commit"
-msgstr ""
+msgstr "Първоначално подаване"
 
-#: wt-status.c:1322
+#: wt-status.c:1360
 msgid "Untracked files"
-msgstr ""
+msgstr "Неследени файлове"
 
-#: wt-status.c:1324
+#: wt-status.c:1362
 msgid "Ignored files"
-msgstr ""
+msgstr "Игнорирани файлове"
 
-#: wt-status.c:1328
+#: wt-status.c:1366
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
 "may speed it up, but you have to be careful not to forget to add\n"
 "new files yourself (see 'git help status')."
 msgstr ""
+"Бяха необходими %.2f секунди за изброяването на неследените файлове.\n"
+"Добавянето на опцията „-uno“ към командата „git status“, ще ускори\n"
+"нещата, но не трябва да забравяте ръчно да добавяте новите файлове.\n"
+"За повече подробности погледнете „git status help“."
 
-#: wt-status.c:1334
+#: wt-status.c:1372
 #, c-format
 msgid "Untracked files not listed%s"
-msgstr ""
+msgstr "Неследените файлове не са изведени%s"
 
-#: wt-status.c:1336
+#: wt-status.c:1374
 msgid " (use -u option to show untracked files)"
-msgstr ""
+msgstr " (използвайте опцията „-u“, за да изведете неследените файлове)"
 
-#: wt-status.c:1342
+#: wt-status.c:1380
 msgid "No changes"
-msgstr ""
+msgstr "Няма промени"
 
-#: wt-status.c:1347
+#: wt-status.c:1385
 #, 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:1350
+#: wt-status.c:1388
 #, c-format
 msgid "no changes added to commit\n"
-msgstr ""
+msgstr "към индекса за подаване не са добавени промени\n"
 
-#: wt-status.c:1353
+#: wt-status.c:1391
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
 "track)\n"
 msgstr ""
+"към индекса за подаване не са добавени промени, но има нови файлове "
+"(използвайте „git add“, за да започне тяхното следене)\n"
 
-#: wt-status.c:1356
+#: wt-status.c:1394
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
-msgstr ""
+msgstr "към индекса за подаване не са добавени промени, но има нови файлове\n"
 
-#: wt-status.c:1359
+#: wt-status.c:1397
 #, c-format
 msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
+"липсват каквито и да е промени (създайте или копирайте файлове и използвайте "
+"„git add“, за да започне тяхното следене)\n"
 
-#: wt-status.c:1362 wt-status.c:1367
+#: wt-status.c:1400 wt-status.c:1405
 #, c-format
 msgid "nothing to commit\n"
-msgstr ""
+msgstr "липсват каквито и да е промени\n"
 
-#: wt-status.c:1365
+#: wt-status.c:1403
 #, c-format
 msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
+"липсват каквито и да е промени (използвайте опцията „-u“, за да се изведат и "
+"неследените файлове)\n"
 
-#: wt-status.c:1369
+#: wt-status.c:1407
 #, c-format
 msgid "nothing to commit, working directory clean\n"
-msgstr ""
+msgstr "липсват каквито и да е промени, работното дърво е чисто\n"
 
-#: wt-status.c:1478
+#: wt-status.c:1516
 msgid "HEAD (no branch)"
-msgstr ""
+msgstr "HEAD (извън клон)"
 
-#: wt-status.c:1484
+#: wt-status.c:1522
 msgid "Initial commit on "
-msgstr ""
+msgstr "Първоначално подаване на "
 
-#: wt-status.c:1514
+#: wt-status.c:1554
 msgid "gone"
-msgstr ""
+msgstr "изтрит"
 
-#: wt-status.c:1516
+#: wt-status.c:1556 wt-status.c:1564
 msgid "behind "
-msgstr ""
-
-#: wt-status.c:1519 wt-status.c:1522
-msgid "ahead "
-msgstr ""
-
-#: wt-status.c:1524
-msgid ", behind "
-msgstr ""
+msgstr "назад с "
 
 #: compat/precompose_utf8.c:55 builtin/clone.c:356
 #, c-format
 msgid "failed to unlink '%s'"
-msgstr ""
+msgstr "неуспешно изтриване на „%s“"
 
-#: builtin/add.c:20
+#: builtin/add.c:21
 msgid "git add [options] [--] <pathspec>..."
-msgstr ""
-
-#.
-#. * To be consistent with "git add -p" and most Git
-#. * commands, we should default to being tree-wide, but
-#. * this is not the original behavior and can't be
-#. * changed until users trained themselves not to type
-#. * "git add -u" or "git add -A". For now, we warn and
-#. * keep the old behavior. Later, the behavior can be changed
-#. * to tree-wide, keeping the warning for a while, and
-#. * eventually we can drop the warning.
-#.
-#: builtin/add.c:58
-#, c-format
-msgid ""
-"The behavior of 'git add %s (or %s)' with no path argument from a\n"
-"subdirectory of the tree will change in Git 2.0 and should not be used "
-"anymore.\n"
-"To add content for the whole tree, run:\n"
-"\n"
-"  git add %s :/\n"
-"  (or git add %s :/)\n"
-"\n"
-"To restrict the command to the current directory, run:\n"
-"\n"
-"  git add %s .\n"
-"  (or git add %s .)\n"
-"\n"
-"With the current Git version, the command is restricted to the current "
-"directory.\n"
-msgstr ""
-
-#: builtin/add.c:100
-#, c-format
-msgid ""
-"You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
-"whose behaviour will change in Git 2.0 with respect to paths you removed.\n"
-"Paths like '%s' that are\n"
-"removed from your working tree are ignored with this version of Git.\n"
-"\n"
-"* 'git add --ignore-removal <pathspec>', which is the current default,\n"
-"  ignores paths you removed from your working tree.\n"
-"\n"
-"* 'git add --all <pathspec>' will let you also record the removals.\n"
-"\n"
-"Run 'git status' to check the paths you removed from your working tree.\n"
-msgstr ""
+msgstr "git add [ОПЦИИ] [--] ПЪТ…"
 
-#: builtin/add.c:144
+#: builtin/add.c:64
 #, c-format
 msgid "unexpected diff status %c"
-msgstr ""
+msgstr "неочакван изходен код при генериране на разлика: %c"
 
-#: builtin/add.c:149 builtin/commit.c:260
+#: builtin/add.c:69 builtin/commit.c:261
 msgid "updating files failed"
-msgstr ""
+msgstr "неуспешно обновяване на файловете"
 
-#: builtin/add.c:163
+#: builtin/add.c:79
 #, c-format
 msgid "remove '%s'\n"
-msgstr ""
+msgstr "изтриване на „%s“\n"
 
-#: builtin/add.c:237
+#: builtin/add.c:133
 msgid "Unstaged changes after refreshing the index:"
-msgstr ""
+msgstr "Промени, които и след обновяването на индекса не са добавени към него:"
 
-#: builtin/add.c:299
+#: builtin/add.c:193
 msgid "Could not read the index"
-msgstr ""
+msgstr "Индексът не може да бъде прочетен"
 
-#: builtin/add.c:310
+#: builtin/add.c:204
 #, c-format
 msgid "Could not open '%s' for writing."
-msgstr ""
+msgstr "Файлът „%s“ не може да бъде отворен за запис."
 
-#: builtin/add.c:314
+#: builtin/add.c:208
 msgid "Could not write patch"
-msgstr ""
+msgstr "Кръпката не може да бъде записана"
 
-#: builtin/add.c:319
+#: builtin/add.c:213
 #, c-format
 msgid "Could not stat '%s'"
-msgstr ""
+msgstr "Не може да се получи информация чрез „stat“ за файла „%s“"
 
-#: builtin/add.c:321
+#: builtin/add.c:215
 msgid "Empty patch. Aborted."
-msgstr ""
+msgstr "Празна кръпка, преустановяване на действието."
 
-#: builtin/add.c:327
+#: builtin/add.c:221
 #, c-format
 msgid "Could not apply '%s'"
-msgstr ""
+msgstr "Кръпката „%s“ не може да бъде приложена"
 
-#: builtin/add.c:337
+#: builtin/add.c:231
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr ""
+"Следните пътища ще бъдат игнорирани според някой от файловете „.gitignore“:\n"
 
-#: builtin/add.c:354 builtin/clean.c:875 builtin/fetch.c:93 builtin/mv.c:70
-#: builtin/prune-packed.c:77 builtin/push.c:506 builtin/remote.c:1344
+#: 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/rm.c:269
 msgid "dry run"
 msgstr "пробно изпълнeние"
 
-#: builtin/add.c:355 builtin/apply.c:4410 builtin/check-ignore.c:19
-#: builtin/commit.c:1249 builtin/count-objects.c:95 builtin/fsck.c:612
+#: 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
 msgid "be verbose"
 msgstr "повече подробности"
 
-#: builtin/add.c:357
+#: builtin/add.c:251
 msgid "interactive picking"
-msgstr ""
+msgstr "интерактивно отбиране на промени"
 
-#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
 msgid "select hunks interactively"
-msgstr ""
+msgstr "интерактивен избор на парчета код"
 
-#: builtin/add.c:359
+#: builtin/add.c:253
 msgid "edit current diff and apply"
-msgstr ""
+msgstr "редактиране на текущата разлика и прилагане"
 
-#: builtin/add.c:360
+#: builtin/add.c:254
 msgid "allow adding otherwise ignored files"
-msgstr ""
+msgstr "добавяне и на иначе игнорираните файлове"
 
-#: builtin/add.c:361
+#: builtin/add.c:255
 msgid "update tracked files"
-msgstr ""
+msgstr "обновяване на следените файлове"
 
-#: builtin/add.c:362
+#: builtin/add.c:256
 msgid "record only the fact that the path will be added later"
-msgstr ""
+msgstr "отбелязване само на факта, че пътят ще бъде добавен по-късно"
 
-#: builtin/add.c:363
+#: builtin/add.c:257
 msgid "add changes from all tracked and untracked files"
-msgstr ""
+msgstr "добавяне на всички промени в следените и неследените файлове"
 
-#. takes no arguments
-#: builtin/add.c:366
+#: builtin/add.c:260
 msgid "ignore paths removed in the working tree (same as --no-all)"
 msgstr ""
+"игнориране на пътищата, които са изтрити от работното дърво (същото като „--"
+"no-all“)"
 
-#: builtin/add.c:368
+#: builtin/add.c:262
 msgid "don't add, only refresh the index"
-msgstr ""
+msgstr "без добавяне на нови файлове, само обновяване на индекса"
 
-#: builtin/add.c:369
+#: builtin/add.c:263
 msgid "just skip files which cannot be added because of errors"
 msgstr ""
+"прескачане на файловете, които не могат да бъдат добавени поради грешки"
 
-#: builtin/add.c:370
+#: builtin/add.c:264
 msgid "check if - even missing - files are ignored in dry run"
 msgstr ""
+"проверка, че при пробно изпълнение всички файлове, дори и изтритите, се "
+"игнорират"
 
-#: builtin/add.c:392
+#: builtin/add.c:286
 #, c-format
 msgid "Use -f if you really want to add them.\n"
-msgstr ""
+msgstr "Използвайте опцията „-f“, ако наистина искате да ги добавите.\n"
 
-#: builtin/add.c:393
+#: builtin/add.c:287
 msgid "no files added"
-msgstr ""
+msgstr "не са добавени файлове"
 
-#: builtin/add.c:399
+#: builtin/add.c:293
 msgid "adding files failed"
-msgstr ""
+msgstr "неуспешно добавяне на файлове"
 
-#: builtin/add.c:438
+#: builtin/add.c:330
 msgid "-A and -u are mutually incompatible"
-msgstr ""
+msgstr "опциите „-A“ и „-u“ са несъвместими"
 
-#: builtin/add.c:456
+#: builtin/add.c:337
 msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr ""
+msgstr "Опцията „--ignore-missing“ е съвместима само с „--dry-run“"
 
-#: builtin/add.c:486
+#: builtin/add.c:358
 #, c-format
 msgid "Nothing specified, nothing added.\n"
-msgstr ""
+msgstr "Нищо не е зададено и нищо не е добавено.\n"
 
-#: builtin/add.c:487
+#: builtin/add.c:359
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr ""
+msgstr "Вероятно искахте да използвате „git add .“?\n"
 
-#: builtin/add.c:492 builtin/check-ignore.c:172 builtin/clean.c:919
-#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:224 builtin/rm.c:299
+#: 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
 msgid "index file corrupt"
 msgstr "файлът с индекса е повреден"
 
-#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432
+#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
 msgid "Unable to write new index file"
-msgstr "Новият файл с индекса не може да бъде записан"
+msgstr "Новият индекс не може да бъде записан"
 
 #: builtin/apply.c:57
 msgid "git apply [options] [<patch>...]"
@@ -2177,17 +2222,17 @@ msgstr ""
 msgid "deleted file %s still has contents"
 msgstr ""
 
+# FIXME - double **??
 #: builtin/apply.c:1725
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
-msgstr ""
+msgstr "●● предупреждение: файлът „%s“ вече е празен, но не е изтрит"
 
 #: builtin/apply.c:1871
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr ""
 
-#. there has to be one hunk (forward hunk)
 #: builtin/apply.c:1900
 #, c-format
 msgid "unrecognized binary patch at line %d"
@@ -2326,10 +2371,10 @@ msgstr ""
 msgid "Checking patch %s..."
 msgstr ""
 
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127
+#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
-msgstr ""
+msgstr "неуспешно създаване на запис в кеша чрез „make_cache_entry“ за „%s“"
 
 #: builtin/apply.c:3823
 #, c-format
@@ -2375,7 +2420,6 @@ msgstr ""
 msgid "internal error"
 msgstr ""
 
-#. Say this even without --verbose
 #: builtin/apply.c:4043
 #, c-format
 msgid "Applying patch %%s with %d reject..."
@@ -2404,12 +2448,12 @@ msgstr ""
 
 #: builtin/apply.c:4238
 msgid "unable to read index file"
-msgstr ""
+msgstr "индексът не може да бъде записан"
 
 #: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90
 #: builtin/fetch.c:78
 msgid "path"
-msgstr ""
+msgstr "път"
 
 #: builtin/apply.c:4358
 msgid "don't apply changes matching the given path"
@@ -2467,14 +2511,13 @@ msgstr ""
 msgid "build a temporary index based on embedded index information"
 msgstr ""
 
-#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452
+#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
 msgid "paths are separated with NUL character"
-msgstr ""
+msgstr "разделяне на пътищата с нулевия знак „NUL“"
 
 #: builtin/apply.c:4392
-#, fuzzy
 msgid "ensure at least <n> lines of context match"
-msgstr "<брой>"
+msgstr "да се осигури контекст от поне такъв БРОЙ съвпадащи редове"
 
 #: builtin/apply.c:4393
 msgid "action"
@@ -2588,132 +2631,150 @@ msgstr ""
 
 #: builtin/bisect--helper.c:7
 msgid "git bisect--helper --next-all [--no-checkout]"
-msgstr ""
+msgstr "git bisect--helper --next-all [--no-checkout]"
 
 #: builtin/bisect--helper.c:17
 msgid "perform 'git bisect next'"
-msgstr ""
+msgstr "извършване на „git bisect next“"
 
 #: builtin/bisect--helper.c:19
 msgid "update BISECT_HEAD instead of checking out the current commit"
 msgstr ""
+"обновяване на указателя „BISECT_HEAD“ вместо да се използва текущото подаване"
 
 #: builtin/blame.c:27
 msgid "git blame [options] [rev-opts] [rev] [--] file"
-msgstr ""
+msgstr "git blame [ОПЦИИ] [ОПЦИИ_ЗА_ВЕРСИЯТА] [ВЕРСИЯ] [--] ФАЙЛ"
 
 #: builtin/blame.c:32
 msgid "[rev-opts] are documented in git-rev-list(1)"
-msgstr ""
+msgstr "ОПЦИИте_ЗА_ВЕРСИЯТА са документирани в ръководството git-rev-list(1)"
 
-#: builtin/blame.c:2249
+#: builtin/blame.c:2242
 msgid "Show blame entries as we find them, incrementally"
-msgstr ""
+msgstr "Извеждане на анотациите с намирането им, последователно"
 
-# FIXME
-#: builtin/blame.c:2250
+# FIXME SHA-1 -> SHA1
+#: builtin/blame.c:2243
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr ""
+"Извеждане на празни суми по SHA1 за граничните подавания (стандартно опцията "
+"е изключена)"
 
-#: builtin/blame.c:2251
+#: builtin/blame.c:2244
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr ""
+"Началните подавания да не се считат за гранични (стандартно опцията е "
+"изключена)"
 
-#: builtin/blame.c:2252
+#: builtin/blame.c:2245
 msgid "Show work cost statistics"
-msgstr ""
+msgstr "Извеждане на статистика за извършените действия"
 
-#: builtin/blame.c:2253
+#: builtin/blame.c:2246
 msgid "Show output score for blame entries"
-msgstr ""
+msgstr "Извеждане на допълнителна информация за определянето на анотациите"
 
-#: builtin/blame.c:2254
+#: builtin/blame.c:2247
 msgid "Show original filename (Default: auto)"
 msgstr ""
+"Извеждане на първоначалното име на файл (стандартно това е автоматично)"
 
-#: builtin/blame.c:2255
+#: builtin/blame.c:2248
 msgid "Show original linenumber (Default: off)"
 msgstr ""
+"Извеждане на първоначалният номер на ред (стандартно опцията е изключена)"
 
-#: builtin/blame.c:2256
+#: builtin/blame.c:2249
 msgid "Show in a format designed for machine consumption"
-msgstr ""
+msgstr "Извеждане във формат за по-нататъшна обработка"
 
-#: builtin/blame.c:2257
+#: builtin/blame.c:2250
 msgid "Show porcelain format with per-line commit information"
 msgstr ""
+"Извеждане във формат за по-нататъшна обработка с информация на всеки ред"
 
-#: builtin/blame.c:2258
+#: builtin/blame.c:2251
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr ""
+"Използване на същия формат като „git-annotate“ (стандартно опцията е "
+"изключена)"
 
-#: builtin/blame.c:2259
+#: builtin/blame.c:2252
 msgid "Show raw timestamp (Default: off)"
-msgstr ""
+msgstr "Извеждане на неформатирани времена (стандартно опцията е изключена)"
 
-#: builtin/blame.c:2260
+#: builtin/blame.c:2253
 msgid "Show long commit SHA1 (Default: off)"
-msgstr ""
+msgstr "Извеждане на пълните суми по SHA1 (стандартно опцията е изключена)"
 
-#: builtin/blame.c:2261
+#: builtin/blame.c:2254
 msgid "Suppress author name and timestamp (Default: off)"
-msgstr ""
+msgstr "Без име на автор и време на промяна(стандартно опцията е изключена)"
 
-#: builtin/blame.c:2262
+#: builtin/blame.c:2255
 msgid "Show author email instead of name (Default: off)"
 msgstr ""
+"Извеждане на е-пощата на автора, а не името му (стандартно опцията е "
+"изключена)"
 
-#: builtin/blame.c:2263
+#: builtin/blame.c:2256
 msgid "Ignore whitespace differences"
-msgstr ""
+msgstr "Без разлики в знаците за интервали"
 
-#: builtin/blame.c:2264
+#: builtin/blame.c:2257
 msgid "Spend extra cycles to find better match"
-msgstr ""
+msgstr "Допълнителни изчисления за по-добри резултати"
 
-#: builtin/blame.c:2265
+#: builtin/blame.c:2258
 msgid "Use revisions from <file> instead of calling git-rev-list"
-msgstr ""
+msgstr "Изчитане на версиите от ФАЙЛ, а не чрез изпълнение на „git-rev-list“"
 
-#: builtin/blame.c:2266
+#: builtin/blame.c:2259
 msgid "Use <file>'s contents as the final image"
-msgstr ""
+msgstr "Използване на съдържанието на ФАЙЛа като крайно положение"
 
-#: builtin/blame.c:2267 builtin/blame.c:2268
+#: builtin/blame.c:2260 builtin/blame.c:2261
 msgid "score"
-msgstr ""
+msgstr "напасване на редовете"
 
-#: builtin/blame.c:2267
+#: builtin/blame.c:2260
 msgid "Find line copies within and across files"
 msgstr ""
+"Търсене на копирани редове както в рамките на един файл, така и от един файл "
+"към друг"
 
-#: builtin/blame.c:2268
+#: builtin/blame.c:2261
 msgid "Find line movements within and across files"
 msgstr ""
+"Търсене на преместени редове както в рамките на един файл, така и от един "
+"файл към друг"
 
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
 msgid "n,m"
-msgstr ""
+msgstr "n,m"
 
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
 msgid "Process only line range n,m, counting from 1"
 msgstr ""
+"Информация само за редовете в интервала от n до m включително. Броенето "
+"започва от 1"
 
 #: builtin/branch.c:24
 msgid "git branch [options] [-r | -a] [--merged | --no-merged]"
-msgstr ""
+msgstr "git branch [ОПЦИИ] [-r | -a] [--merged | --no-merged]"
 
 #: builtin/branch.c:25
 msgid "git branch [options] [-l] [-f] <branchname> [<start-point>]"
-msgstr ""
+msgstr "git branch [ОПЦИИ] [-l] [-f] ИМЕ_НА_КЛОН [НАЧАЛО]"
 
 #: builtin/branch.c:26
 msgid "git branch [options] [-r] (-d | -D) <branchname>..."
-msgstr ""
+msgstr "git branch [ОПЦИИ] [-r] (-d | -D) ИМЕ_НА_КЛОН…"
 
 #: builtin/branch.c:27
 msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>"
-msgstr ""
+msgstr "git branch [ОПЦИИ] (-m | -M) [СТАР_КЛОН] НОВ_КЛОН"
 
 #: builtin/branch.c:150
 #, c-format
@@ -2721,6 +2782,8 @@ msgid ""
 "deleting branch '%s' that has been merged to\n"
 "         '%s', but not yet merged to HEAD."
 msgstr ""
+"изтриване на клона „%s“, който е слят към „%s“,\n"
+"         но още не е слят към върха „HEAD“."
 
 #: builtin/branch.c:154
 #, c-format
@@ -2728,11 +2791,13 @@ msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
 "         '%s', even though it is merged to HEAD."
 msgstr ""
+"отказване на изтриване на клона „%s“, който не е слят към\n"
+"         „%s“, но е слят към върха „HEAD“."
 
 #: builtin/branch.c:168
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
-msgstr ""
+msgstr "Обектът-подаване за „%s“ не може да бъде открит"
 
 #: builtin/branch.c:172
 #, c-format
@@ -2740,336 +2805,346 @@ msgid ""
 "The branch '%s' is not fully merged.\n"
 "If you are sure you want to delete it, run 'git branch -D %s'."
 msgstr ""
+"Клонът „%s“ не е слят напълно. Ако сте сигурни, че искате\n"
+"да го изтриете, изпълнете „git branch -D %s“."
 
 #: builtin/branch.c:185
 msgid "Update of config-file failed"
-msgstr ""
+msgstr "Неуспешно обновяване на конфигурационния файл"
 
 #: builtin/branch.c:213
 msgid "cannot use -a with -d"
-msgstr ""
+msgstr "Опцията „-a“ е несъвместима с опцията „-d“"
 
 #: builtin/branch.c:219
 msgid "Couldn't look up commit object for HEAD"
-msgstr ""
+msgstr "Обектът-подаване, сочен от указателя „HEAD“, не може да бъде открит"
 
 #: builtin/branch.c:227
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
-msgstr ""
+msgstr "Не можете да изтриете клона „%s“, защото в момента е текущ."
 
 #: builtin/branch.c:240
 #, c-format
 msgid "remote branch '%s' not found."
-msgstr ""
+msgstr "отдалеченият клон „%s“ не може да бъде открит."
 
 #: builtin/branch.c:241
 #, c-format
 msgid "branch '%s' not found."
-msgstr ""
+msgstr "клонът „%s“ не може да бъде открит."
 
 #: builtin/branch.c:255
 #, c-format
 msgid "Error deleting remote branch '%s'"
-msgstr ""
+msgstr "Грешка при изтриването на отдалечения клон „%s“"
 
 #: builtin/branch.c:256
 #, c-format
 msgid "Error deleting branch '%s'"
-msgstr ""
+msgstr "Грешка при изтриването на клона „%s“"
 
 #: builtin/branch.c:263
 #, c-format
 msgid "Deleted remote branch %s (was %s).\n"
-msgstr ""
+msgstr "Изтрит отдалечен клон „%s“ (той сочеше към „%s“).\n"
 
 #: builtin/branch.c:264
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
-msgstr ""
+msgstr "Изтрит клон „%s“ (той сочеше към „%s“).\n"
 
 #: builtin/branch.c:366
 #, c-format
 msgid "branch '%s' does not point at a commit"
-msgstr ""
+msgstr "клонът „%s“ не сочи към подаване"
 
 #: builtin/branch.c:454
 #, c-format
 msgid "[%s: gone]"
-msgstr ""
+msgstr "[%s: изтрит]"
 
 #: builtin/branch.c:459
 #, c-format
 msgid "[%s]"
-msgstr ""
+msgstr "[%s]"
 
 #: builtin/branch.c:464
 #, c-format
 msgid "[%s: behind %d]"
-msgstr ""
+msgstr "[%s: назад с %d]"
 
 #: builtin/branch.c:466
 #, c-format
 msgid "[behind %d]"
-msgstr ""
+msgstr "[назад с %d]"
 
 #: builtin/branch.c:470
 #, c-format
 msgid "[%s: ahead %d]"
-msgstr ""
+msgstr "[%s: напред с %d]"
 
 #: builtin/branch.c:472
 #, c-format
 msgid "[ahead %d]"
-msgstr ""
+msgstr "[напред с %d]"
 
 #: builtin/branch.c:475
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
-msgstr ""
+msgstr "[%s: напред с %d, назад с %d]"
 
 #: builtin/branch.c:478
 #, c-format
 msgid "[ahead %d, behind %d]"
-msgstr ""
+msgstr "[напред с %d, назад с %d]"
 
+# FIXME ** how many??
 #: builtin/branch.c:502
 msgid " **** invalid ref ****"
-msgstr ""
+msgstr " ●●●● неправилен указател ●●●●"
 
 #: builtin/branch.c:594
 #, c-format
 msgid "(no branch, rebasing %s)"
-msgstr ""
+msgstr "(извън клон, пребазиране на „%s“)"
 
 #: builtin/branch.c:597
 #, c-format
 msgid "(no branch, bisect started on %s)"
-msgstr ""
+msgstr "(извън клон, двоично търсене от „%s“)"
 
 #: builtin/branch.c:600
 #, c-format
 msgid "(detached from %s)"
-msgstr ""
+msgstr "(състояние, несвързано към „%s“)"
 
 #: builtin/branch.c:603
 msgid "(no branch)"
-msgstr ""
+msgstr "(извън клон)"
 
 #: builtin/branch.c:649
 #, c-format
 msgid "object '%s' does not point to a commit"
-msgstr ""
+msgstr "обектът „%s“ не сочи към подаване"
 
 #: builtin/branch.c:681
 msgid "some refs could not be read"
-msgstr ""
+msgstr "някои указатели не могат да бъдат прочетени"
 
 #: builtin/branch.c:694
 msgid "cannot rename the current branch while not on any."
 msgstr ""
+"не можете да преименувате текущия клон, защото сте извън който и да е клон"
 
 #: builtin/branch.c:704
 #, c-format
 msgid "Invalid branch name: '%s'"
-msgstr ""
+msgstr "Неправилно име на клон: „%s“"
 
 #: builtin/branch.c:719
 msgid "Branch rename failed"
-msgstr ""
+msgstr "Неуспешно преименуване на клон"
 
 #: builtin/branch.c:723
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
-msgstr ""
+msgstr "На клона с неправилно име „%s“ е дадено служебно име"
 
 #: builtin/branch.c:727
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
-msgstr ""
+msgstr "Клонът е преименуван на „%s“, но указателят „HEAD“ не е преименуван"
 
 #: builtin/branch.c:734
 msgid "Branch is renamed, but update of config-file failed"
-msgstr ""
+msgstr "Клонът е преименуван, но конфигурационният файл не бе обновен"
 
 #: builtin/branch.c:749
 #, c-format
 msgid "malformed object name %s"
-msgstr ""
+msgstr "неправилно име на обект „%s“"
 
 #: builtin/branch.c:773
 #, c-format
 msgid "could not write branch description template: %s"
-msgstr ""
+msgstr "шаблонът за описание на клон не бе записан: „%s“"
 
 #: builtin/branch.c:803
 msgid "Generic options"
-msgstr ""
+msgstr "Общи настройки"
 
 #: builtin/branch.c:805
 msgid "show hash and subject, give twice for upstream branch"
 msgstr ""
+"извеждане на хеша и темата. Повтарянето на опцията прибавя отдалечените клони"
 
 #: builtin/branch.c:806
 msgid "suppress informational messages"
-msgstr ""
+msgstr "без информационни съобщения"
 
 #: builtin/branch.c:807
 msgid "set up tracking mode (see git-pull(1))"
-msgstr ""
+msgstr "задаване на режима на следене (виж git-pull(1))"
 
 #: builtin/branch.c:809
 msgid "change upstream info"
-msgstr ""
+msgstr "смяна на следения клон"
 
 #: builtin/branch.c:813
 msgid "use colored output"
-msgstr ""
+msgstr "цветен изход"
 
 #: builtin/branch.c:814
 msgid "act on remote-tracking branches"
-msgstr ""
+msgstr "действие върху следящите клони"
 
 #: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844
-#: builtin/branch.c:850 builtin/commit.c:1460 builtin/commit.c:1461
-#: builtin/commit.c:1462 builtin/commit.c:1463 builtin/tag.c:468
+#: 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
 msgid "commit"
-msgstr ""
+msgstr "подаване"
 
 #: builtin/branch.c:818 builtin/branch.c:824
 msgid "print only branches that contain the commit"
-msgstr ""
+msgstr "извеждане само на клоните, които съдържат това подаване"
 
 #: builtin/branch.c:830
 msgid "Specific git-branch actions:"
-msgstr ""
+msgstr "Специални действия на „git-branch“:"
 
 #: builtin/branch.c:831
 msgid "list both remote-tracking and local branches"
-msgstr ""
+msgstr "извеждане както на следящите, така и на локалните клони"
 
 #: builtin/branch.c:833
 msgid "delete fully merged branch"
-msgstr ""
+msgstr "изтриване на клони, които са напълно слети"
 
 #: builtin/branch.c:834
 msgid "delete branch (even if not merged)"
-msgstr ""
+msgstr "изтриване и на клони, които не са напълно слети"
 
 #: builtin/branch.c:835
 msgid "move/rename a branch and its reflog"
 msgstr ""
+"преместване/преименуване на клон и принадлежащият му журнал на указателите"
 
 #: builtin/branch.c:836
 msgid "move/rename a branch, even if target exists"
-msgstr ""
+msgstr "преместване/преименуване на клон, дори ако има вече клон с такова име"
 
 #: builtin/branch.c:837
 msgid "list branch names"
-msgstr ""
+msgstr "извеждане на имената на клоните"
 
 #: builtin/branch.c:838
 msgid "create the branch's reflog"
-msgstr ""
+msgstr "създаване на журнала на указателите на клона"
 
 #: builtin/branch.c:840
 msgid "edit the description for the branch"
-msgstr ""
+msgstr "редактиране на описанието на клона"
 
 #: builtin/branch.c:841
 msgid "force creation (when already exists)"
-msgstr ""
+msgstr "принудително създаване, дори ако съществува клон с такова име"
 
 #: builtin/branch.c:844
 msgid "print only not merged branches"
-msgstr ""
+msgstr "извеждане само на неслетите клони"
 
 #: builtin/branch.c:850
 msgid "print only merged branches"
-msgstr ""
+msgstr "извеждане само на слетите клони"
 
 #: builtin/branch.c:854
 msgid "list branches in columns"
-msgstr ""
+msgstr "извеждане по колони"
 
 #: builtin/branch.c:867
 msgid "Failed to resolve HEAD as a valid ref."
-msgstr ""
+msgstr "Не може да се открие към какво сочи указателят „HEAD“"
 
 #: builtin/branch.c:872 builtin/clone.c:635
 msgid "HEAD not found below refs/heads!"
-msgstr ""
+msgstr "В директорията „refs/heads“ липсва файл „HEAD“"
 
 #: builtin/branch.c:896
 msgid "--column and --verbose are incompatible"
-msgstr ""
+msgstr "Опциите „--column“ и „--verbose“ са несъвместими"
 
 #: builtin/branch.c:902 builtin/branch.c:941
 msgid "branch name required"
-msgstr ""
+msgstr "Необходимо е име на клон"
 
 #: builtin/branch.c:917
 msgid "Cannot give description to detached HEAD"
-msgstr ""
+msgstr "Не може да зададете описание на „HEAD“ извън клон"
 
 #: builtin/branch.c:922
 msgid "cannot edit description of more than one branch"
-msgstr ""
+msgstr "Не може да редактирате описанието на повече от един клон едновременно"
 
 #: builtin/branch.c:929
 #, c-format
 msgid "No commit on branch '%s' yet."
-msgstr ""
+msgstr "В клона „%s“ все още няма подавания."
 
 #: builtin/branch.c:932
 #, c-format
 msgid "No branch named '%s'."
-msgstr ""
+msgstr "Липсва клон на име „%s“."
 
 #: builtin/branch.c:947
 msgid "too many branches for a rename operation"
-msgstr ""
+msgstr "Прекалено много клони за преименуване"
 
 #: builtin/branch.c:952
 msgid "too many branches to set new upstream"
-msgstr ""
+msgstr "Прекалено много клони за задаване на следене"
 
 #: builtin/branch.c:956
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
 msgstr ""
+"Следеното от „HEAD“ не може да се зададе да е „%s“, защото то не сочи към "
+"никой клон."
 
 #: builtin/branch.c:959 builtin/branch.c:981 builtin/branch.c:1002
 #, c-format
 msgid "no such branch '%s'"
-msgstr ""
+msgstr "Няма клон на име „%s“."
 
 #: builtin/branch.c:963
 #, c-format
 msgid "branch '%s' does not exist"
-msgstr ""
+msgstr "Не съществува клон на име „%s“."
 
 #: builtin/branch.c:975
 msgid "too many branches to unset upstream"
-msgstr ""
+msgstr "Прекалено много клони за махане на следене"
 
 #: builtin/branch.c:979
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
+"Следеното от „HEAD“ не може да махне, защото то не сочи към никой клон."
 
 #: builtin/branch.c:985
 #, c-format
 msgid "Branch '%s' has no upstream information"
-msgstr ""
+msgstr "Няма информация клонът „%s“ да следи някой друг"
 
 #: builtin/branch.c:999
 msgid "it does not make sense to create 'HEAD' manually"
-msgstr ""
+msgstr "Няма никакъв смисъл ръчно да създавате „HEAD“."
 
 #: builtin/branch.c:1005
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
-msgstr ""
+msgstr "Опциите „-a“ и „-r“ на „git branch“ са несъвместими с име на клон"
 
 #: builtin/branch.c:1008
 #, c-format
@@ -3077,6 +3152,8 @@ msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
 "track or --set-upstream-to\n"
 msgstr ""
+"Опцията „--set-upstream“ вече е остаряла и предстои да бъде махната. "
+"Използвайте „--track“ или „--set-upstream-to“\n"
 
 #: builtin/branch.c:1025
 #, c-format
@@ -3085,16 +3162,19 @@ msgid ""
 "If you wanted to make '%s' track '%s', do this:\n"
 "\n"
 msgstr ""
+"\n"
+"За да накарате „%s“ да следи „%s“, изпълнете следната команда:\n"
+"\n"
 
 #: builtin/branch.c:1026
 #, c-format
 msgid "    git branch -d %s\n"
-msgstr ""
+msgstr "    git branch -d %s\n"
 
 #: builtin/branch.c:1027
 #, c-format
 msgid "    git branch --set-upstream-to %s\n"
-msgstr ""
+msgstr "    git branch --set-upstream-to %s\n"
 
 #: builtin/bundle.c:47
 #, c-format
@@ -3109,71 +3189,71 @@ msgstr ""
 msgid "Need a repository to unbundle."
 msgstr ""
 
-#: builtin/cat-file.c:328
+#: builtin/cat-file.c:331
 msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
 msgstr ""
 
-#: builtin/cat-file.c:329
+#: builtin/cat-file.c:332
 msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
 msgstr ""
 
-#: builtin/cat-file.c:366
+#: builtin/cat-file.c:369
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr ""
 
-#: builtin/cat-file.c:367
+#: builtin/cat-file.c:370
 msgid "show object type"
 msgstr ""
 
-#: builtin/cat-file.c:368
+#: builtin/cat-file.c:371
 msgid "show object size"
 msgstr ""
 
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:373
 msgid "exit with zero when there's no error"
 msgstr ""
 
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:374
 msgid "pretty-print object's content"
 msgstr ""
 
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:376
 msgid "for blob objects, run textconv on object's content"
 msgstr ""
 
-#: builtin/cat-file.c:375
+#: builtin/cat-file.c:378
 msgid "show info and content of objects fed from the standard input"
 msgstr ""
 
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:381
 msgid "show info about objects fed from the standard input"
 msgstr ""
 
 #: builtin/check-attr.c:11
 msgid "git check-attr [-a | --all | attr...] [--] pathname..."
-msgstr ""
+msgstr "git check-attr [-a | --all | АТРИБУТ…] [--] ПЪТ…"
 
 #: builtin/check-attr.c:12
 msgid "git check-attr --stdin [-z] [-a | --all | attr...] < <list-of-paths>"
-msgstr ""
+msgstr "git check-attr --stdin [-z] [-a | --all | АТРИБУТ…] < СПИСЪК_С_ПЪТИЩА"
 
 #: builtin/check-attr.c:19
 msgid "report all attributes set on file"
-msgstr ""
+msgstr "извеждане на всички атрибути, зададени върху файл"
 
 #: builtin/check-attr.c:20
 msgid "use .gitattributes only from the index"
-msgstr ""
+msgstr "използване на файла „.gitattributes“ само от индекса"
 
 #: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:75
 msgid "read file names from stdin"
-msgstr ""
+msgstr "изчитане на имената на файловете от стандартния вход"
 
 #: builtin/check-attr.c:23 builtin/check-ignore.c:24
 msgid "terminate input and output records by a NUL character"
-msgstr ""
+msgstr "разделяне на входните и изходните записи с нулевия знак „NUL“"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
 msgid "suppress progress reporting"
 msgstr "без показване на напредъка"
 
@@ -3211,20 +3291,20 @@ msgstr ""
 
 #: builtin/check-mailmap.c:8
 msgid "git check-mailmap [options] <contact>..."
-msgstr ""
+msgstr "git check-mailmap [ОПЦИИ] КОНТАКТ…"
 
 #: builtin/check-mailmap.c:13
 msgid "also read contacts from stdin"
-msgstr ""
+msgstr "четене на контакти и от стандартния вход"
 
 #: builtin/check-mailmap.c:24
 #, c-format
 msgid "unable to parse contact: %s"
-msgstr ""
+msgstr "контактът не може да бъде анализиран: %s"
 
 #: builtin/check-mailmap.c:47
 msgid "no contacts specified"
-msgstr ""
+msgstr "не са указани контакти"
 
 #: builtin/checkout-index.c:126
 msgid "git checkout-index [options] [--] [<file>...]"
@@ -3248,7 +3328,7 @@ msgstr ""
 
 #: builtin/checkout-index.c:194
 msgid "update stat information in the index file"
-msgstr ""
+msgstr "обновяване на информацията получена чрез „stat“ за файловете в индекса"
 
 #: builtin/checkout-index.c:200
 msgid "read list of paths from the standard input"
@@ -3272,112 +3352,115 @@ msgstr ""
 
 #: builtin/checkout.c:25
 msgid "git checkout [options] <branch>"
-msgstr ""
+msgstr "git checkout [ОПЦИИ] КЛОН"
 
 #: builtin/checkout.c:26
 msgid "git checkout [options] [<branch>] -- <file>..."
-msgstr ""
+msgstr "git checkout [ОПЦИИ] [КЛОН] -- ФАЙЛ…"
 
 #: builtin/checkout.c:114 builtin/checkout.c:147
 #, c-format
 msgid "path '%s' does not have our version"
-msgstr ""
+msgstr "вашата версия липсва в пътя „%s“"
 
 #: builtin/checkout.c:116 builtin/checkout.c:149
 #, c-format
 msgid "path '%s' does not have their version"
-msgstr ""
+msgstr "чуждата версия липсва в пътя „%s“"
 
+# FIXME SAME AS [1]
 #: builtin/checkout.c:132
 #, c-format
 msgid "path '%s' does not have all necessary versions"
-msgstr ""
+msgstr "някоя от необходимите версии липсва в пътя „%s“"
 
+# FIXME SAME AS [1]
 #: builtin/checkout.c:176
 #, c-format
 msgid "path '%s' does not have necessary versions"
-msgstr ""
+msgstr "някоя от необходимите версии липсва в пътя „%s“"
 
 #: builtin/checkout.c:193
 #, c-format
 msgid "path '%s': cannot merge"
-msgstr ""
+msgstr "пътят „%s“ не може да бъде слян"
 
 #: builtin/checkout.c:210
 #, c-format
 msgid "Unable to add merge result for '%s'"
-msgstr ""
+msgstr "Резултатът за „%s“ не може да бъде слян"
 
 #: builtin/checkout.c:232 builtin/checkout.c:235 builtin/checkout.c:238
 #: builtin/checkout.c:241
 #, c-format
 msgid "'%s' cannot be used with updating paths"
-msgstr ""
+msgstr "Опцията „%s“ е несъвместима с обновяването на пътища"
 
 #: builtin/checkout.c:244 builtin/checkout.c:247
 #, c-format
 msgid "'%s' cannot be used with %s"
-msgstr ""
+msgstr "Опцията „%s“ е несъвместима с „%s“"
 
 #: builtin/checkout.c:250
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
+"Невъзможно е едновременно да обновявате пътища и да се прехвърлите към клона "
+"„%s“."
 
-#: builtin/checkout.c:261 builtin/checkout.c:451
+#: builtin/checkout.c:261 builtin/checkout.c:450
 msgid "corrupt index file"
-msgstr ""
+msgstr "повреден файл на индекса"
 
-#: builtin/checkout.c:322 builtin/checkout.c:329
+#: builtin/checkout.c:321 builtin/checkout.c:328
 #, c-format
 msgid "path '%s' is unmerged"
-msgstr ""
+msgstr "пътят „%s“ не е слят"
 
-#: builtin/checkout.c:473
+#: builtin/checkout.c:472
 msgid "you need to resolve your current index first"
-msgstr ""
+msgstr "първо трябва да коригирате индекса си"
 
-#: builtin/checkout.c:594
+#: builtin/checkout.c:593
 #, c-format
 msgid "Can not do reflog for '%s'\n"
-msgstr ""
+msgstr "Журналът на указателите за „%s“ не може да бъде създаден\n"
 
-#: builtin/checkout.c:632
+#: builtin/checkout.c:631
 msgid "HEAD is now at"
-msgstr ""
+msgstr "Указателят „HEAD“ в момента сочи към"
 
-#: builtin/checkout.c:639
+#: builtin/checkout.c:638
 #, c-format
 msgid "Reset branch '%s'\n"
-msgstr ""
+msgstr "Зануляване на клона „%s“\n"
 
-#: builtin/checkout.c:642
+#: builtin/checkout.c:641
 #, c-format
 msgid "Already on '%s'\n"
-msgstr ""
+msgstr "Вече сте на „%s“\n"
 
-#: builtin/checkout.c:646
+#: builtin/checkout.c:645
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
-msgstr ""
+msgstr "Преминаване към клона „%s“ и зануляване на промените\n"
 
-#: builtin/checkout.c:648 builtin/checkout.c:1033
+#: builtin/checkout.c:647 builtin/checkout.c:1032
 #, c-format
 msgid "Switched to a new branch '%s'\n"
-msgstr ""
+msgstr "Преминахте към новия клон „%s“\n"
 
-#: builtin/checkout.c:650
+#: builtin/checkout.c:649
 #, c-format
 msgid "Switched to branch '%s'\n"
-msgstr ""
+msgstr "Преминахте към клона „%s“\n"
 
-#: builtin/checkout.c:706
+#: builtin/checkout.c:705
 #, c-format
 msgid " ... and %d more.\n"
-msgstr ""
+msgstr "… и още %d.\n"
 
-#. The singular version
-#: builtin/checkout.c:712
+#: builtin/checkout.c:711
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -3390,9 +3473,16 @@ msgid_plural ""
 "\n"
 "%s\n"
 msgstr[0] ""
+"ПРЕДУПРЕЖДЕНИЕ: изоставяте %d подаване, което не е свързано към никой клон:\n"
+"\n"
+"%s\n"
 msgstr[1] ""
+"ПРЕДУПРЕЖДЕНИЕ: изоставяте %d подавания, които не са свързани към никой "
+"клон:\n"
+"\n"
+"%s\n"
 
-#: builtin/checkout.c:730
+#: builtin/checkout.c:729
 #, c-format
 msgid ""
 "If you want to keep them by creating a new branch, this may be a good time\n"
@@ -3401,157 +3491,171 @@ msgid ""
 " git branch new_branch_name %s\n"
 "\n"
 msgstr ""
+"Ако все пак искате да ги запазите, сега вероятно е най-подходящият момент "
+"да\n"
+"създадете нов клон с тях чрез командата:\n"
+"\n"
+" git branch ИМЕ_НА_НОВИЯ_КЛОН %s\n"
+"\n"
 
-#: builtin/checkout.c:760
+#: builtin/checkout.c:759
 msgid "internal error in revision walk"
-msgstr ""
+msgstr "вътрешна грешка при обхождането на версиите"
 
-#: builtin/checkout.c:764
+#: builtin/checkout.c:763
 msgid "Previous HEAD position was"
-msgstr ""
+msgstr "Преди това „HEAD“ сочеше към"
 
-#: builtin/checkout.c:791 builtin/checkout.c:1028
+#: builtin/checkout.c:790 builtin/checkout.c:1027
 msgid "You are on a branch yet to be born"
-msgstr ""
+msgstr "В момента сте на клон, който предстои да бъде създаден"
 
-#: builtin/checkout.c:935
+#: builtin/checkout.c:934
 #, c-format
 msgid "only one reference expected, %d given."
-msgstr ""
+msgstr "очакваше се един указател, а сте подали %d."
 
-#: builtin/checkout.c:974
+#: builtin/checkout.c:973
 #, c-format
 msgid "invalid reference: %s"
-msgstr ""
+msgstr "неправилен указател: %s"
 
-#. case (1): want a tree
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
 #, c-format
 msgid "reference is not a tree: %s"
-msgstr ""
+msgstr "указателят не сочи към обект-дърво: %s"
 
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
 msgid "paths cannot be used with switching branches"
-msgstr ""
+msgstr "задаването на път е несъвместимо с преминаването от един клон към друг"
 
-#: builtin/checkout.c:1045 builtin/checkout.c:1049
+#: builtin/checkout.c:1044 builtin/checkout.c:1048
 #, c-format
 msgid "'%s' cannot be used with switching branches"
-msgstr ""
+msgstr "опцията „%s“ е несъвместима с преминаването от един клон към друг"
 
-#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1052 builtin/checkout.c:1055 builtin/checkout.c:1060
+#: builtin/checkout.c:1063
 #, c-format
 msgid "'%s' cannot be used with '%s'"
-msgstr ""
+msgstr "опцията „%s“ е несъвместима с „%s“"
 
-#: builtin/checkout.c:1069
+#: builtin/checkout.c:1068
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr ""
+"За да преминете към клон, подайте указател, който сочи към подаване. „%s“ не "
+"е такъв"
 
-#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
 #: builtin/remote.c:159 builtin/remote.c:161
 msgid "branch"
 msgstr "клон"
 
-#: builtin/checkout.c:1092
+#: builtin/checkout.c:1091
 msgid "create and checkout a new branch"
-msgstr ""
+msgstr "създаване и преминаване към нов клон"
 
-#: builtin/checkout.c:1094
+#: builtin/checkout.c:1093
 msgid "create/reset and checkout a branch"
-msgstr ""
+msgstr "създаване/зануляване на клон и преминаване към него"
 
-#: builtin/checkout.c:1095
+#: builtin/checkout.c:1094
 msgid "create reflog for new branch"
-msgstr ""
+msgstr "създаване на журнал на указателите за нов клон"
 
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
 msgid "detach the HEAD at named commit"
-msgstr ""
+msgstr "отделяне на указателя „HEAD“ към указаното подаване"
 
-#: builtin/checkout.c:1097
+#: builtin/checkout.c:1096
 msgid "set upstream info for new branch"
-msgstr ""
+msgstr "задаване на кой клон бива следен при създаването на новия клон"
 
-#: builtin/checkout.c:1099
-msgid "new branch"
-msgstr ""
+#: builtin/checkout.c:1098
+msgid "new-branch"
+msgstr "НОВ_КЛОН"
 
-#: builtin/checkout.c:1099
+#: builtin/checkout.c:1098
 msgid "new unparented branch"
-msgstr ""
+msgstr "нов клон без родител"
 
-#: builtin/checkout.c:1100
+#: builtin/checkout.c:1099
 msgid "checkout our version for unmerged files"
-msgstr ""
+msgstr "изтегляне на вашата версия на неслетите файлове"
 
-#: builtin/checkout.c:1102
+#: builtin/checkout.c:1101
 msgid "checkout their version for unmerged files"
-msgstr ""
+msgstr "изтегляне на чуждата версия на неслетите файлове"
 
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1103
 msgid "force checkout (throw away local modifications)"
-msgstr ""
+msgstr "принудително изтегляне (вашите промени ще бъдат занулени)"
 
-#: builtin/checkout.c:1105
+#: builtin/checkout.c:1104
 msgid "perform a 3-way merge with the new branch"
-msgstr ""
+msgstr "извършване на тройно сливане с новия клон"
 
-#: builtin/checkout.c:1106 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:225
 msgid "update ignored files (default)"
-msgstr ""
+msgstr "обновяване на игнорираните файлове (стандартно)"
 
-#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248
+#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
 msgid "style"
 msgstr "стил"
 
-#: builtin/checkout.c:1108
+#: builtin/checkout.c:1107
 msgid "conflict style (merge or diff3)"
-msgstr ""
+msgstr "действие при конфликт (сливане или тройна разлика)"
 
-#: builtin/checkout.c:1111
+#: builtin/checkout.c:1110
 msgid "do not limit pathspecs to sparse entries only"
-msgstr ""
+msgstr "без ограничаване на изброените пътища само до частично изтеглените"
 
-#: builtin/checkout.c:1113
+#: builtin/checkout.c:1112
 msgid "second guess 'git checkout no-such-branch'"
 msgstr ""
+"последващ опит за отгатване след неуспешен опит с „git checkout no-such-"
+"branch“"
 
-#: builtin/checkout.c:1136
+#: builtin/checkout.c:1135
 msgid "-b, -B and --orphan are mutually exclusive"
-msgstr ""
+msgstr "Опциите „-b“, „-B“ и „--orphan“ са несъвместими една с друга"
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
 msgid "--track needs a branch name"
-msgstr ""
+msgstr "опцията „--track“ изисква име на клон"
 
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1159
 msgid "Missing branch name; try -b"
-msgstr ""
+msgstr "Липсва име на клон, използвайте опцията „-b“"
 
-#: builtin/checkout.c:1197
+#: builtin/checkout.c:1196
 msgid "invalid path specification"
-msgstr ""
+msgstr "указан е неправилен път"
 
-#: builtin/checkout.c:1204
+#: builtin/checkout.c:1203
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
 "Did you intend to checkout '%s' which can not be resolved as commit?"
 msgstr ""
+"Не можете едновременно да обновявате пътища и да преминете към клона „%s“.\n"
+"Дали не искате да изтеглите „%s“, който не сочи към подаване?"
 
-#: builtin/checkout.c:1209
+#: builtin/checkout.c:1208
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
-msgstr ""
+msgstr "git checkout: опцията „--detach“ не приема аргумент-път „%s“"
 
-#: builtin/checkout.c:1213
+#: builtin/checkout.c:1212
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
 msgstr ""
+"git checkout: опциите „--ours“/„--theirs“, „--force“ и „--merge“ са "
+"несъвместими\n"
+"с изтегляне от индекса."
 
 #: builtin/clean.c:26
 msgid ""
@@ -3583,7 +3687,7 @@ msgstr ""
 msgid "failed to remove %s"
 msgstr ""
 
-#: builtin/clean.c:294
+#: builtin/clean.c:295
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -3591,7 +3695,7 @@ msgid ""
 "           - (empty) select nothing"
 msgstr ""
 
-#: builtin/clean.c:298
+#: builtin/clean.c:299
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -3603,35 +3707,35 @@ msgid ""
 "           - (empty) finish selecting"
 msgstr ""
 
-#: builtin/clean.c:516
+#: builtin/clean.c:517
 #, c-format
 msgid "Huh (%s)?"
 msgstr ""
 
-#: builtin/clean.c:659
+#: builtin/clean.c:660
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr ""
 
-#: builtin/clean.c:696
+#: builtin/clean.c:697
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr ""
 
-#: builtin/clean.c:717
+#: builtin/clean.c:718
 msgid "Select items to delete"
 msgstr ""
 
-#: builtin/clean.c:757
+#: builtin/clean.c:758
 #, c-format
 msgid "remove %s? "
 msgstr ""
 
-#: builtin/clean.c:782
+#: builtin/clean.c:783
 msgid "Bye."
 msgstr ""
 
-#: builtin/clean.c:790
+#: builtin/clean.c:791
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -3642,215 +3746,218 @@ msgid ""
 "?                   - help for prompt selection"
 msgstr ""
 
-#: builtin/clean.c:817
+# FIXME how many ***
+#: builtin/clean.c:818
 msgid "*** Commands ***"
-msgstr ""
+msgstr "●●● Команди ●●●"
 
-#: builtin/clean.c:818
+#: builtin/clean.c:819
 msgid "What now"
 msgstr ""
 
-#: builtin/clean.c:826
+#: builtin/clean.c:827
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/clean.c:843
+#: builtin/clean.c:844
 msgid "No more files to clean, exiting."
 msgstr ""
 
-#: builtin/clean.c:874
+#: builtin/clean.c:875
 msgid "do not print names of files removed"
 msgstr ""
 
-#: builtin/clean.c:876
+#: builtin/clean.c:877
 msgid "force"
 msgstr ""
 
-#: builtin/clean.c:877
+#: builtin/clean.c:878
 msgid "interactive cleaning"
 msgstr ""
 
-#: builtin/clean.c:879
+#: builtin/clean.c:880
 msgid "remove whole directories"
 msgstr ""
 
-#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:718
-#: builtin/ls-files.c:483 builtin/name-rev.c:314 builtin/show-ref.c:185
+#: 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
 msgid "pattern"
-msgstr ""
+msgstr "шаблон"
 
-#: builtin/clean.c:881
+#: builtin/clean.c:882
 msgid "add <pattern> to ignore rules"
 msgstr ""
 
-#: builtin/clean.c:882
+#: builtin/clean.c:883
 msgid "remove ignored files, too"
 msgstr ""
 
-#: builtin/clean.c:884
+#: builtin/clean.c:885
 msgid "remove only ignored files"
 msgstr ""
 
-#: builtin/clean.c:902
+#: builtin/clean.c:903
 msgid "-x and -X cannot be used together"
 msgstr ""
 
-#: builtin/clean.c:906
+#: builtin/clean.c:907
 msgid ""
-"clean.requireForce set to true and neither -i, -n nor -f given; refusing to "
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
 msgstr ""
 
-#: builtin/clean.c:909
+#: builtin/clean.c:910
 msgid ""
-"clean.requireForce defaults to true and neither -i, -n nor -f given; "
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
 msgstr ""
 
 #: builtin/clone.c:36
 msgid "git clone [options] [--] <repo> [<dir>]"
-msgstr ""
+msgstr "git clone [ОПЦИИ] [--] ХРАНИЛИЩЕ [ДИРЕКТОРИЯ]"
 
 #: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:521
+#: builtin/push.c:504
 msgid "force progress reporting"
-msgstr ""
+msgstr "извеждане на напредъка"
 
 #: builtin/clone.c:66
 msgid "don't create a checkout"
-msgstr ""
+msgstr "без създаване на работно дърво"
 
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
 msgid "create a bare repository"
-msgstr ""
+msgstr "създаване на голо хранилище"
 
 #: builtin/clone.c:71
 msgid "create a mirror repository (implies bare)"
-msgstr ""
+msgstr "създаване на хранилище-огледало (това включва хранилището да е голо)"
 
 #: builtin/clone.c:73
 msgid "to clone from a local repository"
-msgstr ""
+msgstr "клониране от локално хранилище"
 
 #: builtin/clone.c:75
 msgid "don't use local hardlinks, always copy"
-msgstr ""
+msgstr "без твърди връзки, файловете винаги да се копират"
 
 #: builtin/clone.c:77
 msgid "setup as shared repository"
-msgstr ""
+msgstr "настройване за споделено хранилище"
 
 #: builtin/clone.c:79 builtin/clone.c:81
 msgid "initialize submodules in the clone"
-msgstr ""
+msgstr "инициализиране на подмодулите при това клониране"
 
-#: builtin/clone.c:82 builtin/init-db.c:485
+#: builtin/clone.c:82 builtin/init-db.c:483
 msgid "template-directory"
-msgstr ""
+msgstr "директория с шаблони"
 
-#: builtin/clone.c:83 builtin/init-db.c:486
+#: builtin/clone.c:83 builtin/init-db.c:484
 msgid "directory from which templates will be used"
-msgstr ""
+msgstr "директория, която съдържа шаблоните, които да се ползват"
 
 #: builtin/clone.c:85
 msgid "reference repository"
-msgstr ""
+msgstr "еталонно хранилище"
 
 #: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
 msgid "name"
-msgstr ""
+msgstr "ИМЕ"
 
 #: builtin/clone.c:87
 msgid "use <name> instead of 'origin' to track upstream"
-msgstr ""
+msgstr "използване на това ИМЕ вместо „origin“ при проследяване на клони"
 
 #: builtin/clone.c:89
 msgid "checkout <branch> instead of the remote's HEAD"
-msgstr ""
+msgstr "изтегляне на този КЛОН, а не соченият от отдалечения указател „HEAD“"
 
 #: builtin/clone.c:91
 msgid "path to git-upload-pack on the remote"
-msgstr ""
+msgstr "път към командата „git-upload-pack“ на отдалеченото хранилище"
 
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663
+#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
 msgid "depth"
-msgstr ""
+msgstr "ДЪЛБОЧИНА"
 
 #: builtin/clone.c:93
 msgid "create a shallow clone of that depth"
-msgstr ""
+msgstr "плитко клониране до тази ДЪЛБОЧИНА"
 
 #: builtin/clone.c:95
 msgid "clone only one branch, HEAD or --branch"
 msgstr ""
+"клониране само на един клон — или сочения от отдалечения „HEAD“, или изрично "
+"зададения с „--branch“"
 
-#: builtin/clone.c:96 builtin/init-db.c:494
+#: builtin/clone.c:96 builtin/init-db.c:492
 msgid "gitdir"
-msgstr ""
+msgstr "СЛУЖЕБНА_ДИРЕКТОРИЯ"
 
-#: builtin/clone.c:97 builtin/init-db.c:495
+#: builtin/clone.c:97 builtin/init-db.c:493
 msgid "separate git dir from working tree"
-msgstr ""
+msgstr "отделна СЛУЖЕБНА_ДИРЕКТОРИЯ за git извън работното дърво"
 
 #: builtin/clone.c:98
 msgid "key=value"
-msgstr ""
+msgstr "КЛЮЧ=СТОЙНОСТ"
 
 #: builtin/clone.c:99
 msgid "set config inside the new repository"
-msgstr ""
+msgstr "задаване на настройките на новото хранилище"
 
 #: builtin/clone.c:252
 #, c-format
 msgid "reference repository '%s' is not a local repository."
-msgstr ""
+msgstr "еталонното хранилище „%s“ не е локално"
 
 #: builtin/clone.c:256
 #, c-format
 msgid "reference repository '%s' is shallow"
-msgstr ""
+msgstr "еталонното хранилище „%s“ е плитко"
 
 #: builtin/clone.c:259
 #, c-format
 msgid "reference repository '%s' is grafted"
-msgstr ""
+msgstr "еталонното хранилище „%s“ е с присаждане"
 
 #: builtin/clone.c:321
 #, c-format
 msgid "failed to create directory '%s'"
-msgstr ""
+msgstr "директорията „%s“ не може да бъде създадена"
 
 #: builtin/clone.c:323 builtin/diff.c:83
 #, c-format
 msgid "failed to stat '%s'"
-msgstr ""
+msgstr "не може да бъде получена информация чрез „stat“ за „%s“"
 
 #: builtin/clone.c:325
 #, c-format
 msgid "%s exists and is not a directory"
-msgstr ""
+msgstr "„%s“ съществува и не е директория"
 
 #: builtin/clone.c:339
 #, c-format
 msgid "failed to stat %s\n"
-msgstr ""
+msgstr "не може да бъде получена информация чрез „stat“ за „%s“\n"
 
 #: builtin/clone.c:361
 #, c-format
 msgid "failed to create link '%s'"
-msgstr ""
+msgstr "връзката „%s“ не може да бъде създадена"
 
 #: builtin/clone.c:365
 #, c-format
 msgid "failed to copy file to '%s'"
-msgstr ""
+msgstr "файлът не можа да бъде копиран като „%s“"
 
 #: builtin/clone.c:388 builtin/clone.c:565
 #, c-format
 msgid "done.\n"
-msgstr ""
+msgstr "действието завърши.\n"
 
 #: builtin/clone.c:401
 msgid ""
@@ -3858,111 +3965,121 @@ msgid ""
 "You can inspect what was checked out with 'git status'\n"
 "and retry the checkout with 'git checkout -f HEAD'\n"
 msgstr ""
+"Клонирането бе успешно за разлика от подготовката на работното дърво\n"
+"за определен клон. Все пак можете да проверите кои файлове и от кой\n"
+"клон в момента са изтеглени с командата „git status“. Можете да\n"
+"завършите изтеглянето на клона с командата „git checkout -f HEAD“.\n"
 
 #: builtin/clone.c:480
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr ""
+"Клонът „%s“ от отдалеченото хранилище което клонирате,\n"
+"който следва да бъде изтеглен, не съществува."
 
 #: builtin/clone.c:560
 #, c-format
 msgid "Checking connectivity... "
-msgstr ""
+msgstr "Проверка на връзката…"
 
 #: builtin/clone.c:563
 msgid "remote did not send all necessary objects"
-msgstr ""
+msgstr "отдалеченото хранилище не изпрати всички необходими обекти."
 
 #: builtin/clone.c:626
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
+"указателят „HEAD“ от отдалеченото хранилище сочи към нещо,\n"
+"което не съществува. Не може да се изтегли определен клон.\n"
 
 #: builtin/clone.c:657
 msgid "unable to checkout working tree"
-msgstr ""
+msgstr "работното дърво не може да бъде подготвено"
 
 #: builtin/clone.c:765
 msgid "Too many arguments."
-msgstr ""
+msgstr "Прекалено много аргументи."
 
 #: builtin/clone.c:769
 msgid "You must specify a repository to clone."
-msgstr ""
+msgstr "Трябва да укажете кое хранилище искате да клонирате."
 
 #: builtin/clone.c:780
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
-msgstr ""
+msgstr "опциите „--bare“ и „--origin %s“ са несъвместими."
 
 #: builtin/clone.c:783
 msgid "--bare and --separate-git-dir are incompatible."
-msgstr ""
+msgstr "опциите „--bare“ и „--separate-git-dir“ са несъвместими."
 
 #: builtin/clone.c:796
 #, c-format
 msgid "repository '%s' does not exist"
-msgstr ""
+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 ""
+msgstr "клонираното хранилище е плитко, затова опцията „--local“ се игнорира"
 
 #: builtin/clone.c:810
 msgid "--local is ignored"
-msgstr ""
+msgstr "опцията „--local“ се игнорира"
 
 #: builtin/clone.c:814 builtin/fetch.c:1119
 #, c-format
 msgid "depth %s is not a positive number"
-msgstr ""
+msgstr "дълбочината трябва да е положително цяло число, а не „%s“"
 
 #: builtin/clone.c:824
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
-msgstr ""
+msgstr "целевият път „%s“ съществува и не е празна директория."
 
 #: builtin/clone.c:834
 #, c-format
 msgid "working tree '%s' already exists."
-msgstr ""
+msgstr "в „%s“ вече съществува работно дърво."
 
 #: builtin/clone.c:847 builtin/clone.c:859
 #, c-format
 msgid "could not create leading directories of '%s'"
-msgstr ""
+msgstr "родителските директории на „%s“ не могат да бъдат създадени"
 
 #: builtin/clone.c:850
 #, c-format
 msgid "could not create work tree dir '%s'."
-msgstr ""
+msgstr "работното дърво в „%s“ не може да бъде създадено."
 
 #: builtin/clone.c:869
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
-msgstr ""
+msgstr "Клониране и създаване на голо хранилище в „%s“…\n"
 
 #: builtin/clone.c:871
 #, c-format
 msgid "Cloning into '%s'...\n"
-msgstr ""
+msgstr "Клониране и създаване на хранилище в „%s“…\n"
 
 #: builtin/clone.c:906
 #, c-format
 msgid "Don't know how to clone %s"
-msgstr ""
+msgstr "Не се поддържа клониране на връзки от вида „%s“ "
 
 #: builtin/clone.c:957 builtin/clone.c:965
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
-msgstr ""
+msgstr "Отдалеченият клон „%s“ липсва в клонираното хранилище „%s“"
 
 #: builtin/clone.c:968
 msgid "You appear to have cloned an empty repository."
-msgstr ""
+msgstr "Изглежда клонирахте празно хранилище."
 
 #: builtin/column.c:9
 msgid "git column [options]"
@@ -3998,11 +4115,11 @@ msgstr ""
 
 #: builtin/commit.c:36
 msgid "git commit [options] [--] <pathspec>..."
-msgstr ""
+msgstr "git commit [ОПЦИИ] [--] ПЪТ…"
 
 #: builtin/commit.c:41
 msgid "git status [options] [--] <pathspec>..."
-msgstr ""
+msgstr "git status [ОПЦИИ] [--] ПЪТ…"
 
 #: builtin/commit.c:46
 msgid ""
@@ -4017,6 +4134,17 @@ msgid ""
 "\n"
 "    git commit --amend --reset-author\n"
 msgstr ""
+"Името и адресът за е-поща са настроени автоматично на базата на името на\n"
+"потребителя и името на машината. Проверете дали са верни. Можете да спрете\n"
+"това съобщение като изрично зададете стойностите:\n"
+"\n"
+"    git config --global user.name \"Вашето Име\"\n"
+"    git config --global user.email пенчо@example.com\n"
+"\n"
+"След като направите това, можете да коригирате информацията за автора на\n"
+"текущото подаване чрез:\n"
+"\n"
+"    git commit --amend --reset-author\n"
 
 #: builtin/commit.c:58
 msgid ""
@@ -4024,6 +4152,11 @@ msgid ""
 "it empty. You can repeat your command with --allow-empty, or you can\n"
 "remove the commit entirely with \"git reset HEAD^\".\n"
 msgstr ""
+"Поискахте да поправите последното си подаване. Това действие ще превърне\n"
+"подаването в празно. Можете или да го повторите като разрешите такива "
+"подавания\n"
+"с опцията „--allow-empty“, или да го изтриете от историята с командата:\n"
+"„git reset HEAD^“.\n"
 
 #: builtin/commit.c:63
 msgid ""
@@ -4033,10 +4166,16 @@ msgid ""
 "    git commit --allow-empty\n"
 "\n"
 msgstr ""
+"Предишното отбрано подаване вече е празно, като най-вероятната причина е\n"
+"корекция на конфликт. Ако все пак искате да го ползвате, използвайте "
+"командата:\n"
+"\n"
+"    git commit --allow-empty\n"
+"\n"
 
 #: builtin/commit.c:70
 msgid "Otherwise, please use 'git reset'\n"
-msgstr ""
+msgstr "В противен случай използвайте командата „git reset“\n"
 
 #: builtin/commit.c:73
 msgid ""
@@ -4047,95 +4186,101 @@ msgid ""
 "Then \"git cherry-pick --continue\" will resume cherry-picking\n"
 "the remaining commits.\n"
 msgstr ""
+"Ако искате да прескочите това подаване, използвайте командата:\n"
+"\n"
+"    git reset\n"
+"\n"
+"Чрез командата „git cherry-pick --continue“ ще продължите отбирането на\n"
+"останалите подавания.\n"
 
-#: builtin/commit.c:287
+#: builtin/commit.c:288
 msgid "failed to unpack HEAD tree object"
-msgstr ""
+msgstr "неуспешно изваждана на върховото дърво (HEAD tree object) от пакет"
 
-#: builtin/commit.c:329
+#: builtin/commit.c:330
 msgid "unable to create temporary index"
-msgstr ""
+msgstr "неуспешно създаване на временен индекс"
 
-#: builtin/commit.c:335
+#: builtin/commit.c:336
 msgid "interactive add failed"
-msgstr ""
+msgstr "неуспешно интерактивно добавяне"
 
-#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439
+#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
 msgid "unable to write new_index file"
-msgstr ""
+msgstr "неуспешен запис на новия индекс"
 
-#: builtin/commit.c:420
+#: builtin/commit.c:421
 msgid "cannot do a partial commit during a merge."
-msgstr ""
+msgstr "по време на сливане не може да се извърши частично подаване."
 
-#: builtin/commit.c:422
+#: builtin/commit.c:423
 msgid "cannot do a partial commit during a cherry-pick."
-msgstr ""
+msgstr "по време на отбиране не може да се извърши частично подаване."
 
-#: builtin/commit.c:432
+#: builtin/commit.c:433
 msgid "cannot read the index"
-msgstr ""
+msgstr "индексът не може да бъде прочетен"
 
-#: builtin/commit.c:452
+#: builtin/commit.c:453
 msgid "unable to write temporary index file"
-msgstr ""
+msgstr "временният индекс не може да бъде записан"
 
-#: builtin/commit.c:543 builtin/commit.c:549
+#: builtin/commit.c:544 builtin/commit.c:550
 #, c-format
 msgid "invalid commit: %s"
-msgstr ""
+msgstr "неправилно подаване: %s"
 
-#: builtin/commit.c:571
+#: builtin/commit.c:572
 msgid "malformed --author parameter"
-msgstr ""
+msgstr "неправилен параметър към опцията „--author“"
 
-#: builtin/commit.c:591
+#: builtin/commit.c:592
 #, c-format
 msgid "Malformed ident string: '%s'"
-msgstr ""
+msgstr "Неправилен низ за идентичност: „%s“"
 
-#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007
+#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
 #, c-format
 msgid "could not lookup commit %s"
-msgstr ""
+msgstr "следното подаване не може да бъде открито: %s"
 
-#: builtin/commit.c:642 builtin/shortlog.c:273
+#: builtin/commit.c:641 builtin/shortlog.c:273
 #, c-format
 msgid "(reading log message from standard input)\n"
-msgstr ""
+msgstr "(изчитане на съобщението за подаване от стандартния вход)\n"
 
-#: builtin/commit.c:644
+#: builtin/commit.c:643
 msgid "could not read log from standard input"
-msgstr ""
+msgstr "съобщението за подаване не бе прочетено стандартния вход"
 
-#: builtin/commit.c:648
+#: builtin/commit.c:647
 #, c-format
 msgid "could not read log file '%s'"
-msgstr ""
+msgstr "файлът със съобщението за подаване „%s“ не може да бъде прочетен"
 
 #: builtin/commit.c:654
 msgid "commit has empty message"
-msgstr ""
+msgstr "подаване с празно съобщение"
 
 #: builtin/commit.c:670
 msgid "could not read MERGE_MSG"
-msgstr ""
+msgstr "съобщението за сливане MERGE_MSG не може да бъде прочетено"
 
 #: builtin/commit.c:674
 msgid "could not read SQUASH_MSG"
-msgstr ""
+msgstr "съобщението за смачкване SQUASH_MSG не може да бъде прочетено"
 
 #: builtin/commit.c:678
 #, c-format
 msgid "could not read '%s'"
-msgstr ""
+msgstr "файлът „%s“ не може да бъде прочетен"
 
 #: builtin/commit.c:749
 msgid "could not write commit template"
-msgstr ""
+msgstr "шаблонът за подаване не може да бъде запазен"
 
 # FIXME
-#: builtin/commit.c:760
+#: builtin/commit.c:764
 #, c-format
 msgid ""
 "\n"
@@ -4144,9 +4289,14 @@ msgid ""
 "\t%s\n"
 "and try again.\n"
 msgstr ""
+"\n"
+"Изглежда, че подавате сливане. Ако това не е така, изтрийте файла:\n"
+"\n"
+"  %s\n"
+"и опитайте отново.\n"
 
 # FIXME
-#: builtin/commit.c:765
+#: builtin/commit.c:769
 #, c-format
 msgid ""
 "\n"
@@ -4155,681 +4305,724 @@ msgid ""
 "\t%s\n"
 "and try again.\n"
 msgstr ""
+"\n"
+"Изглежда, че извършвате отбрано подаване. Ако това не е така, изтрийте "
+"файла:\n"
+"\n"
+"  %s\n"
+"и опитайте отново.\n"
 
-#: builtin/commit.c:777
+#: builtin/commit.c:782
 #, 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"
 
-#: builtin/commit.c:782
+#: builtin/commit.c:789
 #, 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 ""
+"Въведете съобщението за подаване на промените. Редовете, които започват\n"
+"с „%c“ НЯМА да бъдат филтрирани, може да ги изтриете вие. Празно \n"
+"съобщение отменя подаването.\n"
 
-#: builtin/commit.c:795
+#: builtin/commit.c:802
 #, c-format
 msgid "%sAuthor:    %s"
-msgstr ""
+msgstr "%sАвтор:    %s"
 
-#: builtin/commit.c:802
+#: builtin/commit.c:809
 #, c-format
 msgid "%sCommitter: %s"
-msgstr ""
+msgstr "%sПодаващ: %s"
 
-#: builtin/commit.c:822
+#: builtin/commit.c:829
 msgid "Cannot read index"
-msgstr ""
+msgstr "Индексът не може да бъде прочетен"
 
-#: builtin/commit.c:865
+#: builtin/commit.c:872
 msgid "Error building trees"
-msgstr ""
+msgstr "Грешка при изграждане на дърветата"
 
-#: builtin/commit.c:880 builtin/tag.c:359
+#: builtin/commit.c:887 builtin/tag.c:391
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
-msgstr ""
+msgstr "Подайте съобщението с някоя от опциите „-m“ или „-F“.\n"
 
-#: builtin/commit.c:982
+#: builtin/commit.c:989
 #, c-format
 msgid "No existing author found with '%s'"
-msgstr ""
+msgstr "Не е открит автор с име „%s“."
 
-#: builtin/commit.c:997 builtin/commit.c:1237
+#: builtin/commit.c:1004 builtin/commit.c:1244
 #, c-format
 msgid "Invalid untracked files mode '%s'"
-msgstr ""
+msgstr "Неправилна стойност за неследените файлове: „%s“"
 
-#: builtin/commit.c:1034
+#: builtin/commit.c:1041
 msgid "--long and -z are incompatible"
-msgstr ""
+msgstr "Опциите „--long“ и „-z“ са несъвместими."
 
-#: builtin/commit.c:1064
+#: builtin/commit.c:1071
 msgid "Using both --reset-author and --author does not make sense"
-msgstr ""
+msgstr "Опциите „--reset-author“ и „--author“ са несъвместими."
 
-#: builtin/commit.c:1075
+#: builtin/commit.c:1080
 msgid "You have nothing to amend."
-msgstr ""
+msgstr "Няма какво да бъде поправено."
 
-#: builtin/commit.c:1078
+#: builtin/commit.c:1083
 msgid "You are in the middle of a merge -- cannot amend."
-msgstr ""
+msgstr "В момента се извършва сливане, не можете да поправяте."
 
-#: builtin/commit.c:1080
+#: builtin/commit.c:1085
 msgid "You are in the middle of a cherry-pick -- cannot amend."
-msgstr ""
+msgstr "В момента се извършва отбиране на подаване, не можете да поправяте."
 
-#: builtin/commit.c:1083
+#: builtin/commit.c:1088
 msgid "Options --squash and --fixup cannot be used together"
-msgstr ""
+msgstr "Опциите „--squash“ и „--fixup“ са несъвместими."
 
-#: builtin/commit.c:1093
+#: builtin/commit.c:1098
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr ""
+"Можете да използвате само една от опциите „-c“, „-C“, „-F“ и „--fixup“."
 
-#: builtin/commit.c:1095
+#: builtin/commit.c:1100
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
-msgstr ""
+msgstr "Опцията „-m“ е несъвместима с „-c“, „-C“, „-F“ и „--fixup“."
 
-#: builtin/commit.c:1103
+#: builtin/commit.c:1108
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr ""
+"Опцията „--reset-author“ може да се използва само заедно с „-C“, „-c“ или\n"
+"„--amend“."
 
-#: builtin/commit.c:1120
+#: builtin/commit.c:1125
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
+"Опциите „--include“, „--only“, „--all“, „--interactive“ и „--patch“ са\n"
+"несъвместими."
 
-#: builtin/commit.c:1122
+#: builtin/commit.c:1127
 msgid "No paths with --include/--only does not make sense."
-msgstr ""
+msgstr "Опциите „--include“ и „--only“ изискват аргументи."
 
-#: builtin/commit.c:1124
+# FIXME bad message
+#: builtin/commit.c:1129
 msgid "Clever... amending the last one with dirty index."
 msgstr ""
+"Поправяте последното подаване докато индекса има проблеми. Това е лоша идея."
 
-#: builtin/commit.c:1126
-msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
+#: builtin/commit.c:1131
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr ""
+"Зададени са изрични пътища без опциите „-i“ или „-o“. Приема се, че все едно "
+"сте\n"
+"ползвали опцията „--only“ с ПЪТища…"
 
-#: builtin/commit.c:1136 builtin/tag.c:572
+#: builtin/commit.c:1143 builtin/tag.c:639
 #, c-format
 msgid "Invalid cleanup mode %s"
-msgstr ""
+msgstr "Несъществуващ режим на изчистване „%s“"
 
-#: builtin/commit.c:1141
+#: builtin/commit.c:1148
 msgid "Paths with -a does not make sense."
-msgstr ""
+msgstr "Използването на пътища е несъвместимо със задаването на опцията „-a“."
 
-#: builtin/commit.c:1251 builtin/commit.c:1482
+#: builtin/commit.c:1258 builtin/commit.c:1516
 msgid "show status concisely"
-msgstr ""
+msgstr "кратка информация за състоянието"
 
-#: builtin/commit.c:1253 builtin/commit.c:1484
+#: builtin/commit.c:1260 builtin/commit.c:1518
 msgid "show branch information"
-msgstr ""
+msgstr "информация за клоните"
 
-#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507
+#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
 msgid "machine-readable output"
-msgstr ""
+msgstr "формат на изхода за четене от програма"
 
-#: builtin/commit.c:1258 builtin/commit.c:1488
+#: builtin/commit.c:1265 builtin/commit.c:1522
 msgid "show status in long format (default)"
-msgstr ""
+msgstr "подробна информация за състоянието (стандартно)"
 
-#: builtin/commit.c:1261 builtin/commit.c:1491
+#: builtin/commit.c:1268 builtin/commit.c:1525
 msgid "terminate entries with NUL"
-msgstr ""
+msgstr "разделяне на елементите с нулевия знак „NUL“"
 
-#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:459
+#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
+#: builtin/fast-export.c:677 builtin/tag.c:514
 msgid "mode"
-msgstr ""
+msgstr "режим"
 
-#: builtin/commit.c:1264 builtin/commit.c:1494
+#: builtin/commit.c:1271 builtin/commit.c:1528
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
+"извеждане на неследените файлове. Възможните режими са „all“ (подробна\n"
+"информация), „normal“ (кратка информация), „no“ (без неследените файлове).\n"
+"Стандартният режим е: „all“."
 
-#: builtin/commit.c:1267
+#: builtin/commit.c:1274
 msgid "show ignored files"
-msgstr ""
+msgstr "извеждане на игнорираните файлове"
 
-#: builtin/commit.c:1268 parse-options.h:156
+#: builtin/commit.c:1275 parse-options.h:153
 msgid "when"
 msgstr "кога"
 
-#: builtin/commit.c:1269
+#: builtin/commit.c:1276
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
 msgstr ""
+"игнориране на промените в подмодулите. Опция с незадължителна стойност — "
+"една от\n"
+"„all“ (всички), „dirty“ (тези с неподадени промени), „untracked“ (неследени)"
 
-#: builtin/commit.c:1271
+#: builtin/commit.c:1278
 msgid "list untracked files in columns"
-msgstr ""
+msgstr "извеждане на неследените файлове в колони"
 
-#: builtin/commit.c:1340
+#: builtin/commit.c:1347
 msgid "couldn't look up newly created commit"
-msgstr ""
+msgstr "току що създаденото подаване не може да бъде открито"
 
-#: builtin/commit.c:1342
+#: builtin/commit.c:1349
 msgid "could not parse newly created commit"
-msgstr ""
+msgstr "току що създаденото подаване не може да бъде анализирано"
 
-#: builtin/commit.c:1383
+#: builtin/commit.c:1390
 msgid "detached HEAD"
-msgstr ""
+msgstr "несвързан връх HEAD"
 
-#: builtin/commit.c:1385
+#: builtin/commit.c:1392
 msgid " (root-commit)"
-msgstr ""
+msgstr " (начално подаване)"
 
-#: builtin/commit.c:1452
+#: builtin/commit.c:1486
 msgid "suppress summary after successful commit"
-msgstr ""
+msgstr "без информация след успешно подаване"
 
-#: builtin/commit.c:1453
+#: builtin/commit.c:1487
 msgid "show diff in commit message template"
-msgstr ""
+msgstr "добавяне на разликата към шаблона за съобщението при подаване"
 
-#: builtin/commit.c:1455
+#: builtin/commit.c:1489
 msgid "Commit message options"
-msgstr ""
+msgstr "Опции за съобщението при подаване"
 
-#: builtin/commit.c:1456 builtin/tag.c:457
+#: builtin/commit.c:1490 builtin/tag.c:512
 msgid "read message from file"
-msgstr ""
+msgstr "взимане та съобщението от файл"
 
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
 msgid "author"
-msgstr ""
+msgstr "автор"
 
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
 msgid "override author for commit"
-msgstr ""
+msgstr "задаване на автор за подаването"
 
-#: builtin/commit.c:1458 builtin/gc.c:261
+#: builtin/commit.c:1492 builtin/gc.c:272
 msgid "date"
 msgstr "дата"
 
-#: builtin/commit.c:1458
+#: builtin/commit.c:1492
 msgid "override date for commit"
-msgstr ""
+msgstr "задаване на дата за подаването"
 
-#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405
-#: builtin/notes.c:562 builtin/tag.c:455
+#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:510
 msgid "message"
-msgstr ""
+msgstr "съобщение"
 
-#: builtin/commit.c:1459
+#: builtin/commit.c:1493
 msgid "commit message"
-msgstr ""
+msgstr "съобщение при подаване"
 
-#: builtin/commit.c:1460
+#: builtin/commit.c:1494
 msgid "reuse and edit message from specified commit"
-msgstr ""
+msgstr "преизползване и редактиране на съобщението от указаното подаване"
 
-#: builtin/commit.c:1461
+#: builtin/commit.c:1495
 msgid "reuse message from specified commit"
-msgstr ""
+msgstr "преизползване на съобщението от указаното подаване"
 
-#: builtin/commit.c:1462
+#: builtin/commit.c:1496
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
+"използване на автоматичното съобщение при смачкване за вкарване на "
+"указаното\n"
+"подаване в предното без следа"
 
-#: builtin/commit.c:1463
+#: builtin/commit.c:1497
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
+"използване на автоматичното съобщение при смачкване за смачкване на "
+"указаното\n"
+"подаване в предното"
 
-#: builtin/commit.c:1464
+#: builtin/commit.c:1498
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr ""
+"смяна на автора да съвпада с подаващия (използва се с „-C“/„-c“/„--amend“)"
 
-#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
 msgid "add Signed-off-by:"
-msgstr ""
+msgstr "добавяне на поле за подпис — „Signed-off-by:“"
 
-#: builtin/commit.c:1466
+#: builtin/commit.c:1500
 msgid "use specified template file"
-msgstr ""
+msgstr "използване на указания шаблонен файл"
 
-#: builtin/commit.c:1467
+#: builtin/commit.c:1501
 msgid "force edit of commit"
-msgstr ""
+msgstr "редактиране на подаване"
 
-#: builtin/commit.c:1468
+#: builtin/commit.c:1502
 msgid "default"
-msgstr ""
+msgstr "стандартно"
 
-#: builtin/commit.c:1468 builtin/tag.c:460
+#: builtin/commit.c:1502 builtin/tag.c:515
 msgid "how to strip spaces and #comments from message"
-msgstr ""
+msgstr "кои празни знаци и #коментари да се махат от съобщенията"
 
-#: builtin/commit.c:1469
+#: builtin/commit.c:1503
 msgid "include status in commit message template"
-msgstr ""
+msgstr "вмъкване на състоянието в шаблона за съобщението при подаване"
 
-#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461
-msgid "key id"
-msgstr ""
+#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:516
+msgid "key-id"
+msgstr "ИДЕНТИФИКАТОР_НА_КЛЮЧ"
 
-#: builtin/commit.c:1471 builtin/merge.c:224
+#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
 msgid "GPG sign commit"
-msgstr ""
+msgstr "подписване на подаването с GPG"
 
-#. end commit message options
-#: builtin/commit.c:1474
+#: builtin/commit.c:1508
 msgid "Commit contents options"
-msgstr ""
+msgstr "Опции за избор на файлове при подаване"
 
-#: builtin/commit.c:1475
+#: builtin/commit.c:1509
 msgid "commit all changed files"
-msgstr ""
+msgstr "подаване на всички променени файлове"
 
-#: builtin/commit.c:1476
+#: builtin/commit.c:1510
 msgid "add specified files to index for commit"
-msgstr ""
+msgstr "добавяне на указаните файлове към индекса за подаване"
 
-#: builtin/commit.c:1477
+#: builtin/commit.c:1511
 msgid "interactively add files"
-msgstr ""
+msgstr "интерактивно добавяне на файлове"
 
-#: builtin/commit.c:1478
+#: builtin/commit.c:1512
 msgid "interactively add changes"
-msgstr ""
+msgstr "интерактивно добавяне на промени"
 
-#: builtin/commit.c:1479
+#: builtin/commit.c:1513
 msgid "commit only specified files"
-msgstr ""
+msgstr "подаване само на указаните файлове"
 
-#: builtin/commit.c:1480
+#: builtin/commit.c:1514
 msgid "bypass pre-commit hook"
-msgstr ""
+msgstr "без изпълнение на куката преди подаване (pre-commit)"
 
-#: builtin/commit.c:1481
+#: builtin/commit.c:1515
 msgid "show what would be committed"
-msgstr ""
+msgstr "отпечатване на това, което би било подадено"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1526
 msgid "amend previous commit"
-msgstr ""
+msgstr "поправяне на предишното подаване"
 
-#: builtin/commit.c:1493
+#: builtin/commit.c:1527
 msgid "bypass post-rewrite hook"
-msgstr ""
+msgstr "без изпълнение на куката след презаписване (post-rewrite)"
 
-#: builtin/commit.c:1498
+#: builtin/commit.c:1532
 msgid "ok to record an empty change"
-msgstr ""
+msgstr "позволяване на празни подавания"
 
-#: builtin/commit.c:1500
+#: builtin/commit.c:1534
 msgid "ok to record a change with an empty message"
-msgstr ""
+msgstr "позволяване на подавания с празни съобщения"
 
-#: builtin/commit.c:1529
+#: builtin/commit.c:1562
 msgid "could not parse HEAD commit"
-msgstr ""
+msgstr "върховото подаване „HEAD“ не може да бъде прочетено"
 
-#: builtin/commit.c:1567 builtin/merge.c:518
+#: builtin/commit.c:1601 builtin/merge.c:518
 #, c-format
 msgid "could not open '%s' for reading"
-msgstr ""
+msgstr "файлът не може да бъде прочетен: „%s“"
 
-#: builtin/commit.c:1574
+#: builtin/commit.c:1608
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
-msgstr ""
+msgstr "Повреден файл за върха за сливането „MERGE_HEAD“ (%s)"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1615
 msgid "could not read MERGE_MODE"
-msgstr ""
+msgstr "режимът на сливане „MERGE_MODE“ не може да бъде прочетен"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1634
 #, c-format
 msgid "could not read commit message: %s"
-msgstr ""
+msgstr "съобщението за подаване не може да бъде прочетено: %s"
 
-#: builtin/commit.c:1611
+#: builtin/commit.c:1645
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
-msgstr ""
+msgstr "Неизвършване на подаване поради нередактирано съобщение.\n"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1650
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
-msgstr ""
+msgstr "Неизвършване на подаване поради празно съобщение.\n"
 
-#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879
+#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
 msgid "failed to write commit object"
-msgstr ""
+msgstr "обектът за подаването не може да бъде записан"
 
-#: builtin/commit.c:1652
+#: builtin/commit.c:1686
 msgid "cannot lock HEAD ref"
-msgstr ""
+msgstr "указателят към върха „HEAD“ не може да бъде заключен"
 
-#: builtin/commit.c:1656
+#: builtin/commit.c:1690
 msgid "cannot update HEAD ref"
-msgstr ""
+msgstr "указателят към върха „HEAD“ не може да бъде обновен"
 
-#: builtin/commit.c:1667
+#: builtin/commit.c:1701
 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 ""
+"Хранилището е обновено, но новият файл за индекс „new_index“\n"
+"не е записан. Проверете дали не е препълнен диска или не сте\n"
+"превишили дисковата си квота. След това изпълнете „git reset HEAD“."
 
 #: builtin/config.c:8
 msgid "git config [options]"
-msgstr ""
+msgstr "git config [ОПЦИИ]"
 
-#: builtin/config.c:54
+#: builtin/config.c:53
 msgid "Config file location"
-msgstr ""
+msgstr "Местоположение на конфигурационния файл"
 
-#: builtin/config.c:55
+#: builtin/config.c:54
 msgid "use global config file"
-msgstr ""
+msgstr "използване на глобалния конфигурационен файл"
 
-#: builtin/config.c:56
+#: builtin/config.c:55
 msgid "use system config file"
-msgstr ""
+msgstr "използване на системния конфигурационен файл"
 
-#: builtin/config.c:57
+#: builtin/config.c:56
 msgid "use repository config file"
-msgstr ""
+msgstr "използване на конфигурационния файл на хранилището"
 
-#: builtin/config.c:58
+#: builtin/config.c:57
 msgid "use given config file"
-msgstr ""
+msgstr "използване на зададения конфигурационен файл"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "blob-id"
-msgstr ""
+msgstr "идентификатор на BLOB"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "read config from given blob object"
 msgstr ""
+"изчитане на конфигурацията от BLOB с този идентификатор на съдържанието"
 
-#: builtin/config.c:60
+#: builtin/config.c:59
 msgid "Action"
-msgstr ""
+msgstr "Действие"
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "get value: name [value-regex]"
-msgstr ""
+msgstr "извеждане на стойност: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:62
+#: builtin/config.c:61
 msgid "get all values: key [value-regex]"
-msgstr ""
+msgstr "извеждане на всички стойности: ключ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:63
+#: builtin/config.c:62
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr ""
+"извеждане на стойностите за РЕГУЛЯРНия_ИЗРАЗ: РЕГУЛЯРЕН_ИЗРАЗ_ЗА_ИМЕТО "
+"[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:64
+#: builtin/config.c:63
 msgid "get value specific for the URL: section[.var] URL"
-msgstr ""
+msgstr "извеждане на стойността за указания адрес: РАЗДЕЛ[.ПРОМЕНЛИВА] АДРЕС"
 
-#: builtin/config.c:65
+#: builtin/config.c:64
 msgid "replace all matching variables: name value [value_regex]"
 msgstr ""
+"замяна на всички съвпадащи променливи: ИМЕ СТОЙНОСТ "
+"[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:66
+#: builtin/config.c:65
 msgid "add a new variable: name value"
-msgstr ""
+msgstr "добавяне на нова променлива: ИМЕ СТОЙНОСТ"
 
-#: builtin/config.c:67
+#: builtin/config.c:66
 msgid "remove a variable: name [value-regex]"
-msgstr ""
+msgstr "изтриване на променлива: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:68
+#: builtin/config.c:67
 msgid "remove all matches: name [value-regex]"
-msgstr ""
+msgstr "изтриване на всички съвпадащи: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:69
+#: builtin/config.c:68
 msgid "rename section: old-name new-name"
-msgstr ""
+msgstr "преименуване на раздел: СТАРО_ИМЕ НОВО_ИМЕ"
 
-#: builtin/config.c:70
+#: builtin/config.c:69
 msgid "remove a section: name"
-msgstr ""
+msgstr "изтриване на раздел: ИМЕ"
 
-#: builtin/config.c:71
+#: builtin/config.c:70
 msgid "list all"
-msgstr ""
+msgstr "изброяване на всички"
 
-#: builtin/config.c:72
+#: builtin/config.c:71
 msgid "open an editor"
-msgstr ""
+msgstr "отваряне на редактор"
 
-#: builtin/config.c:73 builtin/config.c:74
+#: builtin/config.c:72 builtin/config.c:73
 msgid "slot"
-msgstr ""
+msgstr "настройка"
 
-#: builtin/config.c:73
+#: builtin/config.c:72
 msgid "find the color configured: [default]"
-msgstr ""
+msgstr "извеждане на зададения цвят на настройката: [стандартно]"
 
-#: builtin/config.c:74
+#: builtin/config.c:73
 msgid "find the color setting: [stdout-is-tty]"
 msgstr ""
+"извеждане на зададения цвят на настройката: [стандартният изход е терминал]"
 
-#: builtin/config.c:75
+#: builtin/config.c:74
 msgid "Type"
-msgstr ""
+msgstr "Вид"
 
-#: builtin/config.c:76
+#: builtin/config.c:75
 msgid "value is \"true\" or \"false\""
-msgstr ""
+msgstr "СТОЙНОСТТА е „true“ (истина) или „false“ (лъжа)"
 
-#: builtin/config.c:77
+#: builtin/config.c:76
 msgid "value is decimal number"
-msgstr ""
+msgstr "СТОЙНОСТТА е цяло, десетично число"
 
-#: builtin/config.c:78
+#: builtin/config.c:77
 msgid "value is --bool or --int"
-msgstr ""
+msgstr "СТОЙНОСТТА е „--bool“ (булева) или „--int“ (десетично цяло число)"
 
-#: builtin/config.c:79
+#: builtin/config.c:78
 msgid "value is a path (file or directory name)"
-msgstr ""
+msgstr "СТОЙНОСТТА е път (до файл или директория)"
 
-#: builtin/config.c:80
+#: builtin/config.c:79
 msgid "Other"
-msgstr ""
+msgstr "Други"
 
-#: builtin/config.c:81
+# FIXME NUL byte to null char, terminate -> razdelitel - da stane ednakvo
+#: builtin/config.c:80
 msgid "terminate values with NUL byte"
-msgstr ""
+msgstr "разделяне на стойностите с нулевия знак „NUL“"
 
-#: builtin/config.c:82
+#: builtin/config.c:81
 msgid "respect include directives on lookup"
-msgstr ""
+msgstr "при търсене да се уважат и директивите за включване"
 
 #: builtin/count-objects.c:82
 msgid "git count-objects [-v] [-H | --human-readable]"
-msgstr ""
+msgstr "git count-objects [-v] [-H | --human-readable]"
 
 #: builtin/count-objects.c:97
 msgid "print sizes in human readable format"
-msgstr ""
+msgstr "извеждане на размерите на обектите във формат лесно четим от хора"
 
+# FIXME ... instead of *???
 #: builtin/describe.c:16
 msgid "git describe [options] <commit-ish>*"
-msgstr ""
+msgstr "git describe [ОПЦИИ] указател към подаване…"
 
 #: builtin/describe.c:17
 msgid "git describe [options] --dirty"
 msgstr ""
 
-#: builtin/describe.c:237
+#: builtin/describe.c:225
 #, c-format
 msgid "annotated tag %s not available"
 msgstr ""
 
-#: builtin/describe.c:241
+#: builtin/describe.c:229
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr ""
 
-#: builtin/describe.c:243
+#: builtin/describe.c:231
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr ""
 
-#: builtin/describe.c:270
+#: builtin/describe.c:258
 #, c-format
 msgid "Not a valid object name %s"
 msgstr ""
 
-#: builtin/describe.c:273
+#: builtin/describe.c:261
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr ""
 
-#: builtin/describe.c:290
+#: builtin/describe.c:278
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr ""
 
-#: builtin/describe.c:292
+#: builtin/describe.c:280
 #, c-format
 msgid "searching to describe %s\n"
 msgstr ""
 
-#: builtin/describe.c:332
+#: builtin/describe.c:327
 #, c-format
 msgid "finished search at %s\n"
 msgstr ""
 
-#: builtin/describe.c:359
+#: builtin/describe.c:354
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
 "However, there were unannotated tags: try --tags."
 msgstr ""
 
-#: builtin/describe.c:363
+#: builtin/describe.c:358
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
 "Try --always, or create some tags."
 msgstr ""
 
-#: builtin/describe.c:384
+#: builtin/describe.c:379
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr ""
 
-#: builtin/describe.c:387
+#: builtin/describe.c:382
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
 "gave up search at %s\n"
 msgstr ""
 
-#: builtin/describe.c:409
+#: builtin/describe.c:404
 msgid "find the tag that comes after the commit"
 msgstr ""
 
-#: builtin/describe.c:410
+#: builtin/describe.c:405
 msgid "debug search strategy on stderr"
 msgstr ""
 
-#: builtin/describe.c:411
+#: builtin/describe.c:406
 msgid "use any ref"
 msgstr ""
 
-#: builtin/describe.c:412
+#: builtin/describe.c:407
 msgid "use any tag, even unannotated"
 msgstr ""
 
-#: builtin/describe.c:413
+#: builtin/describe.c:408
 msgid "always use long format"
 msgstr ""
 
-#: builtin/describe.c:414
+#: builtin/describe.c:409
 msgid "only follow first parent"
 msgstr ""
 
-#: builtin/describe.c:417
+#: builtin/describe.c:412
 msgid "only output exact matches"
 msgstr ""
 
-#: builtin/describe.c:419
-#, fuzzy
+#: builtin/describe.c:414
 msgid "consider <n> most recent tags (default: 10)"
-msgstr "<брой>"
+msgstr "да се търси само в този БРОЙ последни етикети (стандартно: 10)"
 
-#: builtin/describe.c:421
+#: builtin/describe.c:416
 msgid "only consider tags matching <pattern>"
 msgstr ""
 
-#: builtin/describe.c:423 builtin/name-rev.c:321
+#: builtin/describe.c:418 builtin/name-rev.c:321
 msgid "show abbreviated commit object as fallback"
 msgstr ""
 
-#: builtin/describe.c:424
+#: builtin/describe.c:419
 msgid "mark"
 msgstr ""
 
-#: builtin/describe.c:425
+#: builtin/describe.c:420
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr ""
 
-#: builtin/describe.c:443
+#: builtin/describe.c:438
 msgid "--long is incompatible with --abbrev=0"
 msgstr ""
 
-#: builtin/describe.c:469
+#: builtin/describe.c:464
 msgid "No names found, cannot describe anything."
 msgstr ""
 
-#: builtin/describe.c:489
+#: builtin/describe.c:484
 msgid "--dirty is incompatible with commit-ishes"
-msgstr ""
+msgstr "опцията „--dirty“ е несъвместима с указател към подаване"
 
 #: builtin/diff.c:85
 #, c-format
 msgid "'%s': not a regular file or symlink"
-msgstr ""
+msgstr "„%s“: не е нито обикновен файл, нито символна връзка"
 
 #: builtin/diff.c:236
 #, c-format
 msgid "invalid option: %s"
-msgstr ""
+msgstr "неправилна опция: %s"
 
 #: builtin/diff.c:357
 msgid "Not a git repository"
-msgstr ""
+msgstr "Не е хранилище на Git"
 
 #: builtin/diff.c:400
 #, c-format
 msgid "invalid object '%s' given."
-msgstr ""
+msgstr "зададен е неправилен обект „%s“."
 
 #: builtin/diff.c:409
 #, c-format
 msgid "more than two blobs given: '%s'"
-msgstr ""
+msgstr "зададени са повече от 2 обекта: „%s“"
 
 #: builtin/diff.c:416
 #, c-format
 msgid "unhandled object '%s' given."
-msgstr ""
+msgstr "зададен е неподдържан обект „%s“."
 
 #: builtin/fast-export.c:22
 msgid "git fast-export [rev-list-opts]"
 msgstr ""
 
 #: builtin/fast-export.c:673
-#, fuzzy
 msgid "show progress after <n> objects"
-msgstr "<брой>"
+msgstr "съобщение за напредъка на всеки такъв БРОЙ обекта"
 
 #: builtin/fast-export.c:675
 msgid "select handling of signed tags"
@@ -4865,165 +5058,168 @@ msgstr ""
 
 #: builtin/fetch.c:20
 msgid "git fetch [<options>] [<repository> [<refspec>...]]"
-msgstr ""
+msgstr "git fetch [ОПЦИИ] [ХРАНИЛИЩЕ [УКАЗАТЕЛ…]]"
 
 #: builtin/fetch.c:21
 msgid "git fetch [<options>] <group>"
-msgstr ""
+msgstr "git fetch [ОПЦИИ] ГРУПА"
 
 #: builtin/fetch.c:22
 msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
-msgstr ""
+msgstr "git fetch --multiple [ОПЦИИ] [(ХРАНИЛИЩЕ | ГРУПА)…]"
 
 #: builtin/fetch.c:23
 msgid "git fetch --all [<options>]"
-msgstr ""
+msgstr "git fetch --all [ОПЦИИ]"
 
 #: builtin/fetch.c:75
 msgid "fetch from all remotes"
-msgstr ""
+msgstr "доставяне от всички отдалечени хранилища"
 
 #: builtin/fetch.c:77
 msgid "append to .git/FETCH_HEAD instead of overwriting"
-msgstr ""
+msgstr "добавяне към вместо замяна на „.git/FETCH_HEAD“"
 
 #: builtin/fetch.c:79
 msgid "path to upload pack on remote end"
-msgstr ""
+msgstr "отдалечен път, където да се качи пакетът"
 
 #: builtin/fetch.c:80
 msgid "force overwrite of local branch"
-msgstr ""
+msgstr "принудително презаписване на локалния клон"
 
 #: builtin/fetch.c:82
 msgid "fetch from multiple remotes"
-msgstr ""
+msgstr "доставяне от множество отдалечени хранилища"
 
 #: builtin/fetch.c:84
 msgid "fetch all tags and associated objects"
-msgstr ""
+msgstr "доставяне на всички етикети и принадлежащи обекти"
 
 #: builtin/fetch.c:86
 msgid "do not fetch all tags (--no-tags)"
-msgstr ""
+msgstr "без доставянето на всички етикети „--no-tags“"
 
 #: builtin/fetch.c:88
 msgid "prune remote-tracking branches no longer on remote"
-msgstr ""
+msgstr "окастряне на клоните следящи вече не съществуващи отдалечени клони"
 
 #: builtin/fetch.c:89
 msgid "on-demand"
-msgstr ""
+msgstr "при нужда"
 
 #: builtin/fetch.c:90
 msgid "control recursive fetching of submodules"
-msgstr ""
+msgstr "управление на рекурсивното доставяне на подмодулите"
 
 #: builtin/fetch.c:94
 msgid "keep downloaded pack"
-msgstr ""
+msgstr "запазване на изтеглените пакети с обекти"
 
 #: builtin/fetch.c:96
 msgid "allow updating of HEAD ref"
-msgstr ""
+msgstr "позволяване на обновяването на указателя „HEAD“"
 
 #: builtin/fetch.c:99
 msgid "deepen history of shallow clone"
-msgstr ""
+msgstr "задълбочаване на историята на плитко хранилище"
 
 #: builtin/fetch.c:101
 msgid "convert to a complete repository"
-msgstr ""
+msgstr "превръщане в пълно хранилище"
 
 #: builtin/fetch.c:103 builtin/log.c:1197
 msgid "dir"
-msgstr ""
+msgstr "директория"
 
 #: builtin/fetch.c:104
 msgid "prepend this to submodule path output"
-msgstr ""
+msgstr "добавяне на това пред пътя на подмодула"
 
 #: builtin/fetch.c:107
 msgid "default mode for recursion"
-msgstr ""
+msgstr "стандартен режим на рекурсия"
 
 #: builtin/fetch.c:109
 msgid "accept refs that update .git/shallow"
-msgstr ""
+msgstr "приемане на указатели, които обновяват „.git/shallow“"
 
 #: builtin/fetch.c:347
 msgid "Couldn't find remote ref HEAD"
-msgstr ""
+msgstr "Указателят „HEAD“ в отдалеченото хранилище не може да бъде открит"
 
 #: builtin/fetch.c:411
 #, c-format
 msgid "object %s not found"
-msgstr ""
+msgstr "обектът „%s“ липсва"
 
 #: builtin/fetch.c:416
 msgid "[up to date]"
-msgstr ""
+msgstr "[актуализиран]"
 
+# FIXME - the signs
 #: builtin/fetch.c:430
 #, c-format
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
-msgstr ""
+msgstr "! %-*s %-*s -> %s  (в текущия клон не може да се доставя)"
 
 #: builtin/fetch.c:431 builtin/fetch.c:517
 msgid "[rejected]"
-msgstr ""
+msgstr "[отхвърлен]"
 
 #: builtin/fetch.c:442
 msgid "[tag update]"
-msgstr ""
+msgstr "[обновяване на етикетите]"
 
 #: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497
 msgid "  (unable to update local ref)"
-msgstr ""
+msgstr "  (локалните указатели не могат да бъдат обновени)"
 
 #: builtin/fetch.c:462
 msgid "[new tag]"
-msgstr ""
+msgstr "[нов етикет]"
 
 #: builtin/fetch.c:465
 msgid "[new branch]"
-msgstr ""
+msgstr "[нов клон]"
 
 #: builtin/fetch.c:468
 msgid "[new ref]"
-msgstr ""
+msgstr "[нов указател]"
 
 #: builtin/fetch.c:513
 msgid "unable to update local ref"
-msgstr ""
+msgstr "локален указател не може да бъде обновен"
 
 #: builtin/fetch.c:513
 msgid "forced update"
-msgstr ""
+msgstr "принудително обновяване"
 
 #: builtin/fetch.c:519
 msgid "(non-fast-forward)"
-msgstr ""
+msgstr "(сливането не е тривиално)"
 
 #: builtin/fetch.c:552 builtin/fetch.c:785
 #, c-format
 msgid "cannot open %s: %s\n"
-msgstr ""
+msgstr "файлът „%s“ не може да бъде отворен: %s\n"
 
 #: builtin/fetch.c:561
 #, c-format
 msgid "%s did not send all necessary objects\n"
-msgstr ""
+msgstr "хранилището „%s“ не изпрати всички необходими обекти\n"
 
 #: builtin/fetch.c:579
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
+"отхвърляне на върха „%s“, защото плитките хранилища не могат да бъдат "
+"обновявани"
 
 #: builtin/fetch.c:667 builtin/fetch.c:750
 #, c-format
 msgid "From %.*s\n"
-msgstr ""
+msgstr "От %.*s\n"
 
 #: builtin/fetch.c:678
 #, c-format
@@ -5031,20 +5227,23 @@ msgid ""
 "some local refs could not be updated; try running\n"
 " 'git remote prune %s' to remove any old, conflicting branches"
 msgstr ""
+"някои локални указатели не могат да бъдат обновени. Изпълнете командата\n"
+"  „git remote prune %s“, за да премахнете остарелите клони, които "
+"предизвикват конфликта"
 
 #: builtin/fetch.c:730
 #, c-format
 msgid "   (%s will become dangling)"
-msgstr ""
+msgstr "   (обектът „%s“ ще се окаже извън клон)"
 
 #: builtin/fetch.c:731
 #, c-format
 msgid "   (%s has become dangling)"
-msgstr ""
+msgstr "   (обектът „%s“ вече е извън клон)"
 
 #: builtin/fetch.c:755
 msgid "[deleted]"
-msgstr ""
+msgstr "[изтрит]"
 
 #: builtin/fetch.c:756 builtin/remote.c:1050
 msgid "(none)"
@@ -5054,98 +5253,103 @@ msgstr "(нищо)"
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr ""
+"Не може да изтегляте в текущия клон „%s“, на хранилище, което не е голо"
 
 #: builtin/fetch.c:794
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
-msgstr ""
+msgstr "Стойността „%2$s“ за опцията „%1$s“ не е съвместима с „%3$s“"
 
 #: builtin/fetch.c:797
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
-msgstr ""
+msgstr "Опцията „%s“ се игнорира при „%s“\n"
 
 #: builtin/fetch.c:853
 #, c-format
 msgid "Don't know how to fetch from %s"
-msgstr ""
+msgstr "Не се поддържа доставяне от „%s“"
 
 #: builtin/fetch.c:1015
 #, c-format
 msgid "Fetching %s\n"
-msgstr ""
+msgstr "Доставяне на „%s“\n"
 
 #: builtin/fetch.c:1017 builtin/remote.c:90
 #, c-format
 msgid "Could not fetch %s"
 msgstr "„%s“ не може да се достави"
 
-#: builtin/fetch.c:1036
+#: builtin/fetch.c:1035
 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
 msgid "You need to specify a tag name."
-msgstr ""
+msgstr "Трябва да укажете име на етикет."
 
 #: builtin/fetch.c:1107
 msgid "--depth and --unshallow cannot be used together"
-msgstr ""
+msgstr "опциите „--depth“ и „--unshallow“ са несъвместими"
 
 #: builtin/fetch.c:1109
 msgid "--unshallow on a complete repository does not make sense"
-msgstr ""
+msgstr "не можете да използвате опцията „--unshallow“ върху пълно хранилище"
 
 #: builtin/fetch.c:1132
 msgid "fetch --all does not take a repository argument"
-msgstr ""
+msgstr "към „git fetch --all“ не можете да добавите хранилище аргумент"
 
 #: builtin/fetch.c:1134
 msgid "fetch --all does not make sense with refspecs"
 msgstr ""
+"към „git fetch --all“ не можете да добавите указател на версия за аргумент"
 
 #: builtin/fetch.c:1145
 #, c-format
 msgid "No such remote or remote group: %s"
-msgstr ""
+msgstr "Няма нито отдалечено хранилище, нито група от хранилища на име „%s“"
 
 #: builtin/fetch.c:1153
 msgid "Fetching a group and specifying refspecs does not make sense"
-msgstr ""
+msgstr "Указването на група и указването на версия са несъвместими"
 
 #: builtin/fmt-merge-msg.c:13
-#, fuzzy
 msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
-msgstr "<брой>"
+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:702
-#: builtin/merge.c:196 builtin/show-branch.c:654 builtin/show-ref.c:178
-#: builtin/tag.c:446 parse-options.h:135 parse-options.h:242
+#: 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
+#: parse-options.h:132 parse-options.h:239
 msgid "n"
-msgstr "бÑ\80ой"
+msgstr "Ð\91РÐ\9eÐ\99"
 
 #: builtin/fmt-merge-msg.c:664
-#, fuzzy
 msgid "populate log with at most <n> entries from shortlog"
-msgstr "<брой>"
+msgstr ""
+"вмъкване на журнал състоящ се от не повече от БРОЙ записа от съкратения "
+"журнал"
 
 #: builtin/fmt-merge-msg.c:667
 msgid "alias for --log (deprecated)"
-msgstr ""
+msgstr "синоним на „--log“ (остаряло)"
 
 #: builtin/fmt-merge-msg.c:670
 msgid "text"
-msgstr ""
+msgstr "ТЕКСТ"
 
 #: builtin/fmt-merge-msg.c:671
 msgid "use <text> as start of message"
-msgstr ""
+msgstr "за начало на съобщението да се ползва ТЕКСТ"
 
 #: builtin/fmt-merge-msg.c:672
 msgid "file to read from"
-msgstr ""
+msgstr "файл, от който да се чете"
 
 #: builtin/for-each-ref.c:1063
 msgid "git for-each-ref [options] [<pattern>]"
@@ -5168,17 +5372,16 @@ msgid "quote placeholders suitably for tcl"
 msgstr ""
 
 #: builtin/for-each-ref.c:1087
-#, fuzzy
 msgid "show only <n> matched refs"
-msgstr "<брой>"
+msgstr "извеждане само на този БРОЙ напаснати указатели"
 
 #: builtin/for-each-ref.c:1088 builtin/replace.c:177
 msgid "format"
-msgstr ""
+msgstr "ФОРМАТ"
 
 #: builtin/for-each-ref.c:1088
 msgid "format to use for the output"
-msgstr ""
+msgstr "ФОРМАТ за изхода"
 
 #: builtin/for-each-ref.c:1089
 msgid "key"
@@ -5188,9 +5391,17 @@ msgstr ""
 msgid "field name to sort on"
 msgstr ""
 
+#: builtin/fsck.c:147 builtin/prune.c:172
+msgid "Checking connectivity"
+msgstr "Проверка на връзката"
+
+#: builtin/fsck.c:544
+msgid "Checking object directories"
+msgstr "Проверка на директориите с обекти"
+
 #: builtin/fsck.c:607
 msgid "git fsck [options] [<object>...]"
-msgstr "git fsck [ОПЦИИ] [<ОБЕКТ>…]"
+msgstr "git fsck [ОПЦИИ] [ОБЕКТ…]"
 
 #: builtin/fsck.c:613
 msgid "show unreachable objects"
@@ -5212,13 +5423,12 @@ msgstr "показване на кореновите възли"
 msgid "make index objects head nodes"
 msgstr "задаване на обекти от индекса да са коренови"
 
+# FIXME bad message
 #: builtin/fsck.c:618
-#, fuzzy
 msgid "make reflogs head nodes (default)"
 msgstr "проследяване на указателите от журнала като глави (стандартно)"
 
 #: builtin/fsck.c:619
-#, fuzzy
 msgid "also consider packs and alternate objects"
 msgstr "допълнително да се проверяват пакетите и алтернативните обекти"
 
@@ -5234,51 +5444,61 @@ msgstr "запазване на обектите извън клоните в д
 msgid "show progress"
 msgstr "показване на напредъка"
 
+#: builtin/fsck.c:673
+msgid "Checking objects"
+msgstr "Проверка на обектите"
+
 #: builtin/gc.c:24
 msgid "git gc [options]"
 msgstr "git gc [ОПЦИИ]"
 
-#: builtin/gc.c:80
+#: builtin/gc.c:90
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "Неправилна стойност за „%s“: „%s“"
 
-#: builtin/gc.c:107
+#: builtin/gc.c:117
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "прекалено дълга директория с обекти „%.*s“"
 
-#: builtin/gc.c:262
+#: builtin/gc.c:273
 msgid "prune unreferenced objects"
 msgstr "окастряне на обектите, към които нищо не сочи"
 
-#: builtin/gc.c:264
+#: builtin/gc.c:275
 msgid "be more thorough (increased runtime)"
 msgstr "изчерпателно търсене на боклука (за сметка на повече време работа)"
 
-#: builtin/gc.c:265
+#: builtin/gc.c:276
 msgid "enable auto-gc mode"
 msgstr "включване на автоматичното събиране на боклука (auto-gc)"
 
-#: builtin/gc.c:266
+#: builtin/gc.c:277
 msgid "force running gc even if there may be another gc running"
 msgstr ""
 "изрично стартиране на събирането на боклука, дори и ако вече работи друго "
 "събиране"
 
-#: builtin/gc.c:306
+#: builtin/gc.c:318
 #, c-format
-msgid ""
-"Auto packing the repository for optimum performance. You may also\n"
-"run \"git gc\" manually. See \"git help gc\" for more information.\n"
+msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
-"Автоматично пакетиране на хранилището за най-добра производителност. Можете "
-"и\n"
-"ръчно да стартирате „git gc“. За подробности погледнете помощта: „git help "
-"gc“.\n"
+"Автоматично пакетиране на заден фон на хранилището за по-добра "
+"производителност.\n"
 
-#. be quiet on --auto
-#: builtin/gc.c:316
+#: builtin/gc.c:320
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
+msgstr "Автоматично пакетиране на хранилището за по-добра производителност.\n"
+
+#: builtin/gc.c:321
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
+msgstr ""
+"Вижте ръководството за повече информация как да изпълните „git help gc“.\n"
+
+#: builtin/gc.c:336
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5287,7 +5507,7 @@ msgstr ""
 "процеса: %<PRIuMAX> (ако сте сигурни, че това не е вярно, това използвайте\n"
 "опцията „--force“)"
 
-#: builtin/gc.c:341
+#: builtin/gc.c:361
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -5297,236 +5517,248 @@ msgstr ""
 
 #: builtin/grep.c:23
 msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]"
-msgstr ""
+msgstr "git grep [ОПЦИИ] [-e] ШАБЛОН [ВЕРСИЯ…] [[--] ПЪТ…]"
 
 #: builtin/grep.c:218
 #, c-format
 msgid "grep: failed to create thread: %s"
-msgstr ""
+msgstr "grep: неуспешно създаване на нишка: %s"
 
 #: builtin/grep.c:365
 #, c-format
 msgid "Failed to chdir: %s"
-msgstr ""
+msgstr "Неуспешна смяна на директория: %s"
 
 #: builtin/grep.c:443 builtin/grep.c:478
 #, c-format
 msgid "unable to read tree (%s)"
-msgstr ""
+msgstr "дървото не може да бъде прочетено (%s)"
 
 #: builtin/grep.c:493
 #, c-format
 msgid "unable to grep from object of type %s"
-msgstr ""
+msgstr "не може да се изпълни „grep“ от обект от вида %s"
 
-#: builtin/grep.c:551
+#: builtin/grep.c:549
 #, c-format
 msgid "switch `%c' expects a numerical value"
-msgstr ""
+msgstr "опцията „%c“ очаква число за аргумент"
 
-#: builtin/grep.c:568
+#: builtin/grep.c:566
 #, c-format
 msgid "cannot open '%s'"
-msgstr ""
+msgstr "„%s“ не може да бъде отворен"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:640
 msgid "search in index instead of in the work tree"
-msgstr ""
+msgstr "търсене в индекса, а не в работното дърво"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:642
 msgid "find in contents not managed by git"
-msgstr ""
+msgstr "търсене и във файловете, които не са под управлението на git"
 
-#: builtin/grep.c:646
+#: builtin/grep.c:644
 msgid "search in both tracked and untracked files"
-msgstr ""
+msgstr "търсене и в следените, и в неследените файлове"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:646
 msgid "search also in ignored files"
-msgstr ""
+msgstr "търсене и в игнорираните файлове"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:649
 msgid "show non-matching lines"
-msgstr ""
+msgstr "извеждане на редовете, които не съвпадат"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:651
 msgid "case insensitive matching"
-msgstr ""
+msgstr "без значение на регистъра на буквите (главни/малки)"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:653
 msgid "match patterns only at word boundaries"
-msgstr ""
+msgstr "напасване на шаблоните само по границите на думите"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:655
 msgid "process binary files as text"
-msgstr ""
+msgstr "обработване на двоичните файлове като текстови"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:657
 msgid "don't match patterns in binary files"
-msgstr ""
+msgstr "прескачане на двоичните файлове"
 
-#: builtin/grep.c:662
+#: builtin/grep.c:660
 msgid "process binary files with textconv filters"
 msgstr ""
+"обработване на двоичните файлове чрез филтри за преобразуване към текст"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:662
 msgid "descend at most <depth> levels"
-msgstr ""
+msgstr "навлизане максимално на тази ДЪЛБОЧИНА в дървото"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:666
 msgid "use extended POSIX regular expressions"
-msgstr ""
+msgstr "разширени регулярни изрази по POSIX"
 
-#: builtin/grep.c:671
+#: builtin/grep.c:669
 msgid "use basic POSIX regular expressions (default)"
-msgstr ""
+msgstr "основни регулярни изрази по POSIX (стандартно)"
 
-#: builtin/grep.c:674
+#: builtin/grep.c:672
 msgid "interpret patterns as fixed strings"
-msgstr ""
+msgstr "шаблоните са дословни низове"
 
-#: builtin/grep.c:677
+#: builtin/grep.c:675
 msgid "use Perl-compatible regular expressions"
-msgstr ""
+msgstr "регулярни изрази на Perl"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:678
 msgid "show line numbers"
-msgstr ""
+msgstr "извеждане на номерата на редовете"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:679
 msgid "don't show filenames"
-msgstr ""
+msgstr "без извеждане на имената на файловете"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:680
 msgid "show filenames"
-msgstr ""
+msgstr "извеждане на имената на файловете"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:682
 msgid "show filenames relative to top directory"
 msgstr ""
+"извеждане на относителните имена на файловете спрямо основната директория на "
+"хранилището"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:684
 msgid "show only filenames instead of matching lines"
-msgstr ""
+msgstr "извеждане само на имената на файловете без напасващите редове"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:686
 msgid "synonym for --files-with-matches"
-msgstr ""
+msgstr "синоним на „--files-with-matches“"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:689
 msgid "show only the names of files without match"
 msgstr ""
+"извеждане само на имената на файловете, които не съдържат ред, напасващ на "
+"шаблона"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:691
 msgid "print NUL after filenames"
-msgstr ""
+msgstr "извеждане на нулевия знак „NUL“ след всяко име на файл"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:693
 msgid "show the number of matches instead of matching lines"
-msgstr ""
+msgstr "извеждане на броя на съвпаденията вместо напасващите редове"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:694
 msgid "highlight matches"
-msgstr ""
+msgstr "оцветяване на напасванията"
 
-#: builtin/grep.c:698
+#: builtin/grep.c:696
 msgid "print empty line between matches from different files"
-msgstr ""
+msgstr "извеждане на празен ред между напасванията от различни файлове"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:698
 msgid "show filename only once above matches from same file"
 msgstr ""
+"извеждане на името на файла само веднъж за всички напасвания от този файл"
 
-#: builtin/grep.c:703
-#, fuzzy
+#: builtin/grep.c:701
 msgid "show <n> context lines before and after matches"
-msgstr "<брой>"
+msgstr "извеждане на такъв БРОЙ редове преди и след напасванията"
 
-#: builtin/grep.c:706
-#, fuzzy
+#: builtin/grep.c:704
 msgid "show <n> context lines before matches"
-msgstr "<брой>"
+msgstr "извеждане на такъв БРОЙ редове преди напасванията"
 
-#: builtin/grep.c:708
-#, fuzzy
+#: builtin/grep.c:706
 msgid "show <n> context lines after matches"
-msgstr "<брой>"
+msgstr "извеждане на такъв БРОЙ редове след напасванията"
 
-#: builtin/grep.c:709
+#: builtin/grep.c:707
 msgid "shortcut for -C NUM"
-msgstr ""
+msgstr "синоним на „-C БРОЙ“"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:710
 msgid "show a line with the function name before matches"
-msgstr ""
+msgstr "извеждане на ред с името на функцията, в която е напаснат шаблона"
 
-#: builtin/grep.c:714
+#: builtin/grep.c:712
 msgid "show the surrounding function"
-msgstr ""
+msgstr "извеждане на обхващащата функция"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:715
 msgid "read patterns from file"
-msgstr ""
+msgstr "изчитане на шаблоните от файл"
 
-#: builtin/grep.c:719
+#: builtin/grep.c:717
 msgid "match <pattern>"
-msgstr ""
+msgstr "напасване на ШАБЛОН"
 
-#: builtin/grep.c:721
+#: builtin/grep.c:719
 msgid "combine patterns specified with -e"
-msgstr ""
+msgstr "комбиниране на шаблоните указани с опцията „-e“"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:731
 msgid "indicate hit with exit status without output"
 msgstr ""
+"без извеждане на стандартния изход. Изходният код указва наличието на "
+"напасване"
 
-#: builtin/grep.c:735
+#: builtin/grep.c:733
 msgid "show only matches from files that match all patterns"
 msgstr ""
+"извеждане на редове само от файловете, които напасват на всички шаблони"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:735
 msgid "show parse tree for grep expression"
-msgstr ""
+msgstr "извеждане на дървото за анализ на регулярния израз"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:739
 msgid "pager"
-msgstr ""
+msgstr "програма за обхождане"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:739
 msgid "show matching files in the pager"
-msgstr ""
+msgstr "извеждане на съвпадащите файлове в програма за обхождане"
 
-#: builtin/grep.c:744
+#: builtin/grep.c:742
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr ""
+"позволяване на стартирането на grep(1) (текущият компилат пренебрегва тази "
+"опция)"
 
-#: builtin/grep.c:745 builtin/show-ref.c:187
+#: builtin/grep.c:743 builtin/show-ref.c:187
 msgid "show usage"
-msgstr ""
+msgstr "извеждане на начина на употреба на командата"
 
-#: builtin/grep.c:812
+#: builtin/grep.c:810
 msgid "no pattern given."
-msgstr ""
+msgstr "липсва шаблон."
 
-#: builtin/grep.c:870
+#: builtin/grep.c:868
 msgid "--open-files-in-pager only works on the worktree"
 msgstr ""
+"опцията „--open-files-in-pager“ е съвместима само с търсене в работното дърво"
 
-#: builtin/grep.c:893
+#: builtin/grep.c:891
 msgid "--cached or --untracked cannot be used with --no-index."
-msgstr ""
+msgstr "опциите „--cached“ и „--untracked“ са несъвместими с „--no-index“."
 
-#: builtin/grep.c:898
+#: builtin/grep.c:896
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr ""
+"опциите „--cached“ и „--untracked“ са несъвместими с търсене във версии."
 
-#: builtin/grep.c:901
+#: builtin/grep.c:899
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
+"опциите „--(no-)exclude-standard“ са несъвместими с търсене по следени "
+"файлове."
 
-#: builtin/grep.c:909
+#: builtin/grep.c:907
 msgid "both --cached and trees are given."
-msgstr ""
+msgstr "опцията „--cached“ е несъвместима със задаване на дърво."
 
 #: builtin/hash-object.c:60
 msgid ""
@@ -5538,7 +5770,7 @@ msgstr ""
 msgid "git hash-object  --stdin-paths < <list-of-paths>"
 msgstr ""
 
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:72 builtin/tag.c:521
 msgid "type"
 msgstr ""
 
@@ -5777,8 +6009,8 @@ msgstr ""
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr ""
 
-#: builtin/index-pack.c:669 builtin/pack-objects.c:171
-#: builtin/pack-objects.c:263
+#: builtin/index-pack.c:669 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
 #, c-format
 msgid "unable to read %s"
 msgstr ""
@@ -5895,7 +6127,7 @@ msgstr ""
 
 #: builtin/index-pack.c:1325
 msgid "cannot store index file"
-msgstr ""
+msgstr "файлът за индекса не може да бъде съхранен"
 
 #: builtin/index-pack.c:1358
 #, c-format
@@ -6044,424 +6276,435 @@ msgstr ""
 msgid "unable to move %s to %s"
 msgstr ""
 
-#.
-#. * TRANSLATORS: The first '%s' is either "Reinitialized
-#. * existing" or "Initialized empty", the second " shared" or
-#. * "", and the last '%s%s' is the verbatim directory name.
-#.
-#: builtin/init-db.c:420
+#. 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 ""
 
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
 msgid "Reinitialized existing"
 msgstr ""
 
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
 msgid "Initialized empty"
 msgstr ""
 
-#: builtin/init-db.c:422
+#: builtin/init-db.c:420
 msgid " shared"
 msgstr ""
 
-#: builtin/init-db.c:441
+#: builtin/init-db.c:439
 msgid "cannot tell cwd"
 msgstr ""
 
-#: builtin/init-db.c:467
+#: builtin/init-db.c:465
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [directory]"
 msgstr ""
 
-#: builtin/init-db.c:490
+#: builtin/init-db.c:488
 msgid "permissions"
 msgstr ""
 
-#: builtin/init-db.c:491
+#: builtin/init-db.c:489
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr ""
 
-#: builtin/init-db.c:493 builtin/prune-packed.c:79 builtin/repack.c:155
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
 msgid "be quiet"
-msgstr ""
+msgstr "без извеждане на информация"
 
-#: builtin/init-db.c:522 builtin/init-db.c:529
+#: builtin/init-db.c:523 builtin/init-db.c:528
 #, c-format
 msgid "cannot mkdir %s"
 msgstr ""
 
-#: builtin/init-db.c:533
+#: builtin/init-db.c:532
 #, c-format
 msgid "cannot chdir to %s"
 msgstr ""
 
-#: builtin/init-db.c:555
+#: builtin/init-db.c:554
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
 "dir=<directory>)"
 msgstr ""
 
-#: builtin/init-db.c:579
+#: builtin/init-db.c:578
 msgid "Cannot access current working directory"
 msgstr ""
 
-#: builtin/init-db.c:586
+#: builtin/init-db.c:585
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr ""
 
 #: builtin/log.c:41
 msgid "git log [<options>] [<revision range>] [[--] <path>...]\n"
-msgstr ""
+msgstr "git log [ОПЦИИ] [ДИАПАЗОН_НА_ВЕРСИИТЕ] [[--] ПЪТ…]\n"
 
 #: builtin/log.c:42
 msgid "   or: git show [options] <object>..."
-msgstr ""
+msgstr "   или: git show [ОПЦИИ] ОБЕКТ…"
 
 #: builtin/log.c:125
 msgid "suppress diff output"
-msgstr ""
+msgstr "без извеждане на разликите"
 
 #: builtin/log.c:126
 msgid "show source"
-msgstr ""
+msgstr "извеждане на изходния код"
 
 #: builtin/log.c:127
 msgid "Use mail map file"
 msgstr ""
+"Използване на файл за съответствията на имената и адресите на е-поща („."
+"mailmap“)"
 
 #: builtin/log.c:128
 msgid "decorate options"
-msgstr ""
+msgstr "настройки на форма̀та на извежданата информация"
 
 #: builtin/log.c:231
 #, c-format
 msgid "Final output: %d %s\n"
-msgstr ""
+msgstr "Резултат: %d %s\n"
 
 #: builtin/log.c:473 builtin/log.c:565
 #, c-format
 msgid "Could not read object %s"
-msgstr ""
+msgstr "Обектът не може да бъде прочетен: %s"
 
 #: builtin/log.c:589
 #, c-format
 msgid "Unknown type: %d"
-msgstr ""
+msgstr "Неизвестен вид: %d"
 
 #: builtin/log.c:689
 msgid "format.headers without value"
-msgstr ""
+msgstr "не е зададена стойност на „format.headers“"
 
 #: builtin/log.c:771
 msgid "name of output directory is too long"
-msgstr ""
+msgstr "прекалено дълго име на директорията за изходната информация"
 
 #: builtin/log.c:787
 #, c-format
 msgid "Cannot open patch file %s"
-msgstr ""
+msgstr "Файлът-кръпка „%s“ не може да бъде отворен"
 
 #: builtin/log.c:801
 msgid "Need exactly one range."
-msgstr ""
+msgstr "Трябва да зададете точно един диапазон."
 
 #: builtin/log.c:809
 msgid "Not a range."
-msgstr ""
+msgstr "Не е диапазон."
 
 #: builtin/log.c:911
 msgid "Cover letter needs email format"
-msgstr ""
+msgstr "Придружаващото писмо трябва да е форматирано като е-писмо"
 
 #: builtin/log.c:987
 #, c-format
 msgid "insane in-reply-to: %s"
-msgstr ""
+msgstr "неправилен формат на заглавната част  за отговор „in-reply-to“: %s"
 
 #: builtin/log.c:1015
 msgid "git format-patch [options] [<since> | <revision range>]"
-msgstr ""
+msgstr "git format-patch [ОПЦИИ] [ОТ | ДИАПАЗОН_НА_ВЕРСИИТЕ]"
 
+# FIXME message
 #: builtin/log.c:1060
 msgid "Two output directories?"
 msgstr ""
+"Можете да укажете максимум една директория за изход, а сте задали поне две."
 
 #: builtin/log.c:1175
 msgid "use [PATCH n/m] even with a single patch"
-msgstr ""
+msgstr "номерация „[PATCH n/m]“ дори и при единствена кръпка"
 
 #: builtin/log.c:1178
 msgid "use [PATCH] even with multiple patches"
-msgstr ""
+msgstr "номерация „[PATCH]“ дори и при множество кръпки"
 
 #: builtin/log.c:1182
 msgid "print patches to standard out"
-msgstr ""
+msgstr "извеждане на кръпките на стандартния изход"
 
 #: builtin/log.c:1184
 msgid "generate a cover letter"
-msgstr ""
+msgstr "създаване на придружаващо писмо"
 
 #: builtin/log.c:1186
 msgid "use simple number sequence for output file names"
-msgstr ""
+msgstr "проста числова последователност за имената на файловете-кръпки"
 
 #: builtin/log.c:1187
 msgid "sfx"
-msgstr ""
+msgstr "ЗНАЦИ"
 
 #: builtin/log.c:1188
 msgid "use <sfx> instead of '.patch'"
-msgstr ""
+msgstr "използване на тези ЗНАЦИ за суфикс вместо „.patch“"
 
 #: builtin/log.c:1190
-#, fuzzy
 msgid "start numbering patches at <n> instead of 1"
-msgstr "<брой>"
+msgstr "номерирането на кръпките да започва от този БРОЙ, а не с 1"
 
 #: builtin/log.c:1192
 msgid "mark the series as Nth re-roll"
-msgstr ""
+msgstr "отбелязване, че това е N-тата поредна редакция на поредицата от кръпки"
 
 #: builtin/log.c:1194
 msgid "Use [<prefix>] instead of [PATCH]"
-msgstr ""
+msgstr "Използване на този „[ПРЕФИКС]“ вместо „[PATCH]“"
 
 #: builtin/log.c:1197
 msgid "store resulting files in <dir>"
-msgstr ""
+msgstr "запазване на изходните файлове в тази ДИРЕКТОРИЯ"
 
 #: builtin/log.c:1200
 msgid "don't strip/add [PATCH]"
-msgstr ""
+msgstr "без добавяне/махане на префикса „[PATCH]“"
 
 #: builtin/log.c:1203
 msgid "don't output binary diffs"
-msgstr ""
+msgstr "без извеждане на разлики между двоични файлове"
 
 #: builtin/log.c:1205
 msgid "don't include a patch matching a commit upstream"
-msgstr ""
+msgstr "да не се включват кръпки, които присъстват в следения клон"
 
 #: builtin/log.c:1207
 msgid "show patch format instead of default (patch + stat)"
 msgstr ""
+"извеждане във формат за кръпки, а на в стандартния (кръпка и статистика)"
 
 #: builtin/log.c:1209
 msgid "Messaging"
-msgstr ""
+msgstr "Опции при изпращане"
 
 #: builtin/log.c:1210
 msgid "header"
-msgstr ""
+msgstr "ЗАГЛАВНА_ЧАСТ"
 
 #: builtin/log.c:1211
 msgid "add email header"
-msgstr ""
+msgstr "добавяне на тази ЗАГЛАВНА_ЧАСТ"
 
 #: builtin/log.c:1212 builtin/log.c:1214
 msgid "email"
-msgstr ""
+msgstr "Е-ПОЩА"
 
 #: builtin/log.c:1212
 msgid "add To: header"
-msgstr ""
+msgstr "добавяне на заглавна част „To:“ (до)"
 
 #: builtin/log.c:1214
 msgid "add Cc: header"
-msgstr ""
+msgstr "добавяне на заглавна част „Cc:“ (и до)"
 
 #: builtin/log.c:1216
 msgid "ident"
-msgstr ""
+msgstr "ИДЕНТИЧНОСТ"
 
 #: builtin/log.c:1217
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
+"задаване на адреса в заглавната част „From“ да е тази ИДЕНТИЧНОСТ. Ако не е "
+"зададена такава, се взима адреса на подаващия"
 
 #: builtin/log.c:1219
 msgid "message-id"
-msgstr ""
+msgstr "ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
 
 #: builtin/log.c:1220
 msgid "make first mail a reply to <message-id>"
 msgstr ""
+"първото съобщение да е в отговор на е-писмото с този "
+"ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
 
 #: builtin/log.c:1221 builtin/log.c:1224
 msgid "boundary"
-msgstr ""
+msgstr "граница"
 
 #: builtin/log.c:1222
 msgid "attach the patch"
-msgstr ""
+msgstr "прикрепяне на кръпката"
 
 #: builtin/log.c:1225
 msgid "inline the patch"
-msgstr ""
+msgstr "включване на кръпката в текста на писмата"
 
 #: builtin/log.c:1229
 msgid "enable message threading, styles: shallow, deep"
 msgstr ""
+"използване на нишки за съобщенията. Стилът е „shallow“ (плитък) или "
+"„deep“ (дълбок)"
 
 #: builtin/log.c:1231
 msgid "signature"
-msgstr ""
+msgstr "подпис"
 
 #: builtin/log.c:1232
 msgid "add a signature"
-msgstr ""
+msgstr "добавяне на поле за подпис"
 
 #: builtin/log.c:1233
 msgid "don't print the patch filenames"
-msgstr ""
+msgstr "без извеждане на имената на кръпките"
 
 #: builtin/log.c:1307
 #, c-format
 msgid "invalid ident line: %s"
-msgstr ""
+msgstr "грешна идентичност: %s"
 
 #: builtin/log.c:1322
 msgid "-n and -k are mutually exclusive."
-msgstr ""
+msgstr "опциите „-n“ и „-k“ са несъвместими."
 
 #: builtin/log.c:1324
 msgid "--subject-prefix and -k are mutually exclusive."
-msgstr ""
+msgstr "опциите „--subject-prefix“ и „-k“ са несъвместими."
 
 #: builtin/log.c:1332
 msgid "--name-only does not make sense"
-msgstr ""
+msgstr "опцията „--name-only“ е несъвместима с генерирането на кръпки"
 
 #: builtin/log.c:1334
 msgid "--name-status does not make sense"
-msgstr ""
+msgstr "опцията „--name-status“ е несъвместима с генерирането на кръпки"
 
 #: builtin/log.c:1336
 msgid "--check does not make sense"
-msgstr ""
+msgstr "опцията „--check“ е несъвместима с генерирането на кръпки"
 
 #: builtin/log.c:1359
 msgid "standard output, or directory, which one?"
 msgstr ""
+"изходът може да или стандартният, или да е в директория, но не и двете."
 
 #: builtin/log.c:1361
 #, c-format
 msgid "Could not create directory '%s'"
-msgstr ""
+msgstr "Папката „%s“ не може да бъде създадена"
 
 #: builtin/log.c:1509
 msgid "Failed to create output files"
-msgstr ""
+msgstr "Изходните файлове не могат да бъдат създадени"
 
 #: builtin/log.c:1558
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
-msgstr ""
+msgstr "git cherry [-v] [ОТДАЛЕЧЕН_КЛОН [ВРЪХ [ПРЕДЕЛ]]]"
 
 #: builtin/log.c:1613
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
 msgstr ""
+"Следеният отдалечен клон не бе открит, затова изрично задайте "
+"ОТДАЛЕЧЕН_КЛОН.\n"
 
 #: builtin/log.c:1626 builtin/log.c:1628 builtin/log.c:1640
 #, c-format
 msgid "Unknown commit %s"
-msgstr ""
+msgstr "Непознато подаване „%s“"
 
-#: builtin/ls-files.c:398
+#: builtin/ls-files.c:401
 msgid "git ls-files [options] [<file>...]"
 msgstr ""
 
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:458
 msgid "identify the file status with tags"
 msgstr ""
 
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:460
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr ""
 
-#: builtin/ls-files.c:459
+#: builtin/ls-files.c:462
 msgid "show cached files in the output (default)"
 msgstr ""
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:464
 msgid "show deleted files in the output"
 msgstr ""
 
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:466
 msgid "show modified files in the output"
 msgstr ""
 
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:468
 msgid "show other files in the output"
 msgstr ""
 
-#: builtin/ls-files.c:467
+#: builtin/ls-files.c:470
 msgid "show ignored files in the output"
 msgstr ""
 
-#: builtin/ls-files.c:470
+#: builtin/ls-files.c:473
 msgid "show staged contents' object name in the output"
 msgstr ""
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:475
 msgid "show files on the filesystem that need to be removed"
 msgstr ""
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:477
 msgid "show 'other' directories' name only"
 msgstr ""
 
-#: builtin/ls-files.c:477
+#: builtin/ls-files.c:480
 msgid "don't show empty directories"
 msgstr ""
 
-#: builtin/ls-files.c:480
+#: builtin/ls-files.c:483
 msgid "show unmerged files in the output"
 msgstr ""
 
-#: builtin/ls-files.c:482
+#: builtin/ls-files.c:485
 msgid "show resolve-undo information"
 msgstr ""
 
-#: builtin/ls-files.c:484
+#: builtin/ls-files.c:487
 msgid "skip files matching pattern"
 msgstr ""
 
-#: builtin/ls-files.c:487
+#: builtin/ls-files.c:490
 msgid "exclude patterns are read from <file>"
 msgstr ""
 
-#: builtin/ls-files.c:490
+#: builtin/ls-files.c:493
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr ""
 
-#: builtin/ls-files.c:492
+#: builtin/ls-files.c:495
 msgid "add the standard git exclusions"
 msgstr ""
 
-#: builtin/ls-files.c:495
+#: builtin/ls-files.c:498
 msgid "make the output relative to the project top directory"
 msgstr ""
 
-#: builtin/ls-files.c:498
+#: builtin/ls-files.c:501
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr ""
 
-#: builtin/ls-files.c:499
+#: builtin/ls-files.c:502
 msgid "tree-ish"
 msgstr ""
 
-#: builtin/ls-files.c:500
+#: builtin/ls-files.c:503
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 
-#: builtin/ls-files.c:502
+#: builtin/ls-files.c:505
 msgid "show debugging data"
 msgstr ""
 
@@ -6483,7 +6726,7 @@ msgstr ""
 
 #: builtin/ls-tree.c:133
 msgid "terminate entries with NUL byte"
-msgstr ""
+msgstr "разделяне на обектите с нулевия знак „NUL“"
 
 #: builtin/ls-tree.c:134
 msgid "include object size"
@@ -6545,9 +6788,10 @@ msgid "(synonym to --stat)"
 msgstr ""
 
 #: builtin/merge.c:197
-#, fuzzy
 msgid "add (at most <n>) entries from shortlog to merge commit message"
-msgstr "<брой>"
+msgstr ""
+"добавяне (на максимум такъв БРОЙ) записи от съкратения журнал в съобщението "
+"за подаване"
 
 #: builtin/merge.c:200
 msgid "create a single commit instead of doing a merge"
@@ -6573,9 +6817,9 @@ msgstr ""
 msgid "Verify that the named commit has a valid GPG signature"
 msgstr ""
 
-#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89
+#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
 msgid "strategy"
-msgstr ""
+msgstr "стратегия"
 
 #: builtin/merge.c:213
 msgid "merge strategy to use"
@@ -6646,35 +6890,35 @@ msgstr ""
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr ""
 
-#: builtin/merge.c:650
+#: builtin/merge.c:653
 msgid "git write-tree failed to write a tree"
-msgstr ""
+msgstr "Командата „git write-tree“ не успя да запише обект-дърво"
 
-#: builtin/merge.c:678
+#: builtin/merge.c:681
 msgid "Not handling anything other than two heads merge."
 msgstr ""
 
-#: builtin/merge.c:692
+#: builtin/merge.c:695
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr ""
 
-#: builtin/merge.c:706
+#: builtin/merge.c:709
 #, c-format
 msgid "unable to write %s"
 msgstr ""
 
-#: builtin/merge.c:795
+#: builtin/merge.c:798
 #, c-format
 msgid "Could not read from '%s'"
 msgstr ""
 
-#: builtin/merge.c:804
+#: builtin/merge.c:807
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 
-#: builtin/merge.c:810
+#: builtin/merge.c:813
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -6684,157 +6928,162 @@ msgid ""
 "the commit.\n"
 msgstr ""
 
-#: builtin/merge.c:834
+#: builtin/merge.c:837
 msgid "Empty commit message."
 msgstr ""
 
-#: builtin/merge.c:846
+#: builtin/merge.c:849
 #, c-format
 msgid "Wonderful.\n"
 msgstr ""
 
-#: builtin/merge.c:911
+#: builtin/merge.c:914
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 
-#: builtin/merge.c:927
+#: builtin/merge.c:930
 #, c-format
 msgid "'%s' is not a commit"
 msgstr ""
 
-#: builtin/merge.c:968
+#: builtin/merge.c:971
 msgid "No current branch."
 msgstr ""
 
-#: builtin/merge.c:970
+#: builtin/merge.c:973
 msgid "No remote for the current branch."
 msgstr ""
 
-#: builtin/merge.c:972
+#: builtin/merge.c:975
 msgid "No default upstream defined for the current branch."
 msgstr ""
 
-#: builtin/merge.c:977
+#: builtin/merge.c:980
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr ""
 
-#: builtin/merge.c:1133
+#: builtin/merge.c:1136
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr ""
 
-#: builtin/merge.c:1149 git-pull.sh:31
+#: builtin/merge.c:1152 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"
+"Подайте промените си, преди да започнете ново сливане."
 
-#: builtin/merge.c:1152 git-pull.sh:34
+#: builtin/merge.c:1155 git-pull.sh:34
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
-msgstr ""
+msgstr "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува)."
 
-#: builtin/merge.c:1156
+#: builtin/merge.c:1159
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you can merge."
 msgstr ""
+"Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
+"съществува). Подайте промените си, преди да започнете ново сливане."
 
-#: builtin/merge.c:1159
+#: builtin/merge.c:1162
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr ""
+"Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
+"съществува)."
 
-#: builtin/merge.c:1168
+#: builtin/merge.c:1171
 msgid "You cannot combine --squash with --no-ff."
 msgstr ""
 
-#: builtin/merge.c:1177
+#: builtin/merge.c:1180
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr ""
 
-#: builtin/merge.c:1209
+#: builtin/merge.c:1212
 msgid "Can merge only exactly one commit into empty head"
 msgstr ""
 
-#: builtin/merge.c:1212
+#: builtin/merge.c:1215
 msgid "Squash commit into empty head not supported yet"
 msgstr ""
 
-#: builtin/merge.c:1214
+#: builtin/merge.c:1217
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
 
-#: builtin/merge.c:1219
+#: builtin/merge.c:1222
 #, c-format
 msgid "%s - not something we can merge"
 msgstr ""
 
-#: builtin/merge.c:1270
+#: builtin/merge.c:1273
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 
-#: builtin/merge.c:1273
+#: builtin/merge.c:1276
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr ""
 
-#. 'N'
-#: builtin/merge.c:1276
+#: builtin/merge.c:1279
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr ""
 
-#: builtin/merge.c:1279
+#: builtin/merge.c:1282
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr ""
 
-#: builtin/merge.c:1363
+#: builtin/merge.c:1366
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr ""
 
-#: builtin/merge.c:1402
+#: builtin/merge.c:1405
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr ""
 
-#: builtin/merge.c:1409
+#: builtin/merge.c:1412
 #, c-format
 msgid "Nope.\n"
 msgstr ""
 
-#: builtin/merge.c:1441
+#: builtin/merge.c:1444
 msgid "Not possible to fast-forward, aborting."
 msgstr ""
 
-#: builtin/merge.c:1464 builtin/merge.c:1543
+#: builtin/merge.c:1467 builtin/merge.c:1546
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr ""
 
-#: builtin/merge.c:1468
+#: builtin/merge.c:1471
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr ""
 
-#: builtin/merge.c:1534
+#: builtin/merge.c:1537
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr ""
 
-#: builtin/merge.c:1536
+#: builtin/merge.c:1539
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr ""
 
-#: builtin/merge.c:1545
+#: builtin/merge.c:1548
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr ""
 
-#: builtin/merge.c:1557
+#: builtin/merge.c:1560
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -6917,108 +7166,109 @@ msgstr ""
 msgid "set labels for file1/orig_file/file2"
 msgstr ""
 
-#: builtin/mktree.c:67
+#: builtin/mktree.c:64
 msgid "git mktree [-z] [--missing] [--batch]"
-msgstr ""
+msgstr "git mktree [-z] [--missing] [--batch]"
 
-#: builtin/mktree.c:153
+#: builtin/mktree.c:150
 msgid "input is NUL terminated"
-msgstr ""
+msgstr "входните записа са разделени с нулевия знак „NUL“"
 
-#: builtin/mktree.c:154 builtin/write-tree.c:24
+#: builtin/mktree.c:151 builtin/write-tree.c:24
 msgid "allow missing objects"
-msgstr ""
+msgstr "разрешаване на липсващи обекти"
 
-#: builtin/mktree.c:155
+#: builtin/mktree.c:152
 msgid "allow creation of more than one tree"
-msgstr ""
+msgstr "разрешаване на създаването на повече от едно дърво"
 
 #: builtin/mv.c:15
 msgid "git mv [options] <source>... <destination>"
-msgstr ""
+msgstr "git mv [ОПЦИИ] ОБЕКТ… ЦЕЛ"
 
 #: builtin/mv.c:71
 msgid "force move/rename even if target exists"
-msgstr ""
+msgstr "принудително преместване/преименуване дори целта да съществува"
 
 #: builtin/mv.c:72
 msgid "skip move/rename errors"
-msgstr ""
+msgstr "прескачане на грешките при преместване/преименуване"
 
 #: builtin/mv.c:122
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
-msgstr ""
+msgstr "Проверка на преименуването на обект от „%s“ на „%s“\n"
 
 #: builtin/mv.c:126
 msgid "bad source"
-msgstr ""
+msgstr "неправилен обект"
 
 #: builtin/mv.c:129
 msgid "can not move directory into itself"
-msgstr ""
+msgstr "директория не може да се премести в себе си"
 
 #: builtin/mv.c:132
 msgid "cannot move directory over file"
-msgstr ""
+msgstr "директория не може да се премести върху файл"
 
+# FIXME message<
 #: builtin/mv.c:138
 #, c-format
 msgid "Huh? Directory %s is in index and no submodule?"
-msgstr ""
+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"
-"ги скътайте"
+"За да продължите или вкарайте промените по файла „.gitmodules“ в индекса,\n"
+"или ги скатайте"
 
+# FIXME message
 #: builtin/mv.c:156
 #, c-format
 msgid "Huh? %.*s is in index?"
-msgstr ""
+msgstr "„%.*s“ вече е в индекса"
 
-#: builtin/mv.c:168
+#: builtin/mv.c:169
 msgid "source directory is empty"
-msgstr ""
+msgstr "първоначалната директория е празна"
 
-#: builtin/mv.c:200
+#: builtin/mv.c:205
 msgid "not under version control"
-msgstr ""
+msgstr "не е под контрола на Git"
 
-#: builtin/mv.c:202
+#: builtin/mv.c:207
 msgid "destination exists"
-msgstr ""
+msgstr "целта съществува"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:215
 #, c-format
 msgid "overwriting '%s'"
-msgstr ""
+msgstr "презаписване на „%s“"
 
-#: builtin/mv.c:213
+#: builtin/mv.c:218
 msgid "Cannot overwrite"
-msgstr ""
+msgstr "Презаписването е невъзможно"
 
-#: builtin/mv.c:216
+#: builtin/mv.c:221
 msgid "multiple sources for the same target"
-msgstr ""
+msgstr "множество източници за една цел"
 
-#: builtin/mv.c:218
+#: builtin/mv.c:223
 msgid "destination directory does not exist"
-msgstr ""
+msgstr "целевата директория не съществува"
 
-#: builtin/mv.c:233
+#: builtin/mv.c:243
 #, c-format
 msgid "%s, source=%s, destination=%s"
-msgstr ""
+msgstr "%s, обект: „%s“, цел: „%s“"
 
-#: builtin/mv.c:243
+#: builtin/mv.c:253
 #, c-format
 msgid "Renaming %s to %s\n"
-msgstr ""
+msgstr "Преименуване на „%s“ на „%s“\n"
 
-#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "неуспешно преименуване на „%s“"
@@ -7183,7 +7433,7 @@ msgstr ""
 msgid "failed to finish 'show' for object '%s'"
 msgstr ""
 
-#: builtin/notes.c:167 builtin/tag.c:341
+#: builtin/notes.c:167 builtin/tag.c:373
 #, c-format
 msgid "could not create file '%s'"
 msgstr ""
@@ -7192,7 +7442,7 @@ msgstr ""
 msgid "Please supply the note contents using either -m or -F option"
 msgstr ""
 
-#: builtin/notes.c:207 builtin/notes.c:844
+#: builtin/notes.c:207 builtin/notes.c:848
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr ""
@@ -7206,20 +7456,20 @@ msgstr ""
 msgid "The note contents has been left in %s"
 msgstr ""
 
-#: builtin/notes.c:248 builtin/tag.c:537
+#: builtin/notes.c:248 builtin/tag.c:604
 #, c-format
 msgid "cannot read '%s'"
 msgstr ""
 
-#: builtin/notes.c:250 builtin/tag.c:540
+#: builtin/notes.c:250 builtin/tag.c:607
 #, c-format
 msgid "could not open or read '%s'"
 msgstr ""
 
-#: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318
-#: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515
-#: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637
-#: builtin/notes.c:839 builtin/tag.c:553
+#: 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
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr ""
@@ -7229,355 +7479,391 @@ msgstr ""
 msgid "Failed to read object '%s'."
 msgstr ""
 
-#: builtin/notes.c:312
+#: builtin/notes.c:276
+#, c-format
+msgid "Cannot read note data from non-blob object '%s'."
+msgstr ""
+
+#: builtin/notes.c:316
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr ""
 
-#: builtin/notes.c:327
+#: builtin/notes.c:331
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr ""
 
-#: builtin/notes.c:371 builtin/notes.c:425 builtin/notes.c:498
-#: builtin/notes.c:510 builtin/notes.c:583 builtin/notes.c:630
-#: builtin/notes.c:904
+#: 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 ""
 
-#: builtin/notes.c:384 builtin/notes.c:643
+#: builtin/notes.c:388 builtin/notes.c:647
 #, c-format
 msgid "No note found for object %s."
 msgstr ""
 
-#: builtin/notes.c:406 builtin/notes.c:563
+#: builtin/notes.c:410 builtin/notes.c:567
 msgid "note contents as a string"
 msgstr ""
 
-#: builtin/notes.c:409 builtin/notes.c:566
+#: builtin/notes.c:413 builtin/notes.c:570
 msgid "note contents in a file"
 msgstr ""
 
-#: builtin/notes.c:411 builtin/notes.c:414 builtin/notes.c:568
-#: builtin/notes.c:571 builtin/tag.c:474
+#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
+#: builtin/notes.c:575 builtin/tag.c:539
 msgid "object"
 msgstr ""
 
-#: builtin/notes.c:412 builtin/notes.c:569
+#: builtin/notes.c:416 builtin/notes.c:573
 msgid "reuse and edit specified note object"
 msgstr ""
 
-#: builtin/notes.c:415 builtin/notes.c:572
+#: builtin/notes.c:419 builtin/notes.c:576
 msgid "reuse specified note object"
 msgstr ""
 
-#: builtin/notes.c:417 builtin/notes.c:485
+#: builtin/notes.c:421 builtin/notes.c:489
 msgid "replace existing notes"
 msgstr ""
 
-#: builtin/notes.c:451
+#: builtin/notes.c:455
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr ""
 
-#: builtin/notes.c:456 builtin/notes.c:533
+#: builtin/notes.c:460 builtin/notes.c:537
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr ""
 
-#: builtin/notes.c:486
+#: builtin/notes.c:490
 msgid "read objects from stdin"
 msgstr ""
 
-#: builtin/notes.c:488
+#: builtin/notes.c:492
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr ""
 
-#: builtin/notes.c:506
+#: builtin/notes.c:510
 msgid "too few parameters"
 msgstr ""
 
-#: builtin/notes.c:527
+#: builtin/notes.c:531
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr ""
 
-#: builtin/notes.c:539
+#: builtin/notes.c:543
 #, c-format
 msgid "Missing notes on source object %s. Cannot copy."
 msgstr ""
 
-#: builtin/notes.c:588
+#: 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 ""
 
-#: builtin/notes.c:735
+#: builtin/notes.c:739
 msgid "General options"
 msgstr ""
 
-#: builtin/notes.c:737
+#: builtin/notes.c:741
 msgid "Merge options"
 msgstr ""
 
-#: builtin/notes.c:739
+#: builtin/notes.c:743
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
 msgstr ""
 
-#: builtin/notes.c:741
+#: builtin/notes.c:745
 msgid "Committing unmerged notes"
 msgstr ""
 
-#: builtin/notes.c:743
+#: builtin/notes.c:747
 msgid "finalize notes merge by committing unmerged notes"
 msgstr ""
 
-#: builtin/notes.c:745
+#: builtin/notes.c:749
 msgid "Aborting notes merge resolution"
 msgstr ""
 
-#: builtin/notes.c:747
+#: builtin/notes.c:751
 msgid "abort notes merge"
 msgstr ""
 
-#: builtin/notes.c:842
+#: builtin/notes.c:846
 #, c-format
 msgid "Object %s has no note\n"
 msgstr ""
 
-#: builtin/notes.c:854
+#: builtin/notes.c:858
 msgid "attempt to remove non-existent note is not an error"
 msgstr ""
 
-#: builtin/notes.c:857
+#: builtin/notes.c:861
 msgid "read object names from the standard input"
 msgstr ""
 
-#: builtin/notes.c:938
-msgid "notes_ref"
+#: builtin/notes.c:942
+msgid "notes-ref"
 msgstr ""
 
-#: builtin/notes.c:939
+#: builtin/notes.c:943
 msgid "use notes from <notes_ref>"
 msgstr ""
 
-#: builtin/notes.c:974 builtin/remote.c:1593
+#: builtin/notes.c:978 builtin/remote.c:1593
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Непозната подкоманда: %s"
 
-#: builtin/pack-objects.c:23
+#: builtin/pack-objects.c:25
 msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
 msgstr ""
 
-#: builtin/pack-objects.c:24
+#: builtin/pack-objects.c:26
 msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
 msgstr ""
 
-#: builtin/pack-objects.c:184 builtin/pack-objects.c:187
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
 #, c-format
 msgid "deflate error (%d)"
 msgstr ""
 
-#: builtin/pack-objects.c:2396
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr "Записване на обектите"
+
+#: builtin/pack-objects.c:1012
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr ""
+
+#: builtin/pack-objects.c:2174
+msgid "Compressing objects"
+msgstr "Компресиране на обектите"
+
+#: builtin/pack-objects.c:2530
 #, c-format
 msgid "unsupported index version %s"
 msgstr ""
 
-#: builtin/pack-objects.c:2400
+#: builtin/pack-objects.c:2534
 #, c-format
 msgid "bad index version '%s'"
 msgstr ""
 
-#: builtin/pack-objects.c:2423
+#: builtin/pack-objects.c:2557
 #, c-format
 msgid "option %s does not accept negative form"
 msgstr ""
 
-#: builtin/pack-objects.c:2427
+#: builtin/pack-objects.c:2561
 #, c-format
 msgid "unable to parse value '%s' for option %s"
 msgstr ""
 
-#: builtin/pack-objects.c:2446
+#: builtin/pack-objects.c:2580
 msgid "do not show progress meter"
 msgstr ""
 
-#: builtin/pack-objects.c:2448
+#: builtin/pack-objects.c:2582
 msgid "show progress meter"
 msgstr ""
 
-#: builtin/pack-objects.c:2450
+#: builtin/pack-objects.c:2584
 msgid "show progress meter during object writing phase"
 msgstr ""
 
-#: builtin/pack-objects.c:2453
+#: builtin/pack-objects.c:2587
 msgid "similar to --all-progress when progress meter is shown"
 msgstr ""
 
-#: builtin/pack-objects.c:2454
+#: builtin/pack-objects.c:2588
 msgid "version[,offset]"
 msgstr ""
 
-#: builtin/pack-objects.c:2455
+#: builtin/pack-objects.c:2589
 msgid "write the pack index file in the specified idx format version"
 msgstr ""
 
-#: builtin/pack-objects.c:2458
+#: builtin/pack-objects.c:2592
 msgid "maximum size of each output pack file"
 msgstr ""
 
-#: builtin/pack-objects.c:2460
+#: builtin/pack-objects.c:2594
 msgid "ignore borrowed objects from alternate object store"
 msgstr ""
 
-#: builtin/pack-objects.c:2462
+#: builtin/pack-objects.c:2596
 msgid "ignore packed objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2464
+#: builtin/pack-objects.c:2598
 msgid "limit pack window by objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2466
+#: builtin/pack-objects.c:2600
 msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 
-#: builtin/pack-objects.c:2468
+#: builtin/pack-objects.c:2602
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr ""
 
-#: builtin/pack-objects.c:2470
+#: builtin/pack-objects.c:2604
 msgid "reuse existing deltas"
 msgstr ""
 
-#: builtin/pack-objects.c:2472
+#: builtin/pack-objects.c:2606
 msgid "reuse existing objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2474
+#: builtin/pack-objects.c:2608
 msgid "use OFS_DELTA objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2476
+#: builtin/pack-objects.c:2610
 msgid "use threads when searching for best delta matches"
 msgstr ""
 
-#: builtin/pack-objects.c:2478
+#: builtin/pack-objects.c:2612
 msgid "do not create an empty pack output"
 msgstr ""
 
-#: builtin/pack-objects.c:2480
+#: builtin/pack-objects.c:2614
 msgid "read revision arguments from standard input"
 msgstr ""
 
-#: builtin/pack-objects.c:2482
+#: builtin/pack-objects.c:2616
 msgid "limit the objects to those that are not yet packed"
 msgstr ""
 
-#: builtin/pack-objects.c:2485
+#: builtin/pack-objects.c:2619
 msgid "include objects reachable from any reference"
 msgstr ""
 
-#: builtin/pack-objects.c:2488
+#: builtin/pack-objects.c:2622
 msgid "include objects referred by reflog entries"
 msgstr ""
 
-#: builtin/pack-objects.c:2491
+#: builtin/pack-objects.c:2625
 msgid "output pack to stdout"
 msgstr ""
 
-#: builtin/pack-objects.c:2493
+#: builtin/pack-objects.c:2627
 msgid "include tag objects that refer to objects to be packed"
 msgstr ""
 
-#: builtin/pack-objects.c:2495
+#: builtin/pack-objects.c:2629
 msgid "keep unreachable objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2496 parse-options.h:143
+#: builtin/pack-objects.c:2630 parse-options.h:140
 msgid "time"
 msgstr "време"
 
-#: builtin/pack-objects.c:2497
+#: builtin/pack-objects.c:2631
 msgid "unpack unreachable objects newer than <time>"
 msgstr ""
 
-#: builtin/pack-objects.c:2500
+#: builtin/pack-objects.c:2634
 msgid "create thin packs"
 msgstr ""
 
-#: builtin/pack-objects.c:2502
+#: builtin/pack-objects.c:2636
 msgid "ignore packs that have companion .keep file"
 msgstr ""
 
-#: builtin/pack-objects.c:2504
+#: builtin/pack-objects.c:2638
 msgid "pack compression level"
 msgstr ""
 
-#: builtin/pack-objects.c:2506
+#: builtin/pack-objects.c:2640
 msgid "do not hide commits by grafts"
 msgstr ""
 
+#: builtin/pack-objects.c:2642
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2644
+msgid "write a bitmap index together with the pack index"
+msgstr ""
+
+#: builtin/pack-objects.c:2723
+msgid "Counting objects"
+msgstr "Преброяване на обектите"
+
 #: builtin/pack-refs.c:6
 msgid "git pack-refs [options]"
-msgstr ""
+msgstr "git pack-refs [ОПЦИИ]"
 
 #: builtin/pack-refs.c:14
 msgid "pack everything"
-msgstr ""
+msgstr "пакетиране на всичко"
 
 #: builtin/pack-refs.c:15
 msgid "prune loose refs (default)"
-msgstr ""
+msgstr "окастряне на недостижимите указатели (стандартно)"
 
 #: builtin/prune-packed.c:7
 msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
-msgstr ""
+msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]"
+
+#: builtin/prune-packed.c:49
+msgid "Removing duplicate objects"
+msgstr "Изтриване на повтарящите се обекти"
 
 #: builtin/prune.c:12
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
-msgstr ""
+msgstr "git prune [-n] [-v] [--expire ВРЕМЕ] [--] [ВРЪХ…]"
 
 #: builtin/prune.c:142
 msgid "do not remove, show only"
-msgstr ""
+msgstr "само извеждане без действително окастряне"
 
 #: builtin/prune.c:143
 msgid "report pruned objects"
-msgstr ""
+msgstr "информация за окастрените обекти"
 
 #: builtin/prune.c:146
 msgid "expire objects older than <time>"
-msgstr ""
+msgstr "окастряне на обектите по-стари от това ВРЕМЕ"
 
 #: builtin/push.c:14
 msgid "git push [<options>] [<repository> [<refspec>...]]"
-msgstr ""
+msgstr "git push [ОПЦИИ] [ХРАНИЛИЩЕ [УКАЗАТЕЛ_НА_ВЕРСИЯ…]]"
 
-#: builtin/push.c:86
+#: builtin/push.c:85
 msgid "tag shorthand without <tag>"
-msgstr ""
+msgstr "съкращение за етикет без ЕТИКЕТ"
 
-#: builtin/push.c:96
+#: builtin/push.c:95
 msgid "--delete only accepts plain target ref names"
-msgstr ""
+msgstr "опцията „--delete“ приема за цел само прости имена на указатели"
 
-#: builtin/push.c:141
+#: builtin/push.c:140
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
 msgstr ""
+"\n"
+"За да включите тази опция за постоянно вижте документацията за настройката "
+"„push.default“ в „git help config“."
 
-#: builtin/push.c:144
+#: builtin/push.c:143
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -7591,8 +7877,18 @@ msgid ""
 "    git push %s %s\n"
 "%s"
 msgstr ""
+"Името на текущия клон се различава от името на клона, който той следи.\n"
+"За да изтласкате към следения клон използвайте командата:\n"
+"\n"
+"    git push %s HEAD:%s\n"
+"\n"
+"За да изтласкате към отдалечения клон с име като локалния, използвайте "
+"командата:\n"
+"\n"
+"    git push %s %s\n"
+"%s"
 
-#: builtin/push.c:159
+#: builtin/push.c:158
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -7601,8 +7897,12 @@ msgid ""
 "\n"
 "    git push %s HEAD:<name-of-remote-branch>\n"
 msgstr ""
+"В момента не сте на никой клон. За да изтласкате историята до състоянието,\n"
+"сочено в момента от указателя „HEAD“, използвайте командата:\n"
+"\n"
+"    git push %s HEAD:ИМЕ_НА_ОТДАЛЕЧЕНИЯ_КЛОН\n"
 
-#: builtin/push.c:173
+#: builtin/push.c:172
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -7610,25 +7910,36 @@ msgid ""
 "\n"
 "    git push --set-upstream %s %s\n"
 msgstr ""
+"Не е зададен отдалечен клон, който текущият клон „%s“ да следи.\n"
+"За да изтласкате локалния клон към отдалечен и същевременно да зададете\n"
+"втория като този, който първият следи, използвайте командата:\n"
+"\n"
+"    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:181
+#: builtin/push.c:180
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr ""
+"Текущият клон „%s“ следи няколко отдалечени клона, не можете просто да "
+"изтласкате."
 
-#: builtin/push.c:184
+#: builtin/push.c:183
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
 "your current branch '%s', without telling me what to push\n"
 "to update which remote branch."
 msgstr ""
+"Изтласквате към отдалечения клон „%s“, който не е следен от текущия клон "
+"„%s“.\n"
+"Трябва да укажете коя версия да се изтласка, за обновяване на отдалечения "
+"клон."
 
-#: builtin/push.c:207
+#: builtin/push.c:206
 msgid ""
-"push.default is unset; its implicit value is changing in\n"
+"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 current behavior after the default changes, use:\n"
+"and maintain the traditional behavior, use:\n"
 "\n"
 "  git config --global push.default matching\n"
 "\n"
@@ -7639,7 +7950,7 @@ msgid ""
 "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"
-"In Git 2.0, Git will default to the more conservative 'simple'\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"
@@ -7648,37 +7959,71 @@ msgid ""
 "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
 "'current' instead of 'simple' if you sometimes use older versions of Git)"
 msgstr ""
+"Настройката „push.default“ не е зададена. Стойността ѝ по подразбиране е "
+"сменена\n"
+"в Git 2.0 от „matching“ (всички съвпадащи клони) на „simple“ (само текущия\n"
+"клон). За да подтиснете това съобщение и да използвате традиционното "
+"поведение\n"
+"на Git 1.x, изпълнете командата:\n"
+"\n"
+"  git config --global push.default matching\n"
+"\n"
+"За да подтиснете това съобщение и да използвате новото поведение на Git 2."
+"x,\n"
+"изпълнете командата:\n"
+"\n"
+"  git config --global push.default simple\n"
+"\n"
+"Когато настройката „push.default“ е „matching“, git ще изтласка всички "
+"локални\n"
+"клони, които имат отдалечен аналог със същото име.\n"
+"\n"
+"От версия 2.0 Git стандартно започва да ползва по-консервативния вариант\n"
+"„simple“, при който „push“ изтласква само текущия клон към отдалечения, "
+"следен\n"
+"клон — същия, който „git pull“ използва, за да обнови текущия.\n"
+"\n"
+"За повече информация погледнете „git help config“ и потърсете „push."
+"default“.\n"
+"Новата стойност „simple“ бе въведена с версия 1.7.11 на Git. Ако понякога\n"
+"ползвате стари версии на Git, задайте стойност „current“ вместо „simple“."
 
-#: builtin/push.c:274
+#: builtin/push.c:273
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
+"Не сте указали версия за подаване, а настройката „push.default“ не е "
+"зададена."
 
-#: builtin/push.c:281
+#: builtin/push.c:280
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
 "'git pull ...') before pushing again.\n"
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
+"Обновяването е отхвърлено, защото върхът на текущия ви клон е преди върха "
+"на\n"
+"отдалечения клон. Внесете отдалечените промени (напр. с командата „git "
+"pull…“),\n"
+"преди отново да изтласкате промените. За повече информация вижте раздела\n"
+"„Note about fast-forwards“ в страницата от ръководството „git push --help“."
 
-#: builtin/push.c:287
-msgid ""
-"Updates were rejected because a pushed branch tip is behind its remote\n"
-"counterpart. If you did not intend to push that branch, you may want to\n"
-"specify branches to push or set the 'push.default' configuration variable\n"
-"to 'simple', 'current' or 'upstream' to push only the current branch."
-msgstr ""
-
-#: builtin/push.c:293
+#: builtin/push.c:286
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. Check out this branch and integrate the remote changes\n"
 "(e.g. 'git pull ...') before pushing again.\n"
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
+"Обновяването е отхвърлено, защото върха на изтласквания клон е преди върха "
+"на\n"
+"отдалечения клон. Проверете клона и внесете отдалечените промени (напр. с\n"
+"командата „git pull…“), преди отново да изтласкате промените. За повече\n"
+"информация вижте раздела „Note about fast-forwards“ в страницата от\n"
+"ръководството „git push --help“."
 
-#: builtin/push.c:299
+#: builtin/push.c:292
 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"
@@ -7686,34 +8031,51 @@ msgid ""
 "(e.g., 'git pull ...') before pushing again.\n"
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
+"Обновяването е отхвърлено, защото хранилището, към което изтласквате, "
+"съдържа\n"
+"промени, които липсват в локалното хранилище. Най-честата причина за това "
+"е,\n"
+"че някой друг е изтласквал към същия клон. Първо внесете отдалечените "
+"промени\n"
+"(напр. с командата „git pull…“), преди отново да изтласкате промените.\n"
+"За повече информация вижте раздела „Note about fast-forwards“ в страницата "
+"от\n"
+"ръководството „git push --help“."
 
-#: builtin/push.c:306
+#: builtin/push.c:299
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr ""
+"Изтласкването е отхвърлено, защото в отдалеченото хранилище съществува "
+"етикет,\n"
+"който ще припокриете с етикет от вашето хранилище."
 
-#: builtin/push.c:309
+#: builtin/push.c:302
 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"
 
-#: builtin/push.c:375
+#: builtin/push.c:361
 #, c-format
 msgid "Pushing to %s\n"
-msgstr ""
+msgstr "Изтласкване към „%s“\n"
 
-#: builtin/push.c:379
+#: builtin/push.c:365
 #, c-format
 msgid "failed to push some refs to '%s'"
-msgstr ""
+msgstr "част от указателите не бяха изтласкани към „%s“"
 
-#: builtin/push.c:412
+#: builtin/push.c:395
 #, c-format
 msgid "bad repository '%s'"
-msgstr ""
+msgstr "неправилно указано хранилище „%s“"
 
-#: builtin/push.c:413
+#: builtin/push.c:396
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -7725,98 +8087,111 @@ msgid ""
 "\n"
 "    git push <name>\n"
 msgstr ""
+"Не е указано хранилище, към което да се изтласква.\n"
+"Или укажете адреса на командния ред, или настройте отдалечено хранилище с "
+"командата:\n"
+"\n"
+"    git remote add ИМЕ АДРЕС\n"
+"\n"
+"и след това изтласкайте, като укажете името на отдалеченото хранилище:\n"
+"\n"
+"    git push ИМЕ\n"
 
-#: builtin/push.c:428
+#: builtin/push.c:411
 msgid "--all and --tags are incompatible"
-msgstr ""
+msgstr "опциите „--all“ и „--tags“ са несъвместими"
 
-#: builtin/push.c:429
+#: builtin/push.c:412
 msgid "--all can't be combined with refspecs"
-msgstr ""
+msgstr "опцията „--all“ е несъвместима с указването на версия"
 
-#: builtin/push.c:434
+#: builtin/push.c:417
 msgid "--mirror and --tags are incompatible"
-msgstr ""
+msgstr "опциите „--mirror“ и „--tags“ са несъвместими"
 
-#: builtin/push.c:435
+#: builtin/push.c:418
 msgid "--mirror can't be combined with refspecs"
-msgstr ""
+msgstr "опцията „--mirror“ е несъвместима с указването на версия"
 
-#: builtin/push.c:440
+#: builtin/push.c:423
 msgid "--all and --mirror are incompatible"
-msgstr ""
+msgstr "опциите „--all“ и „--mirror“ са несъвместими"
 
-#: builtin/push.c:500
+#: builtin/push.c:483
 msgid "repository"
-msgstr ""
+msgstr "хранилище"
 
-#: builtin/push.c:501
+#: builtin/push.c:484
 msgid "push all refs"
-msgstr ""
+msgstr "изтласкване на всички указатели"
 
-#: builtin/push.c:502
+#: builtin/push.c:485
 msgid "mirror all refs"
-msgstr ""
+msgstr "огледално копие на всички указатели"
 
-#: builtin/push.c:504
+#: builtin/push.c:487
 msgid "delete refs"
-msgstr ""
+msgstr "изтриване на указателите"
 
-#: builtin/push.c:505
+#: builtin/push.c:488
 msgid "push tags (can't be used with --all or --mirror)"
-msgstr ""
+msgstr "изтласкване на етикетите (несъвместимо с опциите „--all“ и „--mirror“)"
 
-#: builtin/push.c:508
+#: builtin/push.c:491
 msgid "force updates"
-msgstr ""
+msgstr "принудително обновяване"
 
-#: builtin/push.c:510
+# # FIXME double check this
+#: builtin/push.c:493
 msgid "refname>:<expect"
-msgstr ""
+msgstr "УКАЗАТЕЛ>:<ОЧАКВАНА_СТОЙНОСТ"
 
-#: builtin/push.c:511
+#: builtin/push.c:494
 msgid "require old value of ref to be at this value"
-msgstr ""
+msgstr "УКАЗАТЕЛят трябва първоначално да е с тази ОЧАКВАНА_СТОЙНОСТ"
 
-#: builtin/push.c:513
+#: builtin/push.c:496
 msgid "check"
-msgstr ""
+msgstr "проверка"
 
-#: builtin/push.c:514
+#: builtin/push.c:497
 msgid "control recursive pushing of submodules"
-msgstr ""
+msgstr "управление на рекурсивното изтласкване на подмодулите"
 
-#: builtin/push.c:516
+#: builtin/push.c:499
 msgid "use thin pack"
-msgstr ""
+msgstr "използване на съкратени пакети"
 
-#: builtin/push.c:517 builtin/push.c:518
+#: builtin/push.c:500 builtin/push.c:501
 msgid "receive pack program"
-msgstr ""
+msgstr "програма за получаването на пакети"
 
-#: builtin/push.c:519
+#: builtin/push.c:502
 msgid "set upstream for git pull/status"
-msgstr ""
+msgstr "задаване на отдалеченото хранилище за командите „git pull/status“"
 
-#: builtin/push.c:522
+#: builtin/push.c:505
 msgid "prune locally removed refs"
-msgstr ""
+msgstr "окастряне на указателите, които са премахнати от локалното хранилище"
 
-#: builtin/push.c:524
+#: builtin/push.c:507
 msgid "bypass pre-push hook"
-msgstr ""
+msgstr "без изпълнение на куката преди изтласкване (pre-push)"
 
-#: builtin/push.c:525
+#: builtin/push.c:508
 msgid "push missing but relevant tags"
 msgstr ""
+"изтласкване на липсващите в отдалеченото хранилище, но свързани с текущото "
+"изтласкване, етикети"
 
-#: builtin/push.c:535
+#: builtin/push.c:518
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr ""
+"опцията „--delete“ е несъвместима с опциите  „--all“, „--mirror“ и „--tags“"
 
-#: builtin/push.c:537
+#: builtin/push.c:520
 msgid "--delete doesn't make sense without any refs"
-msgstr ""
+msgstr "опцията „--delete“ изисква поне един указател на версия"
 
 #: builtin/read-tree.c:36
 msgid ""
@@ -7909,92 +8284,93 @@ msgid ""
 "git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--"
 "mirror=<fetch|push>] <name> <url>"
 msgstr ""
-"git remote add [-t <КЛОН>] [-m <ОСНОВЕН_КЛОН>] [-f] [--tags|--no-tags] [--"
-"mirror=<fetch|push>] <ИМЕ> <АДРЕС>"
+"git remote add [-t КЛОН] [-m ОСНОВЕН_КЛОН] [-f] [--tags|--no-tags] [--"
+"mirror=<fetch|push>] ИМЕ АДРЕС"
 
 #: builtin/remote.c:14 builtin/remote.c:33
 msgid "git remote rename <old> <new>"
-msgstr "git remote rename <СТАРО_ИМЕ> <НОВО_ИМЕ>"
+msgstr "git remote rename СТАРО_ИМЕ НОВО_ИМЕ"
 
 #: builtin/remote.c:15 builtin/remote.c:38
 msgid "git remote remove <name>"
-msgstr "git remote remove <ИМЕ>"
+msgstr "git remote remove ИМЕ"
 
 #: builtin/remote.c:16
 msgid "git remote set-head <name> (-a | --auto | -d | --delete |<branch>)"
-msgstr "git remote set-head <ИМЕ> (-a | --auto | -d | --delete |<КЛОН>)"
+msgstr "git remote set-head ИМЕ (-a | --auto | -d | --delete | КЛОН)"
 
 #: builtin/remote.c:17
 msgid "git remote [-v | --verbose] show [-n] <name>"
-msgstr "git remote [-v | --verbose] show [-n] <ИМЕ>"
+msgstr "git remote [-v | --verbose] show [-n] ИМЕ"
 
 #: builtin/remote.c:18
 msgid "git remote prune [-n | --dry-run] <name>"
-msgstr "git remote prune [-n | --dry-run] <ИМЕ>"
+msgstr "git remote prune [-n | --dry-run] ИМЕ"
 
 #: builtin/remote.c:19
 msgid ""
 "git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
 msgstr ""
-"git remote [-v | --verbose] update [-p | --prune] [(<ГРУПА> | "
-"<ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ>)…]"
+"git remote [-v | --verbose] update [-p | --prune] [(ГРУПА | "
+"ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ)…]"
 
 #: builtin/remote.c:20
 msgid "git remote set-branches [--add] <name> <branch>..."
-msgstr "git remote set-branches [--add] <ИМЕ> <КЛОН>…"
+msgstr "git remote set-branches [--add] ИМЕ КЛОН…"
 
 #: builtin/remote.c:21 builtin/remote.c:69
 msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
-msgstr "git remote set-url [--push] <ИМЕ> <НОВ_АДРЕС> [<СТАР_АДРЕС>]"
+msgstr "git remote set-url [--push] ИМЕ НОВ_АДРЕС [СТАР_АДРЕС]"
 
 #: builtin/remote.c:22 builtin/remote.c:70
 msgid "git remote set-url --add <name> <newurl>"
-msgstr "git remote set-url --add <ИМЕ> <НОВ_АДРЕС>"
+msgstr "git remote set-url --add ИМЕ НОВ_АДРЕС"
 
 #: builtin/remote.c:23 builtin/remote.c:71
 msgid "git remote set-url --delete <name> <url>"
-msgstr "git remote set-url --delete <ИМЕ> <АДРЕС>"
+msgstr "git remote set-url --delete ИМЕ АДРЕС"
 
 #: 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>)"
-msgstr "git remote set-head <ИМЕ> (-a | --auto | -d | --delete | <КЛОН>)"
+msgstr "git remote set-head ИМЕ (-a | --auto | -d | --delete | КЛОН)"
 
 #: builtin/remote.c:48
 msgid "git remote set-branches <name> <branch>..."
-msgstr "git remote set-branches <ИМЕ> <КЛОН>…"
+msgstr "git remote set-branches ИМЕ КЛОН…"
 
 #: builtin/remote.c:49
 msgid "git remote set-branches --add <name> <branch>..."
-msgstr "git remote set-branches --add <ИМЕ> <КЛОН>…"
+msgstr "git remote set-branches --add ИМЕ КЛОН…"
 
 #: 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
 msgid "Updating %s"
 msgstr "Обновяване на „%s“"
 
+# FIXME tabulator
 #: builtin/remote.c:120
 msgid ""
 "--mirror is dangerous and deprecated; please\n"
 "\t use --mirror=fetch or --mirror=push instead"
 msgstr ""
 "Използването само на „--mirror“ е опасно. Вместо това\n"
-"\tползвайте „--mirror=fetch“ или „--mirror=push“"
+"ползвайте „--mirror=fetch“ или „--mirror=push“"
 
 #: builtin/remote.c:137
 #, c-format
@@ -8087,14 +8463,14 @@ msgstr "Такова отдалечено хранилище няма: %s"
 #: builtin/remote.c:651
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
-msgstr "СекÑ\86иÑ\8fÑ\82а Ð² Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80еименÑ\83вана на „%s“"
+msgstr "РазделÑ\8aÑ\82 â\80\9e%sâ\80\9c Ð² Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80еименÑ\83ван на „%s“"
 
 #: builtin/remote.c:657 builtin/remote.c:794
 #, c-format
 msgid "Could not remove config section '%s'"
-msgstr "СекÑ\86иÑ\8fÑ\82а Ð² Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ñ\82Ñ\80иÑ\82а"
+msgstr "РазделÑ\8aÑ\82 â\80\9e%sâ\80\9c Ð² Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ñ\82Ñ\80иÑ\82"
 
-# FIXME
+# FIXME tabulator
 #: builtin/remote.c:672
 #, c-format
 msgid ""
@@ -8109,12 +8485,12 @@ msgstr ""
 #: builtin/remote.c:678
 #, c-format
 msgid "Could not append '%s'"
-msgstr "СекÑ\86иÑ\8fÑ\82а â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð´Ð¾Ð±Ð°Ð²ÐµÐ½Ð° в настройките"
+msgstr "РазделÑ\8aÑ\82 â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð´Ð¾Ð±Ð°Ð²ÐµÐ½ в настройките"
 
 #: builtin/remote.c:689
 #, c-format
 msgid "Could not set '%s'"
-msgstr "СекÑ\86иÑ\8fÑ\82а â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð° в настройките"
+msgstr "РазделÑ\8aÑ\82 â\80\9e%sâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð·Ð°Ð´Ð°Ð´ÐµÐ½ в настройките"
 
 #: builtin/remote.c:711
 #, c-format
@@ -8158,6 +8534,7 @@ msgstr " следен"
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " стар (изтрийте чрез „git remote prune“)"
 
+# FIXME
 #: builtin/remote.c:945
 msgid " ???"
 msgstr " неясно"
@@ -8240,7 +8617,7 @@ msgstr "без заявки към отдалечените хранилища"
 #: builtin/remote.c:1171
 #, c-format
 msgid "* remote %s"
-msgstr "* отдалечено хранилище „%s“"
+msgstr " отдалечено хранилище „%s“"
 
 #: builtin/remote.c:1172
 #, c-format
@@ -8299,11 +8676,11 @@ msgstr[1] "  Локалните указатели, настроени за „g
 
 #: builtin/remote.c:1252
 msgid "set refs/remotes/<name>/HEAD according to remote"
-msgstr "задаване на refs/remotes/<ИМЕ>/HEAD според отдалеченото хранилище"
+msgstr "задаване на refs/remotes/ИМЕ/HEAD според отдалеченото хранилище"
 
 #: builtin/remote.c:1254
 msgid "delete refs/remotes/<name>/HEAD"
-msgstr "изтриване на refs/remotes/<ИМЕ>/HEAD"
+msgstr "изтриване на refs/remotes/ИМЕ/HEAD"
 
 #: builtin/remote.c:1269
 msgid "Cannot determine remote HEAD"
@@ -8352,12 +8729,12 @@ msgstr "адрес: %s"
 #: builtin/remote.c:1328
 #, c-format
 msgid " * [would prune] %s"
-msgstr " * [ще бъде окастрено] %s"
+msgstr "  [ще бъде окастрено] %s"
 
 #: builtin/remote.c:1331
 #, c-format
 msgid " * [pruned] %s"
-msgstr " * [окастрено] %s"
+msgstr "  [окастрено] %s"
 
 #: builtin/remote.c:1374
 msgid "prune remotes after fetching"
@@ -8402,7 +8779,7 @@ msgstr "Неправилен (стар) формат за адрес: %s"
 msgid "No such URL found: %s"
 msgstr "Такъв адрес не е открит: %s"
 
-# MEANING
+# FIXME CHECK MEANING
 #: builtin/remote.c:1550
 msgid "Will not delete all non-push URLs"
 msgstr "Никой от адресите, които не са за изтласкване, няма да се изтрие"
@@ -8411,242 +8788,269 @@ msgstr "Никой от адресите, които не са за изтлас
 msgid "be verbose; must be placed before a subcommand"
 msgstr "повече подробности. Поставя се пред подкоманда"
 
-#: builtin/repack.c:15
+#: builtin/repack.c:16
 msgid "git repack [options]"
 msgstr ""
 
-#: builtin/repack.c:143
+#: builtin/repack.c:156
 msgid "pack everything in a single pack"
 msgstr ""
 
-#: builtin/repack.c:145
+#: builtin/repack.c:158
 msgid "same as -a, and turn unreachable objects loose"
 msgstr ""
 
-#: builtin/repack.c:148
+#: builtin/repack.c:161
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr ""
 
-#: builtin/repack.c:150
+#: builtin/repack.c:163
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr ""
 
-#: builtin/repack.c:152
+#: builtin/repack.c:165
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr ""
 
-#: builtin/repack.c:154
+#: builtin/repack.c:167
 msgid "do not run git-update-server-info"
 msgstr ""
 
-#: builtin/repack.c:157
+#: builtin/repack.c:170
 msgid "pass --local to git-pack-objects"
 msgstr ""
 
-#: builtin/repack.c:158
+#: builtin/repack.c:172
+msgid "write bitmap index"
+msgstr ""
+
+#: builtin/repack.c:173
 msgid "approxidate"
 msgstr ""
 
-#: builtin/repack.c:159
+#: builtin/repack.c:174
 msgid "with -A, do not loosen objects older than this"
 msgstr ""
 
-#: builtin/repack.c:161
+#: builtin/repack.c:176
 msgid "size of the window used for delta compression"
 msgstr ""
 
-#: builtin/repack.c:163
+#: builtin/repack.c:177 builtin/repack.c:181
+msgid "bytes"
+msgstr ""
+
+#: builtin/repack.c:178
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr ""
 
-#: builtin/repack.c:165
+#: builtin/repack.c:180
 msgid "limits the maximum delta depth"
 msgstr ""
 
-#: builtin/repack.c:167
+#: builtin/repack.c:182
 msgid "maximum size of each packfile"
 msgstr ""
 
-#: builtin/repack.c:343
+#: builtin/repack.c:184
+msgid "repack objects in packs marked with .keep"
+msgstr ""
+
+#: builtin/repack.c:371
 #, c-format
 msgid "removing '%s' failed"
 msgstr ""
 
 #: builtin/replace.c:17
 msgid "git replace [-f] <object> <replacement>"
-msgstr ""
+msgstr "git replace [-f] ОБЕКТ ЗАМЯНА"
 
 #: builtin/replace.c:18
 msgid "git replace -d <object>..."
-msgstr ""
+msgstr "git replace -d ОБЕКТ…"
 
 #: builtin/replace.c:19
 msgid "git replace [--format=<format>] [-l [<pattern>]]"
-msgstr ""
+msgstr "git replace [--format=ФОРМАТ] [-l [ШАБЛОН]]"
 
 #: builtin/replace.c:174
 msgid "list replace refs"
-msgstr ""
+msgstr "извеждане на списъка с указателите за замяна"
 
 #: builtin/replace.c:175
 msgid "delete replace refs"
-msgstr ""
+msgstr "изтриване на указателите за замяна"
 
 #: builtin/replace.c:176
 msgid "replace the ref if it exists"
-msgstr ""
+msgstr "замяна на указателите, ако съществуват"
 
 #: builtin/replace.c:177
 msgid "use this format"
-msgstr ""
+msgstr "използване на този ФОРМАТ"
 
 #: builtin/rerere.c:12
 msgid "git rerere [clear | forget path... | status | remaining | diff | gc]"
-msgstr ""
+msgstr "git rerere [clear | forget ПЪТ… | status | remaining | diff | gc]"
 
 #: builtin/rerere.c:57
 msgid "register clean resolutions in index"
-msgstr ""
+msgstr "регистриране на чисти корекции на конфликти в индекса"
 
 #: builtin/reset.c:25
 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 ""
+msgstr "git reset [-q] ДЪРВО [--] ПЪТИЩА…"
 
 #: builtin/reset.c:27
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
-msgstr ""
+msgstr "git reset --patch [ДЪРВО] [--] [ПЪТИЩА…]"
 
 #: builtin/reset.c:33
 msgid "mixed"
-msgstr ""
+msgstr "смесено (mixed)"
 
 #: builtin/reset.c:33
 msgid "soft"
-msgstr ""
+msgstr "меко (soft)"
 
 #: builtin/reset.c:33
 msgid "hard"
-msgstr ""
+msgstr "пълно (hard)"
 
 #: builtin/reset.c:33
 msgid "merge"
-msgstr ""
+msgstr "слято (merge)"
 
 #: builtin/reset.c:33
 msgid "keep"
-msgstr ""
+msgstr "запазващо (keep)"
 
 #: builtin/reset.c:73
 msgid "You do not have a valid HEAD."
-msgstr ""
+msgstr "Указателят „HEAD“ е повреден."
 
 #: builtin/reset.c:75
 msgid "Failed to find tree of HEAD."
-msgstr ""
+msgstr "Дървото, сочено от указателя „HEAD“, не може да бъде открито."
 
 #: builtin/reset.c:81
 #, c-format
 msgid "Failed to find tree of %s."
-msgstr ""
+msgstr "Дървото, сочено от „%s“, не може да бъде открито."
 
 #: builtin/reset.c:99
 #, c-format
 msgid "HEAD is now at %s"
-msgstr ""
+msgstr "Указателят „HEAD“ сочи към „%s“"
 
-#: builtin/reset.c:172
+#: builtin/reset.c:182
 #, c-format
 msgid "Cannot do a %s reset in the middle of a merge."
-msgstr ""
+msgstr "Не може да се извърши %s зануляване по време на сливане."
 
-#: builtin/reset.c:262
+#: builtin/reset.c:273
 msgid "be quiet, only report errors"
-msgstr ""
+msgstr "по-малко подробности, да се извеждат само грешките"
 
-#: builtin/reset.c:264
+#: builtin/reset.c:275
 msgid "reset HEAD and index"
-msgstr ""
+msgstr "индекса и указателя „HEAD“, без работното дърво"
 
-#: builtin/reset.c:265
+#: builtin/reset.c:276
 msgid "reset only HEAD"
-msgstr ""
+msgstr "само указателя „HEAD“, без индекса и работното дърво"
 
-#: builtin/reset.c:267 builtin/reset.c:269
+# FIXME vs man page
+#: builtin/reset.c:278 builtin/reset.c:280
 msgid "reset HEAD, index and working tree"
-msgstr ""
+msgstr "указателя „HEAD“, индекса и работното дърво"
 
-#: builtin/reset.c:271
+# FIXME vs man page
+#: builtin/reset.c:282
 msgid "reset HEAD but keep local changes"
+msgstr "зануляване на указателя „HEAD“, но запазване на локалните промени"
+
+#: builtin/reset.c:285
+msgid "record only the fact that removed paths will be added later"
 msgstr ""
+"отбелязване само на факта, че изтритите пътища ще бъдат добавени по-късно"
 
-#: builtin/reset.c:289
+#: builtin/reset.c:302
 #, c-format
 msgid "Failed to resolve '%s' as a valid revision."
-msgstr ""
+msgstr "Стойността „%s“ не е разпозната като съществуваща версия."
 
-#: builtin/reset.c:292 builtin/reset.c:300
+#: builtin/reset.c:305 builtin/reset.c:313
 #, c-format
 msgid "Could not parse object '%s'."
-msgstr ""
+msgstr "„%s“ не е разпознат като обект."
 
-#: builtin/reset.c:297
+#: builtin/reset.c:310
 #, c-format
 msgid "Failed to resolve '%s' as a valid tree."
-msgstr ""
+msgstr "„%s“ не е разпознат като дърво."
 
-#: builtin/reset.c:306
+#: builtin/reset.c:319
 msgid "--patch is incompatible with --{hard,mixed,soft}"
 msgstr ""
+"опцията „--patch“ е несъвместима с всяка от опциите „--hard/--mixed/--soft“"
 
-#: builtin/reset.c:315
+#: builtin/reset.c:328
 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
 msgstr ""
+"опцията „--mixed“ не бива да се използва заедно с пътища. Вместо това "
+"изпълнете „git reset -- ПЪТ…“."
 
-#: builtin/reset.c:317
+#: builtin/reset.c:330
 #, c-format
 msgid "Cannot do %s reset with paths."
-msgstr ""
+msgstr "Не може да извършите %s зануляване, когато сте задали ПЪТ."
 
-#: builtin/reset.c:327
+#: builtin/reset.c:340
 #, c-format
 msgid "%s reset is not allowed in a bare repository"
-msgstr ""
+msgstr "В голо хранилище не може да извършите %s зануляване"
 
 #: builtin/reset.c:344
+msgid "-N can only be used with --mixed"
+msgstr "Опцията „-N“ е съвместима само с „--mixed“"
+
+#: builtin/reset.c:361
 msgid "Unstaged changes after reset:"
-msgstr ""
+msgstr "Промени извън индекса след зануляването:"
 
-#: builtin/reset.c:350
+#: builtin/reset.c:367
 #, c-format
 msgid "Could not reset index file to revision '%s'."
-msgstr ""
+msgstr "Индексът не може да бъде занулен към версия „%s“."
 
-#: builtin/reset.c:355
+#: builtin/reset.c:372
 msgid "Could not write new index file."
-msgstr ""
+msgstr "Новият индекс не може да бъде записан."
 
 #: builtin/rev-parse.c:359
 msgid "git rev-parse --parseopt [options] -- [<args>...]"
-msgstr ""
+msgstr "git rev-parse --parseopt [ОПЦИИ] -- [АРГУМЕНТИ…]"
 
 #: builtin/rev-parse.c:364
 msgid "keep the `--` passed as an arg"
-msgstr ""
+msgstr "зададеният низ „--“ да се тълкува като аргумент"
 
 #: builtin/rev-parse.c:366
 msgid "stop parsing after the first non-option argument"
-msgstr ""
+msgstr "спиране на анализа след първия аргумент, който не е опция"
 
 #: builtin/rev-parse.c:369
 msgid "output in stuck long form"
-msgstr ""
+msgstr "изход в дългия формат"
 
-#: builtin/rev-parse.c:486
+#: builtin/rev-parse.c:497
 msgid ""
 "git rev-parse --parseopt [options] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -8654,99 +9058,105 @@ msgid ""
 "\n"
 "Run \"git rev-parse --parseopt -h\" for more information on the first usage."
 msgstr ""
+"git rev-parse --parseopt [ОПЦИИ] -- [АРГУМЕНТИ…]\n"
+"   или: git rev-parse --sq-quote [АРГУМЕНТИ…]\n"
+"   или: git rev-parse [ОПЦИИ] [АРГУМЕНТИ…]\n"
+"\n"
+"За повече информация за първия вариант изпълнете „git rev-parse --parseopt -"
+"h“"
 
 #: builtin/revert.c:22
 msgid "git revert [options] <commit-ish>..."
-msgstr ""
+msgstr "git revert [ОПЦИИ] УКАЗАТЕЛ_КЪМ_ПОДАВАНЕ…"
 
 #: builtin/revert.c:23
 msgid "git revert <subcommand>"
-msgstr ""
+msgstr "git revert ПОДКОМАНДА"
 
 #: builtin/revert.c:28
 msgid "git cherry-pick [options] <commit-ish>..."
-msgstr ""
+msgstr "git cherry-pick [ОПЦИИ] УКАЗАТЕЛ_КЪМ_ПОДАВАНЕ…"
 
 #: builtin/revert.c:29
 msgid "git cherry-pick <subcommand>"
-msgstr ""
+msgstr "git cherry-pick ПОДКОМАНДА"
 
 #: builtin/revert.c:71
 #, c-format
 msgid "%s: %s cannot be used with %s"
-msgstr ""
+msgstr "%s: опцията „%s“ е несъвместима с „%s“"
 
 #: 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"
-msgstr ""
+msgstr "без автоматично подаване"
 
 #: builtin/revert.c:84
 msgid "edit the commit message"
-msgstr ""
+msgstr "редактиране на съобщението при подаване"
 
 #: builtin/revert.c:87
 msgid "parent number"
-msgstr ""
+msgstr "номер на родителя"
 
 #: builtin/revert.c:89
 msgid "merge strategy"
-msgstr ""
+msgstr "стратегия на сливане"
 
 #: builtin/revert.c:90
 msgid "option"
-msgstr ""
+msgstr "опция"
 
 #: builtin/revert.c:91
 msgid "option for merge strategy"
-msgstr ""
+msgstr "опция за стратегията на сливане"
 
-#: builtin/revert.c:102
+#: builtin/revert.c:104
 msgid "append commit name"
-msgstr ""
+msgstr "добавяне на името на подаването"
 
-#: builtin/revert.c:103
+#: builtin/revert.c:105
 msgid "allow fast-forward"
-msgstr ""
+msgstr "позволяване на тривиални сливания"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:106
 msgid "preserve initially empty commits"
-msgstr ""
+msgstr "запазване на първоначално празните подавания"
 
-#: builtin/revert.c:105
+#: builtin/revert.c:107
 msgid "allow commits with empty messages"
-msgstr ""
+msgstr "позволяване на празни съобщения при подаване"
 
-#: builtin/revert.c:106
+#: builtin/revert.c:108
 msgid "keep redundant, empty commits"
-msgstr ""
+msgstr "запазване на излишните, празни подавания"
 
-#: builtin/revert.c:110
+#: builtin/revert.c:112
 msgid "program error"
-msgstr ""
+msgstr "грешка в програмата"
 
-#: builtin/revert.c:195
+#: builtin/revert.c:197
 msgid "revert failed"
-msgstr ""
+msgstr "неуспешна отмяна"
 
-#: builtin/revert.c:210
+#: builtin/revert.c:212
 msgid "cherry-pick failed"
-msgstr ""
+msgstr "неуспешно отбиране"
 
 #: builtin/rm.c:17
 msgid "git rm [options] [--] <file>..."
-msgstr "git rm [ОПЦИИ] [--] <ФАЙЛ>…"
+msgstr "git rm [ОПЦИИ] [--] ФАЙЛ…"
 
 #: builtin/rm.c:65
 msgid ""
@@ -8756,11 +9166,13 @@ msgid_plural ""
 "the following submodules (or one of its nested submodules)\n"
 "use a .git directory:"
 msgstr[0] ""
-"следният подмодул или някой от неговите подмодули\n"
-"използват директория на име „.git“:"
+"следният подмодул или някой от неговите подмодули използват директория на "
+"име\n"
+"„.git“:"
 msgstr[1] ""
-"следните подмодули или някои от техните подмодули\n"
-"използват директория на име „.git“:"
+"следните подмодули или някои от техните подмодули използват директория на "
+"име\n"
+"„.git“:"
 
 #: builtin/rm.c:71
 msgid ""
@@ -8877,92 +9289,95 @@ msgid "Linewrap output"
 msgstr ""
 
 #: builtin/show-branch.c:9
-#, fuzzy
 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 "<брой>"
+msgstr ""
+"git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--"
+"current] [--color[=КОГА] | --no-color] [--sparse] [--more=БРОЙ | --list | --"
+"independent | --merge-base] [--no-name | --sha1-name] [--topics] [(РЕВИЗИЯ | "
+"УКАЗАТЕЛ)…]"
 
 #: builtin/show-branch.c:10
-#, fuzzy
 msgid "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]"
-msgstr "<брой>"
+msgstr "git show-branch (-g|--reflog)[=БРОЙ[,БАЗА]] [--list] [УКАЗАТЕЛ]"
 
 #: builtin/show-branch.c:649
 msgid "show remote-tracking and local branches"
-msgstr ""
+msgstr "извеждане на следящите и локалните клони"
 
 #: builtin/show-branch.c:651
 msgid "show remote-tracking branches"
-msgstr ""
+msgstr "извеждане на следящите клони"
 
 #: builtin/show-branch.c:653
 msgid "color '*!+-' corresponding to the branch"
-msgstr ""
+msgstr "оцветяване на „*!+-“ според клоните"
 
 #: builtin/show-branch.c:655
-#, fuzzy
 msgid "show <n> more commits after the common ancestor"
-msgstr "<брой>"
+msgstr "извеждане на такъв БРОЙ подавания от общия предшественик"
 
 #: builtin/show-branch.c:657
 msgid "synonym to more=-1"
-msgstr ""
+msgstr "синоним на „more=-1“"
 
 #: builtin/show-branch.c:658
 msgid "suppress naming strings"
-msgstr ""
+msgstr "без низове за имената на клоните"
 
 #: builtin/show-branch.c:660
 msgid "include the current branch"
-msgstr ""
+msgstr "включване и на текущия клон"
 
 #: builtin/show-branch.c:662
 msgid "name commits with their object names"
-msgstr ""
+msgstr "именоване на подаванията с имената им на обекти"
 
 #: builtin/show-branch.c:664
 msgid "show possible merge bases"
-msgstr ""
+msgstr "извеждане на възможните бази за сливания"
 
 #: builtin/show-branch.c:666
 msgid "show refs unreachable from any other ref"
-msgstr ""
+msgstr "извеждане на недостижимите указатели"
 
 #: builtin/show-branch.c:668
 msgid "show commits in topological order"
-msgstr ""
+msgstr "извеждане на подаванията в топологическа подредба"
 
 #: builtin/show-branch.c:671
 msgid "show only commits not on the first branch"
-msgstr ""
+msgstr "извеждане само на подаванията, които не са от първия клон"
 
 #: builtin/show-branch.c:673
 msgid "show merges reachable from only one tip"
-msgstr ""
+msgstr "извеждане на сливанията, които могат да се достигнат само от един връх"
 
 #: builtin/show-branch.c:675
 msgid "topologically sort, maintaining date order where possible"
 msgstr ""
+"топологическа подредба, при запазване на подредбата по дата, доколкото е\n"
+"възможно"
 
 #: builtin/show-branch.c:678
-#, fuzzy
 msgid "<n>[,<base>]"
-msgstr "<брой>"
+msgstr "БРОЙ[,БАЗА]"
 
 #: builtin/show-branch.c:679
-#, fuzzy
 msgid "show <n> most recent ref-log entries starting at base"
-msgstr "<брой>"
+msgstr "показване на най-много БРОЙ журнални записа с начало съответната БАЗА"
 
+# FIXME * -> ...
 #: builtin/show-ref.c:10
-#, fuzzy
 msgid ""
 "git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--"
 "hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] "
-msgstr "<брой>"
+msgstr ""
+"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--"
+"hash[=ЧИСЛО]] [--abbrev[=ЧИСЛО]] [--tags] [--heads] [--] [ШАБЛОН…]"
 
 #: builtin/show-ref.c:11
 msgid "git show-ref --exclude-existing[=pattern] < ref-list"
@@ -8989,9 +9404,8 @@ msgid "dereference tags into object IDs"
 msgstr ""
 
 #: builtin/show-ref.c:179
-#, fuzzy
 msgid "only show SHA1 hash using <n> digits"
-msgstr "<брой>"
+msgstr "извеждане само на този БРОЙ цифри от всяка сума по SHA1"
 
 #: builtin/show-ref.c:183
 msgid "do not print results to stdout (useful with --verify)"
@@ -9003,42 +9417,44 @@ msgstr ""
 
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [options] name [ref]"
-msgstr ""
+msgstr "git symbolic-ref [ОПЦИИ] ИМЕ [УКАЗАТЕЛ]"
 
 #: builtin/symbolic-ref.c:8
 msgid "git symbolic-ref -d [-q] name"
-msgstr ""
+msgstr "git symbolic-ref -d [-q] ИМЕ"
 
 #: builtin/symbolic-ref.c:40
 msgid "suppress error message for non-symbolic (detached) refs"
-msgstr ""
+msgstr "без извеждане на грешка за несвързани (несимволни) указатели"
 
 #: builtin/symbolic-ref.c:41
 msgid "delete symbolic ref"
-msgstr ""
+msgstr "изтриване на символен указател"
 
 #: builtin/symbolic-ref.c:42
 msgid "shorten ref output"
-msgstr ""
+msgstr "кратка информация за указателя"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
 msgid "reason"
-msgstr ""
+msgstr "причина"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
 msgid "reason of the update"
-msgstr ""
+msgstr "причина за обновяването"
 
 #: 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 ИДЕНТИФИКАТОР_НА_КЛЮЧ] [-f] [-m СЪОБЩЕНИЕ|-F ФАЙЛ] ЕТИКЕТ "
+"[ВРЪХ]"
 
 #: builtin/tag.c:23
 msgid "git tag -d <tagname>..."
 msgstr ""
 
-# FIXME
+# FIXME tabulator
 #: builtin/tag.c:24
 msgid ""
 "git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] \n"
@@ -9049,32 +9465,32 @@ msgstr ""
 msgid "git tag -v <tagname>..."
 msgstr ""
 
-#: builtin/tag.c:60
+#: builtin/tag.c:67
 #, c-format
 msgid "malformed object at '%s'"
 msgstr ""
 
-#: builtin/tag.c:207
+#: builtin/tag.c:239
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr ""
 
-#: builtin/tag.c:212
+#: builtin/tag.c:244
 #, c-format
 msgid "tag '%s' not found."
 msgstr ""
 
-#: builtin/tag.c:227
+#: builtin/tag.c:259
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr ""
 
-#: builtin/tag.c:239
+#: builtin/tag.c:271
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr ""
 
-#: builtin/tag.c:249
+#: builtin/tag.c:281
 #, c-format
 msgid ""
 "\n"
@@ -9082,7 +9498,7 @@ msgid ""
 "Lines starting with '%c' will be ignored.\n"
 msgstr ""
 
-#: builtin/tag.c:253
+#: builtin/tag.c:285
 #, c-format
 msgid ""
 "\n"
@@ -9091,329 +9507,348 @@ msgid ""
 "want to.\n"
 msgstr ""
 
-#: builtin/tag.c:292
+#: builtin/tag.c:324
 msgid "unable to sign the tag"
 msgstr ""
 
-#: builtin/tag.c:294
+#: builtin/tag.c:326
 msgid "unable to write tag file"
 msgstr ""
 
-#: builtin/tag.c:319
+#: builtin/tag.c:351
 msgid "bad object type."
 msgstr ""
 
-#: builtin/tag.c:332
+#: builtin/tag.c:364
 msgid "tag header too big."
 msgstr ""
 
-#: builtin/tag.c:368
+#: builtin/tag.c:400
 msgid "no tag message?"
 msgstr ""
 
-#: builtin/tag.c:374
+#: builtin/tag.c:406
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr ""
 
-#: builtin/tag.c:423
+#: builtin/tag.c:455
 msgid "switch 'points-at' requires an object"
 msgstr ""
 
-#: builtin/tag.c:425
+#: builtin/tag.c:457
 #, c-format
 msgid "malformed object name '%s'"
 msgstr ""
 
-#: builtin/tag.c:445
+#: builtin/tag.c:480
+#, c-format
+msgid "unsupported sort specification %s"
+msgstr "зададена е неподдържана подредба: „%s“"
+
+#: builtin/tag.c:500
 msgid "list tag names"
 msgstr ""
 
-#: builtin/tag.c:447
-#, fuzzy
+#: builtin/tag.c:502
 msgid "print <n> lines of each tag message"
-msgstr "<брой>"
+msgstr "извеждане на този БРОЙ редове от всяко съобщение за етикет"
 
-#: builtin/tag.c:449
+#: builtin/tag.c:504
 msgid "delete tags"
 msgstr ""
 
-#: builtin/tag.c:450
+#: builtin/tag.c:505
 msgid "verify tags"
 msgstr ""
 
-#: builtin/tag.c:452
+#: builtin/tag.c:507
 msgid "Tag creation options"
 msgstr ""
 
-#: builtin/tag.c:454
+#: builtin/tag.c:509
 msgid "annotated tag, needs a message"
 msgstr ""
 
-#: builtin/tag.c:456
+#: builtin/tag.c:511
 msgid "tag message"
 msgstr ""
 
-#: builtin/tag.c:458
+#: builtin/tag.c:513
 msgid "annotated and GPG-signed tag"
 msgstr ""
 
-#: builtin/tag.c:462
+#: builtin/tag.c:517
 msgid "use another key to sign the tag"
 msgstr ""
 
-#: builtin/tag.c:463
+#: builtin/tag.c:518
 msgid "replace the tag if exists"
 msgstr ""
 
-#: builtin/tag.c:464
+#: builtin/tag.c:519
 msgid "show tag list in columns"
 msgstr ""
 
-#: builtin/tag.c:466
+#: builtin/tag.c:521
+msgid "sort tags"
+msgstr "подреждане на етикетите"
+
+#: builtin/tag.c:525
 msgid "Tag listing options"
 msgstr ""
 
-#: builtin/tag.c:469
+#: builtin/tag.c:528 builtin/tag.c:534
 msgid "print only tags that contain the commit"
 msgstr ""
 
-#: builtin/tag.c:475
+#: builtin/tag.c:540
 msgid "print only tags of the object"
 msgstr ""
 
-#: builtin/tag.c:501
+#: builtin/tag.c:566
 msgid "--column and -n are incompatible"
 msgstr ""
 
-#: builtin/tag.c:518
+#: builtin/tag.c:578
+msgid "--sort and -n are incompatible"
+msgstr "Опциите „--long“ и „-n“ са несъвместими"
+
+#: builtin/tag.c:585
 msgid "-n option is only allowed with -l."
 msgstr ""
 
-#: builtin/tag.c:520
+#: builtin/tag.c:587
 msgid "--contains option is only allowed with -l."
 msgstr ""
 
-#: builtin/tag.c:522
+#: builtin/tag.c:589
 msgid "--points-at option is only allowed with -l."
 msgstr ""
 
-#: builtin/tag.c:530
+#: builtin/tag.c:597
 msgid "only one -F or -m option is allowed."
 msgstr ""
 
-#: builtin/tag.c:550
+#: builtin/tag.c:617
 msgid "too many params"
 msgstr ""
 
-#: builtin/tag.c:556
+#: builtin/tag.c:623
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr ""
 
-#: builtin/tag.c:561
+#: builtin/tag.c:628
 #, c-format
 msgid "tag '%s' already exists"
 msgstr ""
 
-#: builtin/tag.c:579
+#: builtin/tag.c:646
 #, c-format
 msgid "%s: cannot lock the ref"
 msgstr ""
 
-#: builtin/tag.c:581
+#: builtin/tag.c:648
 #, c-format
 msgid "%s: cannot update the ref"
 msgstr ""
 
-#: builtin/tag.c:583
+#: builtin/tag.c:650
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr ""
 
-#: builtin/update-index.c:402
+#: builtin/unpack-objects.c:483
+msgid "Unpacking objects"
+msgstr "Разпакетиране на обектите"
+
+#: builtin/update-index.c:399
 msgid "git update-index [options] [--] [<file>...]"
 msgstr ""
 
-#: builtin/update-index.c:720
+#: builtin/update-index.c:748
 msgid "continue refresh even when index needs update"
 msgstr ""
 
-#: builtin/update-index.c:723
+#: builtin/update-index.c:751
 msgid "refresh: ignore submodules"
 msgstr ""
 
-#: builtin/update-index.c:726
+#: builtin/update-index.c:754
 msgid "do not ignore new files"
 msgstr ""
 
-#: builtin/update-index.c:728
+#: builtin/update-index.c:756
 msgid "let files replace directories and vice-versa"
 msgstr ""
 
-#: builtin/update-index.c:730
+#: builtin/update-index.c:758
 msgid "notice files missing from worktree"
 msgstr ""
 
-#: builtin/update-index.c:732
+#: builtin/update-index.c:760
 msgid "refresh even if index contains unmerged entries"
 msgstr ""
 
-#: builtin/update-index.c:735
+#: builtin/update-index.c:763
 msgid "refresh stat information"
 msgstr ""
 
-#: builtin/update-index.c:739
+#: builtin/update-index.c:767
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr ""
 
-#: builtin/update-index.c:743
-msgid "<mode> <object> <path>"
+#: builtin/update-index.c:771
+msgid "<mode>,<object>,<path>"
 msgstr ""
 
-#: builtin/update-index.c:744
+#: builtin/update-index.c:772
 msgid "add the specified entry to the index"
 msgstr ""
 
-#: builtin/update-index.c:748
+#: builtin/update-index.c:776
 msgid "(+/-)x"
 msgstr ""
 
-#: builtin/update-index.c:749
+#: builtin/update-index.c:777
 msgid "override the executable bit of the listed files"
 msgstr ""
 
-#: builtin/update-index.c:753
+#: builtin/update-index.c:781
 msgid "mark files as \"not changing\""
 msgstr ""
 
-#: builtin/update-index.c:756
+#: builtin/update-index.c:784
 msgid "clear assumed-unchanged bit"
 msgstr ""
 
-#: builtin/update-index.c:759
+#: builtin/update-index.c:787
 msgid "mark files as \"index-only\""
 msgstr ""
 
-#: builtin/update-index.c:762
+#: builtin/update-index.c:790
 msgid "clear skip-worktree bit"
 msgstr ""
 
-#: builtin/update-index.c:765
+#: builtin/update-index.c:793
 msgid "add to index only; do not add content to object database"
 msgstr ""
 
-#: builtin/update-index.c:767
+#: builtin/update-index.c:795
 msgid "remove named paths even if present in worktree"
 msgstr ""
 
-#: builtin/update-index.c:769
+#: builtin/update-index.c:797
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr ""
 
-#: builtin/update-index.c:771
+#: builtin/update-index.c:799
 msgid "read list of paths to be updated from standard input"
 msgstr ""
 
-#: builtin/update-index.c:775
+#: builtin/update-index.c:803
 msgid "add entries from standard input to the index"
 msgstr ""
 
-#: builtin/update-index.c:779
+#: builtin/update-index.c:807
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr ""
 
-#: builtin/update-index.c:783
+#: builtin/update-index.c:811
 msgid "only update entries that differ from HEAD"
 msgstr ""
 
-#: builtin/update-index.c:787
+#: builtin/update-index.c:815
 msgid "ignore files missing from worktree"
 msgstr ""
 
-#: builtin/update-index.c:790
+#: builtin/update-index.c:818
 msgid "report actions to standard output"
 msgstr ""
 
-#: builtin/update-index.c:792
+#: builtin/update-index.c:820
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr ""
 
-#: builtin/update-index.c:796
+#: builtin/update-index.c:824
 msgid "write index in this format"
 msgstr ""
 
 #: builtin/update-ref.c:9
 msgid "git update-ref [options] -d <refname> [<oldval>]"
-msgstr ""
+msgstr "git update-ref [ОПЦИИ] -d ИМЕ_НА_УКАЗАТЕЛ [СТАРА_СТОЙНОСТ]"
 
 #: builtin/update-ref.c:10
 msgid "git update-ref [options]    <refname> <newval> [<oldval>]"
 msgstr ""
+"git update-ref [ОПЦИИ]    ИМЕ_НА_УКАЗАТЕЛ НОВА_СТОЙНОСТ [СТАРА_СТОЙНОСТ]"
 
 #: builtin/update-ref.c:11
 msgid "git update-ref [options] --stdin [-z]"
-msgstr ""
+msgstr "git update-ref [ОПЦИИ] --stdin [-z]"
 
-#: builtin/update-ref.c:255
+#: builtin/update-ref.c:256
 msgid "delete the reference"
-msgstr ""
+msgstr "изтриване на указателя"
 
-#: builtin/update-ref.c:257
+#: builtin/update-ref.c:258
 msgid "update <refname> not the one it points to"
-msgstr ""
+msgstr "обновяване на ИМЕто_НА_УКАЗАТЕЛя, а не това, към което сочи"
 
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:259
 msgid "stdin has NUL-terminated arguments"
 msgstr ""
+"някои от елементите подадени на стандартния вход завършват с нулевия знак "
+"„NUL“"
 
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:260
 msgid "read updates from stdin"
-msgstr ""
+msgstr "изчитане на указателите от стандартния вход"
 
 #: builtin/update-server-info.c:6
 msgid "git update-server-info [--force]"
-msgstr ""
+msgstr "git update-server-info [--force]"
 
 #: builtin/update-server-info.c:14
 msgid "update the info files from scratch"
-msgstr ""
+msgstr "обновяване на информационните файлове от нулата"
 
 #: builtin/verify-pack.c:56
 msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."
-msgstr ""
+msgstr "git verify-pack [-v|--verbose] [-s|--stat-only] ПАКЕТ…"
 
 #: builtin/verify-pack.c:66
 msgid "verbose"
-msgstr ""
+msgstr "извеждане на подробна информация"
 
 #: builtin/verify-pack.c:68
 msgid "show statistics only"
-msgstr ""
+msgstr "извеждане само на статистиката"
 
 #: builtin/verify-tag.c:17
 msgid "git verify-tag [-v|--verbose] <tag>..."
-msgstr ""
+msgstr "git verify-tag [-v|--verbose] ЕТИКЕТ…"
 
 #: builtin/verify-tag.c:73
 msgid "print tag contents"
-msgstr ""
+msgstr "извеждане на съдържанието на ЕТИКЕТи"
 
 #: builtin/write-tree.c:13
 msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
-msgstr ""
+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 ""
+msgstr "само за изчистване на грешки"
 
 #: git.c:17
 msgid ""
@@ -9421,123 +9856,130 @@ msgid ""
 "concept guides. See 'git help <command>' or 'git help <concept>'\n"
 "to read about a specific subcommand or concept."
 msgstr ""
+"„git help -a“ извежда наличните подкоманди, а „git help -g“ извежда "
+"наличните\n"
+"ръководства. За помощ за специфична КОМАНДА ползвайте „git help КОМАНДА“, а "
+"за\n"
+"някое определено ПОНЯТИЕ използвайте „git help ПОНЯТИЕ“."
 
-#: parse-options.h:146
-msgid "expiry date"
-msgstr "период на валидност"
+#: parse-options.h:143
+msgid "expiry-date"
+msgstr "период на валидност/запазване"
 
-#: parse-options.h:161
+#: parse-options.h:158
 msgid "no-op (backward compatibility)"
 msgstr "нулева операция (за съвместимост с предишни версии)"
 
-#: parse-options.h:235
+#: parse-options.h:232
 msgid "be more verbose"
 msgstr "повече подробности"
 
-#: parse-options.h:237
+#: parse-options.h:234
 msgid "be more quiet"
 msgstr "по-малко подробности"
 
-# FIXME
-#: parse-options.h:243
+# FIXME SHA-1 -> SHA1
+#: parse-options.h:240
 msgid "use <n> digits to display SHA-1s"
-msgstr "да се показват такъв <брой> цифри от сумите по SHA1"
+msgstr "да се показват такъв БРОЙ цифри от сумите по SHA1"
 
 #: common-cmds.h:8
 msgid "Add file contents to the index"
-msgstr ""
+msgstr "Добавяне на съдържанието на файла към индекса"
 
 #: common-cmds.h:9
 msgid "Find by binary search the change that introduced a bug"
-msgstr ""
+msgstr "Двоично търсене на промяната, която е причинила грешка"
 
+# FIXME - should be similar to tag
 #: common-cmds.h:10
 msgid "List, create, or delete branches"
-msgstr ""
+msgstr "Извеждане, създаване, изтриване на клони"
 
 #: common-cmds.h:11
 msgid "Checkout a branch or paths to the working tree"
-msgstr ""
+msgstr "Изтегляне на цял клон или файлове/директории в работното дърво"
 
 #: common-cmds.h:12
 msgid "Clone a repository into a new directory"
-msgstr ""
+msgstr "Клониране на хранилище в нова директория"
 
 #: common-cmds.h:13
 msgid "Record changes to the repository"
-msgstr ""
+msgstr "Подаване на промени в хранилището"
 
 #: common-cmds.h:14
 msgid "Show changes between commits, commit and working tree, etc"
-msgstr ""
+msgstr "Извеждане на разликите между подаванията, версиите, работното дърво"
 
 #: common-cmds.h:15
 msgid "Download objects and refs from another repository"
-msgstr ""
+msgstr "Изтегляне на обекти и указатели от друго хранилище"
 
 #: common-cmds.h:16
 msgid "Print lines matching a pattern"
-msgstr ""
+msgstr "Извеждане на редовете напасващи на шаблон"
 
 #: common-cmds.h:17
 msgid "Create an empty Git repository or reinitialize an existing one"
-msgstr ""
+msgstr "Създаване на празно хранилище на Git или зануляване на съществуващо"
 
 #: common-cmds.h:18
 msgid "Show commit logs"
-msgstr ""
+msgstr "Извеждане на журнала с подаванията"
 
 #: common-cmds.h:19
 msgid "Join two or more development histories together"
-msgstr ""
+msgstr "Сливане на две или повече поредици/истории от промени"
 
 #: common-cmds.h:20
 msgid "Move or rename a file, a directory, or a symlink"
-msgstr ""
+msgstr "Преместване или преименуване на файл, директория или символна връзка"
 
 #: common-cmds.h:21
 msgid "Fetch from and integrate with another repository or a local branch"
-msgstr ""
+msgstr "Доставяне и интегрирането на промените от друго хранилище или клон"
 
 #: common-cmds.h:22
 msgid "Update remote refs along with associated objects"
-msgstr ""
+msgstr "Обновяване на отдалечените указатели и свързаните с тях обекти"
 
 #: common-cmds.h:23
 msgid "Forward-port local commits to the updated upstream head"
-msgstr ""
+msgstr "Пребазиране на промени към нова основа"
 
 #: common-cmds.h:24
 msgid "Reset current HEAD to the specified state"
-msgstr ""
+msgstr "Привеждане на указателя „HEAD“ към зададеното състояние"
 
 #: common-cmds.h:25
 msgid "Remove files from the working tree and from the index"
-msgstr ""
+msgstr "Изтриване на файлове от работното дърво и индекса"
 
 #: common-cmds.h:26
 msgid "Show various types of objects"
-msgstr ""
+msgstr "Извеждане на различните видове обекти в Git"
 
 #: common-cmds.h:27
 msgid "Show the working tree status"
-msgstr ""
+msgstr "Извеждане на състоянието на работното дърво"
 
+# FIXME - should be similar to branch
 #: common-cmds.h:28
 msgid "Create, list, delete or verify a tag object signed with GPG"
-msgstr ""
+msgstr "Извеждане, създаване, изтриване, проверка на етикети подписани с GPG"
 
-#: git-am.sh:50
+#: git-am.sh:52
 msgid "You need to set your committer info first"
 msgstr ""
 
-#: git-am.sh:95
+#: git-am.sh:97
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
 msgstr ""
 
-#: git-am.sh:105
+#: git-am.sh:107
 #, sh-format
 msgid ""
 "When you have resolved this problem, run \"$cmdline --continue\".\n"
@@ -9545,77 +9987,77 @@ msgid ""
 "To restore the original branch and stop patching, run \"$cmdline --abort\"."
 msgstr ""
 
-#: git-am.sh:121
+#: git-am.sh:123
 msgid "Cannot fall back to three-way merge."
 msgstr ""
 
-#: git-am.sh:137
+#: git-am.sh:139
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
 
-#: git-am.sh:139
+#: git-am.sh:141
 msgid "Using index info to reconstruct a base tree..."
 msgstr ""
 
-#: git-am.sh:154
+#: git-am.sh:156
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
 msgstr ""
 
-#: git-am.sh:163
+#: git-am.sh:165
 msgid "Falling back to patching base and 3-way merge..."
 msgstr ""
 
-#: git-am.sh:179
+#: git-am.sh:181
 msgid "Failed to merge in the changes."
 msgstr ""
 
-#: git-am.sh:274
+#: git-am.sh:276
 msgid "Only one StGIT patch series can be applied at once"
 msgstr ""
 
-#: git-am.sh:361
+#: git-am.sh:363
 #, sh-format
 msgid "Patch format $patch_format is not supported."
 msgstr ""
 
-#: git-am.sh:363
+#: git-am.sh:365
 msgid "Patch format detection failed."
 msgstr ""
 
-#: git-am.sh:389
+#: 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 ""
 
-#: git-am.sh:479
+#: git-am.sh:486
 #, sh-format
 msgid "previous rebase directory $dotest still exists but mbox given."
 msgstr ""
 
-#: git-am.sh:484
+#: git-am.sh:491
 msgid "Please make up your mind. --skip or --abort?"
 msgstr ""
 
-#: git-am.sh:520
+#: git-am.sh:527
 #, sh-format
 msgid ""
 "Stray $dotest directory found.\n"
 "Use \"git am --abort\" to remove it."
 msgstr ""
 
-#: git-am.sh:528
+#: git-am.sh:535
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr ""
 
-#: git-am.sh:594
+#: git-am.sh:601
 #, sh-format
 msgid "Dirty index: cannot apply patches (dirty: $files)"
 msgstr ""
 
-#: git-am.sh:698
+#: git-am.sh:705
 #, sh-format
 msgid ""
 "Patch is empty.  Was it split wrong?\n"
@@ -9623,60 +10065,60 @@ msgid ""
 "To restore the original branch and stop patching run \"$cmdline --abort\"."
 msgstr ""
 
-#: git-am.sh:725
+#: git-am.sh:732
 msgid "Patch does not have a valid e-mail address."
 msgstr ""
 
-#: git-am.sh:772
+#: git-am.sh:779
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
 
-#: git-am.sh:776
+#: git-am.sh:783
 msgid "Commit Body is:"
 msgstr ""
 
 #. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
 #. in your translation. The program will only accept English
 #. input at this point.
-#: git-am.sh:783
+#: git-am.sh:790
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
 msgstr ""
 
-#: git-am.sh:819
+#: git-am.sh:826
 #, sh-format
 msgid "Applying: $FIRSTLINE"
 msgstr ""
 
-#: git-am.sh:840
+#: 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 ""
 
-#: git-am.sh:848
+#: git-am.sh:855
 msgid ""
 "You still have unmerged paths in your index\n"
 "did you forget to use 'git add'?"
 msgstr ""
 
-#: git-am.sh:864
+#: git-am.sh:871
 msgid "No changes -- Patch already applied."
 msgstr ""
 
-#: git-am.sh:874
+#: git-am.sh:881
 #, sh-format
 msgid "Patch failed at $msgnum $FIRSTLINE"
 msgstr ""
 
-#: git-am.sh:877
+#: git-am.sh:884
 #, sh-format
 msgid ""
 "The copy of the patch that failed is found in:\n"
 "   $dotest/patch"
 msgstr ""
 
-#: git-am.sh:895
+#: git-am.sh:902
 msgid "applying to an empty history"
 msgstr ""
 
@@ -9742,8 +10184,6 @@ msgstr ""
 msgid "'git bisect bad' can take only one argument."
 msgstr ""
 
-#. have bad but not good.  we could bisect although
-#. this is less optimum.
 #: git-bisect.sh:273
 msgid "Warning: bisecting only with a bad commit."
 msgstr ""
@@ -9830,96 +10270,115 @@ msgid ""
 "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 ""
+"Невъзможно е да издърпвате в момента, защото някои файлове не са слети. "
+"Трябва\n"
+"да ги прегледате, коригирате, ако е необходимо и да ги добавите или извадите "
+"от\n"
+"индекса с командата „git add/rm ФАЙЛ“. Ако всичко е наред, можете да "
+"ползвате и\n"
+"командата „git commit -a“."
 
 #: git-pull.sh:25
 msgid "Pull is not possible because you have unmerged files."
 msgstr ""
+"Невъзможно е да издърпвате в момента, защото някои файлове не са слети."
 
-#: git-pull.sh:223
+#: git-pull.sh:247
 msgid "updating an unborn branch with changes added to the index"
-msgstr ""
+msgstr "обновяване на още несъздаден клон с промените от индекса"
 
-#. The fetch involved updating the current branch.
-#. The working tree and the index file is still based on the
-#. $orig_head commit, but we are merging into $curr_head.
-#. First update the working tree to match $curr_head.
-#: git-pull.sh:247
+#: git-pull.sh:271
 #, 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“."
 
-#: git-pull.sh:272
+#: git-pull.sh:296
 msgid "Cannot merge multiple branches into empty head"
-msgstr ""
+msgstr "Не може да сливате множество клони в празен върхов указател"
 
-#: git-pull.sh:276
+#: git-pull.sh:300
 msgid "Cannot rebase onto multiple branches"
-msgstr ""
+msgstr "Не може да пребазирате върху повече от един клон"
 
-#: git-rebase.sh:55
+#: git-rebase.sh:57
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
 "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
 "To check out the original branch and stop rebasing, run \"git rebase --abort"
 "\"."
 msgstr ""
+"След коригирането на този проблем изпълнете „git rebase --continue“.\n"
+"Ако предпочитате да прескочите тази кръпка, изпълнете „git rebase --skip“.\n"
+"За да откажете пребазирането и да се върнете към първоначалното състояние,\n"
+"изпълнете „git rebase --abort“."
 
-#: git-rebase.sh:158
+#: git-rebase.sh:164
 msgid "Applied autostash."
-msgstr ""
+msgstr "Автоматично скатаното е приложено."
 
-#: git-rebase.sh:161
+#: git-rebase.sh:167
 #, sh-format
 msgid "Cannot store $stash_sha1"
-msgstr ""
+msgstr "„$stash_sha1“ не може да бъде запазен"
 
-#: git-rebase.sh:162
+#: git-rebase.sh:168
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
 "You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
 msgstr ""
+"Прилагането на автоматично скатаното доведе до конфликти. Промените ви са\n"
+"надеждно скатани. Можете да пробвате да ги приложите чрез „git stash pop“\n"
+"или да ги изхвърлите чрез „git stash drop“, когато поискате.\n"
 
-#: git-rebase.sh:201
+#: git-rebase.sh:207
 msgid "The pre-rebase hook refused to rebase."
-msgstr ""
+msgstr "Куката за изпълнение преди пребазиране отхвърли пребазирането."
 
-#: git-rebase.sh:206
+#: git-rebase.sh:212
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr ""
+"Изглежда, че сега се прилагат кръпки чрез командата „git-am“. Не може да "
+"пребазирате в момента."
 
-#: git-rebase.sh:346
+#: git-rebase.sh:350
 msgid "The --exec option must be used with the --interactive option"
-msgstr ""
+msgstr "Опцията „--exec“ задължително изисква опцията „--interactive“"
 
-#: git-rebase.sh:351
+# FIXME message
+#: git-rebase.sh:355
 msgid "No rebase in progress?"
-msgstr ""
+msgstr "Изглежда в момента не тече пребазиране"
 
-#: git-rebase.sh:362
+#: git-rebase.sh:366
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
+"Опцията „--edit-todo“ е достъпна само по време на интерактивно пребазиране."
 
-#: git-rebase.sh:369
+#: git-rebase.sh:373
 msgid "Cannot read HEAD"
-msgstr ""
+msgstr "Указателят „HEAD“ не може да бъде прочетен"
 
-#: git-rebase.sh:372
+#: git-rebase.sh:376
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
 msgstr ""
+"Трябва да редактирате всички конфликти при сливането. След това\n"
+"отбележете коригирането им чрез командата „git add“"
 
-#: git-rebase.sh:390
+#: git-rebase.sh:394
 #, sh-format
 msgid "Could not move back to $head_name"
-msgstr ""
+msgstr "Връщането към „$head_name“ е невъзможно"
 
-# FIXME
-#: git-rebase.sh:409
+# FIXME tabulators, I, double spaces
+#: git-rebase.sh:413
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -9931,102 +10390,117 @@ msgid ""
 "and run me again.  I am stopping in case you still have something\n"
 "valuable there."
 msgstr ""
+"Вече съществува директория „$state_dir_base directory“. Възможно ли е да "
+"сте\n"
+"в процес на друго пребазиране? Ако това е така, изпълнете:\n"
+"    $cmd_live_rebase\n"
+"Ако не сте в процес на друго пребазиране, изпълнете:\n"
+"    $cmd_clear_stale_rebase\n"
+"и отново започнете пребазирането. Текущото пребазиране се преустановява, за\n"
+"да не загубите случайно промени."
 
-#: git-rebase.sh:456
+#: git-rebase.sh:464
 #, sh-format
 msgid "invalid upstream $upstream_name"
-msgstr ""
+msgstr "неправилна основа за сравнение „$upstream_name“"
 
-#: git-rebase.sh:480
+#: git-rebase.sh:488
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr ""
+"указателят „$onto_name“ може да сочи към повече от една основа за "
+"пребазирането"
 
-#: git-rebase.sh:483 git-rebase.sh:487
+#: git-rebase.sh:491 git-rebase.sh:495
 #, sh-format
 msgid "$onto_name: there is no merge base"
-msgstr ""
+msgstr "указателят „$onto_name“ не сочи към никаква основа за пребазирането"
 
-#: git-rebase.sh:492
+#: git-rebase.sh:500
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
-msgstr ""
+msgstr "Указателят „$onto_name“ не сочи към подаване"
 
-#: git-rebase.sh:515
+#: git-rebase.sh:523
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
-msgstr ""
+msgstr "фатална грешка: не съществува клон „$branch_name“"
 
-#: git-rebase.sh:548
+#: git-rebase.sh:556
 msgid "Cannot autostash"
-msgstr ""
+msgstr "Не може да се скатае автоматично"
 
-#: git-rebase.sh:553
+#: git-rebase.sh:561
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
-msgstr ""
+msgstr "Автоматично скатано: „$stash_abbrev“"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:565
 msgid "Please commit or stash them."
-msgstr ""
+msgstr "Промените трябва или да се подадат, или да се скатаят."
 
-#: git-rebase.sh:577
+#: git-rebase.sh:585
 #, sh-format
 msgid "Current branch $branch_name is up to date."
-msgstr ""
+msgstr "Текущият клон „$branch_name“ е напълно актуален."
 
-#: git-rebase.sh:581
+#: git-rebase.sh:589
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr ""
+"Текущият клон „$branch_name“ е напълно актуален. Пребазирането е "
+"принудително."
 
-#: git-rebase.sh:592
+#: git-rebase.sh:600
 #, sh-format
 msgid "Changes from $mb to $onto:"
-msgstr ""
+msgstr "Промените от „$mb“ към „$onto“:"
 
-#. Detach HEAD and reset the tree
-#: git-rebase.sh:601
+#: git-rebase.sh:609
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
+"Първо, указателят „HEAD“ започва да сочи към базата, върху която пребазирате…"
 
-#: git-rebase.sh:611
+#: git-rebase.sh:619
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
-msgstr ""
+msgstr "Тривиално сливане на „$branch_name“ върху „$onto_name“."
 
+# FIXME - should 'clear' not take parameters in principle?
 #: git-stash.sh:51
 msgid "git stash clear with parameters is unimplemented"
-msgstr ""
+msgstr "Командата „git stash clear“ не поддържа аргументи"
 
 #: git-stash.sh:74
 msgid "You do not have the initial commit yet"
-msgstr ""
+msgstr "Все още липсва първоначално подаване"
 
 #: git-stash.sh:89
 msgid "Cannot save the current index state"
-msgstr ""
+msgstr "Състоянието на текущия индекс не може да бъде запазено"
 
 #: git-stash.sh:123 git-stash.sh:136
 msgid "Cannot save the current worktree state"
-msgstr ""
+msgstr "Състоянието на работното дърво не може да бъде запазено"
 
 #: git-stash.sh:140
 msgid "No changes selected"
-msgstr ""
+msgstr "Не са избрани никакви промени"
 
+# FIXME can't happen??? може, може
 #: git-stash.sh:143
 msgid "Cannot remove temporary index (can't happen)"
-msgstr ""
+msgstr "Временният индекс не може да бъде изтрит"
 
 #: git-stash.sh:156
 msgid "Cannot record working tree state"
-msgstr ""
+msgstr "Състоянието на работното дърво не може да бъде запазено"
 
 #: git-stash.sh:190
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr ""
+"Указателят „$ref_stash“ не може да бъде обновен да сочи към „$w_commit“"
 
 #. TRANSLATORS: $option is an invalid option, like
 #. `--blah-blah'. The 7 spaces at the beginning of the
@@ -10044,88 +10518,92 @@ msgid ""
 "error: unknown option for 'stash save': $option\n"
 "       To provide a message, use git stash save -- '$option'"
 msgstr ""
+"грешка: командата „git stash save“ не поддържа опция „$option“\n"
+"        За да зададете съобщение, изпълнете „git stash save -- '$option'“"
 
 #: git-stash.sh:258
 msgid "No local changes to save"
-msgstr ""
+msgstr "Няма никакви локални промени за скатаване"
 
 #: git-stash.sh:262
 msgid "Cannot initialize stash"
-msgstr ""
+msgstr "Скатаването не може да стартира"
 
 #: git-stash.sh:266
 msgid "Cannot save the current status"
-msgstr ""
+msgstr "Текущото състояние не може да бъде запазено"
 
 #: git-stash.sh:284
 msgid "Cannot remove worktree changes"
-msgstr ""
+msgstr "Промените в работното дърво не могат да бъдат занулени"
 
 #: git-stash.sh:383
 msgid "No stash found."
-msgstr ""
+msgstr "Не е открито нищо скатано."
 
 #: git-stash.sh:390
 #, sh-format
 msgid "Too many revisions specified: $REV"
-msgstr ""
+msgstr "Указани са прекалено много версии: „$REV“"
 
 #: git-stash.sh:396
 #, sh-format
 msgid "$reference is not valid reference"
-msgstr ""
+msgstr "Указателят „$reference“ е грешен"
 
 #: git-stash.sh:424
 #, sh-format
 msgid "'$args' is not a stash-like commit"
-msgstr ""
+msgstr "„$args“ не е подаване приличащо на нещо скатано"
 
 #: git-stash.sh:435
 #, sh-format
 msgid "'$args' is not a stash reference"
-msgstr ""
+msgstr "„$args“ не е указател към нещо скатано"
 
 #: git-stash.sh:443
 msgid "unable to refresh index"
-msgstr ""
+msgstr "индексът не може да бъде обновен"
 
 #: git-stash.sh:447
 msgid "Cannot apply a stash in the middle of a merge"
-msgstr ""
+msgstr "По време на сливане не може да приложите нещо скатано"
 
 #: git-stash.sh:455
 msgid "Conflicts in index. Try without --index."
 msgstr ""
+"В индекса има конфликти. Пробвайте да изпълните командата без опцията „--"
+"index“."
 
 #: git-stash.sh:457
 msgid "Could not save index tree"
-msgstr ""
+msgstr "Дървото сочено от индекса не може да бъде запазено"
 
 #: git-stash.sh:491
 msgid "Cannot unstage modified files"
-msgstr ""
+msgstr "Променените файлове не могат да бъдат извадени от индекса"
 
 #: git-stash.sh:506
 msgid "Index was not unstashed."
-msgstr ""
+msgstr "Индексът не е скатан."
 
-#: git-stash.sh:523
+#: git-stash.sh:529
 #, sh-format
 msgid "Dropped ${REV} ($s)"
-msgstr ""
+msgstr "Изтрито е скатаното „${REV}“ ($s)"
 
-#: git-stash.sh:524
+#: git-stash.sh:530
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
-msgstr ""
+msgstr "Скатаното „${REV}“ не може да бъде изтрито"
 
-#: git-stash.sh:531
+#: git-stash.sh:537
 msgid "No branch name specified"
-msgstr ""
+msgstr "Не е указано име на клон"
 
-#: git-stash.sh:603
+#: git-stash.sh:609
 msgid "(To restore them type \"git stash apply\")"
-msgstr ""
+msgstr "(За да ги възстановите, изпълнете командата „git stash apply“)"
 
 #: git-submodule.sh:95
 #, sh-format
@@ -10137,31 +10615,31 @@ msgstr ""
 msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:281
+#: git-submodule.sh:287
 #, sh-format
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
 msgstr ""
 
-#: git-submodule.sh:293
+#: git-submodule.sh:299
 #, sh-format
 msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
 msgstr ""
 
-#: git-submodule.sh:403
+#: git-submodule.sh:409
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 
-#: git-submodule.sh:413
+#: git-submodule.sh:419
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr ""
 
-#: git-submodule.sh:430
+#: git-submodule.sh:436
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr ""
 
-#: git-submodule.sh:434
+#: git-submodule.sh:440
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -10169,236 +10647,235 @@ msgid ""
 "Use -f if you really want to add it."
 msgstr ""
 
-#: git-submodule.sh:452
+#: git-submodule.sh:458
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr ""
 
-#: git-submodule.sh:454
+#: git-submodule.sh:460
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr ""
 
-#: git-submodule.sh:462
+#: git-submodule.sh:468
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 
-#: git-submodule.sh:464
+#: git-submodule.sh:470
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
 msgstr ""
 
-#: git-submodule.sh:466
+#: git-submodule.sh:472
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
 msgstr ""
 
-#: git-submodule.sh:467
+#: git-submodule.sh:473
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
 "option."
 msgstr ""
 
-#: git-submodule.sh:469
+#: git-submodule.sh:475
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr ""
 
-#: git-submodule.sh:481
+#: git-submodule.sh:487
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:486
+#: git-submodule.sh:492
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:495
+#: git-submodule.sh:501
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:539
+#: git-submodule.sh:545
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:559
+#: git-submodule.sh:565
 #, sh-format
 msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
 msgstr ""
 
-#: git-submodule.sh:605
+#: git-submodule.sh:611
 #, sh-format
 msgid "No url found for submodule path '$displaypath' in .gitmodules"
 msgstr ""
 
-#: git-submodule.sh:614
+#: git-submodule.sh:620
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:616
+#: git-submodule.sh:622
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:633
+#: git-submodule.sh:639
 #, sh-format
 msgid "Failed to register update mode for submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:671
+#: git-submodule.sh:677
 #, sh-format
 msgid "Use '.' if you really want to deinitialize all submodules"
 msgstr ""
 
-#: git-submodule.sh:688
+#: git-submodule.sh:694
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr ""
 
-#: git-submodule.sh:689
+#: git-submodule.sh:695
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr ""
 
-#: git-submodule.sh:695
+#: git-submodule.sh:701
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
 "discard them"
 msgstr ""
 
-#: git-submodule.sh:698
+#: git-submodule.sh:704
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:699
+#: git-submodule.sh:705
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:702
+#: git-submodule.sh:708
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:711
+#: git-submodule.sh:717
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:834
+#: git-submodule.sh:833
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
 "Maybe you want to use 'update --init'?"
 msgstr ""
 
-#: git-submodule.sh:847
+#: git-submodule.sh:846
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:856
+#: git-submodule.sh:855
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:880
+#: git-submodule.sh:879
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr ""
 
+#: git-submodule.sh:893
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+msgstr ""
+
 #: git-submodule.sh:894
 #, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr ""
+
+#: git-submodule.sh:898
+#, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:895
+#: git-submodule.sh:899
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr ""
 
-#: git-submodule.sh:900
+#: git-submodule.sh:904
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:901
+#: git-submodule.sh:905
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr ""
 
-#: git-submodule.sh:906
+#: git-submodule.sh:910
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule  path '$prefix$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:907
+#: git-submodule.sh:911
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr ""
 
-#: git-submodule.sh:912
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
-msgstr ""
-
-#: git-submodule.sh:913
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr ""
-
-#: git-submodule.sh:940
+#: git-submodule.sh:941
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:1048
+#: git-submodule.sh:1049
 msgid "The --cached option cannot be used with the --files option"
 msgstr ""
 
-#. unexpected type
-#: git-submodule.sh:1096
+#: git-submodule.sh:1097
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr ""
 
-#: git-submodule.sh:1116
+#: git-submodule.sh:1117
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr ""
 
-#: git-submodule.sh:1119
+#: git-submodule.sh:1120
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr ""
 
-#: git-submodule.sh:1122
+#: git-submodule.sh:1123
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 
-#: git-submodule.sh:1147
+#: git-submodule.sh:1148
 msgid "blob"
 msgstr ""
 
-#: git-submodule.sh:1261
+#: git-submodule.sh:1262
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:1325
+#: git-submodule.sh:1326
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr ""
index b777ef4803cacee3c44d2eb69793b1e12cc636c0..8f126d78dacd37e9b621448337ef3f4988f80463 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -5,9 +5,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: git 1.9\n"
+"Project-Id-Version: git 2.0.0\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-02-01 08:06+0800\n"
+"POT-Creation-Date: 2014-04-17 12:13+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"
@@ -17,16 +17,12 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n!=1);\n"
 
-#: advice.c:57
+#: advice.c:55
 #, c-format
 msgid "hint: %.*s\n"
 msgstr "Hinweis: %.*s\n"
 
-#.
-#. * Message used both when 'git commit' fails and when
-#. * other commands doing a merge do.
-#.
-#: advice.c:87
+#: advice.c:85
 msgid ""
 "Fix them up in the work tree,\n"
 "and then use 'git add/rm <file>' as\n"
@@ -57,76 +53,76 @@ msgstr ""
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <Repository> [--exec <Programm>] --list"
 
-#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328
+#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "Pfadspezifikation '%s' stimmt mit keinen Dateien überein"
 
-#: archive.c:327
+#: archive.c:328
 msgid "fmt"
 msgstr "Format"
 
-#: archive.c:327
+#: archive.c:328
 msgid "archive format"
 msgstr "Archivformat"
 
-#: archive.c:328 builtin/log.c:1193
+#: archive.c:329 builtin/log.c:1193
 msgid "prefix"
 msgstr "Präfix"
 
-#: archive.c:329
+#: archive.c:330
 msgid "prepend prefix to each pathname in the archive"
 msgstr "stellt einen Präfix vor jeden Pfadnamen in dem Archiv"
 
-#: archive.c:330 builtin/archive.c:88 builtin/blame.c:2265
-#: builtin/blame.c:2266 builtin/config.c:58 builtin/fast-export.c:680
-#: builtin/fast-export.c:682 builtin/grep.c:716 builtin/hash-object.c:77
-#: builtin/ls-files.c:486 builtin/ls-files.c:489 builtin/notes.c:408
-#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:154
+#: 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
 msgid "file"
 msgstr "Datei"
 
-#: archive.c:331 builtin/archive.c:89
+#: archive.c:332 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr "schreibt das Archiv in diese Datei"
 
-#: archive.c:333
+#: archive.c:334
 msgid "read .gitattributes in working directory"
 msgstr "liest .gitattributes aus dem Arbeitsverzeichnis"
 
-#: archive.c:334
+#: archive.c:335
 msgid "report archived files on stderr"
 msgstr "gibt archivierte Dateien in der Standard-Fehlerausgabe aus"
 
-#: archive.c:335
+#: archive.c:336
 msgid "store only"
 msgstr "nur speichern"
 
-#: archive.c:336
+#: archive.c:337
 msgid "compress faster"
 msgstr "schneller komprimieren"
 
-#: archive.c:344
+#: archive.c:345
 msgid "compress better"
 msgstr "besser komprimieren"
 
-#: archive.c:347
+#: archive.c:348
 msgid "list supported archive formats"
 msgstr "listet unterstützte Archivformate auf"
 
-#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
 msgid "repo"
 msgstr "Repository"
 
-#: archive.c:350 builtin/archive.c:91
+#: archive.c:351 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "ruft das Archiv von Remote-Repository <Repository> ab"
 
-#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487
+#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
 msgid "command"
 msgstr "Programm"
 
-#: archive.c:352 builtin/archive.c:93
+#: archive.c:353 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr "Pfad zum externen \"git-upload-archive\"-Programm"
 
@@ -143,88 +139,82 @@ msgstr ""
 msgid "Not setting branch %s as its own upstream."
 msgstr "Branch %s kann nicht sein eigener Upstream-Branch sein."
 
-#: branch.c:82
+#: branch.c:83
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr ""
 "Branch %s konfiguriert zum Folgen von Remote-Branch %s von %s durch Rebase."
 
-#: branch.c:83
+#: branch.c:84
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
 msgstr "Branch %s konfiguriert zum Folgen von Remote-Branch %s von %s."
 
-#: branch.c:87
+#: branch.c:88
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr "Branch %s konfiguriert zum Folgen von lokalem Branch %s durch Rebase."
 
-#: branch.c:88
+#: branch.c:89
 #, c-format
 msgid "Branch %s set up to track local branch %s."
 msgstr "Branch %s konfiguriert zum Folgen von lokalem Branch %s."
 
-#: branch.c:92
+#: branch.c:94
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr "Branch %s konfiguriert zum Folgen von Remote-Referenz %s durch Rebase."
 
-#: branch.c:93
+#: branch.c:95
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
 msgstr "Branch %s konfiguriert zum Folgen von Remote-Referenz %s."
 
-#: branch.c:97
+#: branch.c:99
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
 "Branch %s konfiguriert zum Folgen von lokaler Referenz %s durch Rebase."
 
-#: branch.c:98
+#: branch.c:100
 #, c-format
 msgid "Branch %s set up to track local ref %s."
 msgstr "Branch %s konfiguriert zum Folgen von lokaler Referenz %s."
 
-#: branch.c:118
-#, c-format
-msgid "Tracking not set up: name too long: %s"
-msgstr ""
-"Konfiguration zum Folgen von Branch nicht eingerichtet. Name zu lang: %s"
-
-#: branch.c:137
+#: branch.c:133
 #, c-format
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr ""
 "Konfiguration zum Folgen von Branch nicht eingerichtet. Referenz %s ist "
 "mehrdeutig."
 
-#: branch.c:182
+#: branch.c:178
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "'%s' ist kein gültiger Branchname."
 
-#: branch.c:187
+#: branch.c:183
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "Branch '%s' existiert bereits."
 
-#: branch.c:195
+#: branch.c:191
 msgid "Cannot force update the current branch."
 msgstr "Kann Aktualisierung des aktuellen Branches nicht erzwingen."
 
-#: branch.c:215
+#: branch.c:211
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr ""
 "Kann Tracking-Informationen nicht einrichten; Startpunkt '%s' ist kein "
 "Branch."
 
-#: branch.c:217
+#: branch.c:213
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "der angeforderte Upstream-Branch '%s' existiert nicht"
 
-#: branch.c:219
+#: branch.c:215
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -245,113 +235,113 @@ msgstr ""
 "\"git push -u\" verwenden, um den Upstream-Branch beim \"push\"\n"
 "zu konfigurieren."
 
-#: branch.c:264
+#: branch.c:260
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "Ungültiger Objekt-Name: '%s'"
 
-#: branch.c:284
+#: branch.c:280
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "mehrdeutiger Objekt-Name: '%s'"
 
-#: branch.c:289
+#: branch.c:285
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "Ungültiger Branchpunkt: '%s'"
 
-#: branch.c:295
+#: branch.c:291
 msgid "Failed to lock ref for update"
 msgstr "Fehler beim Sperren der Referenz zur Aktualisierung."
 
-#: branch.c:313
+#: branch.c:309
 msgid "Failed to write ref"
 msgstr "Fehler beim Schreiben der Referenz."
 
-#: bundle.c:37
+#: bundle.c:33
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
 msgstr "'%s' sieht nicht wie eine v2 Paketdatei aus"
 
-#: bundle.c:64
+#: bundle.c:60
 #, c-format
 msgid "unrecognized header: %s%s (%d)"
 msgstr "nicht erkannter Kopfbereich: %s%s (%d)"
 
-#: bundle.c:90 builtin/commit.c:706
+#: bundle.c:86 builtin/commit.c:706
 #, c-format
 msgid "could not open '%s'"
 msgstr "Konnte '%s' nicht öffnen"
 
-#: bundle.c:141
+#: bundle.c:138
 msgid "Repository lacks these prerequisite commits:"
 msgstr "Dem Repository fehlen folgende vorausgesetzte Commits:"
 
-#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332
+#: 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
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "Einrichtung des Revisionsgangs fehlgeschlagen"
 
-#: bundle.c:187
+#: bundle.c:184
 #, c-format
 msgid "The bundle contains this ref:"
 msgid_plural "The bundle contains these %d refs:"
 msgstr[0] "Das Paket enthält diese Referenz:"
 msgstr[1] "Das Paket enthält diese %d Referenzen:"
 
-#: bundle.c:194
+#: bundle.c:191
 msgid "The bundle records a complete history."
 msgstr "Das Paket speichert eine komplette Historie."
 
-#: bundle.c:196
+#: bundle.c:193
 #, c-format
 msgid "The bundle requires this ref:"
 msgid_plural "The bundle requires these %d refs:"
 msgstr[0] "Das Paket benötigt diese Referenz:"
 msgstr[1] "Das Paket benötigt diese %d Referenzen:"
 
-#: bundle.c:296
+#: bundle.c:293
 msgid "rev-list died"
 msgstr "\"rev-list\" abgebrochen"
 
-#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "nicht erkanntes Argument: %s"
 
-#: bundle.c:337
+#: bundle.c:334
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "Referenz '%s' wird durch \"rev-list\" Optionen ausgeschlossen"
 
-#: bundle.c:382
+#: bundle.c:379
 msgid "Refusing to create empty bundle."
 msgstr "Erstellung eines leeren Pakets zurückgewiesen."
 
-#: bundle.c:398
+#: bundle.c:395
 msgid "Could not spawn pack-objects"
 msgstr "Konnte Paketobjekte nicht erstellen"
 
-#: bundle.c:416
+#: bundle.c:413
 msgid "pack-objects died"
 msgstr "Erstellung der Paketobjekte abgebrochen"
 
-#: bundle.c:419
+#: bundle.c:416
 #, c-format
 msgid "cannot create '%s'"
 msgstr "kann '%s' nicht erstellen"
 
-#: bundle.c:441
+#: bundle.c:438
 msgid "index-pack died"
 msgstr "Erstellung der Paketindexdatei abgebrochen"
 
-#: commit.c:53
+#: commit.c:54
 #, c-format
 msgid "could not parse %s"
 msgstr "konnte %s nicht parsen"
 
-#: commit.c:55
+#: commit.c:56
 #, c-format
 msgid "%s %s is not a commit!"
 msgstr "%s %s ist kein Commit!"
@@ -427,6 +417,7 @@ msgid_plural "%lu years"
 msgstr[0] "vor %lu Jahr"
 msgstr[1] "vor %lu Jahren"
 
+#. TRANSLATORS: "%s" is "<n> years"
 #: date.c:149
 #, c-format
 msgid "%s, %lu month ago"
@@ -446,6 +437,10 @@ msgstr[1] "vor %lu Jahren"
 msgid "failed to read orderfile '%s'"
 msgstr "Fehler beim Lesen der Reihenfolgedatei '%s'."
 
+#: diffcore-rename.c:517
+msgid "Performing inexact rename detection"
+msgstr "Führe Erkennung für ungenaue Umbenennung aus"
+
 #: diff.c:113
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
@@ -471,7 +466,7 @@ msgstr ""
 "Fehler in 'diff.dirstat' Konfigurationsvariable gefunden:\n"
 "%s"
 
-#: diff.c:3509
+#: diff.c:3495
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -480,7 +475,7 @@ msgstr ""
 "Fehler beim Parsen des --dirstat/-X Optionsparameters:\n"
 "%s"
 
-#: diff.c:3523
+#: diff.c:3509
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Fehler beim Parsen des --submodule Optionsparameters: '%s'"
@@ -507,35 +502,35 @@ msgstr "konnte temporäre Datei '%s' nicht erstellen: %s"
 msgid "failed writing detached signature to '%s': %s"
 msgstr "Fehler beim Schreiben der Signatur nach '%s': %s"
 
-#: grep.c:1695
+#: grep.c:1698
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "'%s': konnte nicht lesen %s"
 
-#: grep.c:1712
+#: grep.c:1715
 #, c-format
 msgid "'%s': %s"
 msgstr "'%s': %s"
 
-#: grep.c:1723
+#: grep.c:1726
 #, c-format
 msgid "'%s': short read %s"
 msgstr "'%s': read() zu kurz %s"
 
-#: help.c:210
+#: help.c:209
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "Vorhandene Git-Kommandos in '%s'"
 
-#: help.c:217
+#: help.c:216
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "Vorhandene Git-Kommandos irgendwo in Ihrem $PATH"
 
-#: help.c:233
+#: help.c:232
 msgid "The most commonly used git commands are:"
 msgstr "Die allgemein verwendeten Git-Kommandos sind:"
 
-#: help.c:290
+#: help.c:289
 #, c-format
 msgid ""
 "'%s' appears to be a git command, but we were not\n"
@@ -544,30 +539,30 @@ msgstr ""
 "'%s' scheint ein git-Kommando zu sein, konnte aber\n"
 "nicht ausgeführt werden. Vielleicht ist git-%s fehlerhaft?"
 
-#: help.c:347
+#: help.c:346
 msgid "Uh oh. Your system reports no Git commands at all."
 msgstr "Uh oh. Keine Git-Kommandos auf Ihrem System vorhanden."
 
-#: help.c:369
+#: 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 ""
 "Warnung: Sie haben das nicht existierende Git-Kommando '%s' ausgeführt.\n"
-"Setze fort unter der Annahme, dass Sie '%s' gemeint haben"
+"Setze fort unter der Annahme, dass Sie '%s' gemeint haben."
 
-#: help.c:374
+#: help.c:373
 #, c-format
 msgid "in %0.1f seconds automatically..."
-msgstr "automatisch in %0.1f Sekunden..."
+msgstr "Automatische Ausführung in %0.1f Sekunden..."
 
-#: help.c:381
+#: help.c:380
 #, c-format
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git: '%s' ist kein Git-Kommando. Siehe 'git --help'."
 
-#: help.c:385 help.c:444
+#: help.c:384 help.c:443
 msgid ""
 "\n"
 "Did you mean this?"
@@ -581,7 +576,7 @@ msgstr[1] ""
 "\n"
 "Haben Sie eines von diesen gemeint?"
 
-#: help.c:440
+#: help.c:439
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %s - %s"
@@ -590,7 +585,7 @@ msgstr "%s: %s - %s"
 msgid "failed to read the cache"
 msgstr "Lesen des Zwischenspeichers fehlgeschlagen"
 
-#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559
+#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
 #: builtin/clone.c:661
 msgid "unable to write new index file"
 msgstr "Konnte neue Staging-Area-Datei nicht schreiben."
@@ -600,75 +595,73 @@ msgstr "Konnte neue Staging-Area-Datei nicht schreiben."
 msgid "(bad commit)\n"
 msgstr "(ungültiger Commit)\n"
 
-#: merge-recursive.c:206
+#: merge-recursive.c:208
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "addinfo_cache für Pfad '%s' fehlgeschlagen"
 
-#: merge-recursive.c:269
+#: merge-recursive.c:271
 msgid "error building trees"
 msgstr "Fehler beim Erstellen der \"Tree\"-Objekte"
 
-#: merge-recursive.c:673
+#: merge-recursive.c:675
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "Fehler beim Erstellen des Pfades '%s'%s"
 
-#: merge-recursive.c:684
+#: merge-recursive.c:686
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Entferne %s um Platz für Unterverzeichnis zu schaffen\n"
 
-#. something else exists
-#. .. but not some other error (who really cares what?)
-#: merge-recursive.c:698 merge-recursive.c:719
+#: merge-recursive.c:700 merge-recursive.c:721
 msgid ": perhaps a D/F conflict?"
 msgstr ": vielleicht ein Verzeichnis/Datei-Konflikt?"
 
-#: merge-recursive.c:709
+#: merge-recursive.c:711
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "verweigere, da unbeobachtete Dateien in '%s' verloren gehen würden"
 
-#: merge-recursive.c:749
+#: merge-recursive.c:751
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "kann Objekt %s '%s' nicht lesen"
 
-#: merge-recursive.c:751
+#: merge-recursive.c:753
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "Blob erwartet für %s '%s'"
 
-#: merge-recursive.c:774 builtin/clone.c:317
+#: merge-recursive.c:776 builtin/clone.c:317
 #, c-format
 msgid "failed to open '%s'"
 msgstr "Fehler beim Öffnen von '%s'"
 
-#: merge-recursive.c:782
+#: merge-recursive.c:784
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "Fehler beim Erstellen eines symbolischen Verweises für '%s'"
 
-#: merge-recursive.c:785
+#: merge-recursive.c:787
 #, 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:923
+#: merge-recursive.c:925
 msgid "Failed to execute internal merge"
 msgstr "Fehler bei Ausführung des internen Merges"
 
-#: merge-recursive.c:927
+#: merge-recursive.c:929
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Konnte %s nicht zur Datenbank hinzufügen"
 
-#: merge-recursive.c:943
+#: merge-recursive.c:945
 msgid "unsupported object type in the tree"
 msgstr "nicht unterstützter Objekttyp im Verzeichnis"
 
-#: merge-recursive.c:1022 merge-recursive.c:1036
+#: merge-recursive.c:1024 merge-recursive.c:1038
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -677,7 +670,7 @@ msgstr ""
 "KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde "
 "im Arbeitsbereich gelassen."
 
-#: merge-recursive.c:1028 merge-recursive.c:1041
+#: merge-recursive.c:1030 merge-recursive.c:1043
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -686,20 +679,20 @@ msgstr ""
 "KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde "
 "im Arbeitsbereich bei %s gelassen."
 
-#: merge-recursive.c:1082
+#: merge-recursive.c:1084
 msgid "rename"
 msgstr "umbenennen"
 
-#: merge-recursive.c:1082 wt-status.c:283
+#: merge-recursive.c:1084
 msgid "renamed"
 msgstr "umbenannt"
 
-#: merge-recursive.c:1138
+#: merge-recursive.c:1140
 #, 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:1160
+#: merge-recursive.c:1162
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -708,148 +701,148 @@ msgstr ""
 "KONFLIKT (umbenennen/umbenennen): Benenne um \"%s\"->\"%s\" in Branch \"%s\" "
 "und \"%s\"->\"%s\" in Branch \"%s\"%s"
 
-#: merge-recursive.c:1165
+#: merge-recursive.c:1167
 msgid " (left unresolved)"
 msgstr " (bleibt unaufgelöst)"
 
-#: merge-recursive.c:1219
+#: merge-recursive.c:1221
 #, 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:1249
+#: merge-recursive.c:1251
 #, 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:1448
+#: merge-recursive.c:1450
 #, 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:1458
+#: merge-recursive.c:1460
 #, c-format
 msgid "Adding merged %s"
 msgstr "Füge zusammengeführte Datei %s hinzu"
 
-#: merge-recursive.c:1463 merge-recursive.c:1661
+#: merge-recursive.c:1465 merge-recursive.c:1663
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Füge stattdessen als %s hinzu"
 
-#: merge-recursive.c:1514
+#: merge-recursive.c:1516
 #, c-format
 msgid "cannot read object %s"
 msgstr "kann Objekt %s nicht lesen"
 
-#: merge-recursive.c:1517
+#: merge-recursive.c:1519
 #, c-format
 msgid "object %s is not a blob"
 msgstr "Objekt %s ist kein Blob"
 
-#: merge-recursive.c:1565
+#: merge-recursive.c:1567
 msgid "modify"
 msgstr "ändern"
 
-#: merge-recursive.c:1565 wt-status.c:281
+#: merge-recursive.c:1567
 msgid "modified"
 msgstr "geändert"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1577
 msgid "content"
 msgstr "Inhalt"
 
-#: merge-recursive.c:1582
+#: merge-recursive.c:1584
 msgid "add/add"
 msgstr "hinzufügen/hinzufügen"
 
-#: merge-recursive.c:1616
+#: merge-recursive.c:1618
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "%s ausgelassen (Ergebnis des Merges existiert bereits)"
 
-#: merge-recursive.c:1630
+#: merge-recursive.c:1632
 #, c-format
 msgid "Auto-merging %s"
 msgstr "automatischer Merge von %s"
 
-#: merge-recursive.c:1634 git-submodule.sh:1148
+#: merge-recursive.c:1636 git-submodule.sh:1149
 msgid "submodule"
 msgstr "Submodul"
 
-#: merge-recursive.c:1635
+#: merge-recursive.c:1637
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "KONFLIKT (%s): Merge-Konflikt in %s"
 
-#: merge-recursive.c:1725
+#: merge-recursive.c:1727
 #, c-format
 msgid "Removing %s"
 msgstr "Entferne %s"
 
-#: merge-recursive.c:1750
+#: merge-recursive.c:1752
 msgid "file/directory"
 msgstr "Datei/Verzeichnis"
 
-#: merge-recursive.c:1756
+#: merge-recursive.c:1758
 msgid "directory/file"
 msgstr "Verzeichnis/Datei"
 
-#: merge-recursive.c:1761
+#: merge-recursive.c:1763
 #, 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:1771
+#: merge-recursive.c:1773
 #, c-format
 msgid "Adding %s"
 msgstr "Füge %s hinzu"
 
-#: merge-recursive.c:1788
+#: merge-recursive.c:1790
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Fataler Merge-Fehler. Sollte nicht passieren."
 
-#: merge-recursive.c:1807
+#: merge-recursive.c:1809
 msgid "Already up-to-date!"
 msgstr "Bereits aktuell!"
 
-#: merge-recursive.c:1816
+#: merge-recursive.c:1818
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "Zusammenführen der \"Tree\"-Objekte %s und %s fehlgeschlagen"
 
-#: merge-recursive.c:1846
+#: merge-recursive.c:1848
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "unverarbeiteter Pfad??? %s"
 
-#: merge-recursive.c:1891
+#: merge-recursive.c:1893
 msgid "Merging:"
 msgstr "Merge:"
 
-#: merge-recursive.c:1904
+#: merge-recursive.c:1906
 #, 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:1941
+#: merge-recursive.c:1943
 msgid "merge returned no commit"
 msgstr "Merge hat keinen Commit zurückgegeben"
 
-#: merge-recursive.c:1998
+#: merge-recursive.c:2000
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: merge-recursive.c:2010 builtin/merge.c:665
+#: merge-recursive.c:2012 builtin/merge.c:668
 msgid "Unable to write index."
 msgstr "Konnte Staging-Area nicht schreiben."
 
@@ -876,33 +869,33 @@ msgstr ""
 msgid "Bad %s value: '%s'"
 msgstr "Ungültiger %s Wert: '%s'"
 
-#: object.c:202
+#: object.c:229
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: parse-options.c:537
+#: parse-options.c:532
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:555
+#: parse-options.c:550
 #, c-format
 msgid "usage: %s"
 msgstr "Verwendung: %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:559
+#: parse-options.c:554
 #, c-format
 msgid "   or: %s"
 msgstr "      oder: %s"
 
-#: parse-options.c:562
+#: parse-options.c:557
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:596
+#: parse-options.c:591
 msgid "-NUM"
 msgstr "-NUM"
 
@@ -954,11 +947,6 @@ msgstr "%s: '%s' liegt außerhalb des Repositories"
 msgid "Pathspec '%s' is in submodule '%.*s'"
 msgstr "Pfadspezifikation '%s' befindet sich in Submodul '%.*s'"
 
-#.
-#. * We may want to substitute "this command" with a command
-#. * name. E.g. when add--interactive dies when running
-#. * "checkout -p"
-#.
 #: pathspec.c:353
 #, c-format
 msgid "%s: pathspec magic not supported by this command: %s"
@@ -978,56 +966,73 @@ msgstr ""
 ":(exclude) Muster, aber keine anderen Pfadspezifikationen angegeben.\n"
 "Vielleicht haben Sie vergessen entweder ':/' oder '.' hinzuzufügen?"
 
-#: remote.c:753
+#: progress.c:224
+msgid "done"
+msgstr "Fertig"
+
+#: read-cache.c:1238
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"index.version gesetzt, aber Wert ungültig.\n"
+"Verwende Version %i"
+
+#: read-cache.c:1248
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"GIT_INDEX_VERSION gesetzt, aber Wert ungültig.\n"
+"Verwende Version %i"
+
+#: remote.c:758
 #, 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:757
+#: remote.c:762
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s folgt üblicherweise %s, nicht %s"
 
-#: remote.c:761
+#: remote.c:766
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s folgt sowohl %s als auch %s"
 
-#.
-#. * This last possibility doesn't occur because
-#. * FETCH_HEAD_IGNORE entries always appear at
-#. * the end of the list.
-#.
-#: remote.c:769
+#: remote.c:774
 msgid "Internal error"
 msgstr "Interner Fehler"
 
-#: remote.c:1871
+#: remote.c:1948
 #, 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:1875
+#: remote.c:1952
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (benutzen Sie \"git branch --unset-upstream\" zum Beheben)\n"
 
-#: remote.c:1878
+#: remote.c:1955
 #, 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:1882
+#: remote.c:1959
 #, 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:1888
+#: remote.c:1965
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (benutzen Sie \"git push\" um lokale Commits zu publizieren)\n"
 
-#: remote.c:1891
+#: remote.c:1968
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1037,12 +1042,12 @@ msgstr[0] ""
 msgstr[1] ""
 "Ihr Branch ist zu '%s' um %d Commits hinterher, und kann vorgespult werden.\n"
 
-#: remote.c:1899
+#: remote.c:1976
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr ""
 "  (benutzen Sie \"git pull\" um Ihren lokalen Branch zu aktualisieren)\n"
 
-#: remote.c:1902
+#: remote.c:1979
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1057,7 +1062,7 @@ msgstr[1] ""
 "Ihr Branch und '%s' sind divergiert,\n"
 "und haben jeweils %d und %d unterschiedliche Commits.\n"
 
-#: remote.c:1912
+#: remote.c:1989
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr ""
 "  (benutzen Sie \"git pull\" um Ihren Branch mit dem Remote-Branch "
@@ -1072,14 +1077,14 @@ msgstr "Öffnen von /dev/null fehlgeschlagen"
 msgid "dup2(%d,%d) failed"
 msgstr "dup2(%d,%d) fehlgeschlagen"
 
-#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896
-#: builtin/merge.c:1006 builtin/merge.c:1016
+#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
+#: builtin/merge.c:1009 builtin/merge.c:1019
 #, 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:786
-#: builtin/merge.c:1008 builtin/merge.c:1021
+#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
+#: builtin/merge.c:1011 builtin/merge.c:1024
 #, c-format
 msgid "Could not write to '%s'"
 msgstr "Konnte nicht nach '%s' schreiben."
@@ -1102,7 +1107,7 @@ msgstr ""
 "mit 'git add <Pfade>' oder 'git rm <Pfade>'und tragen Sie das Ergebnis mit\n"
 "'git commit' ein"
 
-#: sequencer.c:245 sequencer.c:870 sequencer.c:953
+#: sequencer.c:245 sequencer.c:879 sequencer.c:962
 #, c-format
 msgid "Could not write to %s"
 msgstr "Konnte nicht nach %s schreiben"
@@ -1140,184 +1145,184 @@ msgstr "Konnte Commit von HEAD nicht auflösen\n"
 msgid "Unable to update cache tree\n"
 msgstr "Konnte Cache-Verzeichnis nicht aktualisieren\n"
 
-#: sequencer.c:423
+#: sequencer.c:430
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr "Konnte Commit %s nicht parsen\n"
 
-#: sequencer.c:428
+#: sequencer.c:435
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr "Konnte Eltern-Commit %s nicht parsen\n"
 
-#: sequencer.c:494
+#: sequencer.c:501
 msgid "Your index file is unmerged."
 msgstr "Ihre Staging-Area-Datei ist nicht zusammengeführt."
 
-#: sequencer.c:513
+#: sequencer.c:520
 #, 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:521
+#: sequencer.c:528
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr "Commit %s hat keinen Elternteil %d"
 
-#: sequencer.c:525
+#: sequencer.c:532
 #, 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:538
+#: sequencer.c:545
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s: kann Eltern-Commit %s nicht parsen"
 
-#: sequencer.c:542
+#: sequencer.c:549
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr "Kann keine Commit-Beschreibung für %s bekommen"
 
-#: sequencer.c:628
+#: sequencer.c:635
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "Konnte \"revert\" nicht auf %s ausführen... %s"
 
-#: sequencer.c:629
+#: sequencer.c:636
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "Konnte %s nicht anwenden... %s"
 
-#: sequencer.c:665
+#: sequencer.c:672
 msgid "empty commit set passed"
 msgstr "leere Menge von Commits übergeben"
 
-#: sequencer.c:673
+#: sequencer.c:680
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s: Fehler beim Lesen der Staging-Area"
 
-#: sequencer.c:678
+#: sequencer.c:685
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s: Fehler beim Aktualisieren der Staging-Area"
 
-#: sequencer.c:736
+#: sequencer.c:743
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr "Kann %s nicht während eines %s durchführen"
 
-#: sequencer.c:758
+#: sequencer.c:765
 #, c-format
 msgid "Could not parse line %d."
 msgstr "Konnte Zeile %d nicht parsen."
 
-#: sequencer.c:763
+#: sequencer.c:770
 msgid "No commits parsed."
 msgstr "Keine Commits geparst."
 
-#: sequencer.c:776
+#: sequencer.c:783
 #, c-format
 msgid "Could not open %s"
 msgstr "Konnte %s nicht öffnen"
 
-#: sequencer.c:780
+#: sequencer.c:787
 #, c-format
 msgid "Could not read %s."
 msgstr "Konnte %s nicht lesen."
 
-#: sequencer.c:787
+#: sequencer.c:794
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr "Unbenutzbares Instruktionsblatt: %s"
 
-#: sequencer.c:815
+#: sequencer.c:824
 #, c-format
 msgid "Invalid key: %s"
 msgstr "Ungültiger Schlüssel: %s"
 
-#: sequencer.c:818
+#: sequencer.c:827
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr "Ungültiger Wert für %s: %s"
 
-#: sequencer.c:830
+#: sequencer.c:839
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr "Fehlerhaftes Optionsblatt: %s"
 
-#: sequencer.c:851
+#: sequencer.c:860
 msgid "a cherry-pick or revert is already in progress"
 msgstr "\"cherry-pick\" oder \"revert\" ist bereits im Gang"
 
-#: sequencer.c:852
+#: sequencer.c:861
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr "versuchen Sie \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: sequencer.c:856
+#: sequencer.c:865
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr "Konnte \"sequencer\"-Verzeichnis %s nicht erstellen"
 
-#: sequencer.c:872 sequencer.c:957
+#: sequencer.c:881 sequencer.c:966
 #, c-format
 msgid "Error wrapping up %s."
 msgstr "Fehler beim Einpacken von %s."
 
-#: sequencer.c:891 sequencer.c:1025
+#: sequencer.c:900 sequencer.c:1036
 msgid "no cherry-pick or revert in progress"
 msgstr "kein \"cherry-pick\" oder \"revert\" im Gang"
 
-#: sequencer.c:893
+#: sequencer.c:902
 msgid "cannot resolve HEAD"
 msgstr "kann HEAD nicht auflösen"
 
-#: sequencer.c:895
+#: sequencer.c:904
 msgid "cannot abort from a branch yet to be born"
 msgstr "kann nicht abbrechen: bin auf einem Branch, der noch geboren wird"
 
-#: sequencer.c:917 builtin/apply.c:4061
+#: sequencer.c:926 builtin/apply.c:4061
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "Kann %s nicht öffnen: %s"
 
-#: sequencer.c:920
+#: sequencer.c:929
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "Kann %s nicht lesen: %s"
 
-#: sequencer.c:921
+#: sequencer.c:930
 msgid "unexpected end of file"
 msgstr "Unerwartetes Dateiende"
 
-#: sequencer.c:927
+#: sequencer.c:936
 #, 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:950
+#: sequencer.c:959
 #, c-format
 msgid "Could not format %s."
 msgstr "Konnte %s nicht formatieren."
 
-#: sequencer.c:1093
+#: sequencer.c:1104
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr "%s: %s kann nicht in \"cherry-pick\" benutzt werden"
 
-#: sequencer.c:1096
+#: sequencer.c:1107
 #, c-format
 msgid "%s: bad revision"
 msgstr "%s: ungültiger Commit"
 
-#: sequencer.c:1130
+#: sequencer.c:1141
 msgid "Can't revert as initial commit"
 msgstr "Kann nicht als allerersten Commit einen Revert ausführen."
 
-#: sequencer.c:1131
+#: sequencer.c:1142
 msgid "Can't cherry-pick into empty head"
 msgstr "Kann nicht als allerersten Commit einen Cherry-Pick ausführen."
 
@@ -1346,21 +1351,21 @@ msgstr ""
 "indem Sie \"git config advice.objectNameWarning false\"\n"
 "ausführen."
 
-#: sha1_name.c:1070
+#: sha1_name.c:1072
 msgid "HEAD does not point to a branch"
 msgstr "HEAD zeigt auf keinen Branch"
 
-#: sha1_name.c:1073
+#: sha1_name.c:1075
 #, c-format
 msgid "No such branch: '%s'"
 msgstr "Kein solcher Branch '%s'"
 
-#: sha1_name.c:1075
+#: sha1_name.c:1077
 #, c-format
 msgid "No upstream configured for branch '%s'"
 msgstr "Kein Upstream-Branch für Branch '%s' konfiguriert."
 
-#: sha1_name.c:1079
+#: sha1_name.c:1081
 #, c-format
 msgid "Upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "Upstream-Branch '%s' ist nicht als Remote-Tracking-Branch gespeichert"
@@ -1376,52 +1381,34 @@ msgstr ""
 msgid "Could not find section in .gitmodules where path=%s"
 msgstr "Konnte keine Sektion in .gitmodules mit Pfad \"%s\" finden"
 
-#. Maybe the user already did that, don't error out here
 #: submodule.c:76
 #, c-format
 msgid "Could not update .gitmodules entry %s"
 msgstr "Konnte Eintrag '%s' in .gitmodules nicht aktualisieren"
 
-#. Maybe the user already did that, don't error out here
 #: submodule.c:109
 #, c-format
 msgid "Could not remove .gitmodules entry for %s"
 msgstr "Konnte Eintrag '%s' nicht aus .gitmodules entfernen"
 
-#: submodule.c:127
-msgid "could not find .gitmodules in index"
-msgstr "Konnte .gitmodules nicht in der Staging-Area finden"
-
-#: submodule.c:133
-msgid "reading updated .gitmodules failed"
-msgstr "Lesen der aktualisierten .gitmodules-Datei fehlgeschlagen"
-
-#: submodule.c:135
-msgid "unable to stat updated .gitmodules"
-msgstr "Konnte aktualisierte .gitmodules-Datei nicht lesen"
-
-#: submodule.c:139
-msgid "unable to remove .gitmodules from index"
-msgstr "Konnte .gitmodules nicht aus der Staging-Area entfernen"
-
-#: submodule.c:141
-msgid "adding updated .gitmodules failed"
-msgstr "Konnte aktualisierte .gitmodules-Datei nicht hinzufügen"
-
-#: submodule.c:143
+#: submodule.c:120
 msgid "staging updated .gitmodules failed"
 msgstr "Konnte aktualisierte .gitmodules-Datei nicht zum Commit vormerken"
 
-#: submodule.c:1144 builtin/init-db.c:363
+#: submodule.c:1121 builtin/init-db.c:363
 #, c-format
 msgid "Could not create git link %s"
 msgstr "Konnte git-Verweis %s nicht erstellen"
 
-#: submodule.c:1155
+#: submodule.c:1132
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "Konnte core.worktree in '%s' nicht setzen."
 
+#: unpack-trees.c:206
+msgid "Checking out files"
+msgstr "Checke Dateien aus"
+
 #: urlmatch.c:120
 msgid "invalid URL scheme name or missing '://' suffix"
 msgstr "Ungültiges URL-Schema oder Suffix '://' fehlt"
@@ -1543,88 +1530,97 @@ msgstr ""
 "  (benutzen Sie \"git %s <Datei>...\" um die Änderungen zum Commit "
 "vorzumerken)"
 
-#: wt-status.c:254
-msgid "bug"
-msgstr "Fehler"
-
-#: wt-status.c:259
+#: wt-status.c:252
 msgid "both deleted:"
 msgstr "beide gelöscht:"
 
-#: wt-status.c:260
+#: wt-status.c:254
 msgid "added by us:"
 msgstr "von uns hinzugefügt:"
 
-#: wt-status.c:261
+#: wt-status.c:256
 msgid "deleted by them:"
 msgstr "von denen gelöscht:"
 
-#: wt-status.c:262
+#: wt-status.c:258
 msgid "added by them:"
 msgstr "von denen hinzugefügt:"
 
-#: wt-status.c:263
+#: wt-status.c:260
 msgid "deleted by us:"
 msgstr "von uns gelöscht:"
 
-#: wt-status.c:264
+#: wt-status.c:262
 msgid "both added:"
 msgstr "von beiden hinzugefügt:"
 
-#: wt-status.c:265
+#: wt-status.c:264
 msgid "both modified:"
 msgstr "von beiden geändert:"
 
-#: wt-status.c:275
-msgid "new file"
-msgstr "neue Datei"
+#: wt-status.c:266
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr "Bug: unbehandelter Unmerged-Status %x"
 
-#: wt-status.c:277
-msgid "copied"
-msgstr "kopiert"
+#: wt-status.c:274
+msgid "new file:"
+msgstr "neue Datei:"
 
-#: wt-status.c:279
-msgid "deleted"
-msgstr "gelöscht"
+#: wt-status.c:276
+msgid "copied:"
+msgstr "kopiert:"
 
-#: wt-status.c:285
-msgid "typechange"
-msgstr "Typänderung"
+#: wt-status.c:278
+msgid "deleted:"
+msgstr "gelöscht:"
 
-#: wt-status.c:287
-msgid "unknown"
-msgstr "unbekannt"
+#: wt-status.c:280
+msgid "modified:"
+msgstr "geändert:"
 
-#: wt-status.c:289
-msgid "unmerged"
-msgstr "nicht zusammengeführt"
+#: wt-status.c:282
+msgid "renamed:"
+msgstr "umbenannt:"
 
-#: wt-status.c:336
+#: wt-status.c:284
+msgid "typechange:"
+msgstr "Typänderung:"
+
+#: wt-status.c:286
+msgid "unknown:"
+msgstr "unbekannt:"
+
+#: wt-status.c:288
+msgid "unmerged:"
+msgstr "nicht gemerged:"
+
+#: wt-status.c:370
 msgid "new commits, "
 msgstr "neue Commits, "
 
-#: wt-status.c:338
+#: wt-status.c:372
 msgid "modified content, "
 msgstr "geänderter Inhalt, "
 
-#: wt-status.c:340
+#: wt-status.c:374
 msgid "untracked content, "
 msgstr "unbeobachteter Inhalt, "
 
-#: wt-status.c:357
+#: wt-status.c:391
 #, c-format
 msgid "bug: unhandled diff status %c"
 msgstr "Fehler: unbehandelter Differenz-Status %c"
 
-#: wt-status.c:732
+#: wt-status.c:765
 msgid "Submodules changed but not updated:"
 msgstr "Submodule geändert, aber nicht aktualisiert:"
 
-#: wt-status.c:734
+#: wt-status.c:767
 msgid "Submodule changes to be committed:"
 msgstr "Änderungen in Submodul zum Committen:"
 
-#: wt-status.c:836
+#: wt-status.c:846
 msgid ""
 "Do not touch the line above.\n"
 "Everything below will be removed."
@@ -1632,75 +1628,75 @@ msgstr ""
 "Ändern Sie nicht die obige Zeile.\n"
 "Alles unterhalb von ihr wird entfernt."
 
-#: wt-status.c:899
+#: wt-status.c:937
 msgid "You have unmerged paths."
 msgstr "Sie haben nicht zusammengeführte Pfade."
 
-#: wt-status.c:902
+#: wt-status.c:940
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr " (beheben Sie die Konflikte und führen Sie \"git commit\" aus)"
 
-#: wt-status.c:905
+#: wt-status.c:943
 msgid "All conflicts fixed but you are still merging."
 msgstr "Alle Konflikte sind behoben, aber Sie sind immer noch beim Merge."
 
-#: wt-status.c:908
+#: wt-status.c:946
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr "  (benutzen Sie \"git commit\" um den Merge abzuschließen)"
 
-#: wt-status.c:918
+#: wt-status.c:956
 msgid "You are in the middle of an am session."
 msgstr "Eine \"am\"-Sitzung ist im Gange."
 
-#: wt-status.c:921
+#: wt-status.c:959
 msgid "The current patch is empty."
 msgstr "Der aktuelle Patch ist leer."
 
-#: wt-status.c:925
+#: wt-status.c:963
 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:927
+#: wt-status.c:965
 msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr "  (benutzen Sie \"git am --skip\" um diesen Patch auszulassen)"
 
-#: wt-status.c:929
+#: wt-status.c:967
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr ""
 "  (benutzen Sie \"git am --abort\" um den ursprünglichen Branch "
 "wiederherzustellen)"
 
-#: wt-status.c:989 wt-status.c:1006
+#: wt-status.c:1027 wt-status.c:1044
 #, 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:994 wt-status.c:1011
+#: wt-status.c:1032 wt-status.c:1049
 msgid "You are currently rebasing."
 msgstr "Sie sind gerade beim Rebase."
 
-#: wt-status.c:997
+#: wt-status.c:1035
 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:999
+#: wt-status.c:1037
 msgid "  (use \"git rebase --skip\" to skip this patch)"
 msgstr "  (benutzen Sie \"git rebase --skip\" um diesen Patch auszulassen)"
 
-#: wt-status.c:1001
+#: wt-status.c:1039
 msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr ""
 "  (benutzen Sie \"git rebase --abort\" um den ursprünglichen Branch "
 "auszuchecken)"
 
-#: wt-status.c:1014
+#: wt-status.c:1052
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr "  (alle Konflikte behoben: führen Sie \"git rebase --continue\" aus)"
 
-#: wt-status.c:1018
+#: wt-status.c:1056
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
@@ -1708,129 +1704,129 @@ msgstr ""
 "Sie teilen gerade einen Commit auf, während ein Rebase von Branch '%s' auf "
 "'%s' im Gange ist."
 
-#: wt-status.c:1023
+#: wt-status.c:1061
 msgid "You are currently splitting a commit during a rebase."
 msgstr "Sie teilen gerade einen Commit während eines Rebase auf."
 
-#: wt-status.c:1026
+#: wt-status.c:1064
 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:1030
+#: wt-status.c:1068
 #, 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:1035
+#: wt-status.c:1073
 msgid "You are currently editing a commit during a rebase."
 msgstr "Sie editieren gerade einen Commit während eines Rebase."
 
-#: wt-status.c:1038
+#: wt-status.c:1076
 msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr ""
 "  (benutzen Sie \"git commit --amend\" um den aktuellen Commit nachzubessern)"
 
-#: wt-status.c:1040
+#: wt-status.c:1078
 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:1050
+#: wt-status.c:1088
 #, c-format
 msgid "You are currently cherry-picking commit %s."
 msgstr "Sie führen gerade \"cherry-pick\" von Commit %s aus."
 
-#: wt-status.c:1055
+#: wt-status.c:1093
 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:1058
+#: wt-status.c:1096
 msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr ""
 "  (alle Konflikte behoben: führen Sie \"git cherry-pick --continue\" aus)"
 
-#: wt-status.c:1060
+#: wt-status.c:1098
 msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr ""
 "  (benutzen Sie \"git cherry-pick --abort\" um die Cherry-Pick-Operation "
 "abzubrechen)"
 
-#: wt-status.c:1069
+#: wt-status.c:1107
 #, c-format
 msgid "You are currently reverting commit %s."
 msgstr "Sie sind gerade an einem Revert von Commit '%s'."
 
-#: wt-status.c:1074
+#: wt-status.c:1112
 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:1077
+#: wt-status.c:1115
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr "  (alle Konflikte behoben: führen Sie \"git revert --continue\" aus)"
 
-#: wt-status.c:1079
+#: wt-status.c:1117
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr ""
 "  (benutzen Sie \"git revert --abort\" um die Revert-Operation abzubrechen)"
 
-#: wt-status.c:1090
+#: wt-status.c:1128
 #, 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:1094
+#: wt-status.c:1132
 msgid "You are currently bisecting."
 msgstr "Sie sind gerade bei einer binären Suche."
 
-#: wt-status.c:1097
+#: wt-status.c:1135
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr ""
 "  (benutzen Sie \"git bisect reset\" um zum ursprünglichen Branch "
 "zurückzukehren)"
 
-#: wt-status.c:1272
+#: wt-status.c:1310
 msgid "On branch "
 msgstr "Auf Branch "
 
-#: wt-status.c:1279
+#: wt-status.c:1317
 msgid "rebase in progress; onto "
 msgstr "Rebase im Gange; auf "
 
-#: wt-status.c:1286
+#: wt-status.c:1324
 msgid "HEAD detached at "
 msgstr "HEAD losgelöst bei "
 
-#: wt-status.c:1288
+#: wt-status.c:1326
 msgid "HEAD detached from "
 msgstr "HEAD losgelöst von "
 
-#: wt-status.c:1291
+#: wt-status.c:1329
 msgid "Not currently on any branch."
 msgstr "Im Moment auf keinem Branch."
 
-#: wt-status.c:1308
+#: wt-status.c:1346
 msgid "Initial commit"
 msgstr "Initialer Commit"
 
-#: wt-status.c:1322
+#: wt-status.c:1360
 msgid "Untracked files"
 msgstr "Unbeobachtete Dateien"
 
-#: wt-status.c:1324
+#: wt-status.c:1362
 msgid "Ignored files"
 msgstr "Ignorierte Dateien"
 
-#: wt-status.c:1328
+#: wt-status.c:1366
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1841,32 +1837,32 @@ msgstr ""
 "'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:1334
+#: wt-status.c:1372
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr "Unbeobachtete Dateien nicht aufgelistet%s"
 
-#: wt-status.c:1336
+#: wt-status.c:1374
 msgid " (use -u option to show untracked files)"
 msgstr " (benutzen Sie die Option -u um unbeobachteten Dateien anzuzeigen)"
 
-#: wt-status.c:1342
+#: wt-status.c:1380
 msgid "No changes"
 msgstr "Keine Änderungen"
 
-#: wt-status.c:1347
+#: wt-status.c:1385
 #, 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:1350
+#: wt-status.c:1388
 #, c-format
 msgid "no changes added to commit\n"
 msgstr "keine Änderungen zum Commit vorgemerkt\n"
 
-#: wt-status.c:1353
+#: wt-status.c:1391
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
@@ -1875,290 +1871,209 @@ msgstr ""
 "nichts zum Commit vorgemerkt, aber es gibt unbeobachtete Dateien (benutzen "
 "Sie \"git add\" zum Beobachten)\n"
 
-#: wt-status.c:1356
+#: wt-status.c:1394
 #, 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:1359
+#: wt-status.c:1397
 #, 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:1362 wt-status.c:1367
+#: wt-status.c:1400 wt-status.c:1405
 #, c-format
 msgid "nothing to commit\n"
 msgstr "nichts zu committen\n"
 
-#: wt-status.c:1365
+#: wt-status.c:1403
 #, 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:1369
+#: wt-status.c:1407
 #, c-format
 msgid "nothing to commit, working directory clean\n"
 msgstr "nichts zu committen, Arbeitsverzeichnis unverändert\n"
 
-#: wt-status.c:1478
+#: wt-status.c:1516
 msgid "HEAD (no branch)"
 msgstr "HEAD (kein Branch)"
 
-#: wt-status.c:1484
+#: wt-status.c:1522
 msgid "Initial commit on "
 msgstr "Initialer Commit auf "
 
-#: wt-status.c:1514
+#: wt-status.c:1554
 msgid "gone"
 msgstr "entfernt"
 
-#: wt-status.c:1516
+#: wt-status.c:1556 wt-status.c:1564
 msgid "behind "
 msgstr "hinterher "
 
-#: wt-status.c:1519 wt-status.c:1522
-msgid "ahead "
-msgstr "voraus "
-
-#: wt-status.c:1524
-msgid ", behind "
-msgstr ", hinterher "
-
 #: compat/precompose_utf8.c:55 builtin/clone.c:356
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "Konnte '%s' nicht entfernen."
 
-#: builtin/add.c:20
+#: builtin/add.c:21
 msgid "git add [options] [--] <pathspec>..."
 msgstr "git add [Optionen] [--] [<Pfadspezifikation>...]"
 
-#.
-#. * To be consistent with "git add -p" and most Git
-#. * commands, we should default to being tree-wide, but
-#. * this is not the original behavior and can't be
-#. * changed until users trained themselves not to type
-#. * "git add -u" or "git add -A". For now, we warn and
-#. * keep the old behavior. Later, the behavior can be changed
-#. * to tree-wide, keeping the warning for a while, and
-#. * eventually we can drop the warning.
-#.
-#: builtin/add.c:58
-#, c-format
-msgid ""
-"The behavior of 'git add %s (or %s)' with no path argument from a\n"
-"subdirectory of the tree will change in Git 2.0 and should not be used "
-"anymore.\n"
-"To add content for the whole tree, run:\n"
-"\n"
-"  git add %s :/\n"
-"  (or git add %s :/)\n"
-"\n"
-"To restrict the command to the current directory, run:\n"
-"\n"
-"  git add %s .\n"
-"  (or git add %s .)\n"
-"\n"
-"With the current Git version, the command is restricted to the current "
-"directory.\n"
-msgstr ""
-"Das Verhalten von 'git add %s (oder %s)' ohne ein Pfad-Argument von\n"
-"einem Unterverzeichnis aus wird in Git 2.0 geändert und sollte nicht\n"
-"mehr verwendet werden.\n"
-"Um Dateien des gesamten Projektverzeichnisses hinzuzufügen, führen Sie aus:\n"
-"\n"
-"  git add %s :/\n"
-"  (oder git add %s :/)\n"
-"\n"
-"Zur Einschränkung auf das aktuelle Verzeichnis führen Sie aus:\n"
-"\n"
-"  git add %s .\n"
-"  (oder git add %s .)\n"
-"\n"
-"Mit der aktuellen Version von Git ist das Kommando auf das aktuelle\n"
-"Verzeichnis beschränkt.\n"
-
-#: builtin/add.c:100
-#, c-format
-msgid ""
-"You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
-"whose behaviour will change in Git 2.0 with respect to paths you removed.\n"
-"Paths like '%s' that are\n"
-"removed from your working tree are ignored with this version of Git.\n"
-"\n"
-"* 'git add --ignore-removal <pathspec>', which is the current default,\n"
-"  ignores paths you removed from your working tree.\n"
-"\n"
-"* 'git add --all <pathspec>' will let you also record the removals.\n"
-"\n"
-"Run 'git status' to check the paths you removed from your working tree.\n"
-msgstr ""
-"Sie haben 'git add' weder mit '-A (--all)' noch mit '--ignore-removal'\n"
-"ausgeführt. Das Verhalten des Kommandos ändert sich in Git 2.0 durch\n"
-"Berücksichtigung der gelöschten Pfade.\n"
-"Pfade wie '%s', die im Arbeitsverzeichnis gelöscht wurden, werden in\n"
-"dieser Version von Git ignoriert.\n"
-"\n"
-"* 'git add --ignore-removal <Pfadspezifikation>', was der aktuelle\n"
-"  Standardwert ist, ignoriert gelöschte Pfade im Arbeitsverzeichnis.\n"
-"* 'git add --all <Pfadspezifikation>' berücksichtigt ebenfalls gelöschte\n"
-"  Pfade.\n"
-"Führen Sie 'git status' aus, um die gelöschten Pfade zu überprüfen.\n"
-
-#: builtin/add.c:144
+#: builtin/add.c:64
 #, c-format
 msgid "unexpected diff status %c"
 msgstr "unerwarteter Differenz-Status %c"
 
-#: builtin/add.c:149 builtin/commit.c:260
+#: builtin/add.c:69 builtin/commit.c:261
 msgid "updating files failed"
 msgstr "Aktualisierung der Dateien fehlgeschlagen"
 
-#: builtin/add.c:163
+#: builtin/add.c:79
 #, c-format
 msgid "remove '%s'\n"
 msgstr "lösche '%s'\n"
 
-#: builtin/add.c:237
+#: builtin/add.c:133
 msgid "Unstaged changes after refreshing the index:"
 msgstr ""
 "Nicht zum Commit vorgemerkte Änderungen nach Aktualisierung der Staging-Area:"
 
-#: builtin/add.c:299
+#: builtin/add.c:193
 msgid "Could not read the index"
 msgstr "Konnte die Staging-Area nicht lesen"
 
-#: builtin/add.c:310
+#: builtin/add.c:204
 #, c-format
 msgid "Could not open '%s' for writing."
 msgstr "Konnte '%s' nicht zum Schreiben öffnen."
 
-#: builtin/add.c:314
+#: builtin/add.c:208
 msgid "Could not write patch"
 msgstr "Konnte Patch nicht schreiben"
 
-#: builtin/add.c:319
+#: builtin/add.c:213
 #, c-format
 msgid "Could not stat '%s'"
 msgstr "Konnte Verzeichnis '%s' nicht lesen"
 
-#: builtin/add.c:321
+#: builtin/add.c:215
 msgid "Empty patch. Aborted."
 msgstr "Leerer Patch. Abgebrochen."
 
-#: builtin/add.c:327
+#: builtin/add.c:221
 #, c-format
 msgid "Could not apply '%s'"
 msgstr "Konnte '%s' nicht anwenden."
 
-#: builtin/add.c:337
+#: builtin/add.c:231
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr ""
 "Die folgenden Pfade werden durch eine Ihrer \".gitignore\" Dateien "
 "ignoriert:\n"
 
-#: builtin/add.c:354 builtin/clean.c:875 builtin/fetch.c:93 builtin/mv.c:70
-#: builtin/prune-packed.c:77 builtin/push.c:506 builtin/remote.c:1344
+#: 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/rm.c:269
 msgid "dry run"
 msgstr "Probelauf"
 
-#: builtin/add.c:355 builtin/apply.c:4410 builtin/check-ignore.c:19
-#: builtin/commit.c:1249 builtin/count-objects.c:95 builtin/fsck.c:612
+#: 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
 msgid "be verbose"
 msgstr "erweiterte Ausgaben"
 
-#: builtin/add.c:357
+#: builtin/add.c:251
 msgid "interactive picking"
 msgstr "interaktives Auswählen"
 
-#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
 msgid "select hunks interactively"
 msgstr "Blöcke interaktiv auswählen"
 
-#: builtin/add.c:359
+#: builtin/add.c:253
 msgid "edit current diff and apply"
 msgstr "aktuelle Unterschiede editieren und anwenden"
 
-#: builtin/add.c:360
+#: builtin/add.c:254
 msgid "allow adding otherwise ignored files"
 msgstr "erlaubt das Hinzufügen andernfalls ignorierter Dateien"
 
-#: builtin/add.c:361
+#: builtin/add.c:255
 msgid "update tracked files"
 msgstr "aktualisiert beobachtete Dateien"
 
-#: builtin/add.c:362
+#: builtin/add.c:256
 msgid "record only the fact that the path will be added later"
 msgstr "speichert nur, dass der Pfad später hinzugefügt werden soll"
 
-#: builtin/add.c:363
+#: builtin/add.c:257
 msgid "add changes from all tracked and untracked files"
 msgstr ""
 "fügt Änderungen von allen beobachteten und unbeobachteten Dateien hinzu"
 
-#. takes no arguments
-#: builtin/add.c:366
+#: builtin/add.c:260
 msgid "ignore paths removed in the working tree (same as --no-all)"
 msgstr "ignoriert gelöschte Pfade im Arbeitsverzeichnis (genau wie --no-all)"
 
-#: builtin/add.c:368
+#: builtin/add.c:262
 msgid "don't add, only refresh the index"
 msgstr "fügt nichts hinzu, aktualisiert nur die Staging-Area"
 
-#: builtin/add.c:369
+#: builtin/add.c:263
 msgid "just skip files which cannot be added because of errors"
 msgstr ""
 "überspringt Dateien, die aufgrund von Fehlern nicht hinzugefügt werden "
 "konnten"
 
-#: builtin/add.c:370
+#: builtin/add.c:264
 msgid "check if - even missing - files are ignored in dry run"
 msgstr "prüft ob - auch fehlende - Dateien im Probelauf ignoriert werden"
 
-#: builtin/add.c:392
+#: builtin/add.c:286
 #, c-format
 msgid "Use -f if you really want to add them.\n"
 msgstr "Verwenden Sie -f wenn Sie diese wirklich hinzufügen möchten.\n"
 
-#: builtin/add.c:393
+#: builtin/add.c:287
 msgid "no files added"
 msgstr "keine Dateien hinzugefügt"
 
-#: builtin/add.c:399
+#: builtin/add.c:293
 msgid "adding files failed"
 msgstr "Hinzufügen von Dateien fehlgeschlagen"
 
-#: builtin/add.c:438
+#: builtin/add.c:330
 msgid "-A and -u are mutually incompatible"
 msgstr "Die Optionen -A und -u sind zueinander inkompatibel."
 
-#: builtin/add.c:456
+#: builtin/add.c:337
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr ""
 "Die Option --ignore-missing kann nur zusammen mit --dry-run verwendet werden."
 
-#: builtin/add.c:486
+#: builtin/add.c:358
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Nichts spezifiziert, nichts hinzugefügt.\n"
 
-#: builtin/add.c:487
+#: builtin/add.c:359
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "Wollten Sie vielleicht 'git add .' sagen?\n"
 
-#: builtin/add.c:492 builtin/check-ignore.c:172 builtin/clean.c:919
-#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:224 builtin/rm.c:299
+#: 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
 msgid "index file corrupt"
 msgstr "Staging-Area-Datei beschädigt"
 
-#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432
+#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
 msgid "Unable to write new index file"
 msgstr "Konnte neue Staging-Area-Datei nicht schreiben."
 
@@ -2273,7 +2188,6 @@ msgstr "** Warnung: Datei %s wird leer, aber nicht entfernt."
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "fehlerhafter Binär-Patch bei Zeile %d: %.*s"
 
-#. there has to be one hunk (forward hunk)
 #: builtin/apply.c:1900
 #, c-format
 msgid "unrecognized binary patch at line %d"
@@ -2416,7 +2330,7 @@ msgstr "%s: Patch konnte nicht angewendet werden"
 msgid "Checking patch %s..."
 msgstr "Prüfe Patch %s..."
 
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127
+#: 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 für Pfad '%s' fehlgeschlagen"
@@ -2465,7 +2379,6 @@ msgstr "Patch %s sauber angewendet"
 msgid "internal error"
 msgstr "interner Fehler"
 
-#. Say this even without --verbose
 #: builtin/apply.c:4043
 #, c-format
 msgid "Applying patch %%s with %d reject..."
@@ -2570,7 +2483,7 @@ 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:452
+#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
 msgid "paths are separated with NUL character"
 msgstr "Pfade sind getrennt durch NUL Zeichen"
 
@@ -2712,96 +2625,96 @@ msgstr "git blame [Optionen] [rev-opts] [rev] [--] Datei"
 msgid "[rev-opts] are documented in git-rev-list(1)"
 msgstr "[rev-opts] sind dokumentiert in git-rev-list(1)"
 
-#: builtin/blame.c:2249
+#: builtin/blame.c:2242
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Zeigt \"blame\"-Einträge schrittweise, während wir sie generieren"
 
-#: builtin/blame.c:2250
+#: builtin/blame.c:2243
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "Zeigt leere SHA-1 für Grenz-Commits (Standard: aus)"
 
-#: builtin/blame.c:2251
+#: builtin/blame.c:2244
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Behandelt Ursprungs-Commit nicht als Grenzen (Standard: aus)"
 
-#: builtin/blame.c:2252
+#: builtin/blame.c:2245
 msgid "Show work cost statistics"
 msgstr "Zeigt Statistiken zum Arbeitsaufwand"
 
-#: builtin/blame.c:2253
+#: builtin/blame.c:2246
 msgid "Show output score for blame entries"
 msgstr "Zeigt Ausgabebewertung für \"blame\"-Einträge"
 
-#: builtin/blame.c:2254
+#: builtin/blame.c:2247
 msgid "Show original filename (Default: auto)"
 msgstr "Zeigt ursprünglichen Dateinamen (Standard: auto)"
 
-#: builtin/blame.c:2255
+#: builtin/blame.c:2248
 msgid "Show original linenumber (Default: off)"
 msgstr "Zeigt ursprüngliche Zeilennummer (Standard: aus)"
 
-#: builtin/blame.c:2256
+#: builtin/blame.c:2249
 msgid "Show in a format designed for machine consumption"
 msgstr "Anzeige in einem Format für maschinelle Auswertung"
 
-#: builtin/blame.c:2257
+#: builtin/blame.c:2250
 msgid "Show porcelain format with per-line commit information"
 msgstr ""
 "Anzeige in Format für Fremdprogramme mit Commit-Informationen pro Zeile"
 
-#: builtin/blame.c:2258
+#: builtin/blame.c:2251
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "Benutzt den gleichen Ausgabemodus wie \"git-annotate\" (Standard: aus)"
 
-#: builtin/blame.c:2259
+#: builtin/blame.c:2252
 msgid "Show raw timestamp (Default: off)"
 msgstr "Zeigt unbearbeiteten Zeitstempel (Standard: aus)"
 
-#: builtin/blame.c:2260
+#: builtin/blame.c:2253
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Zeigt langen Commit-SHA1 (Standard: aus)"
 
-#: builtin/blame.c:2261
+#: builtin/blame.c:2254
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Unterdrückt den Namen des Autors und den Zeitstempel (Standard: aus)"
 
-#: builtin/blame.c:2262
+#: builtin/blame.c:2255
 msgid "Show author email instead of name (Default: off)"
 msgstr "Zeigt anstatt des Namens die Email-Adresse des Autors (Standard: aus)"
 
-#: builtin/blame.c:2263
+#: builtin/blame.c:2256
 msgid "Ignore whitespace differences"
 msgstr "Ignoriert Unterschiede im Whitespace"
 
-#: builtin/blame.c:2264
+#: builtin/blame.c:2257
 msgid "Spend extra cycles to find better match"
 msgstr "arbeite länger, um bessere Übereinstimmungen zu finden"
 
-#: builtin/blame.c:2265
+#: builtin/blame.c:2258
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Benutzt Commits von <Datei> anstatt \"git-rev-list\" aufzurufen"
 
-#: builtin/blame.c:2266
+#: builtin/blame.c:2259
 msgid "Use <file>'s contents as the final image"
 msgstr "Benutzt Inhalte der <Datei>en als entgültiges Abbild"
 
-#: builtin/blame.c:2267 builtin/blame.c:2268
+#: builtin/blame.c:2260 builtin/blame.c:2261
 msgid "score"
 msgstr "Bewertung"
 
-#: builtin/blame.c:2267
+#: builtin/blame.c:2260
 msgid "Find line copies within and across files"
 msgstr "Findet kopierte Zeilen innerhalb oder zwischen Dateien"
 
-#: builtin/blame.c:2268
+#: builtin/blame.c:2261
 msgid "Find line movements within and across files"
 msgstr "Findet verschobene Zeilen innerhalb oder zwischen Dateien"
 
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
 msgid "Process only line range n,m, counting from 1"
 msgstr "Verarbeitet nur Zeilen im Bereich n,m, gezählt von 1"
 
@@ -3048,8 +2961,9 @@ msgid "act on remote-tracking branches"
 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:1460 builtin/commit.c:1461
-#: builtin/commit.c:1462 builtin/commit.c:1463 builtin/tag.c:468
+#: 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
 msgid "commit"
 msgstr "Commit"
 
@@ -3239,45 +3153,45 @@ msgstr "Um ein Paket zu erstellen wird ein Repository benötigt."
 msgid "Need a repository to unbundle."
 msgstr "Zum Entpacken wird ein Repository benötigt."
 
-#: builtin/cat-file.c:328
+#: builtin/cat-file.c:331
 msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
 msgstr "git cat-file (-t|-s|-e|-p|<Art>|--textconv) <Objekt>"
 
-#: builtin/cat-file.c:329
+#: builtin/cat-file.c:332
 msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
 msgstr "git cat-file (--batch|--batch-check) < <Liste_von_Objekten>"
 
-#: builtin/cat-file.c:366
+#: builtin/cat-file.c:369
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<Art> kann sein: blob, tree, commit, tag"
 
-#: builtin/cat-file.c:367
+#: builtin/cat-file.c:370
 msgid "show object type"
 msgstr "zeigt Objektart"
 
-#: builtin/cat-file.c:368
+#: builtin/cat-file.c:371
 msgid "show object size"
 msgstr "zeigt Objektgröße"
 
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:373
 msgid "exit with zero when there's no error"
 msgstr "beendet mit Rückgabewert 0, wenn kein Fehler aufgetreten ist"
 
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:374
 msgid "pretty-print object's content"
 msgstr "ansprechende Anzeige des Objektinhaltes"
 
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:376
 msgid "for blob objects, run textconv on object's content"
 msgstr "führt eine Textkonvertierung auf den Inhalt von Blob-Objekten aus"
 
-#: builtin/cat-file.c:375
+#: builtin/cat-file.c:378
 msgid "show info and content of objects fed from the standard input"
 msgstr ""
 "Anzeige von Informationen und Inhalt von Objekten, gelesen von der Standard-"
 "Eingabe"
 
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:381
 msgid "show info about objects fed from the standard input"
 msgstr ""
 "Anzeige von Informationen über Objekte, gelesen von der Standard-Eingabe"
@@ -3307,7 +3221,7 @@ msgstr "liest Dateinamen von der Standard-Eingabe"
 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:1090 builtin/gc.c:260
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
 msgid "suppress progress reporting"
 msgstr "unterdrückt Fortschrittsanzeige"
 
@@ -3463,60 +3377,59 @@ 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:451
+#: builtin/checkout.c:261 builtin/checkout.c:450
 msgid "corrupt index file"
 msgstr "beschädigte Staging-Area-Datei"
 
-#: builtin/checkout.c:322 builtin/checkout.c:329
+#: builtin/checkout.c:321 builtin/checkout.c:328
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "Pfad '%s' ist nicht zusammengeführt."
 
-#: builtin/checkout.c:473
+#: builtin/checkout.c:472
 msgid "you need to resolve your current index first"
 msgstr "Sie müssen zuerst Ihre aktuelle Staging-Area auflösen."
 
-#: builtin/checkout.c:594
+#: builtin/checkout.c:593
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr "Konnte \"reflog\" für '%s' nicht durchführen\n"
 
-#: builtin/checkout.c:632
+#: builtin/checkout.c:631
 msgid "HEAD is now at"
 msgstr "HEAD ist jetzt bei"
 
-#: builtin/checkout.c:639
+#: builtin/checkout.c:638
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Setze Branch '%s' neu\n"
 
-#: builtin/checkout.c:642
+#: builtin/checkout.c:641
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Bereits auf '%s'\n"
 
-#: builtin/checkout.c:646
+#: builtin/checkout.c:645
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Gewechselt zu umgesetzten Branch '%s'\n"
 
-#: builtin/checkout.c:648 builtin/checkout.c:1033
+#: builtin/checkout.c:647 builtin/checkout.c:1032
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Gewechselt zu einem neuem Branch '%s'\n"
 
-#: builtin/checkout.c:650
+#: builtin/checkout.c:649
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Gewechselt zu Branch '%s'\n"
 
-#: builtin/checkout.c:706
+#: builtin/checkout.c:705
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... und %d weitere.\n"
 
-#. The singular version
-#: builtin/checkout.c:712
+#: builtin/checkout.c:711
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -3539,7 +3452,7 @@ msgstr[1] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:730
+#: builtin/checkout.c:729
 #, c-format
 msgid ""
 "If you want to keep them by creating a new branch, this may be a good time\n"
@@ -3554,140 +3467,139 @@ msgstr ""
 " git branch neuer_branch_name %s\n"
 "\n"
 
-#: builtin/checkout.c:760
+#: builtin/checkout.c:759
 msgid "internal error in revision walk"
 msgstr "interner Fehler im Revisionsgang"
 
-#: builtin/checkout.c:764
+#: builtin/checkout.c:763
 msgid "Previous HEAD position was"
 msgstr "Vorherige Position von HEAD war"
 
-#: builtin/checkout.c:791 builtin/checkout.c:1028
+#: builtin/checkout.c:790 builtin/checkout.c:1027
 msgid "You are on a branch yet to be born"
 msgstr "Sie sind auf einem Branch, der noch geboren wird"
 
-#: builtin/checkout.c:935
+#: builtin/checkout.c:934
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "nur eine Referenz erwartet, %d gegeben."
 
-#: builtin/checkout.c:974
+#: builtin/checkout.c:973
 #, c-format
 msgid "invalid reference: %s"
 msgstr "Ungültige Referenz: %s"
 
-#. case (1): want a tree
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "Referenz ist kein \"Tree\"-Objekt: %s"
 
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
 msgid "paths cannot be used with switching branches"
 msgstr "Pfade können nicht beim Wechseln von Branches verwendet werden"
 
-#: builtin/checkout.c:1045 builtin/checkout.c:1049
+#: builtin/checkout.c:1044 builtin/checkout.c:1048
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' kann nicht beim Wechseln von Branches verwendet werden"
 
-#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1052 builtin/checkout.c:1055 builtin/checkout.c:1060
+#: builtin/checkout.c:1063
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' kann nicht mit '%s' verwendet werden"
 
-#: builtin/checkout.c:1069
+#: builtin/checkout.c:1068
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Kann Branch nicht zu Nicht-Commit '%s' wechseln"
 
-#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
 #: builtin/remote.c:159 builtin/remote.c:161
 msgid "branch"
 msgstr "Branch"
 
-#: builtin/checkout.c:1092
+#: builtin/checkout.c:1091
 msgid "create and checkout a new branch"
 msgstr "erzeugt und checkt einen neuen Branch aus"
 
-#: builtin/checkout.c:1094
+#: builtin/checkout.c:1093
 msgid "create/reset and checkout a branch"
 msgstr "erzeugt/setzt um und checkt einen Branch aus"
 
-#: builtin/checkout.c:1095
+#: builtin/checkout.c:1094
 msgid "create reflog for new branch"
 msgstr "erzeugt das Reflog für den neuen Branch"
 
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
 msgid "detach the HEAD at named commit"
 msgstr "setzt HEAD zu benanntem Commit"
 
-#: builtin/checkout.c:1097
+#: builtin/checkout.c:1096
 msgid "set upstream info for new branch"
 msgstr "setzt Informationen zum Upstream-Branch für den neuen Branch"
 
-#: builtin/checkout.c:1099
-msgid "new branch"
+#: builtin/checkout.c:1098
+msgid "new-branch"
 msgstr "neuer Branch"
 
-#: builtin/checkout.c:1099
+#: builtin/checkout.c:1098
 msgid "new unparented branch"
 msgstr "neuer Branch ohne Eltern-Commit"
 
-#: builtin/checkout.c:1100
+#: builtin/checkout.c:1099
 msgid "checkout our version for unmerged files"
 msgstr "checkt unsere Variante für nicht zusammengeführte Dateien aus"
 
-#: builtin/checkout.c:1102
+#: builtin/checkout.c:1101
 msgid "checkout their version for unmerged files"
 msgstr "checkt ihre Variante für nicht zusammengeführte Dateien aus"
 
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1103
 msgid "force checkout (throw away local modifications)"
 msgstr "erzwingt Auschecken (verwirft lokale Änderungen)"
 
-#: builtin/checkout.c:1105
+#: builtin/checkout.c:1104
 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:1106 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:225
 msgid "update ignored files (default)"
 msgstr "aktualisiert ignorierte Dateien (Standard)"
 
-#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248
+#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
 msgid "style"
 msgstr "Stil"
 
-#: builtin/checkout.c:1108
+#: builtin/checkout.c:1107
 msgid "conflict style (merge or diff3)"
 msgstr "Konfliktstil (merge oder diff3)"
 
-#: builtin/checkout.c:1111
+#: builtin/checkout.c:1110
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "Pfadspezifikationen ignorieren Einstellungen zum partiellen Auschecken"
 
-#: builtin/checkout.c:1113
+#: builtin/checkout.c:1112
 msgid "second guess 'git checkout no-such-branch'"
 msgstr "second guess 'git checkout no-such-branch'"
 
-#: builtin/checkout.c:1136
+#: builtin/checkout.c:1135
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "Die Optionen -b, -B und --orphan schließen sich gegenseitig aus."
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
 msgid "--track needs a branch name"
 msgstr "Bei der Option --track muss ein Branchname angegeben werden."
 
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1159
 msgid "Missing branch name; try -b"
 msgstr "Vermisse Branchnamen; versuchen Sie -b"
 
-#: builtin/checkout.c:1197
+#: builtin/checkout.c:1196
 msgid "invalid path specification"
 msgstr "ungültige Pfadspezifikation"
 
-#: builtin/checkout.c:1204
+#: builtin/checkout.c:1203
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3697,12 +3609,12 @@ msgstr ""
 "Haben Sie beabsichtigt '%s' auszuchecken, welcher nicht als Commit aufgelöst "
 "werden kann?"
 
-#: builtin/checkout.c:1209
+#: builtin/checkout.c:1208
 #, 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:1213
+#: builtin/checkout.c:1212
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -3741,7 +3653,7 @@ msgstr "Würde Repository %s überspringen\n"
 msgid "failed to remove %s"
 msgstr "Fehler beim Löschen von %s"
 
-#: builtin/clean.c:294
+#: builtin/clean.c:295
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -3753,7 +3665,7 @@ msgstr ""
 "foo        - Element anhand eines eindeutigen Präfix auswählen\n"
 "           - (leer) nichts auswählen"
 
-#: builtin/clean.c:298
+#: builtin/clean.c:299
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -3773,35 +3685,35 @@ msgstr ""
 "*          - alle Elemente auswählen\n"
 "           - (leer) Auswahl beenden"
 
-#: builtin/clean.c:516
+#: builtin/clean.c:517
 #, c-format
 msgid "Huh (%s)?"
 msgstr "Wie bitte (%s)?"
 
-#: builtin/clean.c:659
+#: builtin/clean.c:660
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Ignorier-Muster eingeben>> "
 
-#: builtin/clean.c:696
+#: builtin/clean.c:697
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "WARNUNG: Kann keine Einträge finden die Muster entsprechen: %s"
 
-#: builtin/clean.c:717
+#: builtin/clean.c:718
 msgid "Select items to delete"
 msgstr "Wählen Sie Einträge zum Löschen"
 
-#: builtin/clean.c:757
+#: builtin/clean.c:758
 #, c-format
 msgid "remove %s? "
 msgstr "'%s' löschen? "
 
-#: builtin/clean.c:782
+#: builtin/clean.c:783
 msgid "Bye."
 msgstr "Tschüss."
 
-#: builtin/clean.c:790
+#: builtin/clean.c:791
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -3819,72 +3731,72 @@ msgstr ""
 "help                - diese Meldung anzeigen\n"
 "?                   - Hilfe zur Auswahl mittels Eingabe anzeigen"
 
-#: builtin/clean.c:817
+#: builtin/clean.c:818
 msgid "*** Commands ***"
 msgstr "*** Kommandos ***"
 
-#: builtin/clean.c:818
+#: builtin/clean.c:819
 msgid "What now"
 msgstr "Was nun"
 
-#: builtin/clean.c:826
+#: builtin/clean.c:827
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Würde das folgende Element entfernen:"
 msgstr[1] "Würde die folgenden Elemente entfernen:"
 
-#: builtin/clean.c:843
+#: builtin/clean.c:844
 msgid "No more files to clean, exiting."
 msgstr "Keine Dateien mehr zum Löschen, beende."
 
-#: builtin/clean.c:874
+#: builtin/clean.c:875
 msgid "do not print names of files removed"
 msgstr "gibt keine Namen von gelöschten Dateien aus"
 
-#: builtin/clean.c:876
+#: builtin/clean.c:877
 msgid "force"
 msgstr "erzwingt Aktion"
 
-#: builtin/clean.c:877
+#: builtin/clean.c:878
 msgid "interactive cleaning"
 msgstr "interaktives Clean"
 
-#: builtin/clean.c:879
+#: builtin/clean.c:880
 msgid "remove whole directories"
 msgstr "löscht ganze Verzeichnisse"
 
-#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:718
-#: builtin/ls-files.c:483 builtin/name-rev.c:314 builtin/show-ref.c:185
+#: 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
 msgid "pattern"
 msgstr "Muster"
 
-#: builtin/clean.c:881
+#: builtin/clean.c:882
 msgid "add <pattern> to ignore rules"
 msgstr "fügt <Muster> zu den Regeln für ignorierte Pfade hinzu"
 
-#: builtin/clean.c:882
+#: builtin/clean.c:883
 msgid "remove ignored files, too"
 msgstr "löscht auch ignorierte Dateien"
 
-#: builtin/clean.c:884
+#: builtin/clean.c:885
 msgid "remove only ignored files"
 msgstr "löscht nur ignorierte Dateien"
 
-#: builtin/clean.c:902
+#: builtin/clean.c:903
 msgid "-x and -X cannot be used together"
 msgstr "Die Optionen -x und -X können nicht gemeinsam verwendet werden."
 
-#: builtin/clean.c:906
+#: builtin/clean.c:907
 msgid ""
-"clean.requireForce set to true and neither -i, -n nor -f given; refusing to "
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
 msgstr ""
 "clean.requireForce auf \"true\" gesetzt und weder -i, -n noch -f gegeben; "
 "\"clean\" verweigert"
 
-#: builtin/clean.c:909
+#: builtin/clean.c:910
 msgid ""
-"clean.requireForce defaults to true and neither -i, -n nor -f given; "
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
 msgstr ""
 "clean.requireForce standardmäßig auf \"true\" gesetzt und weder -i, -n noch -"
@@ -3895,7 +3807,7 @@ 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:521
+#: builtin/push.c:504
 msgid "force progress reporting"
 msgstr "erzwingt Fortschrittsanzeige"
 
@@ -3903,7 +3815,7 @@ msgstr "erzwingt Fortschrittsanzeige"
 msgid "don't create a checkout"
 msgstr "kein Auschecken"
 
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
 msgid "create a bare repository"
 msgstr "erstellt ein Bare-Repository"
 
@@ -3927,11 +3839,11 @@ msgstr "Einrichtung als verteiltes Repository"
 msgid "initialize submodules in the clone"
 msgstr "initialisiert Submodule im Klon"
 
-#: builtin/clone.c:82 builtin/init-db.c:485
+#: builtin/clone.c:82 builtin/init-db.c:483
 msgid "template-directory"
 msgstr "Vorlagenverzeichnis"
 
-#: builtin/clone.c:83 builtin/init-db.c:486
+#: builtin/clone.c:83 builtin/init-db.c:484
 msgid "directory from which templates will be used"
 msgstr "Verzeichnis, von welchem die Vorlagen verwendet werden"
 
@@ -3955,23 +3867,24 @@ msgstr "checkt <Branch> aus, anstatt HEAD des Remote-Repositories"
 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:663
+#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
 msgid "depth"
 msgstr "Tiefe"
 
 #: builtin/clone.c:93
 msgid "create a shallow clone of that depth"
-msgstr "erstellt einen Klon mit unvollständiger Historie (shallow) in dieser Tiefe"
+msgstr ""
+"erstellt einen Klon mit unvollständiger Historie (shallow) in dieser Tiefe"
 
 #: builtin/clone.c:95
 msgid "clone only one branch, HEAD or --branch"
 msgstr "klont nur einen Branch, HEAD oder --branch"
 
-#: builtin/clone.c:96 builtin/init-db.c:494
+#: builtin/clone.c:96 builtin/init-db.c:492
 msgid "gitdir"
 msgstr ".git-Verzeichnis"
 
-#: builtin/clone.c:97 builtin/init-db.c:495
+#: builtin/clone.c:97 builtin/init-db.c:493
 msgid "separate git dir from working tree"
 msgstr "separiert Git-Verzeichnis vom Arbeitsverzeichnis"
 
@@ -3991,12 +3904,15 @@ msgstr "Referenziertes Repository '%s' ist kein lokales Repository."
 #: builtin/clone.c:256
 #, c-format
 msgid "reference repository '%s' is shallow"
-msgstr "Referenziertes Repository '%s' hat eine unvollständige Historie (shallow)."
+msgstr ""
+"Referenziertes Repository '%s' hat eine unvollständige Historie (shallow)."
 
 #: builtin/clone.c:259
 #, c-format
 msgid "reference repository '%s' is grafted"
-msgstr "Referenziertes Repository '%s' ist mit künstlichen Vorgängern (\"grafts\") eingehängt."
+msgstr ""
+"Referenziertes Repository '%s' ist mit künstlichen Vorgängern (\"grafts\") "
+"eingehängt."
 
 #: builtin/clone.c:321
 #, c-format
@@ -4097,8 +4013,9 @@ msgstr ""
 
 #: builtin/clone.c:805
 msgid "source repository is shallow, ignoring --local"
-msgstr "Quelle ist ein Repository mit unvollständiger Historie (shallow),"
-"ignoriere --local"
+msgstr ""
+"Quelle ist ein Repository mit unvollständiger Historie (shallow),ignoriere --"
+"local"
 
 #: builtin/clone.c:810
 msgid "--local is ignored"
@@ -4264,68 +4181,68 @@ msgstr ""
 "Benutzen Sie anschließend \"git cherry-pick --continue\", um die\n"
 "Cherry-Pick-Operation mit den verbleibenden Commits fortzusetzen.\n"
 
-#: builtin/commit.c:287
+#: builtin/commit.c:288
 msgid "failed to unpack HEAD tree object"
 msgstr "Fehler beim Entpacken des \"Tree\"-Objektes von HEAD."
 
-#: builtin/commit.c:329
+#: builtin/commit.c:330
 msgid "unable to create temporary index"
 msgstr "Konnte temporäre Staging-Area nicht erstellen."
 
-#: builtin/commit.c:335
+#: builtin/commit.c:336
 msgid "interactive add failed"
 msgstr "interaktives Hinzufügen fehlgeschlagen"
 
-#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439
+#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
 msgid "unable to write new_index file"
 msgstr "Konnte new_index Datei nicht schreiben"
 
-#: builtin/commit.c:420
+#: builtin/commit.c:421
 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:422
+#: builtin/commit.c:423
 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:432
+#: builtin/commit.c:433
 msgid "cannot read the index"
 msgstr "Kann Staging-Area nicht lesen"
 
-#: builtin/commit.c:452
+#: builtin/commit.c:453
 msgid "unable to write temporary index file"
 msgstr "Konnte temporäre Staging-Area-Datei nicht schreiben."
 
-#: builtin/commit.c:543 builtin/commit.c:549
+#: builtin/commit.c:544 builtin/commit.c:550
 #, c-format
 msgid "invalid commit: %s"
 msgstr "Ungültiger Commit: %s"
 
-#: builtin/commit.c:571
+#: builtin/commit.c:572
 msgid "malformed --author parameter"
 msgstr "Fehlerhafter --author Parameter"
 
-#: builtin/commit.c:591
+#: builtin/commit.c:592
 #, c-format
 msgid "Malformed ident string: '%s'"
 msgstr "Fehlerhafter Ident-String: '%s'"
 
-#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007
+#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "Konnte Commit %s nicht nachschlagen"
 
-#: builtin/commit.c:642 builtin/shortlog.c:273
+#: builtin/commit.c:641 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:644
+#: builtin/commit.c:643
 msgid "could not read log from standard input"
 msgstr "Konnte Log nicht von Standard-Eingabe lesen."
 
-#: builtin/commit.c:648
+#: builtin/commit.c:647
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "Konnte Log-Datei '%s' nicht lesen"
@@ -4351,7 +4268,7 @@ msgstr "Konnte '%s' nicht lesen"
 msgid "could not write commit template"
 msgstr "Konnte Commit-Vorlage nicht schreiben"
 
-#: builtin/commit.c:760
+#: builtin/commit.c:764
 #, c-format
 msgid ""
 "\n"
@@ -4366,7 +4283,7 @@ msgstr ""
 "\t%s\n"
 "und versuchen Sie es erneut.\n"
 
-#: builtin/commit.c:765
+#: builtin/commit.c:769
 #, c-format
 msgid ""
 "\n"
@@ -4381,7 +4298,7 @@ msgstr ""
 "\t%s\n"
 "und versuchen Sie es erneut.\n"
 
-#: builtin/commit.c:777
+#: builtin/commit.c:782
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4391,7 +4308,7 @@ msgstr ""
 "die mit '%c' beginnen, werden ignoriert, und eine leere Beschreibung\n"
 "bricht den Commit ab.\n"
 
-#: builtin/commit.c:782
+#: builtin/commit.c:789
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4404,152 +4321,150 @@ msgstr ""
 "entfernen.\n"
 "Eine leere Beschreibung bricht den Commit ab.\n"
 
-#: builtin/commit.c:795
+#: builtin/commit.c:802
 #, c-format
 msgid "%sAuthor:    %s"
 msgstr "%sAutor:    %s"
 
-#: builtin/commit.c:802
+#: builtin/commit.c:809
 #, c-format
 msgid "%sCommitter: %s"
 msgstr "%sCommit-Ersteller: %s"
 
-#: builtin/commit.c:822
+#: builtin/commit.c:829
 msgid "Cannot read index"
 msgstr "Kann Staging-Area nicht lesen"
 
-#: builtin/commit.c:865
+#: builtin/commit.c:872
 msgid "Error building trees"
 msgstr "Fehler beim Erzeugen der \"Tree\"-Objekte"
 
-#: builtin/commit.c:880 builtin/tag.c:359
+#: builtin/commit.c:887 builtin/tag.c:391
 #, 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:982
+#: builtin/commit.c:989
 #, c-format
 msgid "No existing author found with '%s'"
 msgstr "Kein existierender Autor mit '%s' gefunden."
 
-#: builtin/commit.c:997 builtin/commit.c:1237
+#: builtin/commit.c:1004 builtin/commit.c:1244
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Ungültiger Modus '%s' für unbeobachtete Dateien"
 
-#: builtin/commit.c:1034
+#: builtin/commit.c:1041
 msgid "--long and -z are incompatible"
 msgstr "Die Optionen --long und -z sind inkompatibel."
 
-#: builtin/commit.c:1064
+#: builtin/commit.c:1071
 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:1075
+#: builtin/commit.c:1080
 msgid "You have nothing to amend."
 msgstr "Sie haben nichts für \"--amend\"."
 
-#: builtin/commit.c:1078
+#: builtin/commit.c:1083
 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:1080
+#: builtin/commit.c:1085
 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:1083
+#: builtin/commit.c:1088
 msgid "Options --squash and --fixup cannot be used together"
 msgstr ""
 "Die Optionen --squash und --fixup können nicht gemeinsam verwendet werden."
 
-#: builtin/commit.c:1093
+#: builtin/commit.c:1098
 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:1095
+#: builtin/commit.c:1100
 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:1103
+#: builtin/commit.c:1108
 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:1120
+#: builtin/commit.c:1125
 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:1122
+#: builtin/commit.c:1127
 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:1124
+#: builtin/commit.c:1129
 msgid "Clever... amending the last one with dirty index."
 msgstr ""
 "Klug... den letzten Commit mit einer geänderten Staging-Area nachbessern."
 
-#: builtin/commit.c:1126
-msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
-msgstr ""
-"Explizite Pfade ohne -i oder -o angegeben; unter der Annahme von --only "
-"Pfaden..."
+#: builtin/commit.c:1131
+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:1136 builtin/tag.c:572
+#: builtin/commit.c:1143 builtin/tag.c:639
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Ungültiger \"cleanup\" Modus %s"
 
-#: builtin/commit.c:1141
+#: builtin/commit.c:1148
 msgid "Paths with -a does not make sense."
 msgstr "Die Option -a kann nur mit der Angabe von Pfaden verwendet werden."
 
-#: builtin/commit.c:1251 builtin/commit.c:1482
+#: builtin/commit.c:1258 builtin/commit.c:1516
 msgid "show status concisely"
 msgstr "zeigt Status im Kurzformat"
 
-#: builtin/commit.c:1253 builtin/commit.c:1484
+#: builtin/commit.c:1260 builtin/commit.c:1518
 msgid "show branch information"
 msgstr "zeigt Branchinformationen"
 
-#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507
+#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
 msgid "machine-readable output"
 msgstr "maschinenlesbare Ausgabe"
 
-#: builtin/commit.c:1258 builtin/commit.c:1488
+#: builtin/commit.c:1265 builtin/commit.c:1522
 msgid "show status in long format (default)"
 msgstr "zeigt Status im Langformat (Standard)"
 
-#: builtin/commit.c:1261 builtin/commit.c:1491
+#: builtin/commit.c:1268 builtin/commit.c:1525
 msgid "terminate entries with NUL"
 msgstr "schließt Einträge mit NUL-Zeichen ab"
 
-#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:459
+#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
+#: builtin/fast-export.c:677 builtin/tag.c:514
 msgid "mode"
 msgstr "Modus"
 
-#: builtin/commit.c:1264 builtin/commit.c:1494
+#: builtin/commit.c:1271 builtin/commit.c:1528
 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:1267
+#: builtin/commit.c:1274
 msgid "show ignored files"
 msgstr "zeigt ignorierte Dateien"
 
-#: builtin/commit.c:1268 parse-options.h:156
+#: builtin/commit.c:1275 parse-options.h:153
 msgid "when"
 msgstr "wann"
 
-#: builtin/commit.c:1269
+#: builtin/commit.c:1276
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -4557,219 +4472,219 @@ msgstr ""
 "ignoriert Änderungen in Submodulen, optional wenn: all, dirty, untracked. "
 "(Standard: all)"
 
-#: builtin/commit.c:1271
+#: builtin/commit.c:1278
 msgid "list untracked files in columns"
 msgstr "listet unbeobachtete Dateien in Spalten auf"
 
-#: builtin/commit.c:1340
+#: builtin/commit.c:1347
 msgid "couldn't look up newly created commit"
 msgstr "Konnte neu erstellten Commit nicht nachschlagen."
 
-#: builtin/commit.c:1342
+#: builtin/commit.c:1349
 msgid "could not parse newly created commit"
 msgstr "Konnte neulich erstellten Commit nicht analysieren."
 
-#: builtin/commit.c:1383
+#: builtin/commit.c:1390
 msgid "detached HEAD"
 msgstr "losgelöster HEAD"
 
-#: builtin/commit.c:1385
+#: builtin/commit.c:1392
 msgid " (root-commit)"
 msgstr " (Basis-Commit)"
 
-#: builtin/commit.c:1452
+#: builtin/commit.c:1486
 msgid "suppress summary after successful commit"
 msgstr "unterdrückt Zusammenfassung nach erfolgreichem Commit"
 
-#: builtin/commit.c:1453
+#: builtin/commit.c:1487
 msgid "show diff in commit message template"
 msgstr "zeigt Unterschiede in Commit-Beschreibungsvorlage an"
 
-#: builtin/commit.c:1455
+#: builtin/commit.c:1489
 msgid "Commit message options"
 msgstr "Optionen für Commit-Beschreibung"
 
-#: builtin/commit.c:1456 builtin/tag.c:457
+#: builtin/commit.c:1490 builtin/tag.c:512
 msgid "read message from file"
 msgstr "liest Beschreibung von Datei"
 
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
 msgid "author"
 msgstr "Autor"
 
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
 msgid "override author for commit"
 msgstr "überschreibt Autor eines Commits"
 
-#: builtin/commit.c:1458 builtin/gc.c:261
+#: builtin/commit.c:1492 builtin/gc.c:272
 msgid "date"
 msgstr "Datum"
 
-#: builtin/commit.c:1458
+#: builtin/commit.c:1492
 msgid "override date for commit"
 msgstr "überschreibt Datum eines Commits"
 
-#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405
-#: builtin/notes.c:562 builtin/tag.c:455
+#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:510
 msgid "message"
 msgstr "Beschreibung"
 
-#: builtin/commit.c:1459
+#: builtin/commit.c:1493
 msgid "commit message"
 msgstr "Commit-Beschreibung"
 
-#: builtin/commit.c:1460
+#: builtin/commit.c:1494
 msgid "reuse and edit message from specified commit"
 msgstr "verwendet wieder und editiert Beschreibung des angegebenen Commits"
 
-#: builtin/commit.c:1461
+#: builtin/commit.c:1495
 msgid "reuse message from specified commit"
 msgstr "verwendet Beschreibung des angegebenen Commits wieder"
 
-#: builtin/commit.c:1462
+#: builtin/commit.c:1496
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "verwendet eine automatisch zusammengesetzte Beschreibung zum Nachbessern des "
 "angegebenen Commits"
 
-#: builtin/commit.c:1463
+#: builtin/commit.c:1497
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "verwendet eine automatisch zusammengesetzte Beschreibung beim \"squash\" des "
 "angegebenen Commits"
 
-#: builtin/commit.c:1464
+#: builtin/commit.c:1498
 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:1465 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "fügt 'Signed-off-by:'-Zeile hinzu"
 
-#: builtin/commit.c:1466
+#: builtin/commit.c:1500
 msgid "use specified template file"
 msgstr "verwendet angegebene Vorlagendatei"
 
-#: builtin/commit.c:1467
+#: builtin/commit.c:1501
 msgid "force edit of commit"
 msgstr "erzwingt Bearbeitung des Commits"
 
-#: builtin/commit.c:1468
+#: builtin/commit.c:1502
 msgid "default"
 msgstr "Standard"
 
-#: builtin/commit.c:1468 builtin/tag.c:460
+#: builtin/commit.c:1502 builtin/tag.c:515
 msgid "how to strip spaces and #comments from message"
 msgstr ""
 "wie Leerzeichen und #Kommentare von der Beschreibung getrennt werden sollen"
 
-#: builtin/commit.c:1469
+#: builtin/commit.c:1503
 msgid "include status in commit message template"
 msgstr "fügt Status in die Commit-Beschreibungsvorlage ein"
 
-#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461
-msgid "key id"
-msgstr "Schlüssel-ID"
+#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:516
+msgid "key-id"
+msgstr "GPG-Schlüsselkennung"
 
-#: builtin/commit.c:1471 builtin/merge.c:224
+#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "signiert Commit mit GPG"
 
-#. end commit message options
-#: builtin/commit.c:1474
+#: builtin/commit.c:1508
 msgid "Commit contents options"
 msgstr "Optionen für Commit-Inhalt"
 
-#: builtin/commit.c:1475
+#: builtin/commit.c:1509
 msgid "commit all changed files"
 msgstr "committet alle geänderten Dateien"
 
-#: builtin/commit.c:1476
+#: builtin/commit.c:1510
 msgid "add specified files to index for commit"
 msgstr "merkt die angegebenen Dateien zusätzlich zum Commit vor"
 
-#: builtin/commit.c:1477
+#: builtin/commit.c:1511
 msgid "interactively add files"
 msgstr "interaktives Hinzufügen von Dateien"
 
-#: builtin/commit.c:1478
+#: builtin/commit.c:1512
 msgid "interactively add changes"
 msgstr "interaktives Hinzufügen von Änderungen"
 
-#: builtin/commit.c:1479
+#: builtin/commit.c:1513
 msgid "commit only specified files"
 msgstr "committet nur die angegebenen Dateien"
 
-#: builtin/commit.c:1480
+#: builtin/commit.c:1514
 msgid "bypass pre-commit hook"
 msgstr "umgeht \"pre-commit hook\""
 
-#: builtin/commit.c:1481
+#: builtin/commit.c:1515
 msgid "show what would be committed"
 msgstr "zeigt an, was committet werden würde"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1526
 msgid "amend previous commit"
 msgstr "ändert vorherigen Commit"
 
-#: builtin/commit.c:1493
+#: builtin/commit.c:1527
 msgid "bypass post-rewrite hook"
 msgstr "umgeht \"post-rewrite hook\""
 
-#: builtin/commit.c:1498
+#: builtin/commit.c:1532
 msgid "ok to record an empty change"
 msgstr "erlaubt Aufzeichnung einer leeren Änderung"
 
-#: builtin/commit.c:1500
+#: builtin/commit.c:1534
 msgid "ok to record a change with an empty message"
 msgstr "erlaubt Aufzeichnung einer Änderung mit einer leeren Beschreibung"
 
-#: builtin/commit.c:1529
+#: builtin/commit.c:1562
 msgid "could not parse HEAD commit"
 msgstr "Konnte Commit von HEAD nicht analysieren."
 
-#: builtin/commit.c:1567 builtin/merge.c:518
+#: builtin/commit.c:1601 builtin/merge.c:518
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "Konnte '%s' nicht zum Lesen öffnen."
 
-#: builtin/commit.c:1574
+#: builtin/commit.c:1608
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Beschädigte MERGE_HEAD-Datei (%s)"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1615
 msgid "could not read MERGE_MODE"
 msgstr "Konnte MERGE_MODE nicht lesen"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1634
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "Konnte Commit-Beschreibung nicht lesen: %s"
 
-#: builtin/commit.c:1611
+#: builtin/commit.c:1645
 #, 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:1616
+#: builtin/commit.c:1650
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Commit aufgrund leerer Beschreibung abgebrochen.\n"
 
-#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879
+#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
 msgid "failed to write commit object"
 msgstr "Fehler beim Schreiben des Commit-Objektes."
 
-#: builtin/commit.c:1652
+#: builtin/commit.c:1686
 msgid "cannot lock HEAD ref"
 msgstr "Kann Referenz von HEAD nicht sperren."
 
-#: builtin/commit.c:1656
+#: builtin/commit.c:1690
 msgid "cannot update HEAD ref"
 msgstr "Kann Referenz von HEAD nicht aktualisieren."
 
-#: builtin/commit.c:1667
+#: builtin/commit.c:1701
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full or quota is\n"
@@ -4784,127 +4699,127 @@ msgstr ""
 msgid "git config [options]"
 msgstr "git config [Optionen]"
 
-#: builtin/config.c:54
+#: builtin/config.c:53
 msgid "Config file location"
 msgstr "Ort der Konfigurationsdatei"
 
-#: builtin/config.c:55
+#: builtin/config.c:54
 msgid "use global config file"
 msgstr "verwendet globale Konfigurationsdatei"
 
-#: builtin/config.c:56
+#: builtin/config.c:55
 msgid "use system config file"
 msgstr "verwendet systemweite Konfigurationsdatei"
 
-#: builtin/config.c:57
+#: builtin/config.c:56
 msgid "use repository config file"
 msgstr "verwendet Konfigurationsdatei des Repositories"
 
-#: builtin/config.c:58
+#: builtin/config.c:57
 msgid "use given config file"
 msgstr "verwendet die angegebene Konfigurationsdatei"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "blob-id"
 msgstr "Blob-Id"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "read config from given blob object"
 msgstr "liest Konfiguration von angegebenem Blob-Objekt"
 
-#: builtin/config.c:60
+#: builtin/config.c:59
 msgid "Action"
 msgstr "Aktion"
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "get value: name [value-regex]"
 msgstr "gibt Wert zurück: Name [Wert-regex]"
 
-#: builtin/config.c:62
+#: builtin/config.c:61
 msgid "get all values: key [value-regex]"
 msgstr "gibt alle Werte zurück: Schlüssel [Wert-regex]"
 
-#: builtin/config.c:63
+#: builtin/config.c:62
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr "gibt Werte für den regulären Ausdruck zurück: Name-regex [Wert-regex]"
 
-#: builtin/config.c:64
+#: builtin/config.c:63
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "gibt Wert spezifisch für eine URL zurück: section[.var] URL"
 
-#: builtin/config.c:65
+#: builtin/config.c:64
 msgid "replace all matching variables: name value [value_regex]"
 msgstr "ersetzt alle passenden Variablen: Name Wert [Wert-regex] "
 
-#: builtin/config.c:66
+#: builtin/config.c:65
 msgid "add a new variable: name value"
 msgstr "fügt neue Variable hinzu: Name Wert"
 
-#: builtin/config.c:67
+#: builtin/config.c:66
 msgid "remove a variable: name [value-regex]"
 msgstr "entfernt eine Variable: Name [Wert-regex]"
 
-#: builtin/config.c:68
+#: builtin/config.c:67
 msgid "remove all matches: name [value-regex]"
 msgstr "entfernt alle Übereinstimmungen: Name [Wert-regex]"
 
-#: builtin/config.c:69
+#: builtin/config.c:68
 msgid "rename section: old-name new-name"
 msgstr "benennt eine Sektion um: alter-Name neuer-Name"
 
-#: builtin/config.c:70
+#: builtin/config.c:69
 msgid "remove a section: name"
 msgstr "entfernt eine Sektion: Name"
 
-#: builtin/config.c:71
+#: builtin/config.c:70
 msgid "list all"
 msgstr "listet alles auf"
 
-#: builtin/config.c:72
+#: builtin/config.c:71
 msgid "open an editor"
 msgstr "öffnet einen Editor"
 
-#: builtin/config.c:73 builtin/config.c:74
+#: builtin/config.c:72 builtin/config.c:73
 msgid "slot"
 msgstr "Slot"
 
-#: builtin/config.c:73
+#: builtin/config.c:72
 msgid "find the color configured: [default]"
 msgstr "findet die konfigurierte Farbe: [Standard]"
 
-#: builtin/config.c:74
+#: builtin/config.c:73
 msgid "find the color setting: [stdout-is-tty]"
 msgstr "findet die Farbeinstellung: [Standard-Ausgabe-ist-Terminal]"
 
-#: builtin/config.c:75
+#: builtin/config.c:74
 msgid "Type"
 msgstr "Typ"
 
-#: builtin/config.c:76
+#: builtin/config.c:75
 msgid "value is \"true\" or \"false\""
 msgstr "Wert ist \"true\" oder \"false\""
 
-#: builtin/config.c:77
+#: builtin/config.c:76
 msgid "value is decimal number"
 msgstr "Wert ist eine Dezimalzahl"
 
-#: builtin/config.c:78
+#: builtin/config.c:77
 msgid "value is --bool or --int"
 msgstr "Wert ist --bool oder --int"
 
-#: builtin/config.c:79
+#: builtin/config.c:78
 msgid "value is a path (file or directory name)"
 msgstr "Wert ist ein Pfad (Datei oder Verzeichnisname)"
 
-#: builtin/config.c:80
+#: builtin/config.c:79
 msgid "Other"
 msgstr "Sonstiges"
 
-#: builtin/config.c:81
+#: builtin/config.c:80
 msgid "terminate values with NUL byte"
 msgstr "schließt Werte mit NUL-Byte ab"
 
-#: builtin/config.c:82
+#: builtin/config.c:81
 msgid "respect include directives on lookup"
 msgstr "beachtet \"include\"-Direktiven beim Nachschlagen"
 
@@ -4924,47 +4839,47 @@ msgstr "git describe [Optionen] <commit-ish>*"
 msgid "git describe [options] --dirty"
 msgstr "git describe [Optionen] --dirty"
 
-#: builtin/describe.c:237
+#: builtin/describe.c:225
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "annotiertes Tag %s ist nicht verfügbar"
 
-#: builtin/describe.c:241
+#: builtin/describe.c:229
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr "annotiertes Tag %s hat keinen eingebetteten Namen"
 
-#: builtin/describe.c:243
+#: builtin/describe.c:231
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "Tag '%s' ist eigentlich '%s' hier"
 
-#: builtin/describe.c:270
+#: builtin/describe.c:258
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "%s ist kein gültiger Objekt-Name"
 
-#: builtin/describe.c:273
+#: builtin/describe.c:261
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr "%s ist kein gültiges '%s' Objekt"
 
-#: builtin/describe.c:290
+#: builtin/describe.c:278
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr "kein Tag entspricht exakt '%s'"
 
-#: builtin/describe.c:292
+#: builtin/describe.c:280
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "suche zur Beschreibung von %s\n"
 
-#: builtin/describe.c:332
+#: builtin/describe.c:327
 #, c-format
 msgid "finished search at %s\n"
 msgstr "beendete Suche bei %s\n"
 
-#: builtin/describe.c:359
+#: builtin/describe.c:354
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -4973,7 +4888,7 @@ msgstr ""
 "Keine annotierten Tags können '%s' beschreiben.\n"
 "Jedoch gab es nicht-annotierte Tags: versuchen Sie --tags."
 
-#: builtin/describe.c:363
+#: builtin/describe.c:358
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -4982,12 +4897,12 @@ msgstr ""
 "Keine Tags können '%s' beschreiben.\n"
 "Versuchen Sie --always oder erstellen Sie einige Tags."
 
-#: builtin/describe.c:384
+#: builtin/describe.c:379
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "%lu Commits durchlaufen\n"
 
-#: builtin/describe.c:387
+#: builtin/describe.c:382
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
@@ -4996,65 +4911,65 @@ msgstr ""
 "mehr als %i Tags gefunden; Führe die ersten %i auf\n"
 "Suche bei %s aufgegeben\n"
 
-#: builtin/describe.c:409
+#: builtin/describe.c:404
 msgid "find the tag that comes after the commit"
 msgstr "findet das Tag, das nach Commit kommt"
 
-#: builtin/describe.c:410
+#: builtin/describe.c:405
 msgid "debug search strategy on stderr"
 msgstr "protokolliert die Suchstrategie in der Standard-Fehlerausgabe"
 
-#: builtin/describe.c:411
+#: builtin/describe.c:406
 msgid "use any ref"
 msgstr "verwendet alle Referenzen"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:407
 msgid "use any tag, even unannotated"
 msgstr "verwendet jedes Tag, auch nicht-annotierte"
 
-#: builtin/describe.c:413
+#: builtin/describe.c:408
 msgid "always use long format"
 msgstr "verwendet immer langes Format"
 
-#: builtin/describe.c:414
+#: builtin/describe.c:409
 msgid "only follow first parent"
 msgstr "folgt nur erstem Elternteil"
 
-#: builtin/describe.c:417
+#: builtin/describe.c:412
 msgid "only output exact matches"
 msgstr "gibt nur exakte Übereinstimmungen aus"
 
-#: builtin/describe.c:419
+#: builtin/describe.c:414
 msgid "consider <n> most recent tags (default: 10)"
 msgstr "betrachtet die jüngsten <n> Tags (Standard: 10)"
 
-#: builtin/describe.c:421
+#: builtin/describe.c:416
 msgid "only consider tags matching <pattern>"
 msgstr "betrachtet nur Tags die <Muster> entsprechen"
 
-#: builtin/describe.c:423 builtin/name-rev.c:321
+#: builtin/describe.c:418 builtin/name-rev.c:321
 msgid "show abbreviated commit object as fallback"
 msgstr "zeigt gekürztes Commit-Objekt, wenn sonst nichts zutrifft"
 
-#: builtin/describe.c:424
+#: builtin/describe.c:419
 msgid "mark"
 msgstr "Kennzeichen"
 
-#: builtin/describe.c:425
+#: builtin/describe.c:420
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr ""
 "fügt <Kennzeichen> bei geändertem Arbeitsverzeichnis hinzu (Standard: \"-"
 "dirty\")"
 
-#: builtin/describe.c:443
+#: builtin/describe.c:438
 msgid "--long is incompatible with --abbrev=0"
 msgstr "Die Optionen --long und --abbrev=0 sind inkompatibel."
 
-#: builtin/describe.c:469
+#: builtin/describe.c:464
 msgid "No names found, cannot describe anything."
 msgstr "Keine Namen gefunden, kann nichts beschreiben."
 
-#: builtin/describe.c:489
+#: builtin/describe.c:484
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "Die Option --dirty kann nicht mit Commits verwendet werden."
 
@@ -5195,7 +5110,8 @@ msgstr "erlaubt Aktualisierung der \"HEAD\"-Referenz"
 
 #: builtin/fetch.c:99
 msgid "deepen history of shallow clone"
-msgstr "vertieft die Historie eines Klons mit unvollständiger Historie (shallow)"
+msgstr ""
+"vertieft die Historie eines Klons mit unvollständiger Historie (shallow)"
 
 #: builtin/fetch.c:101
 msgid "convert to a complete repository"
@@ -5285,8 +5201,9 @@ msgstr "%s hat nicht alle erforderlichen Objekte gesendet\n"
 #: builtin/fetch.c:579
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
-msgstr "%s wurde zurückgewiesen, da Ursprungs-Commits von Repositories"
-"mit unvollständiger Historie (shallow) nicht aktualisiert werden dürfen."
+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
 #, c-format
@@ -5352,7 +5269,7 @@ msgstr "Fordere an von %s\n"
 msgid "Could not fetch %s"
 msgstr "Konnte nicht von %s anfordern"
 
-#: builtin/fetch.c:1036
+#: builtin/fetch.c:1035
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -5373,8 +5290,8 @@ msgstr ""
 #: builtin/fetch.c:1109
 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."
+"Die Option --unshallow kann nicht in einem Repository mit unvollständiger "
+"Historie verwendet werden."
 
 #: builtin/fetch.c:1132
 msgid "fetch --all does not take a repository argument"
@@ -5400,10 +5317,10 @@ msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
 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:702
-#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446
-#: parse-options.h:135 parse-options.h:242
+#: 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
+#: parse-options.h:132 parse-options.h:239
 msgid "n"
 msgstr "Anzahl"
 
@@ -5467,6 +5384,14 @@ msgstr "Schüssel"
 msgid "field name to sort on"
 msgstr "sortiere nach diesem Feld"
 
+#: builtin/fsck.c:147 builtin/prune.c:172
+msgid "Checking connectivity"
+msgstr "Prüfe Konnektivität"
+
+#: builtin/fsck.c:544
+msgid "Checking object directories"
+msgstr "Prüfe Objekt-Verzeichnisse"
+
 #: builtin/fsck.c:607
 msgid "git fsck [options] [<object>...]"
 msgstr "git fsck [Optionen] [<Objekt>...]"
@@ -5511,50 +5436,62 @@ msgstr "schreibt unreferenzierte Objekte nach .git/lost-found"
 msgid "show progress"
 msgstr "zeigt Fortschrittsanzeige"
 
+#: builtin/fsck.c:673
+msgid "Checking objects"
+msgstr "Prüfe Objekte"
+
 #: builtin/gc.c:24
 msgid "git gc [options]"
 msgstr "git gc [Optionen]"
 
-#: builtin/gc.c:80
+#: builtin/gc.c:90
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "Ungültiger %s: '%s'"
 
-#: builtin/gc.c:107
+#: builtin/gc.c:117
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "zu langes Objekt-Verzeichnis %.*s"
 
-#: builtin/gc.c:262
+#: builtin/gc.c:273
 msgid "prune unreferenced objects"
 msgstr "entfernt unreferenzierte Objekte"
 
-#: builtin/gc.c:264
+#: builtin/gc.c:275
 msgid "be more thorough (increased runtime)"
 msgstr "mehr Gründlichkeit (erhöht Laufzeit)"
 
-#: builtin/gc.c:265
+#: builtin/gc.c:276
 msgid "enable auto-gc mode"
 msgstr "aktiviert \"auto-gc\" Modus"
 
-#: builtin/gc.c:266
+#: builtin/gc.c:277
 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:306
+#: builtin/gc.c:318
 #, c-format
-msgid ""
-"Auto packing the repository for optimum performance. You may also\n"
-"run \"git gc\" manually. See \"git help gc\" for more information.\n"
+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
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
 msgstr ""
-"Die Datenbank des Repositories wird für eine optimale Performance\n"
-"komprimiert. Sie können auch \"git gc\" manuell ausführen.\n"
-"Siehe \"git help gc\" für weitere Informationen.\n"
+"Die Datenbank des Projektarchivs wird für eine optimale Performance "
+"komprimiert.\n"
 
-#. be quiet on --auto
-#: builtin/gc.c:316
+#: builtin/gc.c:321
+#, 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
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5562,7 +5499,7 @@ msgstr ""
 "\"git gc\" wird bereits auf Maschine '%s' pid %<PRIuMAX> ausgeführt\n"
 "(benutzen Sie --force falls nicht)"
 
-#: builtin/gc.c:341
+#: builtin/gc.c:361
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -5593,220 +5530,220 @@ msgstr "konnte \"Tree\"-Objekt (%s) nicht lesen"
 msgid "unable to grep from object of type %s"
 msgstr "kann \"grep\" nicht mit Objekten des Typs %s durchführen"
 
-#: builtin/grep.c:551
+#: builtin/grep.c:549
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "Schalter '%c' erwartet einen numerischen Wert"
 
-#: builtin/grep.c:568
+#: builtin/grep.c:566
 #, c-format
 msgid "cannot open '%s'"
 msgstr "kann '%s' nicht öffnen"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:640
 msgid "search in index instead of in the work tree"
 msgstr "sucht in der Staging-Area anstatt im Arbeitsverzeichnis"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:642
 msgid "find in contents not managed by git"
 msgstr "findet auch in Inhalten, die nicht von Git verwaltet werden"
 
-#: builtin/grep.c:646
+#: builtin/grep.c:644
 msgid "search in both tracked and untracked files"
 msgstr "sucht in beobachteten und unbeobachteten Dateien"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:646
 msgid "search also in ignored files"
 msgstr "sucht auch in ignorierten Dateien"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:649
 msgid "show non-matching lines"
 msgstr "zeigt Zeilen ohne Übereinstimmungen"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:651
 msgid "case insensitive matching"
 msgstr "findet Übereinstimmungen unabhängig von Groß- und Kleinschreibung"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:653
 msgid "match patterns only at word boundaries"
 msgstr "sucht nur ganze Wörter"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:655
 msgid "process binary files as text"
 msgstr "verarbeitet binäre Dateien als Text"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:657
 msgid "don't match patterns in binary files"
 msgstr "findet keine Muster in Binärdateien"
 
-#: builtin/grep.c:662
+#: builtin/grep.c:660
 msgid "process binary files with textconv filters"
 msgstr "verarbeitet binäre Dateien mit \"textconv\"-Filtern"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:662
 msgid "descend at most <depth> levels"
 msgstr "durchläuft höchstens <Tiefe> Ebenen"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:666
 msgid "use extended POSIX regular expressions"
 msgstr "verwendet erweiterte reguläre Ausdrücke aus POSIX"
 
-#: builtin/grep.c:671
+#: builtin/grep.c:669
 msgid "use basic POSIX regular expressions (default)"
 msgstr "verwendet grundlegende reguläre Ausdrücke aus POSIX (Standard)"
 
-#: builtin/grep.c:674
+#: builtin/grep.c:672
 msgid "interpret patterns as fixed strings"
 msgstr "interpretiert Muster als feste Zeichenketten"
 
-#: builtin/grep.c:677
+#: builtin/grep.c:675
 msgid "use Perl-compatible regular expressions"
 msgstr "verwendet Perl-kompatible reguläre Ausdrücke"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:678
 msgid "show line numbers"
 msgstr "zeigt Zeilennummern"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:679
 msgid "don't show filenames"
 msgstr "zeigt keine Dateinamen"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:680
 msgid "show filenames"
 msgstr "zeigt Dateinamen"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:682
 msgid "show filenames relative to top directory"
 msgstr "zeigt Dateinamen relativ zum Projektverzeichnis"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:684
 msgid "show only filenames instead of matching lines"
 msgstr "zeigt nur Dateinamen anstatt übereinstimmende Zeilen"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:686
 msgid "synonym for --files-with-matches"
 msgstr "Synonym für --files-with-matches"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:689
 msgid "show only the names of files without match"
 msgstr "zeigt nur die Dateinamen ohne Übereinstimmungen"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:691
 msgid "print NUL after filenames"
 msgstr "gibt NUL-Zeichen nach Dateinamen aus"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:693
 msgid "show the number of matches instead of matching lines"
 msgstr "zeigt, anstatt der Zeilen, die Anzahl der übereinstimmenden Zeilen"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:694
 msgid "highlight matches"
 msgstr "hebt Übereinstimmungen hervor"
 
-#: builtin/grep.c:698
+#: builtin/grep.c:696
 msgid "print empty line between matches from different files"
 msgstr ""
 "gibt eine Leerzeile zwischen Übereinstimmungen in verschiedenen Dateien aus"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:698
 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:703
+#: builtin/grep.c:701
 msgid "show <n> context lines before and after matches"
 msgstr "zeigt <n> Zeilen vor und nach den Übereinstimmungen an"
 
-#: builtin/grep.c:706
+#: builtin/grep.c:704
 msgid "show <n> context lines before matches"
 msgstr "zeigt <n> Zeilen vor den Übereinstimmungen an"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:706
 msgid "show <n> context lines after matches"
 msgstr "zeigt <n> Zeilen nach den Übereinstimmungen an"
 
-#: builtin/grep.c:709
+#: builtin/grep.c:707
 msgid "shortcut for -C NUM"
 msgstr "Kurzform für -C NUM"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:710
 msgid "show a line with the function name before matches"
 msgstr "zeigt eine Zeile mit dem Funktionsnamen vor Übereinstimmungen an"
 
-#: builtin/grep.c:714
+#: builtin/grep.c:712
 msgid "show the surrounding function"
 msgstr "zeigt die umgebende Funktion an"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:715
 msgid "read patterns from file"
 msgstr "liest Muster von einer Datei"
 
-#: builtin/grep.c:719
+#: builtin/grep.c:717
 msgid "match <pattern>"
 msgstr "findet <Muster>"
 
-#: builtin/grep.c:721
+#: builtin/grep.c:719
 msgid "combine patterns specified with -e"
 msgstr "kombiniert Muster, die mit -e angegeben wurden"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:731
 msgid "indicate hit with exit status without output"
 msgstr "zeigt Übereinstimmungen nur durch Beendigungsstatus an"
 
-#: builtin/grep.c:735
+#: builtin/grep.c:733
 msgid "show only matches from files that match all patterns"
 msgstr "zeigt nur Übereinstimmungen von Dateien, die allen Mustern entsprechen"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:735
 msgid "show parse tree for grep expression"
 msgstr "zeigt geparstes Verzeichnis für \"grep\"-Ausdruck"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:739
 msgid "pager"
 msgstr "Anzeigeprogramm"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:739
 msgid "show matching files in the pager"
 msgstr "zeigt Dateien mit Übereinstimmungen im Anzeigeprogramm"
 
-#: builtin/grep.c:744
+#: builtin/grep.c:742
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "erlaubt den Aufruf von grep(1) (von dieser Programmversion ignoriert)"
 
-#: builtin/grep.c:745 builtin/show-ref.c:187
+#: builtin/grep.c:743 builtin/show-ref.c:187
 msgid "show usage"
 msgstr "zeigt Verwendung"
 
-#: builtin/grep.c:812
+#: builtin/grep.c:810
 msgid "no pattern given."
 msgstr "keine Muster angegeben"
 
-#: builtin/grep.c:870
+#: builtin/grep.c:868
 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:893
+#: builtin/grep.c:891
 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:898
+#: builtin/grep.c:896
 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:901
+#: builtin/grep.c:899
 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:909
+#: builtin/grep.c:907
 msgid "both --cached and trees are given."
 msgstr "Die Option --cached kann nicht mit \"Tree\"-Objekten verwendet werden."
 
@@ -5822,7 +5759,7 @@ msgstr ""
 msgid "git hash-object  --stdin-paths < <list-of-paths>"
 msgstr "git hash-object  --stdin-paths < <Liste-von-Pfaden>"
 
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:72 builtin/tag.c:521
 msgid "type"
 msgstr "Art"
 
@@ -6062,8 +5999,8 @@ msgstr "ernsthafte Inkonsistenz nach Dekomprimierung"
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "SHA1 KOLLISION MIT %s GEFUNDEN !"
 
-#: builtin/index-pack.c:669 builtin/pack-objects.c:171
-#: builtin/pack-objects.c:263
+#: builtin/index-pack.c:669 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
 #, c-format
 msgid "unable to read %s"
 msgstr "kann %s nicht lesen"
@@ -6136,7 +6073,7 @@ msgstr "Fehler beim Auflösen der Unterschiede"
 #: builtin/index-pack.c:1138
 #, c-format
 msgid "completed with %d local objects"
-msgstr "vervollständigt mit %d lokalen Objekten"
+msgstr "abgeschlossen mit %d lokalen Objekten"
 
 #: builtin/index-pack.c:1148
 #, c-format
@@ -6329,33 +6266,31 @@ msgstr "kann nicht mit Dateityp %d umgehen"
 msgid "unable to move %s to %s"
 msgstr "Konnte %s nicht nach %s verschieben"
 
-#.
-#. * TRANSLATORS: The first '%s' is either "Reinitialized
-#. * existing" or "Initialized empty", the second " shared" or
-#. * "", and the last '%s%s' is the verbatim directory name.
-#.
-#: builtin/init-db.c:420
+#. 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 Git-Repository in %s%s\n"
 
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
 msgid "Reinitialized existing"
 msgstr "Reinitialisierte existierendes"
 
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
 msgid "Initialized empty"
 msgstr "Initialisierte leeres"
 
-#: builtin/init-db.c:422
+#: builtin/init-db.c:420
 msgid " shared"
 msgstr " gemeinsames"
 
-#: builtin/init-db.c:441
+#: builtin/init-db.c:439
 msgid "cannot tell cwd"
 msgstr "kann aktuelles Arbeitsverzeichnis nicht ermitteln"
 
-#: builtin/init-db.c:467
+#: builtin/init-db.c:465
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared"
 "[=<permissions>]] [directory]"
@@ -6363,29 +6298,29 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<Vorlagenverzeichnis>] [--shared"
 "[=<Berechtigungen>]] [Verzeichnis]"
 
-#: builtin/init-db.c:490
+#: builtin/init-db.c:488
 msgid "permissions"
 msgstr "Berechtigungen"
 
-#: builtin/init-db.c:491
+#: builtin/init-db.c:489
 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:493 builtin/prune-packed.c:79 builtin/repack.c:155
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
 msgid "be quiet"
 msgstr "weniger Ausgaben"
 
-#: builtin/init-db.c:525 builtin/init-db.c:530
+#: builtin/init-db.c:523 builtin/init-db.c:528
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "kann Verzeichnis %s nicht erstellen"
 
-#: builtin/init-db.c:534
+#: builtin/init-db.c:532
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "kann nicht in Verzeichnis %s wechseln"
 
-#: builtin/init-db.c:556
+#: builtin/init-db.c:554
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -6394,11 +6329,11 @@ msgstr ""
 "%s (oder --work-tree=<Verzeichnis>) nicht erlaubt ohne Spezifizierung von %s "
 "(oder --git-dir=<Verzeichnis>)"
 
-#: builtin/init-db.c:580
+#: builtin/init-db.c:578
 msgid "Cannot access current working directory"
 msgstr "Kann nicht auf aktuelles Arbeitsverzeichnis zugreifen."
 
-#: builtin/init-db.c:587
+#: builtin/init-db.c:585
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Kann nicht auf Arbeitsverzeichnis '%s' zugreifen."
@@ -6666,102 +6601,102 @@ msgstr ""
 msgid "Unknown commit %s"
 msgstr "Unbekannter Commit %s"
 
-#: builtin/ls-files.c:398
+#: builtin/ls-files.c:401
 msgid "git ls-files [options] [<file>...]"
 msgstr "git ls-files [Optionen] [<Datei>...]"
 
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:458
 msgid "identify the file status with tags"
 msgstr "zeigt den Dateistatus mit Tags"
 
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:460
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr ""
 "verwendet Kleinbuchstaben für Dateien mit 'assume unchanged' Markierung"
 
-#: builtin/ls-files.c:459
+#: builtin/ls-files.c:462
 msgid "show cached files in the output (default)"
 msgstr "zeigt zwischengespeicherten Dateien in der Ausgabe an (Standard)"
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:464
 msgid "show deleted files in the output"
 msgstr "zeigt entfernte Dateien in der Ausgabe an"
 
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:466
 msgid "show modified files in the output"
 msgstr "zeigt geänderte Dateien in der Ausgabe an"
 
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:468
 msgid "show other files in the output"
 msgstr "zeigt sonstige Dateien in der Ausgabe an"
 
-#: builtin/ls-files.c:467
+#: builtin/ls-files.c:470
 msgid "show ignored files in the output"
 msgstr "zeigt ignorierte Dateien in der Ausgabe an"
 
-#: builtin/ls-files.c:470
+#: builtin/ls-files.c:473
 msgid "show staged contents' object name in the output"
 msgstr ""
 "zeigt Objektnamen von Inhalten, die zum Commit vorgemerkt sind, in der "
 "Ausgabe an"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:475
 msgid "show files on the filesystem that need to be removed"
 msgstr "zeigt Dateien im Dateisystem, die gelöscht werden müssen, an"
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:477
 msgid "show 'other' directories' name only"
 msgstr "zeigt nur Namen von 'sonstigen' Verzeichnissen an"
 
-#: builtin/ls-files.c:477
+#: builtin/ls-files.c:480
 msgid "don't show empty directories"
 msgstr "zeigt keine leeren Verzeichnisse an"
 
-#: builtin/ls-files.c:480
+#: builtin/ls-files.c:483
 msgid "show unmerged files in the output"
 msgstr "zeigt nicht zusammengeführte Dateien in der Ausgabe an"
 
-#: builtin/ls-files.c:482
+#: builtin/ls-files.c:485
 msgid "show resolve-undo information"
 msgstr "zeigt 'resolve-undo' Informationen an"
 
-#: builtin/ls-files.c:484
+#: builtin/ls-files.c:487
 msgid "skip files matching pattern"
 msgstr "lässt Dateien aus, die einem Muster entsprechen"
 
-#: builtin/ls-files.c:487
+#: builtin/ls-files.c:490
 msgid "exclude patterns are read from <file>"
 msgstr "schließt Muster, gelesen von <Datei>, aus"
 
-#: builtin/ls-files.c:490
+#: builtin/ls-files.c:493
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "liest zusätzliche pro-Verzeichnis Auschlussmuster aus <Datei>"
 
-#: builtin/ls-files.c:492
+#: builtin/ls-files.c:495
 msgid "add the standard git exclusions"
 msgstr "fügt die standardmäßigen Git-Ausschlüsse hinzu"
 
-#: builtin/ls-files.c:495
+#: builtin/ls-files.c:498
 msgid "make the output relative to the project top directory"
 msgstr "Ausgabe relativ zum Projektverzeichnis"
 
-#: builtin/ls-files.c:498
+#: builtin/ls-files.c:501
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr ""
 "behandle es als Fehler, wenn sich eine <Datei> nicht in der Staging-Area "
 "befindet"
 
-#: builtin/ls-files.c:499
+#: builtin/ls-files.c:502
 msgid "tree-ish"
 msgstr "Commit-Referenz"
 
-#: builtin/ls-files.c:500
+#: builtin/ls-files.c:503
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 "gibt vor, dass Pfade, die seit <Commit-Referenz> gelöscht wurden, immer noch "
 "vorhanden sind"
 
-#: builtin/ls-files.c:502
+#: builtin/ls-files.c:505
 msgid "show debugging data"
 msgstr "zeigt Ausgaben zur Fehlersuche an"
 
@@ -6876,7 +6811,7 @@ msgstr "bricht ab, wenn kein Vorspulen möglich ist"
 msgid "Verify that the named commit has a valid GPG signature"
 msgstr "überprüft den genannten Commit auf eine gültige GPG-Signatur"
 
-#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89
+#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
 msgid "strategy"
 msgstr "Strategie"
 
@@ -6950,37 +6885,37 @@ msgstr "'%s' zeigt auf keinen Commit"
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Ungültiger branch.%s.mergeoptions String: %s"
 
-#: builtin/merge.c:650
+#: builtin/merge.c:653
 msgid "git write-tree failed to write a tree"
 msgstr "\"git write-tree\" schlug beim Schreiben eines \"Tree\"-Objektes fehl"
 
-#: builtin/merge.c:678
+#: builtin/merge.c:681
 msgid "Not handling anything other than two heads merge."
 msgstr "Es wird nur der Merge von zwei Branches behandelt."
 
-#: builtin/merge.c:692
+#: builtin/merge.c:695
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Unbekannte Option für merge-recursive: -X%s"
 
-#: builtin/merge.c:706
+#: builtin/merge.c:709
 #, c-format
 msgid "unable to write %s"
 msgstr "konnte %s nicht schreiben"
 
-#: builtin/merge.c:795
+#: builtin/merge.c:798
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "konnte nicht von '%s' lesen"
 
-#: builtin/merge.c:804
+#: builtin/merge.c:807
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 "Merge wurde nicht committet; benutzen Sie 'git commit' um den Merge "
 "abzuschließen.\n"
 
-#: builtin/merge.c:810
+#: builtin/merge.c:813
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -6996,50 +6931,50 @@ msgstr ""
 "Zeilen beginnend mit '%c' werden ignoriert, und eine leere Beschreibung\n"
 "bricht den Commit ab.\n"
 
-#: builtin/merge.c:834
+#: builtin/merge.c:837
 msgid "Empty commit message."
 msgstr "Leere Commit-Beschreibung"
 
-#: builtin/merge.c:846
+#: builtin/merge.c:849
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Wunderbar.\n"
 
-#: builtin/merge.c:911
+#: builtin/merge.c:914
 #, 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:927
+#: builtin/merge.c:930
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "'%s' ist kein Commit"
 
-#: builtin/merge.c:968
+#: builtin/merge.c:971
 msgid "No current branch."
 msgstr "Sie befinden sich auf keinem Branch."
 
-#: builtin/merge.c:970
+#: builtin/merge.c:973
 msgid "No remote for the current branch."
 msgstr "Kein Remote-Repository für den aktuellen Branch."
 
-#: builtin/merge.c:972
+#: builtin/merge.c:975
 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:977
+#: builtin/merge.c:980
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Kein Remote-Tracking-Branch für %s von %s"
 
-#: builtin/merge.c:1133
+#: builtin/merge.c:1136
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Es gibt keinen Merge zum Abbrechen (vermisse MERGE_HEAD)"
 
-#: builtin/merge.c:1149 git-pull.sh:31
+#: builtin/merge.c:1152 git-pull.sh:31
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -7047,11 +6982,11 @@ msgstr ""
 "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:1152 git-pull.sh:34
+#: builtin/merge.c:1155 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:1156
+#: builtin/merge.c:1159
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -7059,106 +6994,105 @@ msgstr ""
 "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:1159
+#: builtin/merge.c:1162
 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:1168
+#: builtin/merge.c:1171
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Sie können --squash nicht mit --no-ff kombinieren."
 
-#: builtin/merge.c:1177
+#: builtin/merge.c:1180
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Kein Commit angegeben und merge.defaultToUpstream ist nicht gesetzt."
 
-#: builtin/merge.c:1209
+#: builtin/merge.c:1212
 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:1212
+#: builtin/merge.c:1215
 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:1214
+#: builtin/merge.c:1217
 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:1219
+#: builtin/merge.c:1222
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - nichts was wir zusammenführen können"
 
-#: builtin/merge.c:1270
+#: builtin/merge.c:1273
 #, 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:1273
+#: builtin/merge.c:1276
 #, 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."
 
-#. 'N'
-#: builtin/merge.c:1276
+#: builtin/merge.c:1279
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Commit %s hat keine GPG-Signatur."
 
-#: builtin/merge.c:1279
+#: builtin/merge.c:1282
 #, 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:1363
+#: builtin/merge.c:1366
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Aktualisiere %s..%s\n"
 
-#: builtin/merge.c:1402
+#: builtin/merge.c:1405
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Probiere wirklich trivialen \"in-index\"-Merge...\n"
 
-#: builtin/merge.c:1409
+#: builtin/merge.c:1412
 #, c-format
 msgid "Nope.\n"
 msgstr "Nein.\n"
 
-#: builtin/merge.c:1441
+#: builtin/merge.c:1444
 msgid "Not possible to fast-forward, aborting."
 msgstr "Vorspulen nicht möglich, breche ab."
 
-#: builtin/merge.c:1464 builtin/merge.c:1543
+#: builtin/merge.c:1467 builtin/merge.c:1546
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Rücklauf des Verzeichnisses bis zum Ursprung...\n"
 
-#: builtin/merge.c:1468
+#: builtin/merge.c:1471
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Probiere Merge-Strategie %s...\n"
 
-#: builtin/merge.c:1534
+#: builtin/merge.c:1537
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Keine Merge-Strategie behandelt diesen Merge.\n"
 
-#: builtin/merge.c:1536
+#: builtin/merge.c:1539
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Merge mit Strategie %s fehlgeschlagen.\n"
 
-#: builtin/merge.c:1545
+#: builtin/merge.c:1548
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Benutzen Sie \"%s\" um die Auflösung per Hand vorzubereiten.\n"
 
-#: builtin/merge.c:1557
+#: builtin/merge.c:1560
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -7244,19 +7178,19 @@ msgstr "keine Warnung bei Konflikten"
 msgid "set labels for file1/orig_file/file2"
 msgstr "setzt Beschriftung für Datei1/orig_Datei/Datei2"
 
-#: builtin/mktree.c:67
+#: builtin/mktree.c:64
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
 
-#: builtin/mktree.c:153
+#: builtin/mktree.c:150
 msgid "input is NUL terminated"
 msgstr "Eingabe ist durch NUL-Zeichen abgeschlossen"
 
-#: builtin/mktree.c:154 builtin/write-tree.c:24
+#: builtin/mktree.c:151 builtin/write-tree.c:24
 msgid "allow missing objects"
 msgstr "erlaubt fehlende Objekte"
 
-#: builtin/mktree.c:155
+#: builtin/mktree.c:152
 msgid "allow creation of more than one tree"
 msgstr "erlaubt die Erstellung von mehr als einem \"Tree\"-Objekt"
 
@@ -7306,46 +7240,46 @@ msgstr ""
 msgid "Huh? %.*s is in index?"
 msgstr "Huh? %.*s ist zum Commit vorgemerkt?"
 
-#: builtin/mv.c:168
+#: builtin/mv.c:169
 msgid "source directory is empty"
 msgstr "Quellverzeichnis ist leer"
 
-#: builtin/mv.c:200
+#: builtin/mv.c:205
 msgid "not under version control"
 msgstr "nicht unter Versionskontrolle"
 
-#: builtin/mv.c:202
+#: builtin/mv.c:207
 msgid "destination exists"
 msgstr "Ziel existiert bereits"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:215
 #, c-format
 msgid "overwriting '%s'"
 msgstr "überschreibe '%s'"
 
-#: builtin/mv.c:213
+#: builtin/mv.c:218
 msgid "Cannot overwrite"
 msgstr "Kann nicht überschreiben"
 
-#: builtin/mv.c:216
+#: builtin/mv.c:221
 msgid "multiple sources for the same target"
 msgstr "mehrere Quellen für das selbe Ziel"
 
-#: builtin/mv.c:218
+#: builtin/mv.c:223
 msgid "destination directory does not exist"
 msgstr "Zielverzeichnis existiert nicht"
 
-#: builtin/mv.c:233
+#: builtin/mv.c:243
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, Quelle=%s, Ziel=%s"
 
-#: builtin/mv.c:243
+#: builtin/mv.c:253
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "Benenne %s nach %s um\n"
 
-#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "Umbenennung von '%s' fehlgeschlagen"
@@ -7516,7 +7450,7 @@ msgstr "Konnte Ausgabe von 'show' nicht lesen."
 msgid "failed to finish 'show' for object '%s'"
 msgstr "konnte 'show' für Objekt '%s' nicht abschließen"
 
-#: builtin/notes.c:167 builtin/tag.c:341
+#: builtin/notes.c:167 builtin/tag.c:373
 #, c-format
 msgid "could not create file '%s'"
 msgstr "konnte Datei '%s' nicht erstellen"
@@ -7526,7 +7460,7 @@ msgid "Please supply the note contents using either -m or -F option"
 msgstr ""
 "Bitte liefern Sie den Notiz-Inhalt unter Verwendung der Option -m oder -F."
 
-#: builtin/notes.c:207 builtin/notes.c:844
+#: builtin/notes.c:207 builtin/notes.c:848
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Entferne Notiz für Objekt %s\n"
@@ -7540,20 +7474,20 @@ msgstr "Konnte Notiz-Objekt nicht schreiben"
 msgid "The note contents has been left in %s"
 msgstr "Die Notiz-Inhalte wurden in %s belassen"
 
-#: builtin/notes.c:248 builtin/tag.c:537
+#: builtin/notes.c:248 builtin/tag.c:604
 #, c-format
 msgid "cannot read '%s'"
 msgstr "kann '%s' nicht lesen"
 
-#: builtin/notes.c:250 builtin/tag.c:540
+#: builtin/notes.c:250 builtin/tag.c:607
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "konnte '%s' nicht öffnen oder lesen"
 
-#: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318
-#: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515
-#: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637
-#: builtin/notes.c:839 builtin/tag.c:553
+#: 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
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Konnte '%s' nicht als gültige Referenz auflösen."
@@ -7563,53 +7497,58 @@ msgstr "Konnte '%s' nicht als gültige Referenz auflösen."
 msgid "Failed to read object '%s'."
 msgstr "Fehler beim Lesen des Objektes '%s'."
 
-#: builtin/notes.c:312
+#: builtin/notes.c:276
+#, c-format
+msgid "Cannot read note data from non-blob object '%s'."
+msgstr "Kann Notiz-Daten nicht von Nicht-Blob Objekt '%s' lesen."
+
+#: builtin/notes.c:316
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "Fehlerhafte Eingabezeile: '%s'."
 
-#: builtin/notes.c:327
+#: builtin/notes.c:331
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "Fehler beim Kopieren der Notizen von '%s' nach '%s'"
 
-#: builtin/notes.c:371 builtin/notes.c:425 builtin/notes.c:498
-#: builtin/notes.c:510 builtin/notes.c:583 builtin/notes.c:630
-#: builtin/notes.c:904
+#: 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 "zu viele Parameter"
 
-#: builtin/notes.c:384 builtin/notes.c:643
+#: builtin/notes.c:388 builtin/notes.c:647
 #, c-format
 msgid "No note found for object %s."
 msgstr "Kein Notiz für Objekt %s gefunden."
 
-#: builtin/notes.c:406 builtin/notes.c:563
+#: builtin/notes.c:410 builtin/notes.c:567
 msgid "note contents as a string"
 msgstr "Notizinhalte als Zeichenkette"
 
-#: builtin/notes.c:409 builtin/notes.c:566
+#: builtin/notes.c:413 builtin/notes.c:570
 msgid "note contents in a file"
 msgstr "Notizinhalte in einer Datei"
 
-#: builtin/notes.c:411 builtin/notes.c:414 builtin/notes.c:568
-#: builtin/notes.c:571 builtin/tag.c:474
+#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
+#: builtin/notes.c:575 builtin/tag.c:539
 msgid "object"
 msgstr "Objekt"
 
-#: builtin/notes.c:412 builtin/notes.c:569
+#: builtin/notes.c:416 builtin/notes.c:573
 msgid "reuse and edit specified note object"
 msgstr "Wiederverwendung und Bearbeitung des angegebenen Notiz-Objektes"
 
-#: builtin/notes.c:415 builtin/notes.c:572
+#: builtin/notes.c:419 builtin/notes.c:576
 msgid "reuse specified note object"
 msgstr "Wiederverwendung des angegebenen Notiz-Objektes"
 
-#: builtin/notes.c:417 builtin/notes.c:485
+#: builtin/notes.c:421 builtin/notes.c:489
 msgid "replace existing notes"
 msgstr "ersetzt existierende Notizen"
 
-#: builtin/notes.c:451
+#: builtin/notes.c:455
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7618,26 +7557,26 @@ msgstr ""
 "Konnte Notizen nicht hinzufügen. Existierende Notizen für Objekt %s "
 "gefunden. Verwenden Sie '-f' um die existierenden Notizen zu überschreiben."
 
-#: builtin/notes.c:456 builtin/notes.c:533
+#: builtin/notes.c:460 builtin/notes.c:537
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Überschreibe existierende Notizen für Objekt %s\n"
 
-#: builtin/notes.c:486
+#: builtin/notes.c:490
 msgid "read objects from stdin"
 msgstr "liest Objekte von der Standard-Eingabe"
 
-#: builtin/notes.c:488
+#: builtin/notes.c:492
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr ""
 "lädt Konfiguration für <Kommando> beim Umschreiben von Versionen (impliziert "
 "--stdin)"
 
-#: builtin/notes.c:506
+#: builtin/notes.c:510
 msgid "too few parameters"
 msgstr "zu wenig Parameter"
 
-#: builtin/notes.c:527
+#: builtin/notes.c:531
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7646,12 +7585,12 @@ msgstr ""
 "Kann Notizen nicht kopieren. Existierende Notizen für Objekt %s gefunden. "
 "Verwenden Sie '-f' um die existierenden Notizen zu überschreiben."
 
-#: builtin/notes.c:539
+#: builtin/notes.c:543
 #, c-format
 msgid "Missing notes on source object %s. Cannot copy."
 msgstr "Keine Notizen für Quell-Objekt %s. Kopie nicht möglich."
 
-#: builtin/notes.c:588
+#: builtin/notes.c:592
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -7660,15 +7599,15 @@ msgstr ""
 "Die Optionen -m/-F/-c/-C sind für das Unterkommando 'edit' veraltet.\n"
 "Bitte benutzen Sie stattdessen 'git notes add -f -m/-F/-c/-C'.\n"
 
-#: builtin/notes.c:735
+#: builtin/notes.c:739
 msgid "General options"
 msgstr "Allgemeine Optionen"
 
-#: builtin/notes.c:737
+#: builtin/notes.c:741
 msgid "Merge options"
 msgstr "Merge-Optionen"
 
-#: builtin/notes.c:739
+#: builtin/notes.c:743
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -7676,210 +7615,235 @@ msgstr ""
 "löst Konflikte bei Notizen mit der angegebenen Strategie auf (manual/ours/"
 "theirs/union/cat_sort_uniq)"
 
-#: builtin/notes.c:741
+#: builtin/notes.c:745
 msgid "Committing unmerged notes"
 msgstr "trägt nicht zusammengeführte Notizen ein"
 
-#: builtin/notes.c:743
+#: builtin/notes.c:747
 msgid "finalize notes merge by committing unmerged notes"
 msgstr ""
 "schließt Merge von Notizen ab, in dem nicht zusammengeführte Notizen "
 "committet werden"
 
-#: builtin/notes.c:745
+#: builtin/notes.c:749
 msgid "Aborting notes merge resolution"
 msgstr "bricht Konfliktauflösung beim Merge von Notizen ab"
 
-#: builtin/notes.c:747
+#: builtin/notes.c:751
 msgid "abort notes merge"
 msgstr "bricht Merge von Notizen ab"
 
-#: builtin/notes.c:842
+#: builtin/notes.c:846
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "Objekt %s hat keine Notiz\n"
 
-#: builtin/notes.c:854
+#: builtin/notes.c:858
 msgid "attempt to remove non-existent note is not an error"
 msgstr "der Versuch, eine nicht existierende Notiz zu löschen, ist kein Fehler"
 
-#: builtin/notes.c:857
+#: builtin/notes.c:861
 msgid "read object names from the standard input"
 msgstr "liest Objektnamen von der Standard-Eingabe"
 
-#: builtin/notes.c:938
-msgid "notes_ref"
+#: builtin/notes.c:942
+msgid "notes-ref"
 msgstr "Notiz-Referenz"
 
-#: builtin/notes.c:939
+#: builtin/notes.c:943
 msgid "use notes from <notes_ref>"
 msgstr "verwendet Notizen von <Notiz-Referenz>"
 
-#: builtin/notes.c:974 builtin/remote.c:1593
+#: builtin/notes.c:978 builtin/remote.c:1593
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Unbekanntes Unterkommando: %s"
 
-#: builtin/pack-objects.c:23
+#: builtin/pack-objects.c:25
 msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
 msgstr ""
 "git pack-objects --stdout [Optionen...] [< Referenzliste | < Objektliste]"
 
-#: builtin/pack-objects.c:24
+#: builtin/pack-objects.c:26
 msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
 msgstr ""
 "git pack-objects [Optionen...] Basis-Name [< Referenzliste | < Objektliste]"
 
-#: builtin/pack-objects.c:184 builtin/pack-objects.c:187
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
 #, c-format
 msgid "deflate error (%d)"
 msgstr "Fehler beim Komprimieren (%d)"
 
-#: builtin/pack-objects.c:2396
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr "Schreibe Objekte"
+
+#: 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"
+"eine Pack-Datei geschrieben wurden"
+
+#: builtin/pack-objects.c:2174
+msgid "Compressing objects"
+msgstr "Komprimiere Objekte"
+
+#: builtin/pack-objects.c:2530
 #, c-format
 msgid "unsupported index version %s"
 msgstr "Nicht unterstützte Staging-Area-Version %s"
 
-#: builtin/pack-objects.c:2400
+#: builtin/pack-objects.c:2534
 #, c-format
 msgid "bad index version '%s'"
 msgstr "Ungültige Staging-Area-Version '%s'"
 
-#: builtin/pack-objects.c:2423
+#: builtin/pack-objects.c:2557
 #, c-format
 msgid "option %s does not accept negative form"
 msgstr "Option %s akzeptiert keine negative Form"
 
-#: builtin/pack-objects.c:2427
+#: builtin/pack-objects.c:2561
 #, 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:2446
+#: builtin/pack-objects.c:2580
 msgid "do not show progress meter"
 msgstr "zeigt keine Fortschrittsanzeige"
 
-#: builtin/pack-objects.c:2448
+#: builtin/pack-objects.c:2582
 msgid "show progress meter"
 msgstr "zeigt Fortschrittsanzeige"
 
-#: builtin/pack-objects.c:2450
+#: builtin/pack-objects.c:2584
 msgid "show progress meter during object writing phase"
 msgstr "zeigt Forschrittsanzeige während der Phase des Schreibens der Objekte"
 
-#: builtin/pack-objects.c:2453
+#: builtin/pack-objects.c:2587
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "ähnlich zu --all-progress wenn Fortschrittsanzeige darstellt wird"
 
-#: builtin/pack-objects.c:2454
+#: builtin/pack-objects.c:2588
 msgid "version[,offset]"
 msgstr "version[,offset]"
 
-#: builtin/pack-objects.c:2455
+#: builtin/pack-objects.c:2589
 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:2458
+#: builtin/pack-objects.c:2592
 msgid "maximum size of each output pack file"
 msgstr "maximale Größe für jede ausgegebene Paketdatei"
 
-#: builtin/pack-objects.c:2460
+#: builtin/pack-objects.c:2594
 msgid "ignore borrowed objects from alternate object store"
 msgstr "ignoriert geliehene Objekte von alternativem Objektspeicher"
 
-#: builtin/pack-objects.c:2462
+#: builtin/pack-objects.c:2596
 msgid "ignore packed objects"
 msgstr "ignoriert gepackte Objekte"
 
-#: builtin/pack-objects.c:2464
+#: builtin/pack-objects.c:2598
 msgid "limit pack window by objects"
 msgstr "begrenzt Paketfenster durch Objekte"
 
-#: builtin/pack-objects.c:2466
+#: builtin/pack-objects.c:2600
 msgid "limit pack window by memory in addition to object limit"
 msgstr "begrenzt Paketfenster, zusätzlich zur Objektbegrenzung, durch Speicher"
 
-#: builtin/pack-objects.c:2468
+#: builtin/pack-objects.c:2602
 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:2470
+#: builtin/pack-objects.c:2604
 msgid "reuse existing deltas"
 msgstr "verwendet existierende Unterschiede wieder"
 
-#: builtin/pack-objects.c:2472
+#: builtin/pack-objects.c:2606
 msgid "reuse existing objects"
 msgstr "verwendet existierende Objekte wieder"
 
-#: builtin/pack-objects.c:2474
+#: builtin/pack-objects.c:2608
 msgid "use OFS_DELTA objects"
 msgstr "verwendet OFS_DELTA Objekte"
 
-#: builtin/pack-objects.c:2476
+#: builtin/pack-objects.c:2610
 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:2478
+#: builtin/pack-objects.c:2612
 msgid "do not create an empty pack output"
 msgstr "erzeugt keine leeren Pakete"
 
-#: builtin/pack-objects.c:2480
+#: builtin/pack-objects.c:2614
 msgid "read revision arguments from standard input"
 msgstr "liest Argumente bezüglich Commits von der Standard-Eingabe"
 
-#: builtin/pack-objects.c:2482
+#: builtin/pack-objects.c:2616
 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:2485
+#: builtin/pack-objects.c:2619
 msgid "include objects reachable from any reference"
 msgstr "schließt Objekte ein, die von jeder Referenz erreichbar sind"
 
-#: builtin/pack-objects.c:2488
+#: builtin/pack-objects.c:2622
 msgid "include objects referred by reflog entries"
 msgstr ""
 "schließt Objekte ein, die von Einträgen des Reflogs referenziert werden"
 
-#: builtin/pack-objects.c:2491
+#: builtin/pack-objects.c:2625
 msgid "output pack to stdout"
 msgstr "schreibt Paket in die Standard-Ausgabe"
 
-#: builtin/pack-objects.c:2493
+#: builtin/pack-objects.c:2627
 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:2495
+#: builtin/pack-objects.c:2629
 msgid "keep unreachable objects"
 msgstr "behält nicht erreichbare Objekte"
 
-#: builtin/pack-objects.c:2496 parse-options.h:143
+#: builtin/pack-objects.c:2630 parse-options.h:140
 msgid "time"
 msgstr "Zeit"
 
-#: builtin/pack-objects.c:2497
+#: builtin/pack-objects.c:2631
 msgid "unpack unreachable objects newer than <time>"
 msgstr "entpackt nicht erreichbare Objekte, die neuer als <Zeit> sind"
 
-#: builtin/pack-objects.c:2500
+#: builtin/pack-objects.c:2634
 msgid "create thin packs"
 msgstr "erzeugt dünnere Pakete"
 
-#: builtin/pack-objects.c:2502
+#: builtin/pack-objects.c:2636
 msgid "ignore packs that have companion .keep file"
 msgstr "ignoriert Pakete die .keep Dateien haben"
 
-#: builtin/pack-objects.c:2504
+#: builtin/pack-objects.c:2638
 msgid "pack compression level"
 msgstr "Komprimierungsgrad für Paketierung"
 
-#: builtin/pack-objects.c:2506
+#: builtin/pack-objects.c:2640
 msgid "do not hide commits by grafts"
 msgstr "verbirgt keine künstlichen Vorgänger-Commits (\"grafts\")"
 
+#: builtin/pack-objects.c:2642
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr "benutzt Bitmap-Index (falls verfügbar) zur Optimierung der Objektzählung"
+
+#: builtin/pack-objects.c:2644
+msgid "write a bitmap index together with the pack index"
+msgstr "schreibt Bitmap-Index zusammen mit Pack-Index"
+
+#: builtin/pack-objects.c:2723
+msgid "Counting objects"
+msgstr "Zähle Objekte"
+
 #: builtin/pack-refs.c:6
 msgid "git pack-refs [options]"
 msgstr "git pack-refs [Optionen]"
@@ -7896,6 +7860,10 @@ msgstr "entfernt lose Referenzen (Standard)"
 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 "Lösche doppelte Objekte"
+
 #: builtin/prune.c:12
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <Zeit>] [--] [<head>...]"
@@ -7916,15 +7884,15 @@ msgstr "lässt Objekte älter als <Zeit> verfallen"
 msgid "git push [<options>] [<repository> [<refspec>...]]"
 msgstr "git push [<Optionen>] [<Repository> [<Refspec>...]]"
 
-#: builtin/push.c:86
+#: builtin/push.c:85
 msgid "tag shorthand without <tag>"
 msgstr "Kurzschrift für Tag ohne <Tag>"
 
-#: builtin/push.c:96
+#: builtin/push.c:95
 msgid "--delete only accepts plain target ref names"
 msgstr "Die Option --delete akzeptiert nur reine Referenznamen als Ziel."
 
-#: builtin/push.c:141
+#: builtin/push.c:140
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -7933,7 +7901,7 @@ msgstr ""
 "Um eine Variante permanent zu verwenden, siehe push.default in 'git help "
 "config'."
 
-#: builtin/push.c:144
+#: builtin/push.c:143
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -7959,7 +7927,7 @@ msgstr ""
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:159
+#: builtin/push.c:158
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -7974,7 +7942,7 @@ msgstr ""
 "\n"
 "    git push %s HEAD:<Name-des-Remote-Branches>\n"
 
-#: builtin/push.c:173
+#: builtin/push.c:172
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -7988,13 +7956,13 @@ msgstr ""
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:181
+#: builtin/push.c:180
 #, 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:184
+#: builtin/push.c:183
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -8005,11 +7973,11 @@ msgstr ""
 "Branches '%s' ist, ohne anzugeben, was versendet werden soll, um welchen\n"
 "Remote-Branch zu aktualisieren."
 
-#: builtin/push.c:207
+#: builtin/push.c:206
 msgid ""
-"push.default is unset; its implicit value is changing in\n"
+"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 current behavior after the default changes, use:\n"
+"and maintain the traditional behavior, use:\n"
 "\n"
 "  git config --global push.default matching\n"
 "\n"
@@ -8020,7 +7988,7 @@ msgid ""
 "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"
-"In Git 2.0, Git will default to the more conservative 'simple'\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"
@@ -8030,7 +7998,7 @@ msgid ""
 "'current' instead of 'simple' if you sometimes use older versions of Git)"
 msgstr ""
 "'push.default' ist nicht gesetzt; der implizit gesetzte Wert\n"
-"wird in Git 2.0 von 'matching' nach 'simple' geändert. Um diese Meldung zu\n"
+"wurde in Git 2.0 von 'matching' nach 'simple' geändert. Um diese Meldung zu\n"
 "unterdrücken und das aktuelle Verhalten nach Änderung des Standardwertes\n"
 "beizubehalten, benutzen Sie:\n"
 "\n"
@@ -8044,24 +8012,26 @@ msgstr ""
 "Wenn 'push.default' auf den Wert 'matching' gesetzt ist, werden lokale\n"
 "Branches zu den Remote-Branches mit den selben Namen versendet.\n"
 "\n"
-"In Git 2.0 wird das Standardverhalten zu 'simple' geändert. Hierbei wird\n"
+"In Git 2.0 wurde das Standardverhalten zu 'simple' geändert. Hierbei wird\n"
 "der aktuelle Branch zu dem entsprechenden Remote-Branch versendet, den\n"
 "'git pull' zur Aktualisierung des aktuellen Branches verwendet.\n"
 "\n"
 "Führen Sie 'git help config' aus und suchen Sie nach 'push.default' für\n"
 "weitere Informationen.\n"
-"(Der Modus 'simple' wurde in Git 1.7.11 eingeführt. Benutzen Sie den ähnlichen\n"
-"Modus 'current' anstatt 'simple', falls Sie gelegentlich ältere Versionen von\n"
+"(Der Modus 'simple' wurde in Git 1.7.11 eingeführt. Benutzen Sie den "
+"ähnlichen\n"
+"Modus 'current' anstatt 'simple', falls Sie gelegentlich ältere Versionen "
+"von\n"
 "Git benutzen.)"
 
-#: builtin/push.c:274
+#: builtin/push.c:273
 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:281
+#: builtin/push.c:280
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -8075,23 +8045,7 @@ msgstr ""
 "Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n"
 "für weitere Details."
 
-#: builtin/push.c:287
-msgid ""
-"Updates were rejected because a pushed branch tip is behind its remote\n"
-"counterpart. If you did not intend to push that branch, you may want to\n"
-"specify branches to push or set the 'push.default' configuration variable\n"
-"to 'simple', 'current' or 'upstream' to push only the current branch."
-msgstr ""
-"Aktualisierungen wurden zurückgewiesen, weil die Spitze eines versendeten\n"
-"Branches hinter seinem externen Gegenstück zurückgefallen ist. Wenn Sie "
-"nicht\n"
-"beabsichtigt haben, diesen Branch zu versenden, können Sie auch den zu "
-"versendenden\n"
-"Branch spezifizieren oder die Konfigurationsvariable 'push.default' zu "
-"'simple', 'current'\n"
-"oder 'upstream' setzen, um nur den aktuellen Branch zu versenden."
-
-#: builtin/push.c:293
+#: builtin/push.c:286
 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"
@@ -8105,7 +8059,7 @@ msgstr ""
 "Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n"
 "für weitere Details."
 
-#: builtin/push.c:299
+#: builtin/push.c:292
 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"
@@ -8124,13 +8078,13 @@ msgstr ""
 "Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n"
 "für weitere Details."
 
-#: builtin/push.c:306
+#: builtin/push.c:299
 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:309
+#: builtin/push.c:302
 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"
@@ -8140,22 +8094,22 @@ msgstr ""
 "das kein Commit ist, oder es auf ein solches Objekt zeigen lassen, ohne\n"
 "die Option '--force' zu verwenden.\n"
 
-#: builtin/push.c:375
+#: builtin/push.c:361
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Versende nach %s\n"
 
-#: builtin/push.c:379
+#: builtin/push.c:365
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "Fehler beim Versenden einiger Referenzen nach '%s'"
 
-#: builtin/push.c:412
+#: builtin/push.c:395
 #, c-format
 msgid "bad repository '%s'"
 msgstr "ungültiges Repository '%s'"
 
-#: builtin/push.c:413
+#: builtin/push.c:396
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -8177,95 +8131,95 @@ msgstr ""
 "\n"
 "    git push <Name>\n"
 
-#: builtin/push.c:428
+#: builtin/push.c:411
 msgid "--all and --tags are incompatible"
 msgstr "Die Optionen --all und --tags sind inkompatibel."
 
-#: builtin/push.c:429
+#: builtin/push.c:412
 msgid "--all can't be combined with refspecs"
 msgstr "Die Option --all kann nicht mit Refspecs kombiniert werden."
 
-#: builtin/push.c:434
+#: builtin/push.c:417
 msgid "--mirror and --tags are incompatible"
 msgstr "Die Optionen --mirror und --tags sind inkompatibel."
 
-#: builtin/push.c:435
+#: builtin/push.c:418
 msgid "--mirror can't be combined with refspecs"
 msgstr "Die Option --mirror kann nicht mit Refspecs kombiniert werden."
 
-#: builtin/push.c:440
+#: builtin/push.c:423
 msgid "--all and --mirror are incompatible"
 msgstr "Die Optionen --all und --mirror sind inkompatibel."
 
-#: builtin/push.c:500
+#: builtin/push.c:483
 msgid "repository"
 msgstr "Repository"
 
-#: builtin/push.c:501
+#: builtin/push.c:484
 msgid "push all refs"
 msgstr "versendet alle Referenzen"
 
-#: builtin/push.c:502
+#: builtin/push.c:485
 msgid "mirror all refs"
 msgstr "spiegelt alle Referenzen"
 
-#: builtin/push.c:504
+#: builtin/push.c:487
 msgid "delete refs"
 msgstr "löscht Referenzen"
 
-#: builtin/push.c:505
+#: builtin/push.c:488
 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:508
+#: builtin/push.c:491
 msgid "force updates"
 msgstr "erzwingt Aktualisierung"
 
-#: builtin/push.c:510
+#: builtin/push.c:493
 msgid "refname>:<expect"
 msgstr "Referenzname>:<Erwartungswert"
 
-#: builtin/push.c:511
+#: builtin/push.c:494
 msgid "require old value of ref to be at this value"
 msgstr "Referenz muss sich auf dem angegebenen Wert befinden"
 
-#: builtin/push.c:513
+#: builtin/push.c:496
 msgid "check"
 msgstr ""
 
-#: builtin/push.c:514
+#: builtin/push.c:497
 msgid "control recursive pushing of submodules"
 msgstr "steuert rekursiven \"push\" von Submodulen"
 
-#: builtin/push.c:516
+#: builtin/push.c:499
 msgid "use thin pack"
 msgstr "verwendet kleinere Pakete"
 
-#: builtin/push.c:517 builtin/push.c:518
+#: builtin/push.c:500 builtin/push.c:501
 msgid "receive pack program"
 msgstr "'receive pack' Programm"
 
-#: builtin/push.c:519
+#: builtin/push.c:502
 msgid "set upstream for git pull/status"
 msgstr "setzt Upstream für \"git pull/status\""
 
-#: builtin/push.c:522
+#: builtin/push.c:505
 msgid "prune locally removed refs"
 msgstr "entfernt lokal gelöschte Referenzen"
 
-#: builtin/push.c:524
+#: builtin/push.c:507
 msgid "bypass pre-push hook"
 msgstr "umgeht \"pre-push hook\""
 
-#: builtin/push.c:525
+#: builtin/push.c:508
 msgid "push missing but relevant tags"
 msgstr "versendet fehlende, aber relevante Tags"
 
-#: builtin/push.c:535
+#: builtin/push.c:518
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "Die Option --delete ist inkompatibel mit --all, --mirror und --tags."
 
-#: builtin/push.c:537
+#: builtin/push.c:520
 msgid "--delete doesn't make sense without any refs"
 msgstr "Die Option --delete kann nur mit Referenzen verwendet werden."
 
@@ -8865,69 +8819,77 @@ msgstr "Werde keine URLs entfernen, die nicht für \"push\" bestimmt sind"
 msgid "be verbose; must be placed before a subcommand"
 msgstr "erweiterte Ausgaben; muss vor einem Unterkommando angegeben werden"
 
-#: builtin/repack.c:15
+#: builtin/repack.c:16
 msgid "git repack [options]"
 msgstr "git repack [Optionen]"
 
-#: builtin/repack.c:143
+#: builtin/repack.c:156
 msgid "pack everything in a single pack"
 msgstr "packt alles in eine einzige Pack-Datei"
 
-#: builtin/repack.c:145
+#: builtin/repack.c:158
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "genau wie -a, unerreichbare Objekte werden aber nicht gelöscht"
 
-#: builtin/repack.c:148
+#: builtin/repack.c:161
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "entfernt redundante Pakete und führt \"git-prune-packed\" aus"
 
-#: builtin/repack.c:150
+#: builtin/repack.c:163
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "übergibt --no-reuse-delta an git-pack-objects"
 
-#: builtin/repack.c:152
+#: builtin/repack.c:165
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "übergibt --no-reuse-object an git-pack-objects"
 
-#: builtin/repack.c:154
+#: builtin/repack.c:167
 msgid "do not run git-update-server-info"
 msgstr "git-update-server-info nicht ausführen"
 
-#: builtin/repack.c:157
+#: builtin/repack.c:170
 msgid "pass --local to git-pack-objects"
 msgstr "übergibt --local an git-pack-objects"
 
-#: builtin/repack.c:158
+#: builtin/repack.c:172
+msgid "write bitmap index"
+msgstr "schreibt Bitmap-Index"
+
+#: builtin/repack.c:173
 msgid "approxidate"
 msgstr "Datumsangabe"
 
-#: builtin/repack.c:159
+#: builtin/repack.c:174
 msgid "with -A, do not loosen objects older than this"
 msgstr "mit -A, löscht keine Objekte älter als dieses Datum"
 
-#: builtin/repack.c:161
+#: builtin/repack.c:176
 msgid "size of the window used for delta compression"
 msgstr "Größe des Fensters für die Delta-Kompression"
 
-#: builtin/repack.c:162 builtin/repack.c:166
+#: builtin/repack.c:177 builtin/repack.c:181
 msgid "bytes"
 msgstr "Bytes"
 
-#: builtin/repack.c:163
+#: builtin/repack.c:178
 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:165
+#: builtin/repack.c:180
 msgid "limits the maximum delta depth"
 msgstr "limitiert die maximale Delta-Tiefe"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:182
 msgid "maximum size of each packfile"
 msgstr "maximale Größe für jede Paketdatei"
 
-#: builtin/repack.c:343
+#: builtin/repack.c:184
+msgid "repack objects in packs marked with .keep"
+msgstr "packt Objekte um, die sich in mit .keep markierten Pack-Dateien befinden"
+
+#: builtin/repack.c:371
 #, c-format
 msgid "removing '%s' failed"
 msgstr "Löschen von '%s' fehlgeschlagen"
@@ -9020,76 +8982,84 @@ msgstr "Fehler beim Finden des \"Tree\"-Objektes von %s."
 msgid "HEAD is now at %s"
 msgstr "HEAD ist jetzt bei %s"
 
-#: builtin/reset.c:172
+#: builtin/reset.c:182
 #, c-format
 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:262
+#: builtin/reset.c:273
 msgid "be quiet, only report errors"
 msgstr "weniger Ausgaben, meldet nur Fehler"
 
-#: builtin/reset.c:264
+#: builtin/reset.c:275
 msgid "reset HEAD and index"
 msgstr "setzt HEAD und Staging-Area um"
 
-#: builtin/reset.c:265
+#: builtin/reset.c:276
 msgid "reset only HEAD"
 msgstr "setzt nur HEAD um"
 
-#: builtin/reset.c:267 builtin/reset.c:269
+#: builtin/reset.c:278 builtin/reset.c:280
 msgid "reset HEAD, index and working tree"
 msgstr "setzt HEAD, Staging-Area und Arbeitsverzeichnis um"
 
-#: builtin/reset.c:271
+#: builtin/reset.c:282
 msgid "reset HEAD but keep local changes"
 msgstr "setzt HEAD um, behält aber lokale Änderungen"
 
-#: builtin/reset.c:289
+#: builtin/reset.c:285
+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
 #, c-format
 msgid "Failed to resolve '%s' as a valid revision."
 msgstr "Konnte '%s' nicht als gültigen Commit auflösen."
 
-#: builtin/reset.c:292 builtin/reset.c:300
+#: builtin/reset.c:305 builtin/reset.c:313
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: builtin/reset.c:297
+#: builtin/reset.c:310
 #, 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:306
+#: builtin/reset.c:319
 msgid "--patch is incompatible with --{hard,mixed,soft}"
 msgstr "--patch ist inkompatibel mit --{hard,mixed,soft}"
 
-#: builtin/reset.c:315
+#: builtin/reset.c:328
 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:317
+#: builtin/reset.c:330
 #, c-format
 msgid "Cannot do %s reset with paths."
 msgstr "Ein '%s'-Reset mit Pfaden ist nicht möglich."
 
-#: builtin/reset.c:327
+#: builtin/reset.c:340
 #, 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
+msgid "-N can only be used with --mixed"
+msgstr "-N kann nur mit -mixed benutzt werden"
+
+#: builtin/reset.c:361
 msgid "Unstaged changes after reset:"
 msgstr "Nicht zum Commit vorgemerkte Änderungen nach Zurücksetzung:"
 
-#: builtin/reset.c:350
+#: builtin/reset.c:367
 #, c-format
 msgid "Could not reset index file to revision '%s'."
 msgstr "Konnte Staging-Area-Datei nicht zu Commit '%s' setzen."
 
-#: builtin/reset.c:355
+#: builtin/reset.c:372
 msgid "Could not write new index file."
 msgstr "Konnte neue Staging-Area-Datei nicht schreiben."
 
@@ -9107,9 +9077,10 @@ msgstr "stoppt das Parsen nach dem ersten Argument was keine Option ist"
 
 #: builtin/rev-parse.c:369
 msgid "output in stuck long form"
-msgstr "Ausgabe in Langform mit Argumenten an den Optionen (getrennt durch '=')"
+msgstr ""
+"Ausgabe in Langform mit Argumenten an den Optionen (getrennt durch '=')"
 
-#: builtin/rev-parse.c:486
+#: builtin/rev-parse.c:497
 msgid ""
 "git rev-parse --parseopt [options] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -9181,35 +9152,35 @@ msgstr "Option"
 msgid "option for merge strategy"
 msgstr "Option für Merge-Strategie"
 
-#: builtin/revert.c:102
+#: builtin/revert.c:104
 msgid "append commit name"
 msgstr "hängt Commit-Namen an"
 
-#: builtin/revert.c:103
+#: builtin/revert.c:105
 msgid "allow fast-forward"
 msgstr "erlaubt Vorspulen"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:106
 msgid "preserve initially empty commits"
 msgstr "erhält ursprüngliche, leere Commits"
 
-#: builtin/revert.c:105
+#: builtin/revert.c:107
 msgid "allow commits with empty messages"
 msgstr "erlaubt Commits mit leerer Beschreibung"
 
-#: builtin/revert.c:106
+#: builtin/revert.c:108
 msgid "keep redundant, empty commits"
 msgstr "behält redundante, leere Commits"
 
-#: builtin/revert.c:110
+#: builtin/revert.c:112
 msgid "program error"
 msgstr "Programmfehler"
 
-#: builtin/revert.c:195
+#: builtin/revert.c:197
 msgid "revert failed"
 msgstr "\"revert\" fehlgeschlagen"
 
-#: builtin/revert.c:210
+#: builtin/revert.c:212
 msgid "cherry-pick failed"
 msgstr "\"cherry-pick\" fehlgeschlagen"
 
@@ -9491,11 +9462,11 @@ msgstr "löscht symbolische Referenzen"
 msgid "shorten ref output"
 msgstr "verkürzte Ausgabe der Referenzen"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
 msgid "reason"
 msgstr "Grund"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
 msgid "reason of the update"
 msgstr "Grund für die Aktualisierung"
 
@@ -9522,32 +9493,32 @@ msgstr ""
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <Tagname>..."
 
-#: builtin/tag.c:60
+#: builtin/tag.c:67
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "fehlerhaftes Objekt bei '%s'"
 
-#: builtin/tag.c:207
+#: builtin/tag.c:239
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "Tagname zu lang: %.*s..."
 
-#: builtin/tag.c:212
+#: builtin/tag.c:244
 #, c-format
 msgid "tag '%s' not found."
 msgstr "Tag '%s' nicht gefunden."
 
-#: builtin/tag.c:227
+#: builtin/tag.c:259
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Tag '%s' gelöscht (war %s)\n"
 
-#: builtin/tag.c:239
+#: builtin/tag.c:271
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "Konnte Tag '%s' nicht verifizieren"
 
-#: builtin/tag.c:249
+#: builtin/tag.c:281
 #, c-format
 msgid ""
 "\n"
@@ -9558,7 +9529,7 @@ msgstr ""
 "Geben Sie eine Tag-Beschreibung ein.\n"
 "Zeilen, die mit '%c' beginnen, werden ignoriert.\n"
 
-#: builtin/tag.c:253
+#: builtin/tag.c:285
 #, c-format
 msgid ""
 "\n"
@@ -9571,262 +9542,279 @@ msgstr ""
 "Zeilen, die mit '%c' beginnen, werden behalten; Sie dürfen diese\n"
 "selbst entfernen wenn Sie möchten.\n"
 
-#: builtin/tag.c:292
+#: builtin/tag.c:324
 msgid "unable to sign the tag"
 msgstr "konnte Tag nicht signieren"
 
-#: builtin/tag.c:294
+#: builtin/tag.c:326
 msgid "unable to write tag file"
 msgstr "konnte Tag-Datei nicht schreiben"
 
-#: builtin/tag.c:319
+#: builtin/tag.c:351
 msgid "bad object type."
 msgstr "ungültiger Objekt-Typ"
 
-#: builtin/tag.c:332
+#: builtin/tag.c:364
 msgid "tag header too big."
 msgstr "Tag-Kopf zu groß."
 
-#: builtin/tag.c:368
+#: builtin/tag.c:400
 msgid "no tag message?"
 msgstr "keine Tag-Beschreibung?"
 
-#: builtin/tag.c:374
+#: builtin/tag.c:406
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "Die Tag-Beschreibung wurde gelassen in %s\n"
 
-#: builtin/tag.c:423
+#: builtin/tag.c:455
 msgid "switch 'points-at' requires an object"
 msgstr "Option 'points-at' erfordert ein Objekt"
 
-#: builtin/tag.c:425
+#: builtin/tag.c:457
 #, c-format
 msgid "malformed object name '%s'"
 msgstr "fehlerhafter Objekt-Name '%s'"
 
-#: builtin/tag.c:445
+#: builtin/tag.c:480
+#, c-format
+msgid "unsupported sort specification %s"
+msgstr "Nicht unterstützte Angabe für \"--sort\": %s"
+
+#: builtin/tag.c:500
 msgid "list tag names"
 msgstr "listet Tagnamen auf"
 
-#: builtin/tag.c:447
+#: builtin/tag.c:502
 msgid "print <n> lines of each tag message"
 msgstr "zeigt <n> Zeilen jeder Tag-Beschreibung"
 
-#: builtin/tag.c:449
+#: builtin/tag.c:504
 msgid "delete tags"
 msgstr "löscht Tags"
 
-#: builtin/tag.c:450
+#: builtin/tag.c:505
 msgid "verify tags"
 msgstr "überprüft Tags"
 
-#: builtin/tag.c:452
+#: builtin/tag.c:507
 msgid "Tag creation options"
 msgstr "Optionen für Erstellung von Tags"
 
-#: builtin/tag.c:454
+#: builtin/tag.c:509
 msgid "annotated tag, needs a message"
 msgstr "annotiertes Tag, benötigt eine Beschreibung"
 
-#: builtin/tag.c:456
+#: builtin/tag.c:511
 msgid "tag message"
 msgstr "Tag-Beschreibung"
 
-#: builtin/tag.c:458
+#: builtin/tag.c:513
 msgid "annotated and GPG-signed tag"
 msgstr "annotiertes und GPG-signiertes Tag"
 
-#: builtin/tag.c:462
+#: builtin/tag.c:517
 msgid "use another key to sign the tag"
 msgstr "verwendet einen anderen Schlüssel um das Tag zu signieren"
 
-#: builtin/tag.c:463
+#: builtin/tag.c:518
 msgid "replace the tag if exists"
 msgstr "ersetzt das Tag, wenn es existiert"
 
-#: builtin/tag.c:464
+#: builtin/tag.c:519
 msgid "show tag list in columns"
 msgstr "zeigt Liste der Tags in Spalten"
 
-#: builtin/tag.c:466
+#: builtin/tag.c:521
+msgid "sort tags"
+msgstr "sortiert Tags"
+
+#: builtin/tag.c:525
 msgid "Tag listing options"
 msgstr "Optionen für Auflistung der Tags"
 
-#: builtin/tag.c:469
+#: builtin/tag.c:528 builtin/tag.c:534
 msgid "print only tags that contain the commit"
 msgstr "gibt nur Tags aus, die diesen Commit beinhalten"
 
-#: builtin/tag.c:475
+#: builtin/tag.c:540
 msgid "print only tags of the object"
 msgstr "gibt nur Tags von dem Objekt aus"
 
-#: builtin/tag.c:501
+#: builtin/tag.c:566
 msgid "--column and -n are incompatible"
 msgstr "--column und -n sind inkompatibel"
 
-#: builtin/tag.c:518
+#: builtin/tag.c:578
+msgid "--sort and -n are incompatible"
+msgstr "--sort und -n sind inkompatibel"
+
+#: builtin/tag.c:585
 msgid "-n option is only allowed with -l."
 msgstr "-n Option ist nur erlaubt mit -l."
 
-#: builtin/tag.c:520
+#: builtin/tag.c:587
 msgid "--contains option is only allowed with -l."
 msgstr "--contains Option ist nur erlaubt mit -l."
 
-#: builtin/tag.c:522
+#: builtin/tag.c:589
 msgid "--points-at option is only allowed with -l."
 msgstr "--points-at Option ist nur erlaubt mit -l."
 
-#: builtin/tag.c:530
+#: builtin/tag.c:597
 msgid "only one -F or -m option is allowed."
 msgstr "nur eine -F oder -m Option ist erlaubt."
 
-#: builtin/tag.c:550
+#: builtin/tag.c:617
 msgid "too many params"
 msgstr "zu viele Parameter"
 
-#: builtin/tag.c:556
+#: builtin/tag.c:623
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' ist kein gültiger Tagname."
 
-#: builtin/tag.c:561
+#: builtin/tag.c:628
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "Tag '%s' existiert bereits"
 
-#: builtin/tag.c:579
+#: builtin/tag.c:646
 #, c-format
 msgid "%s: cannot lock the ref"
 msgstr "%s: kann Referenz nicht sperren"
 
-#: builtin/tag.c:581
+#: builtin/tag.c:648
 #, c-format
 msgid "%s: cannot update the ref"
 msgstr "%s: kann Referenz nicht aktualisieren"
 
-#: builtin/tag.c:583
+#: builtin/tag.c:650
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Tag '%s' aktualisiert (war %s)\n"
 
-#: builtin/update-index.c:402
+#: builtin/unpack-objects.c:483
+msgid "Unpacking objects"
+msgstr "Entpacke Objekte"
+
+#: builtin/update-index.c:399
 msgid "git update-index [options] [--] [<file>...]"
 msgstr "git update-index [Optionen] [--] [<Datei>...]"
 
-#: builtin/update-index.c:720
+#: builtin/update-index.c:748
 msgid "continue refresh even when index needs update"
 msgstr ""
 "Aktualisierung fortsetzen, auch wenn die Staging-Area aktualisiert werden "
 "muss"
 
-#: builtin/update-index.c:723
+#: builtin/update-index.c:751
 msgid "refresh: ignore submodules"
 msgstr "Aktualisierung: ignoriert Submodule"
 
-#: builtin/update-index.c:726
+#: builtin/update-index.c:754
 msgid "do not ignore new files"
 msgstr "ignoriert keine neuen Dateien"
 
-#: builtin/update-index.c:728
+#: builtin/update-index.c:756
 msgid "let files replace directories and vice-versa"
 msgstr "lässt Dateien Verzeichnisse ersetzen, und umgedreht"
 
-#: builtin/update-index.c:730
+#: builtin/update-index.c:758
 msgid "notice files missing from worktree"
 msgstr "beachtet fehlende Dateien im Arbeitsverzeichnis"
 
-#: builtin/update-index.c:732
+#: builtin/update-index.c:760
 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:735
+#: builtin/update-index.c:763
 msgid "refresh stat information"
 msgstr "aktualisiert Dateiinformationen"
 
-#: builtin/update-index.c:739
+#: builtin/update-index.c:767
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "wie --refresh, ignoriert aber \"assume-unchanged\" Einstellung"
 
-#: builtin/update-index.c:743
-msgid "<mode> <object> <path>"
-msgstr "<Modus> <Objekt> <Pfad>"
+#: builtin/update-index.c:771
+msgid "<mode>,<object>,<path>"
+msgstr "<Modus>,<Objekt>,<Pfad>"
 
-#: builtin/update-index.c:744
+#: builtin/update-index.c:772
 msgid "add the specified entry to the index"
 msgstr "merkt den angegebenen Eintrag zum Commit vor"
 
-#: builtin/update-index.c:748
+#: builtin/update-index.c:776
 msgid "(+/-)x"
 msgstr "(+/-)x"
 
-#: builtin/update-index.c:749
+#: builtin/update-index.c:777
 msgid "override the executable bit of the listed files"
 msgstr "überschreibt das \"ausführbar\"-Bit der aufgelisteten Dateien"
 
-#: builtin/update-index.c:753
+#: builtin/update-index.c:781
 msgid "mark files as \"not changing\""
 msgstr "betrachte diese Datei immer als unverändert"
 
-#: builtin/update-index.c:756
+#: builtin/update-index.c:784
 msgid "clear assumed-unchanged bit"
 msgstr "löscht \"assumed-unchanged\"-Bit"
 
-#: builtin/update-index.c:759
+#: builtin/update-index.c:787
 msgid "mark files as \"index-only\""
 msgstr "markiert Dateien als \"index-only\""
 
-#: builtin/update-index.c:762
+#: builtin/update-index.c:790
 msgid "clear skip-worktree bit"
 msgstr "löscht \"skip-worktree\"-Bit"
 
-#: builtin/update-index.c:765
+#: builtin/update-index.c:793
 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:767
+#: builtin/update-index.c:795
 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:769
+#: builtin/update-index.c:797
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "mit --stdin: eingegebene Zeilen sind durch NUL-Bytes abgeschlossen"
 
-#: builtin/update-index.c:771
+#: builtin/update-index.c:799
 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:775
+#: builtin/update-index.c:803
 msgid "add entries from standard input to the index"
 msgstr "merkt Einträge von der Standard-Eingabe zum Commit vor"
 
-#: builtin/update-index.c:779
+#: builtin/update-index.c:807
 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:783
+#: builtin/update-index.c:811
 msgid "only update entries that differ from HEAD"
 msgstr "aktualisiert nur Einträge, die unterschiedlich zu HEAD sind"
 
-#: builtin/update-index.c:787
+#: builtin/update-index.c:815
 msgid "ignore files missing from worktree"
 msgstr "ignoriert fehlende Dateien im Arbeitsverzeichnis"
 
-#: builtin/update-index.c:790
+#: builtin/update-index.c:818
 msgid "report actions to standard output"
 msgstr "gibt die Aktionen in der Standard-Ausgabe aus"
 
-#: builtin/update-index.c:792
+#: builtin/update-index.c:820
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(für Fremdprogramme) keine gespeicherten, nicht aufgelöste Konflikte"
 
-#: builtin/update-index.c:796
+#: builtin/update-index.c:824
 msgid "write index in this format"
 msgstr "schreibt Staging-Area-Datei in diesem Format"
 
@@ -9842,19 +9830,19 @@ msgstr "git update-ref [Optionen]    <Referenzname> <neuerWert> [<alterWert>]"
 msgid "git update-ref [options] --stdin [-z]"
 msgstr "git update-ref [Optionen] --stdin [-z]"
 
-#: builtin/update-ref.c:255
+#: builtin/update-ref.c:256
 msgid "delete the reference"
 msgstr "löscht diese Referenz"
 
-#: builtin/update-ref.c:257
+#: builtin/update-ref.c:258
 msgid "update <refname> not the one it points to"
 msgstr "aktualisiert <Referenzname>, nicht den Verweis"
 
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:259
 msgid "stdin has NUL-terminated arguments"
 msgstr "Standard-Eingabe hat durch NUL-Zeichen abgeschlossene Argumente"
 
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:260
 msgid "read updates from stdin"
 msgstr "liest Aktualisierungen von der Standard-Eingabe"
 
@@ -9913,23 +9901,23 @@ msgstr ""
 "oder 'git help <Konzept>' um mehr über ein spezifisches Kommando oder\n"
 "Konzept zu erfahren."
 
-#: parse-options.h:146
-msgid "expiry date"
+#: parse-options.h:143
+msgid "expiry-date"
 msgstr "Verfallsdatum"
 
-#: parse-options.h:161
+#: parse-options.h:158
 msgid "no-op (backward compatibility)"
 msgstr "Kein Effekt (Rückwärtskompatibilität)"
 
-#: parse-options.h:235
+#: parse-options.h:232
 msgid "be more verbose"
 msgstr "erweiterte Ausgaben"
 
-#: parse-options.h:237
+#: parse-options.h:234
 msgid "be more quiet"
 msgstr "weniger Ausgaben"
 
-#: parse-options.h:243
+#: parse-options.h:240
 msgid "use <n> digits to display SHA-1s"
 msgstr "benutze <n> Ziffern zur Anzeige von SHA-1s"
 
@@ -10026,11 +10014,11 @@ msgstr ""
 "Erzeugt, listet auf, löscht oder verifiziert ein mit GPG signiertes Tag-"
 "Objekt"
 
-#: git-am.sh:50
+#: git-am.sh:52
 msgid "You need to set your committer info first"
 msgstr "Sie müssen zuerst die Informationen zum Commit-Ersteller setzen."
 
-#: git-am.sh:95
+#: git-am.sh:97
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
@@ -10038,7 +10026,7 @@ msgstr ""
 "Sie scheinen seit dem letzten gescheiterten 'am' HEAD geändert zu haben.\n"
 "Keine Zurücksetzung zu ORIG_HEAD."
 
-#: git-am.sh:105
+#: git-am.sh:107
 #, sh-format
 msgid ""
 "When you have resolved this problem, run \"$cmdline --continue\".\n"
@@ -10051,23 +10039,23 @@ msgstr ""
 "Um den ursprünglichen Branch wiederherzustellen und die Anwendung der\n"
 "Patches abzubrechen, führen Sie \"$cmdline --abort\" aus."
 
-#: git-am.sh:121
+#: git-am.sh:123
 msgid "Cannot fall back to three-way merge."
 msgstr "Kann nicht zu 3-Wege-Merge zurückfallen."
 
-#: git-am.sh:137
+#: git-am.sh:139
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
 "Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge "
 "zurückzufallen."
 
-#: git-am.sh:139
+#: git-am.sh:141
 msgid "Using index info to reconstruct a base tree..."
 msgstr ""
 "Verwende Informationen aus der Staging-Area um einen Basisverzeichnis "
 "nachzustellen"
 
-#: git-am.sh:154
+#: git-am.sh:156
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
@@ -10075,28 +10063,28 @@ msgstr ""
 "Haben Sie den Patch per Hand editiert?\n"
 "Er kann nicht auf die Blobs in seiner 'index' Zeile angewendet werden."
 
-#: git-am.sh:163
+#: git-am.sh:165
 msgid "Falling back to patching base and 3-way merge..."
 msgstr "Falle zurück zum Patchen der Basis und des 3-Wege-Merges..."
 
-#: git-am.sh:179
+#: git-am.sh:181
 msgid "Failed to merge in the changes."
 msgstr "Merge der Änderungen fehlgeschlagen"
 
-#: git-am.sh:274
+#: git-am.sh:276
 msgid "Only one StGIT patch series can be applied at once"
 msgstr "Es kann nur eine StGIT Patch-Serie auf einmal angewendet werden."
 
-#: git-am.sh:361
+#: git-am.sh:363
 #, sh-format
 msgid "Patch format $patch_format is not supported."
 msgstr "Patch-Format $patch_format wird nicht unterstützt."
 
-#: git-am.sh:363
+#: git-am.sh:365
 msgid "Patch format detection failed."
 msgstr "Patch-Formaterkennung fehlgeschlagen."
 
-#: git-am.sh:389
+#: 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."
@@ -10104,17 +10092,17 @@ msgstr ""
 "Die -b/--binary Option hat seit Langem keinen Effekt und wird\n"
 "entfernt. Bitte nicht mehr verwenden."
 
-#: git-am.sh:479
+#: git-am.sh:486
 #, sh-format
 msgid "previous rebase directory $dotest still exists but mbox given."
 msgstr ""
 "Vorheriges Rebase-Verzeichnis $dotest existiert noch, aber mbox gegeben."
 
-#: git-am.sh:484
+#: git-am.sh:491
 msgid "Please make up your mind. --skip or --abort?"
 msgstr "Bitte werden Sie sich klar. --skip oder --abort?"
 
-#: git-am.sh:520
+#: git-am.sh:527
 #, sh-format
 msgid ""
 "Stray $dotest directory found.\n"
@@ -10123,16 +10111,16 @@ msgstr ""
 "Stray $dotest Verzeichnis gefunden.\n"
 "Benutzen Sie \"git am --abort\" um es zu entfernen."
 
-#: git-am.sh:528
+#: git-am.sh:535
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr "Es ist keine Auflösung im Gange, es wird nicht fortgesetzt."
 
-#: git-am.sh:594
+#: git-am.sh:601
 #, sh-format
 msgid "Dirty index: cannot apply patches (dirty: $files)"
 msgstr "Geänderte Staging-Area: kann Patches nicht anwenden (geändert: $files)"
 
-#: git-am.sh:698
+#: git-am.sh:705
 #, sh-format
 msgid ""
 "Patch is empty.  Was it split wrong?\n"
@@ -10146,33 +10134,33 @@ msgstr ""
 "Patches\n"
 "abzubrechen, führen Sie \"$cmdline --abort\" aus."
 
-#: git-am.sh:725
+#: git-am.sh:732
 msgid "Patch does not have a valid e-mail address."
 msgstr "Patch enthält keine gültige Email-Adresse."
 
-#: git-am.sh:772
+#: git-am.sh:779
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
 "Kann nicht interaktiv sein, ohne dass die Standard-Eingabe mit einem "
 "Terminal verbunden ist."
 
-#: git-am.sh:776
+#: git-am.sh:783
 msgid "Commit Body is:"
 msgstr "Commit-Beschreibung ist:"
 
 #. 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:783
+#: git-am.sh:790
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
 msgstr "Anwenden? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
 
-#: git-am.sh:819
+#: git-am.sh:826
 #, sh-format
 msgid "Applying: $FIRSTLINE"
 msgstr "Wende an: $FIRSTLINE"
 
-#: git-am.sh:840
+#: 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"
@@ -10183,7 +10171,7 @@ msgstr ""
 "diese bereits anderweitig eingefügt worden sein; Sie könnten diesen Patch\n"
 "auslassen."
 
-#: git-am.sh:848
+#: git-am.sh:855
 msgid ""
 "You still have unmerged paths in your index\n"
 "did you forget to use 'git add'?"
@@ -10191,16 +10179,16 @@ msgstr ""
 "Sie haben immer noch nicht zusammengeführte Pfade in der Staging-Area.\n"
 "Haben Sie vergessen 'git add' zu benutzen?"
 
-#: git-am.sh:864
+#: git-am.sh:871
 msgid "No changes -- Patch already applied."
 msgstr "Keine Änderungen -- Patches bereits angewendet."
 
-#: git-am.sh:874
+#: git-am.sh:881
 #, sh-format
 msgid "Patch failed at $msgnum $FIRSTLINE"
 msgstr "Anwendung des Patches fehlgeschlagen bei $msgnum $FIRSTLINE"
 
-#: git-am.sh:877
+#: git-am.sh:884
 #, sh-format
 msgid ""
 "The copy of the patch that failed is found in:\n"
@@ -10209,7 +10197,7 @@ msgstr ""
 "Die Kopie des fehlgeschlagenen Patches befindet sich in:\n"
 "   $dotest/patch"
 
-#: git-am.sh:895
+#: git-am.sh:902
 msgid "applying to an empty history"
 msgstr "wende zu leerer Historie an"
 
@@ -10278,8 +10266,6 @@ msgstr "Ungültige Referenz-Eingabe: $rev"
 msgid "'git bisect bad' can take only one argument."
 msgstr "'git bisect bad' kann nur ein Argument entgegennehmen."
 
-#. have bad but not good.  we could bisect although
-#. this is less optimum.
 #: git-bisect.sh:273
 msgid "Warning: bisecting only with a bad commit."
 msgstr "Warnung: binäre Suche nur mit einem fehlerhaften Commit"
@@ -10389,17 +10375,13 @@ msgid "Pull is not possible because you have unmerged files."
 msgstr ""
 "\"pull\" ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
 
-#: git-pull.sh:223
+#: git-pull.sh:247
 msgid "updating an unborn branch with changes added to the index"
 msgstr ""
 "Aktualisiere einen ungeborenen Branch mit Änderungen, die zum Commit "
 "vorgemerkt sind"
 
-#. The fetch involved updating the current branch.
-#. The working tree and the index file is still based on the
-#. $orig_head commit, but we are merging into $curr_head.
-#. First update the working tree to match $curr_head.
-#: git-pull.sh:247
+#: git-pull.sh:271
 #, sh-format
 msgid ""
 "Warning: fetch updated the current branch head.\n"
@@ -10409,15 +10391,15 @@ msgstr ""
 "Warnung: \"fetch\" aktualisierte die Spitze des aktuellen Branches.\n"
 "Warnung: Spule Ihr Arbeitsverzeichnis von Commit $orig_head vor."
 
-#: git-pull.sh:272
+#: git-pull.sh:296
 msgid "Cannot merge multiple branches into empty head"
 msgstr "Kann nicht mehrere Branches in einen ungeborenen Branch zusammenführen"
 
-#: git-pull.sh:276
+#: git-pull.sh:300
 msgid "Cannot rebase onto multiple branches"
 msgstr "kann Rebase nicht auf mehrere Branches ausführen"
 
-#: git-rebase.sh:55
+#: 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"
@@ -10431,16 +10413,16 @@ msgstr ""
 "Um den ursprünglichen Branch wiederherzustellen und den Rebase abzubrechen,\n"
 "führen Sie \"git rebase --abort\" aus."
 
-#: git-rebase.sh:158
+#: git-rebase.sh:164
 msgid "Applied autostash."
 msgstr "\"autostash\" angewendet."
 
-#: git-rebase.sh:161
+#: git-rebase.sh:167
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Kann $stash_sha1 nicht speichern."
 
-#: git-rebase.sh:162
+#: git-rebase.sh:168
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
@@ -10450,33 +10432,33 @@ msgstr ""
 "Ihre Änderungen sind im Stash sicher.\n"
 "Sie können jederzeit \"git stash pop\" oder \"git stash drop\" ausführen.\n"
 
-#: git-rebase.sh:201
+#: git-rebase.sh:207
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Der \"pre-rebase hook\" hat den Rebase zurückgewiesen."
 
-#: git-rebase.sh:206
+#: git-rebase.sh:212
 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:346
+#: git-rebase.sh:350
 msgid "The --exec option must be used with the --interactive option"
 msgstr "Die Option --exec muss mit --interactive verwendet werden."
 
-#: git-rebase.sh:351
+#: git-rebase.sh:355
 msgid "No rebase in progress?"
 msgstr "Kein Rebase im Gange?"
 
-#: git-rebase.sh:362
+#: git-rebase.sh:366
 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:369
+#: git-rebase.sh:373
 msgid "Cannot read HEAD"
 msgstr "Kann HEAD nicht lesen"
 
-#: git-rebase.sh:372
+#: git-rebase.sh:376
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -10484,12 +10466,12 @@ msgstr ""
 "Sie müssen alle Merge-Konflikte editieren und diese dann\n"
 "mittels \"git add\" als aufgelöst markieren"
 
-#: git-rebase.sh:390
+#: git-rebase.sh:394
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Konnte nicht zu $head_name zurückgehen"
 
-#: git-rebase.sh:409
+#: git-rebase.sh:413
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -10510,68 +10492,67 @@ msgstr ""
 "und führen Sie dieses Kommando nochmal aus. Es wird angehalten, falls noch\n"
 "etwas Schützenswertes vorhanden ist."
 
-#: git-rebase.sh:456
+#: git-rebase.sh:464
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "ungültiger Upstream-Branch $upstream_name"
 
-#: git-rebase.sh:480
+#: git-rebase.sh:488
 #, 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:483 git-rebase.sh:487
+#: git-rebase.sh:491 git-rebase.sh:495
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: es gibt keine Merge-Basis"
 
-#: git-rebase.sh:492
+#: git-rebase.sh:500
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "$onto_name zeigt auf keinen gültigen Commit"
 
-#: git-rebase.sh:515
+#: git-rebase.sh:523
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "fatal: Branch $branch_name nicht gefunden"
 
-#: git-rebase.sh:548
+#: git-rebase.sh:556
 msgid "Cannot autostash"
 msgstr "Kann \"autostash\" nicht ausführen."
 
-#: git-rebase.sh:553
+#: git-rebase.sh:561
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "\"autostash\" erzeugt: $stash_abbrev"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:565
 msgid "Please commit or stash them."
 msgstr "Bitte committen Sie die Änderungen oder benutzen Sie \"stash\"."
 
-#: git-rebase.sh:577
+#: git-rebase.sh:585
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "Aktueller Branch $branch_name ist auf dem neusten Stand."
 
-#: git-rebase.sh:581
+#: git-rebase.sh:589
 #, 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."
 
-#: git-rebase.sh:592
+#: git-rebase.sh:600
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Änderungen von $mb zu $onto:"
 
-#. Detach HEAD and reset the tree
-#: git-rebase.sh:601
+#: git-rebase.sh:609
 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:611
+#: git-rebase.sh:619
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "$branch_name zu $onto_name vorgespult."
@@ -10693,21 +10674,21 @@ msgstr "Kann geänderte Dateien nicht aus der Staging-Area entfernen"
 msgid "Index was not unstashed."
 msgstr "Staging-Area wurde nicht aus dem Stash zurückgeladen."
 
-#: git-stash.sh:523
+#: git-stash.sh:529
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Gelöscht ${REV} ($s)"
 
-#: git-stash.sh:524
+#: git-stash.sh:530
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Konnte \"stash\"-Eintrag nicht löschen"
 
-#: git-stash.sh:531
+#: git-stash.sh:537
 msgid "No branch name specified"
 msgstr "Kein Branchname spezifiziert"
 
-#: git-stash.sh:603
+#: git-stash.sh:609
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Zur Wiederherstellung geben Sie \"git stash apply\" ein)"
 
@@ -10721,33 +10702,33 @@ msgstr "Kann eine Komponente von URL '$remoteurl' nicht extrahieren"
 msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
 msgstr "Keine Submodul-Zuordnung in .gitmodules für Pfad '$sm_path' gefunden"
 
-#: git-submodule.sh:281
+#: git-submodule.sh:287
 #, sh-format
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
 msgstr "Klonen von '$url' in Submodul-Pfad '$sm_path' fehlgeschlagen"
 
-#: git-submodule.sh:293
+#: git-submodule.sh:299
 #, 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:403
+#: git-submodule.sh:409
 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:413
+#: git-submodule.sh:419
 #, 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:430
+#: git-submodule.sh:436
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' ist bereits zum Commit vorgemerkt"
 
-#: git-submodule.sh:434
+#: git-submodule.sh:440
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -10758,24 +10739,24 @@ msgstr ""
 "$sm_path\n"
 "Benutzen Sie -f wenn Sie diesen wirklich hinzufügen möchten."
 
-#: git-submodule.sh:452
+#: git-submodule.sh:458
 #, 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:454
+#: git-submodule.sh:460
 #, 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:462
+#: git-submodule.sh:468
 #, 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:464
+#: git-submodule.sh:470
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
@@ -10783,7 +10764,7 @@ msgstr ""
 "Wenn Sie dieses lokale Git-Verzeichnis wiederverwenden möchtest, anstatt "
 "erneut zu klonen"
 
-#: git-submodule.sh:466
+#: git-submodule.sh:472
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
@@ -10791,7 +10772,7 @@ msgstr ""
 "benutzen Sie die Option '--force'. Wenn das lokale Git-Verzeichnis nicht das "
 "korrekte Repository ist"
 
-#: git-submodule.sh:467
+#: git-submodule.sh:473
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
@@ -10800,77 +10781,77 @@ msgstr ""
 "oder Sie sich unsicher sind, was das bedeutet, wählen Sie einen anderen "
 "Namenmit der Option '--name'."
 
-#: git-submodule.sh:469
+#: git-submodule.sh:475
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Reaktiviere lokales Git-Verzeichnis für Submodul '$sm_name'."
 
-#: git-submodule.sh:481
+#: git-submodule.sh:487
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
-msgstr "Unfähig Submodul '$sm_path' auszuchecken"
+msgstr "Kann Submodul '$sm_path' nicht auschecken"
 
-#: git-submodule.sh:486
+#: git-submodule.sh:492
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Hinzufügen von Submodul '$sm_path' fehlgeschlagen"
 
-#: git-submodule.sh:495
+#: git-submodule.sh:501
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Fehler beim Eintragen von Submodul '$sm_path' in die Konfiguration."
 
-#: git-submodule.sh:539
+#: git-submodule.sh:545
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "Betrete '$prefix$displaypath'"
 
-#: git-submodule.sh:559
+#: git-submodule.sh:565
 #, 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:605
+#: git-submodule.sh:611
 #, 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:614
+#: git-submodule.sh:620
 #, 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:616
+#: git-submodule.sh:622
 #, 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:633
+#: git-submodule.sh:639
 #, 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:671
+#: git-submodule.sh:677
 #, 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:688
+#: git-submodule.sh:694
 #, 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:689
+#: git-submodule.sh:695
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
@@ -10878,7 +10859,7 @@ msgstr ""
 "(benutzen Sie 'rm -rf' wenn Sie dieses Submodul wirklich mitsamt\n"
 "seiner Historie löschen möchten)"
 
-#: git-submodule.sh:695
+#: git-submodule.sh:701
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -10887,31 +10868,31 @@ msgstr ""
 "Arbeitsverzeichnis von Submodul in '$displaypath' enthält lokale Änderungen; "
 "verwenden Sie '-f' um diese zu verwerfen"
 
-#: git-submodule.sh:698
+#: git-submodule.sh:704
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Verzeichnis '$displaypath' bereinigt."
 
-#: git-submodule.sh:699
+#: git-submodule.sh:705
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
 "Konnte Arbeitsverzeichnis des Submoduls in '$displaypath' nicht löschen."
 
-#: git-submodule.sh:702
+#: git-submodule.sh:708
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr ""
 "Konnte kein leeres Verzeichnis für Submodul in '$displaypath' erstellen."
 
-#: git-submodule.sh:711
+#: git-submodule.sh:717
 #, 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:834
+#: git-submodule.sh:833
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
@@ -10920,42 +10901,52 @@ msgstr ""
 "Submodul-Pfad '$displaypath' ist nicht initialisiert.\n"
 "Vielleicht möchten Sie 'update --init' benutzen?"
 
-#: git-submodule.sh:847
+#: git-submodule.sh:846
 #, 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:856
+#: git-submodule.sh:855
 #, 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:880
+#: git-submodule.sh:879
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Konnte \"fetch\" in Submodul-Pfad '$displaypath' nicht ausführen"
 
+#: git-submodule.sh:893
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+msgstr "Konnte '$sha1' in Submodul-Pfad '$displaypath' nicht auschecken."
+
 #: git-submodule.sh:894
 #, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "Submodul-Pfad: '$displaypath': '$sha1' ausgecheckt"
+
+#: git-submodule.sh:898
+#, 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:895
+#: git-submodule.sh:899
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Submodul-Pfad '$displaypath': Rebase auf '$sha1'"
 
-#: git-submodule.sh:900
+#: git-submodule.sh:904
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "Merge von '$sha1' in Submodul-Pfad '$displaypath' fehlgeschlagen"
 
-#: git-submodule.sh:901
+#: git-submodule.sh:905
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Submodul-Pfad '$displaypath': zusammengeführt in '$sha1'"
 
-#: git-submodule.sh:906
+#: git-submodule.sh:910
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule  path '$prefix$sm_path'"
@@ -10963,67 +10954,172 @@ msgstr ""
 "Ausführung von '$command $sha1' in Submodul-Pfad '$prefix$sm_path' "
 "fehlgeschlagen"
 
-#: git-submodule.sh:907
+#: git-submodule.sh:911
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr "Submodul-Pfad '$prefix$sm_path': '$command $sha1'"
 
-#: git-submodule.sh:912
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
-msgstr "Konnte '$sha1' in Submodul-Pfad '$displaypath' nicht auschecken."
-
-#: git-submodule.sh:913
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr "Submodul-Pfad: '$displaypath': '$sha1' ausgecheckt"
-
-#: git-submodule.sh:940
+#: git-submodule.sh:941
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Fehler bei Rekursion in Submodul-Pfad '$displaypath'"
 
-#: git-submodule.sh:1048
+#: git-submodule.sh:1049
 msgid "The --cached option cannot be used with the --files option"
 msgstr ""
 "Die Optionen --cached und --files können nicht gemeinsam verwendet werden."
 
-#. unexpected type
-#: git-submodule.sh:1096
+#: git-submodule.sh:1097
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "unerwarteter Modus $mod_dst"
 
-#: git-submodule.sh:1116
+#: git-submodule.sh:1117
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Warnung: $display_name beinhaltet nicht Commit $sha1_src"
 
-#: git-submodule.sh:1119
+#: git-submodule.sh:1120
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Warnung: $display_name beinhaltet nicht Commit $sha1_dst"
 
-#: git-submodule.sh:1122
+#: git-submodule.sh:1123
 #, 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:1147
+#: git-submodule.sh:1148
 msgid "blob"
 msgstr "Blob"
 
-#: git-submodule.sh:1261
+#: git-submodule.sh:1262
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Fehler bei Rekursion in Submodul-Pfad '$sm_path'"
 
-#: git-submodule.sh:1325
+#: git-submodule.sh:1326
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Synchronisiere Submodul-URL für '$displaypath'"
 
+#~ msgid "key id"
+#~ msgstr "Schlüssel-ID"
+
+#~ msgid "Tracking not set up: name too long: %s"
+#~ msgstr ""
+#~ "Konfiguration zum Folgen von Branch nicht eingerichtet. Name zu lang: %s"
+
+#~ msgid "bug"
+#~ msgstr "Fehler"
+
+#~ msgid "ahead "
+#~ msgstr "voraus "
+
+#~ msgid ", behind "
+#~ msgstr ", hinterher "
+
+#~ msgid "could not find .gitmodules in index"
+#~ msgstr "Konnte .gitmodules nicht in der Staging-Area finden"
+
+#~ msgid "reading updated .gitmodules failed"
+#~ msgstr "Lesen der aktualisierten .gitmodules-Datei fehlgeschlagen"
+
+#~ msgid "unable to stat updated .gitmodules"
+#~ msgstr "Konnte aktualisierte .gitmodules-Datei nicht lesen"
+
+#~ msgid "unable to remove .gitmodules from index"
+#~ msgstr "Konnte .gitmodules nicht aus der Staging-Area entfernen"
+
+#~ msgid "adding updated .gitmodules failed"
+#~ msgstr "Konnte aktualisierte .gitmodules-Datei nicht hinzufügen"
+
+#~ msgid ""
+#~ "The behavior of 'git add %s (or %s)' with no path argument from a\n"
+#~ "subdirectory of the tree will change in Git 2.0 and should not be used "
+#~ "anymore.\n"
+#~ "To add content for the whole tree, run:\n"
+#~ "\n"
+#~ "  git add %s :/\n"
+#~ "  (or git add %s :/)\n"
+#~ "\n"
+#~ "To restrict the command to the current directory, run:\n"
+#~ "\n"
+#~ "  git add %s .\n"
+#~ "  (or git add %s .)\n"
+#~ "\n"
+#~ "With the current Git version, the command is restricted to the current "
+#~ "directory.\n"
+#~ msgstr ""
+#~ "Das Verhalten von 'git add %s (oder %s)' ohne ein Pfad-Argument von\n"
+#~ "einem Unterverzeichnis aus wird in Git 2.0 geändert und sollte nicht\n"
+#~ "mehr verwendet werden.\n"
+#~ "Um Dateien des gesamten Projektverzeichnisses hinzuzufügen, führen Sie "
+#~ "aus:\n"
+#~ "\n"
+#~ "  git add %s :/\n"
+#~ "  (oder git add %s :/)\n"
+#~ "\n"
+#~ "Zur Einschränkung auf das aktuelle Verzeichnis führen Sie aus:\n"
+#~ "\n"
+#~ "  git add %s .\n"
+#~ "  (oder git add %s .)\n"
+#~ "\n"
+#~ "Mit der aktuellen Version von Git ist das Kommando auf das aktuelle\n"
+#~ "Verzeichnis beschränkt.\n"
+
+#~ msgid ""
+#~ "You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
+#~ "whose behaviour will change in Git 2.0 with respect to paths you "
+#~ "removed.\n"
+#~ "Paths like '%s' that are\n"
+#~ "removed from your working tree are ignored with this version of Git.\n"
+#~ "\n"
+#~ "* 'git add --ignore-removal <pathspec>', which is the current default,\n"
+#~ "  ignores paths you removed from your working tree.\n"
+#~ "\n"
+#~ "* 'git add --all <pathspec>' will let you also record the removals.\n"
+#~ "\n"
+#~ "Run 'git status' to check the paths you removed from your working tree.\n"
+#~ msgstr ""
+#~ "Sie haben 'git add' weder mit '-A (--all)' noch mit '--ignore-removal'\n"
+#~ "ausgeführt. Das Verhalten des Kommandos ändert sich in Git 2.0 durch\n"
+#~ "Berücksichtigung der gelöschten Pfade.\n"
+#~ "Pfade wie '%s', die im Arbeitsverzeichnis gelöscht wurden, werden in\n"
+#~ "dieser Version von Git ignoriert.\n"
+#~ "\n"
+#~ "* 'git add --ignore-removal <Pfadspezifikation>', was der aktuelle\n"
+#~ "  Standardwert ist, ignoriert gelöschte Pfade im Arbeitsverzeichnis.\n"
+#~ "* 'git add --all <Pfadspezifikation>' berücksichtigt ebenfalls gelöschte\n"
+#~ "  Pfade.\n"
+#~ "Führen Sie 'git status' aus, um die gelöschten Pfade zu überprüfen.\n"
+
+#~ msgid ""
+#~ "Auto packing the repository for optimum performance. You may also\n"
+#~ "run \"git gc\" manually. See \"git help gc\" for more information.\n"
+#~ msgstr ""
+#~ "Die Datenbank des Repositories wird für eine optimale Performance\n"
+#~ "komprimiert. Sie können auch \"git gc\" manuell ausführen.\n"
+#~ "Siehe \"git help gc\" für weitere Informationen.\n"
+
+#~ msgid ""
+#~ "Updates were rejected because a pushed branch tip is behind its remote\n"
+#~ "counterpart. If you did not intend to push that branch, you may want to\n"
+#~ "specify branches to push or set the 'push.default' configuration "
+#~ "variable\n"
+#~ "to 'simple', 'current' or 'upstream' to push only the current branch."
+#~ msgstr ""
+#~ "Aktualisierungen wurden zurückgewiesen, weil die Spitze eines "
+#~ "versendeten\n"
+#~ "Branches hinter seinem externen Gegenstück zurückgefallen ist. Wenn Sie "
+#~ "nicht\n"
+#~ "beabsichtigt haben, diesen Branch zu versenden, können Sie auch den zu "
+#~ "versendenden\n"
+#~ "Branch spezifizieren oder die Konfigurationsvariable 'push.default' zu "
+#~ "'simple', 'current'\n"
+#~ "oder 'upstream' setzen, um nur den aktuellen Branch zu versenden."
+
 #~ msgid "copied:     %s -> %s"
 #~ msgstr "kopiert:     %s -> %s"
 
@@ -11042,9 +11138,6 @@ msgstr "Synchronisiere Submodul-URL für '$displaypath'"
 #~ msgid "input paths are terminated by a null character"
 #~ msgstr "Eingabepfade sind durch ein NUL Zeichen abgeschlossen"
 
-#~ msgid "done\n"
-#~ msgstr "Fertig\n"
-
 #~ msgid ""
 #~ "The following untracked files would NOT be saved but need to be removed "
 #~ "by stash save:"
@@ -11176,20 +11269,12 @@ msgstr "Synchronisiere Submodul-URL für '$displaypath'"
 #~ msgstr[0] ", %d Zeile entfernt(-)"
 #~ msgstr[1] ", %d Zeilen entfernt(-)"
 
-#~ msgid "Auto packing the repository for optimum performance.\n"
-#~ msgstr ""
-#~ "Die Datenbank des Projektarchivs wird für eine optimale Performance "
-#~ "komprimiert.\n"
-
 #~ msgid "git remote set-head <name> (-a | -d | <branch>])"
 #~ msgstr "git remote set-head <Name> (-a | -d | <Zweig>])"
 
 #~ msgid " (use \"git add\" to track)"
 #~ msgstr " (benutze \"git add\" zum Beobachten)"
 
-#~ msgid "-B cannot be used with -b"
-#~ msgstr "-B kann nicht mit -b benutzt werden"
-
 #~ msgid "--detach cannot be used with -b/-B/--orphan"
 #~ msgstr "--detach kann nicht mit -b/-B/--orphan benutzt werden"
 
index 0b9d59e8fa43dca6b580d9436712a7d09f27472b..6b32da05bcf11bf34c8c0202afc3483d76b006f6 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -73,8 +73,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-02-01 08:06+0800\n"
-"PO-Revision-Date: 2014-02-02 14:35+0100\n"
+"POT-Creation-Date: 2014-04-19 12:50+0800\n"
+"PO-Revision-Date: 2014-04-22 21:28+0200\n"
 "Last-Translator: Jean-Noël Avila <jn.avila@free.fr>\n"
 "Language-Team: Jean-Noël Avila <jn.avila@free.fr>\n"
 "Language: fr\n"
@@ -83,16 +83,12 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n<=1 ?0 : 1;\n"
 
-#: advice.c:57
+#: advice.c:55
 #, c-format
 msgid "hint: %.*s\n"
 msgstr "astuce: %.*s\n"
 
-#.
-#. * Message used both when 'git commit' fails and when
-#. * other commands doing a merge do.
-#.
-#: advice.c:87
+#: advice.c:85
 msgid ""
 "Fix them up in the work tree,\n"
 "and then use 'git add/rm <file>' as\n"
@@ -123,76 +119,76 @@ msgstr ""
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <dépôt> [--exec <commande>] --list"
 
-#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328
+#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "le chemin '%s' ne correspond à aucun fichier"
 
-#: archive.c:327
+#: archive.c:328
 msgid "fmt"
 msgstr "fmt"
 
-#: archive.c:327
+#: archive.c:328
 msgid "archive format"
 msgstr "format d'archive"
 
-#: archive.c:328 builtin/log.c:1193
+#: archive.c:329 builtin/log.c:1193
 msgid "prefix"
 msgstr "préfixe"
 
-#: archive.c:329
+#: archive.c:330
 msgid "prepend prefix to each pathname in the archive"
 msgstr "préfixer chaque chemin de fichier dans l'archive"
 
-#: archive.c:330 builtin/archive.c:88 builtin/blame.c:2265
-#: builtin/blame.c:2266 builtin/config.c:58 builtin/fast-export.c:680
-#: builtin/fast-export.c:682 builtin/grep.c:716 builtin/hash-object.c:77
-#: builtin/ls-files.c:486 builtin/ls-files.c:489 builtin/notes.c:408
-#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:154
+#: 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
 msgid "file"
 msgstr "fichier"
 
-#: archive.c:331 builtin/archive.c:89
+#: archive.c:332 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr "écrire l'archive dans ce fichier"
 
-#: archive.c:333
+#: archive.c:334
 msgid "read .gitattributes in working directory"
 msgstr "lire .gitattributes dans le répertoire de travail"
 
-#: archive.c:334
+#: archive.c:335
 msgid "report archived files on stderr"
 msgstr "afficher les fichiers archivés sur stderr"
 
-#: archive.c:335
+#: archive.c:336
 msgid "store only"
 msgstr "stockage seulement"
 
-#: archive.c:336
+#: archive.c:337
 msgid "compress faster"
 msgstr "compression rapide"
 
-#: archive.c:344
+#: archive.c:345
 msgid "compress better"
 msgstr "compression efficace"
 
-#: archive.c:347
+#: archive.c:348
 msgid "list supported archive formats"
 msgstr "afficher les formats d'archive supportés"
 
-#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
 msgid "repo"
 msgstr "dépôt"
 
-#: archive.c:350 builtin/archive.c:91
+#: archive.c:351 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:351 builtin/archive.c:92 builtin/notes.c:487
+#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
 msgid "command"
 msgstr "commande"
 
-#: archive.c:352 builtin/archive.c:93
+#: archive.c:353 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr "chemin vers la commande distante git-upload-archive"
 
@@ -209,90 +205,85 @@ msgstr ""
 msgid "Not setting branch %s as its own upstream."
 msgstr "La branche %s ne peut pas être sa propre branche amont."
 
-#: branch.c:82
+#: branch.c:83
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr ""
 "La branche %s est paramétrée pour suivre la branche distante %s de %s en "
 "rebasant."
 
-#: branch.c:83
+#: branch.c:84
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
 msgstr ""
 "La branche %s est paramétrée pour suivre la branche distante %s depuis %s."
 
-#: branch.c:87
+#: branch.c:88
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr ""
 "La branche %s est paramétrée pour suivre la branche locale %s en rebasant."
 
-#: branch.c:88
+#: branch.c:89
 #, c-format
 msgid "Branch %s set up to track local branch %s."
 msgstr "La branche %s est paramétrée pour suivre la branche locale %s."
 
-#: branch.c:92
+#: branch.c:94
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr ""
 "La branche %s est paramétrée pour suivre la référence distante %s en "
 "rebasant."
 
-#: branch.c:93
+#: branch.c:95
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
 msgstr "La branche %s est paramétrée pour suivre la référence distante %s."
 
-#: branch.c:97
+#: branch.c:99
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
 "La branche %s est paramétrée pour suivre la référence locale %s en rebasant."
 
-#: branch.c:98
+#: branch.c:100
 #, c-format
 msgid "Branch %s set up to track local ref %s."
 msgstr "La branche %s est paramétrée pour suivre la référence locale %s."
 
-#: branch.c:118
-#, c-format
-msgid "Tracking not set up: name too long: %s"
-msgstr "Suivi de branche non paramétré : le nom est trop long : %s"
-
-#: branch.c:137
+#: branch.c:133
 #, c-format
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr "Pas de suivi : information ambiguë pour la référence %s"
 
-#: branch.c:182
+#: branch.c:178
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "'%s' n'est pas un nom de branche valide."
 
-#: branch.c:187
+#: branch.c:183
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "Une branche nommée '%s' existe déjà."
 
-#: branch.c:195
+#: branch.c:191
 msgid "Cannot force update the current branch."
 msgstr "Impossible de forcer la mise à jour de la branche courante."
 
-#: branch.c:215
+#: branch.c:211
 #, 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:217
+#: branch.c:213
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "la branche amont demandée '%s' n'existe pas"
 
-#: branch.c:219
+#: branch.c:215
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -305,120 +296,120 @@ msgid ""
 msgstr ""
 "\n"
 "Si vous comptez baser votre travail sur une branche\n"
-"amont qui existe déjà sur le serveur distant, vous pourriez\n"
-"devoir lancer \"git fetch\" pour la récupérer.\n"
+"amont qui existe déjà sur le serveur distant, vous pouvez\n"
+"lancer \"git fetch\" pour la récupérer.\n"
 "\n"
 "Si vous comptez pousser une nouvelle branche locale qui suivra\n"
-"sa jumelle distante, vous souhaiterez utiliser \"git push -u\"\n"
+"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:264
+#: branch.c:260
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "Nom d'objet invalide : '%s'."
 
-#: branch.c:284
+#: branch.c:280
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "Nom d'objet ambigu : '%s'."
 
-#: branch.c:289
+#: branch.c:285
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "Point d'embranchement invalide : '%s'."
 
-#: branch.c:295
+#: branch.c:291
 msgid "Failed to lock ref for update"
 msgstr "Échec du verrouillage de la référence pour mise à jour"
 
-#: branch.c:313
+#: branch.c:309
 msgid "Failed to write ref"
 msgstr "Échec de l'écriture de la référence"
 
-#: bundle.c:37
+#: bundle.c:33
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
 msgstr "'%s' ne semble pas être un fichier bundle v2"
 
-#: bundle.c:64
+#: bundle.c:60
 #, c-format
 msgid "unrecognized header: %s%s (%d)"
 msgstr "en-tête non reconnu : %s%s (%d)"
 
-#: bundle.c:90 builtin/commit.c:706
+#: bundle.c:86 builtin/commit.c:706
 #, c-format
 msgid "could not open '%s'"
 msgstr "impossible d'ouvrir '%s'"
 
-#: bundle.c:141
+#: bundle.c:138
 msgid "Repository lacks these prerequisite commits:"
-msgstr "Le dépôt ne dispose pas des commits prérequis :"
+msgstr "Le dépôt ne dispose pas des commits prérequis suivants :"
 
-#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332
+#: 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
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "échec de la préparation du parcours des révisions"
 
-#: bundle.c:187
+#: bundle.c:184
 #, 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:194
+#: bundle.c:191
 msgid "The bundle records a complete history."
 msgstr "Le colis enregistre l'historique complet."
 
-#: bundle.c:196
+#: bundle.c:193
 #, 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:296
+#: bundle.c:293
 msgid "rev-list died"
 msgstr "rev-list a disparu"
 
-#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "argument non reconnu : %s"
 
-#: bundle.c:337
+#: bundle.c:334
 #, 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:382
+#: bundle.c:379
 msgid "Refusing to create empty bundle."
 msgstr "Refus de créer un colis vide."
 
-#: bundle.c:398
+#: bundle.c:395
 msgid "Could not spawn pack-objects"
 msgstr "Impossible de créer des objets groupés"
 
-#: bundle.c:416
+#: bundle.c:413
 msgid "pack-objects died"
 msgstr "les objets groupés ont disparu"
 
-#: bundle.c:419
+#: bundle.c:416
 #, c-format
 msgid "cannot create '%s'"
 msgstr "impossible de créer '%s'"
 
-#: bundle.c:441
+#: bundle.c:438
 msgid "index-pack died"
 msgstr "l'index de groupe a disparu"
 
-#: commit.c:53
+#: commit.c:54
 #, c-format
 msgid "could not parse %s"
 msgstr "impossible d'analyser %s"
 
-#: commit.c:55
+#: commit.c:56
 #, c-format
 msgid "%s %s is not a commit!"
 msgstr "%s %s n'est pas un commit !"
@@ -494,6 +485,7 @@ msgid_plural "%lu years"
 msgstr[0] "%lu an"
 msgstr[1] "%lu ans"
 
+#. TRANSLATORS: "%s" is "<n> years"
 #: date.c:149
 #, c-format
 msgid "%s, %lu month ago"
@@ -513,6 +505,10 @@ msgstr[1] "il y a %lu ans"
 msgid "failed to read orderfile '%s'"
 msgstr "impossible de lire le fichier de commande '%s'"
 
+#: diffcore-rename.c:517
+msgid "Performing inexact rename detection"
+msgstr "Détection de renommage inexact en cours"
+
 #: diff.c:113
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
@@ -539,7 +535,7 @@ msgstr ""
 "Erreurs dans la variable de configuration 'diff.dirstat' :\n"
 "%s"
 
-#: diff.c:3509
+#: diff.c:3495
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -548,7 +544,7 @@ msgstr ""
 "Impossible d'analyser le paramètre de l'option --dirstat/-X :\n"
 "%s"
 
-#: diff.c:3523
+#: diff.c:3509
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Impossible d'analyser le paramètre de l'option --submodule : '%s'"
@@ -575,35 +571,35 @@ msgstr "impossible de créer un fichier temporaire '%s' : %s"
 msgid "failed writing detached signature to '%s': %s"
 msgstr "impossible d'écrire la signature détachée dans '%s' : %s"
 
-#: grep.c:1695
+#: grep.c:1698
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "'%s' : lecture de %s impossible"
 
-#: grep.c:1712
+#: grep.c:1715
 #, c-format
 msgid "'%s': %s"
 msgstr "'%s' : %s"
 
-#: grep.c:1723
+#: grep.c:1726
 #, c-format
 msgid "'%s': short read %s"
 msgstr "'%s' : lecture tronquée %s"
 
-#: help.c:210
+#: help.c:209
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "commandes git disponibles dans '%s'"
 
-#: help.c:217
+#: help.c:216
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "commandes git disponibles depuis un autre endroit de votre $PATH"
 
-#: help.c:233
+#: help.c:232
 msgid "The most commonly used git commands are:"
 msgstr "Les commandes git les plus utilisées sont :"
 
-#: help.c:290
+#: help.c:289
 #, c-format
 msgid ""
 "'%s' appears to be a git command, but we were not\n"
@@ -612,11 +608,11 @@ msgstr ""
 "'%s' semble être une commande git, mais elle n'a pas pu\n"
 "être exécutée. Peut-être git-%s est-elle cassée ?"
 
-#: help.c:347
+#: help.c:346
 msgid "Uh oh. Your system reports no Git commands at all."
 msgstr "Ahem. Votre système n'indique aucune commande Git."
 
-#: help.c:369
+#: help.c:368
 #, c-format
 msgid ""
 "WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -624,19 +620,19 @@ msgid ""
 msgstr ""
 "ATTENTION : vous avez invoqué une commande Git nommée '%s' qui n'existe "
 "pas.\n"
-"Poursuite en supposant que vous avez voulu dire '%s'"
+"Continuons en supposant que vous avez voulu dire '%s'"
 
-#: help.c:374
+#: help.c:373
 #, c-format
 msgid "in %0.1f seconds automatically..."
 msgstr "dans %0.1f secondes automatiquement..."
 
-#: help.c:381
+#: help.c:380
 #, c-format
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git : '%s' n'est pas une commande git. Voir 'git --help'."
 
-#: help.c:385 help.c:444
+#: help.c:384 help.c:443
 msgid ""
 "\n"
 "Did you mean this?"
@@ -650,7 +646,7 @@ msgstr[1] ""
 "\n"
 "Vouliez-vous dire un de ceux-là ?"
 
-#: help.c:440
+#: help.c:439
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %s - %s"
@@ -659,7 +655,7 @@ msgstr "%s: %s - %s"
 msgid "failed to read the cache"
 msgstr "impossible de lire le cache"
 
-#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559
+#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
 #: builtin/clone.c:661
 msgid "unable to write new index file"
 msgstr "impossible d'écrire le nouveau fichier d'index"
@@ -669,75 +665,73 @@ msgstr "impossible d'écrire le nouveau fichier d'index"
 msgid "(bad commit)\n"
 msgstr "(mauvais commit)\n"
 
-#: merge-recursive.c:206
+#: merge-recursive.c:208
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "échec de addinfo_cache pour le chemin '%s'"
 
-#: merge-recursive.c:269
+#: merge-recursive.c:271
 msgid "error building trees"
 msgstr "erreur de construction des arbres"
 
-#: merge-recursive.c:673
+#: merge-recursive.c:675
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "impossible de créer le chemin '%s' %s"
 
-#: merge-recursive.c:684
+#: merge-recursive.c:686
 #, 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"
 
-#. something else exists
-#. .. but not some other error (who really cares what?)
-#: merge-recursive.c:698 merge-recursive.c:719
+#: merge-recursive.c:700 merge-recursive.c:721
 msgid ": perhaps a D/F conflict?"
 msgstr ": peut-être un conflit D/F ?"
 
-#: merge-recursive.c:709
+#: merge-recursive.c:711
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "refus de perdre le fichier non suivi '%s'"
 
-#: merge-recursive.c:749
+#: merge-recursive.c:751
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "impossible de lire l'objet %s '%s'"
 
-#: merge-recursive.c:751
+#: merge-recursive.c:753
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "blob attendu pour %s '%s'"
 
-#: merge-recursive.c:774 builtin/clone.c:317
+#: merge-recursive.c:776 builtin/clone.c:317
 #, c-format
 msgid "failed to open '%s'"
 msgstr "échec à l'ouverture de '%s'"
 
-#: merge-recursive.c:782
+#: merge-recursive.c:784
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "échec à la création du lien symbolique '%s'"
 
-#: merge-recursive.c:785
+#: merge-recursive.c:787
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "ne sait pas traiter %06o %s '%s'"
 
-#: merge-recursive.c:923
+#: merge-recursive.c:925
 msgid "Failed to execute internal merge"
 msgstr "Échec à l'exécution de la fusion interne"
 
-#: merge-recursive.c:927
+#: merge-recursive.c:929
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Impossible d'ajouter %s à la base de données"
 
-#: merge-recursive.c:943
+#: merge-recursive.c:945
 msgid "unsupported object type in the tree"
 msgstr "type d'objet non supporté dans l'arbre"
 
-#: merge-recursive.c:1022 merge-recursive.c:1036
+#: merge-recursive.c:1024 merge-recursive.c:1038
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -746,7 +740,7 @@ msgstr ""
 "CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans %s. Version %s de "
 "%s laissée dans l'arbre."
 
-#: merge-recursive.c:1028 merge-recursive.c:1041
+#: merge-recursive.c:1030 merge-recursive.c:1043
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -755,20 +749,20 @@ msgstr ""
 "CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans %s. Version %s de "
 "%s laissée dans l'arbre dans le fichier %s."
 
-#: merge-recursive.c:1082
+#: merge-recursive.c:1084
 msgid "rename"
 msgstr "renommage"
 
-#: merge-recursive.c:1082 wt-status.c:283
+#: merge-recursive.c:1084
 msgid "renamed"
 msgstr "renommé"
 
-#: merge-recursive.c:1138
+#: merge-recursive.c:1140
 #, 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:1160
+#: merge-recursive.c:1162
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -777,146 +771,146 @@ msgstr ""
 "CONFLIT (renommage/renommage) : Renommage de \"%s\"->\"%s\" dans la branche "
 "\"%s\" et renommage \"%s\"->\"%s\" dans \"%s\"%s"
 
-#: merge-recursive.c:1165
+#: merge-recursive.c:1167
 msgid " (left unresolved)"
 msgstr " (laissé non résolu)"
 
-#: merge-recursive.c:1219
+#: merge-recursive.c:1221
 #, 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:1249
+#: merge-recursive.c:1251
 #, 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:1448
+#: merge-recursive.c:1450
 #, 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:1458
+#: merge-recursive.c:1460
 #, c-format
 msgid "Adding merged %s"
 msgstr "Ajout de %s fusionné"
 
-#: merge-recursive.c:1463 merge-recursive.c:1661
+#: merge-recursive.c:1465 merge-recursive.c:1663
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Ajout plutôt comme %s"
 
-#: merge-recursive.c:1514
+#: merge-recursive.c:1516
 #, c-format
 msgid "cannot read object %s"
 msgstr "impossible de lire l'objet %s"
 
-#: merge-recursive.c:1517
+#: merge-recursive.c:1519
 #, c-format
 msgid "object %s is not a blob"
 msgstr "l'objet %s n'est pas un blob"
 
-#: merge-recursive.c:1565
+#: merge-recursive.c:1567
 msgid "modify"
 msgstr "modification"
 
-#: merge-recursive.c:1565 wt-status.c:281
+#: merge-recursive.c:1567
 msgid "modified"
 msgstr "modifié"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1577
 msgid "content"
 msgstr "contenu"
 
-#: merge-recursive.c:1582
+#: merge-recursive.c:1584
 msgid "add/add"
 msgstr "ajout/ajout"
 
-#: merge-recursive.c:1616
+#: merge-recursive.c:1618
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "%s sauté (fusion identique à l'existant)"
 
-#: merge-recursive.c:1630
+#: merge-recursive.c:1632
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Fusion automatique de %s"
 
-#: merge-recursive.c:1634 git-submodule.sh:1148
+#: merge-recursive.c:1636 git-submodule.sh:1149
 msgid "submodule"
 msgstr "sous-module"
 
-#: merge-recursive.c:1635
+#: merge-recursive.c:1637
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "CONFLIT (%s) : Conflit de fusion dans %s"
 
-#: merge-recursive.c:1725
+#: merge-recursive.c:1727
 #, c-format
 msgid "Removing %s"
 msgstr "Suppression de %s"
 
-#: merge-recursive.c:1750
+#: merge-recursive.c:1752
 msgid "file/directory"
 msgstr "fichier/répertoire"
 
-#: merge-recursive.c:1756
+#: merge-recursive.c:1758
 msgid "directory/file"
 msgstr "répertoire/fichier"
 
-#: merge-recursive.c:1761
+#: merge-recursive.c:1763
 #, 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:1771
+#: merge-recursive.c:1773
 #, c-format
 msgid "Adding %s"
 msgstr "Ajout de %s"
 
-#: merge-recursive.c:1788
+#: merge-recursive.c:1790
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Échec fatal de fusion, qui ne devrait jamais arriver."
 
-#: merge-recursive.c:1807
+#: merge-recursive.c:1809
 msgid "Already up-to-date!"
 msgstr "Déjà à jour !"
 
-#: merge-recursive.c:1816
+#: merge-recursive.c:1818
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "échec de fusion des arbres %s et %s"
 
-#: merge-recursive.c:1846
+#: merge-recursive.c:1848
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "Chemin non traité ??? %s"
 
-#: merge-recursive.c:1891
+#: merge-recursive.c:1893
 msgid "Merging:"
 msgstr "Fusion :"
 
-#: merge-recursive.c:1904
+#: merge-recursive.c:1906
 #, 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:1941
+#: merge-recursive.c:1943
 msgid "merge returned no commit"
 msgstr "la fusion n'a pas retourné de commit"
 
-#: merge-recursive.c:1998
+#: merge-recursive.c:2000
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Impossible d'analyser l'objet '%s'"
 
-#: merge-recursive.c:2010 builtin/merge.c:665
+#: merge-recursive.c:2012 builtin/merge.c:668
 msgid "Unable to write index."
 msgstr "Impossible d'écrire l'index."
 
@@ -941,33 +935,33 @@ msgstr "Refus de réécrire des notes dans %s (hors de refs/notes/)"
 msgid "Bad %s value: '%s'"
 msgstr "Mauvaise valeur de %s : '%s'"
 
-#: object.c:202
+#: object.c:229
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "impossible d'analyser l'objet : %s"
 
-#: parse-options.c:537
+#: parse-options.c:532
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:555
+#: parse-options.c:550
 #, c-format
 msgid "usage: %s"
 msgstr "usage : %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:559
+#: parse-options.c:554
 #, c-format
 msgid "   or: %s"
 msgstr "   ou : %s"
 
-#: parse-options.c:562
+#: parse-options.c:557
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:596
+#: parse-options.c:591
 msgid "-NUM"
 msgstr "-NUM"
 
@@ -1019,11 +1013,6 @@ msgstr "%s : '%s' est hors du dépôt"
 msgid "Pathspec '%s' is in submodule '%.*s'"
 msgstr "Le chemin '%s' est dans le sous-module '%.*s'"
 
-#.
-#. * We may want to substitute "this command" with a command
-#. * name. E.g. when add--interactive dies when running
-#. * "checkout -p"
-#.
 #: pathspec.c:353
 #, c-format
 msgid "%s: pathspec magic not supported by this command: %s"
@@ -1044,56 +1033,73 @@ msgstr ""
 "Il n'y a rien dont il faut exclure par des motifs :(exclure).\n"
 "Peut-être avez-vous oublié d'ajouter ':/' ou '.' ?"
 
-#: remote.c:753
+#: progress.c:224
+msgid "done"
+msgstr "fait"
+
+#: read-cache.c:1238
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"version d'index renseignée, mais la valeur est invalide.\n"
+"Utilisation de la version %i"
+
+#: read-cache.c:1248
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"GIT_INDEX_VERSION est renseigné, mais la valeur est invalide.\n"
+"Utilisation de la version %i"
+
+#: remote.c:758
 #, 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:757
+#: remote.c:762
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s suit habituellement %s, pas %s"
 
-#: remote.c:761
+#: remote.c:766
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s suit à la fois %s et %s"
 
-#.
-#. * This last possibility doesn't occur because
-#. * FETCH_HEAD_IGNORE entries always appear at
-#. * the end of the list.
-#.
-#: remote.c:769
+#: remote.c:774
 msgid "Internal error"
 msgstr "Erreur interne"
 
-#: remote.c:1871
+#: remote.c:1948
 #, 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:1875
+#: remote.c:1952
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (utilisez \"git branch --unset-upstream\" pour corriger)\n"
 
-#: remote.c:1878
+#: remote.c:1955
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "Votre branche est à jour avec '%s'.\n"
 
-#: remote.c:1882
+#: remote.c:1959
 #, 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:1888
+#: remote.c:1965
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (utilisez \"git push\" pour publier vos commits locaux)\n"
 
-#: remote.c:1891
+#: remote.c:1968
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1105,11 +1111,11 @@ msgstr[1] ""
 "Votre branche est en retard sur '%s' de %d commits, et peut être mise à jour "
 "en avance rapide.\n"
 
-#: remote.c:1899
+#: remote.c:1976
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (utilisez \"git pull\" pour mettre à jour votre branche locale)\n"
 
-#: remote.c:1902
+#: remote.c:1979
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1124,7 +1130,7 @@ msgstr[1] ""
 "Votre branche et '%s' ont divergé,\n"
 "et ont %d et %d commits différents chacune respectivement.\n"
 
-#: remote.c:1912
+#: remote.c:1989
 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"
@@ -1138,14 +1144,14 @@ msgstr "échec de l'ouverture de /dev/null"
 msgid "dup2(%d,%d) failed"
 msgstr "échec de dup2(%d,%d)"
 
-#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896
-#: builtin/merge.c:1006 builtin/merge.c:1016
+#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
+#: builtin/merge.c:1009 builtin/merge.c:1019
 #, 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:786
-#: builtin/merge.c:1008 builtin/merge.c:1021
+#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
+#: builtin/merge.c:1011 builtin/merge.c:1024
 #, c-format
 msgid "Could not write to '%s'"
 msgstr "Impossible d'écrire dans '%s'"
@@ -1168,7 +1174,7 @@ msgstr ""
 "avec 'git add <chemins>' ou 'git rm <chemins>'\n"
 "puis validez le résultat avec 'git commit'"
 
-#: sequencer.c:245 sequencer.c:870 sequencer.c:953
+#: sequencer.c:245 sequencer.c:879 sequencer.c:962
 #, c-format
 msgid "Could not write to %s"
 msgstr "Impossible d'écrire dans %s"
@@ -1204,31 +1210,31 @@ msgstr "Impossible de résoudre le commit HEAD\n"
 msgid "Unable to update cache tree\n"
 msgstr "Impossible de mettre à jour l'arbre de cache\n"
 
-#: sequencer.c:423
+#: sequencer.c:430
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr "Impossible d'analyser le commit %s\n"
 
-#: sequencer.c:428
+#: sequencer.c:435
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr "Impossible d'analyser le commit parent %s\n"
 
-#: sequencer.c:494
+#: sequencer.c:501
 msgid "Your index file is unmerged."
 msgstr "Votre fichier d'index n'est pas fusionné."
 
-#: sequencer.c:513
+#: sequencer.c:520
 #, 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:521
+#: sequencer.c:528
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr "Le commit %s n'a pas le parent %d"
 
-#: sequencer.c:525
+#: sequencer.c:532
 #, c-format
 msgid "Mainline was specified but commit %s is not a merge."
 msgstr ""
@@ -1237,153 +1243,153 @@ msgstr ""
 
 #. TRANSLATORS: The first %s will be "revert" or
 #. "cherry-pick", the second %s a SHA1
-#: sequencer.c:538
+#: sequencer.c:545
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s : impossible d'analyser le commit parent %s"
 
-#: sequencer.c:542
+#: sequencer.c:549
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr "Impossible d'obtenir un message de validation pour %s"
 
-#: sequencer.c:628
+#: sequencer.c:635
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "impossible d'annuler %s... %s"
 
-#: sequencer.c:629
+#: sequencer.c:636
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "impossible d'appliquer %s... %s"
 
-#: sequencer.c:665
+#: sequencer.c:672
 msgid "empty commit set passed"
 msgstr "l'ensemble de commits spécifié est vide"
 
-#: sequencer.c:673
+#: sequencer.c:680
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s : échec à la lecture de l'index"
 
-#: sequencer.c:678
+#: sequencer.c:685
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s : échec du rafraîchissement de l'index"
 
-#: sequencer.c:736
+#: sequencer.c:743
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr "Impossible de %s pendant un %s"
 
-#: sequencer.c:758
+#: sequencer.c:765
 #, c-format
 msgid "Could not parse line %d."
 msgstr "Impossible d'analyser la ligne %d."
 
-#: sequencer.c:763
+#: sequencer.c:770
 msgid "No commits parsed."
 msgstr "Aucun commit analysé."
 
-#: sequencer.c:776
+#: sequencer.c:783
 #, c-format
 msgid "Could not open %s"
 msgstr "Impossible d'ouvrir %s"
 
-#: sequencer.c:780
+#: sequencer.c:787
 #, c-format
 msgid "Could not read %s."
 msgstr "Impossible de lire %s."
 
-#: sequencer.c:787
+#: sequencer.c:794
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr "Feuille d'instruction inutilisable : %s"
 
-#: sequencer.c:815
+#: sequencer.c:824
 #, c-format
 msgid "Invalid key: %s"
 msgstr "Clé invalide: %s"
 
-#: sequencer.c:818
+#: sequencer.c:827
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr "Valeur invalide pour %s : %s"
 
-#: sequencer.c:830
+#: sequencer.c:839
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr "Feuille d'options malformée : %s"
 
-#: sequencer.c:851
+#: sequencer.c:860
 msgid "a cherry-pick or revert is already in progress"
 msgstr "un picorage ou un retour est déjà en cours"
 
-#: sequencer.c:852
+#: sequencer.c:861
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr "essayez \"git cherry-pick (--continue|--quit|-- abort)\""
 
-#: sequencer.c:856
+#: sequencer.c:865
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr "Impossible de créer le répertoire de séquenceur %s"
 
-#: sequencer.c:872 sequencer.c:957
+#: sequencer.c:881 sequencer.c:966
 #, c-format
 msgid "Error wrapping up %s."
 msgstr "Erreur lors de l'emballage de %s."
 
-#: sequencer.c:891 sequencer.c:1025
+#: sequencer.c:900 sequencer.c:1036
 msgid "no cherry-pick or revert in progress"
 msgstr "aucun picorage ou retour en cours"
 
-#: sequencer.c:893
+#: sequencer.c:902
 msgid "cannot resolve HEAD"
 msgstr "impossible de résoudre HEAD"
 
-#: sequencer.c:895
+#: sequencer.c:904
 msgid "cannot abort from a branch yet to be born"
 msgstr "impossible d'abandonner depuis une branche non encore créée"
 
-#: sequencer.c:917 builtin/apply.c:4061
+#: sequencer.c:926 builtin/apply.c:4061
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "impossible d'ouvrir %s : %s"
 
-#: sequencer.c:920
+#: sequencer.c:929
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "impossible de lire %s : %s"
 
-#: sequencer.c:921
+#: sequencer.c:930
 msgid "unexpected end of file"
 msgstr "fin de fichier inattendue"
 
-#: sequencer.c:927
+#: sequencer.c:936
 #, 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:950
+#: sequencer.c:959
 #, c-format
 msgid "Could not format %s."
 msgstr "Impossible de formater %s."
 
-#: sequencer.c:1093
+#: sequencer.c:1104
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr "%s : impossible de picorer un %s"
 
-#: sequencer.c:1096
+#: sequencer.c:1107
 #, c-format
 msgid "%s: bad revision"
 msgstr "%s : mauvaise révision"
 
-#: sequencer.c:1130
+#: sequencer.c:1141
 msgid "Can't revert as initial commit"
 msgstr "Impossible d'annuler en tant que commit initial"
 
-#: sequencer.c:1131
+#: sequencer.c:1142
 msgid "Can't cherry-pick into empty head"
 msgstr "Impossible de picorer vers une HEAD vide"
 
@@ -1412,21 +1418,21 @@ msgstr ""
 "message\n"
 "en lançant \"git config advice.objectNameWarning false\""
 
-#: sha1_name.c:1070
+#: sha1_name.c:1072
 msgid "HEAD does not point to a branch"
 msgstr "HEAD ne pointe pas sur une branche"
 
-#: sha1_name.c:1073
+#: sha1_name.c:1075
 #, c-format
 msgid "No such branch: '%s'"
 msgstr "Branche inconnue : '%s'"
 
-#: sha1_name.c:1075
+#: sha1_name.c:1077
 #, c-format
 msgid "No upstream configured for branch '%s'"
 msgstr "Aucune branche amont configurée pour la branche '%s'"
 
-#: sha1_name.c:1079
+#: sha1_name.c:1081
 #, 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"
@@ -1442,53 +1448,35 @@ msgstr ""
 msgid "Could not find section in .gitmodules where path=%s"
 msgstr "Impossible de trouver une section où path=%s dans .gitmodules"
 
-#. Maybe the user already did that, don't error out here
 #: submodule.c:76
 #, c-format
 msgid "Could not update .gitmodules entry %s"
 msgstr "Impossible de mettre à jour l'élément %s de .gitmodules"
 
 # ici %s est un chemin
-#. Maybe the user already did that, don't error out here
 #: submodule.c:109
 #, c-format
 msgid "Could not remove .gitmodules entry for %s"
 msgstr "Impossible de supprimer l'élément de .gitmodules pour %s"
 
-#: submodule.c:127
-msgid "could not find .gitmodules in index"
-msgstr "impossible de trouver .gitmodules dans l'index"
-
-#: submodule.c:133
-msgid "reading updated .gitmodules failed"
-msgstr "échec de la lecture du .gitmodules mis à jour"
-
-#: submodule.c:135
-msgid "unable to stat updated .gitmodules"
-msgstr "échec de stat du .gitmodules mis à jour"
-
-#: submodule.c:139
-msgid "unable to remove .gitmodules from index"
-msgstr "suppression du .gitmodules dans l'index impossible"
-
-#: submodule.c:141
-msgid "adding updated .gitmodules failed"
-msgstr "échec de l'ajout du .gitmodules mis à jour"
-
-#: submodule.c:143
+#: submodule.c:120
 msgid "staging updated .gitmodules failed"
 msgstr "échec de la mise en index du .gitmodules mis à jour"
 
-#: submodule.c:1144 builtin/init-db.c:363
+#: submodule.c:1121 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:1155
+#: submodule.c:1132
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "Impossible de paramétrer core.worktree dans %s"
 
+#: unpack-trees.c:206
+msgid "Checking out files"
+msgstr "Extraction des fichiers"
+
 #: urlmatch.c:120
 msgid "invalid URL scheme name or missing '://' suffix"
 msgstr "nom de schéma d'URL invalide ou suffixe '://' manquant"
@@ -1603,88 +1591,97 @@ msgid "  (use \"git %s <file>...\" to include in what will be committed)"
 msgstr ""
 "  (utilisez \"git %s <fichier>...\" pour inclure dans ce qui sera validé)"
 
-#: wt-status.c:254
-msgid "bug"
-msgstr "bogue"
-
-#: wt-status.c:259
+#: wt-status.c:252
 msgid "both deleted:"
 msgstr "supprimé des deux côtés :"
 
-#: wt-status.c:260
+#: wt-status.c:254
 msgid "added by us:"
 msgstr "ajouté par nous :"
 
-#: wt-status.c:261
+#: wt-status.c:256
 msgid "deleted by them:"
 msgstr "supprimé par eux :"
 
-#: wt-status.c:262
+#: wt-status.c:258
 msgid "added by them:"
 msgstr "ajouté par eux :"
 
-#: wt-status.c:263
+#: wt-status.c:260
 msgid "deleted by us:"
 msgstr "supprimé par nous :"
 
-#: wt-status.c:264
+#: wt-status.c:262
 msgid "both added:"
 msgstr "ajouté de deux côtés :"
 
-#: wt-status.c:265
+#: wt-status.c:264
 msgid "both modified:"
 msgstr "modifié des deux côtés :"
 
-#: wt-status.c:275
-msgid "new file"
-msgstr "nouveau fichier"
+#: wt-status.c:266
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr "bogue : état de non-fusion non géré %x"
+
+#: wt-status.c:274
+msgid "new file:"
+msgstr "nouveau fichier :"
 
-#: wt-status.c:277
-msgid "copied"
-msgstr "copié"
+#: wt-status.c:276
+msgid "copied:"
+msgstr "copié :"
 
-#: wt-status.c:279
-msgid "deleted"
-msgstr "supprimé"
+#: wt-status.c:278
+msgid "deleted:"
+msgstr "supprimé :"
 
-#: wt-status.c:285
-msgid "typechange"
-msgstr "modif. type"
+#: wt-status.c:280
+msgid "modified:"
+msgstr "modifié :"
 
-#: wt-status.c:287
-msgid "unknown"
-msgstr "inconnu"
+#: wt-status.c:282
+msgid "renamed:"
+msgstr "renommé :"
 
-#: wt-status.c:289
-msgid "unmerged"
-msgstr "non fusionné"
+#: wt-status.c:284
+msgid "typechange:"
+msgstr "modif. type :"
 
-#: wt-status.c:336
+#: wt-status.c:286
+msgid "unknown:"
+msgstr "inconnu :"
+
+#: wt-status.c:288
+msgid "unmerged:"
+msgstr "non fusionné :"
+
+#: wt-status.c:370
 msgid "new commits, "
 msgstr "nouveaux commits, "
 
-#: wt-status.c:338
+#: wt-status.c:372
 msgid "modified content, "
 msgstr "contenu modifié, "
 
-#: wt-status.c:340
+#: wt-status.c:374
 msgid "untracked content, "
 msgstr "contenu non suivi, "
 
-#: wt-status.c:357
+#: wt-status.c:391
 #, c-format
 msgid "bug: unhandled diff status %c"
 msgstr "bogue : état de diff non géré %c"
 
-#: wt-status.c:732
+#: wt-status.c:765
 msgid "Submodules changed but not updated:"
 msgstr "Sous-modules modifiés mais non mis à jour :"
 
-#: wt-status.c:734
+#: wt-status.c:767
 msgid "Submodule changes to be committed:"
 msgstr "Changements du sous-module à valider :"
 
-#: wt-status.c:836
+#: wt-status.c:846
 msgid ""
 "Do not touch the line above.\n"
 "Everything below will be removed."
@@ -1692,68 +1689,68 @@ msgstr ""
 "Ne touchez pas à la ligne ci-dessus\n"
 "Tout se qui suit sera éliminé."
 
-#: wt-status.c:899
+#: wt-status.c:937
 msgid "You have unmerged paths."
 msgstr "Vous avez des chemins non fusionnés."
 
-#: wt-status.c:902
+#: wt-status.c:940
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr "  (réglez les conflits puis lancez \"git commit\")"
 
-#: wt-status.c:905
+#: wt-status.c:943
 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:908
+#: wt-status.c:946
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr "  (utilisez \"git commit\" pour terminer la fusion)"
 
-#: wt-status.c:918
+#: wt-status.c:956
 msgid "You are in the middle of an am session."
 msgstr "Vous êtes au milieu d'une session am."
 
-#: wt-status.c:921
+#: wt-status.c:959
 msgid "The current patch is empty."
 msgstr "Le patch actuel est vide."
 
-#: wt-status.c:925
+#: wt-status.c:963
 msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr "  (réglez les conflits puis lancez \"git am --continue\")"
 
-#: wt-status.c:927
+#: wt-status.c:965
 msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr "  (utilisez \"git am --skip\" pour sauter ce patch)"
 
-#: wt-status.c:929
+#: wt-status.c:967
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr "  (utilisez \"git am --abort\" pour restaurer la branche d'origine)"
 
-#: wt-status.c:989 wt-status.c:1006
+#: wt-status.c:1027 wt-status.c:1044
 #, 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:994 wt-status.c:1011
+#: wt-status.c:1032 wt-status.c:1049
 msgid "You are currently rebasing."
 msgstr "Vous êtes en train de rebaser."
 
-#: wt-status.c:997
+#: wt-status.c:1035
 msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr "  (réglez les conflits puis lancez \"git rebase --continue\")"
 
-#: wt-status.c:999
+#: wt-status.c:1037
 msgid "  (use \"git rebase --skip\" to skip this patch)"
 msgstr "  (utilisez \"git rebase --skip\" pour sauter ce patch)"
 
-#: wt-status.c:1001
+#: wt-status.c:1039
 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:1014
+#: wt-status.c:1052
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr "  (tous les conflits sont réglés : lancez \"git rebase --continue\")"
 
-#: wt-status.c:1018
+#: wt-status.c:1056
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
@@ -1761,120 +1758,120 @@ msgstr ""
 "Vous êtes actuellement en train de fractionner un commit pendant un rebasage "
 "de la branche '%s' sur '%s'."
 
-#: wt-status.c:1023
+#: wt-status.c:1061
 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:1026
+#: wt-status.c:1064
 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:1030
+#: wt-status.c:1068
 #, 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:1035
+#: wt-status.c:1073
 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:1038
+#: wt-status.c:1076
 msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr "  (utilisez \"git commit --amend\" pour corriger le commit actuel)"
 
-#: wt-status.c:1040
+#: wt-status.c:1078
 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:1050
+#: wt-status.c:1088
 #, c-format
 msgid "You are currently cherry-picking commit %s."
 msgstr "Vous êtes actuellement en train de picorer le commit %s."
 
-#: wt-status.c:1055
+#: wt-status.c:1093
 msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
 msgstr "  (réglez les conflits puis lancez \"git cherry-pick --continue\")"
 
-#: wt-status.c:1058
+#: wt-status.c:1096
 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:1060
+#: wt-status.c:1098
 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:1069
+#: wt-status.c:1107
 #, c-format
 msgid "You are currently reverting commit %s."
 msgstr "Vous êtes actuellement en train de rétablir le commit %s."
 
-#: wt-status.c:1074
+#: wt-status.c:1112
 msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr "  (réglez les conflits puis lancez \"git revert --continue\")"
 
-#: wt-status.c:1077
+#: wt-status.c:1115
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr "  (tous les conflits sont réglés : lancez \"git revert --continue\")"
 
-#: wt-status.c:1079
+#: wt-status.c:1117
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr "  (utilisez \"git revert --abort\" pour annuler le rétablissement)"
 
-#: wt-status.c:1090
+#: wt-status.c:1128
 #, 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:1094
+#: wt-status.c:1132
 msgid "You are currently bisecting."
 msgstr "Vous êtes en cours de bissection."
 
-#: wt-status.c:1097
+#: wt-status.c:1135
 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:1272
+#: wt-status.c:1310
 msgid "On branch "
 msgstr "Sur la branche "
 
-#: wt-status.c:1279
+#: wt-status.c:1317
 msgid "rebase in progress; onto "
 msgstr "rebasage en cours ; sur "
 
-#: wt-status.c:1286
+#: wt-status.c:1324
 msgid "HEAD detached at "
 msgstr "HEAD détachée sur "
 
-#: wt-status.c:1288
+#: wt-status.c:1326
 msgid "HEAD detached from "
 msgstr "HEAD détachée depuis "
 
-#: wt-status.c:1291
+#: wt-status.c:1329
 msgid "Not currently on any branch."
 msgstr "Actuellement sur aucun branche."
 
-#: wt-status.c:1308
+#: wt-status.c:1346
 msgid "Initial commit"
 msgstr "Validation initiale"
 
-#: wt-status.c:1322
+#: wt-status.c:1360
 msgid "Untracked files"
 msgstr "Fichiers non suivis"
 
-#: wt-status.c:1324
+#: wt-status.c:1362
 msgid "Ignored files"
 msgstr "Fichiers ignorés"
 
-#: wt-status.c:1328
+#: wt-status.c:1366
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1886,32 +1883,32 @@ msgstr ""
 "oublier d'ajouter les nouveaux fichiers par vous-même (voir 'git help "
 "status')."
 
-#: wt-status.c:1334
+#: wt-status.c:1372
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr "Fichiers non suivis non affichés%s"
 
-#: wt-status.c:1336
+#: wt-status.c:1374
 msgid " (use -u option to show untracked files)"
 msgstr " (utilisez -u pour afficher les fichiers non suivis)"
 
-#: wt-status.c:1342
+#: wt-status.c:1380
 msgid "No changes"
 msgstr "Aucune modification"
 
-#: wt-status.c:1347
+#: wt-status.c:1385
 #, 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:1350
+#: wt-status.c:1388
 #, c-format
 msgid "no changes added to commit\n"
 msgstr "aucune modification ajoutée à la validation\n"
 
-#: wt-status.c:1353
+#: wt-status.c:1391
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
@@ -1920,292 +1917,208 @@ msgstr ""
 "aucune modification ajoutée à la validation mais des fichiers non suivis "
 "sont présents (utilisez \"git add\" pour les suivre)\n"
 
-#: wt-status.c:1356
+#: wt-status.c:1394
 #, 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:1359
+#: wt-status.c:1397
 #, 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:1362 wt-status.c:1367
+#: wt-status.c:1400 wt-status.c:1405
 #, c-format
 msgid "nothing to commit\n"
 msgstr "rien à valider\n"
 
-#: wt-status.c:1365
+#: wt-status.c:1403
 #, 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:1369
+#: wt-status.c:1407
 #, c-format
 msgid "nothing to commit, working directory clean\n"
 msgstr "rien à valider, la copie de travail est propre\n"
 
-#: wt-status.c:1478
+#: wt-status.c:1516
 msgid "HEAD (no branch)"
 msgstr "HEAD (aucune branche)"
 
-#: wt-status.c:1484
+#: wt-status.c:1522
 msgid "Initial commit on "
 msgstr "Validation initiale sur "
 
 # à priori on parle d'une branche ici
-#: wt-status.c:1514
+#: wt-status.c:1554
 msgid "gone"
 msgstr "disparue"
 
-#: wt-status.c:1516
+#: wt-status.c:1556 wt-status.c:1564
 msgid "behind "
 msgstr "derrière "
 
-#: wt-status.c:1519 wt-status.c:1522
-msgid "ahead "
-msgstr "devant "
-
-#: wt-status.c:1524
-msgid ", behind "
-msgstr ", derrière "
-
 #: compat/precompose_utf8.c:55 builtin/clone.c:356
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "échec lors de l'unlink de '%s'"
 
-#: builtin/add.c:20
+#: builtin/add.c:21
 msgid "git add [options] [--] <pathspec>..."
 msgstr "git add [options] [--] <chemin>..."
 
-#.
-#. * To be consistent with "git add -p" and most Git
-#. * commands, we should default to being tree-wide, but
-#. * this is not the original behavior and can't be
-#. * changed until users trained themselves not to type
-#. * "git add -u" or "git add -A". For now, we warn and
-#. * keep the old behavior. Later, the behavior can be changed
-#. * to tree-wide, keeping the warning for a while, and
-#. * eventually we can drop the warning.
-#.
-#: builtin/add.c:58
-#, c-format
-msgid ""
-"The behavior of 'git add %s (or %s)' with no path argument from a\n"
-"subdirectory of the tree will change in Git 2.0 and should not be used "
-"anymore.\n"
-"To add content for the whole tree, run:\n"
-"\n"
-"  git add %s :/\n"
-"  (or git add %s :/)\n"
-"\n"
-"To restrict the command to the current directory, run:\n"
-"\n"
-"  git add %s .\n"
-"  (or git add %s .)\n"
-"\n"
-"With the current Git version, the command is restricted to the current "
-"directory.\n"
-msgstr ""
-"Le comportement de 'git add %s (ou %s)' sans argument de chemin depuis un\n"
-"sous-répertoire du projet va changer dans Git 2.0 et ne doit plus être "
-"utilisé.\n"
-"Pour ajouter le contenu de toute l'arborescence, lancez :\n"
-"\n"
-"  git add %s :/\n"
-"  (ou git add %s :/)\n"
-"\n"
-"Pour restreindre la commande au répertoire courant, lancez :\n"
-"\n"
-"  git add %s .\n"
-"  (ou git add %s .)\n"
-"\n"
-"Avec la version actuelle de Git, la commande est restreinte au répertoire "
-"courant.\n"
-
-#: builtin/add.c:100
-#, c-format
-msgid ""
-"You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
-"whose behaviour will change in Git 2.0 with respect to paths you removed.\n"
-"Paths like '%s' that are\n"
-"removed from your working tree are ignored with this version of Git.\n"
-"\n"
-"* 'git add --ignore-removal <pathspec>', which is the current default,\n"
-"  ignores paths you removed from your working tree.\n"
-"\n"
-"* 'git add --all <pathspec>' will let you also record the removals.\n"
-"\n"
-"Run 'git status' to check the paths you removed from your working tree.\n"
-msgstr ""
-"Vous avez lancé 'git add' sans '-A (--all)' ni '--ignore-removal',\n"
-"dont le comportement va changer dans Git 2.0 avec le respect des chemins que "
-"vous supprimez.\n"
-"Les chemins tels que '%s' qui ont été\n"
-"retirés de votre copie de travail sont ignorés avec cette version de Git.\n"
-"\n"
-"* 'git add --ignore-removal <chemin>', qui est l'option par défaut "
-"actuelle,\n"
-"  ignore les chemins que vous avez supprimés de votre copie de travail.\n"
-"\n"
-"* 'git add --all <chemin>' permet d'enregistrer aussi les suppressions.\n"
-"\n"
-"Lancez 'git status' pour vérifier les chemins que vous avez supprimés de "
-"votre copie de travail.\n"
-
-#: builtin/add.c:144
+#: builtin/add.c:64
 #, c-format
 msgid "unexpected diff status %c"
 msgstr "status de diff inattendu %c"
 
-#: builtin/add.c:149 builtin/commit.c:260
+#: builtin/add.c:69 builtin/commit.c:261
 msgid "updating files failed"
 msgstr "échec de la mise à jour des fichiers"
 
-#: builtin/add.c:163
+#: builtin/add.c:79
 #, c-format
 msgid "remove '%s'\n"
 msgstr "suppression de '%s'\n"
 
-#: builtin/add.c:237
+#: builtin/add.c:133
 msgid "Unstaged changes after refreshing the index:"
 msgstr "Modifications non indexées après rafraîchissement de l'index :"
 
-#: builtin/add.c:299
+#: builtin/add.c:193
 msgid "Could not read the index"
 msgstr "Impossible de lire l'index"
 
-#: builtin/add.c:310
+#: builtin/add.c:204
 #, c-format
 msgid "Could not open '%s' for writing."
 msgstr "Impossible d'ouvrir '%s' en écriture."
 
-#: builtin/add.c:314
+#: builtin/add.c:208
 msgid "Could not write patch"
 msgstr "Impossible d'écrire le patch"
 
-#: builtin/add.c:319
+#: builtin/add.c:213
 #, c-format
 msgid "Could not stat '%s'"
 msgstr "Stat de '%s' impossible"
 
-#: builtin/add.c:321
+#: builtin/add.c:215
 msgid "Empty patch. Aborted."
 msgstr "Patch vide. Abandon."
 
-#: builtin/add.c:327
+#: builtin/add.c:221
 #, c-format
 msgid "Could not apply '%s'"
 msgstr "Impossible d'appliquer '%s'"
 
-#: builtin/add.c:337
+#: builtin/add.c:231
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr ""
 "Les chemins suivants sont ignorés par un de vos fichiers .gitignore :\n"
 
-#: builtin/add.c:354 builtin/clean.c:875 builtin/fetch.c:93 builtin/mv.c:70
-#: builtin/prune-packed.c:77 builtin/push.c:506 builtin/remote.c:1344
+#: 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/rm.c:269
 msgid "dry run"
 msgstr "simuler l'action"
 
-#: builtin/add.c:355 builtin/apply.c:4410 builtin/check-ignore.c:19
-#: builtin/commit.c:1249 builtin/count-objects.c:95 builtin/fsck.c:612
+#: 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
 msgid "be verbose"
 msgstr "mode verbeux"
 
-#: builtin/add.c:357
+#: builtin/add.c:251
 msgid "interactive picking"
 msgstr "sélection interactive"
 
-#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
 msgid "select hunks interactively"
 msgstr "sélection interactive des sections"
 
-#: builtin/add.c:359
+#: builtin/add.c:253
 msgid "edit current diff and apply"
 msgstr "édition du diff actuel et application"
 
-#: builtin/add.c:360
+#: builtin/add.c:254
 msgid "allow adding otherwise ignored files"
 msgstr "permettre l'ajout de fichiers ignorés"
 
-#: builtin/add.c:361
+#: builtin/add.c:255
 msgid "update tracked files"
 msgstr "mettre à jour les fichiers suivis"
 
-#: builtin/add.c:362
+#: builtin/add.c:256
 msgid "record only the fact that the path will be added later"
 msgstr "enregistrer seulement le fait que le chemin sera ajouté plus tard"
 
-#: builtin/add.c:363
+#: builtin/add.c:257
 msgid "add changes from all tracked and untracked files"
 msgstr "ajouter les modifications de tous les fichiers suivis et non suivis"
 
-#. takes no arguments
-#: builtin/add.c:366
+#: builtin/add.c:260
 msgid "ignore paths removed in the working tree (same as --no-all)"
 msgstr ""
 "ignorer les chemins effacés dans la copie de travail (identique à --no-all)"
 
-#: builtin/add.c:368
+#: builtin/add.c:262
 msgid "don't add, only refresh the index"
 msgstr "ne pas ajouter, juste rafraîchir l'index"
 
-#: builtin/add.c:369
+#: builtin/add.c:263
 msgid "just skip files which cannot be added because of errors"
 msgstr ""
 "sauter seulement les fichiers qui ne peuvent pas être ajoutés du fait "
 "d'erreurs"
 
-#: builtin/add.c:370
+#: builtin/add.c:264
 msgid "check if - even missing - files are ignored in dry run"
 msgstr "vérifier si des fichiers - même manquants - sont ignorés, à vide"
 
-#: builtin/add.c:392
+#: builtin/add.c:286
 #, c-format
 msgid "Use -f if you really want to add them.\n"
 msgstr "Utilisez -f si vous voulez réellement les ajouter.\n"
 
-#: builtin/add.c:393
+#: builtin/add.c:287
 msgid "no files added"
 msgstr "aucun fichier ajouté"
 
-#: builtin/add.c:399
+#: builtin/add.c:293
 msgid "adding files failed"
 msgstr "échec de l'ajout de fichiers"
 
-#: builtin/add.c:438
+#: builtin/add.c:330
 msgid "-A and -u are mutually incompatible"
 msgstr "-A et -u sont mutuellement incompatibles"
 
-#: builtin/add.c:456
+#: builtin/add.c:337
 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:486
+#: builtin/add.c:358
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Rien de spécifié, rien n'a été ajouté.\n"
 
-#: builtin/add.c:487
+#: builtin/add.c:359
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "Vous vouliez sûrement dire 'git add .' ?\n"
 
-#: builtin/add.c:492 builtin/check-ignore.c:172 builtin/clean.c:919
-#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:224 builtin/rm.c:299
+#: 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
 msgid "index file corrupt"
 msgstr "fichier d'index corrompu"
 
-#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432
+#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
 msgid "Unable to write new index file"
 msgstr "Impossible d'écrire le nouveau fichier d'index"
 
@@ -2323,7 +2236,6 @@ msgstr "** attention : le fichier %s devient vide mais n'est pas supprimé"
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "patch binaire corrompu à la ligne %d : %.*s"
 
-#. there has to be one hunk (forward hunk)
 #: builtin/apply.c:1900
 #, c-format
 msgid "unrecognized binary patch at line %d"
@@ -2467,7 +2379,7 @@ msgstr "%s : le patch ne s'applique pas"
 msgid "Checking patch %s..."
 msgstr "Vérification du patch %s..."
 
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127
+#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "échec de make_cache_entry pour le chemin '%s'"
@@ -2518,7 +2430,6 @@ msgstr "Patch %s appliqué proprement."
 msgid "internal error"
 msgstr "erreur interne"
 
-#. Say this even without --verbose
 #: builtin/apply.c:4043
 #, c-format
 msgid "Applying patch %%s with %d reject..."
@@ -2612,7 +2523,7 @@ 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:452
+#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
 msgid "paths are separated with NUL character"
 msgstr "les chemins sont séparés par un caractère NUL"
 
@@ -2754,100 +2665,100 @@ msgstr "git blame [options] [options-de-révision] [rev] [--] fichier"
 msgid "[rev-opts] are documented in git-rev-list(1)"
 msgstr "[options-de-révision] sont documentés dans git-rev-list(1)"
 
-#: builtin/blame.c:2249
+#: builtin/blame.c:2242
 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:2250
+#: builtin/blame.c:2243
 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:2251
+#: builtin/blame.c:2244
 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:2252
+#: builtin/blame.c:2245
 msgid "Show work cost statistics"
 msgstr "Montrer les statistiques de coût d'activité"
 
-#: builtin/blame.c:2253
+#: builtin/blame.c:2246
 msgid "Show output score for blame entries"
 msgstr "Montrer le score de sortie pour les éléments de blâme"
 
-#: builtin/blame.c:2254
+#: builtin/blame.c:2247
 msgid "Show original filename (Default: auto)"
 msgstr "Montrer les noms de fichier originaux (Défaut : auto)"
 
-#: builtin/blame.c:2255
+#: builtin/blame.c:2248
 msgid "Show original linenumber (Default: off)"
 msgstr "Montrer les numéros de lignes originaux (Défaut : désactivé)"
 
-#: builtin/blame.c:2256
+#: builtin/blame.c:2249
 msgid "Show in a format designed for machine consumption"
 msgstr "Afficher dans un format propice à la consommation par machine"
 
-#: builtin/blame.c:2257
+#: builtin/blame.c:2250
 msgid "Show porcelain format with per-line commit information"
 msgstr "Afficher en format porcelaine avec l'information de commit par ligne"
 
-#: builtin/blame.c:2258
+#: builtin/blame.c:2251
 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:2259
+#: builtin/blame.c:2252
 msgid "Show raw timestamp (Default: off)"
 msgstr "Afficher les horodatages bruts (Défaut : désactivé)"
 
-#: builtin/blame.c:2260
+#: builtin/blame.c:2253
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Afficher les longs SHA1 de commits (Défaut : désactivé)"
 
-#: builtin/blame.c:2261
+#: builtin/blame.c:2254
 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:2262
+#: builtin/blame.c:2255
 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:2263
+#: builtin/blame.c:2256
 msgid "Ignore whitespace differences"
 msgstr "Ignorer les différences d'espace"
 
-#: builtin/blame.c:2264
+#: builtin/blame.c:2257
 msgid "Spend extra cycles to find better match"
 msgstr ""
 "Dépenser des cycles supplémentaires pour trouver une meilleure correspondance"
 
-#: builtin/blame.c:2265
+#: builtin/blame.c:2258
 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:2266
+#: builtin/blame.c:2259
 msgid "Use <file>'s contents as the final image"
 msgstr "Utiliser le contenu de <fichier> comme image finale"
 
-#: builtin/blame.c:2267 builtin/blame.c:2268
+#: builtin/blame.c:2260 builtin/blame.c:2261
 msgid "score"
 msgstr "score"
 
-#: builtin/blame.c:2267
+#: builtin/blame.c:2260
 msgid "Find line copies within and across files"
 msgstr "Trouver les copies de ligne dans et entre les fichiers"
 
-#: builtin/blame.c:2268
+#: builtin/blame.c:2261
 msgid "Find line movements within and across files"
 msgstr "Trouver les mouvements de ligne dans et entre les fichiers"
 
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
 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"
@@ -3093,8 +3004,9 @@ 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:1460 builtin/commit.c:1461
-#: builtin/commit.c:1462 builtin/commit.c:1463 builtin/tag.c:468
+#: 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
 msgid "commit"
 msgstr "commit"
 
@@ -3281,44 +3193,44 @@ msgstr "La création d'un colis requiert un dépôt."
 msgid "Need a repository to unbundle."
 msgstr "Le dépaquetage d'un colis requiert un dépôt."
 
-#: builtin/cat-file.c:328
+#: builtin/cat-file.c:331
 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:329
+#: builtin/cat-file.c:332
 msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
 msgstr "git cat-file (--batch|--batch-check) < <liste_d_objets>"
 
-#: builtin/cat-file.c:366
+#: builtin/cat-file.c:369
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<type> peut être : blob, tree, commit ou tag"
 
-#: builtin/cat-file.c:367
+#: builtin/cat-file.c:370
 msgid "show object type"
 msgstr "afficher le type de l'objet"
 
-#: builtin/cat-file.c:368
+#: builtin/cat-file.c:371
 msgid "show object size"
 msgstr "afficher la taille de l'objet"
 
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:373
 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:371
+#: builtin/cat-file.c:374
 msgid "pretty-print object's content"
 msgstr "afficher avec mise en forme le contenu de l'objet"
 
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:376
 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:375
+#: builtin/cat-file.c:378
 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:378
+#: builtin/cat-file.c:381
 msgid "show info about objects fed from the standard input"
 msgstr "afficher l'information des objets passés en entrée standard"
 
@@ -3348,7 +3260,7 @@ msgid "terminate input and output records by a NUL character"
 msgstr ""
 "terminer les enregistrements en entrée et en sortie par un caractère NUL"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
 msgid "suppress progress reporting"
 msgstr "supprimer l'état d'avancement"
 
@@ -3503,60 +3415,59 @@ msgstr ""
 "Impossible de mettre à jour les chemins et basculer sur la branche '%s' en "
 "même temps."
 
-#: builtin/checkout.c:261 builtin/checkout.c:451
+#: builtin/checkout.c:261 builtin/checkout.c:450
 msgid "corrupt index file"
 msgstr "fichier d'index corrompu"
 
-#: builtin/checkout.c:322 builtin/checkout.c:329
+#: builtin/checkout.c:321 builtin/checkout.c:328
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "le chemin '%s' n'est pas fusionné"
 
-#: builtin/checkout.c:473
+#: builtin/checkout.c:472
 msgid "you need to resolve your current index first"
 msgstr "vous devez d'abord résoudre votre index courant"
 
-#: builtin/checkout.c:594
+#: builtin/checkout.c:593
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr "Impossible de faire un reflog pour '%s'\n"
 
-#: builtin/checkout.c:632
+#: builtin/checkout.c:631
 msgid "HEAD is now at"
 msgstr "HEAD est maintenant sur"
 
-#: builtin/checkout.c:639
+#: builtin/checkout.c:638
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Remise à zéro de la branche '%s'\n"
 
-#: builtin/checkout.c:642
+#: builtin/checkout.c:641
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Déjà sur '%s'\n"
 
-#: builtin/checkout.c:646
+#: builtin/checkout.c:645
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Basculement et remise à zéro de la branche '%s'\n"
 
-#: builtin/checkout.c:648 builtin/checkout.c:1033
+#: builtin/checkout.c:647 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:650
+#: builtin/checkout.c:649
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Basculement sur la branche '%s'\n"
 
-#: builtin/checkout.c:706
+#: builtin/checkout.c:705
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... et %d en plus.\n"
 
-#. The singular version
-#: builtin/checkout.c:712
+#: builtin/checkout.c:711
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -3569,17 +3480,17 @@ msgid_plural ""
 "\n"
 "%s\n"
 msgstr[0] ""
-"Attention : vous laissez %d commit en retard, non connectés à\n"
+"Attention : vous abandonnez %d commit, non connecté à\n"
 "une branche :\n"
 "\n"
 "%s\n"
 msgstr[1] ""
-"Attention : vous laissez %d commits en retard, non connectés à\n"
+"Attention : vous abandonnez %d commits, non connectés à\n"
 "une branche :\n"
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:730
+#: builtin/checkout.c:729
 #, c-format
 msgid ""
 "If you want to keep them by creating a new branch, this may be a good time\n"
@@ -3590,145 +3501,144 @@ msgid ""
 msgstr ""
 "Si vous souhaitez les garder en créant une nouvelle branche, c'est le bon "
 "moment\n"
-"de le faire avec :\n"
+"pour le faire avec :\n"
 "\n"
-"git branche nouvelle_branche %s\n"
+"git branch nouvelle_branche %s\n"
 "\n"
 
-#: builtin/checkout.c:760
+#: builtin/checkout.c:759
 msgid "internal error in revision walk"
 msgstr "erreur interne lors du parcours des révisions"
 
-#: builtin/checkout.c:764
+#: builtin/checkout.c:763
 msgid "Previous HEAD position was"
 msgstr "La position précédente de HEAD était"
 
-#: builtin/checkout.c:791 builtin/checkout.c:1028
+#: builtin/checkout.c:790 builtin/checkout.c:1027
 msgid "You are on a branch yet to be born"
 msgstr "Vous êtes sur une branche qui doit encore naître"
 
-#: builtin/checkout.c:935
+#: builtin/checkout.c:934
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "une seule référence attendue, %d fournies."
 
-#: builtin/checkout.c:974
+#: builtin/checkout.c:973
 #, c-format
 msgid "invalid reference: %s"
 msgstr "référence invalide : %s"
 
-#. case (1): want a tree
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "la référence n'est pas un arbre : %s"
 
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
 msgid "paths cannot be used with switching branches"
 msgstr "impossible d'utiliser des chemins avec un basculement de branches"
 
-#: builtin/checkout.c:1045 builtin/checkout.c:1049
+#: builtin/checkout.c:1044 builtin/checkout.c:1048
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' ne peut pas être utilisé avec un basculement de branches"
 
-#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1052 builtin/checkout.c:1055 builtin/checkout.c:1060
+#: builtin/checkout.c:1063
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' ne peut pas être utilisé avec '%s'"
 
-#: builtin/checkout.c:1069
+#: builtin/checkout.c:1068
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Impossible de basculer de branche vers '%s' qui n'est pas un commit"
 
-#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
 #: builtin/remote.c:159 builtin/remote.c:161
 msgid "branch"
 msgstr "branche"
 
-#: builtin/checkout.c:1092
+#: builtin/checkout.c:1091
 msgid "create and checkout a new branch"
 msgstr "créer et extraire une nouvelle branche"
 
-#: builtin/checkout.c:1094
+#: builtin/checkout.c:1093
 msgid "create/reset and checkout a branch"
 msgstr "créer/réinitialiser et extraire une branche"
 
-#: builtin/checkout.c:1095
+#: builtin/checkout.c:1094
 msgid "create reflog for new branch"
 msgstr "créer un reflog pour une nouvelle branche"
 
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
 msgid "detach the HEAD at named commit"
 msgstr "détacher la HEAD à la validation nommée"
 
-#: builtin/checkout.c:1097
+#: builtin/checkout.c:1096
 msgid "set upstream info for new branch"
-msgstr "paramétrer l'information de branche amont pour une nouvelle branche"
+msgstr "paramétrer les coordonnées de branche amont pour une nouvelle branche"
 
-#: builtin/checkout.c:1099
-msgid "new branch"
+#: builtin/checkout.c:1098
+msgid "new-branch"
 msgstr "nouvelle branche"
 
-#: builtin/checkout.c:1099
+#: builtin/checkout.c:1098
 msgid "new unparented branch"
 msgstr "nouvelle branche sans parent"
 
-#: builtin/checkout.c:1100
+#: builtin/checkout.c:1099
 msgid "checkout our version for unmerged files"
 msgstr "extraire notre version pour les fichiers non fusionnés"
 
-#: builtin/checkout.c:1102
+#: builtin/checkout.c:1101
 msgid "checkout their version for unmerged files"
 msgstr "extraire leur version pour les fichiers non fusionnés"
 
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1103
 msgid "force checkout (throw away local modifications)"
 msgstr "forcer l'extraction (laisser tomber les modifications locales)"
 
-#: builtin/checkout.c:1105
+#: builtin/checkout.c:1104
 msgid "perform a 3-way merge with the new branch"
 msgstr "effectuer une fusion à 3 points avec la nouvelle branche"
 
-#: builtin/checkout.c:1106 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:225
 msgid "update ignored files (default)"
 msgstr "mettre à jour les fichiers ignorés (par défaut)"
 
-#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248
+#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
 msgid "style"
 msgstr "style"
 
-#: builtin/checkout.c:1108
+#: builtin/checkout.c:1107
 msgid "conflict style (merge or diff3)"
 msgstr "style de conflit (fusion ou diff3)"
 
-#: builtin/checkout.c:1111
+#: builtin/checkout.c:1110
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "ne pas limiter les spécificateurs de chemins aux seuls éléments creux"
 
-#: builtin/checkout.c:1113
+#: builtin/checkout.c:1112
 msgid "second guess 'git checkout no-such-branch'"
 msgstr "deuxième chance 'git checkout branche-inexistante'"
 
-#: builtin/checkout.c:1136
+#: builtin/checkout.c:1135
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B et --orphan sont mutuellement exclusifs"
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
 msgid "--track needs a branch name"
 msgstr "--track requiert un nom de branche"
 
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1159
 msgid "Missing branch name; try -b"
 msgstr "Nom de branche manquant ; essayez -b"
 
-#: builtin/checkout.c:1197
+#: builtin/checkout.c:1196
 msgid "invalid path specification"
 msgstr "spécification de chemin invalide"
 
-#: builtin/checkout.c:1204
+#: builtin/checkout.c:1203
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3738,12 +3648,12 @@ msgstr ""
 "en même temps.\n"
 "Souhaitiez-vous extraire '%s' qui ne peut être résolu comme commit ?"
 
-#: builtin/checkout.c:1209
+#: builtin/checkout.c:1208
 #, 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:1213
+#: builtin/checkout.c:1212
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -3782,7 +3692,7 @@ msgstr "Ignorerait le dépôt %s\n"
 msgid "failed to remove %s"
 msgstr "échec de la suppression de %s"
 
-#: builtin/clean.c:294
+#: builtin/clean.c:295
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -3794,7 +3704,7 @@ msgstr ""
 "foo         - sélectionner un élément par un préfixe unique\n"
 "            - (vide) ne rien sélectionner"
 
-#: builtin/clean.c:298
+#: builtin/clean.c:299
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -3814,35 +3724,35 @@ msgstr ""
 "*          - choisir tous les éléments\n"
 "           - (vide) terminer la sélection"
 
-#: builtin/clean.c:516
+#: builtin/clean.c:517
 #, c-format
 msgid "Huh (%s)?"
 msgstr "Hein (%s) ?"
 
-#: builtin/clean.c:659
+#: builtin/clean.c:660
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Entrez les motifs à ignorer>> "
 
-#: builtin/clean.c:696
+#: builtin/clean.c:697
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "ATTENTION : Impossible de trouver les éléments correspondant à : %s"
 
-#: builtin/clean.c:717
+#: builtin/clean.c:718
 msgid "Select items to delete"
 msgstr "Sélectionner les éléments à supprimer"
 
-#: builtin/clean.c:757
+#: builtin/clean.c:758
 #, c-format
 msgid "remove %s? "
 msgstr "supprimer %s ? "
 
-#: builtin/clean.c:782
+#: builtin/clean.c:783
 msgid "Bye."
 msgstr "Au revoir."
 
-#: builtin/clean.c:790
+#: builtin/clean.c:791
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -3860,72 +3770,70 @@ msgstr ""
 "help                - cet écran\n"
 "?                   - aide pour la sélection en ligne"
 
-#: builtin/clean.c:817
+#: builtin/clean.c:818
 msgid "*** Commands ***"
 msgstr "*** Commandes ***"
 
-#: builtin/clean.c:818
+#: builtin/clean.c:819
 msgid "What now"
 msgstr "Et maintenant ?"
 
-#: builtin/clean.c:826
+#: builtin/clean.c:827
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Supprimerait l'élément suivant :"
 msgstr[1] "Supprimerait les éléments suivants :"
 
-#: builtin/clean.c:843
+#: builtin/clean.c:844
 msgid "No more files to clean, exiting."
 msgstr "Plus de fichier à nettoyer, sortie."
 
-#: builtin/clean.c:874
+#: builtin/clean.c:875
 msgid "do not print names of files removed"
 msgstr "ne pas afficher les noms des fichiers supprimés"
 
-#: builtin/clean.c:876
+#: builtin/clean.c:877
 msgid "force"
 msgstr "forcer"
 
-#: builtin/clean.c:877
+#: builtin/clean.c:878
 msgid "interactive cleaning"
 msgstr "nettoyage interactif"
 
-#: builtin/clean.c:879
+#: builtin/clean.c:880
 msgid "remove whole directories"
 msgstr "supprimer les répertoires entiers"
 
-#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:718
-#: builtin/ls-files.c:483 builtin/name-rev.c:314 builtin/show-ref.c:185
+#: 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
 msgid "pattern"
 msgstr "motif"
 
-#: builtin/clean.c:881
+#: builtin/clean.c:882
 msgid "add <pattern> to ignore rules"
 msgstr "ajouter <motif> aux règles ignore"
 
-#: builtin/clean.c:882
+#: builtin/clean.c:883
 msgid "remove ignored files, too"
 msgstr "supprimer les fichiers ignorés, aussi"
 
-#: builtin/clean.c:884
+#: builtin/clean.c:885
 msgid "remove only ignored files"
 msgstr "supprimer seulement les fichiers ignorés"
 
-#: builtin/clean.c:902
+#: builtin/clean.c:903
 msgid "-x and -X cannot be used together"
 msgstr "-x et -X ne peuvent pas être utilisés ensemble"
 
-#: builtin/clean.c:906
+#: builtin/clean.c:907
 msgid ""
-"clean.requireForce set to true and neither -i, -n nor -f given; refusing to "
+"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:909
+#: builtin/clean.c:910
 msgid ""
-"clean.requireForce defaults to true and neither -i, -n nor -f given; "
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
 msgstr ""
 "clean.requireForce à true par défaut et ni -i, -n ou -f fourni ; refus de "
@@ -3936,15 +3844,15 @@ 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:521
+#: builtin/push.c:504
 msgid "force progress reporting"
-msgstr "forcer l'état d'avancement"
+msgstr "forcer l'affichage de l'état d'avancement"
 
 #: builtin/clone.c:66
 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:488
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
 msgid "create a bare repository"
 msgstr "créer un dépôt nu"
 
@@ -3968,11 +3876,11 @@ msgstr "régler comme dépôt partagé"
 msgid "initialize submodules in the clone"
 msgstr "initialiser les sous-modules dans le clone"
 
-#: builtin/clone.c:82 builtin/init-db.c:485
+#: builtin/clone.c:82 builtin/init-db.c:483
 msgid "template-directory"
 msgstr "répertoire-modèle"
 
-#: builtin/clone.c:83 builtin/init-db.c:486
+#: builtin/clone.c:83 builtin/init-db.c:484
 msgid "directory from which templates will be used"
 msgstr "répertoire depuis lequel les modèles vont être utilisés"
 
@@ -3996,7 +3904,7 @@ msgstr "extraire <branche> au lieu de la HEAD du répertoire distant"
 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:663
+#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
 msgid "depth"
 msgstr "profondeur"
 
@@ -4008,11 +3916,11 @@ msgstr "créer un clone superficiel de cette profondeur"
 msgid "clone only one branch, HEAD or --branch"
 msgstr "cloner seulement une branche, HEAD ou --branch"
 
-#: builtin/clone.c:96 builtin/init-db.c:494
+#: builtin/clone.c:96 builtin/init-db.c:492
 msgid "gitdir"
 msgstr "gitdir"
 
-#: builtin/clone.c:97 builtin/init-db.c:495
+#: builtin/clone.c:97 builtin/init-db.c:493
 msgid "separate git dir from working tree"
 msgstr "séparer le répertoire git de la copie de travail"
 
@@ -4248,7 +4156,7 @@ msgid ""
 msgstr ""
 "Votre nom et votre adresse e-mail ont été configurés automatiquement en se "
 "fondant\n"
-"sur votre nom d'utilisateur et votre nom d'ordinateur. Veuillez vérifier "
+"sur votre nom d'utilisateur et le nom de votre machine. Veuillez vérifier "
 "qu'ils sont corrects.\n"
 "Vous pouvez supprimer ce message en les paramétrant explicitement :\n"
 "\n"
@@ -4305,67 +4213,67 @@ msgstr ""
 "Puis \"git cherry-pick --continue\" continuera le picorage \n"
 "des commits restants.\n"
 
-#: builtin/commit.c:287
+#: builtin/commit.c:288
 msgid "failed to unpack HEAD tree object"
 msgstr "échec du dépaquetage de l'objet arbre HEAD"
 
-#: builtin/commit.c:329
+#: builtin/commit.c:330
 msgid "unable to create temporary index"
 msgstr "impossible de créer l'index temporaire"
 
-#: builtin/commit.c:335
+#: builtin/commit.c:336
 msgid "interactive add failed"
 msgstr "échec de l'ajout interactif"
 
-#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439
+#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
 msgid "unable to write new_index file"
 msgstr "impossible d'écrire le fichier new_index"
 
-#: builtin/commit.c:420
+#: builtin/commit.c:421
 msgid "cannot do a partial commit during a merge."
 msgstr "impossible de faire une validation partielle pendant une fusion."
 
-#: builtin/commit.c:422
+#: builtin/commit.c:423
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "impossible de faire une validation partielle pendant un picorage."
 
-#: builtin/commit.c:432
+#: builtin/commit.c:433
 msgid "cannot read the index"
 msgstr "impossible de lire l'index"
 
-#: builtin/commit.c:452
+#: builtin/commit.c:453
 msgid "unable to write temporary index file"
 msgstr "impossible d'écrire le fichier d'index temporaire"
 
-#: builtin/commit.c:543 builtin/commit.c:549
+#: builtin/commit.c:544 builtin/commit.c:550
 #, c-format
 msgid "invalid commit: %s"
 msgstr "commit invalide : %s"
 
-#: builtin/commit.c:571
+#: builtin/commit.c:572
 msgid "malformed --author parameter"
 msgstr "paramètre --author mal formé"
 
-#: builtin/commit.c:591
+#: builtin/commit.c:592
 #, c-format
 msgid "Malformed ident string: '%s'"
 msgstr "Chaîne ident mal formée : '%s'"
 
-#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007
+#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "impossible de rechercher le commit %s"
 
-#: builtin/commit.c:642 builtin/shortlog.c:273
+#: builtin/commit.c:641 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:644
+#: builtin/commit.c:643
 msgid "could not read log from standard input"
 msgstr "impossible de lire le journal depuis l'entrée standard"
 
-#: builtin/commit.c:648
+#: builtin/commit.c:647
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "impossible de lire le fichier de journal '%s'"
@@ -4391,7 +4299,7 @@ msgstr "impossible de lire '%s'"
 msgid "could not write commit template"
 msgstr "impossible d'écrire le modèle de commit"
 
-#: builtin/commit.c:760
+#: builtin/commit.c:764
 #, c-format
 msgid ""
 "\n"
@@ -4406,7 +4314,7 @@ msgstr ""
 "\t%s\n"
 "et essayez à nouveau.\n"
 
-#: builtin/commit.c:765
+#: builtin/commit.c:769
 #, c-format
 msgid ""
 "\n"
@@ -4421,7 +4329,7 @@ msgstr ""
 "\t%s\n"
 "et essayez à nouveau.\n"
 
-#: builtin/commit.c:777
+#: builtin/commit.c:782
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4431,7 +4339,7 @@ msgstr ""
 "commençant par '%c' seront ignorées, et un message vide abandonne la "
 "validation.\n"
 
-#: builtin/commit.c:782
+#: builtin/commit.c:789
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4442,142 +4350,142 @@ msgstr ""
 "commençant par '%c' seront conservées ; vous pouvez les supprimer vous-même\n"
 "si vous le souhaitez. Un message vide abandonne la validation.\n"
 
-#: builtin/commit.c:795
+#: builtin/commit.c:802
 #, c-format
 msgid "%sAuthor:    %s"
 msgstr "%sAuteur :     %s"
 
-#: builtin/commit.c:802
+#: builtin/commit.c:809
 #, c-format
 msgid "%sCommitter: %s"
 msgstr "%sValidateur : %s"
 
-#: builtin/commit.c:822
+#: builtin/commit.c:829
 msgid "Cannot read index"
 msgstr "Impossible de lire l'index"
 
-#: builtin/commit.c:865
+#: builtin/commit.c:872
 msgid "Error building trees"
 msgstr "Erreur lors de la construction des arbres"
 
-#: builtin/commit.c:880 builtin/tag.c:359
+#: builtin/commit.c:887 builtin/tag.c:391
 #, 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:982
+#: builtin/commit.c:989
 #, c-format
 msgid "No existing author found with '%s'"
 msgstr "Aucun auteur existant trouvé avec '%s'"
 
-#: builtin/commit.c:997 builtin/commit.c:1237
+#: builtin/commit.c:1004 builtin/commit.c:1244
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Mode de fichier non suivi invalide '%s'"
 
-#: builtin/commit.c:1034
+#: builtin/commit.c:1041
 msgid "--long and -z are incompatible"
 msgstr "--long et -z sont incompatibles"
 
-#: builtin/commit.c:1064
+#: builtin/commit.c:1071
 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:1075
+#: builtin/commit.c:1080
 msgid "You have nothing to amend."
 msgstr "Il n'y a rien à corriger."
 
-#: builtin/commit.c:1078
+#: builtin/commit.c:1083
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Vous êtes en pleine fusion -- impossible de corriger (amend)."
 
-#: builtin/commit.c:1080
+#: builtin/commit.c:1085
 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:1083
+#: builtin/commit.c:1088
 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:1093
+#: builtin/commit.c:1098
 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:1095
+#: builtin/commit.c:1100
 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:1103
+#: builtin/commit.c:1108
 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:1120
+#: builtin/commit.c:1125
 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:1122
+#: builtin/commit.c:1127
 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:1124
+#: builtin/commit.c:1129
 msgid "Clever... amending the last one with dirty index."
 msgstr "Malin... correction du dernier avec un index sale."
 
-#: builtin/commit.c:1126
-msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
+#: builtin/commit.c:1131
+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:1136 builtin/tag.c:572
+#: builtin/commit.c:1143 builtin/tag.c:639
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Mode de nettoyage invalide %s"
 
-#: builtin/commit.c:1141
+#: builtin/commit.c:1148
 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:1251 builtin/commit.c:1482
+#: builtin/commit.c:1258 builtin/commit.c:1516
 msgid "show status concisely"
 msgstr "afficher le statut avec concision"
 
-#: builtin/commit.c:1253 builtin/commit.c:1484
+#: builtin/commit.c:1260 builtin/commit.c:1518
 msgid "show branch information"
 msgstr "afficher l'information de branche"
 
-#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507
+#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
 msgid "machine-readable output"
 msgstr "sortie pour traitement automatique"
 
-#: builtin/commit.c:1258 builtin/commit.c:1488
+#: builtin/commit.c:1265 builtin/commit.c:1522
 msgid "show status in long format (default)"
 msgstr "afficher le statut en format long (par défaut)"
 
-#: builtin/commit.c:1261 builtin/commit.c:1491
+#: builtin/commit.c:1268 builtin/commit.c:1525
 msgid "terminate entries with NUL"
 msgstr "terminer les éléments par NUL"
 
-#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:459
+#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
+#: builtin/fast-export.c:677 builtin/tag.c:514
 msgid "mode"
 msgstr "mode"
 
-#: builtin/commit.c:1264 builtin/commit.c:1494
+#: builtin/commit.c:1271 builtin/commit.c:1528
 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:1267
+#: builtin/commit.c:1274
 msgid "show ignored files"
 msgstr "afficher les fichiers ignorés"
 
-#: builtin/commit.c:1268 parse-options.h:156
+#: builtin/commit.c:1275 parse-options.h:153
 msgid "when"
 msgstr "quand"
 
-#: builtin/commit.c:1269
+#: builtin/commit.c:1276
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -4585,217 +4493,217 @@ msgstr ""
 "ignorer les modifications dans les sous-modules, \"quand\" facultatif : all "
 "(tous), dirty (sale), untracked (non suivi). (Défaut : all)"
 
-#: builtin/commit.c:1271
+#: builtin/commit.c:1278
 msgid "list untracked files in columns"
 msgstr "afficher les fichiers non suivis en colonnes"
 
-#: builtin/commit.c:1340
+#: builtin/commit.c:1347
 msgid "couldn't look up newly created commit"
 msgstr "impossible de retrouver le commit nouvellement créé"
 
-#: builtin/commit.c:1342
+#: builtin/commit.c:1349
 msgid "could not parse newly created commit"
 msgstr "impossible d'analyser le commit nouvellement créé"
 
-#: builtin/commit.c:1383
+#: builtin/commit.c:1390
 msgid "detached HEAD"
 msgstr "HEAD détachée"
 
-#: builtin/commit.c:1385
+#: builtin/commit.c:1392
 msgid " (root-commit)"
 msgstr " (commit racine)"
 
-#: builtin/commit.c:1452
+#: builtin/commit.c:1486
 msgid "suppress summary after successful commit"
 msgstr "supprimer le résumé après une validation réussie"
 
-#: builtin/commit.c:1453
+#: builtin/commit.c:1487
 msgid "show diff in commit message template"
 msgstr "afficher les diff dans le modèle de message de validation"
 
-#: builtin/commit.c:1455
+#: builtin/commit.c:1489
 msgid "Commit message options"
 msgstr "Options du message de validation"
 
-#: builtin/commit.c:1456 builtin/tag.c:457
+#: builtin/commit.c:1490 builtin/tag.c:512
 msgid "read message from file"
 msgstr "lire le message depuis un fichier"
 
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
 msgid "author"
 msgstr "auteur"
 
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
 msgid "override author for commit"
 msgstr "remplacer l'auteur pour la validation"
 
-#: builtin/commit.c:1458 builtin/gc.c:261
+#: builtin/commit.c:1492 builtin/gc.c:272
 msgid "date"
 msgstr "date"
 
-#: builtin/commit.c:1458
+#: builtin/commit.c:1492
 msgid "override date for commit"
 msgstr "remplacer la date pour la validation"
 
-#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405
-#: builtin/notes.c:562 builtin/tag.c:455
+#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:510
 msgid "message"
 msgstr "message"
 
-#: builtin/commit.c:1459
+#: builtin/commit.c:1493
 msgid "commit message"
 msgstr "message de validation"
 
-#: builtin/commit.c:1460
+#: builtin/commit.c:1494
 msgid "reuse and edit message from specified commit"
 msgstr "réutiliser et éditer le message du commit spécifié"
 
-#: builtin/commit.c:1461
+#: builtin/commit.c:1495
 msgid "reuse message from specified commit"
 msgstr "réutiliser le message du commit spécifié"
 
-#: builtin/commit.c:1462
+#: builtin/commit.c:1496
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
-"utiliser un message formaté par autosquash pour corriger le commit spécifié"
+"utiliser un message au format autosquash pour corriger le commit spécifié"
 
-#: builtin/commit.c:1463
+#: builtin/commit.c:1497
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
-"utiliser un message formaté par autosquash pour compresser le commit spécifié"
+"utiliser un message au format autosquash pour compresser le commit spécifié"
 
-#: builtin/commit.c:1464
+#: builtin/commit.c:1498
 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:1465 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "ajouter une entrée Signed-off-by :"
 
-#: builtin/commit.c:1466
+#: builtin/commit.c:1500
 msgid "use specified template file"
 msgstr "utiliser le fichier de modèle spécifié"
 
-#: builtin/commit.c:1467
+#: builtin/commit.c:1501
 msgid "force edit of commit"
 msgstr "forcer l'édition du commit"
 
-#: builtin/commit.c:1468
+#: builtin/commit.c:1502
 msgid "default"
 msgstr "défaut"
 
-#: builtin/commit.c:1468 builtin/tag.c:460
+#: builtin/commit.c:1502 builtin/tag.c:515
 msgid "how to strip spaces and #comments from message"
 msgstr "comment éliminer les espaces et les commentaires # du message"
 
-#: builtin/commit.c:1469
+#: builtin/commit.c:1503
 msgid "include status in commit message template"
 msgstr "inclure le statut dans le modèle de message de validation"
 
-#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461
-msgid "key id"
-msgstr "identifiant de clé"
+#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:516
+msgid "key-id"
+msgstr "id de clé"
 
-#: builtin/commit.c:1471 builtin/merge.c:224
+#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "signer la validation avec GPG"
 
-#. end commit message options
-#: builtin/commit.c:1474
+#: builtin/commit.c:1508
 msgid "Commit contents options"
 msgstr "Valider les options des contenus"
 
-#: builtin/commit.c:1475
+#: builtin/commit.c:1509
 msgid "commit all changed files"
 msgstr "valider tous les fichiers modifiés"
 
-#: builtin/commit.c:1476
+#: builtin/commit.c:1510
 msgid "add specified files to index for commit"
 msgstr "ajouter les fichiers spécifiés à l'index pour la validation"
 
-#: builtin/commit.c:1477
+#: builtin/commit.c:1511
 msgid "interactively add files"
 msgstr "ajouter des fichiers en mode interactif"
 
-#: builtin/commit.c:1478
+#: builtin/commit.c:1512
 msgid "interactively add changes"
 msgstr "ajouter les modifications en mode interactif"
 
-#: builtin/commit.c:1479
+#: builtin/commit.c:1513
 msgid "commit only specified files"
 msgstr "valider seulement les fichiers spécifiés"
 
-#: builtin/commit.c:1480
+#: builtin/commit.c:1514
 msgid "bypass pre-commit hook"
 msgstr "éviter d'utiliser le crochet pre-commit"
 
-#: builtin/commit.c:1481
+#: builtin/commit.c:1515
 msgid "show what would be committed"
 msgstr "afficher ce qui serait validé"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1526
 msgid "amend previous commit"
 msgstr "corriger la validation précédente"
 
-#: builtin/commit.c:1493
+#: builtin/commit.c:1527
 msgid "bypass post-rewrite hook"
 msgstr "éviter d'utiliser le crochet post-rewrite"
 
-#: builtin/commit.c:1498
+#: builtin/commit.c:1532
 msgid "ok to record an empty change"
 msgstr "accepter d'enregistrer une modification vide"
 
-#: builtin/commit.c:1500
+#: builtin/commit.c:1534
 msgid "ok to record a change with an empty message"
 msgstr "accepter d'enregistrer une modification avec un message vide"
 
-#: builtin/commit.c:1529
+#: builtin/commit.c:1562
 msgid "could not parse HEAD commit"
 msgstr "impossible d'analyser le commit HEAD"
 
-#: builtin/commit.c:1567 builtin/merge.c:518
+#: builtin/commit.c:1601 builtin/merge.c:518
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "impossible d'ouvrir '%s' en lecture"
 
-#: builtin/commit.c:1574
+#: builtin/commit.c:1608
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Fichier MERGE_HEAD corrompu (%s)"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1615
 msgid "could not read MERGE_MODE"
 msgstr "impossible de lire MERGE_MODE"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1634
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "impossible de lire le message de validation : %s"
 
-#: builtin/commit.c:1611
+#: builtin/commit.c:1645
 #, 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:1616
+#: builtin/commit.c:1650
 #, 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:1631 builtin/merge.c:854 builtin/merge.c:879
+#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
 msgid "failed to write commit object"
 msgstr "échec de l'écriture de l'objet commit"
 
-#: builtin/commit.c:1652
+#: builtin/commit.c:1686
 msgid "cannot lock HEAD ref"
 msgstr "impossible de verrouiller la référence HEAD"
 
-#: builtin/commit.c:1656
+#: builtin/commit.c:1690
 msgid "cannot update HEAD ref"
 msgstr "impossible de mettre à jour la référence HEAD"
 
-#: builtin/commit.c:1667
+#: builtin/commit.c:1701
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full or quota is\n"
@@ -4809,128 +4717,128 @@ msgstr ""
 msgid "git config [options]"
 msgstr "git config [options]"
 
-#: builtin/config.c:54
+#: builtin/config.c:53
 msgid "Config file location"
 msgstr "Emplacement du fichier de configuration"
 
-#: builtin/config.c:55
+#: builtin/config.c:54
 msgid "use global config file"
 msgstr "utiliser les fichier de configuration global"
 
-#: builtin/config.c:56
+#: builtin/config.c:55
 msgid "use system config file"
 msgstr "utiliser le fichier de configuration du système"
 
-#: builtin/config.c:57
+#: builtin/config.c:56
 msgid "use repository config file"
 msgstr "utiliser le fichier de configuration du dépôt"
 
-#: builtin/config.c:58
+#: builtin/config.c:57
 msgid "use given config file"
 msgstr "utiliser le fichier de configuration spécifié"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "blob-id"
 msgstr "blob-id"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "read config from given blob object"
 msgstr "lire la configuration depuis l'objet blob fourni"
 
-#: builtin/config.c:60
+#: builtin/config.c:59
 msgid "Action"
 msgstr "Action"
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "get value: name [value-regex]"
 msgstr "obtenir la valeur : nom [regex-de-valeur]"
 
-#: builtin/config.c:62
+#: builtin/config.c:61
 msgid "get all values: key [value-regex]"
 msgstr "obtenir toutes le valeurs : clé [regex-de-valeur]"
 
-#: builtin/config.c:63
+#: builtin/config.c:62
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr "obtenir les valeur pour la regexp : regex-de-nom [regex-de-valeur]"
 
-#: builtin/config.c:64
+#: builtin/config.c:63
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "obtenir la valeur spécifique pour l'URL : section[.var] URL"
 
-#: builtin/config.c:65
+#: builtin/config.c:64
 msgid "replace all matching variables: name value [value_regex]"
 msgstr ""
 "remplacer toutes les variables correspondant : nom valeur [regex-de-valeur]"
 
-#: builtin/config.c:66
+#: builtin/config.c:65
 msgid "add a new variable: name value"
 msgstr "ajouter une nouvelle variable : nom valeur"
 
-#: builtin/config.c:67
+#: builtin/config.c:66
 msgid "remove a variable: name [value-regex]"
 msgstr "supprimer une variable : nom [regex-de-valeur]"
 
-#: builtin/config.c:68
+#: builtin/config.c:67
 msgid "remove all matches: name [value-regex]"
 msgstr "supprimer toutes les correspondances nom [regex-de-valeur]"
 
-#: builtin/config.c:69
+#: builtin/config.c:68
 msgid "rename section: old-name new-name"
 msgstr "renommer une section : ancien-nom nouveau-nom"
 
-#: builtin/config.c:70
+#: builtin/config.c:69
 msgid "remove a section: name"
 msgstr "supprimer une section : nom"
 
-#: builtin/config.c:71
+#: builtin/config.c:70
 msgid "list all"
 msgstr "afficher tout"
 
-#: builtin/config.c:72
+#: builtin/config.c:71
 msgid "open an editor"
 msgstr "ouvrir un éditeur"
 
-#: builtin/config.c:73 builtin/config.c:74
+#: builtin/config.c:72 builtin/config.c:73
 msgid "slot"
 msgstr "emplacement"
 
-#: builtin/config.c:73
+#: builtin/config.c:72
 msgid "find the color configured: [default]"
 msgstr "trouver la couleur configurée : [par défaut]"
 
-#: builtin/config.c:74
+#: builtin/config.c:73
 msgid "find the color setting: [stdout-is-tty]"
 msgstr "trouver le réglage de la couleur : [stdout-est-tty]"
 
-#: builtin/config.c:75
+#: builtin/config.c:74
 msgid "Type"
 msgstr "Type"
 
-#: builtin/config.c:76
+#: builtin/config.c:75
 msgid "value is \"true\" or \"false\""
-msgstr "la valeur est \"true\" (vrai) our \"false\" (faux)"
+msgstr "la valeur est \"true\" (vrai) ou \"false\" (faux)"
 
-#: builtin/config.c:77
+#: builtin/config.c:76
 msgid "value is decimal number"
 msgstr "la valeur est un nombre décimal"
 
-#: builtin/config.c:78
+#: builtin/config.c:77
 msgid "value is --bool or --int"
 msgstr "la valeur est --bool ou --int"
 
-#: builtin/config.c:79
+#: builtin/config.c:78
 msgid "value is a path (file or directory name)"
 msgstr "la valeur est un chemin (vers un fichier ou un répertoire)"
 
-#: builtin/config.c:80
+#: builtin/config.c:79
 msgid "Other"
 msgstr "Autre"
 
-#: builtin/config.c:81
+#: builtin/config.c:80
 msgid "terminate values with NUL byte"
 msgstr "terminer les valeurs avec un caractère NUL"
 
-#: builtin/config.c:82
+#: builtin/config.c:81
 msgid "respect include directives on lookup"
 msgstr "respecter les directives d'inclusion lors de la recherche"
 
@@ -4950,47 +4858,47 @@ msgstr "git describe [options] <commit ou apparenté>*"
 msgid "git describe [options] --dirty"
 msgstr "git describe [options] --dirty"
 
-#: builtin/describe.c:237
+#: builtin/describe.c:225
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "l'étiquette annotée %s n'est pas disponible"
 
-#: builtin/describe.c:241
+#: builtin/describe.c:229
 #, 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:243
+#: builtin/describe.c:231
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "l'étiquette '%s' est en fait '%s'"
 
-#: builtin/describe.c:270
+#: builtin/describe.c:258
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "%s n'est pas un nom d'objet valide"
 
-#: builtin/describe.c:273
+#: builtin/describe.c:261
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr "%s n'est pas un objet '%s' valide"
 
-#: builtin/describe.c:290
+#: builtin/describe.c:278
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr "aucune étiquette ne correspond parfaitement à '%s'"
 
-#: builtin/describe.c:292
+#: builtin/describe.c:280
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "recherche de la description de %s\n"
 
-#: builtin/describe.c:332
+#: builtin/describe.c:327
 #, c-format
 msgid "finished search at %s\n"
 msgstr "recherche terminée à %s\n"
 
-#: builtin/describe.c:359
+#: builtin/describe.c:354
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -4999,7 +4907,7 @@ msgstr ""
 "Aucune étiquette annotée ne peut décrire '%s'.\n"
 "Cependant, il existe des étiquettes non-annotées : essayez avec --tags."
 
-#: builtin/describe.c:363
+#: builtin/describe.c:358
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -5008,12 +4916,12 @@ msgstr ""
 "Aucune étiquette ne peut décrire '%s'.\n"
 "Essayez --always, ou créez des étiquettes."
 
-#: builtin/describe.c:384
+#: builtin/describe.c:379
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "%lu commits parcourus\n"
 
-#: builtin/describe.c:387
+#: builtin/describe.c:382
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
@@ -5023,64 +4931,64 @@ msgstr ""
 "affichées\n"
 "abandon de la recherche à %s\n"
 
-#: builtin/describe.c:409
+#: builtin/describe.c:404
 msgid "find the tag that comes after the commit"
 msgstr "rechercher l'étiquette qui suit le commit"
 
-#: builtin/describe.c:410
+#: builtin/describe.c:405
 msgid "debug search strategy on stderr"
 msgstr "déboguer la stratégie de recherche sur stderr"
 
-#: builtin/describe.c:411
+#: builtin/describe.c:406
 msgid "use any ref"
 msgstr "utiliser n'importe quelle référence"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:407
 msgid "use any tag, even unannotated"
 msgstr "utiliser n'importe quelle étiquette, même non-annotée"
 
-#: builtin/describe.c:413
+#: builtin/describe.c:408
 msgid "always use long format"
 msgstr "toujours utiliser le format long"
 
-#: builtin/describe.c:414
+#: builtin/describe.c:409
 msgid "only follow first parent"
 msgstr "ne suivre que le premier parent"
 
-#: builtin/describe.c:417
+#: builtin/describe.c:412
 msgid "only output exact matches"
 msgstr "n'afficher que les correspondances exactes"
 
-#: builtin/describe.c:419
+#: builtin/describe.c:414
 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:421
+#: builtin/describe.c:416
 msgid "only consider tags matching <pattern>"
 msgstr "ne considérer que les étiquettes correspondant à <motif>"
 
-#: builtin/describe.c:423 builtin/name-rev.c:321
+#: builtin/describe.c:418 builtin/name-rev.c:321
 msgid "show abbreviated commit object as fallback"
 msgstr "afficher les objets commits abrégés en dernier recours"
 
-#: builtin/describe.c:424
+#: builtin/describe.c:419
 msgid "mark"
 msgstr "marque"
 
-#: builtin/describe.c:425
+#: builtin/describe.c:420
 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:443
+#: builtin/describe.c:438
 msgid "--long is incompatible with --abbrev=0"
 msgstr "--long et --abbrev=0 sont incompatibles"
 
-#: builtin/describe.c:469
+#: builtin/describe.c:464
 msgid "No names found, cannot describe anything."
 msgstr "aucun nom trouvé, impossible de décrire quoi que ce soit."
 
-#: builtin/describe.c:489
+#: builtin/describe.c:484
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "--dirty est incompatible avec la spécification de commits ou assimilés"
 
@@ -5376,7 +5284,7 @@ msgstr "Récupération de %s\n"
 msgid "Could not fetch %s"
 msgstr "Impossible de récupérer %s"
 
-#: builtin/fetch.c:1036
+#: builtin/fetch.c:1035
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -5420,10 +5328,10 @@ msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
 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:702
-#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446
-#: parse-options.h:135 parse-options.h:242
+#: 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
+#: parse-options.h:132 parse-options.h:239
 msgid "n"
 msgstr "n"
 
@@ -5487,6 +5395,14 @@ msgstr "clé"
 msgid "field name to sort on"
 msgstr "nom du champ servant à trier"
 
+#: builtin/fsck.c:147 builtin/prune.c:172
+msgid "Checking connectivity"
+msgstr "Vérification de la connectivité"
+
+#: builtin/fsck.c:544
+msgid "Checking object directories"
+msgstr "Vérification des répertoires d'objet"
+
 #: builtin/fsck.c:607
 msgid "git fsck [options] [<object>...]"
 msgstr "git fsck [options] [<objet>...]"
@@ -5532,51 +5448,58 @@ msgstr "écrire les objets en suspens dans .git/lost-found"
 msgid "show progress"
 msgstr "afficher la progression"
 
+#: builtin/fsck.c:673
+msgid "Checking objects"
+msgstr "Vérification des objets"
+
 #: builtin/gc.c:24
 msgid "git gc [options]"
 msgstr "git gc [options]"
 
-#: builtin/gc.c:80
+#: builtin/gc.c:90
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "%s invalide : '%s'"
 
-#: builtin/gc.c:107
+#: builtin/gc.c:117
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "objet répertoire démentiellement long %.*s"
 
-#: builtin/gc.c:262
+#: builtin/gc.c:273
 msgid "prune unreferenced objects"
 msgstr "éliminer les objets non référencés"
 
-#: builtin/gc.c:264
+#: builtin/gc.c:275
 msgid "be more thorough (increased runtime)"
 msgstr "être plus consciencieux (durée de traitement allongée)"
 
-#: builtin/gc.c:265
+#: builtin/gc.c:276
 msgid "enable auto-gc mode"
 msgstr "activer le mode auto-gc"
 
-#: builtin/gc.c:266
+#: builtin/gc.c:277
 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:306
+#: builtin/gc.c:318
 #, c-format
-msgid ""
-"Auto packing the repository for optimum performance. You may also\n"
-"run \"git gc\" manually. See \"git help gc\" for more information.\n"
-msgstr ""
-"Compression automatique du dépôt pour une performance optimum. Vous pouvez "
-"aussi\n"
-"lancer \"git gc\" manuellement. Voir \"git help gc\" pour plus "
-"d'information.\n"
+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"
 
-#. be quiet on --auto
-#: builtin/gc.c:316
+#: builtin/gc.c:320
+#, 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
+#, 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
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5584,7 +5507,7 @@ msgstr ""
 "un ramasse-miettes est déjà en cours sur la machine '%s' pid %<PRIuMAX> "
 "(utilisez --force si ce n'est pas le cas)"
 
-#: builtin/gc.c:341
+#: builtin/gc.c:361
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -5615,218 +5538,218 @@ msgstr "impossible de lire l'arbre (%s)"
 msgid "unable to grep from object of type %s"
 msgstr "impossible de faire un grep sur un objet de type %s"
 
-#: builtin/grep.c:551
+#: builtin/grep.c:549
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "l'option '%c' attend un valeur numérique"
 
-#: builtin/grep.c:568
+#: builtin/grep.c:566
 #, c-format
 msgid "cannot open '%s'"
 msgstr "impossible d'ouvrir '%s'"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:640
 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:644
+#: builtin/grep.c:642
 msgid "find in contents not managed by git"
 msgstr "rechercher dans les contenus non gérés par git"
 
-#: builtin/grep.c:646
+#: builtin/grep.c:644
 msgid "search in both tracked and untracked files"
 msgstr "rechercher dans les fichiers suivis et non-suivis"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:646
 msgid "search also in ignored files"
 msgstr "rechercher aussi dans les fichiers ignorés"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:649
 msgid "show non-matching lines"
 msgstr "afficher les lignes qui ne correspondent pas"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:651
 msgid "case insensitive matching"
 msgstr "correspondance insensible à la casse"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:653
 msgid "match patterns only at word boundaries"
 msgstr "rechercher les motifs aux séparateurs de mots"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:655
 msgid "process binary files as text"
 msgstr "traiter les fichiers binaires comme texte"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:657
 msgid "don't match patterns in binary files"
 msgstr "ne pas chercher les motifs dans les fichiers binaires"
 
-#: builtin/grep.c:662
+#: builtin/grep.c:660
 msgid "process binary files with textconv filters"
 msgstr "traiter les fichiers binaires avec les filtres textconv"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:662
 msgid "descend at most <depth> levels"
 msgstr "descendre au plus de <profondeur> dans l'arborescence"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:666
 msgid "use extended POSIX regular expressions"
 msgstr "utiliser des expressions régulières étendues POSIX"
 
-#: builtin/grep.c:671
+#: builtin/grep.c:669
 msgid "use basic POSIX regular expressions (default)"
 msgstr "utiliser des expressions régulières basiques POSIX (par défaut)"
 
-#: builtin/grep.c:674
+#: builtin/grep.c:672
 msgid "interpret patterns as fixed strings"
 msgstr "interpréter les motifs comme de chaînes fixes"
 
-#: builtin/grep.c:677
+#: builtin/grep.c:675
 msgid "use Perl-compatible regular expressions"
 msgstr "utiliser des expressions régulières compatibles avec Perl"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:678
 msgid "show line numbers"
 msgstr "afficher les numéros de ligne"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:679
 msgid "don't show filenames"
 msgstr "ne pas pas afficher les noms de fichier"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:680
 msgid "show filenames"
 msgstr "afficher les noms de fichier"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:682
 msgid "show filenames relative to top directory"
 msgstr "afficher les noms de fichiers relativement au répertoire de base"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:684
 msgid "show only filenames instead of matching lines"
 msgstr "n'afficher que les noms de fichiers au lieu des lignes correspondant"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:686
 msgid "synonym for --files-with-matches"
 msgstr "synonyme pour --files-with-matches"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:689
 msgid "show only the names of files without match"
 msgstr "n'afficher que les noms des fichiers sans correspondance"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:691
 msgid "print NUL after filenames"
 msgstr "imprimer une caractère NUL après le noms de fichier"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:693
 msgid "show the number of matches instead of matching lines"
 msgstr "afficher le nombre de correspondances au lieu des lignes correspondant"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:694
 msgid "highlight matches"
 msgstr "mettre en évidence les correspondances"
 
-#: builtin/grep.c:698
+#: builtin/grep.c:696
 msgid "print empty line between matches from different files"
 msgstr ""
 "imprimer une ligne vide entre les correspondances de fichiers différents"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:698
 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:703
+#: builtin/grep.c:701
 msgid "show <n> context lines before and after matches"
 msgstr "afficher <n> lignes de contexte avant et après les correspondances"
 
-#: builtin/grep.c:706
+#: builtin/grep.c:704
 msgid "show <n> context lines before matches"
 msgstr "afficher <n> lignes de contexte avant les correspondances"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:706
 msgid "show <n> context lines after matches"
 msgstr "afficher <n> lignes de contexte après les correspondances"
 
-#: builtin/grep.c:709
+#: builtin/grep.c:707
 msgid "shortcut for -C NUM"
 msgstr "raccourci pour -C NUM"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:710
 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:714
+#: builtin/grep.c:712
 msgid "show the surrounding function"
 msgstr "afficher la fonction contenante"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:715
 msgid "read patterns from file"
 msgstr "lire les motifs depuis fichier"
 
-#: builtin/grep.c:719
+#: builtin/grep.c:717
 msgid "match <pattern>"
 msgstr "rechercher <motif>"
 
-#: builtin/grep.c:721
+#: builtin/grep.c:719
 msgid "combine patterns specified with -e"
 msgstr "combiner les motifs spécifiés par -e"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:731
 msgid "indicate hit with exit status without output"
 msgstr ""
 "indiquer des correspondances avec le code de sortie mais sans rien afficher"
 
-#: builtin/grep.c:735
+#: builtin/grep.c:733
 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:737
+#: builtin/grep.c:735
 msgid "show parse tree for grep expression"
 msgstr "afficher l'arbre d'analyse pour le motif grep"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:739
 msgid "pager"
 msgstr "pagineur"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:739
 msgid "show matching files in the pager"
 msgstr "afficher les fichiers correspondant dans le pagineur"
 
-#: builtin/grep.c:744
+#: builtin/grep.c:742
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "permettre l'appel de grep(1) (ignoré par ce build)"
 
-#: builtin/grep.c:745 builtin/show-ref.c:187
+#: builtin/grep.c:743 builtin/show-ref.c:187
 msgid "show usage"
 msgstr "afficher l'usage"
 
-#: builtin/grep.c:812
+#: builtin/grep.c:810
 msgid "no pattern given."
 msgstr "aucun motif fourni."
 
-#: builtin/grep.c:870
+#: builtin/grep.c:868
 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:893
+#: builtin/grep.c:891
 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:898
+#: builtin/grep.c:896
 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:901
+#: builtin/grep.c:899
 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:909
+#: builtin/grep.c:907
 msgid "both --cached and trees are given."
 msgstr "--cached et des arbres sont fournis en même temps."
 
@@ -5842,7 +5765,7 @@ msgstr ""
 msgid "git hash-object  --stdin-paths < <list-of-paths>"
 msgstr "git hash-object  --stdin-paths < <liste-de-chemins>"
 
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:72 builtin/tag.c:521
 msgid "type"
 msgstr "type"
 
@@ -6082,8 +6005,8 @@ msgstr "grave incohérence dans la décompression (inflate)"
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "COLLISION SHA1 TROUVÉE AVEC %s !"
 
-#: builtin/index-pack.c:669 builtin/pack-objects.c:171
-#: builtin/pack-objects.c:263
+#: builtin/index-pack.c:669 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
 #, c-format
 msgid "unable to read %s"
 msgstr "impossible de lire %s"
@@ -6351,33 +6274,31 @@ msgstr "impossible de traiter le fichier de type %d"
 msgid "unable to move %s to %s"
 msgstr "impossible de déplacer %s vers %s"
 
-#.
-#. * TRANSLATORS: The first '%s' is either "Reinitialized
-#. * existing" or "Initialized empty", the second " shared" or
-#. * "", and the last '%s%s' is the verbatim directory name.
-#.
-#: builtin/init-db.c:420
+#. 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 "Dépôt Git%2$s %1$s dans %3$s%4$s\n"
 
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
 msgid "Reinitialized existing"
 msgstr "existant réinitialisé"
 
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
 msgid "Initialized empty"
 msgstr "vide initialisé"
 
-#: builtin/init-db.c:422
+#: builtin/init-db.c:420
 msgid " shared"
 msgstr " partagé"
 
-#: builtin/init-db.c:441
+#: builtin/init-db.c:439
 msgid "cannot tell cwd"
 msgstr "impossible de déterminer le répertoire de travail courant"
 
-#: builtin/init-db.c:467
+#: builtin/init-db.c:465
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [directory]"
@@ -6385,29 +6306,29 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<répertoire-modèle>] [--"
 "shared[=<permissions>]] [répertoire]"
 
-#: builtin/init-db.c:490
+#: builtin/init-db.c:488
 msgid "permissions"
 msgstr "permissions"
 
-#: builtin/init-db.c:491
+#: builtin/init-db.c:489
 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:493 builtin/prune-packed.c:79 builtin/repack.c:155
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
 msgid "be quiet"
 msgstr "être silencieux"
 
-#: builtin/init-db.c:525 builtin/init-db.c:530
+#: builtin/init-db.c:523 builtin/init-db.c:528
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "impossible de créer le répertoire (mkdir) %s"
 
-#: builtin/init-db.c:534
+#: builtin/init-db.c:532
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "impossible de se déplacer vers le répertoire (chdir) %s"
 
-#: builtin/init-db.c:556
+#: builtin/init-db.c:554
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -6416,11 +6337,11 @@ msgstr ""
 "%s (ou --work-tree=<répertoire>) n'est pas autorisé sans spécifier %s (ou --"
 "git-dir=<répertoire>)"
 
-#: builtin/init-db.c:580
+#: 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:587
+#: builtin/init-db.c:585
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Impossible d'accéder à l'arbre de travail '%s'"
@@ -6483,7 +6404,7 @@ msgstr "Exactement une plage nécessaire."
 
 #: builtin/log.c:809
 msgid "Not a range."
-msgstr "Pas une plage."
+msgstr "Ceci n'est pas une plage."
 
 #: builtin/log.c:911
 msgid "Cover letter needs email format"
@@ -6606,7 +6527,7 @@ msgstr "répondre dans le premier message à <id-message>"
 
 #: builtin/log.c:1221 builtin/log.c:1224
 msgid "boundary"
-msgstr "frontière"
+msgstr "limite"
 
 #: builtin/log.c:1222
 msgid "attach the patch"
@@ -6688,98 +6609,98 @@ msgstr ""
 msgid "Unknown commit %s"
 msgstr "Commit inconnu %s"
 
-#: builtin/ls-files.c:398
+#: builtin/ls-files.c:401
 msgid "git ls-files [options] [<file>...]"
 msgstr "git ls-files [options] [<fichier>...]"
 
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:458
 msgid "identify the file status with tags"
 msgstr "identifier le statut de fichier avec les étiquettes"
 
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:460
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr "utiliser des minuscules pour les fichier 'assumés inchangés'"
 
-#: builtin/ls-files.c:459
+#: builtin/ls-files.c:462
 msgid "show cached files in the output (default)"
 msgstr "afficher les fichiers mis en cache dans la sortie (défaut)"
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:464
 msgid "show deleted files in the output"
 msgstr "afficher les fichiers supprimés dans la sortie"
 
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:466
 msgid "show modified files in the output"
 msgstr "afficher les fichiers modifiés dans la sortie"
 
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:468
 msgid "show other files in the output"
 msgstr "afficher les autres fichiers dans la sortie"
 
-#: builtin/ls-files.c:467
+#: builtin/ls-files.c:470
 msgid "show ignored files in the output"
 msgstr "afficher les fichiers ignorés dans la sortie"
 
-#: builtin/ls-files.c:470
+#: builtin/ls-files.c:473
 msgid "show staged contents' object name in the output"
 msgstr "afficher les nom des objets indexés dans la sortie"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:475
 msgid "show files on the filesystem that need to be removed"
 msgstr ""
 "afficher les fichiers du système de fichiers qui ont besoin d'être supprimés"
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:477
 msgid "show 'other' directories' name only"
 msgstr "afficher seulement les noms des répertoires 'other'"
 
-#: builtin/ls-files.c:477
+#: builtin/ls-files.c:480
 msgid "don't show empty directories"
 msgstr "ne pas afficher les répertoires vides"
 
-#: builtin/ls-files.c:480
+#: builtin/ls-files.c:483
 msgid "show unmerged files in the output"
 msgstr "afficher les fichiers non fusionnés dans la sortie"
 
-#: builtin/ls-files.c:482
+#: builtin/ls-files.c:485
 msgid "show resolve-undo information"
 msgstr "afficher l'information resolv-undo"
 
-#: builtin/ls-files.c:484
+#: builtin/ls-files.c:487
 msgid "skip files matching pattern"
 msgstr "sauter les fichiers correspondant au motif"
 
-#: builtin/ls-files.c:487
+#: builtin/ls-files.c:490
 msgid "exclude patterns are read from <file>"
 msgstr "les motifs d'exclusion sont lus depuis <fichier>"
 
-#: builtin/ls-files.c:490
+#: builtin/ls-files.c:493
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "lire des motifs d'exclusion additionnels par répertoire dans <fichier>"
 
-#: builtin/ls-files.c:492
+#: builtin/ls-files.c:495
 msgid "add the standard git exclusions"
 msgstr "ajouter les exclusions git standard"
 
-#: builtin/ls-files.c:495
+#: builtin/ls-files.c:498
 msgid "make the output relative to the project top directory"
 msgstr "afficher en relatif par rapport au répertoire racine du projet"
 
-#: builtin/ls-files.c:498
+#: builtin/ls-files.c:501
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "si un <fichier> n'est pas dans l'index, traiter cela comme une erreur"
 
-#: builtin/ls-files.c:499
+#: builtin/ls-files.c:502
 msgid "tree-ish"
 msgstr "arbre ou apparenté"
 
-#: builtin/ls-files.c:500
+#: builtin/ls-files.c:503
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 "considérer que les chemins supprimés depuis <arbre ou apparenté> sont "
 "toujours présents"
 
-#: builtin/ls-files.c:502
+#: builtin/ls-files.c:505
 msgid "show debugging data"
 msgstr "afficher les données de débogage"
 
@@ -6894,7 +6815,7 @@ msgstr "abandonner si l'avance rapide n'est pas possible"
 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:738 builtin/revert.c:89
+#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
 msgid "strategy"
 msgstr "stratégie"
 
@@ -6968,37 +6889,37 @@ msgstr "'%s' ne pointe pas sur un commit"
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Mauvaise chaîne branch.%s.mergeoptions : %s"
 
-#: builtin/merge.c:650
+#: builtin/merge.c:653
 msgid "git write-tree failed to write a tree"
 msgstr "git write-tree a échoué à écrire un arbre"
 
-#: builtin/merge.c:678
+#: builtin/merge.c:681
 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:692
+#: builtin/merge.c:695
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Options inconnue pour merge-recursive : -X%s"
 
-#: builtin/merge.c:706
+#: builtin/merge.c:709
 #, c-format
 msgid "unable to write %s"
 msgstr "impossible d'écrire %s"
 
-#: builtin/merge.c:795
+#: builtin/merge.c:798
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "Impossible de lire depuis '%s'"
 
-#: builtin/merge.c:804
+#: builtin/merge.c:807
 #, 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:810
+#: builtin/merge.c:813
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -7015,49 +6936,49 @@ msgstr ""
 "Les lignes commençant par '%c' seront ignorées, et un message vide\n"
 "abandonne la validation.\n"
 
-#: builtin/merge.c:834
+#: builtin/merge.c:837
 msgid "Empty commit message."
 msgstr "Message de validation vide."
 
-#: builtin/merge.c:846
+#: builtin/merge.c:849
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Merveilleux.\n"
 
-#: builtin/merge.c:911
+#: builtin/merge.c:914
 #, 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:927
+#: builtin/merge.c:930
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "'%s' n'est pas une validation"
 
-#: builtin/merge.c:968
+#: builtin/merge.c:971
 msgid "No current branch."
 msgstr "Pas de branche courante."
 
-#: builtin/merge.c:970
+#: builtin/merge.c:973
 msgid "No remote for the current branch."
 msgstr "Pas de branche distante pour la branche courante."
 
-#: builtin/merge.c:972
+#: builtin/merge.c:975
 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:977
+#: builtin/merge.c:980
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Pas de branche de suivi pour %s depuis %s"
 
-#: builtin/merge.c:1133
+#: builtin/merge.c:1136
 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:1149 git-pull.sh:31
+#: builtin/merge.c:1152 git-pull.sh:31
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -7065,11 +6986,11 @@ msgstr ""
 "Vous n'avez pas terminé votre fusion (MERGE_HEAD existe).\n"
 "Veuillez valider vos changements avant de pouvoir fusionner."
 
-#: builtin/merge.c:1152 git-pull.sh:34
+#: builtin/merge.c:1155 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:1156
+#: builtin/merge.c:1159
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -7077,103 +6998,102 @@ msgstr ""
 "Vous n'avez pas terminé votre picorage (CHERRY_PICK_HEAD existe).\n"
 "Veuillez valider vos changements avant de pouvoir fusionner."
 
-#: builtin/merge.c:1159
+#: builtin/merge.c:1162
 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:1168
+#: builtin/merge.c:1171
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Vous ne pouvez pas combiner --squash avec --no-ff."
 
-#: builtin/merge.c:1177
+#: builtin/merge.c:1180
 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:1209
+#: builtin/merge.c:1212
 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:1212
+#: builtin/merge.c:1215
 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:1214
+#: builtin/merge.c:1217
 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:1219
+#: builtin/merge.c:1222
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - pas possible de fusionner ceci"
 
-#: builtin/merge.c:1270
+#: builtin/merge.c:1273
 #, 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:1273
+#: builtin/merge.c:1276
 #, 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."
 
-#. 'N'
-#: builtin/merge.c:1276
+#: builtin/merge.c:1279
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "La validation %s n'a pas de signature GPG."
 
-#: builtin/merge.c:1279
+#: builtin/merge.c:1282
 #, 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:1363
+#: builtin/merge.c:1366
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Mise à jour %s..%s\n"
 
-#: builtin/merge.c:1402
+#: builtin/merge.c:1405
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Essai de fusion vraiment triviale dans l'index...\n"
 
-#: builtin/merge.c:1409
+#: builtin/merge.c:1412
 #, c-format
 msgid "Nope.\n"
 msgstr "Non.\n"
 
-#: builtin/merge.c:1441
+#: builtin/merge.c:1444
 msgid "Not possible to fast-forward, aborting."
 msgstr "Pas possible d'avancer rapidement, abandon."
 
-#: builtin/merge.c:1464 builtin/merge.c:1543
+#: builtin/merge.c:1467 builtin/merge.c:1546
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Retour de l'arbre à l'original...\n"
 
-#: builtin/merge.c:1468
+#: builtin/merge.c:1471
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Essai de la stratégie de fusion %s...\n"
 
-#: builtin/merge.c:1534
+#: builtin/merge.c:1537
 #, 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:1536
+#: builtin/merge.c:1539
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "La fusion avec la stratégie %s a échoué.\n"
 
-#: builtin/merge.c:1545
+#: builtin/merge.c:1548
 #, 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:1557
+#: builtin/merge.c:1560
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -7259,19 +7179,19 @@ msgstr "ne pas avertir à propos des conflits"
 msgid "set labels for file1/orig_file/file2"
 msgstr "définir les labels pour fichier1/orig_file/fichier2"
 
-#: builtin/mktree.c:67
+#: builtin/mktree.c:64
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
 
-#: builtin/mktree.c:153
+#: builtin/mktree.c:150
 msgid "input is NUL terminated"
 msgstr "l'entrée se termine par NUL"
 
-#: builtin/mktree.c:154 builtin/write-tree.c:24
+#: builtin/mktree.c:151 builtin/write-tree.c:24
 msgid "allow missing objects"
 msgstr "autoriser les objets manquants"
 
-#: builtin/mktree.c:155
+#: builtin/mktree.c:152
 msgid "allow creation of more than one tree"
 msgstr "autoriser la création de plus d'un arbre"
 
@@ -7321,46 +7241,46 @@ msgstr ""
 msgid "Huh? %.*s is in index?"
 msgstr "Hein ? %.*s est dans l'index ?"
 
-#: builtin/mv.c:168
+#: builtin/mv.c:169
 msgid "source directory is empty"
 msgstr "le répertoire source est vide"
 
-#: builtin/mv.c:200
+#: builtin/mv.c:205
 msgid "not under version control"
 msgstr "pas sous le contrôle de version"
 
-#: builtin/mv.c:202
+#: builtin/mv.c:207
 msgid "destination exists"
 msgstr "la destination existe"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:215
 #, c-format
 msgid "overwriting '%s'"
 msgstr "écrasement de '%s'"
 
-#: builtin/mv.c:213
+#: builtin/mv.c:218
 msgid "Cannot overwrite"
 msgstr "Impossible d'écraser"
 
-#: builtin/mv.c:216
+#: builtin/mv.c:221
 msgid "multiple sources for the same target"
 msgstr "multiples sources pour la même destination"
 
-#: builtin/mv.c:218
+#: builtin/mv.c:223
 msgid "destination directory does not exist"
 msgstr "le répertoire de destination n'existe pas"
 
-#: builtin/mv.c:233
+#: builtin/mv.c:243
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, source=%s, destination=%s"
 
-#: builtin/mv.c:243
+#: builtin/mv.c:253
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "Renommage de %s en %s\n"
 
-#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "le renommage de '%s' a échoué"
@@ -7532,7 +7452,7 @@ msgstr "impossible de lire la sortie de 'show'"
 msgid "failed to finish 'show' for object '%s'"
 msgstr "impossible de finir 'show' pour l'objet '%s'"
 
-#: builtin/notes.c:167 builtin/tag.c:341
+#: builtin/notes.c:167 builtin/tag.c:373
 #, c-format
 msgid "could not create file '%s'"
 msgstr "impossible de créer le fichier '%s'"
@@ -7541,7 +7461,7 @@ msgstr "impossible de créer le fichier '%s'"
 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:844
+#: builtin/notes.c:207 builtin/notes.c:848
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Suppression de la note pour l'objet %s\n"
@@ -7555,20 +7475,20 @@ msgstr "impossible d'écrire l'objet note"
 msgid "The note contents has been left in %s"
 msgstr "Le contenu de la note a été laissé dans %s"
 
-#: builtin/notes.c:248 builtin/tag.c:537
+#: builtin/notes.c:248 builtin/tag.c:604
 #, c-format
 msgid "cannot read '%s'"
 msgstr "impossible de lire '%s'"
 
-#: builtin/notes.c:250 builtin/tag.c:540
+#: builtin/notes.c:250 builtin/tag.c:607
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "impossible d'ouvrir ou lire '%s'"
 
-#: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318
-#: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515
-#: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637
-#: builtin/notes.c:839 builtin/tag.c:553
+#: 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
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Impossible de résoudre '%s' comme une référence valide."
@@ -7578,53 +7498,58 @@ msgstr "Impossible de résoudre '%s' comme une référence valide."
 msgid "Failed to read object '%s'."
 msgstr "Impossible de lire l'objet '%s'."
 
-#: builtin/notes.c:312
+#: builtin/notes.c:276
+#, 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
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "Ligne en entrée malformée : '%s'."
 
-#: builtin/notes.c:327
+#: builtin/notes.c:331
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "Impossible de copier les notes de '%s' vers '%s'"
 
-#: builtin/notes.c:371 builtin/notes.c:425 builtin/notes.c:498
-#: builtin/notes.c:510 builtin/notes.c:583 builtin/notes.c:630
-#: builtin/notes.c:904
+#: 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 "trop de paramètres"
 
-#: builtin/notes.c:384 builtin/notes.c:643
+#: builtin/notes.c:388 builtin/notes.c:647
 #, c-format
 msgid "No note found for object %s."
 msgstr "Pas de note trouvée pour l'objet %s."
 
-#: builtin/notes.c:406 builtin/notes.c:563
+#: builtin/notes.c:410 builtin/notes.c:567
 msgid "note contents as a string"
 msgstr "contenu de la note sous forme de chaîne"
 
-#: builtin/notes.c:409 builtin/notes.c:566
+#: builtin/notes.c:413 builtin/notes.c:570
 msgid "note contents in a file"
 msgstr "contenu de la note dans un fichier"
 
-#: builtin/notes.c:411 builtin/notes.c:414 builtin/notes.c:568
-#: builtin/notes.c:571 builtin/tag.c:474
+#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
+#: builtin/notes.c:575 builtin/tag.c:539
 msgid "object"
 msgstr "objet"
 
-#: builtin/notes.c:412 builtin/notes.c:569
+#: builtin/notes.c:416 builtin/notes.c:573
 msgid "reuse and edit specified note object"
 msgstr "réutiliser et éditer l'objet de note spécifié"
 
-#: builtin/notes.c:415 builtin/notes.c:572
+#: builtin/notes.c:419 builtin/notes.c:576
 msgid "reuse specified note object"
 msgstr "réutiliser l'objet de note spécifié"
 
-#: builtin/notes.c:417 builtin/notes.c:485
+#: builtin/notes.c:421 builtin/notes.c:489
 msgid "replace existing notes"
 msgstr "remplacer les notes existantes"
 
-#: builtin/notes.c:451
+#: builtin/notes.c:455
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7633,25 +7558,25 @@ msgstr ""
 "Impossible d'ajouter des notes. Des notes ont été trouvées pour l'objet %s. "
 "Utilisez '-f' pour écraser les notes existantes"
 
-#: builtin/notes.c:456 builtin/notes.c:533
+#: builtin/notes.c:460 builtin/notes.c:537
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Écrasement des notes existantes pour l'objet %s\n"
 
-#: builtin/notes.c:486
+#: builtin/notes.c:490
 msgid "read objects from stdin"
 msgstr "lire les objets depuis l'entrée standard"
 
-#: builtin/notes.c:488
+#: builtin/notes.c:492
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr ""
 "charger la configuration de réécriture pour <commande> (implique --stdin)"
 
-#: builtin/notes.c:506
+#: builtin/notes.c:510
 msgid "too few parameters"
 msgstr "pas assez de paramètres"
 
-#: builtin/notes.c:527
+#: builtin/notes.c:531
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7660,12 +7585,12 @@ msgstr ""
 "Impossible de copier des notes. Des notes ont été trouvées pour l'objet %s. "
 "Utilisez '-f' pour écraser les notes existantes"
 
-#: builtin/notes.c:539
+#: builtin/notes.c:543
 #, 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:588
+#: builtin/notes.c:592
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -7674,15 +7599,15 @@ msgstr ""
 "Les options -m/-F/-c/-C sont obsolètes pour la sous-commande 'edit'.\n"
 "Veuillez utiliser 'git notes add -f -m/-F/-c/-C' à la place.\n"
 
-#: builtin/notes.c:735
+#: builtin/notes.c:739
 msgid "General options"
 msgstr "Options générales"
 
-#: builtin/notes.c:737
+#: builtin/notes.c:741
 msgid "Merge options"
 msgstr "Options de fusion"
 
-#: builtin/notes.c:739
+#: builtin/notes.c:743
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -7690,210 +7615,234 @@ msgstr ""
 "résoudre les conflits de notes en utilisant la stratégie donnée (manual/ours/"
 "theirs/union/cat_sort_uniq)"
 
-#: builtin/notes.c:741
+#: builtin/notes.c:745
 msgid "Committing unmerged notes"
 msgstr "Validation des notes non fusionnées"
 
-#: builtin/notes.c:743
+#: builtin/notes.c:747
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "finaliser la fusion de notes en validant les notes non fusionnées"
 
-#: builtin/notes.c:745
+#: builtin/notes.c:749
 msgid "Aborting notes merge resolution"
 msgstr "Abandon de la résolution de fusion des notes"
 
-#: builtin/notes.c:747
+#: builtin/notes.c:751
 msgid "abort notes merge"
 msgstr "abandonner la fusion de notes"
 
-#: builtin/notes.c:842
+#: builtin/notes.c:846
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "L'objet %s n'a pas de note\n"
 
-#: builtin/notes.c:854
+#: builtin/notes.c:858
 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:857
+#: builtin/notes.c:861
 msgid "read object names from the standard input"
 msgstr "lire les noms d'objet depuis l'entrée standard"
 
-#: builtin/notes.c:938
-msgid "notes_ref"
-msgstr "références_notes"
+#: builtin/notes.c:942
+msgid "notes-ref"
+msgstr "références-notes"
 
-#: builtin/notes.c:939
+#: builtin/notes.c:943
 msgid "use notes from <notes_ref>"
 msgstr "utiliser les notes depuis <références_notes>"
 
-#: builtin/notes.c:974 builtin/remote.c:1593
+#: builtin/notes.c:978 builtin/remote.c:1593
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Sous-commande inconnue : %s"
 
-#: builtin/pack-objects.c:23
+#: builtin/pack-objects.c:25
 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:24
+#: builtin/pack-objects.c:26
 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:184 builtin/pack-objects.c:187
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
 #, c-format
 msgid "deflate error (%d)"
 msgstr "erreur de compression (%d)"
 
-#: builtin/pack-objects.c:2396
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr "Écriture des objets"
+
+#: builtin/pack-objects.c:1012
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr "désactivation de l'écriture en bitmap car certains objets ne sont pas compressés"
+
+#: builtin/pack-objects.c:2174
+msgid "Compressing objects"
+msgstr "Compression des objets"
+
+#: builtin/pack-objects.c:2530
 #, c-format
 msgid "unsupported index version %s"
 msgstr "version d'index non supportée %s"
 
-#: builtin/pack-objects.c:2400
+#: builtin/pack-objects.c:2534
 #, c-format
 msgid "bad index version '%s'"
 msgstr "mauvaise version d'index '%s'"
 
-#: builtin/pack-objects.c:2423
+#: builtin/pack-objects.c:2557
 #, 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:2427
+#: builtin/pack-objects.c:2561
 #, 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:2446
+#: builtin/pack-objects.c:2580
 msgid "do not show progress meter"
 msgstr "ne pas afficher la barre de progression"
 
-#: builtin/pack-objects.c:2448
+#: builtin/pack-objects.c:2582
 msgid "show progress meter"
 msgstr "afficher la barre de progression"
 
-#: builtin/pack-objects.c:2450
+#: builtin/pack-objects.c:2584
 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:2453
+#: builtin/pack-objects.c:2587
 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:2454
+#: builtin/pack-objects.c:2588
 msgid "version[,offset]"
 msgstr "version[,offset]"
 
-#: builtin/pack-objects.c:2455
+#: builtin/pack-objects.c:2589
 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:2458
+#: builtin/pack-objects.c:2592
 msgid "maximum size of each output pack file"
 msgstr "taille maximum de chaque fichier paquet en sortie"
 
-#: builtin/pack-objects.c:2460
+#: builtin/pack-objects.c:2594
 msgid "ignore borrowed objects from alternate object store"
 msgstr "ignorer les objets empruntés à un autre magasin d'objets"
 
-#: builtin/pack-objects.c:2462
+#: builtin/pack-objects.c:2596
 msgid "ignore packed objects"
 msgstr "ignorer les objets empaquetés"
 
-#: builtin/pack-objects.c:2464
+#: builtin/pack-objects.c:2598
 msgid "limit pack window by objects"
 msgstr "limiter la fenêtre d'empaquetage par objets"
 
-#: builtin/pack-objects.c:2466
+#: builtin/pack-objects.c:2600
 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:2468
+#: builtin/pack-objects.c:2602
 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:2470
+#: builtin/pack-objects.c:2604
 msgid "reuse existing deltas"
 msgstr "réutiliser les deltas existants"
 
-#: builtin/pack-objects.c:2472
+#: builtin/pack-objects.c:2606
 msgid "reuse existing objects"
 msgstr "réutiliser les objets existants"
 
-#: builtin/pack-objects.c:2474
+#: builtin/pack-objects.c:2608
 msgid "use OFS_DELTA objects"
 msgstr "utiliser les objets OFS_DELTA"
 
-#: builtin/pack-objects.c:2476
+#: builtin/pack-objects.c:2610
 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:2478
+#: builtin/pack-objects.c:2612
 msgid "do not create an empty pack output"
 msgstr "ne pas créer un paquet vide"
 
-#: builtin/pack-objects.c:2480
+#: builtin/pack-objects.c:2614
 msgid "read revision arguments from standard input"
 msgstr "lire les paramètres de révision depuis l'entrée standard"
 
-#: builtin/pack-objects.c:2482
+#: builtin/pack-objects.c:2616
 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:2485
+#: builtin/pack-objects.c:2619
 msgid "include objects reachable from any reference"
 msgstr "inclure les objets accessibles depuis toute référence"
 
-#: builtin/pack-objects.c:2488
+#: builtin/pack-objects.c:2622
 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:2491
+#: builtin/pack-objects.c:2625
 msgid "output pack to stdout"
 msgstr "afficher l'empaquetage sur la sortie standard"
 
-#: builtin/pack-objects.c:2493
+#: builtin/pack-objects.c:2627
 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:2495
+#: builtin/pack-objects.c:2629
 msgid "keep unreachable objects"
 msgstr "garder les objets inaccessibles"
 
-#: builtin/pack-objects.c:2496 parse-options.h:143
+#: builtin/pack-objects.c:2630 parse-options.h:140
 msgid "time"
 msgstr "heure"
 
-#: builtin/pack-objects.c:2497
+#: builtin/pack-objects.c:2631
 msgid "unpack unreachable objects newer than <time>"
 msgstr "dépaqueter les objets inaccessibles plus récents que <heure>"
 
-#: builtin/pack-objects.c:2500
+#: builtin/pack-objects.c:2634
 msgid "create thin packs"
 msgstr "créer des paquets légers"
 
-#: builtin/pack-objects.c:2502
+#: builtin/pack-objects.c:2636
 msgid "ignore packs that have companion .keep file"
 msgstr "ignorer les paquets qui ont un fichier .keep"
 
-#: builtin/pack-objects.c:2504
+#: builtin/pack-objects.c:2638
 msgid "pack compression level"
 msgstr "niveau de compression du paquet"
 
-#: builtin/pack-objects.c:2506
+#: builtin/pack-objects.c:2640
 msgid "do not hide commits by grafts"
 msgstr "ne pas cacher les validations par greffes"
 
+#: builtin/pack-objects.c:2642
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr "utiliser un index en bitmap si disponible pour accélerer le décompte des objets"
+
+#: builtin/pack-objects.c:2644
+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
+msgid "Counting objects"
+msgstr "Décompte des objets"
+
 #: builtin/pack-refs.c:6
 msgid "git pack-refs [options]"
 msgstr "git pack-refs [options]"
@@ -7910,6 +7859,10 @@ msgstr "éliminer les références perdues (défaut)"
 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 "Suppression des objets dupliqués"
+
 #: builtin/prune.c:12
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <heure>] [--] [<head>...]"
@@ -7930,15 +7883,15 @@ msgstr "faire expirer les objets plus vieux que <heure>"
 msgid "git push [<options>] [<repository> [<refspec>...]]"
 msgstr "git push [<options>] [<dépôt> [<spécification-de-référence>...]]"
 
-#: builtin/push.c:86
+#: builtin/push.c:85
 msgid "tag shorthand without <tag>"
 msgstr "raccourci d'étiquette sans <étiquette>"
 
-#: builtin/push.c:96
+#: builtin/push.c:95
 msgid "--delete only accepts plain target ref names"
 msgstr "--delete accepte seulement des noms entiers de références cibles"
 
-#: builtin/push.c:141
+#: builtin/push.c:140
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -7947,7 +7900,7 @@ msgstr ""
 "Pour choisir l'option de manière permanente, voir push.default dans 'git "
 "help config'."
 
-#: builtin/push.c:144
+#: builtin/push.c:143
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -7972,7 +7925,7 @@ msgstr ""
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:159
+#: builtin/push.c:158
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -7987,7 +7940,7 @@ msgstr ""
 "\n"
 "    git push %s HEAD:<nom-de-la-branche-amont>\n"
 
-#: builtin/push.c:173
+#: builtin/push.c:172
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -8001,13 +7954,13 @@ msgstr ""
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:181
+#: builtin/push.c:180
 #, 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:184
+#: builtin/push.c:183
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -8018,11 +7971,11 @@ msgstr ""
 "pas une branche amont de votre branche courante '%s', sans me dire\n"
 "quoi pousser pour mettre à jour quelle branche amont."
 
-#: builtin/push.c:207
+#: builtin/push.c:206
 msgid ""
-"push.default is unset; its implicit value is changing in\n"
+"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 current behavior after the default changes, use:\n"
+"and maintain the traditional behavior, use:\n"
 "\n"
 "  git config --global push.default matching\n"
 "\n"
@@ -8033,7 +7986,7 @@ msgid ""
 "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"
-"In Git 2.0, Git will default to the more conservative 'simple'\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"
@@ -8042,41 +7995,35 @@ msgid ""
 "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
 "'current' instead of 'simple' if you sometimes use older versions of Git)"
 msgstr ""
-"push.default n'est pas défini ; sa valeur implicite change dans Git 2.0\n"
+"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"
-"Dans Git 2.0 Git utilisera par défaut le comportement plus conservatif "
-"'simple'\n"
-"qui ne pousse la branche courante vers la branche distante que 'git pull' "
-"utilise\n"
-"pour mettre à jour la branche courante.\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:274
+#: builtin/push.c:273
 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:281
+#: builtin/push.c:280
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -8091,23 +8038,7 @@ msgstr ""
 "Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus "
 "d'information."
 
-#: builtin/push.c:287
-msgid ""
-"Updates were rejected because a pushed branch tip is behind its remote\n"
-"counterpart. If you did not intend to push that branch, you may want to\n"
-"specify branches to push or set the 'push.default' configuration variable\n"
-"to 'simple', 'current' or 'upstream' to push only the current branch."
-msgstr ""
-"Les mises à jour ont été rejetées car la pointe de la branche poussée est "
-"derrière\n"
-"son homologue distant. Si vous ne vouliez pas pousser cette branche, vous "
-"pourriez\n"
-"vouloir spécifier les branches à pousser ou définir la variable de "
-"configuration\n"
-"'push.default' à 'simple', 'current' ou 'upstream' pour pousser seulement la "
-"branche courante."
-
-#: builtin/push.c:293
+#: builtin/push.c:286
 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"
@@ -8122,7 +8053,7 @@ msgstr ""
 "Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus "
 "d'information."
 
-#: builtin/push.c:299
+#: builtin/push.c:292
 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"
@@ -8140,13 +8071,13 @@ msgstr ""
 "Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus "
 "d'information."
 
-#: builtin/push.c:306
+#: builtin/push.c:299
 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:309
+#: builtin/push.c:302
 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"
@@ -8158,22 +8089,22 @@ msgstr ""
 "pointer\n"
 "vers un objet qui n'est pas un commit, sans utiliser l'option '--force'.\n"
 
-#: builtin/push.c:375
+#: builtin/push.c:361
 #, c-format
 msgid "Pushing to %s\n"
-msgstr "Poussage vers %s\n"
+msgstr "Poussée vers %s\n"
 
-#: builtin/push.c:379
+#: builtin/push.c:365
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "impossible de pousser des références vers '%s'"
 
-#: builtin/push.c:412
+#: builtin/push.c:395
 #, c-format
 msgid "bad repository '%s'"
 msgstr "mauvais dépôt '%s'"
 
-#: builtin/push.c:413
+#: builtin/push.c:396
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -8195,96 +8126,96 @@ msgstr ""
 "\n"
 "    git push <nom>\n"
 
-#: builtin/push.c:428
+#: builtin/push.c:411
 msgid "--all and --tags are incompatible"
 msgstr "--all et --tags sont incompatibles"
 
-#: builtin/push.c:429
+#: builtin/push.c:412
 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:434
+#: builtin/push.c:417
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror et --tags sont incompatibles"
 
-#: builtin/push.c:435
+#: builtin/push.c:418
 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:440
+#: builtin/push.c:423
 msgid "--all and --mirror are incompatible"
 msgstr "--all et --mirror sont incompatibles"
 
-#: builtin/push.c:500
+#: builtin/push.c:483
 msgid "repository"
 msgstr "dépôt"
 
-#: builtin/push.c:501
+#: builtin/push.c:484
 msgid "push all refs"
 msgstr "pousser toutes les références"
 
-#: builtin/push.c:502
+#: builtin/push.c:485
 msgid "mirror all refs"
 msgstr "refléter toutes les références"
 
-#: builtin/push.c:504
+#: builtin/push.c:487
 msgid "delete refs"
 msgstr "supprimer les références"
 
-#: builtin/push.c:505
+#: builtin/push.c:488
 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:508
+#: builtin/push.c:491
 msgid "force updates"
 msgstr "forcer les mises à jour"
 
-#: builtin/push.c:510
+#: builtin/push.c:493
 msgid "refname>:<expect"
 msgstr "nom de référence>:<attendu"
 
-#: builtin/push.c:511
+#: builtin/push.c:494
 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:513
+#: builtin/push.c:496
 msgid "check"
 msgstr "check"
 
-#: builtin/push.c:514
+#: builtin/push.c:497
 msgid "control recursive pushing of submodules"
-msgstr "contrôler le poussage récursif des sous-modules"
+msgstr "contrôler la poussée récursive des sous-modules"
 
-#: builtin/push.c:516
+#: builtin/push.c:499
 msgid "use thin pack"
 msgstr "utiliser un empaquetage léger"
 
-#: builtin/push.c:517 builtin/push.c:518
+#: builtin/push.c:500 builtin/push.c:501
 msgid "receive pack program"
 msgstr "recevoir le programme d'empaquetage"
 
-#: builtin/push.c:519
+#: builtin/push.c:502
 msgid "set upstream for git pull/status"
 msgstr "définir la branche amont pour git pull/status"
 
-#: builtin/push.c:522
+#: builtin/push.c:505
 msgid "prune locally removed refs"
 msgstr "éliminer les références locales supprimées"
 
-#: builtin/push.c:524
+#: builtin/push.c:507
 msgid "bypass pre-push hook"
 msgstr "éviter d'utiliser le crochet pre-push"
 
-#: builtin/push.c:525
+#: builtin/push.c:508
 msgid "push missing but relevant tags"
 msgstr "pousser les étiquettes manquantes mais pertinentes"
 
-#: builtin/push.c:535
+#: builtin/push.c:518
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete est incompatible avec --all, --mirror et --tags"
 
-#: builtin/push.c:537
+#: builtin/push.c:520
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete n'a pas de sens sans aucune référence"
 
@@ -8805,12 +8736,12 @@ msgstr "Impossible de paramétrer %s"
 #: builtin/remote.c:1307
 #, c-format
 msgid " %s will become dangling!"
-msgstr " %s deviendra en suspens !"
+msgstr " %s se retrouvera en suspens !"
 
 #: builtin/remote.c:1308
 #, c-format
 msgid " %s has become dangling!"
-msgstr " %s est devenu en suspens !"
+msgstr " %s se retrouve en suspens !"
 
 #: builtin/remote.c:1314
 #, c-format
@@ -8883,68 +8814,76 @@ msgstr "Pas de suppression de toutes les URLs non-push"
 msgid "be verbose; must be placed before a subcommand"
 msgstr "être verbeux : doit être placé avant une sous-commande"
 
-#: builtin/repack.c:15
+#: builtin/repack.c:16
 msgid "git repack [options]"
 msgstr "git repack [options]"
 
-#: builtin/repack.c:143
+#: builtin/repack.c:156
 msgid "pack everything in a single pack"
 msgstr "empaqueter tout dans un seul paquet"
 
-#: builtin/repack.c:145
+#: builtin/repack.c:158
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "identique à -a et transformer les objets inaccessibles en suspens"
 
-#: builtin/repack.c:148
+#: builtin/repack.c:161
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "supprimer les paquets redondants et lancer git-prune-packed"
 
-#: builtin/repack.c:150
+#: builtin/repack.c:163
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "passer --no-reuse-delta à git-pack-objects"
 
-#: builtin/repack.c:152
+#: builtin/repack.c:165
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "passer --no-reuse-object à git-pack-objects"
 
-#: builtin/repack.c:154
+#: builtin/repack.c:167
 msgid "do not run git-update-server-info"
 msgstr "ne pas lancer git update-server-info"
 
-#: builtin/repack.c:157
+#: builtin/repack.c:170
 msgid "pass --local to git-pack-objects"
 msgstr "passer --local à git-pack-objects"
 
-#: builtin/repack.c:158
+#: builtin/repack.c:172
+msgid "write bitmap index"
+msgstr "écrire un index en bitmap"
+
+#: builtin/repack.c:173
 msgid "approxidate"
 msgstr "date approximative"
 
-#: builtin/repack.c:159
+#: builtin/repack.c:174
 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:161
+#: builtin/repack.c:176
 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:162 builtin/repack.c:166
+#: builtin/repack.c:177 builtin/repack.c:181
 msgid "bytes"
 msgstr "octets"
 
-#: builtin/repack.c:163
+#: builtin/repack.c:178
 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:165
+#: builtin/repack.c:180
 msgid "limits the maximum delta depth"
 msgstr "limite la profondeur maximale des deltas"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:182
 msgid "maximum size of each packfile"
 msgstr "taille maximum de chaque fichier paquet"
 
-#: builtin/repack.c:343
+#: builtin/repack.c:184
+msgid "repack objects in packs marked with .keep"
+msgstr "réempaqueter les objets dans des paquets marqués avec .keep"
+
+#: builtin/repack.c:371
 #, c-format
 msgid "removing '%s' failed"
 msgstr "la suppression de '%s' a échoué"
@@ -9037,76 +8976,84 @@ msgstr "Impossible de trouver l'arbre pour %s."
 msgid "HEAD is now at %s"
 msgstr "HEAD est maintenant à %s"
 
-#: builtin/reset.c:172
+#: builtin/reset.c:182
 #, 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:262
+#: builtin/reset.c:273
 msgid "be quiet, only report errors"
 msgstr "être silencieux, afficher seulement les erreurs"
 
-#: builtin/reset.c:264
+#: builtin/reset.c:275
 msgid "reset HEAD and index"
 msgstr "réinitialiser HEAD et l'index"
 
-#: builtin/reset.c:265
+#: builtin/reset.c:276
 msgid "reset only HEAD"
 msgstr "réinitialiser seulement HEAD"
 
-#: builtin/reset.c:267 builtin/reset.c:269
+#: builtin/reset.c:278 builtin/reset.c:280
 msgid "reset HEAD, index and working tree"
 msgstr "réinitialiser HEAD, l'index et la copie de travail"
 
-#: builtin/reset.c:271
+#: builtin/reset.c:282
 msgid "reset HEAD but keep local changes"
 msgstr "réinitialiser HEAD mais garder les changements locaux"
 
-#: builtin/reset.c:289
+#: builtin/reset.c:285
+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"
+
+#: builtin/reset.c:302
 #, 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:292 builtin/reset.c:300
+#: builtin/reset.c:305 builtin/reset.c:313
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "Impossible d'analyser l'objet '%s'."
 
-#: builtin/reset.c:297
+#: builtin/reset.c:310
 #, 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:306
+#: builtin/reset.c:319
 msgid "--patch is incompatible with --{hard,mixed,soft}"
 msgstr "--patch est incompatible avec --{hard,mixed,soft}"
 
-#: builtin/reset.c:315
+#: builtin/reset.c:328
 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:317
+#: builtin/reset.c:330
 #, c-format
 msgid "Cannot do %s reset with paths."
 msgstr "Impossible de faire un \"%s reset\" avec des chemins."
 
-#: builtin/reset.c:327
+#: builtin/reset.c:340
 #, 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
+msgid "-N can only be used with --mixed"
+msgstr "-N ne peut être utilisé qu'avec --mixed"
+
+#: builtin/reset.c:361
 msgid "Unstaged changes after reset:"
 msgstr "Modifications non indexées après reset :"
 
-#: builtin/reset.c:350
+#: builtin/reset.c:367
 #, 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:355
+#: builtin/reset.c:372
 msgid "Could not write new index file."
 msgstr "Impossible d'écrire le nouveau fichier d'index."
 
@@ -9126,7 +9073,7 @@ msgstr "arrêt de l'analyse après le premier argument qui n'est pas une option"
 msgid "output in stuck long form"
 msgstr "sortie en forme longue fixée"
 
-#: builtin/rev-parse.c:486
+#: builtin/rev-parse.c:497
 msgid ""
 "git rev-parse --parseopt [options] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -9198,35 +9145,35 @@ msgstr "option"
 msgid "option for merge strategy"
 msgstr "option pour la stratégie de fusion"
 
-#: builtin/revert.c:102
+#: builtin/revert.c:104
 msgid "append commit name"
 msgstr "ajouter le nom de validation"
 
-#: builtin/revert.c:103
+#: builtin/revert.c:105
 msgid "allow fast-forward"
 msgstr "autoriser l'avance rapide"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:106
 msgid "preserve initially empty commits"
 msgstr "préserver les validations vides initialement"
 
-#: builtin/revert.c:105
+#: builtin/revert.c:107
 msgid "allow commits with empty messages"
 msgstr "autoriser les validations avec des messages vides"
 
-#: builtin/revert.c:106
+#: builtin/revert.c:108
 msgid "keep redundant, empty commits"
 msgstr "garder les validations redondantes, vides"
 
-#: builtin/revert.c:110
+#: builtin/revert.c:112
 msgid "program error"
 msgstr "erreur du programme"
 
-#: builtin/revert.c:195
+#: builtin/revert.c:197
 msgid "revert failed"
 msgstr "revert a échoué"
 
-#: builtin/revert.c:210
+#: builtin/revert.c:212
 msgid "cherry-pick failed"
 msgstr "le picorage a échoué"
 
@@ -9512,11 +9459,11 @@ msgstr "supprimer la référence symbolique"
 msgid "shorten ref output"
 msgstr "raccourcir l'affichage de la référence"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
 msgid "reason"
 msgstr "raison"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
 msgid "reason of the update"
 msgstr "raison de la mise à jour"
 
@@ -9543,32 +9490,32 @@ msgstr ""
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <nométiquette>..."
 
-#: builtin/tag.c:60
+#: builtin/tag.c:67
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "objet malformé à '%s'"
 
-#: builtin/tag.c:207
+#: builtin/tag.c:239
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "nom d'étiquette trop long : %.*s..."
 
-#: builtin/tag.c:212
+#: builtin/tag.c:244
 #, c-format
 msgid "tag '%s' not found."
 msgstr "étiquette '%s' non trouvée."
 
-#: builtin/tag.c:227
+#: builtin/tag.c:259
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Étiquette '%s' supprimée (elle était %s)\n"
 
-#: builtin/tag.c:239
+#: builtin/tag.c:271
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "impossible de vérifier l'étiquette '%s'"
 
-#: builtin/tag.c:249
+#: builtin/tag.c:281
 #, c-format
 msgid ""
 "\n"
@@ -9579,7 +9526,7 @@ msgstr ""
 "Écrire un message pour l'étiquette\n"
 "Les lignes commençant par '%c' seront ignorées.\n"
 
-#: builtin/tag.c:253
+#: builtin/tag.c:285
 #, c-format
 msgid ""
 "\n"
@@ -9592,258 +9539,275 @@ msgstr ""
 "Les lignes commençant par '%c' seront gardées ; vous pouvez les retirer vous-"
 "même si vous le souhaitez.\n"
 
-#: builtin/tag.c:292
+#: builtin/tag.c:324
 msgid "unable to sign the tag"
 msgstr "impossible de signer l'étiquette"
 
-#: builtin/tag.c:294
+#: builtin/tag.c:326
 msgid "unable to write tag file"
 msgstr "impossible d'écrire le fichier d'étiquettes"
 
-#: builtin/tag.c:319
+#: builtin/tag.c:351
 msgid "bad object type."
 msgstr "mauvais type d'objet."
 
-#: builtin/tag.c:332
+#: builtin/tag.c:364
 msgid "tag header too big."
 msgstr "en-tête d'étiquette trop gros."
 
-#: builtin/tag.c:368
+#: builtin/tag.c:400
 msgid "no tag message?"
 msgstr "pas de message pour l'étiquette ?"
 
-#: builtin/tag.c:374
+#: builtin/tag.c:406
 #, 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:423
+#: builtin/tag.c:455
 msgid "switch 'points-at' requires an object"
 msgstr "le commutateur 'points-at' a besoin d'un objet"
 
-#: builtin/tag.c:425
+#: builtin/tag.c:457
 #, c-format
 msgid "malformed object name '%s'"
 msgstr "nom d'objet malformé '%s'"
 
-#: builtin/tag.c:445
+#: builtin/tag.c:480
+#, c-format
+msgid "unsupported sort specification %s"
+msgstr "spécification de tri non supportée %s"
+
+#: builtin/tag.c:500
 msgid "list tag names"
 msgstr "afficher les noms des étiquettes"
 
-#: builtin/tag.c:447
+#: builtin/tag.c:502
 msgid "print <n> lines of each tag message"
 msgstr "affiche <n> lignes de chaque message d'étiquette"
 
-#: builtin/tag.c:449
+#: builtin/tag.c:504
 msgid "delete tags"
 msgstr "supprimer des étiquettes"
 
-#: builtin/tag.c:450
+#: builtin/tag.c:505
 msgid "verify tags"
 msgstr "vérifier des étiquettes"
 
-#: builtin/tag.c:452
+#: builtin/tag.c:507
 msgid "Tag creation options"
 msgstr "Options de création de l'étiquette"
 
-#: builtin/tag.c:454
+#: builtin/tag.c:509
 msgid "annotated tag, needs a message"
 msgstr "étiquette annotée, nécessite un message"
 
-#: builtin/tag.c:456
+#: builtin/tag.c:511
 msgid "tag message"
 msgstr "message pour l'étiquette"
 
-#: builtin/tag.c:458
+#: builtin/tag.c:513
 msgid "annotated and GPG-signed tag"
 msgstr "étiquette annotée et signée avec GPG"
 
-#: builtin/tag.c:462
+#: builtin/tag.c:517
 msgid "use another key to sign the tag"
 msgstr "utiliser une autre clé pour signer l'étiquette"
 
-#: builtin/tag.c:463
+#: builtin/tag.c:518
 msgid "replace the tag if exists"
 msgstr "remplacer l'étiquette si elle existe"
 
-#: builtin/tag.c:464
+#: builtin/tag.c:519
 msgid "show tag list in columns"
 msgstr "afficher la liste des étiquettes sous forme de colonnes"
 
-#: builtin/tag.c:466
+#: builtin/tag.c:521
+msgid "sort tags"
+msgstr "trier les étiquettes"
+
+#: builtin/tag.c:525
 msgid "Tag listing options"
 msgstr "Options d'affichage des étiquettes"
 
-#: builtin/tag.c:469
+#: builtin/tag.c:528 builtin/tag.c:534
 msgid "print only tags that contain the commit"
 msgstr "afficher seulement les étiquettes qui contiennent la validation"
 
-#: builtin/tag.c:475
+#: builtin/tag.c:540
 msgid "print only tags of the object"
 msgstr "afficher seulement les étiquettes de l'objet"
 
-#: builtin/tag.c:501
+#: builtin/tag.c:566
 msgid "--column and -n are incompatible"
 msgstr "--column et -n sont incompatibles"
 
-#: builtin/tag.c:518
+#: builtin/tag.c:578
+msgid "--sort and -n are incompatible"
+msgstr "--sort et -n sont incompatibles"
+
+#: builtin/tag.c:585
 msgid "-n option is only allowed with -l."
 msgstr "l'option -n est autorisée seulement avec -l."
 
-#: builtin/tag.c:520
+#: builtin/tag.c:587
 msgid "--contains option is only allowed with -l."
 msgstr "l'option --contains est autorisée seulement avec -l."
 
-#: builtin/tag.c:522
+#: builtin/tag.c:589
 msgid "--points-at option is only allowed with -l."
 msgstr "l'option --points-at est autorisée seulement avec -l."
 
-#: builtin/tag.c:530
+#: builtin/tag.c:597
 msgid "only one -F or -m option is allowed."
 msgstr "une seule option -F ou -m est autorisée."
 
-#: builtin/tag.c:550
+#: builtin/tag.c:617
 msgid "too many params"
 msgstr "trop de paramètres"
 
-#: builtin/tag.c:556
+#: builtin/tag.c:623
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' n'est pas un nom d'étiquette valide."
 
-#: builtin/tag.c:561
+#: builtin/tag.c:628
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "l'étiquette '%s' existe déjà"
 
-#: builtin/tag.c:579
+#: builtin/tag.c:646
 #, c-format
 msgid "%s: cannot lock the ref"
 msgstr "%s : impossible de verrouiller la référence"
 
-#: builtin/tag.c:581
+#: 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:583
+#: builtin/tag.c:650
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Étiquette '%s' mise à jour (elle était %s)\n"
 
-#: builtin/update-index.c:402
+#: builtin/unpack-objects.c:483
+msgid "Unpacking objects"
+msgstr "Dépaquetage des objets"
+
+#: builtin/update-index.c:399
 msgid "git update-index [options] [--] [<file>...]"
 msgstr "git update-index [options] [--] [<fichier>...]"
 
-#: builtin/update-index.c:720
+#: builtin/update-index.c:748
 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:723
+#: builtin/update-index.c:751
 msgid "refresh: ignore submodules"
 msgstr "rafraîchir : ignorer les sous-modules"
 
-#: builtin/update-index.c:726
+#: builtin/update-index.c:754
 msgid "do not ignore new files"
 msgstr "ne pas ignorer les nouveaux fichiers"
 
-#: builtin/update-index.c:728
+#: builtin/update-index.c:756
 msgid "let files replace directories and vice-versa"
 msgstr "laisser les fichiers remplacer des répertoires et vice-versa"
 
-#: builtin/update-index.c:730
+#: builtin/update-index.c:758
 msgid "notice files missing from worktree"
 msgstr "aviser des fichiers manquants dans la copie de travail"
 
-#: builtin/update-index.c:732
+#: builtin/update-index.c:760
 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:735
+#: builtin/update-index.c:763
 msgid "refresh stat information"
 msgstr "rafraîchir l'information de stat"
 
-#: builtin/update-index.c:739
+#: builtin/update-index.c:767
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "comme --refresh, mais en ignorant l'option assume-unchanged"
 
-#: builtin/update-index.c:743
-msgid "<mode> <object> <path>"
-msgstr "<mode> <objet> <chemin>"
+#: builtin/update-index.c:771
+msgid "<mode>,<object>,<path>"
+msgstr "<mode>, <objet>, <chemin>"
 
-#: builtin/update-index.c:744
+#: builtin/update-index.c:772
 msgid "add the specified entry to the index"
 msgstr "ajouter l'élément spécifié dans l'index"
 
-#: builtin/update-index.c:748
+#: builtin/update-index.c:776
 msgid "(+/-)x"
 msgstr "(+/-)x"
 
-#: builtin/update-index.c:749
+#: builtin/update-index.c:777
 msgid "override the executable bit of the listed files"
 msgstr "outrepasser le bit exécutable pour les fichiers listés"
 
-#: builtin/update-index.c:753
+#: builtin/update-index.c:781
 msgid "mark files as \"not changing\""
 msgstr "marquer les fichiers comme \"non changeants\""
 
-#: builtin/update-index.c:756
+#: builtin/update-index.c:784
 msgid "clear assumed-unchanged bit"
 msgstr "mettre à zéro le bit supposé-non-modifié"
 
-#: builtin/update-index.c:759
+#: builtin/update-index.c:787
 msgid "mark files as \"index-only\""
 msgstr "marquer les fichiers comme \"index seulement\""
 
-#: builtin/update-index.c:762
+#: builtin/update-index.c:790
 msgid "clear skip-worktree bit"
 msgstr "mettre à zéro le bit sauter-la-copie-de travail"
 
-#: builtin/update-index.c:765
+#: builtin/update-index.c:793
 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:767
+#: builtin/update-index.c:795
 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:769
+#: builtin/update-index.c:797
 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:771
+#: builtin/update-index.c:799
 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:775
+#: builtin/update-index.c:803
 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:779
+#: builtin/update-index.c:807
 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:783
+#: builtin/update-index.c:811
 msgid "only update entries that differ from HEAD"
 msgstr "mettre à jour seulement les éléments qui diffèrent de HEAD"
 
-#: builtin/update-index.c:787
+#: builtin/update-index.c:815
 msgid "ignore files missing from worktree"
 msgstr "ignorer les fichiers manquants dans la copie de travail"
 
-#: builtin/update-index.c:790
+#: builtin/update-index.c:818
 msgid "report actions to standard output"
 msgstr "afficher les actions sur la sortie standard"
 
-#: builtin/update-index.c:792
+#: builtin/update-index.c:820
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(pour porcelaines) oublier les conflits sauvés et non résolus"
 
-#: builtin/update-index.c:796
+#: builtin/update-index.c:824
 msgid "write index in this format"
 msgstr "écrire l'index dans ce format"
 
@@ -9861,19 +9825,19 @@ msgstr ""
 msgid "git update-ref [options] --stdin [-z]"
 msgstr "git update-ref [options] --stdin [-z]"
 
-#: builtin/update-ref.c:255
+#: builtin/update-ref.c:256
 msgid "delete the reference"
 msgstr "supprimer la référence"
 
-#: builtin/update-ref.c:257
+#: builtin/update-ref.c:258
 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:258
+#: builtin/update-ref.c:259
 msgid "stdin has NUL-terminated arguments"
 msgstr "l'entrée standard a des arguments qui se terminent par NUL"
 
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:260
 msgid "read updates from stdin"
 msgstr "lire les mises à jour depuis l'entrée standard"
 
@@ -9931,23 +9895,23 @@ msgstr ""
 "quelques concepts. Voir 'git help <command>' ou 'git help <concept>'\n"
 "pour en lire plus à propos d'une commande spécifique ou d'un concept."
 
-#: parse-options.h:146
-msgid "expiry date"
-msgstr "date d'expiration"
+#: parse-options.h:143
+msgid "expiry-date"
+msgstr "date-d'expiration"
 
-#: parse-options.h:161
+#: parse-options.h:158
 msgid "no-op (backward compatibility)"
 msgstr "sans action (rétrocompatibilité)"
 
-#: parse-options.h:235
+#: parse-options.h:232
 msgid "be more verbose"
 msgstr "être plus verbeux"
 
-#: parse-options.h:237
+#: parse-options.h:234
 msgid "be more quiet"
 msgstr "être plus silencieux"
 
-#: parse-options.h:243
+#: parse-options.h:240
 msgid "use <n> digits to display SHA-1s"
 msgstr "utiliser <n> chiffres pour afficher les SHA-1s"
 
@@ -10039,11 +10003,11 @@ msgid "Create, list, delete or verify a tag object signed with GPG"
 msgstr ""
 "Créer, lister, supprimer ou vérifier un objet d'étiquette signé avec GPG"
 
-#: git-am.sh:50
+#: git-am.sh:52
 msgid "You need to set your committer info first"
 msgstr "Vous devez d'abord définir vos informations de validateur"
 
-#: git-am.sh:95
+#: git-am.sh:97
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
@@ -10051,7 +10015,7 @@ msgstr ""
 "Vous semblez avoir déplacé la HEAD depuis le dernier échec de 'am'.\n"
 "Pas de retour à ORIG_HEAD"
 
-#: git-am.sh:105
+#: git-am.sh:107
 #, sh-format
 msgid ""
 "When you have resolved this problem, run \"$cmdline --continue\".\n"
@@ -10063,22 +10027,22 @@ msgstr ""
 "Pour restaurer la branche d'origine et stopper le patchage, lancez "
 "\"$cmdline --abort\"."
 
-#: git-am.sh:121
+#: git-am.sh:123
 msgid "Cannot fall back to three-way merge."
 msgstr "Impossible de retourner à une fusion à 3 points."
 
-#: git-am.sh:137
+#: git-am.sh:139
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
 "Le dépôt n'a pas les blobs nécessaires pour un retour à une fusion à 3 "
 "points."
 
-#: git-am.sh:139
+#: git-am.sh:141
 msgid "Using index info to reconstruct a base tree..."
 msgstr ""
 "Utilisation de l'information de l'index pour reconstruire un arbre de base..."
 
-#: git-am.sh:154
+#: git-am.sh:156
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
@@ -10086,28 +10050,28 @@ msgstr ""
 "Avez-vous édité le patch à la main ?\n"
 "Il ne s'applique pas aux blobs enregistrés dans son index."
 
-#: git-am.sh:163
+#: git-am.sh:165
 msgid "Falling back to patching base and 3-way merge..."
 msgstr "Retour à un patch de la base et fusion à 3 points..."
 
-#: git-am.sh:179
+#: git-am.sh:181
 msgid "Failed to merge in the changes."
 msgstr "Échec d'intégration des modifications."
 
-#: git-am.sh:274
+#: git-am.sh:276
 msgid "Only one StGIT patch series can be applied at once"
 msgstr "Seulement une série de patchs StGIT peut être appliquée à la fois"
 
-#: git-am.sh:361
+#: git-am.sh:363
 #, sh-format
 msgid "Patch format $patch_format is not supported."
 msgstr "Le format de patch $patch_format n'est pas supporté."
 
-#: git-am.sh:363
+#: git-am.sh:365
 msgid "Patch format detection failed."
 msgstr "Échec de détection du format du patch."
 
-#: git-am.sh:389
+#: 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."
@@ -10115,17 +10079,17 @@ msgstr ""
 "L'option -b/--binary ne fait plus rien depuis longtemps,\n"
 "et elle sera supprimée. Veuillez ne plus l'utiliser."
 
-#: git-am.sh:479
+#: git-am.sh:486
 #, sh-format
 msgid "previous rebase directory $dotest still exists but mbox given."
 msgstr ""
 "le répertoire précédent de rebasage $dotest existe toujours mais mbox donnée."
 
-#: git-am.sh:484
+#: git-am.sh:491
 msgid "Please make up your mind. --skip or --abort?"
 msgstr "Décidez-vous. --skip ou --abort ?"
 
-#: git-am.sh:520
+#: git-am.sh:527
 #, sh-format
 msgid ""
 "Stray $dotest directory found.\n"
@@ -10134,18 +10098,18 @@ msgstr ""
 "Répertoire abandonné $dotest trouvé.\n"
 "Utilisez \"git am --abort\" pour le supprimer."
 
-#: git-am.sh:528
+#: git-am.sh:535
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr ""
 "Pas de résolution de l'opération en cours, nous ne sommes pas dans une "
 "reprise."
 
-#: git-am.sh:594
+#: git-am.sh:601
 #, sh-format
 msgid "Dirty index: cannot apply patches (dirty: $files)"
 msgstr "Index sale : impossible d'appliquer des patchs (sales : $files)"
 
-#: git-am.sh:698
+#: git-am.sh:705
 #, sh-format
 msgid ""
 "Patch is empty.  Was it split wrong?\n"
@@ -10157,32 +10121,32 @@ msgstr ""
 "Pour restaurer la branche d'origine et stopper le patchage, lancez "
 "\"$cmdline --abort\"."
 
-#: git-am.sh:725
+#: git-am.sh:732
 msgid "Patch does not have a valid e-mail address."
 msgstr "Le patch n'a pas d'adresse e-mail valide."
 
-#: git-am.sh:772
+#: git-am.sh:779
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
 "impossible d'être interactif sans entrée standard connectée à un terminal."
 
-#: git-am.sh:776
+#: git-am.sh:783
 msgid "Commit Body is:"
 msgstr "Le corps de la validation est :"
 
 #. 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:783
+#: git-am.sh:790
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
 msgstr "Appliquer ? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
 
-#: git-am.sh:819
+#: git-am.sh:826
 #, sh-format
 msgid "Applying: $FIRSTLINE"
 msgstr "Application : $FIRSTLINE"
 
-#: git-am.sh:840
+#: 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"
@@ -10193,7 +10157,7 @@ msgstr ""
 "introduit les mêmes changements ; vous pourriez avoir envie de sauter ce "
 "patch."
 
-#: git-am.sh:848
+#: git-am.sh:855
 msgid ""
 "You still have unmerged paths in your index\n"
 "did you forget to use 'git add'?"
@@ -10201,16 +10165,16 @@ msgstr ""
 "Vous avez toujours des chemins non fusionnés dans votre index\n"
 "auriez-vous oublié de faire 'git add' ?"
 
-#: git-am.sh:864
+#: git-am.sh:871
 msgid "No changes -- Patch already applied."
 msgstr "Pas de changement -- Patch déjà appliqué."
 
-#: git-am.sh:874
+#: git-am.sh:881
 #, sh-format
 msgid "Patch failed at $msgnum $FIRSTLINE"
 msgstr "Le patch a échoué à $msgnum $FIRSTLINE"
 
-#: git-am.sh:877
+#: git-am.sh:884
 #, sh-format
 msgid ""
 "The copy of the patch that failed is found in:\n"
@@ -10219,7 +10183,7 @@ msgstr ""
 "La copie du patch qui a échoué se trouve dans :\n"
 "   $dotest/patch"
 
-#: git-am.sh:895
+#: git-am.sh:902
 msgid "applying to an empty history"
 msgstr "application à un historique vide"
 
@@ -10287,8 +10251,6 @@ msgstr "Mauvaise révision en entrée : $rev"
 msgid "'git bisect bad' can take only one argument."
 msgstr "'git bisect bad' n'accepte qu'un seul argument."
 
-#. have bad but not good.  we could bisect although
-#. this is less optimum.
 #: git-bisect.sh:273
 msgid "Warning: bisecting only with a bad commit."
 msgstr "Attention : bissection avec seulement une mauvaise validation."
@@ -10395,17 +10357,13 @@ msgstr ""
 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:223
+#: git-pull.sh:247
 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"
 
-#. The fetch involved updating the current branch.
-#. The working tree and the index file is still based on the
-#. $orig_head commit, but we are merging into $curr_head.
-#. First update the working tree to match $curr_head.
-#: git-pull.sh:247
+#: git-pull.sh:271
 #, sh-format
 msgid ""
 "Warning: fetch updated the current branch head.\n"
@@ -10416,15 +10374,15 @@ msgstr ""
 "Attention : mise à jour en avance rapide de votre copie de travail\n"
 "Attention : depuis la validation $orig_head."
 
-#: git-pull.sh:272
+#: git-pull.sh:296
 msgid "Cannot merge multiple branches into empty head"
 msgstr "Impossible de fusionner de multiples branches sur une tête vide"
 
-#: git-pull.sh:276
+#: git-pull.sh:300
 msgid "Cannot rebase onto multiple branches"
 msgstr "Impossible de rebaser sur de multiples branches"
 
-#: git-rebase.sh:55
+#: 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"
@@ -10436,16 +10394,16 @@ msgstr ""
 "Pour extraire la branche d'origine et stopper le rebasage, lancez \"git "
 "rebase --abort\"."
 
-#: git-rebase.sh:158
+#: git-rebase.sh:164
 msgid "Applied autostash."
 msgstr "Autoremisage appliqué."
 
-#: git-rebase.sh:161
+#: git-rebase.sh:167
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Impossible de stocker $stash_sha1"
 
-#: git-rebase.sh:162
+#: git-rebase.sh:168
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
@@ -10455,33 +10413,33 @@ msgstr ""
 "Vos  modifications sont à l'abri dans la remise.\n"
 "Vous pouvez lancer \"git stash pop\" ou \"git stash drop\" à tout moment.\n"
 
-#: git-rebase.sh:201
+#: git-rebase.sh:207
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Le crochet pre-rebase a refusé de rebaser."
 
-#: git-rebase.sh:206
+#: git-rebase.sh:212
 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:346
+#: git-rebase.sh:350
 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:351
+#: git-rebase.sh:355
 msgid "No rebase in progress?"
 msgstr "Pas de rebasage en cours ?"
 
-#: git-rebase.sh:362
+#: git-rebase.sh:366
 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:369
+#: git-rebase.sh:373
 msgid "Cannot read HEAD"
 msgstr "Impossible de lire HEAD"
 
-#: git-rebase.sh:372
+#: git-rebase.sh:376
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -10489,12 +10447,12 @@ msgstr ""
 "Vous devez éditer tous les conflits de fusion et\n"
 "les marquer comme résolus avec git add"
 
-#: git-rebase.sh:390
+#: git-rebase.sh:394
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Impossible de revenir à $head_name"
 
-#: git-rebase.sh:409
+#: git-rebase.sh:413
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -10516,66 +10474,65 @@ msgstr ""
 "chose\n"
 "d'important ici."
 
-#: git-rebase.sh:456
+#: git-rebase.sh:464
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "invalide $upstream_name en amont"
 
-#: git-rebase.sh:480
+#: git-rebase.sh:488
 #, 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:483 git-rebase.sh:487
+#: git-rebase.sh:491 git-rebase.sh:495
 #, 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:492
+#: git-rebase.sh:500
 #, 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:515
+#: git-rebase.sh:523
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "fatal : pas de branche : $branch_name"
 
-#: git-rebase.sh:548
+#: git-rebase.sh:556
 msgid "Cannot autostash"
 msgstr "Autoremisage impossible"
 
-#: git-rebase.sh:553
+#: git-rebase.sh:561
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Autoremisage créé : $stash_abbrev"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:565
 msgid "Please commit or stash them."
 msgstr "Veuillez les valider ou les remiser."
 
-#: git-rebase.sh:577
+#: git-rebase.sh:585
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "La branche courante $branch_name est à jour."
 
-#: git-rebase.sh:581
+#: git-rebase.sh:589
 #, 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:592
+#: git-rebase.sh:600
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Changements de $mb sur $onto :"
 
-#. Detach HEAD and reset the tree
-#: git-rebase.sh:601
+#: git-rebase.sh:609
 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:611
+#: git-rebase.sh:619
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "$branch_name mise à jour en avance rapide sur $onto_name."
@@ -10686,7 +10643,7 @@ msgstr "Conflits dans l'index. Essayez sans --index."
 
 #: git-stash.sh:457
 msgid "Could not save index tree"
-msgstr "Impossible de sauver l'arbre d'index"
+msgstr "Impossible de sauvegarder l'arbre d'index"
 
 #: git-stash.sh:491
 msgid "Cannot unstage modified files"
@@ -10696,21 +10653,21 @@ msgstr "Impossible de désindexer les fichiers modifiés"
 msgid "Index was not unstashed."
 msgstr "L'index n'a pas été sorti de remise."
 
-#: git-stash.sh:523
+#: git-stash.sh:529
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "${REV} supprimé ($s)"
 
-#: git-stash.sh:524
+#: git-stash.sh:530
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Impossible de supprimer l'élément de stash"
 
-#: git-stash.sh:531
+#: git-stash.sh:537
 msgid "No branch name specified"
 msgstr "Aucune branche spécifiée"
 
-#: git-stash.sh:603
+#: git-stash.sh:609
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Pour les restaurer tapez \"git stash apply\")"
 
@@ -10726,35 +10683,35 @@ msgstr ""
 "Pas de mise en correspondance du sous-module trouvé dans .gitmodules pour le "
 "chemin '$sm_path'"
 
-#: git-submodule.sh:281
+#: git-submodule.sh:287
 #, sh-format
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
 msgstr "Le clonage de '$url' dans le chemin de sous-module '$sm_path' a échoué"
 
-#: git-submodule.sh:293
+#: git-submodule.sh:299
 #, 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:403
+#: git-submodule.sh:409
 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:413
+#: git-submodule.sh:419
 #, 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:430
+#: git-submodule.sh:436
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' existe déjà dans l'index"
 
-#: git-submodule.sh:434
+#: git-submodule.sh:440
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -10765,24 +10722,24 @@ msgstr ""
 "$sm_path\n"
 "Utilisez -f si vous voulez vraiment l'ajouter."
 
-#: git-submodule.sh:452
+#: git-submodule.sh:458
 #, 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:454
+#: git-submodule.sh:460
 #, 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:462
+#: git-submodule.sh:468
 #, 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:464
+#: git-submodule.sh:470
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
@@ -10790,7 +10747,7 @@ msgstr ""
 "Si vous voulez réutiliser ce répertoire git local au lieu de cloner à "
 "nouveau depuis"
 
-#: git-submodule.sh:466
+#: git-submodule.sh:472
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
@@ -10798,7 +10755,7 @@ msgstr ""
 "utilisez l'option '--force'. Si le répertoire local git n'est pas le dépôt "
 "correct"
 
-#: git-submodule.sh:467
+#: git-submodule.sh:473
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
@@ -10807,74 +10764,74 @@ msgstr ""
 "ou vous ne savez pas ce que cela signifie de choisir un autre nom avec "
 "l'option '--name'."
 
-#: git-submodule.sh:469
+#: git-submodule.sh:475
 #, 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:481
+#: git-submodule.sh:487
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Impossible d'extraire le sous-module '$sm_path'"
 
-#: git-submodule.sh:486
+#: git-submodule.sh:492
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Échec d'ajout du sous-module '$sm_path'"
 
-#: git-submodule.sh:495
+#: git-submodule.sh:501
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Échec d'enregistrement du sous-module '$sm_path'"
 
-#: git-submodule.sh:539
+#: git-submodule.sh:545
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "Entrée dans '$prefix$displaypath'"
 
-#: git-submodule.sh:559
+#: git-submodule.sh:565
 #, 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:605
+#: git-submodule.sh:611
 #, sh-format
 msgid "No url found for submodule path '$displaypath' in .gitmodules"
 msgstr ""
-"URL non trouvé pour le chemin de sous-module '$displaypath' dans .gitmodules"
+"URL non trouvée pour le chemin de sous-module '$displaypath' dans .gitmodules"
 
-#: git-submodule.sh:614
+#: git-submodule.sh:620
 #, 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:616
+#: git-submodule.sh:622
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr "Sous-module '$name' ($url) enregistré pour le chemin '$displaypath'"
 
-#: git-submodule.sh:633
+#: git-submodule.sh:639
 #, 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:671
+#: git-submodule.sh:677
 #, 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:688
+#: git-submodule.sh:694
 #, 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:689
+#: git-submodule.sh:695
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
@@ -10882,7 +10839,7 @@ msgstr ""
 "(utilisez 'rm -rf' si vous voulez vraiment le supprimer en incluant tout son "
 "historique)"
 
-#: git-submodule.sh:695
+#: git-submodule.sh:701
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -10891,30 +10848,30 @@ msgstr ""
 "La copie de travail du sous-module '$displaypath' contient des modifications "
 "locales ; utilisez '-f' pour les annuler"
 
-#: git-submodule.sh:698
+#: git-submodule.sh:704
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Répertoire '$displaypath' nettoyé"
 
-#: git-submodule.sh:699
+#: git-submodule.sh:705
 #, 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:702
+#: git-submodule.sh:708
 #, 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:711
+#: git-submodule.sh:717
 #, 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:834
+#: git-submodule.sh:833
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
@@ -10923,46 +10880,57 @@ msgstr ""
 "Chemin de sous-module '$displaypath' non initialisé\n"
 "Peut-être souhaitez-vous utiliser 'update --init' ?"
 
-#: git-submodule.sh:847
+#: git-submodule.sh:846
 #, 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:856
+#: git-submodule.sh:855
 #, 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:880
+#: git-submodule.sh:879
 #, 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
+#, 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
 #, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "Chemin de sous-module '$displaypath' : '$sha1' extrait"
+
+#: git-submodule.sh:898
+#, 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:895
+#: git-submodule.sh:899
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Chemin de sous-module '$displaypath' : rebasé dans '$sha1'"
 
-#: git-submodule.sh:900
+#: git-submodule.sh:904
 #, 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:901
+#: git-submodule.sh:905
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Chemin de sous-module '$displaypath' : fusionné dans '$sha1'"
 
-#: git-submodule.sh:906
+#: git-submodule.sh:910
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule  path '$prefix$sm_path'"
@@ -10970,70 +10938,174 @@ msgstr ""
 "L'exécution de '$command $sha1' a échoué dans le chemin de sous-module "
 "'$prefix$sm_path'"
 
-#: git-submodule.sh:907
+#: git-submodule.sh:911
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr "Chemin de sous-module '$prefix$sm_path' : '$command $sha1'"
 
-#: git-submodule.sh:912
-#, 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:913
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr "Chemin de sous-module '$displaypath' : '$sha1' extrait"
-
-#: git-submodule.sh:940
+#: git-submodule.sh:941
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Échec de parcours dans le chemin du sous-module '$displaypath'"
 
-#: git-submodule.sh:1048
+#: git-submodule.sh:1049
 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"
 
-#. unexpected type
-#: git-submodule.sh:1096
+#: git-submodule.sh:1097
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "mode $mod_dst inattendu"
 
-#: git-submodule.sh:1116
+#: git-submodule.sh:1117
 #, 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:1119
+#: git-submodule.sh:1120
 #, 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:1122
+#: git-submodule.sh:1123
 #, 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:1147
+#: git-submodule.sh:1148
 msgid "blob"
 msgstr "blob"
 
-#: git-submodule.sh:1261
+#: git-submodule.sh:1262
 #, 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:1325
+#: git-submodule.sh:1326
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Synchronisation de l'URL sous-module pour '$displaypath'"
 
-#~ msgid "copied:     %s -> %s"
+#~ msgid "Tracking not set up: name too long: %s"
+#~ msgstr "Suivi de branche non paramétré : le nom est trop long : %s"
+
+#~ msgid "could not find .gitmodules in index"
+#~ msgstr "impossible de trouver .gitmodules dans l'index"
+
+#~ msgid "reading updated .gitmodules failed"
+#~ msgstr "échec de la lecture du .gitmodules mis à jour"
+
+#~ msgid "unable to stat updated .gitmodules"
+#~ msgstr "échec de stat du .gitmodules mis à jour"
+
+#~ msgid "unable to remove .gitmodules from index"
+#~ msgstr "suppression du .gitmodules dans l'index impossible"
+
+#~ msgid "adding updated .gitmodules failed"
+#~ msgstr "échec de l'ajout du .gitmodules mis à jour"
+
+#~ msgid "bug"
+#~ msgstr "bogue"
+
+#~ msgid "ahead "
+#~ msgstr "devant "
+
+#~ msgid ", behind "
+#~ msgstr ", derrière "
+
+#~ msgid ""
+#~ "The behavior of 'git add %s (or %s)' with no path argument from a\n"
+#~ "subdirectory of the tree will change in Git 2.0 and should not be used "
+#~ "anymore.\n"
+#~ "To add content for the whole tree, run:\n"
+#~ "\n"
+#~ "  git add %s :/\n"
+#~ "  (or git add %s :/)\n"
+#~ "\n"
+#~ "To restrict the command to the current directory, run:\n"
+#~ "\n"
+#~ "  git add %s .\n"
+#~ "  (or git add %s .)\n"
+#~ "\n"
+#~ "With the current Git version, the command is restricted to the current "
+#~ "directory.\n"
+#~ msgstr ""
+#~ "Le comportement de 'git add %s (ou %s)' sans argument de chemin depuis "
+#~ "un\n"
+#~ "sous-répertoire du projet va changer dans Git 2.0 et ne doit plus être "
+#~ "utilisé.\n"
+#~ "Pour ajouter le contenu de toute l'arborescence, lancez :\n"
+#~ "\n"
+#~ "  git add %s :/\n"
+#~ "  (ou git add %s :/)\n"
+#~ "\n"
+#~ "Pour restreindre la commande au répertoire courant, lancez :\n"
+#~ "\n"
+#~ "  git add %s .\n"
+#~ "  (ou git add %s .)\n"
+#~ "\n"
+#~ "Avec la version actuelle de Git, la commande est restreinte au répertoire "
+#~ "courant.\n"
+
+#~ msgid ""
+#~ "You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
+#~ "whose behaviour will change in Git 2.0 with respect to paths you "
+#~ "removed.\n"
+#~ "Paths like '%s' that are\n"
+#~ "removed from your working tree are ignored with this version of Git.\n"
+#~ "\n"
+#~ "* 'git add --ignore-removal <pathspec>', which is the current default,\n"
+#~ "  ignores paths you removed from your working tree.\n"
+#~ "\n"
+#~ "* 'git add --all <pathspec>' will let you also record the removals.\n"
+#~ "\n"
+#~ "Run 'git status' to check the paths you removed from your working tree.\n"
 #~ msgstr ""
+#~ "Vous avez lancé 'git add' sans '-A (--all)' ni '--ignore-removal',\n"
+#~ "dont le comportement va changer dans Git 2.0 avec le respect des chemins "
+#~ "que vous supprimez.\n"
+#~ "Les chemins tels que '%s' qui ont été\n"
+#~ "retirés de votre copie de travail sont ignorés avec cette version de "
+#~ "Git.\n"
+#~ "\n"
+#~ "* 'git add --ignore-removal <chemin>', qui est l'option par défaut "
+#~ "actuelle,\n"
+#~ "  ignore les chemins que vous avez supprimés de votre copie de travail.\n"
+#~ "\n"
+#~ "* 'git add --all <chemin>' permet d'enregistrer aussi les suppressions.\n"
+#~ "\n"
+#~ "Lancez 'git status' pour vérifier les chemins que vous avez supprimés de "
+#~ "votre copie de travail.\n"
+
+#~ msgid "key id"
+#~ msgstr "identifiant de clé"
+
+#~ msgid ""
+#~ "Auto packing the repository for optimum performance. You may also\n"
+#~ "run \"git gc\" manually. See \"git help gc\" for more information.\n"
+#~ msgstr ""
+#~ "Compression automatique du dépôt pour une performance optimum. Vous "
+#~ "pouvez aussi\n"
+#~ "lancer \"git gc\" manuellement. Voir \"git help gc\" pour plus "
+#~ "d'information.\n"
+
+#~ msgid ""
+#~ "Updates were rejected because a pushed branch tip is behind its remote\n"
+#~ "counterpart. If you did not intend to push that branch, you may want to\n"
+#~ "specify branches to push or set the 'push.default' configuration "
+#~ "variable\n"
+#~ "to 'simple', 'current' or 'upstream' to push only the current branch."
+#~ msgstr ""
+#~ "Les mises à jour ont été rejetées car la pointe de la branche poussée est "
+#~ "derrière\n"
+#~ "son homologue distant. Si vous ne vouliez pas pousser cette branche, vous "
+#~ "pourriez\n"
+#~ "vouloir spécifier les branches à pousser ou définir la variable de "
+#~ "configuration\n"
+#~ "'push.default' à 'simple', 'current' ou 'upstream' pour pousser seulement "
+#~ "la branche courante."
 
 #~ msgid "deleted:    %s"
 #~ msgstr "supprimé :  %s"
@@ -11050,9 +11122,6 @@ msgstr "Synchronisation de l'URL sous-module pour '$displaypath'"
 #~ msgid "input paths are terminated by a null character"
 #~ msgstr "les chemins en entrée sont terminés par le caractère nul"
 
-#~ msgid "done\n"
-#~ msgstr "fait\n"
-
 #~ msgid ""
 #~ "The following untracked files would NOT be saved but need to be removed "
 #~ "by stash save:"
index 33cc31d51b9a0ffa12ed05d93ef44ef506aadb7a..1407f06e8da8bcba41046fbbd25a9e365bcb20ea 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-02-01 08:06+0800\n"
+"POT-Creation-Date: 2014-04-19 12:50+0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,16 +18,12 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
-#: advice.c:57
+#: advice.c:55
 #, c-format
 msgid "hint: %.*s\n"
 msgstr ""
 
-#.
-#. * Message used both when 'git commit' fails and when
-#. * other commands doing a merge do.
-#.
-#: advice.c:87
+#: advice.c:85
 msgid ""
 "Fix them up in the work tree,\n"
 "and then use 'git add/rm <file>' as\n"
@@ -52,76 +48,76 @@ msgstr ""
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr ""
 
-#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328
+#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr ""
 
-#: archive.c:327
+#: archive.c:328
 msgid "fmt"
 msgstr ""
 
-#: archive.c:327
+#: archive.c:328
 msgid "archive format"
 msgstr ""
 
-#: archive.c:328 builtin/log.c:1193
+#: archive.c:329 builtin/log.c:1193
 msgid "prefix"
 msgstr ""
 
-#: archive.c:329
+#: archive.c:330
 msgid "prepend prefix to each pathname in the archive"
 msgstr ""
 
-#: archive.c:330 builtin/archive.c:88 builtin/blame.c:2265
-#: builtin/blame.c:2266 builtin/config.c:58 builtin/fast-export.c:680
-#: builtin/fast-export.c:682 builtin/grep.c:716 builtin/hash-object.c:77
-#: builtin/ls-files.c:486 builtin/ls-files.c:489 builtin/notes.c:408
-#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:154
+#: 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
 msgid "file"
 msgstr ""
 
-#: archive.c:331 builtin/archive.c:89
+#: archive.c:332 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr ""
 
-#: archive.c:333
+#: archive.c:334
 msgid "read .gitattributes in working directory"
 msgstr ""
 
-#: archive.c:334
+#: archive.c:335
 msgid "report archived files on stderr"
 msgstr ""
 
-#: archive.c:335
+#: archive.c:336
 msgid "store only"
 msgstr ""
 
-#: archive.c:336
+#: archive.c:337
 msgid "compress faster"
 msgstr ""
 
-#: archive.c:344
+#: archive.c:345
 msgid "compress better"
 msgstr ""
 
-#: archive.c:347
+#: archive.c:348
 msgid "list supported archive formats"
 msgstr ""
 
-#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
 msgid "repo"
 msgstr ""
 
-#: archive.c:350 builtin/archive.c:91
+#: archive.c:351 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr ""
 
-#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487
+#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
 msgid "command"
 msgstr ""
 
-#: archive.c:352 builtin/archive.c:93
+#: archive.c:353 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr ""
 
@@ -136,81 +132,76 @@ msgstr ""
 msgid "Not setting branch %s as its own upstream."
 msgstr ""
 
-#: branch.c:82
+#: branch.c:83
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr ""
 
-#: branch.c:83
+#: branch.c:84
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
 msgstr ""
 
-#: branch.c:87
+#: branch.c:88
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr ""
 
-#: branch.c:88
+#: branch.c:89
 #, c-format
 msgid "Branch %s set up to track local branch %s."
 msgstr ""
 
-#: branch.c:92
+#: branch.c:94
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr ""
 
-#: branch.c:93
+#: branch.c:95
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
 msgstr ""
 
-#: branch.c:97
+#: branch.c:99
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
 
-#: branch.c:98
+#: branch.c:100
 #, c-format
 msgid "Branch %s set up to track local ref %s."
 msgstr ""
 
-#: branch.c:118
-#, c-format
-msgid "Tracking not set up: name too long: %s"
-msgstr ""
-
-#: branch.c:137
+#: branch.c:133
 #, c-format
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr ""
 
-#: branch.c:182
+#: branch.c:178
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr ""
 
-#: branch.c:187
+#: branch.c:183
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr ""
 
-#: branch.c:195
+#: branch.c:191
 msgid "Cannot force update the current branch."
 msgstr ""
 
-#: branch.c:215
+#: branch.c:211
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr ""
 
-#: branch.c:217
+#: branch.c:213
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr ""
 
-#: branch.c:219
+#: branch.c:215
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -222,113 +213,113 @@ msgid ""
 "\"git push -u\" to set the upstream config as you push."
 msgstr ""
 
-#: branch.c:264
+#: branch.c:260
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr ""
 
-#: branch.c:284
+#: branch.c:280
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr ""
 
-#: branch.c:289
+#: branch.c:285
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr ""
 
-#: branch.c:295
+#: branch.c:291
 msgid "Failed to lock ref for update"
 msgstr ""
 
-#: branch.c:313
+#: branch.c:309
 msgid "Failed to write ref"
 msgstr ""
 
-#: bundle.c:37
+#: bundle.c:33
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
 msgstr ""
 
-#: bundle.c:64
+#: bundle.c:60
 #, c-format
 msgid "unrecognized header: %s%s (%d)"
 msgstr ""
 
-#: bundle.c:90 builtin/commit.c:706
+#: bundle.c:86 builtin/commit.c:706
 #, c-format
 msgid "could not open '%s'"
 msgstr ""
 
-#: bundle.c:141
+#: bundle.c:138
 msgid "Repository lacks these prerequisite commits:"
 msgstr ""
 
-#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332
+#: 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
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr ""
 
-#: bundle.c:187
+#: bundle.c:184
 #, c-format
 msgid "The bundle contains this ref:"
 msgid_plural "The bundle contains these %d refs:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: bundle.c:194
+#: bundle.c:191
 msgid "The bundle records a complete history."
 msgstr ""
 
-#: bundle.c:196
+#: bundle.c:193
 #, c-format
 msgid "The bundle requires this ref:"
 msgid_plural "The bundle requires these %d refs:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: bundle.c:296
+#: bundle.c:293
 msgid "rev-list died"
 msgstr ""
 
-#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr ""
 
-#: bundle.c:337
+#: bundle.c:334
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr ""
 
-#: bundle.c:382
+#: bundle.c:379
 msgid "Refusing to create empty bundle."
 msgstr ""
 
-#: bundle.c:398
+#: bundle.c:395
 msgid "Could not spawn pack-objects"
 msgstr ""
 
-#: bundle.c:416
+#: bundle.c:413
 msgid "pack-objects died"
 msgstr ""
 
-#: bundle.c:419
+#: bundle.c:416
 #, c-format
 msgid "cannot create '%s'"
 msgstr ""
 
-#: bundle.c:441
+#: bundle.c:438
 msgid "index-pack died"
 msgstr ""
 
-#: commit.c:53
+#: commit.c:54
 #, c-format
 msgid "could not parse %s"
 msgstr ""
 
-#: commit.c:55
+#: commit.c:56
 #, c-format
 msgid "%s %s is not a commit!"
 msgstr ""
@@ -404,6 +395,7 @@ msgid_plural "%lu years"
 msgstr[0] ""
 msgstr[1] ""
 
+#. TRANSLATORS: "%s" is "<n> years"
 #: date.c:149
 #, c-format
 msgid "%s, %lu month ago"
@@ -423,6 +415,10 @@ msgstr[1] ""
 msgid "failed to read orderfile '%s'"
 msgstr ""
 
+#: diffcore-rename.c:517
+msgid "Performing inexact rename detection"
+msgstr ""
+
 #: diff.c:113
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
@@ -445,14 +441,14 @@ msgid ""
 "%s"
 msgstr ""
 
-#: diff.c:3509
+#: diff.c:3495
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
 "%s"
 msgstr ""
 
-#: diff.c:3523
+#: diff.c:3509
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr ""
@@ -479,63 +475,63 @@ msgstr ""
 msgid "failed writing detached signature to '%s': %s"
 msgstr ""
 
-#: grep.c:1695
+#: grep.c:1698
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr ""
 
-#: grep.c:1712
+#: grep.c:1715
 #, c-format
 msgid "'%s': %s"
 msgstr ""
 
-#: grep.c:1723
+#: grep.c:1726
 #, c-format
 msgid "'%s': short read %s"
 msgstr ""
 
-#: help.c:210
+#: help.c:209
 #, c-format
 msgid "available git commands in '%s'"
 msgstr ""
 
-#: help.c:217
+#: help.c:216
 msgid "git commands available from elsewhere on your $PATH"
 msgstr ""
 
-#: help.c:233
+#: help.c:232
 msgid "The most commonly used git commands are:"
 msgstr ""
 
-#: help.c:290
+#: 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 ""
 
-#: help.c:347
+#: help.c:346
 msgid "Uh oh. Your system reports no Git commands at all."
 msgstr ""
 
-#: help.c:369
+#: 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 ""
 
-#: help.c:374
+#: help.c:373
 #, c-format
 msgid "in %0.1f seconds automatically..."
 msgstr ""
 
-#: help.c:381
+#: help.c:380
 #, c-format
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr ""
 
-#: help.c:385 help.c:444
+#: help.c:384 help.c:443
 msgid ""
 "\n"
 "Did you mean this?"
@@ -545,7 +541,7 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: help.c:440
+#: help.c:439
 #, c-format
 msgid "%s: %s - %s"
 msgstr ""
@@ -554,7 +550,7 @@ msgstr ""
 msgid "failed to read the cache"
 msgstr ""
 
-#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559
+#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
 #: builtin/clone.c:661
 msgid "unable to write new index file"
 msgstr ""
@@ -564,244 +560,242 @@ msgstr ""
 msgid "(bad commit)\n"
 msgstr ""
 
-#: merge-recursive.c:206
+#: merge-recursive.c:208
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr ""
 
-#: merge-recursive.c:269
+#: merge-recursive.c:271
 msgid "error building trees"
 msgstr ""
 
-#: merge-recursive.c:673
+#: merge-recursive.c:675
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr ""
 
-#: merge-recursive.c:684
+#: merge-recursive.c:686
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr ""
 
-#. something else exists
-#. .. but not some other error (who really cares what?)
-#: merge-recursive.c:698 merge-recursive.c:719
+#: merge-recursive.c:700 merge-recursive.c:721
 msgid ": perhaps a D/F conflict?"
 msgstr ""
 
-#: merge-recursive.c:709
+#: merge-recursive.c:711
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr ""
 
-#: merge-recursive.c:749
+#: merge-recursive.c:751
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr ""
 
-#: merge-recursive.c:751
+#: merge-recursive.c:753
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr ""
 
-#: merge-recursive.c:774 builtin/clone.c:317
+#: merge-recursive.c:776 builtin/clone.c:317
 #, c-format
 msgid "failed to open '%s'"
 msgstr ""
 
-#: merge-recursive.c:782
+#: merge-recursive.c:784
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr ""
 
-#: merge-recursive.c:785
+#: merge-recursive.c:787
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr ""
 
-#: merge-recursive.c:923
+#: merge-recursive.c:925
 msgid "Failed to execute internal merge"
 msgstr ""
 
-#: merge-recursive.c:927
+#: merge-recursive.c:929
 #, c-format
 msgid "Unable to add %s to database"
 msgstr ""
 
-#: merge-recursive.c:943
+#: merge-recursive.c:945
 msgid "unsupported object type in the tree"
 msgstr ""
 
-#: merge-recursive.c:1022 merge-recursive.c:1036
+#: merge-recursive.c:1024 merge-recursive.c:1038
 #, 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:1028 merge-recursive.c:1041
+#: merge-recursive.c:1030 merge-recursive.c:1043
 #, 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:1082
+#: merge-recursive.c:1084
 msgid "rename"
 msgstr ""
 
-#: merge-recursive.c:1082 wt-status.c:283
+#: merge-recursive.c:1084
 msgid "renamed"
 msgstr ""
 
-#: merge-recursive.c:1138
+#: merge-recursive.c:1140
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr ""
 
-#: merge-recursive.c:1160
+#: merge-recursive.c:1162
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
 "\"->\"%s\" in \"%s\"%s"
 msgstr ""
 
-#: merge-recursive.c:1165
+#: merge-recursive.c:1167
 msgid " (left unresolved)"
 msgstr ""
 
-#: merge-recursive.c:1219
+#: merge-recursive.c:1221
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 
-#: merge-recursive.c:1249
+#: merge-recursive.c:1251
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr ""
 
-#: merge-recursive.c:1448
+#: merge-recursive.c:1450
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 
-#: merge-recursive.c:1458
+#: merge-recursive.c:1460
 #, c-format
 msgid "Adding merged %s"
 msgstr ""
 
-#: merge-recursive.c:1463 merge-recursive.c:1661
+#: merge-recursive.c:1465 merge-recursive.c:1663
 #, c-format
 msgid "Adding as %s instead"
 msgstr ""
 
-#: merge-recursive.c:1514
+#: merge-recursive.c:1516
 #, c-format
 msgid "cannot read object %s"
 msgstr ""
 
-#: merge-recursive.c:1517
+#: merge-recursive.c:1519
 #, c-format
 msgid "object %s is not a blob"
 msgstr ""
 
-#: merge-recursive.c:1565
+#: merge-recursive.c:1567
 msgid "modify"
 msgstr ""
 
-#: merge-recursive.c:1565 wt-status.c:281
+#: merge-recursive.c:1567
 msgid "modified"
 msgstr ""
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1577
 msgid "content"
 msgstr ""
 
-#: merge-recursive.c:1582
+#: merge-recursive.c:1584
 msgid "add/add"
 msgstr ""
 
-#: merge-recursive.c:1616
+#: merge-recursive.c:1618
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr ""
 
-#: merge-recursive.c:1630
+#: merge-recursive.c:1632
 #, c-format
 msgid "Auto-merging %s"
 msgstr ""
 
-#: merge-recursive.c:1634 git-submodule.sh:1148
+#: merge-recursive.c:1636 git-submodule.sh:1149
 msgid "submodule"
 msgstr ""
 
-#: merge-recursive.c:1635
+#: merge-recursive.c:1637
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr ""
 
-#: merge-recursive.c:1725
+#: merge-recursive.c:1727
 #, c-format
 msgid "Removing %s"
 msgstr ""
 
-#: merge-recursive.c:1750
+#: merge-recursive.c:1752
 msgid "file/directory"
 msgstr ""
 
-#: merge-recursive.c:1756
+#: merge-recursive.c:1758
 msgid "directory/file"
 msgstr ""
 
-#: merge-recursive.c:1761
+#: merge-recursive.c:1763
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 
-#: merge-recursive.c:1771
+#: merge-recursive.c:1773
 #, c-format
 msgid "Adding %s"
 msgstr ""
 
-#: merge-recursive.c:1788
+#: merge-recursive.c:1790
 msgid "Fatal merge failure, shouldn't happen."
 msgstr ""
 
-#: merge-recursive.c:1807
+#: merge-recursive.c:1809
 msgid "Already up-to-date!"
 msgstr ""
 
-#: merge-recursive.c:1816
+#: merge-recursive.c:1818
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr ""
 
-#: merge-recursive.c:1846
+#: merge-recursive.c:1848
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr ""
 
-#: merge-recursive.c:1891
+#: merge-recursive.c:1893
 msgid "Merging:"
 msgstr ""
 
-#: merge-recursive.c:1904
+#: merge-recursive.c:1906
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: merge-recursive.c:1941
+#: merge-recursive.c:1943
 msgid "merge returned no commit"
 msgstr ""
 
-#: merge-recursive.c:1998
+#: merge-recursive.c:2000
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr ""
 
-#: merge-recursive.c:2010 builtin/merge.c:665
+#: merge-recursive.c:2012 builtin/merge.c:668
 msgid "Unable to write index."
 msgstr ""
 
@@ -826,33 +820,33 @@ msgstr ""
 msgid "Bad %s value: '%s'"
 msgstr ""
 
-#: object.c:202
+#: object.c:229
 #, c-format
 msgid "unable to parse object: %s"
 msgstr ""
 
-#: parse-options.c:537
+#: parse-options.c:532
 msgid "..."
 msgstr ""
 
-#: parse-options.c:555
+#: parse-options.c:550
 #, c-format
 msgid "usage: %s"
 msgstr ""
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:559
+#: parse-options.c:554
 #, c-format
 msgid "   or: %s"
 msgstr ""
 
-#: parse-options.c:562
+#: parse-options.c:557
 #, c-format
 msgid "    %s"
 msgstr ""
 
-#: parse-options.c:596
+#: parse-options.c:591
 msgid "-NUM"
 msgstr ""
 
@@ -900,11 +894,6 @@ msgstr ""
 msgid "Pathspec '%s' is in submodule '%.*s'"
 msgstr ""
 
-#.
-#. * We may want to substitute "this command" with a command
-#. * name. E.g. when add--interactive dies when running
-#. * "checkout -p"
-#.
 #: pathspec.c:353
 #, c-format
 msgid "%s: pathspec magic not supported by this command: %s"
@@ -921,56 +910,69 @@ msgid ""
 "Perhaps you forgot to add either ':/' or '.' ?"
 msgstr ""
 
-#: remote.c:753
+#: progress.c:224
+msgid "done"
+msgstr ""
+
+#: read-cache.c:1238
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+
+#: read-cache.c:1248
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+
+#: remote.c:758
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr ""
 
-#: remote.c:757
+#: remote.c:762
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr ""
 
-#: remote.c:761
+#: remote.c:766
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr ""
 
-#.
-#. * This last possibility doesn't occur because
-#. * FETCH_HEAD_IGNORE entries always appear at
-#. * the end of the list.
-#.
-#: remote.c:769
+#: remote.c:774
 msgid "Internal error"
 msgstr ""
 
-#: remote.c:1871
+#: remote.c:1948
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr ""
 
-#: remote.c:1875
+#: remote.c:1952
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr ""
 
-#: remote.c:1878
+#: remote.c:1955
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr ""
 
-#: remote.c:1882
+#: remote.c:1959
 #, 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:1888
+#: remote.c:1965
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr ""
 
-#: remote.c:1891
+#: remote.c:1968
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -978,11 +980,11 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: remote.c:1899
+#: remote.c:1976
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr ""
 
-#: remote.c:1902
+#: remote.c:1979
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -993,7 +995,7 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: remote.c:1912
+#: remote.c:1989
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr ""
 
@@ -1006,14 +1008,14 @@ msgstr ""
 msgid "dup2(%d,%d) failed"
 msgstr ""
 
-#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896
-#: builtin/merge.c:1006 builtin/merge.c:1016
+#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
+#: builtin/merge.c:1009 builtin/merge.c:1019
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr ""
 
-#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786
-#: builtin/merge.c:1008 builtin/merge.c:1021
+#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
+#: builtin/merge.c:1011 builtin/merge.c:1024
 #, c-format
 msgid "Could not write to '%s'"
 msgstr ""
@@ -1031,7 +1033,7 @@ msgid ""
 "and commit the result with 'git commit'"
 msgstr ""
 
-#: sequencer.c:245 sequencer.c:870 sequencer.c:953
+#: sequencer.c:245 sequencer.c:879 sequencer.c:962
 #, c-format
 msgid "Could not write to %s"
 msgstr ""
@@ -1067,184 +1069,184 @@ msgstr ""
 msgid "Unable to update cache tree\n"
 msgstr ""
 
-#: sequencer.c:423
+#: sequencer.c:430
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr ""
 
-#: sequencer.c:428
+#: sequencer.c:435
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr ""
 
-#: sequencer.c:494
+#: sequencer.c:501
 msgid "Your index file is unmerged."
 msgstr ""
 
-#: sequencer.c:513
+#: sequencer.c:520
 #, c-format
 msgid "Commit %s is a merge but no -m option was given."
 msgstr ""
 
-#: sequencer.c:521
+#: sequencer.c:528
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr ""
 
-#: sequencer.c:525
+#: sequencer.c:532
 #, 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:538
+#: sequencer.c:545
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr ""
 
-#: sequencer.c:542
+#: sequencer.c:549
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr ""
 
-#: sequencer.c:628
+#: sequencer.c:635
 #, c-format
 msgid "could not revert %s... %s"
 msgstr ""
 
-#: sequencer.c:629
+#: sequencer.c:636
 #, c-format
 msgid "could not apply %s... %s"
 msgstr ""
 
-#: sequencer.c:665
+#: sequencer.c:672
 msgid "empty commit set passed"
 msgstr ""
 
-#: sequencer.c:673
+#: sequencer.c:680
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr ""
 
-#: sequencer.c:678
+#: sequencer.c:685
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr ""
 
-#: sequencer.c:736
+#: sequencer.c:743
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr ""
 
-#: sequencer.c:758
+#: sequencer.c:765
 #, c-format
 msgid "Could not parse line %d."
 msgstr ""
 
-#: sequencer.c:763
+#: sequencer.c:770
 msgid "No commits parsed."
 msgstr ""
 
-#: sequencer.c:776
+#: sequencer.c:783
 #, c-format
 msgid "Could not open %s"
 msgstr ""
 
-#: sequencer.c:780
+#: sequencer.c:787
 #, c-format
 msgid "Could not read %s."
 msgstr ""
 
-#: sequencer.c:787
+#: sequencer.c:794
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr ""
 
-#: sequencer.c:815
+#: sequencer.c:824
 #, c-format
 msgid "Invalid key: %s"
 msgstr ""
 
-#: sequencer.c:818
+#: sequencer.c:827
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr ""
 
-#: sequencer.c:830
+#: sequencer.c:839
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr ""
 
-#: sequencer.c:851
+#: sequencer.c:860
 msgid "a cherry-pick or revert is already in progress"
 msgstr ""
 
-#: sequencer.c:852
+#: sequencer.c:861
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr ""
 
-#: sequencer.c:856
+#: sequencer.c:865
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr ""
 
-#: sequencer.c:872 sequencer.c:957
+#: sequencer.c:881 sequencer.c:966
 #, c-format
 msgid "Error wrapping up %s."
 msgstr ""
 
-#: sequencer.c:891 sequencer.c:1025
+#: sequencer.c:900 sequencer.c:1036
 msgid "no cherry-pick or revert in progress"
 msgstr ""
 
-#: sequencer.c:893
+#: sequencer.c:902
 msgid "cannot resolve HEAD"
 msgstr ""
 
-#: sequencer.c:895
+#: sequencer.c:904
 msgid "cannot abort from a branch yet to be born"
 msgstr ""
 
-#: sequencer.c:917 builtin/apply.c:4061
+#: sequencer.c:926 builtin/apply.c:4061
 #, c-format
 msgid "cannot open %s: %s"
 msgstr ""
 
-#: sequencer.c:920
+#: sequencer.c:929
 #, c-format
 msgid "cannot read %s: %s"
 msgstr ""
 
-#: sequencer.c:921
+#: sequencer.c:930
 msgid "unexpected end of file"
 msgstr ""
 
-#: sequencer.c:927
+#: sequencer.c:936
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr ""
 
-#: sequencer.c:950
+#: sequencer.c:959
 #, c-format
 msgid "Could not format %s."
 msgstr ""
 
-#: sequencer.c:1093
+#: sequencer.c:1104
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr ""
 
-#: sequencer.c:1096
+#: sequencer.c:1107
 #, c-format
 msgid "%s: bad revision"
 msgstr ""
 
-#: sequencer.c:1130
+#: sequencer.c:1141
 msgid "Can't revert as initial commit"
 msgstr ""
 
-#: sequencer.c:1131
+#: sequencer.c:1142
 msgid "Can't cherry-pick into empty head"
 msgstr ""
 
@@ -1261,21 +1263,21 @@ msgid ""
 "running \"git config advice.objectNameWarning false\""
 msgstr ""
 
-#: sha1_name.c:1070
+#: sha1_name.c:1072
 msgid "HEAD does not point to a branch"
 msgstr ""
 
-#: sha1_name.c:1073
+#: sha1_name.c:1075
 #, c-format
 msgid "No such branch: '%s'"
 msgstr ""
 
-#: sha1_name.c:1075
+#: sha1_name.c:1077
 #, c-format
 msgid "No upstream configured for branch '%s'"
 msgstr ""
 
-#: sha1_name.c:1079
+#: sha1_name.c:1081
 #, c-format
 msgid "Upstream branch '%s' not stored as a remote-tracking branch"
 msgstr ""
@@ -1289,52 +1291,34 @@ msgstr ""
 msgid "Could not find section in .gitmodules where path=%s"
 msgstr ""
 
-#. Maybe the user already did that, don't error out here
 #: submodule.c:76
 #, c-format
 msgid "Could not update .gitmodules entry %s"
 msgstr ""
 
-#. Maybe the user already did that, don't error out here
 #: submodule.c:109
 #, c-format
 msgid "Could not remove .gitmodules entry for %s"
 msgstr ""
 
-#: submodule.c:127
-msgid "could not find .gitmodules in index"
-msgstr ""
-
-#: submodule.c:133
-msgid "reading updated .gitmodules failed"
-msgstr ""
-
-#: submodule.c:135
-msgid "unable to stat updated .gitmodules"
-msgstr ""
-
-#: submodule.c:139
-msgid "unable to remove .gitmodules from index"
-msgstr ""
-
-#: submodule.c:141
-msgid "adding updated .gitmodules failed"
-msgstr ""
-
-#: submodule.c:143
+#: submodule.c:120
 msgid "staging updated .gitmodules failed"
 msgstr ""
 
-#: submodule.c:1144 builtin/init-db.c:363
+#: submodule.c:1121 builtin/init-db.c:363
 #, c-format
 msgid "Could not create git link %s"
 msgstr ""
 
-#: submodule.c:1155
+#: submodule.c:1132
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr ""
 
+#: unpack-trees.c:206
+msgid "Checking out files"
+msgstr ""
+
 #: urlmatch.c:120
 msgid "invalid URL scheme name or missing '://' suffix"
 msgstr ""
@@ -1438,266 +1422,275 @@ msgstr ""
 msgid "  (use \"git %s <file>...\" to include in what will be committed)"
 msgstr ""
 
-#: wt-status.c:254
-msgid "bug"
-msgstr ""
-
-#: wt-status.c:259
+#: wt-status.c:252
 msgid "both deleted:"
 msgstr ""
 
-#: wt-status.c:260
+#: wt-status.c:254
 msgid "added by us:"
 msgstr ""
 
-#: wt-status.c:261
+#: wt-status.c:256
 msgid "deleted by them:"
 msgstr ""
 
-#: wt-status.c:262
+#: wt-status.c:258
 msgid "added by them:"
 msgstr ""
 
-#: wt-status.c:263
+#: wt-status.c:260
 msgid "deleted by us:"
 msgstr ""
 
-#: wt-status.c:264
+#: wt-status.c:262
 msgid "both added:"
 msgstr ""
 
-#: wt-status.c:265
+#: wt-status.c:264
 msgid "both modified:"
 msgstr ""
 
-#: wt-status.c:275
-msgid "new file"
+#: wt-status.c:266
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr ""
+
+#: wt-status.c:274
+msgid "new file:"
+msgstr ""
+
+#: wt-status.c:276
+msgid "copied:"
+msgstr ""
+
+#: wt-status.c:278
+msgid "deleted:"
 msgstr ""
 
-#: wt-status.c:277
-msgid "copied"
+#: wt-status.c:280
+msgid "modified:"
 msgstr ""
 
-#: wt-status.c:279
-msgid "deleted"
+#: wt-status.c:282
+msgid "renamed:"
 msgstr ""
 
-#: wt-status.c:285
-msgid "typechange"
+#: wt-status.c:284
+msgid "typechange:"
 msgstr ""
 
-#: wt-status.c:287
-msgid "unknown"
+#: wt-status.c:286
+msgid "unknown:"
 msgstr ""
 
-#: wt-status.c:289
-msgid "unmerged"
+#: wt-status.c:288
+msgid "unmerged:"
 msgstr ""
 
-#: wt-status.c:336
+#: wt-status.c:370
 msgid "new commits, "
 msgstr ""
 
-#: wt-status.c:338
+#: wt-status.c:372
 msgid "modified content, "
 msgstr ""
 
-#: wt-status.c:340
+#: wt-status.c:374
 msgid "untracked content, "
 msgstr ""
 
-#: wt-status.c:357
+#: wt-status.c:391
 #, c-format
 msgid "bug: unhandled diff status %c"
 msgstr ""
 
-#: wt-status.c:732
+#: wt-status.c:765
 msgid "Submodules changed but not updated:"
 msgstr ""
 
-#: wt-status.c:734
+#: wt-status.c:767
 msgid "Submodule changes to be committed:"
 msgstr ""
 
-#: wt-status.c:836
+#: wt-status.c:846
 msgid ""
 "Do not touch the line above.\n"
 "Everything below will be removed."
 msgstr ""
 
-#: wt-status.c:899
+#: wt-status.c:937
 msgid "You have unmerged paths."
 msgstr ""
 
-#: wt-status.c:902
+#: wt-status.c:940
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr ""
 
-#: wt-status.c:905
+#: wt-status.c:943
 msgid "All conflicts fixed but you are still merging."
 msgstr ""
 
-#: wt-status.c:908
+#: wt-status.c:946
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr ""
 
-#: wt-status.c:918
+#: wt-status.c:956
 msgid "You are in the middle of an am session."
 msgstr ""
 
-#: wt-status.c:921
+#: wt-status.c:959
 msgid "The current patch is empty."
 msgstr ""
 
-#: wt-status.c:925
+#: wt-status.c:963
 msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr ""
 
-#: wt-status.c:927
+#: wt-status.c:965
 msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr ""
 
-#: wt-status.c:929
+#: wt-status.c:967
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr ""
 
-#: wt-status.c:989 wt-status.c:1006
+#: wt-status.c:1027 wt-status.c:1044
 #, c-format
 msgid "You are currently rebasing branch '%s' on '%s'."
 msgstr ""
 
-#: wt-status.c:994 wt-status.c:1011
+#: wt-status.c:1032 wt-status.c:1049
 msgid "You are currently rebasing."
 msgstr ""
 
-#: wt-status.c:997
+#: wt-status.c:1035
 msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr ""
 
-#: wt-status.c:999
+#: wt-status.c:1037
 msgid "  (use \"git rebase --skip\" to skip this patch)"
 msgstr ""
 
-#: wt-status.c:1001
+#: wt-status.c:1039
 msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr ""
 
-#: wt-status.c:1014
+#: wt-status.c:1052
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr ""
 
-#: wt-status.c:1018
+#: wt-status.c:1056
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
 msgstr ""
 
-#: wt-status.c:1023
+#: wt-status.c:1061
 msgid "You are currently splitting a commit during a rebase."
 msgstr ""
 
-#: wt-status.c:1026
+#: wt-status.c:1064
 msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr ""
 
-#: wt-status.c:1030
+#: wt-status.c:1068
 #, c-format
 msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr ""
 
-#: wt-status.c:1035
+#: wt-status.c:1073
 msgid "You are currently editing a commit during a rebase."
 msgstr ""
 
-#: wt-status.c:1038
+#: wt-status.c:1076
 msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr ""
 
-#: wt-status.c:1040
+#: wt-status.c:1078
 msgid ""
 "  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr ""
 
-#: wt-status.c:1050
+#: wt-status.c:1088
 #, c-format
 msgid "You are currently cherry-picking commit %s."
 msgstr ""
 
-#: wt-status.c:1055
+#: wt-status.c:1093
 msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
 msgstr ""
 
-#: wt-status.c:1058
+#: wt-status.c:1096
 msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr ""
 
-#: wt-status.c:1060
+#: wt-status.c:1098
 msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr ""
 
-#: wt-status.c:1069
+#: wt-status.c:1107
 #, c-format
 msgid "You are currently reverting commit %s."
 msgstr ""
 
-#: wt-status.c:1074
+#: wt-status.c:1112
 msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr ""
 
-#: wt-status.c:1077
+#: wt-status.c:1115
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr ""
 
-#: wt-status.c:1079
+#: wt-status.c:1117
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr ""
 
-#: wt-status.c:1090
+#: wt-status.c:1128
 #, c-format
 msgid "You are currently bisecting, started from branch '%s'."
 msgstr ""
 
-#: wt-status.c:1094
+#: wt-status.c:1132
 msgid "You are currently bisecting."
 msgstr ""
 
-#: wt-status.c:1097
+#: wt-status.c:1135
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr ""
 
-#: wt-status.c:1272
+#: wt-status.c:1310
 msgid "On branch "
 msgstr ""
 
-#: wt-status.c:1279
+#: wt-status.c:1317
 msgid "rebase in progress; onto "
 msgstr ""
 
-#: wt-status.c:1286
+#: wt-status.c:1324
 msgid "HEAD detached at "
 msgstr ""
 
-#: wt-status.c:1288
+#: wt-status.c:1326
 msgid "HEAD detached from "
 msgstr ""
 
-#: wt-status.c:1291
+#: wt-status.c:1329
 msgid "Not currently on any branch."
 msgstr ""
 
-#: wt-status.c:1308
+#: wt-status.c:1346
 msgid "Initial commit"
 msgstr ""
 
-#: wt-status.c:1322
+#: wt-status.c:1360
 msgid "Untracked files"
 msgstr ""
 
-#: wt-status.c:1324
+#: wt-status.c:1362
 msgid "Ignored files"
 msgstr ""
 
-#: wt-status.c:1328
+#: wt-status.c:1366
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1705,283 +1698,228 @@ msgid ""
 "new files yourself (see 'git help status')."
 msgstr ""
 
-#: wt-status.c:1334
+#: wt-status.c:1372
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr ""
 
-#: wt-status.c:1336
+#: wt-status.c:1374
 msgid " (use -u option to show untracked files)"
 msgstr ""
 
-#: wt-status.c:1342
+#: wt-status.c:1380
 msgid "No changes"
 msgstr ""
 
-#: wt-status.c:1347
+#: wt-status.c:1385
 #, c-format
 msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr ""
 
-#: wt-status.c:1350
+#: wt-status.c:1388
 #, c-format
 msgid "no changes added to commit\n"
 msgstr ""
 
-#: wt-status.c:1353
+#: wt-status.c:1391
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
 "track)\n"
 msgstr ""
 
-#: wt-status.c:1356
+#: wt-status.c:1394
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
 msgstr ""
 
-#: wt-status.c:1359
+#: wt-status.c:1397
 #, c-format
 msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
 
-#: wt-status.c:1362 wt-status.c:1367
+#: wt-status.c:1400 wt-status.c:1405
 #, c-format
 msgid "nothing to commit\n"
 msgstr ""
 
-#: wt-status.c:1365
+#: wt-status.c:1403
 #, c-format
 msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
 
-#: wt-status.c:1369
+#: wt-status.c:1407
 #, c-format
 msgid "nothing to commit, working directory clean\n"
 msgstr ""
 
-#: wt-status.c:1478
+#: wt-status.c:1516
 msgid "HEAD (no branch)"
 msgstr ""
 
-#: wt-status.c:1484
+#: wt-status.c:1522
 msgid "Initial commit on "
 msgstr ""
 
-#: wt-status.c:1514
+#: wt-status.c:1554
 msgid "gone"
 msgstr ""
 
-#: wt-status.c:1516
+#: wt-status.c:1556 wt-status.c:1564
 msgid "behind "
 msgstr ""
 
-#: wt-status.c:1519 wt-status.c:1522
-msgid "ahead "
-msgstr ""
-
-#: wt-status.c:1524
-msgid ", behind "
-msgstr ""
-
 #: compat/precompose_utf8.c:55 builtin/clone.c:356
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr ""
 
-#: builtin/add.c:20
+#: builtin/add.c:21
 msgid "git add [options] [--] <pathspec>..."
 msgstr ""
 
-#.
-#. * To be consistent with "git add -p" and most Git
-#. * commands, we should default to being tree-wide, but
-#. * this is not the original behavior and can't be
-#. * changed until users trained themselves not to type
-#. * "git add -u" or "git add -A". For now, we warn and
-#. * keep the old behavior. Later, the behavior can be changed
-#. * to tree-wide, keeping the warning for a while, and
-#. * eventually we can drop the warning.
-#.
-#: builtin/add.c:58
-#, c-format
-msgid ""
-"The behavior of 'git add %s (or %s)' with no path argument from a\n"
-"subdirectory of the tree will change in Git 2.0 and should not be used "
-"anymore.\n"
-"To add content for the whole tree, run:\n"
-"\n"
-"  git add %s :/\n"
-"  (or git add %s :/)\n"
-"\n"
-"To restrict the command to the current directory, run:\n"
-"\n"
-"  git add %s .\n"
-"  (or git add %s .)\n"
-"\n"
-"With the current Git version, the command is restricted to the current "
-"directory.\n"
-msgstr ""
-
-#: builtin/add.c:100
-#, c-format
-msgid ""
-"You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
-"whose behaviour will change in Git 2.0 with respect to paths you removed.\n"
-"Paths like '%s' that are\n"
-"removed from your working tree are ignored with this version of Git.\n"
-"\n"
-"* 'git add --ignore-removal <pathspec>', which is the current default,\n"
-"  ignores paths you removed from your working tree.\n"
-"\n"
-"* 'git add --all <pathspec>' will let you also record the removals.\n"
-"\n"
-"Run 'git status' to check the paths you removed from your working tree.\n"
-msgstr ""
-
-#: builtin/add.c:144
+#: builtin/add.c:64
 #, c-format
 msgid "unexpected diff status %c"
 msgstr ""
 
-#: builtin/add.c:149 builtin/commit.c:260
+#: builtin/add.c:69 builtin/commit.c:261
 msgid "updating files failed"
 msgstr ""
 
-#: builtin/add.c:163
+#: builtin/add.c:79
 #, c-format
 msgid "remove '%s'\n"
 msgstr ""
 
-#: builtin/add.c:237
+#: builtin/add.c:133
 msgid "Unstaged changes after refreshing the index:"
 msgstr ""
 
-#: builtin/add.c:299
+#: builtin/add.c:193
 msgid "Could not read the index"
 msgstr ""
 
-#: builtin/add.c:310
+#: builtin/add.c:204
 #, c-format
 msgid "Could not open '%s' for writing."
 msgstr ""
 
-#: builtin/add.c:314
+#: builtin/add.c:208
 msgid "Could not write patch"
 msgstr ""
 
-#: builtin/add.c:319
+#: builtin/add.c:213
 #, c-format
 msgid "Could not stat '%s'"
 msgstr ""
 
-#: builtin/add.c:321
+#: builtin/add.c:215
 msgid "Empty patch. Aborted."
 msgstr ""
 
-#: builtin/add.c:327
+#: builtin/add.c:221
 #, c-format
 msgid "Could not apply '%s'"
 msgstr ""
 
-#: builtin/add.c:337
+#: builtin/add.c:231
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr ""
 
-#: builtin/add.c:354 builtin/clean.c:875 builtin/fetch.c:93 builtin/mv.c:70
-#: builtin/prune-packed.c:77 builtin/push.c:506 builtin/remote.c:1344
+#: 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/rm.c:269
 msgid "dry run"
 msgstr ""
 
-#: builtin/add.c:355 builtin/apply.c:4410 builtin/check-ignore.c:19
-#: builtin/commit.c:1249 builtin/count-objects.c:95 builtin/fsck.c:612
+#: 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
 msgid "be verbose"
 msgstr ""
 
-#: builtin/add.c:357
+#: builtin/add.c:251
 msgid "interactive picking"
 msgstr ""
 
-#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
 msgid "select hunks interactively"
 msgstr ""
 
-#: builtin/add.c:359
+#: builtin/add.c:253
 msgid "edit current diff and apply"
 msgstr ""
 
-#: builtin/add.c:360
+#: builtin/add.c:254
 msgid "allow adding otherwise ignored files"
 msgstr ""
 
-#: builtin/add.c:361
+#: builtin/add.c:255
 msgid "update tracked files"
 msgstr ""
 
-#: builtin/add.c:362
+#: builtin/add.c:256
 msgid "record only the fact that the path will be added later"
 msgstr ""
 
-#: builtin/add.c:363
+#: builtin/add.c:257
 msgid "add changes from all tracked and untracked files"
 msgstr ""
 
-#. takes no arguments
-#: builtin/add.c:366
+#: builtin/add.c:260
 msgid "ignore paths removed in the working tree (same as --no-all)"
 msgstr ""
 
-#: builtin/add.c:368
+#: builtin/add.c:262
 msgid "don't add, only refresh the index"
 msgstr ""
 
-#: builtin/add.c:369
+#: builtin/add.c:263
 msgid "just skip files which cannot be added because of errors"
 msgstr ""
 
-#: builtin/add.c:370
+#: builtin/add.c:264
 msgid "check if - even missing - files are ignored in dry run"
 msgstr ""
 
-#: builtin/add.c:392
+#: builtin/add.c:286
 #, c-format
 msgid "Use -f if you really want to add them.\n"
 msgstr ""
 
-#: builtin/add.c:393
+#: builtin/add.c:287
 msgid "no files added"
 msgstr ""
 
-#: builtin/add.c:399
+#: builtin/add.c:293
 msgid "adding files failed"
 msgstr ""
 
-#: builtin/add.c:438
+#: builtin/add.c:330
 msgid "-A and -u are mutually incompatible"
 msgstr ""
 
-#: builtin/add.c:456
+#: builtin/add.c:337
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr ""
 
-#: builtin/add.c:486
+#: builtin/add.c:358
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr ""
 
-#: builtin/add.c:487
+#: builtin/add.c:359
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr ""
 
-#: builtin/add.c:492 builtin/check-ignore.c:172 builtin/clean.c:919
-#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:224 builtin/rm.c:299
+#: 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
 msgid "index file corrupt"
 msgstr ""
 
-#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432
+#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
 msgid "Unable to write new index file"
 msgstr ""
 
@@ -2088,7 +2026,6 @@ msgstr ""
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr ""
 
-#. there has to be one hunk (forward hunk)
 #: builtin/apply.c:1900
 #, c-format
 msgid "unrecognized binary patch at line %d"
@@ -2227,7 +2164,7 @@ msgstr ""
 msgid "Checking patch %s..."
 msgstr ""
 
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127
+#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr ""
@@ -2276,7 +2213,6 @@ msgstr ""
 msgid "internal error"
 msgstr ""
 
-#. Say this even without --verbose
 #: builtin/apply.c:4043
 #, c-format
 msgid "Applying patch %%s with %d reject..."
@@ -2368,7 +2304,7 @@ msgstr ""
 msgid "build a temporary index based on embedded index information"
 msgstr ""
 
-#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452
+#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
 msgid "paths are separated with NUL character"
 msgstr ""
 
@@ -2506,95 +2442,95 @@ msgstr ""
 msgid "[rev-opts] are documented in git-rev-list(1)"
 msgstr ""
 
-#: builtin/blame.c:2249
+#: builtin/blame.c:2242
 msgid "Show blame entries as we find them, incrementally"
 msgstr ""
 
-#: builtin/blame.c:2250
+#: builtin/blame.c:2243
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2251
+#: builtin/blame.c:2244
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2252
+#: builtin/blame.c:2245
 msgid "Show work cost statistics"
 msgstr ""
 
-#: builtin/blame.c:2253
+#: builtin/blame.c:2246
 msgid "Show output score for blame entries"
 msgstr ""
 
-#: builtin/blame.c:2254
+#: builtin/blame.c:2247
 msgid "Show original filename (Default: auto)"
 msgstr ""
 
-#: builtin/blame.c:2255
+#: builtin/blame.c:2248
 msgid "Show original linenumber (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2256
+#: builtin/blame.c:2249
 msgid "Show in a format designed for machine consumption"
 msgstr ""
 
-#: builtin/blame.c:2257
+#: builtin/blame.c:2250
 msgid "Show porcelain format with per-line commit information"
 msgstr ""
 
-#: builtin/blame.c:2258
+#: builtin/blame.c:2251
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2259
+#: builtin/blame.c:2252
 msgid "Show raw timestamp (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2260
+#: builtin/blame.c:2253
 msgid "Show long commit SHA1 (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2261
+#: builtin/blame.c:2254
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2262
+#: builtin/blame.c:2255
 msgid "Show author email instead of name (Default: off)"
 msgstr ""
 
-#: builtin/blame.c:2263
+#: builtin/blame.c:2256
 msgid "Ignore whitespace differences"
 msgstr ""
 
-#: builtin/blame.c:2264
+#: builtin/blame.c:2257
 msgid "Spend extra cycles to find better match"
 msgstr ""
 
-#: builtin/blame.c:2265
+#: builtin/blame.c:2258
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr ""
 
-#: builtin/blame.c:2266
+#: builtin/blame.c:2259
 msgid "Use <file>'s contents as the final image"
 msgstr ""
 
-#: builtin/blame.c:2267 builtin/blame.c:2268
+#: builtin/blame.c:2260 builtin/blame.c:2261
 msgid "score"
 msgstr ""
 
-#: builtin/blame.c:2267
+#: builtin/blame.c:2260
 msgid "Find line copies within and across files"
 msgstr ""
 
-#: builtin/blame.c:2268
+#: builtin/blame.c:2261
 msgid "Find line movements within and across files"
 msgstr ""
 
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
 msgid "n,m"
 msgstr ""
 
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
 msgid "Process only line range n,m, counting from 1"
 msgstr ""
 
@@ -2830,8 +2766,9 @@ 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:1460 builtin/commit.c:1461
-#: builtin/commit.c:1462 builtin/commit.c:1463 builtin/tag.c:468
+#: 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
 msgid "commit"
 msgstr ""
 
@@ -3008,43 +2945,43 @@ msgstr ""
 msgid "Need a repository to unbundle."
 msgstr ""
 
-#: builtin/cat-file.c:328
+#: builtin/cat-file.c:331
 msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
 msgstr ""
 
-#: builtin/cat-file.c:329
+#: builtin/cat-file.c:332
 msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
 msgstr ""
 
-#: builtin/cat-file.c:366
+#: builtin/cat-file.c:369
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr ""
 
-#: builtin/cat-file.c:367
+#: builtin/cat-file.c:370
 msgid "show object type"
 msgstr ""
 
-#: builtin/cat-file.c:368
+#: builtin/cat-file.c:371
 msgid "show object size"
 msgstr ""
 
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:373
 msgid "exit with zero when there's no error"
 msgstr ""
 
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:374
 msgid "pretty-print object's content"
 msgstr ""
 
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:376
 msgid "for blob objects, run textconv on object's content"
 msgstr ""
 
-#: builtin/cat-file.c:375
+#: builtin/cat-file.c:378
 msgid "show info and content of objects fed from the standard input"
 msgstr ""
 
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:381
 msgid "show info about objects fed from the standard input"
 msgstr ""
 
@@ -3072,7 +3009,7 @@ msgstr ""
 msgid "terminate input and output records by a NUL character"
 msgstr ""
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
 msgid "suppress progress reporting"
 msgstr ""
 
@@ -3223,60 +3160,59 @@ msgstr ""
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
 
-#: builtin/checkout.c:261 builtin/checkout.c:451
+#: builtin/checkout.c:261 builtin/checkout.c:450
 msgid "corrupt index file"
 msgstr ""
 
-#: builtin/checkout.c:322 builtin/checkout.c:329
+#: builtin/checkout.c:321 builtin/checkout.c:328
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr ""
 
-#: builtin/checkout.c:473
+#: builtin/checkout.c:472
 msgid "you need to resolve your current index first"
 msgstr ""
 
-#: builtin/checkout.c:594
+#: builtin/checkout.c:593
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:632
+#: builtin/checkout.c:631
 msgid "HEAD is now at"
 msgstr ""
 
-#: builtin/checkout.c:639
+#: builtin/checkout.c:638
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:642
+#: builtin/checkout.c:641
 #, c-format
 msgid "Already on '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:646
+#: builtin/checkout.c:645
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:648 builtin/checkout.c:1033
+#: builtin/checkout.c:647 builtin/checkout.c:1032
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:650
+#: builtin/checkout.c:649
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:706
+#: builtin/checkout.c:705
 #, c-format
 msgid " ... and %d more.\n"
 msgstr ""
 
-#. The singular version
-#: builtin/checkout.c:712
+#: builtin/checkout.c:711
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -3291,7 +3227,7 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/checkout.c:730
+#: builtin/checkout.c:729
 #, c-format
 msgid ""
 "If you want to keep them by creating a new branch, this may be a good time\n"
@@ -3301,152 +3237,151 @@ msgid ""
 "\n"
 msgstr ""
 
-#: builtin/checkout.c:760
+#: builtin/checkout.c:759
 msgid "internal error in revision walk"
 msgstr ""
 
-#: builtin/checkout.c:764
+#: builtin/checkout.c:763
 msgid "Previous HEAD position was"
 msgstr ""
 
-#: builtin/checkout.c:791 builtin/checkout.c:1028
+#: builtin/checkout.c:790 builtin/checkout.c:1027
 msgid "You are on a branch yet to be born"
 msgstr ""
 
-#: builtin/checkout.c:935
+#: builtin/checkout.c:934
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr ""
 
-#: builtin/checkout.c:974
+#: builtin/checkout.c:973
 #, c-format
 msgid "invalid reference: %s"
 msgstr ""
 
-#. case (1): want a tree
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr ""
 
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
 msgid "paths cannot be used with switching branches"
 msgstr ""
 
-#: builtin/checkout.c:1045 builtin/checkout.c:1049
+#: builtin/checkout.c:1044 builtin/checkout.c:1048
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr ""
 
-#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1052 builtin/checkout.c:1055 builtin/checkout.c:1060
+#: builtin/checkout.c:1063
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr ""
 
-#: builtin/checkout.c:1069
+#: builtin/checkout.c:1068
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr ""
 
-#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
 #: builtin/remote.c:159 builtin/remote.c:161
 msgid "branch"
 msgstr ""
 
-#: builtin/checkout.c:1092
+#: builtin/checkout.c:1091
 msgid "create and checkout a new branch"
 msgstr ""
 
-#: builtin/checkout.c:1094
+#: builtin/checkout.c:1093
 msgid "create/reset and checkout a branch"
 msgstr ""
 
-#: builtin/checkout.c:1095
+#: builtin/checkout.c:1094
 msgid "create reflog for new branch"
 msgstr ""
 
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
 msgid "detach the HEAD at named commit"
 msgstr ""
 
-#: builtin/checkout.c:1097
+#: builtin/checkout.c:1096
 msgid "set upstream info for new branch"
 msgstr ""
 
-#: builtin/checkout.c:1099
-msgid "new branch"
+#: builtin/checkout.c:1098
+msgid "new-branch"
 msgstr ""
 
-#: builtin/checkout.c:1099
+#: builtin/checkout.c:1098
 msgid "new unparented branch"
 msgstr ""
 
-#: builtin/checkout.c:1100
+#: builtin/checkout.c:1099
 msgid "checkout our version for unmerged files"
 msgstr ""
 
-#: builtin/checkout.c:1102
+#: builtin/checkout.c:1101
 msgid "checkout their version for unmerged files"
 msgstr ""
 
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1103
 msgid "force checkout (throw away local modifications)"
 msgstr ""
 
-#: builtin/checkout.c:1105
+#: builtin/checkout.c:1104
 msgid "perform a 3-way merge with the new branch"
 msgstr ""
 
-#: builtin/checkout.c:1106 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:225
 msgid "update ignored files (default)"
 msgstr ""
 
-#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248
+#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
 msgid "style"
 msgstr ""
 
-#: builtin/checkout.c:1108
+#: builtin/checkout.c:1107
 msgid "conflict style (merge or diff3)"
 msgstr ""
 
-#: builtin/checkout.c:1111
+#: builtin/checkout.c:1110
 msgid "do not limit pathspecs to sparse entries only"
 msgstr ""
 
-#: builtin/checkout.c:1113
+#: builtin/checkout.c:1112
 msgid "second guess 'git checkout no-such-branch'"
 msgstr ""
 
-#: builtin/checkout.c:1136
+#: builtin/checkout.c:1135
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr ""
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
 msgid "--track needs a branch name"
 msgstr ""
 
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1159
 msgid "Missing branch name; try -b"
 msgstr ""
 
-#: builtin/checkout.c:1197
+#: builtin/checkout.c:1196
 msgid "invalid path specification"
 msgstr ""
 
-#: builtin/checkout.c:1204
+#: builtin/checkout.c:1203
 #, 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:1209
+#: builtin/checkout.c:1208
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr ""
 
-#: builtin/checkout.c:1213
+#: builtin/checkout.c:1212
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -3482,7 +3417,7 @@ msgstr ""
 msgid "failed to remove %s"
 msgstr ""
 
-#: builtin/clean.c:294
+#: builtin/clean.c:295
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -3490,7 +3425,7 @@ msgid ""
 "           - (empty) select nothing"
 msgstr ""
 
-#: builtin/clean.c:298
+#: builtin/clean.c:299
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -3502,35 +3437,35 @@ msgid ""
 "           - (empty) finish selecting"
 msgstr ""
 
-#: builtin/clean.c:516
+#: builtin/clean.c:517
 #, c-format
 msgid "Huh (%s)?"
 msgstr ""
 
-#: builtin/clean.c:659
+#: builtin/clean.c:660
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr ""
 
-#: builtin/clean.c:696
+#: builtin/clean.c:697
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr ""
 
-#: builtin/clean.c:717
+#: builtin/clean.c:718
 msgid "Select items to delete"
 msgstr ""
 
-#: builtin/clean.c:757
+#: builtin/clean.c:758
 #, c-format
 msgid "remove %s? "
 msgstr ""
 
-#: builtin/clean.c:782
+#: builtin/clean.c:783
 msgid "Bye."
 msgstr ""
 
-#: builtin/clean.c:790
+#: builtin/clean.c:791
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -3541,70 +3476,70 @@ msgid ""
 "?                   - help for prompt selection"
 msgstr ""
 
-#: builtin/clean.c:817
+#: builtin/clean.c:818
 msgid "*** Commands ***"
 msgstr ""
 
-#: builtin/clean.c:818
+#: builtin/clean.c:819
 msgid "What now"
 msgstr ""
 
-#: builtin/clean.c:826
+#: builtin/clean.c:827
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/clean.c:843
+#: builtin/clean.c:844
 msgid "No more files to clean, exiting."
 msgstr ""
 
-#: builtin/clean.c:874
+#: builtin/clean.c:875
 msgid "do not print names of files removed"
 msgstr ""
 
-#: builtin/clean.c:876
+#: builtin/clean.c:877
 msgid "force"
 msgstr ""
 
-#: builtin/clean.c:877
+#: builtin/clean.c:878
 msgid "interactive cleaning"
 msgstr ""
 
-#: builtin/clean.c:879
+#: builtin/clean.c:880
 msgid "remove whole directories"
 msgstr ""
 
-#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:718
-#: builtin/ls-files.c:483 builtin/name-rev.c:314 builtin/show-ref.c:185
+#: 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
 msgid "pattern"
 msgstr ""
 
-#: builtin/clean.c:881
+#: builtin/clean.c:882
 msgid "add <pattern> to ignore rules"
 msgstr ""
 
-#: builtin/clean.c:882
+#: builtin/clean.c:883
 msgid "remove ignored files, too"
 msgstr ""
 
-#: builtin/clean.c:884
+#: builtin/clean.c:885
 msgid "remove only ignored files"
 msgstr ""
 
-#: builtin/clean.c:902
+#: builtin/clean.c:903
 msgid "-x and -X cannot be used together"
 msgstr ""
 
-#: builtin/clean.c:906
+#: builtin/clean.c:907
 msgid ""
-"clean.requireForce set to true and neither -i, -n nor -f given; refusing to "
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
 msgstr ""
 
-#: builtin/clean.c:909
+#: builtin/clean.c:910
 msgid ""
-"clean.requireForce defaults to true and neither -i, -n nor -f given; "
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
 msgstr ""
 
@@ -3613,7 +3548,7 @@ msgid "git clone [options] [--] <repo> [<dir>]"
 msgstr ""
 
 #: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:521
+#: builtin/push.c:504
 msgid "force progress reporting"
 msgstr ""
 
@@ -3621,7 +3556,7 @@ msgstr ""
 msgid "don't create a checkout"
 msgstr ""
 
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
 msgid "create a bare repository"
 msgstr ""
 
@@ -3645,11 +3580,11 @@ msgstr ""
 msgid "initialize submodules in the clone"
 msgstr ""
 
-#: builtin/clone.c:82 builtin/init-db.c:485
+#: builtin/clone.c:82 builtin/init-db.c:483
 msgid "template-directory"
 msgstr ""
 
-#: builtin/clone.c:83 builtin/init-db.c:486
+#: builtin/clone.c:83 builtin/init-db.c:484
 msgid "directory from which templates will be used"
 msgstr ""
 
@@ -3673,7 +3608,7 @@ msgstr ""
 msgid "path to git-upload-pack on the remote"
 msgstr ""
 
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663
+#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
 msgid "depth"
 msgstr ""
 
@@ -3685,11 +3620,11 @@ msgstr ""
 msgid "clone only one branch, HEAD or --branch"
 msgstr ""
 
-#: builtin/clone.c:96 builtin/init-db.c:494
+#: builtin/clone.c:96 builtin/init-db.c:492
 msgid "gitdir"
 msgstr ""
 
-#: builtin/clone.c:97 builtin/init-db.c:495
+#: builtin/clone.c:97 builtin/init-db.c:493
 msgid "separate git dir from working tree"
 msgstr ""
 
@@ -3947,67 +3882,67 @@ msgid ""
 "the remaining commits.\n"
 msgstr ""
 
-#: builtin/commit.c:287
+#: builtin/commit.c:288
 msgid "failed to unpack HEAD tree object"
 msgstr ""
 
-#: builtin/commit.c:329
+#: builtin/commit.c:330
 msgid "unable to create temporary index"
 msgstr ""
 
-#: builtin/commit.c:335
+#: builtin/commit.c:336
 msgid "interactive add failed"
 msgstr ""
 
-#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439
+#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
 msgid "unable to write new_index file"
 msgstr ""
 
-#: builtin/commit.c:420
+#: builtin/commit.c:421
 msgid "cannot do a partial commit during a merge."
 msgstr ""
 
-#: builtin/commit.c:422
+#: builtin/commit.c:423
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr ""
 
-#: builtin/commit.c:432
+#: builtin/commit.c:433
 msgid "cannot read the index"
 msgstr ""
 
-#: builtin/commit.c:452
+#: builtin/commit.c:453
 msgid "unable to write temporary index file"
 msgstr ""
 
-#: builtin/commit.c:543 builtin/commit.c:549
+#: builtin/commit.c:544 builtin/commit.c:550
 #, c-format
 msgid "invalid commit: %s"
 msgstr ""
 
-#: builtin/commit.c:571
+#: builtin/commit.c:572
 msgid "malformed --author parameter"
 msgstr ""
 
-#: builtin/commit.c:591
+#: builtin/commit.c:592
 #, c-format
 msgid "Malformed ident string: '%s'"
 msgstr ""
 
-#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007
+#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
 #, c-format
 msgid "could not lookup commit %s"
 msgstr ""
 
-#: builtin/commit.c:642 builtin/shortlog.c:273
+#: builtin/commit.c:641 builtin/shortlog.c:273
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr ""
 
-#: builtin/commit.c:644
+#: builtin/commit.c:643
 msgid "could not read log from standard input"
 msgstr ""
 
-#: builtin/commit.c:648
+#: builtin/commit.c:647
 #, c-format
 msgid "could not read log file '%s'"
 msgstr ""
@@ -4033,7 +3968,7 @@ msgstr ""
 msgid "could not write commit template"
 msgstr ""
 
-#: builtin/commit.c:760
+#: builtin/commit.c:764
 #, c-format
 msgid ""
 "\n"
@@ -4043,7 +3978,7 @@ msgid ""
 "and try again.\n"
 msgstr ""
 
-#: builtin/commit.c:765
+#: builtin/commit.c:769
 #, c-format
 msgid ""
 "\n"
@@ -4053,14 +3988,14 @@ msgid ""
 "and try again.\n"
 msgstr ""
 
-#: builtin/commit.c:777
+#: builtin/commit.c:782
 #, 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:782
+#: builtin/commit.c:789
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4068,351 +4003,351 @@ msgid ""
 "An empty message aborts the commit.\n"
 msgstr ""
 
-#: builtin/commit.c:795
+#: builtin/commit.c:802
 #, c-format
 msgid "%sAuthor:    %s"
 msgstr ""
 
-#: builtin/commit.c:802
+#: builtin/commit.c:809
 #, c-format
 msgid "%sCommitter: %s"
 msgstr ""
 
-#: builtin/commit.c:822
+#: builtin/commit.c:829
 msgid "Cannot read index"
 msgstr ""
 
-#: builtin/commit.c:865
+#: builtin/commit.c:872
 msgid "Error building trees"
 msgstr ""
 
-#: builtin/commit.c:880 builtin/tag.c:359
+#: builtin/commit.c:887 builtin/tag.c:391
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr ""
 
-#: builtin/commit.c:982
+#: builtin/commit.c:989
 #, c-format
 msgid "No existing author found with '%s'"
 msgstr ""
 
-#: builtin/commit.c:997 builtin/commit.c:1237
+#: builtin/commit.c:1004 builtin/commit.c:1244
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr ""
 
-#: builtin/commit.c:1034
+#: builtin/commit.c:1041
 msgid "--long and -z are incompatible"
 msgstr ""
 
-#: builtin/commit.c:1064
+#: builtin/commit.c:1071
 msgid "Using both --reset-author and --author does not make sense"
 msgstr ""
 
-#: builtin/commit.c:1075
+#: builtin/commit.c:1080
 msgid "You have nothing to amend."
 msgstr ""
 
-#: builtin/commit.c:1078
+#: builtin/commit.c:1083
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr ""
 
-#: builtin/commit.c:1080
+#: builtin/commit.c:1085
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr ""
 
-#: builtin/commit.c:1083
+#: builtin/commit.c:1088
 msgid "Options --squash and --fixup cannot be used together"
 msgstr ""
 
-#: builtin/commit.c:1093
+#: builtin/commit.c:1098
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr ""
 
-#: builtin/commit.c:1095
+#: builtin/commit.c:1100
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr ""
 
-#: builtin/commit.c:1103
+#: builtin/commit.c:1108
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr ""
 
-#: builtin/commit.c:1120
+#: builtin/commit.c:1125
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 
-#: builtin/commit.c:1122
+#: builtin/commit.c:1127
 msgid "No paths with --include/--only does not make sense."
 msgstr ""
 
-#: builtin/commit.c:1124
+#: builtin/commit.c:1129
 msgid "Clever... amending the last one with dirty index."
 msgstr ""
 
-#: builtin/commit.c:1126
-msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
+#: builtin/commit.c:1131
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr ""
 
-#: builtin/commit.c:1136 builtin/tag.c:572
+#: builtin/commit.c:1143 builtin/tag.c:639
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr ""
 
-#: builtin/commit.c:1141
+#: builtin/commit.c:1148
 msgid "Paths with -a does not make sense."
 msgstr ""
 
-#: builtin/commit.c:1251 builtin/commit.c:1482
+#: builtin/commit.c:1258 builtin/commit.c:1516
 msgid "show status concisely"
 msgstr ""
 
-#: builtin/commit.c:1253 builtin/commit.c:1484
+#: builtin/commit.c:1260 builtin/commit.c:1518
 msgid "show branch information"
 msgstr ""
 
-#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507
+#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
 msgid "machine-readable output"
 msgstr ""
 
-#: builtin/commit.c:1258 builtin/commit.c:1488
+#: builtin/commit.c:1265 builtin/commit.c:1522
 msgid "show status in long format (default)"
 msgstr ""
 
-#: builtin/commit.c:1261 builtin/commit.c:1491
+#: builtin/commit.c:1268 builtin/commit.c:1525
 msgid "terminate entries with NUL"
 msgstr ""
 
-#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:459
+#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
+#: builtin/fast-export.c:677 builtin/tag.c:514
 msgid "mode"
 msgstr ""
 
-#: builtin/commit.c:1264 builtin/commit.c:1494
+#: builtin/commit.c:1271 builtin/commit.c:1528
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 
-#: builtin/commit.c:1267
+#: builtin/commit.c:1274
 msgid "show ignored files"
 msgstr ""
 
-#: builtin/commit.c:1268 parse-options.h:156
+#: builtin/commit.c:1275 parse-options.h:153
 msgid "when"
 msgstr ""
 
-#: builtin/commit.c:1269
+#: builtin/commit.c:1276
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
 msgstr ""
 
-#: builtin/commit.c:1271
+#: builtin/commit.c:1278
 msgid "list untracked files in columns"
 msgstr ""
 
-#: builtin/commit.c:1340
+#: builtin/commit.c:1347
 msgid "couldn't look up newly created commit"
 msgstr ""
 
-#: builtin/commit.c:1342
+#: builtin/commit.c:1349
 msgid "could not parse newly created commit"
 msgstr ""
 
-#: builtin/commit.c:1383
+#: builtin/commit.c:1390
 msgid "detached HEAD"
 msgstr ""
 
-#: builtin/commit.c:1385
+#: builtin/commit.c:1392
 msgid " (root-commit)"
 msgstr ""
 
-#: builtin/commit.c:1452
+#: builtin/commit.c:1486
 msgid "suppress summary after successful commit"
 msgstr ""
 
-#: builtin/commit.c:1453
+#: builtin/commit.c:1487
 msgid "show diff in commit message template"
 msgstr ""
 
-#: builtin/commit.c:1455
+#: builtin/commit.c:1489
 msgid "Commit message options"
 msgstr ""
 
-#: builtin/commit.c:1456 builtin/tag.c:457
+#: builtin/commit.c:1490 builtin/tag.c:512
 msgid "read message from file"
 msgstr ""
 
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
 msgid "author"
 msgstr ""
 
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
 msgid "override author for commit"
 msgstr ""
 
-#: builtin/commit.c:1458 builtin/gc.c:261
+#: builtin/commit.c:1492 builtin/gc.c:272
 msgid "date"
 msgstr ""
 
-#: builtin/commit.c:1458
+#: builtin/commit.c:1492
 msgid "override date for commit"
 msgstr ""
 
-#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405
-#: builtin/notes.c:562 builtin/tag.c:455
+#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:510
 msgid "message"
 msgstr ""
 
-#: builtin/commit.c:1459
+#: builtin/commit.c:1493
 msgid "commit message"
 msgstr ""
 
-#: builtin/commit.c:1460
+#: builtin/commit.c:1494
 msgid "reuse and edit message from specified commit"
 msgstr ""
 
-#: builtin/commit.c:1461
+#: builtin/commit.c:1495
 msgid "reuse message from specified commit"
 msgstr ""
 
-#: builtin/commit.c:1462
+#: builtin/commit.c:1496
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 
-#: builtin/commit.c:1463
+#: builtin/commit.c:1497
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 
-#: builtin/commit.c:1464
+#: builtin/commit.c:1498
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr ""
 
-#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr ""
 
-#: builtin/commit.c:1466
+#: builtin/commit.c:1500
 msgid "use specified template file"
 msgstr ""
 
-#: builtin/commit.c:1467
+#: builtin/commit.c:1501
 msgid "force edit of commit"
 msgstr ""
 
-#: builtin/commit.c:1468
+#: builtin/commit.c:1502
 msgid "default"
 msgstr ""
 
-#: builtin/commit.c:1468 builtin/tag.c:460
+#: builtin/commit.c:1502 builtin/tag.c:515
 msgid "how to strip spaces and #comments from message"
 msgstr ""
 
-#: builtin/commit.c:1469
+#: builtin/commit.c:1503
 msgid "include status in commit message template"
 msgstr ""
 
-#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461
-msgid "key id"
+#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:516
+msgid "key-id"
 msgstr ""
 
-#: builtin/commit.c:1471 builtin/merge.c:224
+#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr ""
 
-#. end commit message options
-#: builtin/commit.c:1474
+#: builtin/commit.c:1508
 msgid "Commit contents options"
 msgstr ""
 
-#: builtin/commit.c:1475
+#: builtin/commit.c:1509
 msgid "commit all changed files"
 msgstr ""
 
-#: builtin/commit.c:1476
+#: builtin/commit.c:1510
 msgid "add specified files to index for commit"
 msgstr ""
 
-#: builtin/commit.c:1477
+#: builtin/commit.c:1511
 msgid "interactively add files"
 msgstr ""
 
-#: builtin/commit.c:1478
+#: builtin/commit.c:1512
 msgid "interactively add changes"
 msgstr ""
 
-#: builtin/commit.c:1479
+#: builtin/commit.c:1513
 msgid "commit only specified files"
 msgstr ""
 
-#: builtin/commit.c:1480
+#: builtin/commit.c:1514
 msgid "bypass pre-commit hook"
 msgstr ""
 
-#: builtin/commit.c:1481
+#: builtin/commit.c:1515
 msgid "show what would be committed"
 msgstr ""
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1526
 msgid "amend previous commit"
 msgstr ""
 
-#: builtin/commit.c:1493
+#: builtin/commit.c:1527
 msgid "bypass post-rewrite hook"
 msgstr ""
 
-#: builtin/commit.c:1498
+#: builtin/commit.c:1532
 msgid "ok to record an empty change"
 msgstr ""
 
-#: builtin/commit.c:1500
+#: builtin/commit.c:1534
 msgid "ok to record a change with an empty message"
 msgstr ""
 
-#: builtin/commit.c:1529
+#: builtin/commit.c:1562
 msgid "could not parse HEAD commit"
 msgstr ""
 
-#: builtin/commit.c:1567 builtin/merge.c:518
+#: builtin/commit.c:1601 builtin/merge.c:518
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr ""
 
-#: builtin/commit.c:1574
+#: builtin/commit.c:1608
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr ""
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1615
 msgid "could not read MERGE_MODE"
 msgstr ""
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1634
 #, c-format
 msgid "could not read commit message: %s"
 msgstr ""
 
-#: builtin/commit.c:1611
+#: builtin/commit.c:1645
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr ""
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1650
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr ""
 
-#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879
+#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
 msgid "failed to write commit object"
 msgstr ""
 
-#: builtin/commit.c:1652
+#: builtin/commit.c:1686
 msgid "cannot lock HEAD ref"
 msgstr ""
 
-#: builtin/commit.c:1656
+#: builtin/commit.c:1690
 msgid "cannot update HEAD ref"
 msgstr ""
 
-#: builtin/commit.c:1667
+#: builtin/commit.c:1701
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full or quota is\n"
@@ -4423,127 +4358,127 @@ msgstr ""
 msgid "git config [options]"
 msgstr ""
 
-#: builtin/config.c:54
+#: builtin/config.c:53
 msgid "Config file location"
 msgstr ""
 
-#: builtin/config.c:55
+#: builtin/config.c:54
 msgid "use global config file"
 msgstr ""
 
-#: builtin/config.c:56
+#: builtin/config.c:55
 msgid "use system config file"
 msgstr ""
 
-#: builtin/config.c:57
+#: builtin/config.c:56
 msgid "use repository config file"
 msgstr ""
 
-#: builtin/config.c:58
+#: builtin/config.c:57
 msgid "use given config file"
 msgstr ""
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "blob-id"
 msgstr ""
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "read config from given blob object"
 msgstr ""
 
-#: builtin/config.c:60
+#: builtin/config.c:59
 msgid "Action"
 msgstr ""
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "get value: name [value-regex]"
 msgstr ""
 
-#: builtin/config.c:62
+#: builtin/config.c:61
 msgid "get all values: key [value-regex]"
 msgstr ""
 
-#: builtin/config.c:63
+#: builtin/config.c:62
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr ""
 
-#: builtin/config.c:64
+#: builtin/config.c:63
 msgid "get value specific for the URL: section[.var] URL"
 msgstr ""
 
-#: builtin/config.c:65
+#: builtin/config.c:64
 msgid "replace all matching variables: name value [value_regex]"
 msgstr ""
 
-#: builtin/config.c:66
+#: builtin/config.c:65
 msgid "add a new variable: name value"
 msgstr ""
 
-#: builtin/config.c:67
+#: builtin/config.c:66
 msgid "remove a variable: name [value-regex]"
 msgstr ""
 
-#: builtin/config.c:68
+#: builtin/config.c:67
 msgid "remove all matches: name [value-regex]"
 msgstr ""
 
-#: builtin/config.c:69
+#: builtin/config.c:68
 msgid "rename section: old-name new-name"
 msgstr ""
 
-#: builtin/config.c:70
+#: builtin/config.c:69
 msgid "remove a section: name"
 msgstr ""
 
-#: builtin/config.c:71
+#: builtin/config.c:70
 msgid "list all"
 msgstr ""
 
-#: builtin/config.c:72
+#: builtin/config.c:71
 msgid "open an editor"
 msgstr ""
 
-#: builtin/config.c:73 builtin/config.c:74
+#: builtin/config.c:72 builtin/config.c:73
 msgid "slot"
 msgstr ""
 
-#: builtin/config.c:73
+#: builtin/config.c:72
 msgid "find the color configured: [default]"
 msgstr ""
 
-#: builtin/config.c:74
+#: builtin/config.c:73
 msgid "find the color setting: [stdout-is-tty]"
 msgstr ""
 
-#: builtin/config.c:75
+#: builtin/config.c:74
 msgid "Type"
 msgstr ""
 
-#: builtin/config.c:76
+#: builtin/config.c:75
 msgid "value is \"true\" or \"false\""
 msgstr ""
 
-#: builtin/config.c:77
+#: builtin/config.c:76
 msgid "value is decimal number"
 msgstr ""
 
-#: builtin/config.c:78
+#: builtin/config.c:77
 msgid "value is --bool or --int"
 msgstr ""
 
-#: builtin/config.c:79
+#: builtin/config.c:78
 msgid "value is a path (file or directory name)"
 msgstr ""
 
-#: builtin/config.c:80
+#: builtin/config.c:79
 msgid "Other"
 msgstr ""
 
-#: builtin/config.c:81
+#: builtin/config.c:80
 msgid "terminate values with NUL byte"
 msgstr ""
 
-#: builtin/config.c:82
+#: builtin/config.c:81
 msgid "respect include directives on lookup"
 msgstr ""
 
@@ -4563,129 +4498,129 @@ msgstr ""
 msgid "git describe [options] --dirty"
 msgstr ""
 
-#: builtin/describe.c:237
+#: builtin/describe.c:225
 #, c-format
 msgid "annotated tag %s not available"
 msgstr ""
 
-#: builtin/describe.c:241
+#: builtin/describe.c:229
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr ""
 
-#: builtin/describe.c:243
+#: builtin/describe.c:231
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr ""
 
-#: builtin/describe.c:270
+#: builtin/describe.c:258
 #, c-format
 msgid "Not a valid object name %s"
 msgstr ""
 
-#: builtin/describe.c:273
+#: builtin/describe.c:261
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr ""
 
-#: builtin/describe.c:290
+#: builtin/describe.c:278
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr ""
 
-#: builtin/describe.c:292
+#: builtin/describe.c:280
 #, c-format
 msgid "searching to describe %s\n"
 msgstr ""
 
-#: builtin/describe.c:332
+#: builtin/describe.c:327
 #, c-format
 msgid "finished search at %s\n"
 msgstr ""
 
-#: builtin/describe.c:359
+#: builtin/describe.c:354
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
 "However, there were unannotated tags: try --tags."
 msgstr ""
 
-#: builtin/describe.c:363
+#: builtin/describe.c:358
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
 "Try --always, or create some tags."
 msgstr ""
 
-#: builtin/describe.c:384
+#: builtin/describe.c:379
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr ""
 
-#: builtin/describe.c:387
+#: builtin/describe.c:382
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
 "gave up search at %s\n"
 msgstr ""
 
-#: builtin/describe.c:409
+#: builtin/describe.c:404
 msgid "find the tag that comes after the commit"
 msgstr ""
 
-#: builtin/describe.c:410
+#: builtin/describe.c:405
 msgid "debug search strategy on stderr"
 msgstr ""
 
-#: builtin/describe.c:411
+#: builtin/describe.c:406
 msgid "use any ref"
 msgstr ""
 
-#: builtin/describe.c:412
+#: builtin/describe.c:407
 msgid "use any tag, even unannotated"
 msgstr ""
 
-#: builtin/describe.c:413
+#: builtin/describe.c:408
 msgid "always use long format"
 msgstr ""
 
-#: builtin/describe.c:414
+#: builtin/describe.c:409
 msgid "only follow first parent"
 msgstr ""
 
-#: builtin/describe.c:417
+#: builtin/describe.c:412
 msgid "only output exact matches"
 msgstr ""
 
-#: builtin/describe.c:419
+#: builtin/describe.c:414
 msgid "consider <n> most recent tags (default: 10)"
 msgstr ""
 
-#: builtin/describe.c:421
+#: builtin/describe.c:416
 msgid "only consider tags matching <pattern>"
 msgstr ""
 
-#: builtin/describe.c:423 builtin/name-rev.c:321
+#: builtin/describe.c:418 builtin/name-rev.c:321
 msgid "show abbreviated commit object as fallback"
 msgstr ""
 
-#: builtin/describe.c:424
+#: builtin/describe.c:419
 msgid "mark"
 msgstr ""
 
-#: builtin/describe.c:425
+#: builtin/describe.c:420
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr ""
 
-#: builtin/describe.c:443
+#: builtin/describe.c:438
 msgid "--long is incompatible with --abbrev=0"
 msgstr ""
 
-#: builtin/describe.c:469
+#: builtin/describe.c:464
 msgid "No names found, cannot describe anything."
 msgstr ""
 
-#: builtin/describe.c:489
+#: builtin/describe.c:484
 msgid "--dirty is incompatible with commit-ishes"
 msgstr ""
 
@@ -4975,7 +4910,7 @@ msgstr ""
 msgid "Could not fetch %s"
 msgstr ""
 
-#: builtin/fetch.c:1036
+#: builtin/fetch.c:1035
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -5014,10 +4949,10 @@ msgstr ""
 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:702
-#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446
-#: parse-options.h:135 parse-options.h:242
+#: 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
+#: parse-options.h:132 parse-options.h:239
 msgid "n"
 msgstr ""
 
@@ -5081,6 +5016,14 @@ msgstr ""
 msgid "field name to sort on"
 msgstr ""
 
+#: builtin/fsck.c:147 builtin/prune.c:172
+msgid "Checking connectivity"
+msgstr ""
+
+#: builtin/fsck.c:544
+msgid "Checking object directories"
+msgstr ""
+
 #: builtin/fsck.c:607
 msgid "git fsck [options] [<object>...]"
 msgstr ""
@@ -5125,51 +5068,62 @@ msgstr ""
 msgid "show progress"
 msgstr ""
 
+#: builtin/fsck.c:673
+msgid "Checking objects"
+msgstr ""
+
 #: builtin/gc.c:24
 msgid "git gc [options]"
 msgstr ""
 
-#: builtin/gc.c:80
+#: builtin/gc.c:90
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr ""
 
-#: builtin/gc.c:107
+#: builtin/gc.c:117
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr ""
 
-#: builtin/gc.c:262
+#: builtin/gc.c:273
 msgid "prune unreferenced objects"
 msgstr ""
 
-#: builtin/gc.c:264
+#: builtin/gc.c:275
 msgid "be more thorough (increased runtime)"
 msgstr ""
 
-#: builtin/gc.c:265
+#: builtin/gc.c:276
 msgid "enable auto-gc mode"
 msgstr ""
 
-#: builtin/gc.c:266
+#: builtin/gc.c:277
 msgid "force running gc even if there may be another gc running"
 msgstr ""
 
-#: builtin/gc.c:306
+#: builtin/gc.c:318
 #, c-format
-msgid ""
-"Auto packing the repository for optimum performance. You may also\n"
-"run \"git gc\" manually. See \"git help gc\" for more information.\n"
+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 "See \"git help gc\" for manual housekeeping.\n"
 msgstr ""
 
-#. be quiet on --auto
-#: builtin/gc.c:316
+#: builtin/gc.c:336
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
 msgstr ""
 
-#: builtin/gc.c:341
+#: builtin/gc.c:361
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -5198,209 +5152,209 @@ msgstr ""
 msgid "unable to grep from object of type %s"
 msgstr ""
 
-#: builtin/grep.c:551
+#: builtin/grep.c:549
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr ""
 
-#: builtin/grep.c:568
+#: builtin/grep.c:566
 #, c-format
 msgid "cannot open '%s'"
 msgstr ""
 
-#: builtin/grep.c:642
+#: builtin/grep.c:640
 msgid "search in index instead of in the work tree"
 msgstr ""
 
-#: builtin/grep.c:644
+#: builtin/grep.c:642
 msgid "find in contents not managed by git"
 msgstr ""
 
-#: builtin/grep.c:646
+#: builtin/grep.c:644
 msgid "search in both tracked and untracked files"
 msgstr ""
 
-#: builtin/grep.c:648
+#: builtin/grep.c:646
 msgid "search also in ignored files"
 msgstr ""
 
-#: builtin/grep.c:651
+#: builtin/grep.c:649
 msgid "show non-matching lines"
 msgstr ""
 
-#: builtin/grep.c:653
+#: builtin/grep.c:651
 msgid "case insensitive matching"
 msgstr ""
 
-#: builtin/grep.c:655
+#: builtin/grep.c:653
 msgid "match patterns only at word boundaries"
 msgstr ""
 
-#: builtin/grep.c:657
+#: builtin/grep.c:655
 msgid "process binary files as text"
 msgstr ""
 
-#: builtin/grep.c:659
+#: builtin/grep.c:657
 msgid "don't match patterns in binary files"
 msgstr ""
 
-#: builtin/grep.c:662
+#: builtin/grep.c:660
 msgid "process binary files with textconv filters"
 msgstr ""
 
-#: builtin/grep.c:664
+#: builtin/grep.c:662
 msgid "descend at most <depth> levels"
 msgstr ""
 
-#: builtin/grep.c:668
+#: builtin/grep.c:666
 msgid "use extended POSIX regular expressions"
 msgstr ""
 
-#: builtin/grep.c:671
+#: builtin/grep.c:669
 msgid "use basic POSIX regular expressions (default)"
 msgstr ""
 
-#: builtin/grep.c:674
+#: builtin/grep.c:672
 msgid "interpret patterns as fixed strings"
 msgstr ""
 
-#: builtin/grep.c:677
+#: builtin/grep.c:675
 msgid "use Perl-compatible regular expressions"
 msgstr ""
 
-#: builtin/grep.c:680
+#: builtin/grep.c:678
 msgid "show line numbers"
 msgstr ""
 
-#: builtin/grep.c:681
+#: builtin/grep.c:679
 msgid "don't show filenames"
 msgstr ""
 
-#: builtin/grep.c:682
+#: builtin/grep.c:680
 msgid "show filenames"
 msgstr ""
 
-#: builtin/grep.c:684
+#: builtin/grep.c:682
 msgid "show filenames relative to top directory"
 msgstr ""
 
-#: builtin/grep.c:686
+#: builtin/grep.c:684
 msgid "show only filenames instead of matching lines"
 msgstr ""
 
-#: builtin/grep.c:688
+#: builtin/grep.c:686
 msgid "synonym for --files-with-matches"
 msgstr ""
 
-#: builtin/grep.c:691
+#: builtin/grep.c:689
 msgid "show only the names of files without match"
 msgstr ""
 
-#: builtin/grep.c:693
+#: builtin/grep.c:691
 msgid "print NUL after filenames"
 msgstr ""
 
-#: builtin/grep.c:695
+#: builtin/grep.c:693
 msgid "show the number of matches instead of matching lines"
 msgstr ""
 
-#: builtin/grep.c:696
+#: builtin/grep.c:694
 msgid "highlight matches"
 msgstr ""
 
-#: builtin/grep.c:698
+#: builtin/grep.c:696
 msgid "print empty line between matches from different files"
 msgstr ""
 
-#: builtin/grep.c:700
+#: builtin/grep.c:698
 msgid "show filename only once above matches from same file"
 msgstr ""
 
-#: builtin/grep.c:703
+#: builtin/grep.c:701
 msgid "show <n> context lines before and after matches"
 msgstr ""
 
-#: builtin/grep.c:706
+#: builtin/grep.c:704
 msgid "show <n> context lines before matches"
 msgstr ""
 
-#: builtin/grep.c:708
+#: builtin/grep.c:706
 msgid "show <n> context lines after matches"
 msgstr ""
 
-#: builtin/grep.c:709
+#: builtin/grep.c:707
 msgid "shortcut for -C NUM"
 msgstr ""
 
-#: builtin/grep.c:712
+#: builtin/grep.c:710
 msgid "show a line with the function name before matches"
 msgstr ""
 
-#: builtin/grep.c:714
+#: builtin/grep.c:712
 msgid "show the surrounding function"
 msgstr ""
 
-#: builtin/grep.c:717
+#: builtin/grep.c:715
 msgid "read patterns from file"
 msgstr ""
 
-#: builtin/grep.c:719
+#: builtin/grep.c:717
 msgid "match <pattern>"
 msgstr ""
 
-#: builtin/grep.c:721
+#: builtin/grep.c:719
 msgid "combine patterns specified with -e"
 msgstr ""
 
-#: builtin/grep.c:733
+#: builtin/grep.c:731
 msgid "indicate hit with exit status without output"
 msgstr ""
 
-#: builtin/grep.c:735
+#: builtin/grep.c:733
 msgid "show only matches from files that match all patterns"
 msgstr ""
 
-#: builtin/grep.c:737
+#: builtin/grep.c:735
 msgid "show parse tree for grep expression"
 msgstr ""
 
-#: builtin/grep.c:741
+#: builtin/grep.c:739
 msgid "pager"
 msgstr ""
 
-#: builtin/grep.c:741
+#: builtin/grep.c:739
 msgid "show matching files in the pager"
 msgstr ""
 
-#: builtin/grep.c:744
+#: builtin/grep.c:742
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr ""
 
-#: builtin/grep.c:745 builtin/show-ref.c:187
+#: builtin/grep.c:743 builtin/show-ref.c:187
 msgid "show usage"
 msgstr ""
 
-#: builtin/grep.c:812
+#: builtin/grep.c:810
 msgid "no pattern given."
 msgstr ""
 
-#: builtin/grep.c:870
+#: builtin/grep.c:868
 msgid "--open-files-in-pager only works on the worktree"
 msgstr ""
 
-#: builtin/grep.c:893
+#: builtin/grep.c:891
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr ""
 
-#: builtin/grep.c:898
+#: builtin/grep.c:896
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr ""
 
-#: builtin/grep.c:901
+#: builtin/grep.c:899
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 
-#: builtin/grep.c:909
+#: builtin/grep.c:907
 msgid "both --cached and trees are given."
 msgstr ""
 
@@ -5414,7 +5368,7 @@ msgstr ""
 msgid "git hash-object  --stdin-paths < <list-of-paths>"
 msgstr ""
 
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:72 builtin/tag.c:521
 msgid "type"
 msgstr ""
 
@@ -5649,8 +5603,8 @@ msgstr ""
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr ""
 
-#: builtin/index-pack.c:669 builtin/pack-objects.c:171
-#: builtin/pack-objects.c:263
+#: builtin/index-pack.c:669 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
 #, c-format
 msgid "unable to read %s"
 msgstr ""
@@ -5916,72 +5870,70 @@ msgstr ""
 msgid "unable to move %s to %s"
 msgstr ""
 
-#.
-#. * TRANSLATORS: The first '%s' is either "Reinitialized
-#. * existing" or "Initialized empty", the second " shared" or
-#. * "", and the last '%s%s' is the verbatim directory name.
-#.
-#: builtin/init-db.c:420
+#. 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 ""
 
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
 msgid "Reinitialized existing"
 msgstr ""
 
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
 msgid "Initialized empty"
 msgstr ""
 
-#: builtin/init-db.c:422
+#: builtin/init-db.c:420
 msgid " shared"
 msgstr ""
 
-#: builtin/init-db.c:441
+#: builtin/init-db.c:439
 msgid "cannot tell cwd"
 msgstr ""
 
-#: builtin/init-db.c:467
+#: builtin/init-db.c:465
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [directory]"
 msgstr ""
 
-#: builtin/init-db.c:490
+#: builtin/init-db.c:488
 msgid "permissions"
 msgstr ""
 
-#: builtin/init-db.c:491
+#: builtin/init-db.c:489
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr ""
 
-#: builtin/init-db.c:493 builtin/prune-packed.c:79 builtin/repack.c:155
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
 msgid "be quiet"
 msgstr ""
 
-#: builtin/init-db.c:525 builtin/init-db.c:530
+#: builtin/init-db.c:523 builtin/init-db.c:528
 #, c-format
 msgid "cannot mkdir %s"
 msgstr ""
 
-#: builtin/init-db.c:534
+#: builtin/init-db.c:532
 #, c-format
 msgid "cannot chdir to %s"
 msgstr ""
 
-#: builtin/init-db.c:556
+#: builtin/init-db.c:554
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
 "dir=<directory>)"
 msgstr ""
 
-#: builtin/init-db.c:580
+#: builtin/init-db.c:578
 msgid "Cannot access current working directory"
 msgstr ""
 
-#: builtin/init-db.c:587
+#: builtin/init-db.c:585
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr ""
@@ -6244,95 +6196,95 @@ msgstr ""
 msgid "Unknown commit %s"
 msgstr ""
 
-#: builtin/ls-files.c:398
+#: builtin/ls-files.c:401
 msgid "git ls-files [options] [<file>...]"
 msgstr ""
 
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:458
 msgid "identify the file status with tags"
 msgstr ""
 
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:460
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr ""
 
-#: builtin/ls-files.c:459
+#: builtin/ls-files.c:462
 msgid "show cached files in the output (default)"
 msgstr ""
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:464
 msgid "show deleted files in the output"
 msgstr ""
 
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:466
 msgid "show modified files in the output"
 msgstr ""
 
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:468
 msgid "show other files in the output"
 msgstr ""
 
-#: builtin/ls-files.c:467
+#: builtin/ls-files.c:470
 msgid "show ignored files in the output"
 msgstr ""
 
-#: builtin/ls-files.c:470
+#: builtin/ls-files.c:473
 msgid "show staged contents' object name in the output"
 msgstr ""
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:475
 msgid "show files on the filesystem that need to be removed"
 msgstr ""
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:477
 msgid "show 'other' directories' name only"
 msgstr ""
 
-#: builtin/ls-files.c:477
+#: builtin/ls-files.c:480
 msgid "don't show empty directories"
 msgstr ""
 
-#: builtin/ls-files.c:480
+#: builtin/ls-files.c:483
 msgid "show unmerged files in the output"
 msgstr ""
 
-#: builtin/ls-files.c:482
+#: builtin/ls-files.c:485
 msgid "show resolve-undo information"
 msgstr ""
 
-#: builtin/ls-files.c:484
+#: builtin/ls-files.c:487
 msgid "skip files matching pattern"
 msgstr ""
 
-#: builtin/ls-files.c:487
+#: builtin/ls-files.c:490
 msgid "exclude patterns are read from <file>"
 msgstr ""
 
-#: builtin/ls-files.c:490
+#: builtin/ls-files.c:493
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr ""
 
-#: builtin/ls-files.c:492
+#: builtin/ls-files.c:495
 msgid "add the standard git exclusions"
 msgstr ""
 
-#: builtin/ls-files.c:495
+#: builtin/ls-files.c:498
 msgid "make the output relative to the project top directory"
 msgstr ""
 
-#: builtin/ls-files.c:498
+#: builtin/ls-files.c:501
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr ""
 
-#: builtin/ls-files.c:499
+#: builtin/ls-files.c:502
 msgid "tree-ish"
 msgstr ""
 
-#: builtin/ls-files.c:500
+#: builtin/ls-files.c:503
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 
-#: builtin/ls-files.c:502
+#: builtin/ls-files.c:505
 msgid "show debugging data"
 msgstr ""
 
@@ -6443,7 +6395,7 @@ msgstr ""
 msgid "Verify that the named commit has a valid GPG signature"
 msgstr ""
 
-#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89
+#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
 msgid "strategy"
 msgstr ""
 
@@ -6516,35 +6468,35 @@ msgstr ""
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr ""
 
-#: builtin/merge.c:650
+#: builtin/merge.c:653
 msgid "git write-tree failed to write a tree"
 msgstr ""
 
-#: builtin/merge.c:678
+#: builtin/merge.c:681
 msgid "Not handling anything other than two heads merge."
 msgstr ""
 
-#: builtin/merge.c:692
+#: builtin/merge.c:695
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr ""
 
-#: builtin/merge.c:706
+#: builtin/merge.c:709
 #, c-format
 msgid "unable to write %s"
 msgstr ""
 
-#: builtin/merge.c:795
+#: builtin/merge.c:798
 #, c-format
 msgid "Could not read from '%s'"
 msgstr ""
 
-#: builtin/merge.c:804
+#: builtin/merge.c:807
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 
-#: builtin/merge.c:810
+#: builtin/merge.c:813
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -6554,157 +6506,156 @@ msgid ""
 "the commit.\n"
 msgstr ""
 
-#: builtin/merge.c:834
+#: builtin/merge.c:837
 msgid "Empty commit message."
 msgstr ""
 
-#: builtin/merge.c:846
+#: builtin/merge.c:849
 #, c-format
 msgid "Wonderful.\n"
 msgstr ""
 
-#: builtin/merge.c:911
+#: builtin/merge.c:914
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 
-#: builtin/merge.c:927
+#: builtin/merge.c:930
 #, c-format
 msgid "'%s' is not a commit"
 msgstr ""
 
-#: builtin/merge.c:968
+#: builtin/merge.c:971
 msgid "No current branch."
 msgstr ""
 
-#: builtin/merge.c:970
+#: builtin/merge.c:973
 msgid "No remote for the current branch."
 msgstr ""
 
-#: builtin/merge.c:972
+#: builtin/merge.c:975
 msgid "No default upstream defined for the current branch."
 msgstr ""
 
-#: builtin/merge.c:977
+#: builtin/merge.c:980
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr ""
 
-#: builtin/merge.c:1133
+#: builtin/merge.c:1136
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr ""
 
-#: builtin/merge.c:1149 git-pull.sh:31
+#: builtin/merge.c:1152 git-pull.sh:31
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you can merge."
 msgstr ""
 
-#: builtin/merge.c:1152 git-pull.sh:34
+#: builtin/merge.c:1155 git-pull.sh:34
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr ""
 
-#: builtin/merge.c:1156
+#: builtin/merge.c:1159
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you can merge."
 msgstr ""
 
-#: builtin/merge.c:1159
+#: builtin/merge.c:1162
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr ""
 
-#: builtin/merge.c:1168
+#: builtin/merge.c:1171
 msgid "You cannot combine --squash with --no-ff."
 msgstr ""
 
-#: builtin/merge.c:1177
+#: builtin/merge.c:1180
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr ""
 
-#: builtin/merge.c:1209
+#: builtin/merge.c:1212
 msgid "Can merge only exactly one commit into empty head"
 msgstr ""
 
-#: builtin/merge.c:1212
+#: builtin/merge.c:1215
 msgid "Squash commit into empty head not supported yet"
 msgstr ""
 
-#: builtin/merge.c:1214
+#: builtin/merge.c:1217
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
 
-#: builtin/merge.c:1219
+#: builtin/merge.c:1222
 #, c-format
 msgid "%s - not something we can merge"
 msgstr ""
 
-#: builtin/merge.c:1270
+#: builtin/merge.c:1273
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 
-#: builtin/merge.c:1273
+#: builtin/merge.c:1276
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr ""
 
-#. 'N'
-#: builtin/merge.c:1276
+#: builtin/merge.c:1279
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr ""
 
-#: builtin/merge.c:1279
+#: builtin/merge.c:1282
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr ""
 
-#: builtin/merge.c:1363
+#: builtin/merge.c:1366
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr ""
 
-#: builtin/merge.c:1402
+#: builtin/merge.c:1405
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr ""
 
-#: builtin/merge.c:1409
+#: builtin/merge.c:1412
 #, c-format
 msgid "Nope.\n"
 msgstr ""
 
-#: builtin/merge.c:1441
+#: builtin/merge.c:1444
 msgid "Not possible to fast-forward, aborting."
 msgstr ""
 
-#: builtin/merge.c:1464 builtin/merge.c:1543
+#: builtin/merge.c:1467 builtin/merge.c:1546
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr ""
 
-#: builtin/merge.c:1468
+#: builtin/merge.c:1471
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr ""
 
-#: builtin/merge.c:1534
+#: builtin/merge.c:1537
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr ""
 
-#: builtin/merge.c:1536
+#: builtin/merge.c:1539
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr ""
 
-#: builtin/merge.c:1545
+#: builtin/merge.c:1548
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr ""
 
-#: builtin/merge.c:1557
+#: builtin/merge.c:1560
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -6787,19 +6738,19 @@ msgstr ""
 msgid "set labels for file1/orig_file/file2"
 msgstr ""
 
-#: builtin/mktree.c:67
+#: builtin/mktree.c:64
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr ""
 
-#: builtin/mktree.c:153
+#: builtin/mktree.c:150
 msgid "input is NUL terminated"
 msgstr ""
 
-#: builtin/mktree.c:154 builtin/write-tree.c:24
+#: builtin/mktree.c:151 builtin/write-tree.c:24
 msgid "allow missing objects"
 msgstr ""
 
-#: builtin/mktree.c:155
+#: builtin/mktree.c:152
 msgid "allow creation of more than one tree"
 msgstr ""
 
@@ -6846,46 +6797,46 @@ msgstr ""
 msgid "Huh? %.*s is in index?"
 msgstr ""
 
-#: builtin/mv.c:168
+#: builtin/mv.c:169
 msgid "source directory is empty"
 msgstr ""
 
-#: builtin/mv.c:200
+#: builtin/mv.c:205
 msgid "not under version control"
 msgstr ""
 
-#: builtin/mv.c:202
+#: builtin/mv.c:207
 msgid "destination exists"
 msgstr ""
 
-#: builtin/mv.c:210
+#: builtin/mv.c:215
 #, c-format
 msgid "overwriting '%s'"
 msgstr ""
 
-#: builtin/mv.c:213
+#: builtin/mv.c:218
 msgid "Cannot overwrite"
 msgstr ""
 
-#: builtin/mv.c:216
+#: builtin/mv.c:221
 msgid "multiple sources for the same target"
 msgstr ""
 
-#: builtin/mv.c:218
+#: builtin/mv.c:223
 msgid "destination directory does not exist"
 msgstr ""
 
-#: builtin/mv.c:233
+#: builtin/mv.c:243
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr ""
 
-#: builtin/mv.c:243
+#: builtin/mv.c:253
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr ""
 
-#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
 #, c-format
 msgid "renaming '%s' failed"
 msgstr ""
@@ -7049,7 +7000,7 @@ msgstr ""
 msgid "failed to finish 'show' for object '%s'"
 msgstr ""
 
-#: builtin/notes.c:167 builtin/tag.c:341
+#: builtin/notes.c:167 builtin/tag.c:373
 #, c-format
 msgid "could not create file '%s'"
 msgstr ""
@@ -7058,7 +7009,7 @@ msgstr ""
 msgid "Please supply the note contents using either -m or -F option"
 msgstr ""
 
-#: builtin/notes.c:207 builtin/notes.c:844
+#: builtin/notes.c:207 builtin/notes.c:848
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr ""
@@ -7072,20 +7023,20 @@ msgstr ""
 msgid "The note contents has been left in %s"
 msgstr ""
 
-#: builtin/notes.c:248 builtin/tag.c:537
+#: builtin/notes.c:248 builtin/tag.c:604
 #, c-format
 msgid "cannot read '%s'"
 msgstr ""
 
-#: builtin/notes.c:250 builtin/tag.c:540
+#: builtin/notes.c:250 builtin/tag.c:607
 #, c-format
 msgid "could not open or read '%s'"
 msgstr ""
 
-#: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318
-#: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515
-#: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637
-#: builtin/notes.c:839 builtin/tag.c:553
+#: 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
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr ""
@@ -7095,304 +7046,333 @@ msgstr ""
 msgid "Failed to read object '%s'."
 msgstr ""
 
-#: builtin/notes.c:312
+#: builtin/notes.c:276
+#, c-format
+msgid "Cannot read note data from non-blob object '%s'."
+msgstr ""
+
+#: builtin/notes.c:316
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr ""
 
-#: builtin/notes.c:327
+#: builtin/notes.c:331
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr ""
 
-#: builtin/notes.c:371 builtin/notes.c:425 builtin/notes.c:498
-#: builtin/notes.c:510 builtin/notes.c:583 builtin/notes.c:630
-#: builtin/notes.c:904
+#: 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 ""
 
-#: builtin/notes.c:384 builtin/notes.c:643
+#: builtin/notes.c:388 builtin/notes.c:647
 #, c-format
 msgid "No note found for object %s."
 msgstr ""
 
-#: builtin/notes.c:406 builtin/notes.c:563
+#: builtin/notes.c:410 builtin/notes.c:567
 msgid "note contents as a string"
 msgstr ""
 
-#: builtin/notes.c:409 builtin/notes.c:566
+#: builtin/notes.c:413 builtin/notes.c:570
 msgid "note contents in a file"
 msgstr ""
 
-#: builtin/notes.c:411 builtin/notes.c:414 builtin/notes.c:568
-#: builtin/notes.c:571 builtin/tag.c:474
+#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
+#: builtin/notes.c:575 builtin/tag.c:539
 msgid "object"
 msgstr ""
 
-#: builtin/notes.c:412 builtin/notes.c:569
+#: builtin/notes.c:416 builtin/notes.c:573
 msgid "reuse and edit specified note object"
 msgstr ""
 
-#: builtin/notes.c:415 builtin/notes.c:572
+#: builtin/notes.c:419 builtin/notes.c:576
 msgid "reuse specified note object"
 msgstr ""
 
-#: builtin/notes.c:417 builtin/notes.c:485
+#: builtin/notes.c:421 builtin/notes.c:489
 msgid "replace existing notes"
 msgstr ""
 
-#: builtin/notes.c:451
+#: builtin/notes.c:455
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr ""
 
-#: builtin/notes.c:456 builtin/notes.c:533
+#: builtin/notes.c:460 builtin/notes.c:537
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr ""
 
-#: builtin/notes.c:486
+#: builtin/notes.c:490
 msgid "read objects from stdin"
 msgstr ""
 
-#: builtin/notes.c:488
+#: builtin/notes.c:492
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr ""
 
-#: builtin/notes.c:506
+#: builtin/notes.c:510
 msgid "too few parameters"
 msgstr ""
 
-#: builtin/notes.c:527
+#: builtin/notes.c:531
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr ""
 
-#: builtin/notes.c:539
+#: builtin/notes.c:543
 #, c-format
 msgid "Missing notes on source object %s. Cannot copy."
 msgstr ""
 
-#: builtin/notes.c:588
+#: 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 ""
 
-#: builtin/notes.c:735
+#: builtin/notes.c:739
 msgid "General options"
 msgstr ""
 
-#: builtin/notes.c:737
+#: builtin/notes.c:741
 msgid "Merge options"
 msgstr ""
 
-#: builtin/notes.c:739
+#: builtin/notes.c:743
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
 msgstr ""
 
-#: builtin/notes.c:741
+#: builtin/notes.c:745
 msgid "Committing unmerged notes"
 msgstr ""
 
-#: builtin/notes.c:743
+#: builtin/notes.c:747
 msgid "finalize notes merge by committing unmerged notes"
 msgstr ""
 
-#: builtin/notes.c:745
+#: builtin/notes.c:749
 msgid "Aborting notes merge resolution"
 msgstr ""
 
-#: builtin/notes.c:747
+#: builtin/notes.c:751
 msgid "abort notes merge"
 msgstr ""
 
-#: builtin/notes.c:842
+#: builtin/notes.c:846
 #, c-format
 msgid "Object %s has no note\n"
 msgstr ""
 
-#: builtin/notes.c:854
+#: builtin/notes.c:858
 msgid "attempt to remove non-existent note is not an error"
 msgstr ""
 
-#: builtin/notes.c:857
+#: builtin/notes.c:861
 msgid "read object names from the standard input"
 msgstr ""
 
-#: builtin/notes.c:938
-msgid "notes_ref"
+#: builtin/notes.c:942
+msgid "notes-ref"
 msgstr ""
 
-#: builtin/notes.c:939
+#: builtin/notes.c:943
 msgid "use notes from <notes_ref>"
 msgstr ""
 
-#: builtin/notes.c:974 builtin/remote.c:1593
+#: builtin/notes.c:978 builtin/remote.c:1593
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr ""
 
-#: builtin/pack-objects.c:23
+#: builtin/pack-objects.c:25
 msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
 msgstr ""
 
-#: builtin/pack-objects.c:24
+#: builtin/pack-objects.c:26
 msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
 msgstr ""
 
-#: builtin/pack-objects.c:184 builtin/pack-objects.c:187
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
 #, c-format
 msgid "deflate error (%d)"
 msgstr ""
 
-#: builtin/pack-objects.c:2396
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr ""
+
+#: builtin/pack-objects.c:1012
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr ""
+
+#: builtin/pack-objects.c:2174
+msgid "Compressing objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2530
 #, c-format
 msgid "unsupported index version %s"
 msgstr ""
 
-#: builtin/pack-objects.c:2400
+#: builtin/pack-objects.c:2534
 #, c-format
 msgid "bad index version '%s'"
 msgstr ""
 
-#: builtin/pack-objects.c:2423
+#: builtin/pack-objects.c:2557
 #, c-format
 msgid "option %s does not accept negative form"
 msgstr ""
 
-#: builtin/pack-objects.c:2427
+#: builtin/pack-objects.c:2561
 #, c-format
 msgid "unable to parse value '%s' for option %s"
 msgstr ""
 
-#: builtin/pack-objects.c:2446
+#: builtin/pack-objects.c:2580
 msgid "do not show progress meter"
 msgstr ""
 
-#: builtin/pack-objects.c:2448
+#: builtin/pack-objects.c:2582
 msgid "show progress meter"
 msgstr ""
 
-#: builtin/pack-objects.c:2450
+#: builtin/pack-objects.c:2584
 msgid "show progress meter during object writing phase"
 msgstr ""
 
-#: builtin/pack-objects.c:2453
+#: builtin/pack-objects.c:2587
 msgid "similar to --all-progress when progress meter is shown"
 msgstr ""
 
-#: builtin/pack-objects.c:2454
+#: builtin/pack-objects.c:2588
 msgid "version[,offset]"
 msgstr ""
 
-#: builtin/pack-objects.c:2455
+#: builtin/pack-objects.c:2589
 msgid "write the pack index file in the specified idx format version"
 msgstr ""
 
-#: builtin/pack-objects.c:2458
+#: builtin/pack-objects.c:2592
 msgid "maximum size of each output pack file"
 msgstr ""
 
-#: builtin/pack-objects.c:2460
+#: builtin/pack-objects.c:2594
 msgid "ignore borrowed objects from alternate object store"
 msgstr ""
 
-#: builtin/pack-objects.c:2462
+#: builtin/pack-objects.c:2596
 msgid "ignore packed objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2464
+#: builtin/pack-objects.c:2598
 msgid "limit pack window by objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2466
+#: builtin/pack-objects.c:2600
 msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 
-#: builtin/pack-objects.c:2468
+#: builtin/pack-objects.c:2602
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr ""
 
-#: builtin/pack-objects.c:2470
+#: builtin/pack-objects.c:2604
 msgid "reuse existing deltas"
 msgstr ""
 
-#: builtin/pack-objects.c:2472
+#: builtin/pack-objects.c:2606
 msgid "reuse existing objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2474
+#: builtin/pack-objects.c:2608
 msgid "use OFS_DELTA objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2476
+#: builtin/pack-objects.c:2610
 msgid "use threads when searching for best delta matches"
 msgstr ""
 
-#: builtin/pack-objects.c:2478
+#: builtin/pack-objects.c:2612
 msgid "do not create an empty pack output"
 msgstr ""
 
-#: builtin/pack-objects.c:2480
+#: builtin/pack-objects.c:2614
 msgid "read revision arguments from standard input"
 msgstr ""
 
-#: builtin/pack-objects.c:2482
+#: builtin/pack-objects.c:2616
 msgid "limit the objects to those that are not yet packed"
 msgstr ""
 
-#: builtin/pack-objects.c:2485
+#: builtin/pack-objects.c:2619
 msgid "include objects reachable from any reference"
 msgstr ""
 
-#: builtin/pack-objects.c:2488
+#: builtin/pack-objects.c:2622
 msgid "include objects referred by reflog entries"
 msgstr ""
 
-#: builtin/pack-objects.c:2491
+#: builtin/pack-objects.c:2625
 msgid "output pack to stdout"
 msgstr ""
 
-#: builtin/pack-objects.c:2493
+#: builtin/pack-objects.c:2627
 msgid "include tag objects that refer to objects to be packed"
 msgstr ""
 
-#: builtin/pack-objects.c:2495
+#: builtin/pack-objects.c:2629
 msgid "keep unreachable objects"
 msgstr ""
 
-#: builtin/pack-objects.c:2496 parse-options.h:143
+#: builtin/pack-objects.c:2630 parse-options.h:140
 msgid "time"
 msgstr ""
 
-#: builtin/pack-objects.c:2497
+#: builtin/pack-objects.c:2631
 msgid "unpack unreachable objects newer than <time>"
 msgstr ""
 
-#: builtin/pack-objects.c:2500
+#: builtin/pack-objects.c:2634
 msgid "create thin packs"
 msgstr ""
 
-#: builtin/pack-objects.c:2502
+#: builtin/pack-objects.c:2636
 msgid "ignore packs that have companion .keep file"
 msgstr ""
 
-#: builtin/pack-objects.c:2504
+#: builtin/pack-objects.c:2638
 msgid "pack compression level"
 msgstr ""
 
-#: builtin/pack-objects.c:2506
+#: builtin/pack-objects.c:2640
 msgid "do not hide commits by grafts"
 msgstr ""
 
+#: builtin/pack-objects.c:2642
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2644
+msgid "write a bitmap index together with the pack index"
+msgstr ""
+
+#: builtin/pack-objects.c:2723
+msgid "Counting objects"
+msgstr ""
+
 #: builtin/pack-refs.c:6
 msgid "git pack-refs [options]"
 msgstr ""
@@ -7409,6 +7389,10 @@ msgstr ""
 msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
 msgstr ""
 
+#: builtin/prune-packed.c:49
+msgid "Removing duplicate objects"
+msgstr ""
+
 #: builtin/prune.c:12
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr ""
@@ -7429,21 +7413,21 @@ msgstr ""
 msgid "git push [<options>] [<repository> [<refspec>...]]"
 msgstr ""
 
-#: builtin/push.c:86
+#: builtin/push.c:85
 msgid "tag shorthand without <tag>"
 msgstr ""
 
-#: builtin/push.c:96
+#: builtin/push.c:95
 msgid "--delete only accepts plain target ref names"
 msgstr ""
 
-#: builtin/push.c:141
+#: builtin/push.c:140
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
 msgstr ""
 
-#: builtin/push.c:144
+#: builtin/push.c:143
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -7458,7 +7442,7 @@ msgid ""
 "%s"
 msgstr ""
 
-#: builtin/push.c:159
+#: builtin/push.c:158
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -7468,7 +7452,7 @@ msgid ""
 "    git push %s HEAD:<name-of-remote-branch>\n"
 msgstr ""
 
-#: builtin/push.c:173
+#: builtin/push.c:172
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -7477,12 +7461,12 @@ msgid ""
 "    git push --set-upstream %s %s\n"
 msgstr ""
 
-#: builtin/push.c:181
+#: builtin/push.c:180
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr ""
 
-#: builtin/push.c:184
+#: builtin/push.c:183
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -7490,11 +7474,11 @@ msgid ""
 "to update which remote branch."
 msgstr ""
 
-#: builtin/push.c:207
+#: builtin/push.c:206
 msgid ""
-"push.default is unset; its implicit value is changing in\n"
+"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 current behavior after the default changes, use:\n"
+"and maintain the traditional behavior, use:\n"
 "\n"
 "  git config --global push.default matching\n"
 "\n"
@@ -7505,7 +7489,7 @@ msgid ""
 "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"
-"In Git 2.0, Git will default to the more conservative 'simple'\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"
@@ -7515,12 +7499,12 @@ msgid ""
 "'current' instead of 'simple' if you sometimes use older versions of Git)"
 msgstr ""
 
-#: builtin/push.c:274
+#: builtin/push.c:273
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 
-#: builtin/push.c:281
+#: builtin/push.c:280
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -7528,15 +7512,7 @@ msgid ""
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 
-#: builtin/push.c:287
-msgid ""
-"Updates were rejected because a pushed branch tip is behind its remote\n"
-"counterpart. If you did not intend to push that branch, you may want to\n"
-"specify branches to push or set the 'push.default' configuration variable\n"
-"to 'simple', 'current' or 'upstream' to push only the current branch."
-msgstr ""
-
-#: builtin/push.c:293
+#: builtin/push.c:286
 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"
@@ -7544,7 +7520,7 @@ msgid ""
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 
-#: builtin/push.c:299
+#: builtin/push.c:292
 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"
@@ -7553,33 +7529,33 @@ msgid ""
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 
-#: builtin/push.c:306
+#: builtin/push.c:299
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr ""
 
-#: builtin/push.c:309
+#: builtin/push.c:302
 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:375
+#: builtin/push.c:361
 #, c-format
 msgid "Pushing to %s\n"
 msgstr ""
 
-#: builtin/push.c:379
+#: builtin/push.c:365
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr ""
 
-#: builtin/push.c:412
+#: builtin/push.c:395
 #, c-format
 msgid "bad repository '%s'"
 msgstr ""
 
-#: builtin/push.c:413
+#: builtin/push.c:396
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -7592,95 +7568,95 @@ msgid ""
 "    git push <name>\n"
 msgstr ""
 
-#: builtin/push.c:428
+#: builtin/push.c:411
 msgid "--all and --tags are incompatible"
 msgstr ""
 
-#: builtin/push.c:429
+#: builtin/push.c:412
 msgid "--all can't be combined with refspecs"
 msgstr ""
 
-#: builtin/push.c:434
+#: builtin/push.c:417
 msgid "--mirror and --tags are incompatible"
 msgstr ""
 
-#: builtin/push.c:435
+#: builtin/push.c:418
 msgid "--mirror can't be combined with refspecs"
 msgstr ""
 
-#: builtin/push.c:440
+#: builtin/push.c:423
 msgid "--all and --mirror are incompatible"
 msgstr ""
 
-#: builtin/push.c:500
+#: builtin/push.c:483
 msgid "repository"
 msgstr ""
 
-#: builtin/push.c:501
+#: builtin/push.c:484
 msgid "push all refs"
 msgstr ""
 
-#: builtin/push.c:502
+#: builtin/push.c:485
 msgid "mirror all refs"
 msgstr ""
 
-#: builtin/push.c:504
+#: builtin/push.c:487
 msgid "delete refs"
 msgstr ""
 
-#: builtin/push.c:505
+#: builtin/push.c:488
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr ""
 
-#: builtin/push.c:508
+#: builtin/push.c:491
 msgid "force updates"
 msgstr ""
 
-#: builtin/push.c:510
+#: builtin/push.c:493
 msgid "refname>:<expect"
 msgstr ""
 
-#: builtin/push.c:511
+#: builtin/push.c:494
 msgid "require old value of ref to be at this value"
 msgstr ""
 
-#: builtin/push.c:513
+#: builtin/push.c:496
 msgid "check"
 msgstr ""
 
-#: builtin/push.c:514
+#: builtin/push.c:497
 msgid "control recursive pushing of submodules"
 msgstr ""
 
-#: builtin/push.c:516
+#: builtin/push.c:499
 msgid "use thin pack"
 msgstr ""
 
-#: builtin/push.c:517 builtin/push.c:518
+#: builtin/push.c:500 builtin/push.c:501
 msgid "receive pack program"
 msgstr ""
 
-#: builtin/push.c:519
+#: builtin/push.c:502
 msgid "set upstream for git pull/status"
 msgstr ""
 
-#: builtin/push.c:522
+#: builtin/push.c:505
 msgid "prune locally removed refs"
 msgstr ""
 
-#: builtin/push.c:524
+#: builtin/push.c:507
 msgid "bypass pre-push hook"
 msgstr ""
 
-#: builtin/push.c:525
+#: builtin/push.c:508
 msgid "push missing but relevant tags"
 msgstr ""
 
-#: builtin/push.c:535
+#: builtin/push.c:518
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr ""
 
-#: builtin/push.c:537
+#: builtin/push.c:520
 msgid "--delete doesn't make sense without any refs"
 msgstr ""
 
@@ -8251,67 +8227,75 @@ msgstr ""
 msgid "be verbose; must be placed before a subcommand"
 msgstr ""
 
-#: builtin/repack.c:15
+#: builtin/repack.c:16
 msgid "git repack [options]"
 msgstr ""
 
-#: builtin/repack.c:143
+#: builtin/repack.c:156
 msgid "pack everything in a single pack"
 msgstr ""
 
-#: builtin/repack.c:145
+#: builtin/repack.c:158
 msgid "same as -a, and turn unreachable objects loose"
 msgstr ""
 
-#: builtin/repack.c:148
+#: builtin/repack.c:161
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr ""
 
-#: builtin/repack.c:150
+#: builtin/repack.c:163
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr ""
 
-#: builtin/repack.c:152
+#: builtin/repack.c:165
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr ""
 
-#: builtin/repack.c:154
+#: builtin/repack.c:167
 msgid "do not run git-update-server-info"
 msgstr ""
 
-#: builtin/repack.c:157
+#: builtin/repack.c:170
 msgid "pass --local to git-pack-objects"
 msgstr ""
 
-#: builtin/repack.c:158
+#: builtin/repack.c:172
+msgid "write bitmap index"
+msgstr ""
+
+#: builtin/repack.c:173
 msgid "approxidate"
 msgstr ""
 
-#: builtin/repack.c:159
+#: builtin/repack.c:174
 msgid "with -A, do not loosen objects older than this"
 msgstr ""
 
-#: builtin/repack.c:161
+#: builtin/repack.c:176
 msgid "size of the window used for delta compression"
 msgstr ""
 
-#: builtin/repack.c:162 builtin/repack.c:166
+#: builtin/repack.c:177 builtin/repack.c:181
 msgid "bytes"
 msgstr ""
 
-#: builtin/repack.c:163
+#: builtin/repack.c:178
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr ""
 
-#: builtin/repack.c:165
+#: builtin/repack.c:180
 msgid "limits the maximum delta depth"
 msgstr ""
 
-#: builtin/repack.c:167
+#: builtin/repack.c:182
 msgid "maximum size of each packfile"
 msgstr ""
 
-#: builtin/repack.c:343
+#: builtin/repack.c:184
+msgid "repack objects in packs marked with .keep"
+msgstr ""
+
+#: builtin/repack.c:371
 #, c-format
 msgid "removing '%s' failed"
 msgstr ""
@@ -8403,74 +8387,82 @@ msgstr ""
 msgid "HEAD is now at %s"
 msgstr ""
 
-#: builtin/reset.c:172
+#: builtin/reset.c:182
 #, c-format
 msgid "Cannot do a %s reset in the middle of a merge."
 msgstr ""
 
-#: builtin/reset.c:262
+#: builtin/reset.c:273
 msgid "be quiet, only report errors"
 msgstr ""
 
-#: builtin/reset.c:264
+#: builtin/reset.c:275
 msgid "reset HEAD and index"
 msgstr ""
 
-#: builtin/reset.c:265
+#: builtin/reset.c:276
 msgid "reset only HEAD"
 msgstr ""
 
-#: builtin/reset.c:267 builtin/reset.c:269
+#: builtin/reset.c:278 builtin/reset.c:280
 msgid "reset HEAD, index and working tree"
 msgstr ""
 
-#: builtin/reset.c:271
+#: builtin/reset.c:282
 msgid "reset HEAD but keep local changes"
 msgstr ""
 
-#: builtin/reset.c:289
+#: builtin/reset.c:285
+msgid "record only the fact that removed paths will be added later"
+msgstr ""
+
+#: builtin/reset.c:302
 #, c-format
 msgid "Failed to resolve '%s' as a valid revision."
 msgstr ""
 
-#: builtin/reset.c:292 builtin/reset.c:300
+#: builtin/reset.c:305 builtin/reset.c:313
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr ""
 
-#: builtin/reset.c:297
+#: builtin/reset.c:310
 #, c-format
 msgid "Failed to resolve '%s' as a valid tree."
 msgstr ""
 
-#: builtin/reset.c:306
+#: builtin/reset.c:319
 msgid "--patch is incompatible with --{hard,mixed,soft}"
 msgstr ""
 
-#: builtin/reset.c:315
+#: builtin/reset.c:328
 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
 msgstr ""
 
-#: builtin/reset.c:317
+#: builtin/reset.c:330
 #, c-format
 msgid "Cannot do %s reset with paths."
 msgstr ""
 
-#: builtin/reset.c:327
+#: builtin/reset.c:340
 #, c-format
 msgid "%s reset is not allowed in a bare repository"
 msgstr ""
 
 #: builtin/reset.c:344
+msgid "-N can only be used with --mixed"
+msgstr ""
+
+#: builtin/reset.c:361
 msgid "Unstaged changes after reset:"
 msgstr ""
 
-#: builtin/reset.c:350
+#: builtin/reset.c:367
 #, c-format
 msgid "Could not reset index file to revision '%s'."
 msgstr ""
 
-#: builtin/reset.c:355
+#: builtin/reset.c:372
 msgid "Could not write new index file."
 msgstr ""
 
@@ -8490,7 +8482,7 @@ msgstr ""
 msgid "output in stuck long form"
 msgstr ""
 
-#: builtin/rev-parse.c:486
+#: builtin/rev-parse.c:497
 msgid ""
 "git rev-parse --parseopt [options] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -8556,35 +8548,35 @@ msgstr ""
 msgid "option for merge strategy"
 msgstr ""
 
-#: builtin/revert.c:102
+#: builtin/revert.c:104
 msgid "append commit name"
 msgstr ""
 
-#: builtin/revert.c:103
+#: builtin/revert.c:105
 msgid "allow fast-forward"
 msgstr ""
 
-#: builtin/revert.c:104
+#: builtin/revert.c:106
 msgid "preserve initially empty commits"
 msgstr ""
 
-#: builtin/revert.c:105
+#: builtin/revert.c:107
 msgid "allow commits with empty messages"
 msgstr ""
 
-#: builtin/revert.c:106
+#: builtin/revert.c:108
 msgid "keep redundant, empty commits"
 msgstr ""
 
-#: builtin/revert.c:110
+#: builtin/revert.c:112
 msgid "program error"
 msgstr ""
 
-#: builtin/revert.c:195
+#: builtin/revert.c:197
 msgid "revert failed"
 msgstr ""
 
-#: builtin/revert.c:210
+#: builtin/revert.c:212
 msgid "cherry-pick failed"
 msgstr ""
 
@@ -8839,11 +8831,11 @@ msgstr ""
 msgid "shorten ref output"
 msgstr ""
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
 msgid "reason"
 msgstr ""
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
 msgid "reason of the update"
 msgstr ""
 
@@ -8866,32 +8858,32 @@ msgstr ""
 msgid "git tag -v <tagname>..."
 msgstr ""
 
-#: builtin/tag.c:60
+#: builtin/tag.c:67
 #, c-format
 msgid "malformed object at '%s'"
 msgstr ""
 
-#: builtin/tag.c:207
+#: builtin/tag.c:239
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr ""
 
-#: builtin/tag.c:212
+#: builtin/tag.c:244
 #, c-format
 msgid "tag '%s' not found."
 msgstr ""
 
-#: builtin/tag.c:227
+#: builtin/tag.c:259
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr ""
 
-#: builtin/tag.c:239
+#: builtin/tag.c:271
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr ""
 
-#: builtin/tag.c:249
+#: builtin/tag.c:281
 #, c-format
 msgid ""
 "\n"
@@ -8899,7 +8891,7 @@ msgid ""
 "Lines starting with '%c' will be ignored.\n"
 msgstr ""
 
-#: builtin/tag.c:253
+#: builtin/tag.c:285
 #, c-format
 msgid ""
 "\n"
@@ -8908,254 +8900,271 @@ msgid ""
 "want to.\n"
 msgstr ""
 
-#: builtin/tag.c:292
+#: builtin/tag.c:324
 msgid "unable to sign the tag"
 msgstr ""
 
-#: builtin/tag.c:294
+#: builtin/tag.c:326
 msgid "unable to write tag file"
 msgstr ""
 
-#: builtin/tag.c:319
+#: builtin/tag.c:351
 msgid "bad object type."
 msgstr ""
 
-#: builtin/tag.c:332
+#: builtin/tag.c:364
 msgid "tag header too big."
 msgstr ""
 
-#: builtin/tag.c:368
+#: builtin/tag.c:400
 msgid "no tag message?"
 msgstr ""
 
-#: builtin/tag.c:374
+#: builtin/tag.c:406
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr ""
 
-#: builtin/tag.c:423
+#: builtin/tag.c:455
 msgid "switch 'points-at' requires an object"
 msgstr ""
 
-#: builtin/tag.c:425
+#: builtin/tag.c:457
 #, c-format
 msgid "malformed object name '%s'"
 msgstr ""
 
-#: builtin/tag.c:445
+#: builtin/tag.c:480
+#, c-format
+msgid "unsupported sort specification %s"
+msgstr ""
+
+#: builtin/tag.c:500
 msgid "list tag names"
 msgstr ""
 
-#: builtin/tag.c:447
+#: builtin/tag.c:502
 msgid "print <n> lines of each tag message"
 msgstr ""
 
-#: builtin/tag.c:449
+#: builtin/tag.c:504
 msgid "delete tags"
 msgstr ""
 
-#: builtin/tag.c:450
+#: builtin/tag.c:505
 msgid "verify tags"
 msgstr ""
 
-#: builtin/tag.c:452
+#: builtin/tag.c:507
 msgid "Tag creation options"
 msgstr ""
 
-#: builtin/tag.c:454
+#: builtin/tag.c:509
 msgid "annotated tag, needs a message"
 msgstr ""
 
-#: builtin/tag.c:456
+#: builtin/tag.c:511
 msgid "tag message"
 msgstr ""
 
-#: builtin/tag.c:458
+#: builtin/tag.c:513
 msgid "annotated and GPG-signed tag"
 msgstr ""
 
-#: builtin/tag.c:462
+#: builtin/tag.c:517
 msgid "use another key to sign the tag"
 msgstr ""
 
-#: builtin/tag.c:463
+#: builtin/tag.c:518
 msgid "replace the tag if exists"
 msgstr ""
 
-#: builtin/tag.c:464
+#: builtin/tag.c:519
 msgid "show tag list in columns"
 msgstr ""
 
-#: builtin/tag.c:466
+#: builtin/tag.c:521
+msgid "sort tags"
+msgstr ""
+
+#: builtin/tag.c:525
 msgid "Tag listing options"
 msgstr ""
 
-#: builtin/tag.c:469
+#: builtin/tag.c:528 builtin/tag.c:534
 msgid "print only tags that contain the commit"
 msgstr ""
 
-#: builtin/tag.c:475
+#: builtin/tag.c:540
 msgid "print only tags of the object"
 msgstr ""
 
-#: builtin/tag.c:501
+#: builtin/tag.c:566
 msgid "--column and -n are incompatible"
 msgstr ""
 
-#: builtin/tag.c:518
+#: builtin/tag.c:578
+msgid "--sort and -n are incompatible"
+msgstr ""
+
+#: builtin/tag.c:585
 msgid "-n option is only allowed with -l."
 msgstr ""
 
-#: builtin/tag.c:520
+#: builtin/tag.c:587
 msgid "--contains option is only allowed with -l."
 msgstr ""
 
-#: builtin/tag.c:522
+#: builtin/tag.c:589
 msgid "--points-at option is only allowed with -l."
 msgstr ""
 
-#: builtin/tag.c:530
+#: builtin/tag.c:597
 msgid "only one -F or -m option is allowed."
 msgstr ""
 
-#: builtin/tag.c:550
+#: builtin/tag.c:617
 msgid "too many params"
 msgstr ""
 
-#: builtin/tag.c:556
+#: builtin/tag.c:623
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr ""
 
-#: builtin/tag.c:561
+#: builtin/tag.c:628
 #, c-format
 msgid "tag '%s' already exists"
 msgstr ""
 
-#: builtin/tag.c:579
+#: builtin/tag.c:646
 #, c-format
 msgid "%s: cannot lock the ref"
 msgstr ""
 
-#: builtin/tag.c:581
+#: builtin/tag.c:648
 #, c-format
 msgid "%s: cannot update the ref"
 msgstr ""
 
-#: builtin/tag.c:583
+#: builtin/tag.c:650
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr ""
 
-#: builtin/update-index.c:402
+#: builtin/unpack-objects.c:483
+msgid "Unpacking objects"
+msgstr ""
+
+#: builtin/update-index.c:399
 msgid "git update-index [options] [--] [<file>...]"
 msgstr ""
 
-#: builtin/update-index.c:720
+#: builtin/update-index.c:748
 msgid "continue refresh even when index needs update"
 msgstr ""
 
-#: builtin/update-index.c:723
+#: builtin/update-index.c:751
 msgid "refresh: ignore submodules"
 msgstr ""
 
-#: builtin/update-index.c:726
+#: builtin/update-index.c:754
 msgid "do not ignore new files"
 msgstr ""
 
-#: builtin/update-index.c:728
+#: builtin/update-index.c:756
 msgid "let files replace directories and vice-versa"
 msgstr ""
 
-#: builtin/update-index.c:730
+#: builtin/update-index.c:758
 msgid "notice files missing from worktree"
 msgstr ""
 
-#: builtin/update-index.c:732
+#: builtin/update-index.c:760
 msgid "refresh even if index contains unmerged entries"
 msgstr ""
 
-#: builtin/update-index.c:735
+#: builtin/update-index.c:763
 msgid "refresh stat information"
 msgstr ""
 
-#: builtin/update-index.c:739
+#: builtin/update-index.c:767
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr ""
 
-#: builtin/update-index.c:743
-msgid "<mode> <object> <path>"
+#: builtin/update-index.c:771
+msgid "<mode>,<object>,<path>"
 msgstr ""
 
-#: builtin/update-index.c:744
+#: builtin/update-index.c:772
 msgid "add the specified entry to the index"
 msgstr ""
 
-#: builtin/update-index.c:748
+#: builtin/update-index.c:776
 msgid "(+/-)x"
 msgstr ""
 
-#: builtin/update-index.c:749
+#: builtin/update-index.c:777
 msgid "override the executable bit of the listed files"
 msgstr ""
 
-#: builtin/update-index.c:753
+#: builtin/update-index.c:781
 msgid "mark files as \"not changing\""
 msgstr ""
 
-#: builtin/update-index.c:756
+#: builtin/update-index.c:784
 msgid "clear assumed-unchanged bit"
 msgstr ""
 
-#: builtin/update-index.c:759
+#: builtin/update-index.c:787
 msgid "mark files as \"index-only\""
 msgstr ""
 
-#: builtin/update-index.c:762
+#: builtin/update-index.c:790
 msgid "clear skip-worktree bit"
 msgstr ""
 
-#: builtin/update-index.c:765
+#: builtin/update-index.c:793
 msgid "add to index only; do not add content to object database"
 msgstr ""
 
-#: builtin/update-index.c:767
+#: builtin/update-index.c:795
 msgid "remove named paths even if present in worktree"
 msgstr ""
 
-#: builtin/update-index.c:769
+#: builtin/update-index.c:797
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr ""
 
-#: builtin/update-index.c:771
+#: builtin/update-index.c:799
 msgid "read list of paths to be updated from standard input"
 msgstr ""
 
-#: builtin/update-index.c:775
+#: builtin/update-index.c:803
 msgid "add entries from standard input to the index"
 msgstr ""
 
-#: builtin/update-index.c:779
+#: builtin/update-index.c:807
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr ""
 
-#: builtin/update-index.c:783
+#: builtin/update-index.c:811
 msgid "only update entries that differ from HEAD"
 msgstr ""
 
-#: builtin/update-index.c:787
+#: builtin/update-index.c:815
 msgid "ignore files missing from worktree"
 msgstr ""
 
-#: builtin/update-index.c:790
+#: builtin/update-index.c:818
 msgid "report actions to standard output"
 msgstr ""
 
-#: builtin/update-index.c:792
+#: builtin/update-index.c:820
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr ""
 
-#: builtin/update-index.c:796
+#: builtin/update-index.c:824
 msgid "write index in this format"
 msgstr ""
 
@@ -9171,19 +9180,19 @@ msgstr ""
 msgid "git update-ref [options] --stdin [-z]"
 msgstr ""
 
-#: builtin/update-ref.c:255
+#: builtin/update-ref.c:256
 msgid "delete the reference"
 msgstr ""
 
-#: builtin/update-ref.c:257
+#: builtin/update-ref.c:258
 msgid "update <refname> not the one it points to"
 msgstr ""
 
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:259
 msgid "stdin has NUL-terminated arguments"
 msgstr ""
 
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:260
 msgid "read updates from stdin"
 msgstr ""
 
@@ -9238,23 +9247,23 @@ msgid ""
 "to read about a specific subcommand or concept."
 msgstr ""
 
-#: parse-options.h:146
-msgid "expiry date"
+#: parse-options.h:143
+msgid "expiry-date"
 msgstr ""
 
-#: parse-options.h:161
+#: parse-options.h:158
 msgid "no-op (backward compatibility)"
 msgstr ""
 
-#: parse-options.h:235
+#: parse-options.h:232
 msgid "be more verbose"
 msgstr ""
 
-#: parse-options.h:237
+#: parse-options.h:234
 msgid "be more quiet"
 msgstr ""
 
-#: parse-options.h:243
+#: parse-options.h:240
 msgid "use <n> digits to display SHA-1s"
 msgstr ""
 
@@ -9342,17 +9351,17 @@ msgstr ""
 msgid "Create, list, delete or verify a tag object signed with GPG"
 msgstr ""
 
-#: git-am.sh:50
+#: git-am.sh:52
 msgid "You need to set your committer info first"
 msgstr ""
 
-#: git-am.sh:95
+#: git-am.sh:97
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
 msgstr ""
 
-#: git-am.sh:105
+#: git-am.sh:107
 #, sh-format
 msgid ""
 "When you have resolved this problem, run \"$cmdline --continue\".\n"
@@ -9360,77 +9369,77 @@ msgid ""
 "To restore the original branch and stop patching, run \"$cmdline --abort\"."
 msgstr ""
 
-#: git-am.sh:121
+#: git-am.sh:123
 msgid "Cannot fall back to three-way merge."
 msgstr ""
 
-#: git-am.sh:137
+#: git-am.sh:139
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
 
-#: git-am.sh:139
+#: git-am.sh:141
 msgid "Using index info to reconstruct a base tree..."
 msgstr ""
 
-#: git-am.sh:154
+#: git-am.sh:156
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
 msgstr ""
 
-#: git-am.sh:163
+#: git-am.sh:165
 msgid "Falling back to patching base and 3-way merge..."
 msgstr ""
 
-#: git-am.sh:179
+#: git-am.sh:181
 msgid "Failed to merge in the changes."
 msgstr ""
 
-#: git-am.sh:274
+#: git-am.sh:276
 msgid "Only one StGIT patch series can be applied at once"
 msgstr ""
 
-#: git-am.sh:361
+#: git-am.sh:363
 #, sh-format
 msgid "Patch format $patch_format is not supported."
 msgstr ""
 
-#: git-am.sh:363
+#: git-am.sh:365
 msgid "Patch format detection failed."
 msgstr ""
 
-#: git-am.sh:389
+#: 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 ""
 
-#: git-am.sh:479
+#: git-am.sh:486
 #, sh-format
 msgid "previous rebase directory $dotest still exists but mbox given."
 msgstr ""
 
-#: git-am.sh:484
+#: git-am.sh:491
 msgid "Please make up your mind. --skip or --abort?"
 msgstr ""
 
-#: git-am.sh:520
+#: git-am.sh:527
 #, sh-format
 msgid ""
 "Stray $dotest directory found.\n"
 "Use \"git am --abort\" to remove it."
 msgstr ""
 
-#: git-am.sh:528
+#: git-am.sh:535
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr ""
 
-#: git-am.sh:594
+#: git-am.sh:601
 #, sh-format
 msgid "Dirty index: cannot apply patches (dirty: $files)"
 msgstr ""
 
-#: git-am.sh:698
+#: git-am.sh:705
 #, sh-format
 msgid ""
 "Patch is empty.  Was it split wrong?\n"
@@ -9438,60 +9447,60 @@ msgid ""
 "To restore the original branch and stop patching run \"$cmdline --abort\"."
 msgstr ""
 
-#: git-am.sh:725
+#: git-am.sh:732
 msgid "Patch does not have a valid e-mail address."
 msgstr ""
 
-#: git-am.sh:772
+#: git-am.sh:779
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
 
-#: git-am.sh:776
+#: git-am.sh:783
 msgid "Commit Body is:"
 msgstr ""
 
 #. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
 #. in your translation. The program will only accept English
 #. input at this point.
-#: git-am.sh:783
+#: git-am.sh:790
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
 msgstr ""
 
-#: git-am.sh:819
+#: git-am.sh:826
 #, sh-format
 msgid "Applying: $FIRSTLINE"
 msgstr ""
 
-#: git-am.sh:840
+#: 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 ""
 
-#: git-am.sh:848
+#: git-am.sh:855
 msgid ""
 "You still have unmerged paths in your index\n"
 "did you forget to use 'git add'?"
 msgstr ""
 
-#: git-am.sh:864
+#: git-am.sh:871
 msgid "No changes -- Patch already applied."
 msgstr ""
 
-#: git-am.sh:874
+#: git-am.sh:881
 #, sh-format
 msgid "Patch failed at $msgnum $FIRSTLINE"
 msgstr ""
 
-#: git-am.sh:877
+#: git-am.sh:884
 #, sh-format
 msgid ""
 "The copy of the patch that failed is found in:\n"
 "   $dotest/patch"
 msgstr ""
 
-#: git-am.sh:895
+#: git-am.sh:902
 msgid "applying to an empty history"
 msgstr ""
 
@@ -9557,8 +9566,6 @@ msgstr ""
 msgid "'git bisect bad' can take only one argument."
 msgstr ""
 
-#. have bad but not good.  we could bisect although
-#. this is less optimum.
 #: git-bisect.sh:273
 msgid "Warning: bisecting only with a bad commit."
 msgstr ""
@@ -9650,15 +9657,11 @@ msgstr ""
 msgid "Pull is not possible because you have unmerged files."
 msgstr ""
 
-#: git-pull.sh:223
+#: git-pull.sh:247
 msgid "updating an unborn branch with changes added to the index"
 msgstr ""
 
-#. The fetch involved updating the current branch.
-#. The working tree and the index file is still based on the
-#. $orig_head commit, but we are merging into $curr_head.
-#. First update the working tree to match $curr_head.
-#: git-pull.sh:247
+#: git-pull.sh:271
 #, sh-format
 msgid ""
 "Warning: fetch updated the current branch head.\n"
@@ -9666,15 +9669,15 @@ msgid ""
 "Warning: commit $orig_head."
 msgstr ""
 
-#: git-pull.sh:272
+#: git-pull.sh:296
 msgid "Cannot merge multiple branches into empty head"
 msgstr ""
 
-#: git-pull.sh:276
+#: git-pull.sh:300
 msgid "Cannot rebase onto multiple branches"
 msgstr ""
 
-#: git-rebase.sh:55
+#: 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"
@@ -9682,58 +9685,58 @@ msgid ""
 "\"."
 msgstr ""
 
-#: git-rebase.sh:158
+#: git-rebase.sh:164
 msgid "Applied autostash."
 msgstr ""
 
-#: git-rebase.sh:161
+#: git-rebase.sh:167
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr ""
 
-#: git-rebase.sh:162
+#: git-rebase.sh:168
 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:201
+#: git-rebase.sh:207
 msgid "The pre-rebase hook refused to rebase."
 msgstr ""
 
-#: git-rebase.sh:206
+#: git-rebase.sh:212
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr ""
 
-#: git-rebase.sh:346
+#: git-rebase.sh:350
 msgid "The --exec option must be used with the --interactive option"
 msgstr ""
 
-#: git-rebase.sh:351
+#: git-rebase.sh:355
 msgid "No rebase in progress?"
 msgstr ""
 
-#: git-rebase.sh:362
+#: git-rebase.sh:366
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 
-#: git-rebase.sh:369
+#: git-rebase.sh:373
 msgid "Cannot read HEAD"
 msgstr ""
 
-#: git-rebase.sh:372
+#: git-rebase.sh:376
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
 msgstr ""
 
-#: git-rebase.sh:390
+#: git-rebase.sh:394
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr ""
 
-#: git-rebase.sh:409
+#: git-rebase.sh:413
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -9746,65 +9749,64 @@ msgid ""
 "valuable there."
 msgstr ""
 
-#: git-rebase.sh:456
+#: git-rebase.sh:464
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr ""
 
-#: git-rebase.sh:480
+#: git-rebase.sh:488
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr ""
 
-#: git-rebase.sh:483 git-rebase.sh:487
+#: git-rebase.sh:491 git-rebase.sh:495
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr ""
 
-#: git-rebase.sh:492
+#: git-rebase.sh:500
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr ""
 
-#: git-rebase.sh:515
+#: git-rebase.sh:523
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr ""
 
-#: git-rebase.sh:548
+#: git-rebase.sh:556
 msgid "Cannot autostash"
 msgstr ""
 
-#: git-rebase.sh:553
+#: git-rebase.sh:561
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr ""
 
-#: git-rebase.sh:557
+#: git-rebase.sh:565
 msgid "Please commit or stash them."
 msgstr ""
 
-#: git-rebase.sh:577
+#: git-rebase.sh:585
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr ""
 
-#: git-rebase.sh:581
+#: git-rebase.sh:589
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr ""
 
-#: git-rebase.sh:592
+#: git-rebase.sh:600
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr ""
 
-#. Detach HEAD and reset the tree
-#: git-rebase.sh:601
+#: git-rebase.sh:609
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 
-#: git-rebase.sh:611
+#: git-rebase.sh:619
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr ""
@@ -9923,21 +9925,21 @@ msgstr ""
 msgid "Index was not unstashed."
 msgstr ""
 
-#: git-stash.sh:523
+#: git-stash.sh:529
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr ""
 
-#: git-stash.sh:524
+#: git-stash.sh:530
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr ""
 
-#: git-stash.sh:531
+#: git-stash.sh:537
 msgid "No branch name specified"
 msgstr ""
 
-#: git-stash.sh:603
+#: git-stash.sh:609
 msgid "(To restore them type \"git stash apply\")"
 msgstr ""
 
@@ -9951,31 +9953,31 @@ msgstr ""
 msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:281
+#: git-submodule.sh:287
 #, sh-format
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
 msgstr ""
 
-#: git-submodule.sh:293
+#: git-submodule.sh:299
 #, sh-format
 msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
 msgstr ""
 
-#: git-submodule.sh:403
+#: git-submodule.sh:409
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 
-#: git-submodule.sh:413
+#: git-submodule.sh:419
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr ""
 
-#: git-submodule.sh:430
+#: git-submodule.sh:436
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr ""
 
-#: git-submodule.sh:434
+#: git-submodule.sh:440
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -9983,236 +9985,235 @@ msgid ""
 "Use -f if you really want to add it."
 msgstr ""
 
-#: git-submodule.sh:452
+#: git-submodule.sh:458
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr ""
 
-#: git-submodule.sh:454
+#: git-submodule.sh:460
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr ""
 
-#: git-submodule.sh:462
+#: git-submodule.sh:468
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 
-#: git-submodule.sh:464
+#: git-submodule.sh:470
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
 msgstr ""
 
-#: git-submodule.sh:466
+#: git-submodule.sh:472
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
 msgstr ""
 
-#: git-submodule.sh:467
+#: git-submodule.sh:473
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
 "option."
 msgstr ""
 
-#: git-submodule.sh:469
+#: git-submodule.sh:475
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr ""
 
-#: git-submodule.sh:481
+#: git-submodule.sh:487
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:486
+#: git-submodule.sh:492
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:495
+#: git-submodule.sh:501
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:539
+#: git-submodule.sh:545
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:559
+#: git-submodule.sh:565
 #, sh-format
 msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
 msgstr ""
 
-#: git-submodule.sh:605
+#: git-submodule.sh:611
 #, sh-format
 msgid "No url found for submodule path '$displaypath' in .gitmodules"
 msgstr ""
 
-#: git-submodule.sh:614
+#: git-submodule.sh:620
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:616
+#: git-submodule.sh:622
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:633
+#: git-submodule.sh:639
 #, sh-format
 msgid "Failed to register update mode for submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:671
+#: git-submodule.sh:677
 #, sh-format
 msgid "Use '.' if you really want to deinitialize all submodules"
 msgstr ""
 
-#: git-submodule.sh:688
+#: git-submodule.sh:694
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr ""
 
-#: git-submodule.sh:689
+#: git-submodule.sh:695
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr ""
 
-#: git-submodule.sh:695
+#: git-submodule.sh:701
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
 "discard them"
 msgstr ""
 
-#: git-submodule.sh:698
+#: git-submodule.sh:704
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:699
+#: git-submodule.sh:705
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:702
+#: git-submodule.sh:708
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:711
+#: git-submodule.sh:717
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:834
+#: git-submodule.sh:833
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
 "Maybe you want to use 'update --init'?"
 msgstr ""
 
-#: git-submodule.sh:847
+#: git-submodule.sh:846
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:856
+#: git-submodule.sh:855
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:880
+#: git-submodule.sh:879
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr ""
 
+#: git-submodule.sh:893
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+msgstr ""
+
 #: git-submodule.sh:894
 #, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr ""
+
+#: git-submodule.sh:898
+#, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:895
+#: git-submodule.sh:899
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr ""
 
-#: git-submodule.sh:900
+#: git-submodule.sh:904
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:901
+#: git-submodule.sh:905
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr ""
 
-#: git-submodule.sh:906
+#: git-submodule.sh:910
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule  path '$prefix$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:907
+#: git-submodule.sh:911
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr ""
 
-#: git-submodule.sh:912
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
-msgstr ""
-
-#: git-submodule.sh:913
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr ""
-
-#: git-submodule.sh:940
+#: git-submodule.sh:941
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr ""
 
-#: git-submodule.sh:1048
+#: git-submodule.sh:1049
 msgid "The --cached option cannot be used with the --files option"
 msgstr ""
 
-#. unexpected type
-#: git-submodule.sh:1096
+#: git-submodule.sh:1097
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr ""
 
-#: git-submodule.sh:1116
+#: git-submodule.sh:1117
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr ""
 
-#: git-submodule.sh:1119
+#: git-submodule.sh:1120
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr ""
 
-#: git-submodule.sh:1122
+#: git-submodule.sh:1123
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 
-#: git-submodule.sh:1147
+#: git-submodule.sh:1148
 msgid "blob"
 msgstr ""
 
-#: git-submodule.sh:1261
+#: git-submodule.sh:1262
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:1325
+#: git-submodule.sh:1326
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr ""
index 8c3c59aa3b7765be33cbc6f3a0e8023a2384f95c..f1658aad5e1393b231b5e7867c411d2df0593110 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -5,10 +5,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: git 1.8.4\n"
+"Project-Id-Version: git 2.0.0\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-02-01 08:06+0800\n"
-"PO-Revision-Date: 2014-02-02 17:21+0100\n"
+"POT-Creation-Date: 2014-04-19 12:50+0800\n"
+"PO-Revision-Date: 2014-05-07 07:04+0100\n"
 "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
 "Language: sv\n"
@@ -17,16 +17,12 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: advice.c:57
+#: advice.c:55
 #, c-format
 msgid "hint: %.*s\n"
 msgstr "tips: %.*s\n"
 
-#.
-#. * Message used both when 'git commit' fails and when
-#. * other commands doing a merge do.
-#.
-#: advice.c:87
+#: advice.c:85
 msgid ""
 "Fix them up in the work tree,\n"
 "and then use 'git add/rm <file>' as\n"
@@ -57,76 +53,76 @@ msgstr ""
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <arkiv> [--exec <kmd>] --list"
 
-#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328
+#: archive.c:243 builtin/add.c:136 builtin/add.c:428 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:327
+#: archive.c:328
 msgid "fmt"
 msgstr "fmt"
 
-#: archive.c:327
+#: archive.c:328
 msgid "archive format"
 msgstr "arkivformat"
 
-#: archive.c:328 builtin/log.c:1193
+#: archive.c:329 builtin/log.c:1193
 msgid "prefix"
 msgstr "prefix"
 
-#: archive.c:329
+#: archive.c:330
 msgid "prepend prefix to each pathname in the archive"
 msgstr "lägg till prefix till varje sökväg i arkivet"
 
-#: archive.c:330 builtin/archive.c:88 builtin/blame.c:2265
-#: builtin/blame.c:2266 builtin/config.c:58 builtin/fast-export.c:680
-#: builtin/fast-export.c:682 builtin/grep.c:716 builtin/hash-object.c:77
-#: builtin/ls-files.c:486 builtin/ls-files.c:489 builtin/notes.c:408
-#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:154
+#: 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
 msgid "file"
 msgstr "fil"
 
-#: archive.c:331 builtin/archive.c:89
+#: archive.c:332 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr "skriv arkivet till filen"
 
-#: archive.c:333
+#: archive.c:334
 msgid "read .gitattributes in working directory"
 msgstr "läs .gitattributes i arbetskatalogen"
 
-#: archive.c:334
+#: archive.c:335
 msgid "report archived files on stderr"
 msgstr "rapportera arkiverade filer på standard fel"
 
-#: archive.c:335
+#: archive.c:336
 msgid "store only"
 msgstr "endast spara"
 
-#: archive.c:336
+#: archive.c:337
 msgid "compress faster"
 msgstr "komprimera snabbare"
 
-#: archive.c:344
+#: archive.c:345
 msgid "compress better"
 msgstr "komprimera bättre"
 
-#: archive.c:347
+#: archive.c:348
 msgid "list supported archive formats"
 msgstr "visa understödda arkivformat"
 
-#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
 msgid "repo"
 msgstr "arkiv"
 
-#: archive.c:350 builtin/archive.c:91
+#: archive.c:351 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "hämta arkivet från fjärrarkivet <arkiv>"
 
-#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487
+#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
 msgid "command"
 msgstr "kommando"
 
-#: archive.c:352 builtin/archive.c:93
+#: archive.c:353 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr "sökväg till kommandot git-upload-archive på fjärren"
 
@@ -143,83 +139,78 @@ msgstr ""
 msgid "Not setting branch %s as its own upstream."
 msgstr "Ställer inte in grenen %s som sin egen uppströmsgren."
 
-#: branch.c:82
+#: branch.c:83
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr ""
 "Grenen %s ställdes in att spåra fjärrgrenen %s från %s genom ombasering."
 
-#: branch.c:83
+#: branch.c:84
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
 msgstr "Grenen %s ställdes in att spåra fjärrgrenen %s från %s."
 
-#: branch.c:87
+#: branch.c:88
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr "Grenen %s ställdes in att spåra den lokala grenen %s genom ombasering."
 
-#: branch.c:88
+#: branch.c:89
 #, c-format
 msgid "Branch %s set up to track local branch %s."
 msgstr "Grenen %s ställdes in att spåra den lokala grenen %s."
 
-#: branch.c:92
+#: branch.c:94
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr "Grenen %s ställdes in att spåra fjärreferensen %s genom ombasering."
 
-#: branch.c:93
+#: branch.c:95
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
 msgstr "Grenen %s ställdes in att spåra fjärreferensen %s."
 
-#: branch.c:97
+#: branch.c:99
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
 "Grenen %s ställdes in att spåra den lokala referensen %s genom ombasering."
 
-#: branch.c:98
+#: branch.c:100
 #, c-format
 msgid "Branch %s set up to track local ref %s."
 msgstr "Grenen %s ställdes in att spåra den lokala referensen %s."
 
-#: branch.c:118
-#, c-format
-msgid "Tracking not set up: name too long: %s"
-msgstr "Spårning har inte ställts in: namnet för långt: %s"
-
-#: branch.c:137
+#: branch.c:133
 #, c-format
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr "Spårar inte: tvetydig information för referensen %s"
 
-#: branch.c:182
+#: branch.c:178
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "\"%s\" är inte ett giltigt grennamn."
 
-#: branch.c:187
+#: branch.c:183
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "Det finns redan en gren som heter \"%s\""
 
-#: branch.c:195
+#: branch.c:191
 msgid "Cannot force update the current branch."
 msgstr "Kan inte tvinga uppdatering av aktuell gren."
 
-#: branch.c:215
+#: branch.c:211
 #, 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:217
+#: branch.c:213
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "den efterfrågade uppströmsgrenen \"%s\" finns inte"
 
-#: branch.c:219
+#: branch.c:215
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -239,113 +230,113 @@ msgstr ""
 "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:264
+#: branch.c:260
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "Objektnamnet är inte giltigt: \"%s\"."
 
-#: branch.c:284
+#: branch.c:280
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "Objektnamnet är tvetydigt: \"%s\"."
 
-#: branch.c:289
+#: branch.c:285
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "Avgreningspunkten är inte giltig: \"%s\""
 
-#: branch.c:295
+#: branch.c:291
 msgid "Failed to lock ref for update"
 msgstr "Misslyckades låsa referens för uppdatering"
 
-#: branch.c:313
+#: branch.c:309
 msgid "Failed to write ref"
 msgstr "Misslyckades skriva referens"
 
-#: bundle.c:37
+#: bundle.c:33
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
 msgstr "'%s' ser inte ut som en v2-bundle-fil"
 
-#: bundle.c:64
+#: bundle.c:60
 #, c-format
 msgid "unrecognized header: %s%s (%d)"
 msgstr "okänt huvud: %s%s (%d)"
 
-#: bundle.c:90 builtin/commit.c:706
+#: bundle.c:86 builtin/commit.c:706
 #, c-format
 msgid "could not open '%s'"
 msgstr "kunde inte öppna \"%s\""
 
-#: bundle.c:141
+#: bundle.c:138
 msgid "Repository lacks these prerequisite commits:"
 msgstr "Arkivet saknar dessa nödvändiga incheckningar:"
 
-#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332
+#: 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
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "misslyckades skapa revisionstraversering"
 
-#: bundle.c:187
+#: bundle.c:184
 #, c-format
 msgid "The bundle contains this ref:"
 msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "Paketet (bundlen) denna referens:"
-msgstr[1] "Paketet (bundlen) dessa %d referenser:"
+msgstr[0] "Paketet (bundlen) innehåller denna referens:"
+msgstr[1] "Paketet (bundlen) innehåller dessa %d referenser:"
 
-#: bundle.c:194
+#: bundle.c:191
 msgid "The bundle records a complete history."
 msgstr "Paketet (bundlen) beskriver en komplett historik."
 
-#: bundle.c:196
+#: bundle.c:193
 #, 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:296
+#: bundle.c:293
 msgid "rev-list died"
 msgstr "rev-list dog"
 
-#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "okänt argument: %s"
 
-#: bundle.c:337
+#: bundle.c:334
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "referensen \"%s\" exkluderas av argumenten till rev-list"
 
-#: bundle.c:382
+#: bundle.c:379
 msgid "Refusing to create empty bundle."
 msgstr "Vägrar skapa ett tomt paket (bundle)."
 
-#: bundle.c:398
+#: bundle.c:395
 msgid "Could not spawn pack-objects"
 msgstr "Kunde inte starta pack-objects"
 
-#: bundle.c:416
+#: bundle.c:413
 msgid "pack-objects died"
 msgstr "pack-objects misslyckades"
 
-#: bundle.c:419
+#: bundle.c:416
 #, c-format
 msgid "cannot create '%s'"
 msgstr "kan inte skapa \"%s\""
 
-#: bundle.c:441
+#: bundle.c:438
 msgid "index-pack died"
 msgstr "index-pack dog"
 
-#: commit.c:53
+#: commit.c:54
 #, c-format
 msgid "could not parse %s"
 msgstr "kunde inte tolka %s"
 
-#: commit.c:55
+#: commit.c:56
 #, c-format
 msgid "%s %s is not a commit!"
 msgstr "%s %s är inte en incheckning!"
@@ -421,6 +412,7 @@ msgid_plural "%lu years"
 msgstr[0] "%lu år"
 msgstr[1] "%lu år"
 
+#. TRANSLATORS: "%s" is "<n> years"
 #: date.c:149
 #, c-format
 msgid "%s, %lu month ago"
@@ -440,6 +432,10 @@ msgstr[1] "%lu år sedan"
 msgid "failed to read orderfile '%s'"
 msgstr "kunde inte läsa orderfilen \"%s\""
 
+#: diffcore-rename.c:517
+msgid "Performing inexact rename detection"
+msgstr "Utför onöjaktig namnbytesdetektering"
+
 #: diff.c:113
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
@@ -464,7 +460,7 @@ msgstr ""
 "Hittade fel i konfigurationsvariabeln \"diff.dirstat\":\n"
 "%s"
 
-#: diff.c:3509
+#: diff.c:3495
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -473,7 +469,7 @@ msgstr ""
 "Misslyckades tolka argument till flaggan --dirstat/-X;\n"
 "%s"
 
-#: diff.c:3523
+#: diff.c:3509
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Misslyckades tolka argument till flaggan --submodule: \"%s\""
@@ -500,35 +496,35 @@ msgstr "kunde inte skapa temporära filen \"%s\": %s"
 msgid "failed writing detached signature to '%s': %s"
 msgstr "misslyckades skriva fristående signatur till \"%s\": %s"
 
-#: grep.c:1695
+#: grep.c:1698
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "\"%s\" kunde inte läsa %s"
 
-#: grep.c:1712
+#: grep.c:1715
 #, c-format
 msgid "'%s': %s"
 msgstr "\"%s\": %s"
 
-#: grep.c:1723
+#: grep.c:1726
 #, c-format
 msgid "'%s': short read %s"
 msgstr "\"%s\": kort läsning %s"
 
-#: help.c:210
+#: help.c:209
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "git-kommandon tillgängliga i \"%s\""
 
-#: help.c:217
+#: help.c:216
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "git-kommandon från andra platser i din $PATH"
 
-#: help.c:233
+#: help.c:232
 msgid "The most commonly used git commands are:"
 msgstr "De mest använda git-kommandona är:"
 
-#: help.c:290
+#: help.c:289
 #, c-format
 msgid ""
 "'%s' appears to be a git command, but we were not\n"
@@ -537,11 +533,11 @@ msgstr ""
 "\"%s\" verkar vara ett git-kommando, men vi kan inte\n"
 "köra det. Kanske git-%s är trasigt?"
 
-#: help.c:347
+#: help.c:346
 msgid "Uh oh. Your system reports no Git commands at all."
 msgstr "Oj då. Ditt system rapporterar inga Git-kommandon alls."
 
-#: help.c:369
+#: help.c:368
 #, c-format
 msgid ""
 "WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -550,17 +546,17 @@ msgstr ""
 "VARNING: Du anropade ett Git-kommando vid namn \"%s\", som inte finns.\n"
 "Fortsätter under förutsättningen att du menade \"%s\""
 
-#: help.c:374
+#: help.c:373
 #, c-format
 msgid "in %0.1f seconds automatically..."
 msgstr "automatiskt om %0.1f sekunder..."
 
-#: help.c:381
+#: help.c:380
 #, c-format
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git: \"%s\" är inte ett git-kommando. Se \"git --help\"."
 
-#: help.c:385 help.c:444
+#: help.c:384 help.c:443
 msgid ""
 "\n"
 "Did you mean this?"
@@ -574,7 +570,7 @@ msgstr[1] ""
 "\n"
 "Menade du ett av dessa?"
 
-#: help.c:440
+#: help.c:439
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %s - %s"
@@ -583,7 +579,7 @@ msgstr "%s: %s - %s"
 msgid "failed to read the cache"
 msgstr "misslyckads läsa cachen"
 
-#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559
+#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
 #: builtin/clone.c:661
 msgid "unable to write new index file"
 msgstr "kunde inte skriva ny indexfil"
@@ -593,75 +589,73 @@ msgstr "kunde inte skriva ny indexfil"
 msgid "(bad commit)\n"
 msgstr "(felaktig incheckning)\n"
 
-#: merge-recursive.c:206
+#: merge-recursive.c:208
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "addinfo_cache misslyckades för sökvägen \"%s\""
 
-#: merge-recursive.c:269
+#: merge-recursive.c:271
 msgid "error building trees"
 msgstr "fel vid byggande av träd"
 
-#: merge-recursive.c:673
+#: merge-recursive.c:675
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "misslyckades skapa sökvägen \"%s\"%s"
 
-#: merge-recursive.c:684
+#: merge-recursive.c:686
 #, 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"
 
-#. something else exists
-#. .. but not some other error (who really cares what?)
-#: merge-recursive.c:698 merge-recursive.c:719
+#: merge-recursive.c:700 merge-recursive.c:721
 msgid ": perhaps a D/F conflict?"
 msgstr ": kanske en K/F-konflikt?"
 
-#: merge-recursive.c:709
+#: merge-recursive.c:711
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "vägrar förlora ospårad fil vid \"%s\""
 
-#: merge-recursive.c:749
+#: merge-recursive.c:751
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "kan inte läsa objektet %s: \"%s\""
 
-#: merge-recursive.c:751
+#: merge-recursive.c:753
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "blob förväntades för %s \"%s\""
 
-#: merge-recursive.c:774 builtin/clone.c:317
+#: merge-recursive.c:776 builtin/clone.c:317
 #, c-format
 msgid "failed to open '%s'"
 msgstr "misslyckades öppna \"%s\""
 
-#: merge-recursive.c:782
+#: merge-recursive.c:784
 #, c-format
 msgid "failed to symlink '%s'"
-msgstr "misslyckades ta skapa symboliska länken \"%s\""
+msgstr "misslyckades skapa symboliska länken \"%s\""
 
-#: merge-recursive.c:785
+#: merge-recursive.c:787
 #, 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:923
+#: merge-recursive.c:925
 msgid "Failed to execute internal merge"
 msgstr "Misslyckades exekvera intern sammanslagning"
 
-#: merge-recursive.c:927
+#: merge-recursive.c:929
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Kunde inte lägga till %s till databasen"
 
-#: merge-recursive.c:943
+#: merge-recursive.c:945
 msgid "unsupported object type in the tree"
 msgstr "objekttyp som ej stöds upptäcktes i trädet"
 
-#: merge-recursive.c:1022 merge-recursive.c:1036
+#: merge-recursive.c:1024 merge-recursive.c:1038
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -670,7 +664,7 @@ msgstr ""
 "KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad "
 "i trädet."
 
-#: merge-recursive.c:1028 merge-recursive.c:1041
+#: merge-recursive.c:1030 merge-recursive.c:1043
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -679,20 +673,20 @@ msgstr ""
 "KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad "
 "i trädet vid %s."
 
-#: merge-recursive.c:1082
+#: merge-recursive.c:1084
 msgid "rename"
 msgstr "namnbyte"
 
-#: merge-recursive.c:1082 wt-status.c:283
+#: merge-recursive.c:1084
 msgid "renamed"
 msgstr "namnbytt"
 
-#: merge-recursive.c:1138
+#: merge-recursive.c:1140
 #, 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:1160
+#: merge-recursive.c:1162
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -701,144 +695,144 @@ msgstr ""
 "KONFLIKT (namnbyte/namnbyte): Namnbyte \"%s\"->\"%s\" på grenen \"%s\" "
 "namnbyte \"%s\"->\"%s\" i \"%s\"%s"
 
-#: merge-recursive.c:1165
+#: merge-recursive.c:1167
 msgid " (left unresolved)"
 msgstr " (lämnad olöst)"
 
-#: merge-recursive.c:1219
+#: merge-recursive.c:1221
 #, 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:1249
+#: merge-recursive.c:1251
 #, 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:1448
+#: merge-recursive.c:1450
 #, 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:1458
+#: merge-recursive.c:1460
 #, c-format
 msgid "Adding merged %s"
 msgstr "Lägger till sammanslagen %s"
 
-#: merge-recursive.c:1463 merge-recursive.c:1661
+#: merge-recursive.c:1465 merge-recursive.c:1663
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Lägger till som %s iställer"
 
-#: merge-recursive.c:1514
+#: merge-recursive.c:1516
 #, c-format
 msgid "cannot read object %s"
 msgstr "kan inte läsa objektet %s"
 
-#: merge-recursive.c:1517
+#: merge-recursive.c:1519
 #, c-format
 msgid "object %s is not a blob"
 msgstr "objektet %s är inte en blob"
 
-#: merge-recursive.c:1565
+#: merge-recursive.c:1567
 msgid "modify"
 msgstr "ändra"
 
-#: merge-recursive.c:1565 wt-status.c:281
+#: merge-recursive.c:1567
 msgid "modified"
 msgstr "ändrad"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1577
 msgid "content"
 msgstr "innehåll"
 
-#: merge-recursive.c:1582
+#: merge-recursive.c:1584
 msgid "add/add"
 msgstr "tillägg/tillägg"
 
-#: merge-recursive.c:1616
+#: merge-recursive.c:1618
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "Hoppade över %s (sammanslagen samma som befintlig)"
 
-#: merge-recursive.c:1630
+#: merge-recursive.c:1632
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Slår ihop %s automatiskt"
 
-#: merge-recursive.c:1634 git-submodule.sh:1148
+#: merge-recursive.c:1636 git-submodule.sh:1149
 msgid "submodule"
 msgstr "undermodul"
 
-#: merge-recursive.c:1635
+#: merge-recursive.c:1637
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "KONFLIKT (%s): Sammanslagningskonflikt i %s"
 
-#: merge-recursive.c:1725
+#: merge-recursive.c:1727
 #, c-format
 msgid "Removing %s"
 msgstr "Tar bort %s"
 
-#: merge-recursive.c:1750
+#: merge-recursive.c:1752
 msgid "file/directory"
 msgstr "fil/katalog"
 
-#: merge-recursive.c:1756
+#: merge-recursive.c:1758
 msgid "directory/file"
 msgstr "katalog/fil"
 
-#: merge-recursive.c:1761
+#: merge-recursive.c:1763
 #, 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:1771
+#: merge-recursive.c:1773
 #, c-format
 msgid "Adding %s"
 msgstr "Lägger till %s"
 
-#: merge-recursive.c:1788
+#: merge-recursive.c:1790
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Ödesdigert sammanslagningsfel, borde inte inträffa."
 
-#: merge-recursive.c:1807
+#: merge-recursive.c:1809
 msgid "Already up-to-date!"
 msgstr "Redan à jour!"
 
-#: merge-recursive.c:1816
+#: merge-recursive.c:1818
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "sammanslagning av träden %s och %s misslyckades"
 
-#: merge-recursive.c:1846
+#: merge-recursive.c:1848
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "Obehandlad sökväg??? %s"
 
-#: merge-recursive.c:1891
+#: merge-recursive.c:1893
 msgid "Merging:"
 msgstr "Slår ihop:"
 
-#: merge-recursive.c:1904
+#: merge-recursive.c:1906
 #, 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:1941
+#: merge-recursive.c:1943
 msgid "merge returned no commit"
 msgstr "sammanslagningen returnerade ingen incheckning"
 
-#: merge-recursive.c:1998
+#: merge-recursive.c:2000
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Kunde inte tolka objektet \"%s\""
 
-#: merge-recursive.c:2010 builtin/merge.c:665
+#: merge-recursive.c:2012 builtin/merge.c:668
 msgid "Unable to write index."
 msgstr "Kunde inte skriva indexet."
 
@@ -863,33 +857,33 @@ msgstr "Vägrar skriva över anteckningar i %s (utanför refs/notes/)"
 msgid "Bad %s value: '%s'"
 msgstr "Felaktigt värde på %s: \"%s\""
 
-#: object.c:202
+#: object.c:229
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "kunde inte tolka objektet: %s"
 
-#: parse-options.c:537
+#: parse-options.c:532
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:555
+#: parse-options.c:550
 #, 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:559
+#: parse-options.c:554
 #, c-format
 msgid "   or: %s"
 msgstr "     eller: %s"
 
-#: parse-options.c:562
+#: parse-options.c:557
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:596
+#: parse-options.c:591
 msgid "-NUM"
 msgstr "-TAL"
 
@@ -940,11 +934,6 @@ msgstr "%s: \"%s\" är utanför arkivet"
 msgid "Pathspec '%s' is in submodule '%.*s'"
 msgstr "Sökvägsangivelsen \"%s\" är i undermodulen \"%.*s\""
 
-#.
-#. * We may want to substitute "this command" with a command
-#. * name. E.g. when add--interactive dies when running
-#. * "checkout -p"
-#.
 #: pathspec.c:353
 #, c-format
 msgid "%s: pathspec magic not supported by this command: %s"
@@ -963,56 +952,73 @@ msgstr ""
 "Ingenting att exkludera från med :(exkludera)-mönster.\n"
 "Glömde du kanske att antingen lägga till \":/\" eller \".\"?"
 
-#: remote.c:753
+#: progress.c:224
+msgid "done"
+msgstr "klart"
+
+#: read-cache.c:1238
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"index.version satt, men värdet är ogiltigt.\n"
+"Använder version %i"
+
+#: read-cache.c:1248
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"GIT_INDEX_VERSION satt, men värdet är ogiltigt.\n"
+"Använder version %i"
+
+#: remote.c:758
 #, 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:757
+#: remote.c:762
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s spårar vanligtvis %s, inte %s"
 
-#: remote.c:761
+#: remote.c:766
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s spårar både %s och %s"
 
-#.
-#. * This last possibility doesn't occur because
-#. * FETCH_HEAD_IGNORE entries always appear at
-#. * the end of the list.
-#.
-#: remote.c:769
+#: remote.c:774
 msgid "Internal error"
 msgstr "Internt fel"
 
-#: remote.c:1871
+#: remote.c:1948
 #, 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:1875
+#: remote.c:1952
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (använd \"git branch --unset-upstream\" för att rätta)\n"
 
-#: remote.c:1878
+#: remote.c:1955
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "Din gren är à jour med \"%s\".\n"
 
-#: remote.c:1882
+#: remote.c:1959
 #, 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:1888
+#: remote.c:1965
 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:1891
+#: remote.c:1968
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1022,11 +1028,11 @@ msgstr[0] ""
 msgstr[1] ""
 "Din gren ligger efter \"%s\" med %d incheckningar, och kan snabbspolas.\n"
 
-#: remote.c:1899
+#: remote.c:1976
 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:1902
+#: remote.c:1979
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1041,7 +1047,7 @@ msgstr[1] ""
 "Din gren och \"%s\" har divergerat,\n"
 "och har %d respektive %d olika incheckningar.\n"
 
-#: remote.c:1912
+#: remote.c:1989
 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"
 
@@ -1054,14 +1060,14 @@ msgstr "misslyckades öppna /dev/null"
 msgid "dup2(%d,%d) failed"
 msgstr "dup2(%d,%d) misslyckades"
 
-#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896
-#: builtin/merge.c:1006 builtin/merge.c:1016
+#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
+#: builtin/merge.c:1009 builtin/merge.c:1019
 #, 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:786
-#: builtin/merge.c:1008 builtin/merge.c:1021
+#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
+#: builtin/merge.c:1011 builtin/merge.c:1024
 #, c-format
 msgid "Could not write to '%s'"
 msgstr "Kunde inte skriva till \"%s\""
@@ -1084,7 +1090,7 @@ msgstr ""
 "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:870 sequencer.c:953
+#: sequencer.c:245 sequencer.c:879 sequencer.c:962
 #, c-format
 msgid "Could not write to %s"
 msgstr "Kunde inte skriva till %s"
@@ -1120,184 +1126,184 @@ msgstr "Kunde inte bestämma HEAD:s incheckning\n"
 msgid "Unable to update cache tree\n"
 msgstr "Kan inte uppdatera cacheträd\n"
 
-#: sequencer.c:423
+#: sequencer.c:430
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr "Kunde inte tolka incheckningen %s\n"
 
-#: sequencer.c:428
+#: sequencer.c:435
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr "Kunde inte tolka föräldraincheckningen %s\n"
 
-#: sequencer.c:494
+#: sequencer.c:501
 msgid "Your index file is unmerged."
 msgstr "Din indexfil har inte slagits ihop."
 
-#: sequencer.c:513
+#: sequencer.c:520
 #, 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:521
+#: sequencer.c:528
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr "Incheckning %s har inte förälder %d"
 
-#: sequencer.c:525
+#: sequencer.c:532
 #, 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:538
+#: sequencer.c:545
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s: kan inte tolka föräldraincheckningen %s"
 
-#: sequencer.c:542
+#: sequencer.c:549
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr "Kan inte hämta incheckningsmeddelande för %s"
 
-#: sequencer.c:628
+#: sequencer.c:635
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "kunde inte ångra %s... %s"
 
-#: sequencer.c:629
+#: sequencer.c:636
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "kunde inte tillämpa %s... %s"
 
-#: sequencer.c:665
+#: sequencer.c:672
 msgid "empty commit set passed"
 msgstr "den angivna uppsättningen incheckningar är tom"
 
-#: sequencer.c:673
+#: sequencer.c:680
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s: misslyckades läsa indexet"
 
-#: sequencer.c:678
+#: sequencer.c:685
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s: misslyckades uppdatera indexet"
 
-#: sequencer.c:736
+#: sequencer.c:743
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr "kan inte %s under en %s"
 
-#: sequencer.c:758
+#: sequencer.c:765
 #, c-format
 msgid "Could not parse line %d."
 msgstr "Kan inte tolka rad %d."
 
-#: sequencer.c:763
+#: sequencer.c:770
 msgid "No commits parsed."
 msgstr "Inga incheckningar lästes."
 
-#: sequencer.c:776
+#: sequencer.c:783
 #, c-format
 msgid "Could not open %s"
 msgstr "Kunde inte öppna %s"
 
-#: sequencer.c:780
+#: sequencer.c:787
 #, c-format
 msgid "Could not read %s."
 msgstr "kunde inte läsa %s."
 
-#: sequencer.c:787
+#: sequencer.c:794
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr "Oanvändbart manus: %s"
 
-#: sequencer.c:815
+#: sequencer.c:824
 #, c-format
 msgid "Invalid key: %s"
 msgstr "Felaktig nyckel: %s"
 
-#: sequencer.c:818
+#: sequencer.c:827
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr "Felaktigt värde för %s: %s"
 
-#: sequencer.c:830
+#: sequencer.c:839
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr "Trasigt manus: %s"
 
-#: sequencer.c:851
+#: sequencer.c:860
 msgid "a cherry-pick or revert is already in progress"
 msgstr "en \"cherry-pick\" eller \"revert\" pågår redan"
 
-#: sequencer.c:852
+#: sequencer.c:861
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr "testa \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: sequencer.c:856
+#: sequencer.c:865
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr "Kunde inte skapa \"sequencer\"-katalogen \"%s\""
 
-#: sequencer.c:872 sequencer.c:957
+#: sequencer.c:881 sequencer.c:966
 #, c-format
 msgid "Error wrapping up %s."
 msgstr "Fel vid ombrytning av %s."
 
-#: sequencer.c:891 sequencer.c:1025
+#: sequencer.c:900 sequencer.c:1036
 msgid "no cherry-pick or revert in progress"
 msgstr "ingen \"cherry-pick\" eller \"revert\" pågår"
 
-#: sequencer.c:893
+#: sequencer.c:902
 msgid "cannot resolve HEAD"
 msgstr "kan inte bestämma HEAD"
 
-#: sequencer.c:895
+#: sequencer.c:904
 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:917 builtin/apply.c:4061
+#: sequencer.c:926 builtin/apply.c:4061
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "kan inte öppna %s: %s"
 
-#: sequencer.c:920
+#: sequencer.c:929
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "kan inte läsa %s: %s"
 
-#: sequencer.c:921
+#: sequencer.c:930
 msgid "unexpected end of file"
 msgstr "oväntat filslut"
 
-#: sequencer.c:927
+#: sequencer.c:936
 #, 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:950
+#: sequencer.c:959
 #, c-format
 msgid "Could not format %s."
 msgstr "Kunde inte formatera %s."
 
-#: sequencer.c:1093
+#: sequencer.c:1104
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr "%s: kan inte göra \"cherry-pick\" på typen \"%s\""
 
-#: sequencer.c:1096
+#: sequencer.c:1107
 #, c-format
 msgid "%s: bad revision"
 msgstr "%s: felaktig revision"
 
-#: sequencer.c:1130
+#: sequencer.c:1141
 msgid "Can't revert as initial commit"
 msgstr "Kan inte ångra som första incheckning"
 
-#: sequencer.c:1131
+#: sequencer.c:1142
 msgid "Can't cherry-pick into empty head"
 msgstr "Kan inte göra \"cherry-pick\" i ett tomt huvud"
 
@@ -1323,21 +1329,21 @@ msgstr ""
 "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:1070
+#: sha1_name.c:1072
 msgid "HEAD does not point to a branch"
 msgstr "HEAD pekar inte på en gren"
 
-#: sha1_name.c:1073
+#: sha1_name.c:1075
 #, c-format
 msgid "No such branch: '%s'"
 msgstr "Okänd gren: \"%s\""
 
-#: sha1_name.c:1075
+#: sha1_name.c:1077
 #, c-format
 msgid "No upstream configured for branch '%s'"
 msgstr "Ingen standarduppström angiven för grenen \"%s\""
 
-#: sha1_name.c:1079
+#: sha1_name.c:1081
 #, 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"
@@ -1353,52 +1359,34 @@ msgstr ""
 msgid "Could not find section in .gitmodules where path=%s"
 msgstr "Hittade inte någon sektion i .gitmodules där sökväg=%s"
 
-#. Maybe the user already did that, don't error out here
 #: submodule.c:76
 #, c-format
 msgid "Could not update .gitmodules entry %s"
 msgstr "Kunde inte uppdatera .gitmodules-posten %s"
 
-#. Maybe the user already did that, don't error out here
 #: submodule.c:109
 #, c-format
 msgid "Could not remove .gitmodules entry for %s"
 msgstr "Kunde inte ta bort .gitmodules-posten för %s"
 
-#: submodule.c:127
-msgid "could not find .gitmodules in index"
-msgstr "kunde inte hitta .gitmodules i indexet"
-
-#: submodule.c:133
-msgid "reading updated .gitmodules failed"
-msgstr "misslyckades läsa uppdaterad .gitmodules"
-
-#: submodule.c:135
-msgid "unable to stat updated .gitmodules"
-msgstr "kan inte ta status på uppdaterad .gitmodules"
-
-#: submodule.c:139
-msgid "unable to remove .gitmodules from index"
-msgstr "kan inte ta bort .gitmodules från indexet"
-
-#: submodule.c:141
-msgid "adding updated .gitmodules failed"
-msgstr "misslyckades lägga till uppdaterad .gitmodules"
-
-#: submodule.c:143
+#: submodule.c:120
 msgid "staging updated .gitmodules failed"
 msgstr "misslyckades köa uppdaterad .gitmodules"
 
-#: submodule.c:1144 builtin/init-db.c:363
+#: submodule.c:1121 builtin/init-db.c:363
 #, c-format
 msgid "Could not create git link %s"
 msgstr "Kunde inte skapa gitlänk %s"
 
-#: submodule.c:1155
+#: submodule.c:1132
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "Kunde inte sätta core.worktree i %s"
 
+#: unpack-trees.c:206
+msgid "Checking out files"
+msgstr "Checkar ut filer"
+
 #: urlmatch.c:120
 msgid "invalid URL scheme name or missing '://' suffix"
 msgstr "ogiltig URL-schemanamn eller saknat \"://\"-suffix"
@@ -1508,88 +1496,97 @@ msgid "  (use \"git %s <file>...\" to include in what will be committed)"
 msgstr ""
 "  (använd \"git %s <fil>...\" för att ta med i det som skall checkas in)"
 
-#: wt-status.c:254
-msgid "bug"
-msgstr "programfel"
-
-#: wt-status.c:259
+#: wt-status.c:252
 msgid "both deleted:"
 msgstr "borttaget av bägge:"
 
-#: wt-status.c:260
+#: wt-status.c:254
 msgid "added by us:"
 msgstr "tillagt av oss:"
 
-#: wt-status.c:261
+#: wt-status.c:256
 msgid "deleted by them:"
 msgstr "borttaget av dem:"
 
-#: wt-status.c:262
+#: wt-status.c:258
 msgid "added by them:"
 msgstr "tillagt av dem:"
 
-#: wt-status.c:263
+#: wt-status.c:260
 msgid "deleted by us:"
 msgstr "borttaget av oss:"
 
-#: wt-status.c:264
+#: wt-status.c:262
 msgid "both added:"
 msgstr "tillagt av bägge:"
 
-#: wt-status.c:265
+#: wt-status.c:264
 msgid "both modified:"
 msgstr "ändrat av bägge:"
 
-#: wt-status.c:275
-msgid "new file"
-msgstr "ny fil"
+#: wt-status.c:266
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr "programfel: ej hanterad \"unmerged\"-status %x"
 
-#: wt-status.c:277
-msgid "copied"
-msgstr "kopierad"
+#: wt-status.c:274
+msgid "new file:"
+msgstr "ny fil:"
 
-#: wt-status.c:279
-msgid "deleted"
-msgstr "borttagen"
+#: wt-status.c:276
+msgid "copied:"
+msgstr "kopierad:"
 
-#: wt-status.c:285
-msgid "typechange"
-msgstr "typbyte"
+#: wt-status.c:278
+msgid "deleted:"
+msgstr "borttagen:"
 
-#: wt-status.c:287
-msgid "unknown"
-msgstr "okänd"
+#: wt-status.c:280
+msgid "modified:"
+msgstr "ändrad:"
 
-#: wt-status.c:289
-msgid "unmerged"
-msgstr "osammanslagen"
+#: wt-status.c:282
+msgid "renamed:"
+msgstr "namnbytt:"
 
-#: wt-status.c:336
+#: wt-status.c:284
+msgid "typechange:"
+msgstr "typbyte:"
+
+#: wt-status.c:286
+msgid "unknown:"
+msgstr "okänd:"
+
+#: wt-status.c:288
+msgid "unmerged:"
+msgstr "osammanslagen:"
+
+#: wt-status.c:370
 msgid "new commits, "
 msgstr "nya incheckningar, "
 
-#: wt-status.c:338
+#: wt-status.c:372
 msgid "modified content, "
 msgstr "ändrat innehåll, "
 
-#: wt-status.c:340
+#: wt-status.c:374
 msgid "untracked content, "
 msgstr "ospårat innehåll, "
 
-#: wt-status.c:357
+#: wt-status.c:391
 #, c-format
 msgid "bug: unhandled diff status %c"
 msgstr "programfel: diff-status %c ej hanterad"
 
-#: wt-status.c:732
+#: wt-status.c:765
 msgid "Submodules changed but not updated:"
 msgstr "Undermoduler ändrade men inte uppdaterade:"
 
-#: wt-status.c:734
+#: wt-status.c:767
 msgid "Submodule changes to be committed:"
 msgstr "Undermodulers ändringar att checka in:"
 
-#: wt-status.c:836
+#: wt-status.c:846
 msgid ""
 "Do not touch the line above.\n"
 "Everything below will be removed."
@@ -1597,68 +1594,68 @@ msgstr ""
 "Rör inte raden ovan.\n"
 "Allt nedan kommer tas bort."
 
-#: wt-status.c:899
+#: wt-status.c:937
 msgid "You have unmerged paths."
 msgstr "Du har ej sammanslagna sökvägar."
 
-#: wt-status.c:902
+#: wt-status.c:940
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr "  (rätta konflikter och kör \"git commit\")"
 
-#: wt-status.c:905
+#: wt-status.c:943
 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:908
+#: wt-status.c:946
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr "  (använd \"git commit\" för att slutföra sammanslagningen)"
 
-#: wt-status.c:918
+#: wt-status.c:956
 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:921
+#: wt-status.c:959
 msgid "The current patch is empty."
 msgstr "Aktuell patch är tom."
 
-#: wt-status.c:925
+#: wt-status.c:963
 msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr "  (rätta konflikter och kör sedan \"git am --continue\")"
 
-#: wt-status.c:927
+#: wt-status.c:965
 msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr "  (använd \"git am --skip\" för att hoppa över patchen)"
 
-#: wt-status.c:929
+#: wt-status.c:967
 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:989 wt-status.c:1006
+#: wt-status.c:1027 wt-status.c:1044
 #, 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:994 wt-status.c:1011
+#: wt-status.c:1032 wt-status.c:1049
 msgid "You are currently rebasing."
 msgstr "Du håller på med en ombasering."
 
-#: wt-status.c:997
+#: wt-status.c:1035
 msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr "  (rätta konflikter och kör sedan \"git rebase --continue\")"
 
-#: wt-status.c:999
+#: wt-status.c:1037
 msgid "  (use \"git rebase --skip\" to skip this patch)"
 msgstr "  (använd \"git rebase --skip\" för att hoppa över patchen)"
 
-#: wt-status.c:1001
+#: wt-status.c:1039
 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:1014
+#: wt-status.c:1052
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr "  (alla konflikter rättade: kör \"git rebase --continue\")"
 
-#: wt-status.c:1018
+#: wt-status.c:1056
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
@@ -1666,118 +1663,118 @@ msgstr ""
 "Du håller på att dela upp en incheckning medan du ombaserar grenen \"%s\" "
 "ovanpå \"%s\"."
 
-#: wt-status.c:1023
+#: wt-status.c:1061
 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:1026
+#: wt-status.c:1064
 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:1030
+#: wt-status.c:1068
 #, 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:1035
+#: wt-status.c:1073
 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:1038
+#: wt-status.c:1076
 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:1040
+#: wt-status.c:1078
 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:1050
+#: wt-status.c:1088
 #, 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:1055
+#: wt-status.c:1093
 msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
 msgstr "  (rätta konflikter och kör sedan \"git cherry-pick --continue\")"
 
-#: wt-status.c:1058
+#: wt-status.c:1096
 msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr "  (alla konflikter rättade: kör \"git cherry-pick --continue\")"
 
-#: wt-status.c:1060
+#: wt-status.c:1098
 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:1069
+#: wt-status.c:1107
 #, c-format
 msgid "You are currently reverting commit %s."
 msgstr "Du håller på med att ångra incheckningen %s."
 
-#: wt-status.c:1074
+#: wt-status.c:1112
 msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr "  (rätta konflikter och kör sedan \"git revert --continue\")"
 
-#: wt-status.c:1077
+#: wt-status.c:1115
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr "  (alla konflikter rättade: kör \"git revert --continue\")"
 
-#: wt-status.c:1079
+#: wt-status.c:1117
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr "  (använd \"git revert --abort\" för att avbryta ångrandet)"
 
-#: wt-status.c:1090
+#: wt-status.c:1128
 #, 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:1094
+#: wt-status.c:1132
 msgid "You are currently bisecting."
 msgstr "Du håller på med en \"bisect\"."
 
-#: wt-status.c:1097
+#: wt-status.c:1135
 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:1272
+#: wt-status.c:1310
 msgid "On branch "
 msgstr "På grenen "
 
-#: wt-status.c:1279
+#: wt-status.c:1317
 msgid "rebase in progress; onto "
 msgstr "ombasering pågår; ovanpå"
 
-#: wt-status.c:1286
+#: wt-status.c:1324
 msgid "HEAD detached at "
 msgstr "HEAD frånkopplad vid "
 
-#: wt-status.c:1288
+#: wt-status.c:1326
 msgid "HEAD detached from "
 msgstr "HEAD frånkopplad från "
 
-#: wt-status.c:1291
+#: wt-status.c:1329
 msgid "Not currently on any branch."
 msgstr "Inte på någon gren för närvarande."
 
-#: wt-status.c:1308
+#: wt-status.c:1346
 msgid "Initial commit"
 msgstr "Första incheckning"
 
-#: wt-status.c:1322
+#: wt-status.c:1360
 msgid "Untracked files"
 msgstr "Ospårade filer"
 
-#: wt-status.c:1324
+#: wt-status.c:1362
 msgid "Ignored files"
 msgstr "Ignorerade filer"
 
-#: wt-status.c:1328
+#: wt-status.c:1366
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1789,32 +1786,32 @@ msgstr ""
 "lägga till nya filer själv (se \"git help status\")."
 
 # %s är nästa sträng eller tom.
-#: wt-status.c:1334
+#: wt-status.c:1372
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr "Ospårade filer visas ej%s"
 
-#: wt-status.c:1336
+#: wt-status.c:1374
 msgid " (use -u option to show untracked files)"
 msgstr " (använd flaggan -u för att visa ospårade filer)"
 
-#: wt-status.c:1342
+#: wt-status.c:1380
 msgid "No changes"
 msgstr "Inga ändringar"
 
-#: wt-status.c:1347
+#: wt-status.c:1385
 #, 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:1350
+#: wt-status.c:1388
 #, c-format
 msgid "no changes added to commit\n"
 msgstr "inga ändringar att checka in\n"
 
-#: wt-status.c:1353
+#: wt-status.c:1391
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
@@ -1823,279 +1820,198 @@ msgstr ""
 "inget köat för incheckning, men ospårade filer finns (spåra med \"git add"
 "\")\n"
 
-#: wt-status.c:1356
+#: wt-status.c:1394
 #, 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:1359
+#: wt-status.c:1397
 #, 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:1362 wt-status.c:1367
+#: wt-status.c:1400 wt-status.c:1405
 #, c-format
 msgid "nothing to commit\n"
 msgstr "inget att checka in\n"
 
-#: wt-status.c:1365
+#: wt-status.c:1403
 #, 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:1369
+#: wt-status.c:1407
 #, c-format
 msgid "nothing to commit, working directory clean\n"
 msgstr "inget att checka in, arbetskatalogen ren\n"
 
-#: wt-status.c:1478
+#: wt-status.c:1516
 msgid "HEAD (no branch)"
 msgstr "HEAD (ingen gren)"
 
-#: wt-status.c:1484
+#: wt-status.c:1522
 msgid "Initial commit on "
 msgstr "Första incheckning på "
 
-#: wt-status.c:1514
+#: wt-status.c:1554
 msgid "gone"
 msgstr "försvunnen"
 
-#: wt-status.c:1516
+#: wt-status.c:1556 wt-status.c:1564
 msgid "behind "
 msgstr "efter "
 
-#: wt-status.c:1519 wt-status.c:1522
-msgid "ahead "
-msgstr "före "
-
-#: wt-status.c:1524
-msgid ", behind "
-msgstr ", efter "
-
 #: compat/precompose_utf8.c:55 builtin/clone.c:356
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "misslyckades ta bort länken \"%s\""
 
-#: builtin/add.c:20
+#: builtin/add.c:21
 msgid "git add [options] [--] <pathspec>..."
 msgstr "git add [flaggor] [--] <sökväg>..."
 
-#.
-#. * To be consistent with "git add -p" and most Git
-#. * commands, we should default to being tree-wide, but
-#. * this is not the original behavior and can't be
-#. * changed until users trained themselves not to type
-#. * "git add -u" or "git add -A". For now, we warn and
-#. * keep the old behavior. Later, the behavior can be changed
-#. * to tree-wide, keeping the warning for a while, and
-#. * eventually we can drop the warning.
-#.
-#: builtin/add.c:58
-#, c-format
-msgid ""
-"The behavior of 'git add %s (or %s)' with no path argument from a\n"
-"subdirectory of the tree will change in Git 2.0 and should not be used "
-"anymore.\n"
-"To add content for the whole tree, run:\n"
-"\n"
-"  git add %s :/\n"
-"  (or git add %s :/)\n"
-"\n"
-"To restrict the command to the current directory, run:\n"
-"\n"
-"  git add %s .\n"
-"  (or git add %s .)\n"
-"\n"
-"With the current Git version, the command is restricted to the current "
-"directory.\n"
-msgstr ""
-"Beteendet för \"git add %s (eller %s)\" utan sökvägsargument från en\n"
-"underkatalog i ett träd kommer ändras i Git 2.0 och bör inte längre "
-"användas.\n"
-"För att lägga till innehållet för hela trädet, använd:\n"
-"\n"
-"  git add %s :/\n"
-"  (eller git add %s :/)\n"
-"\n"
-"För att begränsa kommandot till aktuell katalog, använd:\n"
-"\n"
-"  git add %s .\n"
-"  (eller git add %s .)\n"
-"\n"
-"I nuvarande version av Git begränsas kommandot till aktuell katalog.\n"
-
-#: builtin/add.c:100
-#, c-format
-msgid ""
-"You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
-"whose behaviour will change in Git 2.0 with respect to paths you removed.\n"
-"Paths like '%s' that are\n"
-"removed from your working tree are ignored with this version of Git.\n"
-"\n"
-"* 'git add --ignore-removal <pathspec>', which is the current default,\n"
-"  ignores paths you removed from your working tree.\n"
-"\n"
-"* 'git add --all <pathspec>' will let you also record the removals.\n"
-"\n"
-"Run 'git status' to check the paths you removed from your working tree.\n"
-msgstr ""
-"Du körde \"git add\" utan varken \"-A (--all)\" eller \"--ignore-removal\".\n"
-"Beteendet kommer ändras i Git 2.0 vad gäller sökvägar du tagit bort.\n"
-"Sökvägar som \"%s\", som har\n"
-"tagits bort från din arbetskatalog ignoreras i den här versionen av Git.\n"
-"\n"
-"* \"git add --ignore-removal <sökväg>\", som är förvalet just nu,\n"
-"  ignorerar sökvägar du har tagit bort från arbetskatalogen.\n"
-"\n"
-"* \"git add --all <sökväg>\" låter dig även registrera borttagningarna.\n"
-"\n"
-"Kör \"git status\" för att kontrollera sökvägarna du tagit bort från\n"
-"arbetskatalogen.\n"
-
-#: builtin/add.c:144
+#: builtin/add.c:64
 #, c-format
 msgid "unexpected diff status %c"
 msgstr "diff-status %c förväntades inte"
 
-#: builtin/add.c:149 builtin/commit.c:260
+#: builtin/add.c:69 builtin/commit.c:261
 msgid "updating files failed"
 msgstr "misslyckades uppdatera filer"
 
-#: builtin/add.c:163
+#: builtin/add.c:79
 #, c-format
 msgid "remove '%s'\n"
 msgstr "ta bort \"%s\"\n"
 
-#: builtin/add.c:237
+#: builtin/add.c:133
 msgid "Unstaged changes after refreshing the index:"
 msgstr "Ospårade ändringar efter att ha uppdaterat indexet:"
 
-#: builtin/add.c:299
+#: builtin/add.c:193
 msgid "Could not read the index"
 msgstr "Kunde inte läsa indexet"
 
-#: builtin/add.c:310
+#: builtin/add.c:204
 #, c-format
 msgid "Could not open '%s' for writing."
 msgstr "Kunde inte öppna \"%s\" för skrivning"
 
-#: builtin/add.c:314
+#: builtin/add.c:208
 msgid "Could not write patch"
 msgstr "Kunde inte skriva patch"
 
-#: builtin/add.c:319
+#: builtin/add.c:213
 #, c-format
 msgid "Could not stat '%s'"
 msgstr "Kunde inte ta status på \"%s\""
 
-#: builtin/add.c:321
+#: builtin/add.c:215
 msgid "Empty patch. Aborted."
 msgstr "Tom patch. Avbryter."
 
-#: builtin/add.c:327
+#: builtin/add.c:221
 #, c-format
 msgid "Could not apply '%s'"
 msgstr "Kunde inte tillämpa \"%s\""
 
-#: builtin/add.c:337
+#: builtin/add.c:231
 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:354 builtin/clean.c:875 builtin/fetch.c:93 builtin/mv.c:70
-#: builtin/prune-packed.c:77 builtin/push.c:506 builtin/remote.c:1344
+#: 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/rm.c:269
 msgid "dry run"
 msgstr "testkörning"
 
-#: builtin/add.c:355 builtin/apply.c:4410 builtin/check-ignore.c:19
-#: builtin/commit.c:1249 builtin/count-objects.c:95 builtin/fsck.c:612
+#: 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
 msgid "be verbose"
 msgstr "var pratsam"
 
-#: builtin/add.c:357
+#: builtin/add.c:251
 msgid "interactive picking"
 msgstr "plocka interaktivt"
 
-#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
 msgid "select hunks interactively"
 msgstr "välj stycken interaktivt"
 
-#: builtin/add.c:359
+#: builtin/add.c:253
 msgid "edit current diff and apply"
 msgstr "redigera aktuell diff och applicera"
 
-#: builtin/add.c:360
+#: builtin/add.c:254
 msgid "allow adding otherwise ignored files"
 msgstr "tillåt lägga till annars ignorerade filer"
 
-#: builtin/add.c:361
+#: builtin/add.c:255
 msgid "update tracked files"
 msgstr "uppdatera spårade filer"
 
-#: builtin/add.c:362
+#: builtin/add.c:256
 msgid "record only the fact that the path will be added later"
 msgstr "registrera endast att sökvägen kommer läggas till senare"
 
-#: builtin/add.c:363
+#: builtin/add.c:257
 msgid "add changes from all tracked and untracked files"
 msgstr "lägg till ändringar från alla spårade och ospårade filer"
 
-#. takes no arguments
-#: builtin/add.c:366
+#: builtin/add.c:260
 msgid "ignore paths removed in the working tree (same as --no-all)"
 msgstr "ignorera sökvägar borttagna i arbetskatalogen (samma som --no-all)"
 
-#: builtin/add.c:368
+#: builtin/add.c:262
 msgid "don't add, only refresh the index"
 msgstr "lägg inte till, uppdatera endast indexet"
 
-#: builtin/add.c:369
+#: builtin/add.c:263
 msgid "just skip files which cannot be added because of errors"
 msgstr "hoppa bara över filer som inte kan läggas till på grund av fel"
 
-#: builtin/add.c:370
+#: builtin/add.c:264
 msgid "check if - even missing - files are ignored in dry run"
 msgstr "se om - även saknade - filer ignoreras i testkörning"
 
-#: builtin/add.c:392
+#: builtin/add.c:286
 #, c-format
 msgid "Use -f if you really want to add them.\n"
 msgstr "Använd -f om du verkligen vill lägga till dem.\n"
 
-#: builtin/add.c:393
+#: builtin/add.c:287
 msgid "no files added"
 msgstr "inga filer har lagts till"
 
-#: builtin/add.c:399
+#: builtin/add.c:293
 msgid "adding files failed"
 msgstr "misslyckades lägga till filer"
 
-#: builtin/add.c:438
+#: builtin/add.c:330
 msgid "-A and -u are mutually incompatible"
 msgstr "-A och -u är ömsesidigt inkompatibla"
 
-#: builtin/add.c:456
+#: builtin/add.c:337
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr "Flaggan --ignore-missing kan endast användas tillsammans med --dry-run"
 
-#: builtin/add.c:486
+#: builtin/add.c:358
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Inget angivet, inget tillagt.\n"
 
-#: builtin/add.c:487
+#: builtin/add.c:359
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "Kanske menade du att skriva \"git add .\"?\n"
 
-#: builtin/add.c:492 builtin/check-ignore.c:172 builtin/clean.c:919
-#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:224 builtin/rm.c:299
+#: 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
 msgid "index file corrupt"
 msgstr "indexfilen trasig"
 
-#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432
+#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
 msgid "Unable to write new index file"
 msgstr "Kunde inte skriva ny indexfil"
 
@@ -2207,7 +2123,6 @@ msgstr "** varning: filen %s blir tom men har inte tagits bort"
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "trasig binärpatch på rad %d: %.*s"
 
-#. there has to be one hunk (forward hunk)
 #: builtin/apply.c:1900
 #, c-format
 msgid "unrecognized binary patch at line %d"
@@ -2348,7 +2263,7 @@ msgstr "%s: patchen kan inte tillämpas"
 msgid "Checking patch %s..."
 msgstr "Kontrollerar patchen %s..."
 
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127
+#: 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 misslyckades för sökvägen \"%s\""
@@ -2397,7 +2312,6 @@ msgstr "Tillämpade patchen %s rent."
 msgid "internal error"
 msgstr "internt fel"
 
-#. Say this even without --verbose
 #: builtin/apply.c:4043
 #, c-format
 msgid "Applying patch %%s with %d reject..."
@@ -2489,7 +2403,7 @@ msgstr "försök en trevägssammanslagning om patchen inte kan tillämpas"
 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:452
+#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
 msgid "paths are separated with NUL character"
 msgstr "sökvägar avdelas med NUL-tecken"
 
@@ -2627,95 +2541,95 @@ msgstr "git blame [flaggor] [rev-flaggor] [rev] [--] fil"
 msgid "[rev-opts] are documented in git-rev-list(1)"
 msgstr "[rev-flaggor] dokumenteras i git-rev-list(1)"
 
-#: builtin/blame.c:2249
+#: builtin/blame.c:2242
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Visa klandringsposter när vi hittar dem, interaktivt"
 
-#: builtin/blame.c:2250
+#: builtin/blame.c:2243
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "Visa blank SHA-1 för gränsincheckningar (Standard: av)"
 
-#: builtin/blame.c:2251
+#: builtin/blame.c:2244
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Behandla inte rotincheckningar som gränser (Standard: av)"
 
-#: builtin/blame.c:2252
+#: builtin/blame.c:2245
 msgid "Show work cost statistics"
 msgstr "Visa statistik över arbetskostnad"
 
-#: builtin/blame.c:2253
+#: builtin/blame.c:2246
 msgid "Show output score for blame entries"
 msgstr "Visa utdatapoäng för klandringsposter"
 
-#: builtin/blame.c:2254
+#: builtin/blame.c:2247
 msgid "Show original filename (Default: auto)"
 msgstr "Visa originalfilnamn (Standard: auto)"
 
-#: builtin/blame.c:2255
+#: builtin/blame.c:2248
 msgid "Show original linenumber (Default: off)"
 msgstr "Visa ursprungligt radnummer (Standard: av)"
 
-#: builtin/blame.c:2256
+#: builtin/blame.c:2249
 msgid "Show in a format designed for machine consumption"
 msgstr "Visa i ett format avsett för maskinkonsumtion"
 
-#: builtin/blame.c:2257
+#: builtin/blame.c:2250
 msgid "Show porcelain format with per-line commit information"
 msgstr "Visa porslinsformat med per-rad-incheckningsinformation"
 
-#: builtin/blame.c:2258
+#: builtin/blame.c:2251
 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:2259
+#: builtin/blame.c:2252
 msgid "Show raw timestamp (Default: off)"
 msgstr "Visa rå tidsstämpel (Standard: av)"
 
-#: builtin/blame.c:2260
+#: builtin/blame.c:2253
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Visa lång inchecknings-SHA1 (Standard: av)"
 
-#: builtin/blame.c:2261
+#: builtin/blame.c:2254
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Undertryck författarnamn och tidsstämpel (Standard: av)"
 
-#: builtin/blame.c:2262
+#: builtin/blame.c:2255
 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:2263
+#: builtin/blame.c:2256
 msgid "Ignore whitespace differences"
 msgstr "Ignorera ändringar i blanksteg"
 
-#: builtin/blame.c:2264
+#: builtin/blame.c:2257
 msgid "Spend extra cycles to find better match"
 msgstr "Slösa extra cykler med att hitta bättre träff"
 
-#: builtin/blame.c:2265
+#: builtin/blame.c:2258
 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:2266
+#: builtin/blame.c:2259
 msgid "Use <file>'s contents as the final image"
 msgstr "Använd <fil>s innehåll som slutgiltig bild"
 
-#: builtin/blame.c:2267 builtin/blame.c:2268
+#: builtin/blame.c:2260 builtin/blame.c:2261
 msgid "score"
 msgstr "poäng"
 
-#: builtin/blame.c:2267
+#: builtin/blame.c:2260
 msgid "Find line copies within and across files"
 msgstr "Hitta kopierade rader inuti och mellan filer"
 
-#: builtin/blame.c:2268
+#: builtin/blame.c:2261
 msgid "Find line movements within and across files"
 msgstr "Hitta flyttade rader inuti och mellan filer"
 
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
 msgid "Process only line range n,m, counting from 1"
 msgstr "Behandla endast radintervallet n,m, med början på 1"
 
@@ -2958,8 +2872,9 @@ 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:1460 builtin/commit.c:1461
-#: builtin/commit.c:1462 builtin/commit.c:1463 builtin/tag.c:468
+#: 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
 msgid "commit"
 msgstr "incheckning"
 
@@ -3145,43 +3060,43 @@ msgstr "Behöver ett arkiv för att skapa ett paket (bundle)."
 msgid "Need a repository to unbundle."
 msgstr "Behöver ett arkiv för att packa upp ett paket (bundle)."
 
-#: builtin/cat-file.c:328
+#: builtin/cat-file.c:331
 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:329
+#: builtin/cat-file.c:332
 msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
 msgstr "git cat-file (--batch|--batch-check) < <objektlista>"
 
-#: builtin/cat-file.c:366
+#: builtin/cat-file.c:369
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<typ> kan vara en av: blob, tree, commit, tag"
 
-#: builtin/cat-file.c:367
+#: builtin/cat-file.c:370
 msgid "show object type"
 msgstr "visa objekttyp"
 
-#: builtin/cat-file.c:368
+#: builtin/cat-file.c:371
 msgid "show object size"
 msgstr "visa objektstorlek"
 
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:373
 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:371
+#: builtin/cat-file.c:374
 msgid "pretty-print object's content"
 msgstr "visa objektets innehåll snyggt"
 
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:376
 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:375
+#: builtin/cat-file.c:378
 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:378
+#: builtin/cat-file.c:381
 msgid "show info about objects fed from the standard input"
 msgstr "visa information för objekt som listas på standard in"
 
@@ -3209,7 +3124,7 @@ msgstr "läs filnamn från standard in"
 msgid "terminate input and output records by a NUL character"
 msgstr "avsluta in- och utdataposter med NUL-tecken"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
 msgid "suppress progress reporting"
 msgstr "undertryck förloppsrapportering"
 
@@ -3360,60 +3275,59 @@ msgstr "\"%s\" kan inte användas med %s"
 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:451
+#: builtin/checkout.c:261 builtin/checkout.c:450
 msgid "corrupt index file"
 msgstr "indexfilen är trasig"
 
-#: builtin/checkout.c:322 builtin/checkout.c:329
+#: builtin/checkout.c:321 builtin/checkout.c:328
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "sökvägen \"%s\" har inte slagits ihop"
 
-#: builtin/checkout.c:473
+#: builtin/checkout.c:472
 msgid "you need to resolve your current index first"
 msgstr "du måste lösa ditt befintliga index först"
 
-#: builtin/checkout.c:594
+#: builtin/checkout.c:593
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr "Kan inte skapa referenslog för \"%s\"\n"
 
-#: builtin/checkout.c:632
+#: builtin/checkout.c:631
 msgid "HEAD is now at"
 msgstr "HEAD är nu på"
 
-#: builtin/checkout.c:639
+#: builtin/checkout.c:638
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Återställ gren \"%s\"\n"
 
-#: builtin/checkout.c:642
+#: builtin/checkout.c:641
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Redan på \"%s\"\n"
 
-#: builtin/checkout.c:646
+#: builtin/checkout.c:645
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Växlade till och nollställde grenen \"%s\"\n"
 
-#: builtin/checkout.c:648 builtin/checkout.c:1033
+#: builtin/checkout.c:647 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:650
+#: builtin/checkout.c:649
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Växlade till grenen \"%s\"\n"
 
-#: builtin/checkout.c:706
+#: builtin/checkout.c:705
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... och %d till.\n"
 
-#. The singular version
-#: builtin/checkout.c:712
+#: builtin/checkout.c:711
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -3436,7 +3350,7 @@ msgstr[1] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:730
+#: builtin/checkout.c:729
 #, c-format
 msgid ""
 "If you want to keep them by creating a new branch, this may be a good time\n"
@@ -3451,140 +3365,139 @@ msgstr ""
 " git branch nytt_grennamn %s\n"
 "\n"
 
-#: builtin/checkout.c:760
+#: builtin/checkout.c:759
 msgid "internal error in revision walk"
 msgstr "internt fel vid genomgång av revisioner (revision walk)"
 
-#: builtin/checkout.c:764
+#: builtin/checkout.c:763
 msgid "Previous HEAD position was"
 msgstr "Tidigare position för HEAD var"
 
-#: builtin/checkout.c:791 builtin/checkout.c:1028
+#: builtin/checkout.c:790 builtin/checkout.c:1027
 msgid "You are on a branch yet to be born"
 msgstr "Du är på en gren som ännu inte är född"
 
-#: builtin/checkout.c:935
+#: builtin/checkout.c:934
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "endast en referens förväntades, %d gavs."
 
-#: builtin/checkout.c:974
+#: builtin/checkout.c:973
 #, c-format
 msgid "invalid reference: %s"
 msgstr "felaktig referens: %s"
 
-#. case (1): want a tree
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "referensen är inte ett träd: %s"
 
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
 msgid "paths cannot be used with switching branches"
 msgstr "sökvägar kan inte användas vid byte av gren"
 
-#: builtin/checkout.c:1045 builtin/checkout.c:1049
+#: builtin/checkout.c:1044 builtin/checkout.c:1048
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "\"%s\" kan inte användas vid byte av gren"
 
-#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1052 builtin/checkout.c:1055 builtin/checkout.c:1060
+#: builtin/checkout.c:1063
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "\"%s\" kan inte användas med \"%s\""
 
-#: builtin/checkout.c:1069
+#: builtin/checkout.c:1068
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Kan inte växla gren till icke-incheckningen \"%s\""
 
-#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
 #: builtin/remote.c:159 builtin/remote.c:161
 msgid "branch"
 msgstr "gren"
 
-#: builtin/checkout.c:1092
+#: builtin/checkout.c:1091
 msgid "create and checkout a new branch"
 msgstr "skapa och checka ut en ny gren"
 
-#: builtin/checkout.c:1094
+#: builtin/checkout.c:1093
 msgid "create/reset and checkout a branch"
 msgstr "skapa/nollställ och checka ut en gren"
 
-#: builtin/checkout.c:1095
+#: builtin/checkout.c:1094
 msgid "create reflog for new branch"
 msgstr "skapa reflogg för ny gren"
 
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
 msgid "detach the HEAD at named commit"
 msgstr "koppla från HEAD vid namngiven incheckning"
 
-#: builtin/checkout.c:1097
+#: builtin/checkout.c:1096
 msgid "set upstream info for new branch"
 msgstr "sätt uppströmsinformation för ny gren"
 
-#: builtin/checkout.c:1099
-msgid "new branch"
-msgstr "ny gren"
+#: builtin/checkout.c:1098
+msgid "new-branch"
+msgstr "ny-gren"
 
-#: builtin/checkout.c:1099
+#: builtin/checkout.c:1098
 msgid "new unparented branch"
 msgstr "ny gren utan förälder"
 
-#: builtin/checkout.c:1100
+#: builtin/checkout.c:1099
 msgid "checkout our version for unmerged files"
 msgstr "checka ut vår version för ej sammanslagna filer"
 
-#: builtin/checkout.c:1102
+#: builtin/checkout.c:1101
 msgid "checkout their version for unmerged files"
 msgstr "checka ut deras version för ej sammanslagna filer"
 
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1103
 msgid "force checkout (throw away local modifications)"
 msgstr "tvinga utcheckning (kasta bort lokala ändringar)"
 
-#: builtin/checkout.c:1105
+#: builtin/checkout.c:1104
 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:1106 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:225
 msgid "update ignored files (default)"
 msgstr "uppdatera ignorerade filer (standard)"
 
-#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248
+#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
 msgid "style"
 msgstr "stil"
 
-#: builtin/checkout.c:1108
+#: builtin/checkout.c:1107
 msgid "conflict style (merge or diff3)"
 msgstr "konfliktstil (merge eller diff3)"
 
-#: builtin/checkout.c:1111
+#: builtin/checkout.c:1110
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "begränsa inte sökvägar till endast glesa poster"
 
-#: builtin/checkout.c:1113
+#: builtin/checkout.c:1112
 msgid "second guess 'git checkout no-such-branch'"
 msgstr "förutspå \"git checkout gren-saknas\""
 
-#: builtin/checkout.c:1136
+#: builtin/checkout.c:1135
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B och --orphan är ömsesidigt uteslutande"
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
 msgid "--track needs a branch name"
 msgstr "--track behöver ett namn på en gren"
 
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1159
 msgid "Missing branch name; try -b"
 msgstr "Grennamn saknas; försök med -b"
 
-#: builtin/checkout.c:1197
+#: builtin/checkout.c:1196
 msgid "invalid path specification"
 msgstr "felaktig sökvägsangivelse"
 
-#: builtin/checkout.c:1204
+#: builtin/checkout.c:1203
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3593,12 +3506,12 @@ msgstr ""
 "Kan inte uppdatera sökvägar och växla till grenen \"%s\" samtidigt.\n"
 "Ville du checka ut \"%s\" som inte kan lösas som en utcheckning?"
 
-#: builtin/checkout.c:1209
+#: builtin/checkout.c:1208
 #, 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:1213
+#: builtin/checkout.c:1212
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -3638,7 +3551,7 @@ msgstr "Skulle hoppa över arkivet %s\n"
 msgid "failed to remove %s"
 msgstr "misslyckades ta bort %s"
 
-#: builtin/clean.c:294
+#: builtin/clean.c:295
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -3650,7 +3563,7 @@ msgstr ""
 "foo        - markera post baserad på unikt prefix\n"
 "           - (tomt) markera ingenting"
 
-#: builtin/clean.c:298
+#: builtin/clean.c:299
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -3670,35 +3583,35 @@ msgstr ""
 "*          - välj alla poster\n"
 "           - (tomt) avsluta markering"
 
-#: builtin/clean.c:516
+#: builtin/clean.c:517
 #, c-format
 msgid "Huh (%s)?"
 msgstr "Vadå (%s)?"
 
-#: builtin/clean.c:659
+#: builtin/clean.c:660
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Ange ignoreringsmönster>>"
 
-#: builtin/clean.c:696
+#: builtin/clean.c:697
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "VARNING: Hittar inte poster som motsvarar: %s"
 
-#: builtin/clean.c:717
+#: builtin/clean.c:718
 msgid "Select items to delete"
 msgstr "Välj poster att ta bort"
 
-#: builtin/clean.c:757
+#: builtin/clean.c:758
 #, c-format
 msgid "remove %s? "
 msgstr "ta bort %s?"
 
-#: builtin/clean.c:782
+#: builtin/clean.c:783
 msgid "Bye."
 msgstr "Hej då."
 
-#: builtin/clean.c:790
+#: builtin/clean.c:791
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -3716,72 +3629,72 @@ msgstr ""
 "help                - denna skärm\n"
 "?                   - hjälp för kommandoval"
 
-#: builtin/clean.c:817
+#: builtin/clean.c:818
 msgid "*** Commands ***"
 msgstr "*** Kommandon ***"
 
-#: builtin/clean.c:818
+#: builtin/clean.c:819
 msgid "What now"
 msgstr "Vad nu"
 
-#: builtin/clean.c:826
+#: builtin/clean.c:827
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Skulle ta bort följande post:"
 msgstr[1] "Skulle ta bort följande poster:"
 
-#: builtin/clean.c:843
+#: builtin/clean.c:844
 msgid "No more files to clean, exiting."
 msgstr "Inga fler filer att städa, avslutar."
 
-#: builtin/clean.c:874
+#: builtin/clean.c:875
 msgid "do not print names of files removed"
 msgstr "skriv inte ut namn på borttagna filer"
 
-#: builtin/clean.c:876
+#: builtin/clean.c:877
 msgid "force"
 msgstr "tvinga"
 
-#: builtin/clean.c:877
+#: builtin/clean.c:878
 msgid "interactive cleaning"
 msgstr "städa interaktivt"
 
-#: builtin/clean.c:879
+#: builtin/clean.c:880
 msgid "remove whole directories"
 msgstr "ta bort hela kataloger"
 
-#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:718
-#: builtin/ls-files.c:483 builtin/name-rev.c:314 builtin/show-ref.c:185
+#: 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
 msgid "pattern"
 msgstr "mönster"
 
-#: builtin/clean.c:881
+#: builtin/clean.c:882
 msgid "add <pattern> to ignore rules"
 msgstr "lägg till <mönster> till ignoreringsregler"
 
-#: builtin/clean.c:882
+#: builtin/clean.c:883
 msgid "remove ignored files, too"
 msgstr "ta även bort ignorerade filer"
 
-#: builtin/clean.c:884
+#: builtin/clean.c:885
 msgid "remove only ignored files"
 msgstr "ta endast bort ignorerade filer"
 
-#: builtin/clean.c:902
+#: builtin/clean.c:903
 msgid "-x and -X cannot be used together"
 msgstr "-x och -X kan inte användas samtidigt"
 
-#: builtin/clean.c:906
+#: builtin/clean.c:907
 msgid ""
-"clean.requireForce set to true and neither -i, -n nor -f given; refusing to "
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
 msgstr ""
 "clean.requireForce satt till true, men varken -i, -n eller -f angavs; vägrar "
 "städa"
 
-#: builtin/clean.c:909
+#: builtin/clean.c:910
 msgid ""
-"clean.requireForce defaults to true and neither -i, -n nor -f given; "
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
 msgstr ""
 "clean.requireForce har standardvärdet true och varken -i, -n eller -f "
@@ -3792,7 +3705,7 @@ 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:521
+#: builtin/push.c:504
 msgid "force progress reporting"
 msgstr "tvinga förloppsrapportering"
 
@@ -3800,7 +3713,7 @@ msgstr "tvinga förloppsrapportering"
 msgid "don't create a checkout"
 msgstr "skapa inte någon utcheckning"
 
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
 msgid "create a bare repository"
 msgstr "skapa ett naket (\"bare\") arkiv"
 
@@ -3824,11 +3737,11 @@ msgstr "skapa som ett delat arkiv"
 msgid "initialize submodules in the clone"
 msgstr "initiera undermoduler i klonen"
 
-#: builtin/clone.c:82 builtin/init-db.c:485
+#: builtin/clone.c:82 builtin/init-db.c:483
 msgid "template-directory"
 msgstr "mallkatalog"
 
-#: builtin/clone.c:83 builtin/init-db.c:486
+#: builtin/clone.c:83 builtin/init-db.c:484
 msgid "directory from which templates will be used"
 msgstr "katalog att använda mallar från"
 
@@ -3852,7 +3765,7 @@ msgstr "checka ut <gren> istället för fjärrens HEAD"
 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:663
+#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
 msgid "depth"
 msgstr "djup"
 
@@ -3864,11 +3777,11 @@ msgstr "skapa en grund klon på detta djup"
 msgid "clone only one branch, HEAD or --branch"
 msgstr "klona endast en gren, HEAD eller --branch"
 
-#: builtin/clone.c:96 builtin/init-db.c:494
+#: builtin/clone.c:96 builtin/init-db.c:492
 msgid "gitdir"
 msgstr "gitkat"
 
-#: builtin/clone.c:97 builtin/init-db.c:495
+#: builtin/clone.c:97 builtin/init-db.c:493
 msgid "separate git dir from working tree"
 msgstr "separera gitkatalogen från arbetskatalogen"
 
@@ -4155,67 +4068,67 @@ msgstr ""
 "\"git cherry-pick --continue\" kommer därefter att återuppta\n"
 "cherry-pick för återstående incheckningar.\n"
 
-#: builtin/commit.c:287
+#: builtin/commit.c:288
 msgid "failed to unpack HEAD tree object"
 msgstr "misslyckades packa upp HEAD:s trädobjekt"
 
-#: builtin/commit.c:329
+#: builtin/commit.c:330
 msgid "unable to create temporary index"
 msgstr "kunde inte skapa temporär indexfil"
 
-#: builtin/commit.c:335
+#: builtin/commit.c:336
 msgid "interactive add failed"
 msgstr "interaktiv tilläggning misslyckades"
 
-#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439
+#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
 msgid "unable to write new_index file"
 msgstr "kunde inte skriva filen new_index"
 
-#: builtin/commit.c:420
+#: builtin/commit.c:421
 msgid "cannot do a partial commit during a merge."
 msgstr "kan inte utföra en delvis incheckning under en sammanslagning."
 
-#: builtin/commit.c:422
+#: builtin/commit.c:423
 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:432
+#: builtin/commit.c:433
 msgid "cannot read the index"
 msgstr "kan inte läsa indexet"
 
-#: builtin/commit.c:452
+#: builtin/commit.c:453
 msgid "unable to write temporary index file"
 msgstr "kunde inte skriva temporär indexfil"
 
-#: builtin/commit.c:543 builtin/commit.c:549
+#: builtin/commit.c:544 builtin/commit.c:550
 #, c-format
 msgid "invalid commit: %s"
 msgstr "felaktig incheckning: %s"
 
-#: builtin/commit.c:571
+#: builtin/commit.c:572
 msgid "malformed --author parameter"
 msgstr "felformad \"--author\"-flagga"
 
-#: builtin/commit.c:591
+#: builtin/commit.c:592
 #, c-format
 msgid "Malformed ident string: '%s'"
 msgstr "Felaktig indragningssträng: \"%s\""
 
-#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007
+#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "kunde inte slå upp incheckningen %s"
 
-#: builtin/commit.c:642 builtin/shortlog.c:273
+#: builtin/commit.c:641 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:644
+#: builtin/commit.c:643
 msgid "could not read log from standard input"
 msgstr "kunde inte läsa logg från standard in"
 
-#: builtin/commit.c:648
+#: builtin/commit.c:647
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "kunde inte läsa loggfilen \"%s\""
@@ -4241,7 +4154,7 @@ msgstr "kunde inte läsa \"%s\""
 msgid "could not write commit template"
 msgstr "kunde inte skriva incheckningsmall"
 
-#: builtin/commit.c:760
+#: builtin/commit.c:764
 #, c-format
 msgid ""
 "\n"
@@ -4256,7 +4169,7 @@ msgstr ""
 "\t%s\n"
 "och försöker igen.\n"
 
-#: builtin/commit.c:765
+#: builtin/commit.c:769
 #, c-format
 msgid ""
 "\n"
@@ -4271,7 +4184,7 @@ msgstr ""
 "\t%s\n"
 "och försöker igen.\n"
 
-#: builtin/commit.c:777
+#: builtin/commit.c:782
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4281,7 +4194,7 @@ msgstr ""
 "med \"%c\" kommer ignoreras, och ett tomt meddelande avbryter "
 "incheckningen.\n"
 
-#: builtin/commit.c:782
+#: builtin/commit.c:789
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4292,139 +4205,139 @@ msgstr ""
 "med \"%c\" kommer behållas; du kan själv ta bort dem om du vill.\n"
 "Ett tomt meddelande avbryter incheckningen.\n"
 
-#: builtin/commit.c:795
+#: builtin/commit.c:802
 #, c-format
 msgid "%sAuthor:    %s"
 msgstr "%sFörfattare: %s"
 
-#: builtin/commit.c:802
+#: builtin/commit.c:809
 #, c-format
 msgid "%sCommitter: %s"
 msgstr "%sIncheckare: %s"
 
-#: builtin/commit.c:822
+#: builtin/commit.c:829
 msgid "Cannot read index"
 msgstr "Kan inte läsa indexet"
 
-#: builtin/commit.c:865
+#: builtin/commit.c:872
 msgid "Error building trees"
 msgstr "Fel vid byggande av träd"
 
-#: builtin/commit.c:880 builtin/tag.c:359
+#: builtin/commit.c:887 builtin/tag.c:391
 #, 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:982
+#: builtin/commit.c:989
 #, c-format
 msgid "No existing author found with '%s'"
 msgstr "Hittade ingen befintlig författare med \"%s\""
 
-#: builtin/commit.c:997 builtin/commit.c:1237
+#: builtin/commit.c:1004 builtin/commit.c:1244
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Ogiltigt läge för ospårade filer: \"%s\""
 
-#: builtin/commit.c:1034
+#: builtin/commit.c:1041
 msgid "--long and -z are incompatible"
 msgstr "--long och -z är inkompatibla"
 
-#: builtin/commit.c:1064
+#: builtin/commit.c:1071
 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:1075
+#: builtin/commit.c:1080
 msgid "You have nothing to amend."
 msgstr "Du har inget att utöka."
 
-#: builtin/commit.c:1078
+#: builtin/commit.c:1083
 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:1080
+#: builtin/commit.c:1085
 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:1083
+#: builtin/commit.c:1088
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Flaggorna --squash och --fixup kan inte användas samtidigt"
 
-#: builtin/commit.c:1093
+#: builtin/commit.c:1098
 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:1095
+#: builtin/commit.c:1100
 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:1103
+#: builtin/commit.c:1108
 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:1120
+#: builtin/commit.c:1125
 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:1122
+#: builtin/commit.c:1127
 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:1124
+#: builtin/commit.c:1129
 msgid "Clever... amending the last one with dirty index."
 msgstr "Smart... utöka den senaste med smutsigt index."
 
-#: builtin/commit.c:1126
-msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
+#: builtin/commit.c:1131
+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:1136 builtin/tag.c:572
+#: builtin/commit.c:1143 builtin/tag.c:639
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Felaktigt städningsläge %s"
 
-#: builtin/commit.c:1141
+#: builtin/commit.c:1148
 msgid "Paths with -a does not make sense."
 msgstr "Kan inte ange sökvägar med -a."
 
-#: builtin/commit.c:1251 builtin/commit.c:1482
+#: builtin/commit.c:1258 builtin/commit.c:1516
 msgid "show status concisely"
 msgstr "visa koncis status"
 
-#: builtin/commit.c:1253 builtin/commit.c:1484
+#: builtin/commit.c:1260 builtin/commit.c:1518
 msgid "show branch information"
 msgstr "visa information om gren"
 
-#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507
+#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
 msgid "machine-readable output"
 msgstr "maskinläsbar utdata"
 
-#: builtin/commit.c:1258 builtin/commit.c:1488
+#: builtin/commit.c:1265 builtin/commit.c:1522
 msgid "show status in long format (default)"
 msgstr "visa status i långt format (standard)"
 
-#: builtin/commit.c:1261 builtin/commit.c:1491
+#: builtin/commit.c:1268 builtin/commit.c:1525
 msgid "terminate entries with NUL"
 msgstr "terminera poster med NUL"
 
-#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:459
+#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
+#: builtin/fast-export.c:677 builtin/tag.c:514
 msgid "mode"
 msgstr "läge"
 
-#: builtin/commit.c:1264 builtin/commit.c:1494
+#: builtin/commit.c:1271 builtin/commit.c:1528
 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:1267
+#: builtin/commit.c:1274
 msgid "show ignored files"
 msgstr "visa ignorerade filer"
 
-#: builtin/commit.c:1268 parse-options.h:156
+#: builtin/commit.c:1275 parse-options.h:153
 msgid "when"
 msgstr "när"
 
-#: builtin/commit.c:1269
+#: builtin/commit.c:1276
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -4432,217 +4345,217 @@ msgstr ""
 "ignorera ändringar i undermoduler, valfritt när: all, dirty, untracked. "
 "(Default: all)"
 
-#: builtin/commit.c:1271
+#: builtin/commit.c:1278
 msgid "list untracked files in columns"
 msgstr "visa ospårade filer i spalter"
 
-#: builtin/commit.c:1340
+#: builtin/commit.c:1347
 msgid "couldn't look up newly created commit"
 msgstr "kunde inte slå upp en precis skapad incheckning"
 
-#: builtin/commit.c:1342
+#: builtin/commit.c:1349
 msgid "could not parse newly created commit"
 msgstr "kunde inte tolka en precis skapad incheckning"
 
-#: builtin/commit.c:1383
+#: builtin/commit.c:1390
 msgid "detached HEAD"
 msgstr "frånkopplad HEAD"
 
-#: builtin/commit.c:1385
+#: builtin/commit.c:1392
 msgid " (root-commit)"
 msgstr " (rotincheckning)"
 
-#: builtin/commit.c:1452
+#: builtin/commit.c:1486
 msgid "suppress summary after successful commit"
 msgstr "undertryck sammanfattning efter framgångsrik incheckning"
 
-#: builtin/commit.c:1453
+#: builtin/commit.c:1487
 msgid "show diff in commit message template"
 msgstr "visa diff i mallen för incheckningsmeddelandet"
 
-#: builtin/commit.c:1455
+#: builtin/commit.c:1489
 msgid "Commit message options"
 msgstr "Alternativ för incheckningsmeddelande"
 
-#: builtin/commit.c:1456 builtin/tag.c:457
+#: builtin/commit.c:1490 builtin/tag.c:512
 msgid "read message from file"
 msgstr "läs meddelande från fil"
 
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
 msgid "author"
 msgstr "författare"
 
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
 msgid "override author for commit"
 msgstr "överstyr författare för incheckningen"
 
-#: builtin/commit.c:1458 builtin/gc.c:261
+#: builtin/commit.c:1492 builtin/gc.c:272
 msgid "date"
 msgstr "datum"
 
-#: builtin/commit.c:1458
+#: builtin/commit.c:1492
 msgid "override date for commit"
 msgstr "överstyr datum för inchecknignen"
 
-#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405
-#: builtin/notes.c:562 builtin/tag.c:455
+#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:510
 msgid "message"
 msgstr "meddelande"
 
-#: builtin/commit.c:1459
+#: builtin/commit.c:1493
 msgid "commit message"
 msgstr "incheckningsmeddelande"
 
-#: builtin/commit.c:1460
+#: builtin/commit.c:1494
 msgid "reuse and edit message from specified commit"
 msgstr "återanvänd och redigera meddelande från angiven incheckning"
 
-#: builtin/commit.c:1461
+#: builtin/commit.c:1495
 msgid "reuse message from specified commit"
 msgstr "återanvänd meddelande från angiven incheckning"
 
-#: builtin/commit.c:1462
+#: builtin/commit.c:1496
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "använd autosquash-formaterat meddelande för att fixa angiven incheckning"
 
-#: builtin/commit.c:1463
+#: builtin/commit.c:1497
 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:1464
+#: builtin/commit.c:1498
 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:1465 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "lägg till Signed-off-by:"
 
-#: builtin/commit.c:1466
+#: builtin/commit.c:1500
 msgid "use specified template file"
 msgstr "använd angiven mallfil"
 
-#: builtin/commit.c:1467
+#: builtin/commit.c:1501
 msgid "force edit of commit"
 msgstr "tvinga redigering av incheckning"
 
-#: builtin/commit.c:1468
+#: builtin/commit.c:1502
 msgid "default"
 msgstr "standard"
 
-#: builtin/commit.c:1468 builtin/tag.c:460
+#: builtin/commit.c:1502 builtin/tag.c:515
 msgid "how to strip spaces and #comments from message"
 msgstr "hur blanksteg och #kommentarer skall tas bort från meddelande"
 
-#: builtin/commit.c:1469
+#: builtin/commit.c:1503
 msgid "include status in commit message template"
 msgstr "inkludera status i mallen för incheckningsmeddelandet"
 
-#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461
-msgid "key id"
+#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:516
+msgid "key-id"
 msgstr "nyckel-id"
 
-#: builtin/commit.c:1471 builtin/merge.c:224
+#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "GPG-signera incheckning"
 
-#. end commit message options
-#: builtin/commit.c:1474
+#: builtin/commit.c:1508
 msgid "Commit contents options"
 msgstr "Alternativ för incheckningens innehåll"
 
-#: builtin/commit.c:1475
+#: builtin/commit.c:1509
 msgid "commit all changed files"
 msgstr "checka in alla ändrade filer"
 
-#: builtin/commit.c:1476
+#: builtin/commit.c:1510
 msgid "add specified files to index for commit"
 msgstr "lägg till angivna filer till indexet för incheckning"
 
-#: builtin/commit.c:1477
+#: builtin/commit.c:1511
 msgid "interactively add files"
 msgstr "lägg till filer interaktivt"
 
-#: builtin/commit.c:1478
+#: builtin/commit.c:1512
 msgid "interactively add changes"
 msgstr "lägg till ändringar interaktivt"
 
-#: builtin/commit.c:1479
+#: builtin/commit.c:1513
 msgid "commit only specified files"
 msgstr "checka endast in angivna filer"
 
-#: builtin/commit.c:1480
+#: builtin/commit.c:1514
 msgid "bypass pre-commit hook"
 msgstr "förbigå pre-commit-krok"
 
-#: builtin/commit.c:1481
+#: builtin/commit.c:1515
 msgid "show what would be committed"
 msgstr "visa vad som skulle checkas in"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1526
 msgid "amend previous commit"
 msgstr "lägg till föregående incheckning"
 
-#: builtin/commit.c:1493
+#: builtin/commit.c:1527
 msgid "bypass post-rewrite hook"
 msgstr "förbigå post-rewrite-krok"
 
-#: builtin/commit.c:1498
+#: builtin/commit.c:1532
 msgid "ok to record an empty change"
 msgstr "ok att registrera en tom ändring"
 
-#: builtin/commit.c:1500
+#: builtin/commit.c:1534
 msgid "ok to record a change with an empty message"
 msgstr "ok att registrera en ändring med tomt meddelande"
 
-#: builtin/commit.c:1529
+#: builtin/commit.c:1562
 msgid "could not parse HEAD commit"
 msgstr "kunde inte tolka HEAD:s incheckning"
 
-#: builtin/commit.c:1567 builtin/merge.c:518
+#: builtin/commit.c:1601 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:1574
+#: builtin/commit.c:1608
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Trasig MERGE_HEAD-fil (%s)"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1615
 msgid "could not read MERGE_MODE"
 msgstr "kunde inte läsa MERGE_MODE"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1634
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "kunde inte läsa incheckningsmeddelande: %s"
 
-#: builtin/commit.c:1611
+#: builtin/commit.c:1645
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Avbryter incheckning; meddelandet inte redigerat.\n"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1650
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Avbryter på grund av tomt incheckningsmeddelande.\n"
 
-#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879
+#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
 msgid "failed to write commit object"
 msgstr "kunde inte skriva incheckningsobjekt"
 
-#: builtin/commit.c:1652
+#: builtin/commit.c:1686
 msgid "cannot lock HEAD ref"
 msgstr "kunde inte låsa HEAD-referens"
 
-#: builtin/commit.c:1656
+#: builtin/commit.c:1690
 msgid "cannot update HEAD ref"
 msgstr "kunde inte uppdatera HEAD-referens"
 
-#: builtin/commit.c:1667
+#: builtin/commit.c:1701
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full or quota is\n"
@@ -4657,127 +4570,127 @@ msgstr ""
 msgid "git config [options]"
 msgstr "git config [flaggor]"
 
-#: builtin/config.c:54
+#: builtin/config.c:53
 msgid "Config file location"
 msgstr "Konfigurationsfilens plats"
 
-#: builtin/config.c:55
+#: builtin/config.c:54
 msgid "use global config file"
 msgstr "använd global konfigurationsfil"
 
-#: builtin/config.c:56
+#: builtin/config.c:55
 msgid "use system config file"
 msgstr "använd systemets konfigurationsfil"
 
-#: builtin/config.c:57
+#: builtin/config.c:56
 msgid "use repository config file"
 msgstr "använd arkivets konfigurationsfil"
 
-#: builtin/config.c:58
+#: builtin/config.c:57
 msgid "use given config file"
 msgstr "använd angiven konfigurationsil"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "blob-id"
 msgstr "blob-id"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "read config from given blob object"
 msgstr "läs konfiguration från givet blob-objekt"
 
-#: builtin/config.c:60
+#: builtin/config.c:59
 msgid "Action"
 msgstr "Åtgärd"
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "get value: name [value-regex]"
 msgstr "hämta värde: namn [värde-reguttr]"
 
-#: builtin/config.c:62
+#: builtin/config.c:61
 msgid "get all values: key [value-regex]"
 msgstr "hämta alla värden: nyckel [värde-reguttr]"
 
-#: builtin/config.c:63
+#: builtin/config.c:62
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr "hämta värden för reguttr: namn-reguttr [värde-reguttr]"
 
-#: builtin/config.c:64
+#: builtin/config.c:63
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "hämta värde specifikt URL:en: sektion[.var] URL"
 
-#: builtin/config.c:65
+#: builtin/config.c:64
 msgid "replace all matching variables: name value [value_regex]"
 msgstr "ersätt alla motsvarande variabler: namn värde [värde-reguttr]"
 
-#: builtin/config.c:66
+#: builtin/config.c:65
 msgid "add a new variable: name value"
 msgstr "lägg till en ny variabel: namn värde"
 
-#: builtin/config.c:67
+#: builtin/config.c:66
 msgid "remove a variable: name [value-regex]"
 msgstr "ta bort en variabel: namn [värde-reguttr]"
 
-#: builtin/config.c:68
+#: builtin/config.c:67
 msgid "remove all matches: name [value-regex]"
 msgstr "ta bort alla träffar: namn [värde-reguttr]"
 
-#: builtin/config.c:69
+#: builtin/config.c:68
 msgid "rename section: old-name new-name"
 msgstr "byt namn på sektion: gammalt-namn nytt-namn"
 
-#: builtin/config.c:70
+#: builtin/config.c:69
 msgid "remove a section: name"
 msgstr "ta bort en sektion: namn"
 
-#: builtin/config.c:71
+#: builtin/config.c:70
 msgid "list all"
 msgstr "visa alla"
 
-#: builtin/config.c:72
+#: builtin/config.c:71
 msgid "open an editor"
 msgstr "öppna textredigeringsprogram"
 
-#: builtin/config.c:73 builtin/config.c:74
+#: builtin/config.c:72 builtin/config.c:73
 msgid "slot"
 msgstr "plats"
 
-#: builtin/config.c:73
+#: builtin/config.c:72
 msgid "find the color configured: [default]"
 msgstr "hitta den inställda färgen: [default]"
 
-#: builtin/config.c:74
+#: builtin/config.c:73
 msgid "find the color setting: [stdout-is-tty]"
 msgstr "hitta färginställningen: [stdout-is-tty]"
 
-#: builtin/config.c:75
+#: builtin/config.c:74
 msgid "Type"
 msgstr "Typ"
 
-#: builtin/config.c:76
+#: builtin/config.c:75
 msgid "value is \"true\" or \"false\""
 msgstr "värdet är \"true\" eller \"false\""
 
-#: builtin/config.c:77
+#: builtin/config.c:76
 msgid "value is decimal number"
 msgstr "värdet är ett decimalt tal"
 
-#: builtin/config.c:78
+#: builtin/config.c:77
 msgid "value is --bool or --int"
 msgstr "värdet är --bool eller --int"
 
-#: builtin/config.c:79
+#: builtin/config.c:78
 msgid "value is a path (file or directory name)"
 msgstr "värdet är en sökväg (fil- eller katalognamn)"
 
-#: builtin/config.c:80
+#: builtin/config.c:79
 msgid "Other"
 msgstr "Andra"
 
-#: builtin/config.c:81
+#: builtin/config.c:80
 msgid "terminate values with NUL byte"
 msgstr "terminera värden med NUL-byte"
 
-#: builtin/config.c:82
+#: builtin/config.c:81
 msgid "respect include directives on lookup"
 msgstr "respektera inkluderingsdirektiv vid uppslag"
 
@@ -4797,47 +4710,47 @@ msgstr "git describe [flaggor] <incheckning-igt>*"
 msgid "git describe [options] --dirty"
 msgstr "git describe [flaggor] --dirty"
 
-#: builtin/describe.c:237
+#: builtin/describe.c:225
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "den annoterade taggen %s inte tillgänglig"
 
-#: builtin/describe.c:241
+#: builtin/describe.c:229
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr "den annoterade taggen %s har inget inbäddat namn"
 
-#: builtin/describe.c:243
+#: builtin/describe.c:231
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "taggen \"%s\" är i verkligheten \"%s\" här"
 
-#: builtin/describe.c:270
+#: builtin/describe.c:258
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "Objektnamnet är inte giltigt: %s"
 
-#: builtin/describe.c:273
+#: builtin/describe.c:261
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr "%s är inte ett giltigt \"%s\"-objekt"
 
-#: builtin/describe.c:290
+#: builtin/describe.c:278
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr "ingen tagg motsvarar \"%s\" exakt"
 
-#: builtin/describe.c:292
+#: builtin/describe.c:280
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "söker för att beskriva %s\n"
 
-#: builtin/describe.c:332
+#: builtin/describe.c:327
 #, c-format
 msgid "finished search at %s\n"
 msgstr "avslutade sökning på %s\n"
 
-#: builtin/describe.c:359
+#: builtin/describe.c:354
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -4846,7 +4759,7 @@ msgstr ""
 "Inga annoterade taggar kan beskriva \"%s\".\n"
 "Det finns dock oannoterade taggar: testa --tags."
 
-#: builtin/describe.c:363
+#: builtin/describe.c:358
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -4855,12 +4768,12 @@ msgstr ""
 "Inga taggar kan beskriva \"%s\".\n"
 "Testa --always, eller skapa några taggar."
 
-#: builtin/describe.c:384
+#: builtin/describe.c:379
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "traverserade %lu incheckningar\n"
 
-#: builtin/describe.c:387
+#: builtin/describe.c:382
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
@@ -4869,63 +4782,63 @@ msgstr ""
 "mer än %i taggar hittades; listar de %i senaste\n"
 "gav upp sökningen vid %s\n"
 
-#: builtin/describe.c:409
+#: builtin/describe.c:404
 msgid "find the tag that comes after the commit"
 msgstr "hitta taggen som kommer efter incheckningen"
 
-#: builtin/describe.c:410
+#: builtin/describe.c:405
 msgid "debug search strategy on stderr"
 msgstr "felsök sökstrategin på standard fel"
 
-#: builtin/describe.c:411
+#: builtin/describe.c:406
 msgid "use any ref"
 msgstr "använd alla referenser"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:407
 msgid "use any tag, even unannotated"
 msgstr "använd alla taggar, även oannoterade"
 
-#: builtin/describe.c:413
+#: builtin/describe.c:408
 msgid "always use long format"
 msgstr "använd alltid långt format"
 
-#: builtin/describe.c:414
+#: builtin/describe.c:409
 msgid "only follow first parent"
 msgstr "följ endast första föräldern"
 
-#: builtin/describe.c:417
+#: builtin/describe.c:412
 msgid "only output exact matches"
 msgstr "skriv endast ut exakta träffar"
 
-#: builtin/describe.c:419
+#: builtin/describe.c:414
 msgid "consider <n> most recent tags (default: 10)"
 msgstr "överväg de <n> nyaste taggarna (standard: 10)"
 
-#: builtin/describe.c:421
+#: builtin/describe.c:416
 msgid "only consider tags matching <pattern>"
 msgstr "överväg endast taggar som motsvarar <mönster>"
 
-#: builtin/describe.c:423 builtin/name-rev.c:321
+#: builtin/describe.c:418 builtin/name-rev.c:321
 msgid "show abbreviated commit object as fallback"
 msgstr "visa förkortade incheckningsobjekt som standard"
 
-#: builtin/describe.c:424
+#: builtin/describe.c:419
 msgid "mark"
 msgstr "märke"
 
-#: builtin/describe.c:425
+#: builtin/describe.c:420
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr "lägg till <märke> på lortigt arbetsträd (standard: \"-dirty\")"
 
-#: builtin/describe.c:443
+#: builtin/describe.c:438
 msgid "--long is incompatible with --abbrev=0"
 msgstr "--long är inkompatibel med --abbrev=0"
 
-#: builtin/describe.c:469
+#: builtin/describe.c:464
 msgid "No names found, cannot describe anything."
 msgstr "Inga namn hittades, kan inte beskriva något."
 
-#: builtin/describe.c:489
+#: builtin/describe.c:484
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "--dirty är inkompatibelt med \"commit-ish\"-värden"
 
@@ -5217,7 +5130,7 @@ msgstr "Hämtar %s\n"
 msgid "Could not fetch %s"
 msgstr "Kunde inte hämta %s"
 
-#: builtin/fetch.c:1036
+#: builtin/fetch.c:1035
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -5259,10 +5172,10 @@ msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
 msgstr ""
 "git fmt-merge-msg [-m <meddelande>] [--log[=<n>]|--no-log] [--file <fil>]"
 
-#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702
-#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446
-#: parse-options.h:135 parse-options.h:242
+#: 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
+#: parse-options.h:132 parse-options.h:239
 msgid "n"
 msgstr "n"
 
@@ -5326,6 +5239,14 @@ msgstr "nyckel"
 msgid "field name to sort on"
 msgstr "fältnamn att sortera på"
 
+#: builtin/fsck.c:147 builtin/prune.c:172
+msgid "Checking connectivity"
+msgstr "Kontrollerar konnektivitet"
+
+#: builtin/fsck.c:544
+msgid "Checking object directories"
+msgstr "Kontrollerar objektkataloger"
+
 #: builtin/fsck.c:607
 msgid "git fsck [options] [<object>...]"
 msgstr "git fsck [flaggor] [<objekt>...]"
@@ -5370,47 +5291,56 @@ msgstr "skriv dinglande objekt i .git/lost-found"
 msgid "show progress"
 msgstr "visa förlopp"
 
+#: builtin/fsck.c:673
+msgid "Checking objects"
+msgstr "Kontrollerar objekt"
+
 #: builtin/gc.c:24
 msgid "git gc [options]"
 msgstr "git gc [flaggor]"
 
-#: builtin/gc.c:80
+#: builtin/gc.c:90
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "Felaktigt %s: \"%s\""
 
-#: builtin/gc.c:107
+#: builtin/gc.c:117
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "tokigt lång objektkatalog %.*s"
 
-#: builtin/gc.c:262
+#: builtin/gc.c:273
 msgid "prune unreferenced objects"
 msgstr "rensa ej refererade objekt"
 
-#: builtin/gc.c:264
+#: builtin/gc.c:275
 msgid "be more thorough (increased runtime)"
 msgstr "var mer grundlig (ökar körtiden)"
 
-#: builtin/gc.c:265
+#: builtin/gc.c:276
 msgid "enable auto-gc mode"
 msgstr "aktivera auto-gc-läge"
 
-#: builtin/gc.c:266
+#: builtin/gc.c:277
 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:306
+#: builtin/gc.c:318
 #, c-format
-msgid ""
-"Auto packing the repository for optimum performance. You may also\n"
-"run \"git gc\" manually. See \"git help gc\" for more information.\n"
-msgstr ""
-"Packar arkivet automatiskt för optimal prestanda. Du kan även\n"
-"köra \"git gc\" manuellt. Se \"git help gc\" för mer information.\n"
+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
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
+msgstr "Packar arkivet automatiskt för optimal prestanda.\n"
 
-#. be quiet on --auto
-#: builtin/gc.c:316
+#: builtin/gc.c:321
+#, 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
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5418,7 +5348,7 @@ msgstr ""
 "gc körs redan på maskinen \"%s\" pid %<PRIuMAX> (använd --force om så inte "
 "är fallet)"
 
-#: builtin/gc.c:341
+#: builtin/gc.c:361
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -5449,209 +5379,209 @@ msgstr "kunde inte läsa träd (%s)"
 msgid "unable to grep from object of type %s"
 msgstr "Kunde inte \"grep\" från objekt av typen %s"
 
-#: builtin/grep.c:551
+#: builtin/grep.c:549
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "flaggan \"%c\" antar ett numeriskt värde"
 
-#: builtin/grep.c:568
+#: builtin/grep.c:566
 #, c-format
 msgid "cannot open '%s'"
 msgstr "kan inte öppna \"%s\""
 
-#: builtin/grep.c:642
+#: builtin/grep.c:640
 msgid "search in index instead of in the work tree"
 msgstr "sök i indexet istället för i arbetskatalogen"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:642
 msgid "find in contents not managed by git"
 msgstr "sök i innehål som inte hanteras av git"
 
-#: builtin/grep.c:646
+#: builtin/grep.c:644
 msgid "search in both tracked and untracked files"
 msgstr "sök i både spårade och ospårade filer"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:646
 msgid "search also in ignored files"
 msgstr "sök även i ignorerade filer"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:649
 msgid "show non-matching lines"
 msgstr "visa rader som inte träffas"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:651
 msgid "case insensitive matching"
 msgstr "skiftlägesokänslig sökning"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:653
 msgid "match patterns only at word boundaries"
 msgstr "matcha endast mönster vid ordgränser"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:655
 msgid "process binary files as text"
 msgstr "hantera binärfiler som text"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:657
 msgid "don't match patterns in binary files"
 msgstr "träffa inte mönster i binärfiler"
 
-#: builtin/grep.c:662
+#: builtin/grep.c:660
 msgid "process binary files with textconv filters"
 msgstr "hantera binärfiler med textconv-filter"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:662
 msgid "descend at most <depth> levels"
 msgstr "gå som mest ned <djup> nivåer"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:666
 msgid "use extended POSIX regular expressions"
 msgstr "använd utökade POSIX-reguljära uttryck"
 
-#: builtin/grep.c:671
+#: builtin/grep.c:669
 msgid "use basic POSIX regular expressions (default)"
 msgstr "använd grundläggande POSIX-reguljära uttryck (standard)"
 
-#: builtin/grep.c:674
+#: builtin/grep.c:672
 msgid "interpret patterns as fixed strings"
 msgstr "tolka mönster som fixerade strängar"
 
-#: builtin/grep.c:677
+#: builtin/grep.c:675
 msgid "use Perl-compatible regular expressions"
 msgstr "använd Perlkompatibla reguljära uttryck"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:678
 msgid "show line numbers"
 msgstr "visa radnummer"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:679
 msgid "don't show filenames"
 msgstr "visa inte filnamn"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:680
 msgid "show filenames"
 msgstr "visa filnamn"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:682
 msgid "show filenames relative to top directory"
 msgstr "visa filnamn relativa till toppkatalogen"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:684
 msgid "show only filenames instead of matching lines"
 msgstr "visa endast filnamn istället för träffade rader"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:686
 msgid "synonym for --files-with-matches"
 msgstr "synonym för --files-with-matches"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:689
 msgid "show only the names of files without match"
 msgstr "visa endast namn på filer utan träffar"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:691
 msgid "print NUL after filenames"
 msgstr "skriv NUL efter filnamn"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:693
 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:696
+#: builtin/grep.c:694
 msgid "highlight matches"
 msgstr "ljusmarkera träffar"
 
-#: builtin/grep.c:698
+#: builtin/grep.c:696
 msgid "print empty line between matches from different files"
 msgstr "skriv tomma rader mellan träffar från olika filer"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:698
 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:703
+#: builtin/grep.c:701
 msgid "show <n> context lines before and after matches"
 msgstr "visa <n> rader sammanhang före och efter träffar"
 
-#: builtin/grep.c:706
+#: builtin/grep.c:704
 msgid "show <n> context lines before matches"
 msgstr "visa <n> rader sammanhang före träffar"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:706
 msgid "show <n> context lines after matches"
 msgstr "visa <n> rader sammanhang efter träffar"
 
-#: builtin/grep.c:709
+#: builtin/grep.c:707
 msgid "shortcut for -C NUM"
 msgstr "genväg för -C NUM"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:710
 msgid "show a line with the function name before matches"
 msgstr "visa en rad med funktionsnamnet före träffen"
 
-#: builtin/grep.c:714
+#: builtin/grep.c:712
 msgid "show the surrounding function"
 msgstr "visa den omkringliggande funktionen"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:715
 msgid "read patterns from file"
 msgstr "läs mönster från fil"
 
-#: builtin/grep.c:719
+#: builtin/grep.c:717
 msgid "match <pattern>"
 msgstr "träffa <mönster>"
 
-#: builtin/grep.c:721
+#: builtin/grep.c:719
 msgid "combine patterns specified with -e"
 msgstr "kombinera mönster som anges med -e"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:731
 msgid "indicate hit with exit status without output"
 msgstr "ange träff med slutstatuskod utan utdata"
 
-#: builtin/grep.c:735
+#: builtin/grep.c:733
 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:737
+#: builtin/grep.c:735
 msgid "show parse tree for grep expression"
 msgstr "visa analysträd för grep-uttryck"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:739
 msgid "pager"
 msgstr "bläddrare"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:739
 msgid "show matching files in the pager"
 msgstr "visa träffade filer i filbläddraren"
 
-#: builtin/grep.c:744
+#: builtin/grep.c:742
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "tillåt anropa grep(1) (ignoreras av detta bygge)"
 
-#: builtin/grep.c:745 builtin/show-ref.c:187
+#: builtin/grep.c:743 builtin/show-ref.c:187
 msgid "show usage"
 msgstr "visa användning"
 
-#: builtin/grep.c:812
+#: builtin/grep.c:810
 msgid "no pattern given."
 msgstr "inget mönster angavs."
 
-#: builtin/grep.c:870
+#: builtin/grep.c:868
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager fungerar endast i arbetskatalogen"
 
-#: builtin/grep.c:893
+#: builtin/grep.c:891
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached och --untracked kan inte användas med --no-index."
 
-#: builtin/grep.c:898
+#: builtin/grep.c:896
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index och --untracked kan inte användas med revisioner."
 
-#: builtin/grep.c:901
+#: builtin/grep.c:899
 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:909
+#: builtin/grep.c:907
 msgid "both --cached and trees are given."
 msgstr "både --cached och träd angavs."
 
@@ -5667,7 +5597,7 @@ msgstr ""
 msgid "git hash-object  --stdin-paths < <list-of-paths>"
 msgstr "git hash-object  --stdin-paths < <sökvägslista>"
 
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:72 builtin/tag.c:521
 msgid "type"
 msgstr "typ"
 
@@ -5906,8 +5836,8 @@ msgstr "allvarlig inflate-inkonsekvens"
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "SHA1-KOLLISION UPPTÄCKT VID %s !"
 
-#: builtin/index-pack.c:669 builtin/pack-objects.c:171
-#: builtin/pack-objects.c:263
+#: builtin/index-pack.c:669 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
 #, c-format
 msgid "unable to read %s"
 msgstr "kunde inte läsa %s"
@@ -6173,33 +6103,31 @@ msgstr "kan inte hantera filtyp %d"
 msgid "unable to move %s to %s"
 msgstr "kan inte flytta %s till %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:420
+#. 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 Git-arkiv i %s%s\n"
 
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
 msgid "Reinitialized existing"
 msgstr "Ominitierade befintligt"
 
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
 msgid "Initialized empty"
 msgstr "Initierade tomt"
 
-#: builtin/init-db.c:422
+#: builtin/init-db.c:420
 msgid " shared"
 msgstr " delat"
 
-#: builtin/init-db.c:441
+#: builtin/init-db.c:439
 msgid "cannot tell cwd"
 msgstr "kan inte läsa aktuell katalog (cwd)"
 
-#: builtin/init-db.c:467
+#: builtin/init-db.c:465
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared"
 "[=<permissions>]] [directory]"
@@ -6207,29 +6135,29 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<mallkatalog>] [--shared"
 "[=<behörigheter>]] [katalog]"
 
-#: builtin/init-db.c:490
+#: builtin/init-db.c:488
 msgid "permissions"
 msgstr "behörigheter"
 
-#: builtin/init-db.c:491
+#: builtin/init-db.c:489
 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:493 builtin/prune-packed.c:79 builtin/repack.c:155
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
 msgid "be quiet"
 msgstr "var tyst"
 
-#: builtin/init-db.c:525 builtin/init-db.c:530
+#: builtin/init-db.c:523 builtin/init-db.c:528
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "kan inte skapa katalogen (mkdir) %s"
 
-#: builtin/init-db.c:534
+#: builtin/init-db.c:532
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "kan inte byta katalog (chdir) till %s"
 
-#: builtin/init-db.c:556
+#: builtin/init-db.c:554
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -6238,11 +6166,11 @@ msgstr ""
 "%s (eller --work-tree=<katalog>) inte tillåtet utan att ange %s (eller --git-"
 "dir=<katalog>)"
 
-#: builtin/init-db.c:580
+#: builtin/init-db.c:578
 msgid "Cannot access current working directory"
 msgstr "Kan inte komma åt aktuell arbetskatalog"
 
-#: builtin/init-db.c:587
+#: builtin/init-db.c:585
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Kan inte komma åt arbetskatalogen \"%s\""
@@ -6505,95 +6433,95 @@ msgstr "Kunde inte hitta en spårad fjärrgren, ange <uppström> manuellt.\n"
 msgid "Unknown commit %s"
 msgstr "Okänd incheckning %s"
 
-#: builtin/ls-files.c:398
+#: builtin/ls-files.c:401
 msgid "git ls-files [options] [<file>...]"
 msgstr "git ls-files [flaggor] [<fil>...]"
 
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:458
 msgid "identify the file status with tags"
 msgstr "identifiera filstatus med taggar"
 
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:460
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr "använd små bokstäver för \"anta oförändrade\"-filer"
 
-#: builtin/ls-files.c:459
+#: builtin/ls-files.c:462
 msgid "show cached files in the output (default)"
 msgstr "visa cachade filer i utdata (standard)"
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:464
 msgid "show deleted files in the output"
 msgstr "visa borttagna filer i utdata"
 
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:466
 msgid "show modified files in the output"
 msgstr "visa modifierade filer i utdata"
 
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:468
 msgid "show other files in the output"
 msgstr "visa andra filer i utdata"
 
-#: builtin/ls-files.c:467
+#: builtin/ls-files.c:470
 msgid "show ignored files in the output"
 msgstr "visa ignorerade filer i utdata"
 
-#: builtin/ls-files.c:470
+#: builtin/ls-files.c:473
 msgid "show staged contents' object name in the output"
 msgstr "visa köat innehålls objektnamn i utdata"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:475
 msgid "show files on the filesystem that need to be removed"
 msgstr "visa filer i filsystemet som behöver tas bort"
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:477
 msgid "show 'other' directories' name only"
 msgstr "visa endast namn för \"andra\" kataloger"
 
-#: builtin/ls-files.c:477
+#: builtin/ls-files.c:480
 msgid "don't show empty directories"
 msgstr "visa inte tomma kataloger"
 
-#: builtin/ls-files.c:480
+#: builtin/ls-files.c:483
 msgid "show unmerged files in the output"
 msgstr "visa ej sammanslagna filer i utdata"
 
-#: builtin/ls-files.c:482
+#: builtin/ls-files.c:485
 msgid "show resolve-undo information"
 msgstr "visa \"resolve-undo\"-information"
 
-#: builtin/ls-files.c:484
+#: builtin/ls-files.c:487
 msgid "skip files matching pattern"
 msgstr "hoppa över filer som motsvarar mönster"
 
-#: builtin/ls-files.c:487
+#: builtin/ls-files.c:490
 msgid "exclude patterns are read from <file>"
 msgstr "exkludera mönster som läses från <fil>"
 
-#: builtin/ls-files.c:490
+#: builtin/ls-files.c:493
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "läs ytterligare per-katalog-exkluderingsmönster från <fil>"
 
-#: builtin/ls-files.c:492
+#: builtin/ls-files.c:495
 msgid "add the standard git exclusions"
 msgstr "lägg till git:s standardexkluderingar"
 
-#: builtin/ls-files.c:495
+#: builtin/ls-files.c:498
 msgid "make the output relative to the project top directory"
 msgstr "gör utdata relativ till projektets toppkatalog"
 
-#: builtin/ls-files.c:498
+#: builtin/ls-files.c:501
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "om en <fil> inte är indexet, betrakta det som ett fel"
 
-#: builtin/ls-files.c:499
+#: builtin/ls-files.c:502
 msgid "tree-ish"
 msgstr "träd-igt"
 
-#: builtin/ls-files.c:500
+#: builtin/ls-files.c:503
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr "låtsas att sökvägar borttagna sedan <träd-igt> fortfarande finns"
 
-#: builtin/ls-files.c:502
+#: builtin/ls-files.c:505
 msgid "show debugging data"
 msgstr "visa felsökningsutdata"
 
@@ -6705,7 +6633,7 @@ msgstr "avbryt om snabbspolning inte är möjlig"
 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:738 builtin/revert.c:89
+#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
 msgid "strategy"
 msgstr "strategi"
 
@@ -6778,37 +6706,37 @@ msgstr "\"%s\" verkar inte peka på en incheckning"
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Felaktig branch.%s.mergeoptions-sträng: %s"
 
-#: builtin/merge.c:650
+#: builtin/merge.c:653
 msgid "git write-tree failed to write a tree"
 msgstr "git write-tree misslyckades skriva ett träd"
 
-#: builtin/merge.c:678
+#: builtin/merge.c:681
 msgid "Not handling anything other than two heads merge."
 msgstr "Hanterar inte något annat än en sammanslagning av två huvuden."
 
-#: builtin/merge.c:692
+#: builtin/merge.c:695
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Felaktig flagga för merge-recursive: -X%s"
 
-#: builtin/merge.c:706
+#: builtin/merge.c:709
 #, c-format
 msgid "unable to write %s"
 msgstr "kunde inte skriva %s"
 
-#: builtin/merge.c:795
+#: builtin/merge.c:798
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "Kunde inte läsa från \"%s\""
 
-#: builtin/merge.c:804
+#: builtin/merge.c:807
 #, 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:810
+#: builtin/merge.c:813
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -6824,48 +6752,48 @@ msgstr ""
 "Rader som inleds med \"%c\" kommer ignoreras, och ett tomt meddelande\n"
 "avbryter incheckningen.\n"
 
-#: builtin/merge.c:834
+#: builtin/merge.c:837
 msgid "Empty commit message."
 msgstr "Tomt incheckningsmeddelande."
 
-#: builtin/merge.c:846
+#: builtin/merge.c:849
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Underbart.\n"
 
-#: builtin/merge.c:911
+#: builtin/merge.c:914
 #, 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:927
+#: builtin/merge.c:930
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "\"%s\" är inte en incheckning"
 
-#: builtin/merge.c:968
+#: builtin/merge.c:971
 msgid "No current branch."
 msgstr "Inte på någon gren."
 
-#: builtin/merge.c:970
+#: builtin/merge.c:973
 msgid "No remote for the current branch."
 msgstr "Ingen fjärr för aktuell gren."
 
-#: builtin/merge.c:972
+#: builtin/merge.c:975
 msgid "No default upstream defined for the current branch."
 msgstr "Ingen standarduppström angiven för aktuell gren."
 
-#: builtin/merge.c:977
+#: builtin/merge.c:980
 #, 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:1133
+#: builtin/merge.c:1136
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Det finns ingen sammanslagning att avbryta (MERGE_HEAD saknas)."
 
-#: builtin/merge.c:1149 git-pull.sh:31
+#: builtin/merge.c:1152 git-pull.sh:31
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -6873,11 +6801,11 @@ msgstr ""
 "Du har inte avslutat sammanslagningen (MERGE_HEAD finns).\n"
 "Checka in dina ändringar innan du kan slå ihop."
 
-#: builtin/merge.c:1152 git-pull.sh:34
+#: builtin/merge.c:1155 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:1156
+#: builtin/merge.c:1159
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -6885,103 +6813,102 @@ msgstr ""
 "Du har inte avslutat din \"cherry-pick\" (CHERRY_PICK_HEAD finns).\n"
 "Checka in dina ändringar innan du kan slå ihop."
 
-#: builtin/merge.c:1159
+#: builtin/merge.c:1162
 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:1168
+#: builtin/merge.c:1171
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Du kan inte kombinera --squash med --no-ff."
 
-#: builtin/merge.c:1177
+#: builtin/merge.c:1180
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Ingen incheckning angiven och merge.defaultToUpstream är ej satt."
 
-#: builtin/merge.c:1209
+#: builtin/merge.c:1212
 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:1212
+#: builtin/merge.c:1215
 msgid "Squash commit into empty head not supported yet"
 msgstr "Stöder inte en tillplattningsincheckning på ett tomt huvud ännu"
 
-#: builtin/merge.c:1214
+#: builtin/merge.c:1217
 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:1219
+#: builtin/merge.c:1222
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - inte något vi kan slå ihop"
 
-#: builtin/merge.c:1270
+#: builtin/merge.c:1273
 #, 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:1273
+#: builtin/merge.c:1276
 #, 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."
 
-#. 'N'
-#: builtin/merge.c:1276
+#: builtin/merge.c:1279
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Incheckning %s har inte någon GPG-signatur."
 
-#: builtin/merge.c:1279
+#: builtin/merge.c:1282
 #, 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:1363
+#: builtin/merge.c:1366
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Uppdaterar %s..%s\n"
 
-#: builtin/merge.c:1402
+#: builtin/merge.c:1405
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Försöker riktigt enkel sammanslagning i indexet...\n"
 
-#: builtin/merge.c:1409
+#: builtin/merge.c:1412
 #, c-format
 msgid "Nope.\n"
 msgstr "Nej.\n"
 
-#: builtin/merge.c:1441
+#: builtin/merge.c:1444
 msgid "Not possible to fast-forward, aborting."
 msgstr "Kan inte snabbspola, avbryter."
 
-#: builtin/merge.c:1464 builtin/merge.c:1543
+#: builtin/merge.c:1467 builtin/merge.c:1546
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Återspolar trädet till orört...\n"
 
-#: builtin/merge.c:1468
+#: builtin/merge.c:1471
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Försöker sammanslagninsstrategin %s...\n"
 
-#: builtin/merge.c:1534
+#: builtin/merge.c:1537
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Ingen sammanslagningsstrategi hanterade sammanslagningen.\n"
 
-#: builtin/merge.c:1536
+#: builtin/merge.c:1539
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Sammanslagning med strategin %s misslyckades.\n"
 
-#: builtin/merge.c:1545
+#: builtin/merge.c:1548
 #, 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:1557
+#: builtin/merge.c:1560
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -7066,19 +6993,19 @@ msgstr "varna inte om konflikter"
 msgid "set labels for file1/orig_file/file2"
 msgstr "sätt etiketter för fil1/origfil/fil2"
 
-#: builtin/mktree.c:67
+#: builtin/mktree.c:64
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
 
-#: builtin/mktree.c:153
+#: builtin/mktree.c:150
 msgid "input is NUL terminated"
 msgstr "indata är NUL-terminerad"
 
-#: builtin/mktree.c:154 builtin/write-tree.c:24
+#: builtin/mktree.c:151 builtin/write-tree.c:24
 msgid "allow missing objects"
 msgstr "tillåt saknade objekt"
 
-#: builtin/mktree.c:155
+#: builtin/mktree.c:152
 msgid "allow creation of more than one tree"
 msgstr "tillåt skapa mer än ett träd"
 
@@ -7126,46 +7053,46 @@ msgstr ""
 msgid "Huh? %.*s is in index?"
 msgstr "Vad? %.*s är i indexet?"
 
-#: builtin/mv.c:168
+#: builtin/mv.c:169
 msgid "source directory is empty"
 msgstr "källkatalogen är tom"
 
-#: builtin/mv.c:200
+#: builtin/mv.c:205
 msgid "not under version control"
 msgstr "inte versionshanterad"
 
-#: builtin/mv.c:202
+#: builtin/mv.c:207
 msgid "destination exists"
 msgstr "destinationen finns"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:215
 #, c-format
 msgid "overwriting '%s'"
 msgstr "skriver över \"%s\""
 
-#: builtin/mv.c:213
+#: builtin/mv.c:218
 msgid "Cannot overwrite"
 msgstr "Kan inte skriva över"
 
-#: builtin/mv.c:216
+#: builtin/mv.c:221
 msgid "multiple sources for the same target"
 msgstr "flera källor för samma mål"
 
-#: builtin/mv.c:218
+#: builtin/mv.c:223
 msgid "destination directory does not exist"
 msgstr "destinationskatalogen finns inte"
 
-#: builtin/mv.c:233
+#: builtin/mv.c:243
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, källa=%s, mål=%s"
 
-#: builtin/mv.c:243
+#: builtin/mv.c:253
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "Byter namn på %s till %s\n"
 
-#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "misslyckades byta namn på \"%s\""
@@ -7336,7 +7263,7 @@ msgstr "kunde inte läsa utdata från \"show\""
 msgid "failed to finish 'show' for object '%s'"
 msgstr "kunde inte avsluta \"show\" för objektet \"%s\""
 
-#: builtin/notes.c:167 builtin/tag.c:341
+#: builtin/notes.c:167 builtin/tag.c:373
 #, c-format
 msgid "could not create file '%s'"
 msgstr "kunde inte skapa filen \"%s\""
@@ -7345,7 +7272,7 @@ msgstr "kunde inte skapa filen \"%s\""
 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:844
+#: builtin/notes.c:207 builtin/notes.c:848
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Tar bort anteckning för objektet %s\n"
@@ -7359,20 +7286,20 @@ msgstr "kunde inte skriva anteckningsobjekt"
 msgid "The note contents has been left in %s"
 msgstr "Anteckningens innehåll har lämnats kvar i %s"
 
-#: builtin/notes.c:248 builtin/tag.c:537
+#: builtin/notes.c:248 builtin/tag.c:604
 #, c-format
 msgid "cannot read '%s'"
 msgstr "kunde inte läsa \"%s\""
 
-#: builtin/notes.c:250 builtin/tag.c:540
+#: builtin/notes.c:250 builtin/tag.c:607
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "kunde inte öppna eller läsa \"%s\""
 
-#: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318
-#: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515
-#: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637
-#: builtin/notes.c:839 builtin/tag.c:553
+#: 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
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Kunde inte slå upp \"%s\" som en giltig referens."
@@ -7382,53 +7309,58 @@ msgstr "Kunde inte slå upp \"%s\" som en giltig referens."
 msgid "Failed to read object '%s'."
 msgstr "Kunde inte läsa objektet \"%s\"."
 
-#: builtin/notes.c:312
+#: builtin/notes.c:276
+#, 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
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "Felaktig indatarad: \"%s\"."
 
-#: builtin/notes.c:327
+#: builtin/notes.c:331
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "Misslyckades kopiera anteckningar från \"%s\" till \"%s\""
 
-#: builtin/notes.c:371 builtin/notes.c:425 builtin/notes.c:498
-#: builtin/notes.c:510 builtin/notes.c:583 builtin/notes.c:630
-#: builtin/notes.c:904
+#: 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 "för många parametrar"
 
-#: builtin/notes.c:384 builtin/notes.c:643
+#: builtin/notes.c:388 builtin/notes.c:647
 #, c-format
 msgid "No note found for object %s."
 msgstr "Inga anteckningar hittades för objektet %s."
 
-#: builtin/notes.c:406 builtin/notes.c:563
+#: builtin/notes.c:410 builtin/notes.c:567
 msgid "note contents as a string"
 msgstr "anteckningsinnehåll som sträng"
 
-#: builtin/notes.c:409 builtin/notes.c:566
+#: builtin/notes.c:413 builtin/notes.c:570
 msgid "note contents in a file"
 msgstr "anteckningsinnehåll i en fil"
 
-#: builtin/notes.c:411 builtin/notes.c:414 builtin/notes.c:568
-#: builtin/notes.c:571 builtin/tag.c:474
+#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
+#: builtin/notes.c:575 builtin/tag.c:539
 msgid "object"
 msgstr "objekt"
 
-#: builtin/notes.c:412 builtin/notes.c:569
+#: builtin/notes.c:416 builtin/notes.c:573
 msgid "reuse and edit specified note object"
 msgstr "återanvänd och redigera angivet anteckningsobjekt"
 
-#: builtin/notes.c:415 builtin/notes.c:572
+#: builtin/notes.c:419 builtin/notes.c:576
 msgid "reuse specified note object"
 msgstr "återanvänd angivet anteckningsobjekt"
 
-#: builtin/notes.c:417 builtin/notes.c:485
+#: builtin/notes.c:421 builtin/notes.c:489
 msgid "replace existing notes"
 msgstr "ersätt befintliga anteckningar"
 
-#: builtin/notes.c:451
+#: builtin/notes.c:455
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7437,24 +7369,24 @@ msgstr ""
 "Kan inte lägga till anteckningar. Hittade befintliga anteckningar för "
 "objektet %s. Använd \"-f\" för att skriva över befintliga anteckningar"
 
-#: builtin/notes.c:456 builtin/notes.c:533
+#: builtin/notes.c:460 builtin/notes.c:537
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Skriver över befintliga anteckningar för objektet %s\n"
 
-#: builtin/notes.c:486
+#: builtin/notes.c:490
 msgid "read objects from stdin"
 msgstr "läs objekt från standard in"
 
-#: builtin/notes.c:488
+#: builtin/notes.c:492
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr "läs omskrivningsinställning för <kommando> (implicerar --stdin)"
 
-#: builtin/notes.c:506
+#: builtin/notes.c:510
 msgid "too few parameters"
 msgstr "för få parametrar"
 
-#: builtin/notes.c:527
+#: builtin/notes.c:531
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7463,12 +7395,12 @@ msgstr ""
 "Kan inte kopiera anteckningar. Hittade befintliga anteckningar för objektet "
 "%s. Använd \"-f\" för att skriva över befintliga anteckningar"
 
-#: builtin/notes.c:539
+#: builtin/notes.c:543
 #, c-format
 msgid "Missing notes on source object %s. Cannot copy."
 msgstr "Anteckningar på källobjektet %s saknas. Kan inte kopiera."
 
-#: builtin/notes.c:588
+#: builtin/notes.c:592
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -7477,15 +7409,15 @@ msgstr ""
 "Flaggorna -m/-F/-c/-C rekommenderas inte för underkommandot \"edit\".\n"
 "Använd \"git notes add -f -m/-F/-c/-C\" istället.\n"
 
-#: builtin/notes.c:735
+#: builtin/notes.c:739
 msgid "General options"
 msgstr "Allmänna flaggor"
 
-#: builtin/notes.c:737
+#: builtin/notes.c:741
 msgid "Merge options"
 msgstr "Flaggor för sammanslagning"
 
-#: builtin/notes.c:739
+#: builtin/notes.c:743
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -7493,203 +7425,227 @@ msgstr ""
 "läs konflikter i anteckningar med angiven strategi (manual/ours/theirs/union/"
 "cat_sort_uniq)"
 
-#: builtin/notes.c:741
+#: builtin/notes.c:745
 msgid "Committing unmerged notes"
 msgstr "Checkar in ej sammanslagna anteckningar"
 
-#: builtin/notes.c:743
+#: builtin/notes.c:747
 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:745
+#: builtin/notes.c:749
 msgid "Aborting notes merge resolution"
 msgstr "Avbryt lösning av sammanslagning av anteckningar"
 
-#: builtin/notes.c:747
+#: builtin/notes.c:751
 msgid "abort notes merge"
 msgstr "avbryt sammanslagning av anteckningar"
 
-#: builtin/notes.c:842
+#: builtin/notes.c:846
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "Objektet %s har ingen anteckning\n"
 
-#: builtin/notes.c:854
+#: builtin/notes.c:858
 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:857
+#: builtin/notes.c:861
 msgid "read object names from the standard input"
 msgstr "läs objektnamn från standard in"
 
-#: builtin/notes.c:938
-msgid "notes_ref"
+#: builtin/notes.c:942
+msgid "notes-ref"
 msgstr "anteckningar-ref"
 
-#: builtin/notes.c:939
+#: builtin/notes.c:943
 msgid "use notes from <notes_ref>"
 msgstr "använd anteckningar från <anteckningsref>"
 
-#: builtin/notes.c:974 builtin/remote.c:1593
+#: builtin/notes.c:978 builtin/remote.c:1593
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Okänt underkommando: %s"
 
-#: builtin/pack-objects.c:23
+#: builtin/pack-objects.c:25
 msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
 msgstr "git pack-objects --stdout [flaggor...] [< reflista | < objektlista]"
 
-#: builtin/pack-objects.c:24
+#: builtin/pack-objects.c:26
 msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
 msgstr "git pack-objects [flaggor...] basnamn [< reflista | < objektlista]"
 
-#: builtin/pack-objects.c:184 builtin/pack-objects.c:187
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
 #, c-format
 msgid "deflate error (%d)"
 msgstr "fel i deflate (%d)"
 
-#: builtin/pack-objects.c:2396
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr "Skriver objekt"
+
+#: builtin/pack-objects.c:1012
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr "inaktiverar skrivning av bitkarta då några objekt inte packas"
+
+#: builtin/pack-objects.c:2174
+msgid "Compressing objects"
+msgstr "Komprimerar objekt"
+
+#: builtin/pack-objects.c:2530
 #, c-format
 msgid "unsupported index version %s"
 msgstr "indexversionen %s stöds ej"
 
-#: builtin/pack-objects.c:2400
+#: builtin/pack-objects.c:2534
 #, c-format
 msgid "bad index version '%s'"
 msgstr "felaktig indexversion \"%s\""
 
-#: builtin/pack-objects.c:2423
+#: builtin/pack-objects.c:2557
 #, c-format
 msgid "option %s does not accept negative form"
 msgstr "flaggan %s godtar inte negativ form"
 
-#: builtin/pack-objects.c:2427
+#: builtin/pack-objects.c:2561
 #, 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:2446
+#: builtin/pack-objects.c:2580
 msgid "do not show progress meter"
 msgstr "visa inte förloppsindikator"
 
-#: builtin/pack-objects.c:2448
+#: builtin/pack-objects.c:2582
 msgid "show progress meter"
 msgstr "visa förloppsindikator"
 
-#: builtin/pack-objects.c:2450
+#: builtin/pack-objects.c:2584
 msgid "show progress meter during object writing phase"
 msgstr "visa förloppsindikator under objektskrivningsfasen"
 
-#: builtin/pack-objects.c:2453
+#: builtin/pack-objects.c:2587
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "som --all-progress när förloppsmätaren visas"
 
-#: builtin/pack-objects.c:2454
+#: builtin/pack-objects.c:2588
 msgid "version[,offset]"
 msgstr "version[,offset]"
 
-#: builtin/pack-objects.c:2455
+#: builtin/pack-objects.c:2589
 msgid "write the pack index file in the specified idx format version"
 msgstr "skriv paketindexfilen i angiven indexformatversion"
 
-#: builtin/pack-objects.c:2458
+#: builtin/pack-objects.c:2592
 msgid "maximum size of each output pack file"
 msgstr "maximal storlek på varje utdatapaketfil"
 
-#: builtin/pack-objects.c:2460
+#: builtin/pack-objects.c:2594
 msgid "ignore borrowed objects from alternate object store"
 msgstr "ignorera lånade objekt från alternativa objektlager"
 
-#: builtin/pack-objects.c:2462
+#: builtin/pack-objects.c:2596
 msgid "ignore packed objects"
 msgstr "ignorera packade objekt"
 
-#: builtin/pack-objects.c:2464
+#: builtin/pack-objects.c:2598
 msgid "limit pack window by objects"
 msgstr "begränsa paketfönster efter objekt"
 
-#: builtin/pack-objects.c:2466
+#: builtin/pack-objects.c:2600
 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:2468
+#: builtin/pack-objects.c:2602
 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:2470
+#: builtin/pack-objects.c:2604
 msgid "reuse existing deltas"
 msgstr "återanvänd befintliga delta"
 
-#: builtin/pack-objects.c:2472
+#: builtin/pack-objects.c:2606
 msgid "reuse existing objects"
 msgstr "återanvänd befintliga objekt"
 
-#: builtin/pack-objects.c:2474
+#: builtin/pack-objects.c:2608
 msgid "use OFS_DELTA objects"
 msgstr "använd OFS_DELTA-objekt"
 
-#: builtin/pack-objects.c:2476
+#: builtin/pack-objects.c:2610
 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:2478
+#: builtin/pack-objects.c:2612
 msgid "do not create an empty pack output"
 msgstr "försök inte skapa tom paketutdata"
 
-#: builtin/pack-objects.c:2480
+#: builtin/pack-objects.c:2614
 msgid "read revision arguments from standard input"
 msgstr "läs revisionsargument från standard in"
 
-#: builtin/pack-objects.c:2482
+#: builtin/pack-objects.c:2616
 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:2485
+#: builtin/pack-objects.c:2619
 msgid "include objects reachable from any reference"
 msgstr "inkludera objekt som kan nås från någon referens"
 
-#: builtin/pack-objects.c:2488
+#: builtin/pack-objects.c:2622
 msgid "include objects referred by reflog entries"
 msgstr "inkludera objekt som refereras från referensloggposter"
 
-#: builtin/pack-objects.c:2491
+#: builtin/pack-objects.c:2625
 msgid "output pack to stdout"
 msgstr "skriv paket på standard ut"
 
-#: builtin/pack-objects.c:2493
+#: builtin/pack-objects.c:2627
 msgid "include tag objects that refer to objects to be packed"
 msgstr "inkludera taggobjekt som refererar objekt som skall packas"
 
-#: builtin/pack-objects.c:2495
+#: builtin/pack-objects.c:2629
 msgid "keep unreachable objects"
 msgstr "behåll onåbara objekt"
 
-#: builtin/pack-objects.c:2496 parse-options.h:143
+#: builtin/pack-objects.c:2630 parse-options.h:140
 msgid "time"
 msgstr "tid"
 
-#: builtin/pack-objects.c:2497
+#: builtin/pack-objects.c:2631
 msgid "unpack unreachable objects newer than <time>"
 msgstr "packa upp onåbara objekt nyare än <tid>"
 
-#: builtin/pack-objects.c:2500
+#: builtin/pack-objects.c:2634
 msgid "create thin packs"
 msgstr "skapa tunna paket"
 
-#: builtin/pack-objects.c:2502
+#: builtin/pack-objects.c:2636
 msgid "ignore packs that have companion .keep file"
 msgstr "ignorera paket som har tillhörande .keep-fil"
 
-#: builtin/pack-objects.c:2504
+#: builtin/pack-objects.c:2638
 msgid "pack compression level"
 msgstr "komprimeringsgrad för paket"
 
-#: builtin/pack-objects.c:2506
+#: builtin/pack-objects.c:2640
 msgid "do not hide commits by grafts"
 msgstr "göm inte incheckningar med ympningar (\"grafts\")"
 
+#: builtin/pack-objects.c:2642
+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
+msgid "write a bitmap index together with the pack index"
+msgstr "använd bitkartindex tillsammans med packindexet"
+
+#: builtin/pack-objects.c:2723
+msgid "Counting objects"
+msgstr "Räknar objekt"
+
 #: builtin/pack-refs.c:6
 msgid "git pack-refs [options]"
 msgstr "git pack-refs [flaggor]"
@@ -7706,6 +7662,10 @@ msgstr "ta bort lösa referenser (standard)"
 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 "Tar bort duplicerade objekt"
+
 #: builtin/prune.c:12
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <tid>] [--] [<huvud>...]"
@@ -7726,15 +7686,15 @@ msgstr "låt tid gå ut för objekt äldre än <tid>"
 msgid "git push [<options>] [<repository> [<refspec>...]]"
 msgstr "git push [<flaggor>] [<arkiv> [<refspec>...]]"
 
-#: builtin/push.c:86
+#: builtin/push.c:85
 msgid "tag shorthand without <tag>"
 msgstr "taggförkortning utan <tagg>"
 
-#: builtin/push.c:96
+#: builtin/push.c:95
 msgid "--delete only accepts plain target ref names"
 msgstr "--delete godtar endast enkla målreferensnamn"
 
-#: builtin/push.c:141
+#: builtin/push.c:140
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -7743,7 +7703,7 @@ msgstr ""
 "För att välja ett av alternativen permanent, se push.default i \"git help "
 "config\"."
 
-#: builtin/push.c:144
+#: builtin/push.c:143
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -7768,7 +7728,7 @@ msgstr ""
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:159
+#: builtin/push.c:158
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -7783,7 +7743,7 @@ msgstr ""
 "\n"
 "    git push %s HEAD:<namn-på-fjärrgren>\n"
 
-#: builtin/push.c:173
+#: builtin/push.c:172
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -7796,12 +7756,12 @@ msgstr ""
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:181
+#: builtin/push.c:180
 #, 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:184
+#: builtin/push.c:183
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -7812,11 +7772,11 @@ msgstr ""
 "aktuella grenen \"%s\", utan att tala om för mig vad som\n"
 "skall sändas för att uppdatera fjärrgrenen."
 
-#: builtin/push.c:207
+#: builtin/push.c:206
 msgid ""
-"push.default is unset; its implicit value is changing in\n"
+"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 current behavior after the default changes, use:\n"
+"and maintain the traditional behavior, use:\n"
 "\n"
 "  git config --global push.default matching\n"
 "\n"
@@ -7827,7 +7787,7 @@ msgid ""
 "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"
-"In Git 2.0, Git will default to the more conservative 'simple'\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"
@@ -7838,8 +7798,7 @@ msgid ""
 msgstr ""
 "push.default har inte ställts in; dess underförstådda värde\n"
 "ändras i Git 2.0 från \"matching\" till \"simple\". För att\n"
-"undertrycka det här meddelandet och behålla nuvarande beteende\n"
-"efter att förvalet ändras,\n"
+"undertrycka det här meddelandet och behålla traditionellt beteende\n"
 "skriver du:\n"
 "\n"
 "  git config --global push.default matching\n"
@@ -7861,14 +7820,14 @@ msgstr ""
 "liknande läget \"current\" istället för \"simple\" om du ibland använder\n"
 "äldre versioner av Git.)"
 
-#: builtin/push.c:274
+#: builtin/push.c:273
 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:281
+#: builtin/push.c:280
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -7880,21 +7839,7 @@ msgstr ""
 "\"git pull ....\") innan du sänder igen.\n"
 "Se avsnittet \"Note about fast-forward\" i \"git push --help\" för detaljer."
 
-#: builtin/push.c:287
-msgid ""
-"Updates were rejected because a pushed branch tip is behind its remote\n"
-"counterpart. If you did not intend to push that branch, you may want to\n"
-"specify branches to push or set the 'push.default' configuration variable\n"
-"to 'simple', 'current' or 'upstream' to push only the current branch."
-msgstr ""
-"Uppdateringar avvisades då änden på en insänd gren är bakom dess\n"
-"fjärrmotsvarighet. Om det inte var meningen att sända in grenen, bör\n"
-"du specificera grenar att sända, eller ändra inställningsvariabeln\n"
-"\"push-default\" till \"simple\", \"current\" eller \"upstream\" för att "
-"endast\n"
-"sända aktuell gren."
-
-#: builtin/push.c:293
+#: builtin/push.c:286
 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"
@@ -7906,7 +7851,7 @@ msgstr ""
 "\"git pull ...\") innan du sänder igen.\n"
 "Se avsnittet \"Note about fast-forward\" i \"git push --help\" för detaljer."
 
-#: builtin/push.c:299
+#: builtin/push.c:292
 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"
@@ -7920,11 +7865,11 @@ msgstr ""
 "(t.ex. \"git pull ...\") innan du sänder igen.\n"
 "Se avsnittet \"Note about fast-forwards\" i \"git push --help\" för detaljer."
 
-#: builtin/push.c:306
+#: builtin/push.c:299
 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:309
+#: builtin/push.c:302
 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"
@@ -7935,22 +7880,22 @@ msgstr ""
 "pekar på något som inte är en incheckning, utan att använda flaggan\n"
 "\"--force\".\n"
 
-#: builtin/push.c:375
+#: builtin/push.c:361
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Sänder till %s\n"
 
-#: builtin/push.c:379
+#: builtin/push.c:365
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "misslyckades sända vissa referenser till \"%s\""
 
-#: builtin/push.c:412
+#: builtin/push.c:395
 #, c-format
 msgid "bad repository '%s'"
 msgstr "felaktigt arkiv \"%s\""
 
-#: builtin/push.c:413
+#: builtin/push.c:396
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -7971,95 +7916,95 @@ msgstr ""
 "\n"
 "    git push <namn>\n"
 
-#: builtin/push.c:428
+#: builtin/push.c:411
 msgid "--all and --tags are incompatible"
 msgstr "--all och --tags är inkompatibla"
 
-#: builtin/push.c:429
+#: builtin/push.c:412
 msgid "--all can't be combined with refspecs"
 msgstr "--all kan inte kombineras med referensspecifikationer"
 
-#: builtin/push.c:434
+#: builtin/push.c:417
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror och --tags är inkompatibla"
 
-#: builtin/push.c:435
+#: builtin/push.c:418
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror kan inte kombineras med referensspecifikationer"
 
-#: builtin/push.c:440
+#: builtin/push.c:423
 msgid "--all and --mirror are incompatible"
 msgstr "--all och --mirror är inkompatibla"
 
-#: builtin/push.c:500
+#: builtin/push.c:483
 msgid "repository"
 msgstr "arkiv"
 
-#: builtin/push.c:501
+#: builtin/push.c:484
 msgid "push all refs"
 msgstr "sänd alla referenser"
 
-#: builtin/push.c:502
+#: builtin/push.c:485
 msgid "mirror all refs"
 msgstr "spegla alla referenser"
 
-#: builtin/push.c:504
+#: builtin/push.c:487
 msgid "delete refs"
 msgstr "ta bort referenser"
 
-#: builtin/push.c:505
+#: builtin/push.c:488
 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:508
+#: builtin/push.c:491
 msgid "force updates"
 msgstr "tvinga uppdateringar"
 
-#: builtin/push.c:510
+#: builtin/push.c:493
 msgid "refname>:<expect"
 msgstr "refnamn>:<förvänta"
 
-#: builtin/push.c:511
+#: builtin/push.c:494
 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:513
+#: builtin/push.c:496
 msgid "check"
 msgstr "kontrollera"
 
-#: builtin/push.c:514
+#: builtin/push.c:497
 msgid "control recursive pushing of submodules"
 msgstr "styr rekursiv insändning av undermoduler"
 
-#: builtin/push.c:516
+#: builtin/push.c:499
 msgid "use thin pack"
 msgstr "använd tunna paket"
 
-#: builtin/push.c:517 builtin/push.c:518
+#: builtin/push.c:500 builtin/push.c:501
 msgid "receive pack program"
 msgstr "program för att ta emot paket"
 
-#: builtin/push.c:519
+#: builtin/push.c:502
 msgid "set upstream for git pull/status"
 msgstr "ställ in uppström för git pull/status"
 
-#: builtin/push.c:522
+#: builtin/push.c:505
 msgid "prune locally removed refs"
 msgstr "ta bort lokalt borttagna referenser"
 
-#: builtin/push.c:524
+#: builtin/push.c:507
 msgid "bypass pre-push hook"
 msgstr "förbigå pre-push-krok"
 
-#: builtin/push.c:525
+#: builtin/push.c:508
 msgid "push missing but relevant tags"
 msgstr "sänd in saknade men relevanta taggar"
 
-#: builtin/push.c:535
+#: 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:537
+#: builtin/push.c:520
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete kan inte användas utan referenser"
 
@@ -8645,67 +8590,75 @@ msgstr "Kommer inte ta bort alla icke-sänd-URL:er"
 msgid "be verbose; must be placed before a subcommand"
 msgstr "var pratsam; måste skrivas före ett underkommando"
 
-#: builtin/repack.c:15
+#: builtin/repack.c:16
 msgid "git repack [options]"
 msgstr "git repack [flaggor]"
 
-#: builtin/repack.c:143
+#: builtin/repack.c:156
 msgid "pack everything in a single pack"
 msgstr "packa allt i ett enda paket"
 
-#: builtin/repack.c:145
+#: builtin/repack.c:158
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "samma som -a, och gör onåbara objekt lösa"
 
-#: builtin/repack.c:148
+#: builtin/repack.c:161
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "ta bort överflödiga paket, och kör git-prune-packed"
 
-#: builtin/repack.c:150
+#: builtin/repack.c:163
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "sänd --no-reuse-delta till git-pack-objects"
 
-#: builtin/repack.c:152
+#: builtin/repack.c:165
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "sänd --no-reuse-object till git-pack-objects"
 
-#: builtin/repack.c:154
+#: builtin/repack.c:167
 msgid "do not run git-update-server-info"
 msgstr "kör inte git-update-server-info"
 
-#: builtin/repack.c:157
+#: builtin/repack.c:170
 msgid "pass --local to git-pack-objects"
 msgstr "sänd --local till git-pack-objects"
 
-#: builtin/repack.c:158
+#: builtin/repack.c:172
+msgid "write bitmap index"
+msgstr "skriv bitkartindex"
+
+#: builtin/repack.c:173
 msgid "approxidate"
 msgstr "cirkadatum"
 
-#: builtin/repack.c:159
+#: builtin/repack.c:174
 msgid "with -A, do not loosen objects older than this"
 msgstr "med -A, lös inte upp objekt äldre än detta"
 
-#: builtin/repack.c:161
+#: builtin/repack.c:176
 msgid "size of the window used for delta compression"
 msgstr "storlek på fönster använt för deltakomprimering"
 
-#: builtin/repack.c:162 builtin/repack.c:166
+#: builtin/repack.c:177 builtin/repack.c:181
 msgid "bytes"
 msgstr "byte"
 
-#: builtin/repack.c:163
+#: builtin/repack.c:178
 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:165
+#: builtin/repack.c:180
 msgid "limits the maximum delta depth"
 msgstr "begränsa maximalt deltadjup"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:182
 msgid "maximum size of each packfile"
 msgstr "maximal storlek på varje paketfil"
 
-#: builtin/repack.c:343
+#: builtin/repack.c:184
+msgid "repack objects in packs marked with .keep"
+msgstr "packa om objekt i paket märkta med .keep"
+
+#: builtin/repack.c:371
 #, c-format
 msgid "removing '%s' failed"
 msgstr "misslyckades ta bort \"%s\""
@@ -8798,75 +8751,83 @@ msgstr "Kunde inte hitta träder för %s."
 msgid "HEAD is now at %s"
 msgstr "HEAD är nu på %s"
 
-#: builtin/reset.c:172
+#: builtin/reset.c:182
 #, 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:262
+#: builtin/reset.c:273
 msgid "be quiet, only report errors"
 msgstr "var tyst, rapportera endast fel"
 
-#: builtin/reset.c:264
+#: builtin/reset.c:275
 msgid "reset HEAD and index"
 msgstr "återställ HEAD och index"
 
-#: builtin/reset.c:265
+#: builtin/reset.c:276
 msgid "reset only HEAD"
 msgstr "återställ endast HEAD"
 
-#: builtin/reset.c:267 builtin/reset.c:269
+#: builtin/reset.c:278 builtin/reset.c:280
 msgid "reset HEAD, index and working tree"
 msgstr "återställ HEAD, index och arbetskatalog"
 
-#: builtin/reset.c:271
+#: builtin/reset.c:282
 msgid "reset HEAD but keep local changes"
 msgstr "återställ HEAD men behåll lokala ändringar"
 
-#: builtin/reset.c:289
+#: builtin/reset.c:285
+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
 #, c-format
 msgid "Failed to resolve '%s' as a valid revision."
 msgstr "Kunde inte slå upp \"%s\" som en giltig revision."
 
-#: builtin/reset.c:292 builtin/reset.c:300
+#: builtin/reset.c:305 builtin/reset.c:313
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "Kan inte tolka objektet \"%s\""
 
-#: builtin/reset.c:297
+#: builtin/reset.c:310
 #, 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:306
+#: builtin/reset.c:319
 msgid "--patch is incompatible with --{hard,mixed,soft}"
 msgstr "--patch är inkompatibel med --{hard,mixed,soft}"
 
-#: builtin/reset.c:315
+#: builtin/reset.c:328
 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:317
+#: builtin/reset.c:330
 #, c-format
 msgid "Cannot do %s reset with paths."
 msgstr "Kan inte göra %s återställning med sökvägar."
 
-#: builtin/reset.c:327
+#: builtin/reset.c:340
 #, 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
+msgid "-N can only be used with --mixed"
+msgstr "-N kan endast användas med --mixed"
+
+#: builtin/reset.c:361
 msgid "Unstaged changes after reset:"
 msgstr "Oköade ändringar efter återställning:"
 
-#: builtin/reset.c:350
+#: builtin/reset.c:367
 #, c-format
 msgid "Could not reset index file to revision '%s'."
 msgstr "Kunde inte återställa indexfilen till versionen \"%s\"."
 
-#: builtin/reset.c:355
+#: builtin/reset.c:372
 msgid "Could not write new index file."
 msgstr "Kunde inte skriva ny indexfil."
 
@@ -8886,7 +8847,7 @@ msgstr "sluta tolka efter första argument som inte är flagga"
 msgid "output in stuck long form"
 msgstr "utdata fast i lång form"
 
-#: builtin/rev-parse.c:486
+#: builtin/rev-parse.c:497
 msgid ""
 "git rev-parse --parseopt [options] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -8958,35 +8919,35 @@ msgstr "alternativ"
 msgid "option for merge strategy"
 msgstr "alternativ för sammanslagningsstrategi"
 
-#: builtin/revert.c:102
+#: builtin/revert.c:104
 msgid "append commit name"
 msgstr "lägg till incheckningsnamn"
 
-#: builtin/revert.c:103
+#: builtin/revert.c:105
 msgid "allow fast-forward"
 msgstr "tillåt snabbspolning"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:106
 msgid "preserve initially empty commits"
 msgstr "behåll incheckningar som börjar som tomma"
 
-#: builtin/revert.c:105
+#: builtin/revert.c:107
 msgid "allow commits with empty messages"
 msgstr "tillåt incheckningar med tomt meddelande"
 
-#: builtin/revert.c:106
+#: builtin/revert.c:108
 msgid "keep redundant, empty commits"
 msgstr "behåll redundanta, tomma incheckningar"
 
-#: builtin/revert.c:110
+#: builtin/revert.c:112
 msgid "program error"
 msgstr "programfel"
 
-#: builtin/revert.c:195
+#: builtin/revert.c:197
 msgid "revert failed"
 msgstr "\"revert\" misslyckades"
 
-#: builtin/revert.c:210
+#: builtin/revert.c:212
 msgid "cherry-pick failed"
 msgstr "\"cherry-pick\" misslyckades"
 
@@ -9260,11 +9221,11 @@ msgstr "ta bort symbolisk referens"
 msgid "shorten ref output"
 msgstr "förkorta ref-utdata"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
 msgid "reason"
 msgstr "skäl"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
 msgid "reason of the update"
 msgstr "skäl till uppdateringen"
 
@@ -9290,32 +9251,32 @@ msgstr ""
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <taggnamn>..."
 
-#: builtin/tag.c:60
+#: builtin/tag.c:67
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "felformat objekt vid \"%s\""
 
-#: builtin/tag.c:207
+#: builtin/tag.c:239
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "taggnamnet för långt: %.*s..."
 
-#: builtin/tag.c:212
+#: builtin/tag.c:244
 #, c-format
 msgid "tag '%s' not found."
 msgstr "taggen \"%s\" hittades inte."
 
-#: builtin/tag.c:227
+#: builtin/tag.c:259
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Tog bort tagg \"%s\" (var %s)\n"
 
-#: builtin/tag.c:239
+#: builtin/tag.c:271
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "kunde inte bekräfta taggen \"%s\""
 
-#: builtin/tag.c:249
+#: builtin/tag.c:281
 #, c-format
 msgid ""
 "\n"
@@ -9326,7 +9287,7 @@ msgstr ""
 "Skriv ett taggmeddelande\n"
 "Rader som inleds med \"%c\" ignoreras.\n"
 
-#: builtin/tag.c:253
+#: builtin/tag.c:285
 #, c-format
 msgid ""
 "\n"
@@ -9339,254 +9300,271 @@ msgstr ""
 "Rader som inleds med \"%c\" kommer behållas; du kan själv ta bort dem om\n"
 "du vill.\n"
 
-#: builtin/tag.c:292
+#: builtin/tag.c:324
 msgid "unable to sign the tag"
 msgstr "kunde inte signera taggen"
 
-#: builtin/tag.c:294
+#: builtin/tag.c:326
 msgid "unable to write tag file"
 msgstr "kunde inte skriva tagg-filen"
 
-#: builtin/tag.c:319
+#: builtin/tag.c:351
 msgid "bad object type."
 msgstr "felaktig objekttyp"
 
-#: builtin/tag.c:332
+#: builtin/tag.c:364
 msgid "tag header too big."
 msgstr "tagghuvud för stort."
 
-#: builtin/tag.c:368
+#: builtin/tag.c:400
 msgid "no tag message?"
 msgstr "inget taggmeddelande?"
 
-#: builtin/tag.c:374
+#: builtin/tag.c:406
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "Taggmeddelandet har lämnats i %s\n"
 
-#: builtin/tag.c:423
+#: builtin/tag.c:455
 msgid "switch 'points-at' requires an object"
 msgstr "flaggan \"points-at\" behöver ett object"
 
-#: builtin/tag.c:425
+#: builtin/tag.c:457
 #, c-format
 msgid "malformed object name '%s'"
 msgstr "felformat objektnamn \"%s\""
 
-#: builtin/tag.c:445
+#: builtin/tag.c:480
+#, c-format
+msgid "unsupported sort specification %s"
+msgstr "sorteringsangivelsen %s stöds ej"
+
+#: builtin/tag.c:500
 msgid "list tag names"
 msgstr "lista taggnamn"
 
-#: builtin/tag.c:447
+#: builtin/tag.c:502
 msgid "print <n> lines of each tag message"
 msgstr "visa <n> rader från varje taggmeddelande"
 
-#: builtin/tag.c:449
+#: builtin/tag.c:504
 msgid "delete tags"
 msgstr "ta bort taggar"
 
-#: builtin/tag.c:450
+#: builtin/tag.c:505
 msgid "verify tags"
 msgstr "verifiera taggar"
 
-#: builtin/tag.c:452
+#: builtin/tag.c:507
 msgid "Tag creation options"
 msgstr "Alternativ för att skapa taggar"
 
-#: builtin/tag.c:454
+#: builtin/tag.c:509
 msgid "annotated tag, needs a message"
 msgstr "annoterad tagg, behöver meddelande"
 
-#: builtin/tag.c:456
+#: builtin/tag.c:511
 msgid "tag message"
 msgstr "taggmeddelande"
 
-#: builtin/tag.c:458
+#: builtin/tag.c:513
 msgid "annotated and GPG-signed tag"
 msgstr "annoterad och GPG-signerad tagg"
 
-#: builtin/tag.c:462
+#: builtin/tag.c:517
 msgid "use another key to sign the tag"
 msgstr "använd annan nyckel för att signera taggen"
 
-#: builtin/tag.c:463
+#: builtin/tag.c:518
 msgid "replace the tag if exists"
 msgstr "ersätt taggen om den finns"
 
-#: builtin/tag.c:464
+#: builtin/tag.c:519
 msgid "show tag list in columns"
 msgstr "lista taggar i spalter"
 
-#: builtin/tag.c:466
+#: builtin/tag.c:521
+msgid "sort tags"
+msgstr "sortera taggar"
+
+#: builtin/tag.c:525
 msgid "Tag listing options"
 msgstr "Alternativ för listning av taggar"
 
-#: builtin/tag.c:469
+#: builtin/tag.c:528 builtin/tag.c:534
 msgid "print only tags that contain the commit"
 msgstr "visa endast taggar som innehåller incheckningen"
 
-#: builtin/tag.c:475
+#: builtin/tag.c:540
 msgid "print only tags of the object"
 msgstr "visa endast taggar för objektet"
 
-#: builtin/tag.c:501
+#: builtin/tag.c:566
 msgid "--column and -n are incompatible"
 msgstr "--column och -n är inkompatibla"
 
-#: builtin/tag.c:518
+#: builtin/tag.c:578
+msgid "--sort and -n are incompatible"
+msgstr "--sort och -n är inkompatibla"
+
+#: builtin/tag.c:585
 msgid "-n option is only allowed with -l."
 msgstr "Flaggan -n är endast tillåten tillsammans med -l."
 
-#: builtin/tag.c:520
+#: builtin/tag.c:587
 msgid "--contains option is only allowed with -l."
 msgstr "Flaggan --contains är endast tillåten tillsammans med -l"
 
-#: builtin/tag.c:522
+#: builtin/tag.c:589
 msgid "--points-at option is only allowed with -l."
 msgstr "Flaggan --points-at är endast tillåten tillsammans med -l."
 
-#: builtin/tag.c:530
+#: builtin/tag.c:597
 msgid "only one -F or -m option is allowed."
 msgstr "endast en av flaggorna -F eller -m tillåts."
 
-#: builtin/tag.c:550
+#: builtin/tag.c:617
 msgid "too many params"
 msgstr "för många parametrar"
 
-#: builtin/tag.c:556
+#: builtin/tag.c:623
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "\"%s\" är inte ett giltigt taggnamn."
 
-#: builtin/tag.c:561
+#: builtin/tag.c:628
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "taggen \"%s\" finns redan"
 
-#: builtin/tag.c:579
+#: builtin/tag.c:646
 #, c-format
 msgid "%s: cannot lock the ref"
 msgstr "%s: kan inte låsa referensen"
 
-#: builtin/tag.c:581
+#: builtin/tag.c:648
 #, c-format
 msgid "%s: cannot update the ref"
 msgstr "%s: kan inte uppdatera referensen"
 
-#: builtin/tag.c:583
+#: builtin/tag.c:650
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Uppdaterad tagg \"%s\" (var %s)\n"
 
-#: builtin/update-index.c:402
+#: builtin/unpack-objects.c:483
+msgid "Unpacking objects"
+msgstr "Packar upp objekt"
+
+#: builtin/update-index.c:399
 msgid "git update-index [options] [--] [<file>...]"
 msgstr "git update-index [flaggor] [--] [<fil>...]"
 
-#: builtin/update-index.c:720
+#: builtin/update-index.c:748
 msgid "continue refresh even when index needs update"
 msgstr "fortsätt uppdatera även när index inte är àjour"
 
-#: builtin/update-index.c:723
+#: builtin/update-index.c:751
 msgid "refresh: ignore submodules"
 msgstr "refresh: ignorera undermoduler"
 
-#: builtin/update-index.c:726
+#: builtin/update-index.c:754
 msgid "do not ignore new files"
 msgstr "ignorera inte nya filer"
 
-#: builtin/update-index.c:728
+#: builtin/update-index.c:756
 msgid "let files replace directories and vice-versa"
 msgstr "låt filer ersätta kataloger och omvänt"
 
-#: builtin/update-index.c:730
+#: builtin/update-index.c:758
 msgid "notice files missing from worktree"
 msgstr "lägg märke till filer som saknas i arbetskatalogen"
 
-#: builtin/update-index.c:732
+#: builtin/update-index.c:760
 msgid "refresh even if index contains unmerged entries"
 msgstr "uppdatera även om indexet innehåller ej sammanslagna poster"
 
-#: builtin/update-index.c:735
+#: builtin/update-index.c:763
 msgid "refresh stat information"
 msgstr "uppdatera statusinformation"
 
-#: builtin/update-index.c:739
+#: builtin/update-index.c:767
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "som --refresh, men ignorera assume-unchanged-inställning"
 
-#: builtin/update-index.c:743
-msgid "<mode> <object> <path>"
-msgstr "<läge> <objekt> <sökväg>"
+#: builtin/update-index.c:771
+msgid "<mode>,<object>,<path>"
+msgstr "<läge>,<objekt>,<sökväg>"
 
-#: builtin/update-index.c:744
+#: builtin/update-index.c:772
 msgid "add the specified entry to the index"
 msgstr "lägg till angiven post i indexet"
 
-#: builtin/update-index.c:748
+#: builtin/update-index.c:776
 msgid "(+/-)x"
 msgstr "(+/-)x"
 
-#: builtin/update-index.c:749
+#: builtin/update-index.c:777
 msgid "override the executable bit of the listed files"
 msgstr "överstyr exekveringsbiten för angivna filer"
 
-#: builtin/update-index.c:753
+#: builtin/update-index.c:781
 msgid "mark files as \"not changing\""
 msgstr "markera filer som \"ändras inte\""
 
-#: builtin/update-index.c:756
+#: builtin/update-index.c:784
 msgid "clear assumed-unchanged bit"
 msgstr "rensa \"assume-unchanged\"-biten"
 
-#: builtin/update-index.c:759
+#: builtin/update-index.c:787
 msgid "mark files as \"index-only\""
 msgstr "markera filer som \"endast index\""
 
-#: builtin/update-index.c:762
+#: builtin/update-index.c:790
 msgid "clear skip-worktree bit"
 msgstr "töm \"skip-worktree\"-biten"
 
-#: builtin/update-index.c:765
+#: builtin/update-index.c:793
 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:767
+#: builtin/update-index.c:795
 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:769
+#: builtin/update-index.c:797
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "med --stdin: indatarader termineras med null-byte"
 
-#: builtin/update-index.c:771
+#: builtin/update-index.c:799
 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:775
+#: builtin/update-index.c:803
 msgid "add entries from standard input to the index"
-msgstr "lägg poster från från standard in till indexet"
+msgstr "lägg poster från standard in till indexet"
 
-#: builtin/update-index.c:779
+#: builtin/update-index.c:807
 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:783
+#: builtin/update-index.c:811
 msgid "only update entries that differ from HEAD"
 msgstr "uppdatera endast poster som skiljer sig från HEAD"
 
-#: builtin/update-index.c:787
+#: builtin/update-index.c:815
 msgid "ignore files missing from worktree"
 msgstr "ignorera filer som saknas i arbetskatalogen"
 
-#: builtin/update-index.c:790
+#: builtin/update-index.c:818
 msgid "report actions to standard output"
 msgstr "raportera åtgärder på standard ut"
 
-#: builtin/update-index.c:792
+#: builtin/update-index.c:820
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(för porslin) glöm sparade olösta konflikter"
 
-#: builtin/update-index.c:796
+#: builtin/update-index.c:824
 msgid "write index in this format"
 msgstr "skriv index i detta format"
 
@@ -9602,19 +9580,19 @@ msgstr "git update-ref [flaggor]    <refnamn> <gammaltvärde> [<nyttvärde>]"
 msgid "git update-ref [options] --stdin [-z]"
 msgstr "git update-ref [flaggor] --stdin [-z]"
 
-#: builtin/update-ref.c:255
+#: builtin/update-ref.c:256
 msgid "delete the reference"
 msgstr "ta bort referensen"
 
-#: builtin/update-ref.c:257
+#: builtin/update-ref.c:258
 msgid "update <refname> not the one it points to"
 msgstr "uppdatera <refnamn> inte det den pekar på"
 
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:259
 msgid "stdin has NUL-terminated arguments"
 msgstr "standard in har NUL-terminerade argument"
 
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:260
 msgid "read updates from stdin"
 msgstr "läs uppdateringar från standard in"
 
@@ -9672,23 +9650,23 @@ msgstr ""
 "några konceptvägledningar. Se \"git help <kommando>\" eller \"git help\n"
 "<koncept>\" för att läsa mer om specifika underkommandon och koncept."
 
-#: parse-options.h:146
-msgid "expiry date"
-msgstr "giltig till"
+#: parse-options.h:143
+msgid "expiry-date"
+msgstr "giltig-till"
 
-#: parse-options.h:161
+#: parse-options.h:158
 msgid "no-op (backward compatibility)"
 msgstr "ingen funktion (bakåtkompatibilitet)"
 
-#: parse-options.h:235
+#: parse-options.h:232
 msgid "be more verbose"
 msgstr "var mer pratsam"
 
-#: parse-options.h:237
+#: parse-options.h:234
 msgid "be more quiet"
 msgstr "var mer tyst"
 
-#: parse-options.h:243
+#: parse-options.h:240
 msgid "use <n> digits to display SHA-1s"
 msgstr "använd <n> siffror för att visa SHA-1:or"
 
@@ -9776,11 +9754,11 @@ msgstr "Visa status för arbetskatalogen"
 msgid "Create, list, delete or verify a tag object signed with GPG"
 msgstr "Skapa, visa, ta bort eller verifiera GPG-signerat taggobjekt"
 
-#: git-am.sh:50
+#: git-am.sh:52
 msgid "You need to set your committer info first"
 msgstr "Du måste ställa in din incheckarinformation först"
 
-#: git-am.sh:95
+#: git-am.sh:97
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
@@ -9788,7 +9766,7 @@ msgstr ""
 "Du verkar ha flyttat HEAD sedan \"am\" sist misslyckades.\n"
 "Återställer inte till ORIG_HEAD"
 
-#: git-am.sh:105
+#: git-am.sh:107
 #, sh-format
 msgid ""
 "When you have resolved this problem, run \"$cmdline --continue\".\n"
@@ -9799,21 +9777,21 @@ msgstr ""
 "Om du vill hoppa över patchen kör du istället \"$cmdline --skip\".\n"
 "För att återställa originalgrenen och avbryta kör du \"$cmdline --abort\"."
 
-#: git-am.sh:121
+#: git-am.sh:123
 msgid "Cannot fall back to three-way merge."
 msgstr "Kan inte falla tillbaka på trevägssammanslagning."
 
-#: git-am.sh:137
+#: git-am.sh:139
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
 "Arkivet saknar objekt som behövs för att falla tillbaka på 3-"
 "vägssammanslagning."
 
-#: git-am.sh:139
+#: git-am.sh:141
 msgid "Using index info to reconstruct a base tree..."
-msgstr "Använder indexinfo för att åteskapa ett basträd..."
+msgstr "Använder indexinfo för att återskapa ett basträd..."
 
-#: git-am.sh:154
+#: git-am.sh:156
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
@@ -9821,29 +9799,29 @@ msgstr ""
 "Har du handredigerat din patch?\n"
 "Den kan inte tillämpas på blobbar som antecknats i dess index."
 
-#: git-am.sh:163
+#: git-am.sh:165
 msgid "Falling back to patching base and 3-way merge..."
 msgstr ""
 "Faller tillbaka på att patcha grundversionen och trevägssammanslagning..."
 
-#: git-am.sh:179
+#: git-am.sh:181
 msgid "Failed to merge in the changes."
 msgstr "Misslyckads slå ihop ändringarna."
 
-#: git-am.sh:274
+#: git-am.sh:276
 msgid "Only one StGIT patch series can be applied at once"
 msgstr "Endast en StGIT-patchserie kan tillämpas åt gången"
 
-#: git-am.sh:361
+#: git-am.sh:363
 #, sh-format
 msgid "Patch format $patch_format is not supported."
 msgstr "Patchformatet $patch_format stöds inte."
 
-#: git-am.sh:363
+#: git-am.sh:365
 msgid "Patch format detection failed."
 msgstr "Misslyckades detektera patchformat."
 
-#: git-am.sh:389
+#: 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."
@@ -9851,16 +9829,16 @@ msgstr ""
 "Flaggan -b/--binary har varit utan funktion länge, och\n"
 "kommer tas bort. Vi ber dig att inte använda den längre."
 
-#: git-am.sh:479
+#: git-am.sh:486
 #, sh-format
 msgid "previous rebase directory $dotest still exists but mbox given."
 msgstr "tidigare rebase-katalog $dotest finns fortfarande, men mbox angavs."
 
-#: git-am.sh:484
+#: git-am.sh:491
 msgid "Please make up your mind. --skip or --abort?"
 msgstr "Bestäm dig. --skip eller --abort?"
 
-#: git-am.sh:520
+#: git-am.sh:527
 #, sh-format
 msgid ""
 "Stray $dotest directory found.\n"
@@ -9869,16 +9847,16 @@ msgstr ""
 "Kvarbliven katalog $dotest hittades.\n"
 "Använd \"git am --abort\" för att ta bort den."
 
-#: git-am.sh:528
+#: git-am.sh:535
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr "Lösningsoperation pågår inte, vi återupptar inte."
 
-#: git-am.sh:594
+#: git-am.sh:601
 #, sh-format
 msgid "Dirty index: cannot apply patches (dirty: $files)"
 msgstr "Smutsigt index: kan inte tillämpa patchar (smutsiga: $files)"
 
-#: git-am.sh:698
+#: git-am.sh:705
 #, sh-format
 msgid ""
 "Patch is empty.  Was it split wrong?\n"
@@ -9889,32 +9867,32 @@ msgstr ""
 "Om du vill hoppa över patchen kör du istället \"$cmdline --skip\".\n"
 "För att återställa originalgrenen och avbryta kör du \"$cmdline --abort\"."
 
-#: git-am.sh:725
+#: git-am.sh:732
 msgid "Patch does not have a valid e-mail address."
 msgstr "Patchen har inte någon giltig e-postadress."
 
-#: git-am.sh:772
+#: git-am.sh:779
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
 "kan inte vara interaktiv om standard in inte är ansluten till en terminal."
 
-#: git-am.sh:776
+#: git-am.sh:783
 msgid "Commit Body is:"
 msgstr "Incheckningskroppen är:"
 
 #. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
 #. in your translation. The program will only accept English
 #. input at this point.
-#: git-am.sh:783
+#: git-am.sh:790
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
 msgstr "Tillämpa? Y=ja/N=nej/E=redigera/V=visa patch/A=godta alla "
 
-#: git-am.sh:819
+#: git-am.sh:826
 #, sh-format
 msgid "Applying: $FIRSTLINE"
 msgstr "Tillämpar: $FIRSTLINE"
 
-#: git-am.sh:840
+#: 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"
@@ -9924,7 +9902,7 @@ msgstr ""
 "Om det inte är något kvar att köa kan det hända att något annat redan\n"
 "introducerat samma ändringar; kanske du bör hoppa över patchen."
 
-#: git-am.sh:848
+#: git-am.sh:855
 msgid ""
 "You still have unmerged paths in your index\n"
 "did you forget to use 'git add'?"
@@ -9932,16 +9910,16 @@ msgstr ""
 "Du har fortfarande sökvägar som inte slagits samman i ditt index\n"
 "glömde du använda \"git add\"?"
 
-#: git-am.sh:864
+#: git-am.sh:871
 msgid "No changes -- Patch already applied."
 msgstr "Inga ändringar -- Patchen har redan tillämpats."
 
-#: git-am.sh:874
+#: git-am.sh:881
 #, sh-format
 msgid "Patch failed at $msgnum $FIRSTLINE"
 msgstr "Patchen misslyckades vid $msgnum $FIRSTLINE"
 
-#: git-am.sh:877
+#: git-am.sh:884
 #, sh-format
 msgid ""
 "The copy of the patch that failed is found in:\n"
@@ -9950,7 +9928,7 @@ msgstr ""
 "En kopia av patchen som misslyckades finns i:\n"
 "   $dotest/patch"
 
-#: git-am.sh:895
+#: git-am.sh:902
 msgid "applying to an empty history"
 msgstr "tillämpar på en tom historik"
 
@@ -10019,8 +9997,6 @@ msgstr "Felaktig rev-indata: $rev"
 msgid "'git bisect bad' can take only one argument."
 msgstr "\"git bisect bad\" kan bara ta ett argument."
 
-#. have bad but not good.  we could bisect although
-#. this is less optimum.
 #: git-bisect.sh:273
 msgid "Warning: bisecting only with a bad commit."
 msgstr "Varning: utför \"bisect\" med endast en dålig incheckning"
@@ -10126,15 +10102,11 @@ msgstr ""
 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:223
+#: git-pull.sh:247
 msgid "updating an unborn branch with changes added to the index"
 msgstr "uppdaterar en ofödd gren med ändringar som lagts till i indexet"
 
-#. The fetch involved updating the current branch.
-#. The working tree and the index file is still based on the
-#. $orig_head commit, but we are merging into $curr_head.
-#. First update the working tree to match $curr_head.
-#: git-pull.sh:247
+#: git-pull.sh:271
 #, sh-format
 msgid ""
 "Warning: fetch updated the current branch head.\n"
@@ -10145,15 +10117,15 @@ msgstr ""
 "Varning: snabbspolar din arbetskatalog från\n"
 "Varning: incheckningen $orig_head."
 
-#: git-pull.sh:272
+#: git-pull.sh:296
 msgid "Cannot merge multiple branches into empty head"
 msgstr "Kan inte slå ihop flera grenar i ett tomt huvud."
 
-#: git-pull.sh:276
+#: git-pull.sh:300
 msgid "Cannot rebase onto multiple branches"
 msgstr "Kan inte utföra en \"rebase\" ovanpå flera grenar"
 
-#: git-rebase.sh:55
+#: 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"
@@ -10164,16 +10136,16 @@ msgstr ""
 "Om du vill hoppa över patchen kör du istället \"git rebase --skip\".\n"
 "För att återställa originalgrenen och avbryta kör du \"git rebase --abort\"."
 
-#: git-rebase.sh:158
+#: git-rebase.sh:164
 msgid "Applied autostash."
 msgstr "Tillämpade autostash."
 
-#: git-rebase.sh:161
+#: git-rebase.sh:167
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Kan inte spara $stash_sha1"
 
-#: git-rebase.sh:162
+#: git-rebase.sh:168
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
@@ -10183,31 +10155,31 @@ msgstr ""
 "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:201
+#: git-rebase.sh:207
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Kroken pre-rebase vägrade ombaseringen."
 
-#: git-rebase.sh:206
+#: git-rebase.sh:212
 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:346
+#: git-rebase.sh:350
 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:351
+#: git-rebase.sh:355
 msgid "No rebase in progress?"
 msgstr "Ingen ombasering pågår?"
 
-#: git-rebase.sh:362
+#: git-rebase.sh:366
 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:369
+#: git-rebase.sh:373
 msgid "Cannot read HEAD"
 msgstr "Kan inte läsa HEAD"
 
-#: git-rebase.sh:372
+#: git-rebase.sh:376
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -10215,12 +10187,12 @@ msgstr ""
 "Du måste redigera alla sammanslagningskonflikter och\n"
 "därefter markera dem som lösta med git add"
 
-#: git-rebase.sh:390
+#: git-rebase.sh:394
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Kunde inte flytta tillbaka till $head_name"
 
-#: git-rebase.sh:409
+#: git-rebase.sh:413
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -10241,66 +10213,65 @@ msgstr ""
 "och kör programmet igen. Jag avslutar ifall du fortfarande har\n"
 "något av värde där."
 
-#: git-rebase.sh:456
+#: git-rebase.sh:464
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "ogiltig uppström $upstream_name"
 
-#: git-rebase.sh:480
+#: git-rebase.sh:488
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: mer än en sammanslagningsbas finns"
 
-#: git-rebase.sh:483 git-rebase.sh:487
+#: git-rebase.sh:491 git-rebase.sh:495
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: ingen sammanslagningsbas finns"
 
-#: git-rebase.sh:492
+#: git-rebase.sh:500
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "Peka på en giltig incheckning: $onto_name"
 
-#: git-rebase.sh:515
+#: git-rebase.sh:523
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "ödesdigert: ingen sådan gren: $branch_name"
 
-#: git-rebase.sh:548
+#: git-rebase.sh:556
 msgid "Cannot autostash"
 msgstr "Kan inte utföra \"autostash\""
 
-#: git-rebase.sh:553
+#: git-rebase.sh:561
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Skapade autostash: $stash_abbrev"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:565
 msgid "Please commit or stash them."
 msgstr "Checka in eller använd \"stash\" på dem."
 
-#: git-rebase.sh:577
+#: git-rebase.sh:585
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "Aktuell gren $branch_name är à jour."
 
-#: git-rebase.sh:581
+#: git-rebase.sh:589
 #, 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:592
+#: git-rebase.sh:600
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Ändringar från $mb till $onto:"
 
-#. Detach HEAD and reset the tree
-#: git-rebase.sh:601
+#: git-rebase.sh:609
 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:611
+#: git-rebase.sh:619
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "Snabbspolade $branch_name till $onto_name."
@@ -10421,21 +10392,21 @@ msgstr "Kan inte ta bort ändrade filer ur kön"
 msgid "Index was not unstashed."
 msgstr "Indexet har inte tagits ur kön."
 
-#: git-stash.sh:523
+#: git-stash.sh:529
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Kastade ${REV} ($s)"
 
-#: git-stash.sh:524
+#: git-stash.sh:530
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Kunde inte kasta \"stash\"-post"
 
-#: git-stash.sh:531
+#: git-stash.sh:537
 msgid "No branch name specified"
 msgstr "Inget grennamn angavs"
 
-#: git-stash.sh:603
+#: git-stash.sh:609
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(För att återställa dem, skriv \"git stash apply\")"
 
@@ -10450,31 +10421,31 @@ msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
 msgstr ""
 "Hittade ingen undermodulmappning i .gitmodules för sökvägen \"$sm_path\""
 
-#: git-submodule.sh:281
+#: git-submodule.sh:287
 #, sh-format
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
 msgstr "Misslyckades klona \"$url\" till undermodulsökvägen \"$sm_path\""
 
-#: git-submodule.sh:293
+#: git-submodule.sh:299
 #, 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:403
+#: git-submodule.sh:409
 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å"
 
-#: git-submodule.sh:413
+#: git-submodule.sh:419
 #, 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:430
+#: git-submodule.sh:436
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "\"$sm_path\" finns redan i indexet"
 
-#: git-submodule.sh:434
+#: git-submodule.sh:440
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -10485,22 +10456,22 @@ msgstr ""
 "$sm_path\n"
 "Använd -f om du verkligen vill lägga till den"
 
-#: git-submodule.sh:452
+#: git-submodule.sh:458
 #, 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:454
+#: git-submodule.sh:460
 #, 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:462
+#: git-submodule.sh:468
 #, 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:464
+#: git-submodule.sh:470
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
@@ -10508,14 +10479,14 @@ msgstr ""
 "För att återanvända den lokala git-katalogen istället för att på nytt klona "
 "från"
 
-#: git-submodule.sh:466
+#: git-submodule.sh:472
 #, 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:467
+#: git-submodule.sh:473
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
@@ -10524,81 +10495,81 @@ msgstr ""
 "eller om du är osäker på vad det innebär, välj nytt namn med flaggan \"--name"
 "\"."
 
-#: git-submodule.sh:469
+#: git-submodule.sh:475
 #, 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:481
+#: git-submodule.sh:487
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Kan inte checka ut undermodulen \"$sm_path\""
 
-#: git-submodule.sh:486
+#: git-submodule.sh:492
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Misslyckades lägga till undermodulen \"$sm_path\""
 
-#: git-submodule.sh:495
+#: git-submodule.sh:501
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Misslyckades registrera undermodulen \"$sm_path\""
 
-#: git-submodule.sh:539
+#: git-submodule.sh:545
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "Går in i \"$prefix$displaypath\""
 
-#: git-submodule.sh:559
+#: git-submodule.sh:565
 #, 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:605
+#: git-submodule.sh:611
 #, 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:614
+#: git-submodule.sh:620
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
 msgstr "Misslyckades registrera url för undermodulsökväg \"$displaypath\""
 
-#: git-submodule.sh:616
+#: git-submodule.sh:622
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr ""
 "Undermodulen \"$name\" ($url) registrerad för sökvägen \"$displaypath\""
 
-#: git-submodule.sh:633
+#: git-submodule.sh:639
 #, 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:671
+#: git-submodule.sh:677
 #, 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:688
+#: git-submodule.sh:694
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr ""
 "Undermodulens arbetskatalog \"$displaypath\" innehåller katalogen \".git\""
 
-#: git-submodule.sh:689
+#: git-submodule.sh:695
 #, 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:695
+#: git-submodule.sh:701
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -10607,28 +10578,28 @@ msgstr ""
 "Undermodulens arbetskatalog \"$displaypath\" har lokala ändringar; \"-f\" "
 "kastar bort dem"
 
-#: git-submodule.sh:698
+#: git-submodule.sh:704
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Rensade katalogen \"$displaypath\""
 
-#: git-submodule.sh:699
+#: git-submodule.sh:705
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "Kunde inte ta bort undermodulens arbetskatalog \"$displaypath\""
 
-#: git-submodule.sh:702
+#: git-submodule.sh:708
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "Kunde inte skapa tom undermodulskatalog \"$displaypath\""
 
-#: git-submodule.sh:711
+#: git-submodule.sh:717
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 "Undermodulen \"$name\" ($url) avregistrerad för sökvägen \"$displaypath\""
 
-#: git-submodule.sh:834
+#: git-submodule.sh:833
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
@@ -10637,109 +10608,219 @@ msgstr ""
 "Undermodulen \"$displaypath\" har inte initierats\n"
 "Kanske du vill köra \"update --init\"?"
 
-#: git-submodule.sh:847
+#: git-submodule.sh:846
 #, 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:856
+#: git-submodule.sh:855
 #, 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:880
+#: git-submodule.sh:879
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Kan inte hämta i undermodulsökväg \"$displaypath\""
 
+#: git-submodule.sh:893
+#, 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
 #, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "Undermodulsökvägen \"$displaypath\": checkade ut \"$sha1\""
+
+#: git-submodule.sh:898
+#, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "Kan inte ombasera \"$sha1\" i undermodulsökvägen \"$displaypath\""
 
-#: git-submodule.sh:895
+#: git-submodule.sh:899
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Undermodulsökvägen \"$displaypath\": ombaserade in i \"$sha1\""
 
-#: git-submodule.sh:900
+#: git-submodule.sh:904
 #, 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:901
+#: git-submodule.sh:905
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Undermodulsökvägen \"$displaypath\": sammanslagen i \"$sha1\""
 
-#: git-submodule.sh:906
+#: git-submodule.sh:910
 #, 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:907
+#: git-submodule.sh:911
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr "Undermodulsökvägen \"$prefix$sm_path\": \"$command $sha1\""
 
-#: git-submodule.sh:912
-#, 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:913
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr "Undermodulsökvägen \"$displaypath\": checkade ut \"$sha1\""
-
-#: git-submodule.sh:940
+#: git-submodule.sh:941
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Misslyckades rekursera in i undermodulsökvägen \"$displaypath\""
 
-#: git-submodule.sh:1048
+#: git-submodule.sh:1049
 msgid "The --cached option cannot be used with the --files option"
 msgstr "Flaggan --cached kan inte användas med flaggan --files"
 
-#. unexpected type
-#: git-submodule.sh:1096
+#: git-submodule.sh:1097
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "oväntat läge $mod_dst"
 
-#: git-submodule.sh:1116
+#: git-submodule.sh:1117
 #, 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:1119
+#: git-submodule.sh:1120
 #, 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:1122
+#: git-submodule.sh:1123
 #, 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:1147
+#: git-submodule.sh:1148
 msgid "blob"
 msgstr "blob"
 
-#: git-submodule.sh:1261
+#: git-submodule.sh:1262
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Misslyckades rekursera in i undermodulsökvägen \"$sm_path\""
 
-#: git-submodule.sh:1325
+#: git-submodule.sh:1326
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Synkroniserar undermodul-url för \"$displaypath\""
 
+#~ msgid "Tracking not set up: name too long: %s"
+#~ msgstr "Spårning har inte ställts in: namnet för långt: %s"
+
+#~ msgid "could not find .gitmodules in index"
+#~ msgstr "kunde inte hitta .gitmodules i indexet"
+
+#~ msgid "reading updated .gitmodules failed"
+#~ msgstr "misslyckades läsa uppdaterad .gitmodules"
+
+#~ msgid "unable to stat updated .gitmodules"
+#~ msgstr "kan inte ta status på uppdaterad .gitmodules"
+
+#~ msgid "unable to remove .gitmodules from index"
+#~ msgstr "kan inte ta bort .gitmodules från indexet"
+
+#~ msgid "adding updated .gitmodules failed"
+#~ msgstr "misslyckades lägga till uppdaterad .gitmodules"
+
+#~ msgid "bug"
+#~ msgstr "programfel"
+
+#~ msgid "ahead "
+#~ msgstr "före "
+
+#~ msgid ", behind "
+#~ msgstr ", efter "
+
+#~ msgid ""
+#~ "The behavior of 'git add %s (or %s)' with no path argument from a\n"
+#~ "subdirectory of the tree will change in Git 2.0 and should not be used "
+#~ "anymore.\n"
+#~ "To add content for the whole tree, run:\n"
+#~ "\n"
+#~ "  git add %s :/\n"
+#~ "  (or git add %s :/)\n"
+#~ "\n"
+#~ "To restrict the command to the current directory, run:\n"
+#~ "\n"
+#~ "  git add %s .\n"
+#~ "  (or git add %s .)\n"
+#~ "\n"
+#~ "With the current Git version, the command is restricted to the current "
+#~ "directory.\n"
+#~ msgstr ""
+#~ "Beteendet för \"git add %s (eller %s)\" utan sökvägsargument från en\n"
+#~ "underkatalog i ett träd kommer ändras i Git 2.0 och bör inte längre "
+#~ "användas.\n"
+#~ "För att lägga till innehållet för hela trädet, använd:\n"
+#~ "\n"
+#~ "  git add %s :/\n"
+#~ "  (eller git add %s :/)\n"
+#~ "\n"
+#~ "För att begränsa kommandot till aktuell katalog, använd:\n"
+#~ "\n"
+#~ "  git add %s .\n"
+#~ "  (eller git add %s .)\n"
+#~ "\n"
+#~ "I nuvarande version av Git begränsas kommandot till aktuell katalog.\n"
+
+#~ msgid ""
+#~ "You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
+#~ "whose behaviour will change in Git 2.0 with respect to paths you "
+#~ "removed.\n"
+#~ "Paths like '%s' that are\n"
+#~ "removed from your working tree are ignored with this version of Git.\n"
+#~ "\n"
+#~ "* 'git add --ignore-removal <pathspec>', which is the current default,\n"
+#~ "  ignores paths you removed from your working tree.\n"
+#~ "\n"
+#~ "* 'git add --all <pathspec>' will let you also record the removals.\n"
+#~ "\n"
+#~ "Run 'git status' to check the paths you removed from your working tree.\n"
+#~ msgstr ""
+#~ "Du körde \"git add\" utan varken \"-A (--all)\" eller \"--ignore-removal"
+#~ "\".\n"
+#~ "Beteendet kommer ändras i Git 2.0 vad gäller sökvägar du tagit bort.\n"
+#~ "Sökvägar som \"%s\", som har\n"
+#~ "tagits bort från din arbetskatalog ignoreras i den här versionen av Git.\n"
+#~ "\n"
+#~ "* \"git add --ignore-removal <sökväg>\", som är förvalet just nu,\n"
+#~ "  ignorerar sökvägar du har tagit bort från arbetskatalogen.\n"
+#~ "\n"
+#~ "* \"git add --all <sökväg>\" låter dig även registrera borttagningarna.\n"
+#~ "\n"
+#~ "Kör \"git status\" för att kontrollera sökvägarna du tagit bort från\n"
+#~ "arbetskatalogen.\n"
+
+#~ msgid "key id"
+#~ msgstr "nyckel-id"
+
+#~ msgid ""
+#~ "Auto packing the repository for optimum performance. You may also\n"
+#~ "run \"git gc\" manually. See \"git help gc\" for more information.\n"
+#~ msgstr ""
+#~ "Packar arkivet automatiskt för optimal prestanda. Du kan även\n"
+#~ "köra \"git gc\" manuellt. Se \"git help gc\" för mer information.\n"
+
+#~ msgid ""
+#~ "Updates were rejected because a pushed branch tip is behind its remote\n"
+#~ "counterpart. If you did not intend to push that branch, you may want to\n"
+#~ "specify branches to push or set the 'push.default' configuration "
+#~ "variable\n"
+#~ "to 'simple', 'current' or 'upstream' to push only the current branch."
+#~ msgstr ""
+#~ "Uppdateringar avvisades då änden på en insänd gren är bakom dess\n"
+#~ "fjärrmotsvarighet. Om det inte var meningen att sända in grenen, bör\n"
+#~ "du specificera grenar att sända, eller ändra inställningsvariabeln\n"
+#~ "\"push-default\" till \"simple\", \"current\" eller \"upstream\" för att "
+#~ "endast\n"
+#~ "sända aktuell gren."
+
 #~ msgid "copied:     %s -> %s"
 #~ msgstr "kopierad:   %s -> %s"
 
@@ -10758,9 +10839,6 @@ msgstr "Synkroniserar undermodul-url för \"$displaypath\""
 #~ msgid "input paths are terminated by a null character"
 #~ msgstr "sökvägar avdelas med null-tecken"
 
-#~ msgid "done\n"
-#~ msgstr "klart\n"
-
 #~ msgid ""
 #~ "The following untracked files would NOT be saved but need to be removed "
 #~ "by stash save:"
@@ -10886,15 +10964,9 @@ msgstr "Synkroniserar undermodul-url för \"$displaypath\""
 #~ msgstr[0] ", %d borttagning(-)"
 #~ msgstr[1] ", %d borttagningar(-)"
 
-#~ msgid "Auto packing the repository for optimum performance.\n"
-#~ msgstr "Packar arkivet automatiskt för optimal prestanda.\n"
-
 #~ msgid " (use \"git add\" to track)"
 #~ msgstr " (spåra med \"git add\")"
 
-#~ msgid "-B cannot be used with -b"
-#~ msgstr "-B kan inte användas med -b"
-
 #~ msgid "--detach cannot be used with -b/-B/--orphan"
 #~ msgstr "--detcah kan inte användas med -b/-B/--orphan"
 
index b9676a88e46df664566f35383198a833a2d9c84d..f05974f695e9f6d454e19834e3c3cf6247bcba89 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
@@ -6,10 +6,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: git v1.9-pu\n"
+"Project-Id-Version: git v2.0.0-rc0\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-02-01 08:06+0800\n"
-"PO-Revision-Date: 2014-02-03 07:30+0700\n"
+"POT-Creation-Date: 2014-04-19 12:50+0800\n"
+"PO-Revision-Date: 2014-04-20 15:20+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"
@@ -22,16 +22,12 @@ msgstr ""
 "X-Poedit-Basepath: ../\n"
 "X-Generator: Poedit 1.5.5\n"
 
-#: advice.c:57
+#: advice.c:55
 #, c-format
 msgid "hint: %.*s\n"
-msgstr "tìm thấy: %.*s\n"
+msgstr "gợi ý: %.*s\n"
 
-#.
-#. * Message used both when 'git commit' fails and when
-#. * other commands doing a merge do.
-#.
-#: advice.c:87
+#: advice.c:85
 msgid ""
 "Fix them up in the work tree,\n"
 "and then use 'git add/rm <file>' as\n"
@@ -62,76 +58,76 @@ msgstr ""
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <kho> [--exec <lệnh>] --list"
 
-#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328
+#: archive.c:243 builtin/add.c:136 builtin/add.c:428 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:327
+#: archive.c:328
 msgid "fmt"
-msgstr "fmt"
+msgstr "định_dạng"
 
-#: archive.c:327
+#: archive.c:328
 msgid "archive format"
 msgstr "định dạng lưu trữ"
 
-#: archive.c:328 builtin/log.c:1193
+#: archive.c:329 builtin/log.c:1193
 msgid "prefix"
-msgstr "tiền tố"
+msgstr "tiền_tố"
 
-#: archive.c:329
+#: archive.c:330
 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:330 builtin/archive.c:88 builtin/blame.c:2265
-#: builtin/blame.c:2266 builtin/config.c:58 builtin/fast-export.c:680
-#: builtin/fast-export.c:682 builtin/grep.c:716 builtin/hash-object.c:77
-#: builtin/ls-files.c:486 builtin/ls-files.c:489 builtin/notes.c:408
-#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:154
+#: 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
 msgid "file"
 msgstr "tập-tin"
 
-#: archive.c:331 builtin/archive.c:89
+#: archive.c:332 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:333
+#: archive.c:334
 msgid "read .gitattributes in working directory"
 msgstr "đọc .gitattributes trong thư mục làm việc"
 
-#: archive.c:334
+#: archive.c:335
 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:335
+#: archive.c:336
 msgid "store only"
 msgstr "chỉ lưu (không nén)"
 
-#: archive.c:336
+#: archive.c:337
 msgid "compress faster"
 msgstr "nén nhanh hơn"
 
-#: archive.c:344
+#: archive.c:345
 msgid "compress better"
 msgstr "nén nhỏ hơn"
 
-#: archive.c:347
+#: archive.c:348
 msgid "list supported archive formats"
 msgstr "liệt kê các kiểu nén được hỗ trợ"
 
-#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
 msgid "repo"
 msgstr "kho"
 
-#: archive.c:350 builtin/archive.c:91
+#: archive.c:351 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
-msgstr "nhận kho lưu từ kho chứa <kho> trên máy chủ"
+msgstr "nhận kho nén từ kho chứa <kho> trên máy chủ"
 
-#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487
+#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
 msgid "command"
 msgstr "lệnh"
 
-#: archive.c:352 builtin/archive.c:93
+#: archive.c:353 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr "đường dẫn đến lệnh git-upload-pack trên máy chủ"
 
@@ -148,84 +144,79 @@ msgstr ""
 msgid "Not setting branch %s as its own upstream."
 msgstr "Chưa cài đặt nhánh %s như là thượng nguồn của nó."
 
-#: branch.c:82
+#: branch.c:83
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr "Nhánh %s cài đặt để theo dõi nhánh máy chủ %s từ %s bằng cách rebase."
 
-#: branch.c:83
+#: branch.c:84
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
 msgstr "Nhánh %s cài đặt để theo dõi nhánh máy chủ %s từ %s."
 
-#: branch.c:87
+#: branch.c:88
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr "Nhánh %s cài đặt để theo dõi nhánh nội bộ %s bằng cách rebase."
 
-#: branch.c:88
+#: branch.c:89
 #, c-format
 msgid "Branch %s set up to track local branch %s."
 msgstr "Nhánh %s cài đặt để theo dõi nhánh nội bộ %s."
 
-#: branch.c:92
+#: branch.c:94
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr "Nhánh %s cài đặt để theo dõi nhánh máy chủ %s bằng cách rebase."
 
-#: branch.c:93
+#: branch.c:95
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
 msgstr "Nhánh %s cài đặt để theo dõi tham chiếu máy chủ %s."
 
-#: branch.c:97
+#: branch.c:99
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
 "Nhánh %s cài đặt để theo dõi vết tham chiếu nội bộ %s bằng cách rebase."
 
-#: branch.c:98
+#: branch.c:100
 #, c-format
 msgid "Branch %s set up to track local ref %s."
 msgstr "Nhánh %s cài đặt để theo dõi tham chiếu nội bộ %s."
 
-#: branch.c:118
-#, c-format
-msgid "Tracking not set up: name too long: %s"
-msgstr "Việc theo dõi chưa được cài đặt: tên quá dài: %s"
-
-#: branch.c:137
+#: branch.c:133
 #, c-format
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr "Không theo dõi: thông tin chưa rõ ràng cho tham chiếu %s"
 
-#: branch.c:182
+#: branch.c:178
 #, 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:187
+#: branch.c:183
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "Đã có nhánh mang tên “%s”."
 
-#: branch.c:195
+#: branch.c:191
 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:215
+#: branch.c:211
 #, 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:217
+#: branch.c:213
 #, 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:219
+#: branch.c:215
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -245,113 +236,113 @@ msgstr ""
 "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:264
+#: branch.c:260
 #, 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:284
+#: branch.c:280
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "Tên đối tượng chưa rõ ràng: “%s”."
 
-#: branch.c:289
+#: branch.c:285
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "Nhánh không hợp lệ: “%s”."
 
-#: branch.c:295
+#: 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:313
+#: branch.c:309
 msgid "Failed to write ref"
 msgstr "Gặp lỗi khi ghi tham chiếu (ref)"
 
-#: bundle.c:37
+#: bundle.c:33
 #, 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:64
+#: bundle.c:60
 #, c-format
 msgid "unrecognized header: %s%s (%d)"
 msgstr "phần đầu không được thừa nhận: %s%s (%d)"
 
-#: bundle.c:90 builtin/commit.c:706
+#: bundle.c:86 builtin/commit.c:706
 #, c-format
 msgid "could not open '%s'"
 msgstr "không thể mở “%s”"
 
-#: bundle.c:141
+#: bundle.c:138
 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:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332
+#: 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
 #: 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:187
+#: bundle.c:184
 #, 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):"
 
-#: bundle.c:194
+#: bundle.c:191
 msgid "The bundle records a complete history."
 msgstr "Lệnh bundle ghi lại toàn bộ lịch sử."
 
-#: bundle.c:196
+#: bundle.c:193
 #, 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:"
 
-#: bundle.c:296
+#: bundle.c:293
 msgid "rev-list died"
 msgstr "rev-list đã chết"
 
-#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "đối số không được thừa nhận: %s"
 
-#: bundle.c:337
+#: bundle.c:334
 #, 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:382
+#: bundle.c:379
 msgid "Refusing to create empty bundle."
 msgstr "Từ chối tạo một bundle trống rỗng."
 
-#: bundle.c:398
+#: bundle.c:395
 msgid "Could not spawn pack-objects"
 msgstr "Không thể sản sinh đối tượng gói"
 
-#: bundle.c:416
+#: bundle.c:413
 msgid "pack-objects died"
 msgstr "pack-objects đã chết"
 
-#: bundle.c:419
+#: bundle.c:416
 #, c-format
 msgid "cannot create '%s'"
 msgstr "không thể tạo “%s”"
 
-#: bundle.c:441
+#: bundle.c:438
 msgid "index-pack died"
 msgstr "index-pack đã chết"
 
-#: commit.c:53
+#: commit.c:54
 #, c-format
 msgid "could not parse %s"
 msgstr "không thể phân tích cú pháp %s"
 
-#: commit.c:55
+#: commit.c:56
 #, c-format
 msgid "%s %s is not a commit!"
 msgstr "%s %s không phải là một lần commit!"
@@ -427,6 +418,7 @@ msgid_plural "%lu years"
 msgstr[0] "%lu năm"
 msgstr[1] "%lu năm"
 
+#. TRANSLATORS: "%s" is "<n> years"
 #: date.c:149
 #, c-format
 msgid "%s, %lu month ago"
@@ -446,6 +438,10 @@ msgstr[1] "%lu năm trước"
 msgid "failed to read orderfile '%s'"
 msgstr "gặp lỗi khi đọc tập-tin-thứ-tự “%s”"
 
+#: diffcore-rename.c:517
+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
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
@@ -470,7 +466,7 @@ msgstr ""
 "Tìm thấy các lỗi trong biến cấu hình “diff.dirstat”:\n"
 "%s"
 
-#: diff.c:3509
+#: diff.c:3495
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -479,7 +475,7 @@ msgstr ""
 "Gặp lỗi khi phân tích đối số tùy chọn --dirstat/-X:\n"
 "%s"
 
-#: diff.c:3523
+#: diff.c:3509
 #, 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”"
@@ -506,35 +502,35 @@ msgstr "không thể tạo tập tin tạm thời “%s”: %s"
 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:1695
+#: grep.c:1698
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "“%s”: không thể đọc %s"
 
-#: grep.c:1712
+#: grep.c:1715
 #, c-format
 msgid "'%s': %s"
 msgstr "“%s”: %s"
 
-#: grep.c:1723
+#: grep.c:1726
 #, c-format
 msgid "'%s': short read %s"
 msgstr "“%s”: đọc ngắn %s"
 
-#: help.c:210
+#: help.c:209
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "các lệnh git sẵn có trong thư mục “%s”:"
 
-#: help.c:217
+#: help.c:216
 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:233
+#: help.c:232
 msgid "The most commonly used git commands are:"
 msgstr "Những lệnh git hay được dùng nhất là:"
 
-#: help.c:290
+#: help.c:289
 #, c-format
 msgid ""
 "'%s' appears to be a git command, but we were not\n"
@@ -543,11 +539,11 @@ msgstr ""
 "“%s” trông như là một lệnh git, nhưng chúng tôi không\n"
 "thể thực thi nó. Có lẽ là lệnh git-%s đã bị hỏng?"
 
-#: help.c:347
+#: help.c:346
 msgid "Uh oh. Your system reports no Git commands at all."
 msgstr "Ối chà. Hệ thống của bạn báo rằng chẳng có lệnh Git nào cả."
 
-#: help.c:369
+#: help.c:368
 #, c-format
 msgid ""
 "WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -556,17 +552,17 @@ msgstr ""
 "CẢNH BÁO: Bạn đã gọi lệnh Git có tên “%s”, mà nó lại không có sẵn.\n"
 "Tiếp tục và coi rằng ý bạn là “%s”"
 
-#: help.c:374
+#: help.c:373
 #, c-format
 msgid "in %0.1f seconds automatically..."
 msgstr "trong %0.1f giây một cách tự động..."
 
-#: help.c:381
+#: help.c:380
 #, c-format
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git: “%s” không phải là một lệnh của git. Xem “git --help”."
 
-#: help.c:385 help.c:444
+#: help.c:384 help.c:443
 msgid ""
 "\n"
 "Did you mean this?"
@@ -580,7 +576,7 @@ msgstr[1] ""
 "\n"
 "Có phải ý bạn là một trong số những cái này không?"
 
-#: help.c:440
+#: help.c:439
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %s - %s"
@@ -589,7 +585,7 @@ msgstr "%s: %s - %s"
 msgid "failed to read the cache"
 msgstr "gặp lỗi khi đọc bộ nhớ đệm"
 
-#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559
+#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
 #: builtin/clone.c:661
 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"
@@ -599,75 +595,73 @@ msgstr "không thể ghi tập tin lưu bảng mục lục mới"
 msgid "(bad commit)\n"
 msgstr "(commit sai)\n"
 
-#: merge-recursive.c:206
+#: merge-recursive.c:208
 #, 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:269
+#: merge-recursive.c:271
 msgid "error building trees"
 msgstr "gặp lỗi khi xây dựng cây"
 
-#: merge-recursive.c:673
+#: merge-recursive.c:675
 #, 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:684
+#: merge-recursive.c:686
 #, 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"
 
-#. something else exists
-#. .. but not some other error (who really cares what?)
-#: merge-recursive.c:698 merge-recursive.c:719
+#: merge-recursive.c:700 merge-recursive.c:721
 msgid ": perhaps a D/F conflict?"
 msgstr ": có lẽ là một xung đột D/F?"
 
-#: merge-recursive.c:709
+#: merge-recursive.c:711
 #, 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:749
+#: merge-recursive.c:751
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "không thể đọc đối tượng %s “%s”"
 
-#: merge-recursive.c:751
+#: merge-recursive.c:753
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "đối tượng blob được mong đợi cho %s “%s”"
 
-#: merge-recursive.c:774 builtin/clone.c:317
+#: merge-recursive.c:776 builtin/clone.c:317
 #, c-format
 msgid "failed to open '%s'"
 msgstr "gặp lỗi khi mở “%s”"
 
-#: merge-recursive.c:782
+#: merge-recursive.c:784
 #, 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:785
+#: merge-recursive.c:787
 #, 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:923
+#: merge-recursive.c:925
 msgid "Failed to execute internal merge"
 msgstr "Gặp lỗi khi thực hiện trộn nội bộ"
 
-#: merge-recursive.c:927
+#: merge-recursive.c:929
 #, 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:943
+#: merge-recursive.c:945
 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:1022 merge-recursive.c:1036
+#: merge-recursive.c:1024 merge-recursive.c:1038
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -676,7 +670,7 @@ msgstr ""
 "XUNG ĐỘT (%s/xóa): %s bị xóa trong %s và %s trong %s. Phiên bản %s của %s "
 "còn lại trong cây (tree)."
 
-#: merge-recursive.c:1028 merge-recursive.c:1041
+#: merge-recursive.c:1030 merge-recursive.c:1043
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -685,20 +679,20 @@ msgstr ""
 "XUNG ĐỘT (%s/xóa): %s bị xóa trong %s và %s trong %s. Phiên bản %s của %s "
 "còn lại trong cây (tree) tại %s."
 
-#: merge-recursive.c:1082
+#: merge-recursive.c:1084
 msgid "rename"
 msgstr "đổi tên"
 
-#: merge-recursive.c:1082 wt-status.c:283
+#: merge-recursive.c:1084
 msgid "renamed"
 msgstr "đã đổi tên"
 
-#: merge-recursive.c:1138
+#: merge-recursive.c:1140
 #, 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:1160
+#: merge-recursive.c:1162
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -707,146 +701,146 @@ msgstr ""
 "XUNG ĐỘT (đổi-tên/đổi-tên): Đổi tên \"%s\"->\"%s\" trong nhánh \"%s\" đổi "
 "tên \"%s\"->\"%s\" trong \"%s\"%s"
 
-#: merge-recursive.c:1165
+#: merge-recursive.c:1167
 msgid " (left unresolved)"
 msgstr " (cần giải quyết)"
 
-#: merge-recursive.c:1219
+#: merge-recursive.c:1221
 #, 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:1249
+#: merge-recursive.c:1251
 #, 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:1448
+#: merge-recursive.c:1450
 #, 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:1458
+#: merge-recursive.c:1460
 #, c-format
 msgid "Adding merged %s"
 msgstr "Thêm hòa trộn %s"
 
-#: merge-recursive.c:1463 merge-recursive.c:1661
+#: merge-recursive.c:1465 merge-recursive.c:1663
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Thay vào đó thêm vào %s"
 
-#: merge-recursive.c:1514
+#: merge-recursive.c:1516
 #, c-format
 msgid "cannot read object %s"
 msgstr "không thể đọc đối tượng %s"
 
-#: merge-recursive.c:1517
+#: merge-recursive.c:1519
 #, 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:1565
+#: merge-recursive.c:1567
 msgid "modify"
 msgstr "sửa đổi"
 
-#: merge-recursive.c:1565 wt-status.c:281
+#: merge-recursive.c:1567
 msgid "modified"
 msgstr "đã sửa"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1577
 msgid "content"
 msgstr "nội dung"
 
-#: merge-recursive.c:1582
+#: merge-recursive.c:1584
 msgid "add/add"
 msgstr "thêm/thêm"
 
-#: merge-recursive.c:1616
+#: merge-recursive.c:1618
 #, 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:1630
+#: merge-recursive.c:1632
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Tự-động-hòa-trộn %s"
 
-#: merge-recursive.c:1634 git-submodule.sh:1148
+#: merge-recursive.c:1636 git-submodule.sh:1149
 msgid "submodule"
 msgstr "mô-đun-con"
 
-#: merge-recursive.c:1635
+#: merge-recursive.c:1637
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "XUNG ĐỘT (%s): Xung đột hòa trộn trong %s"
 
-#: merge-recursive.c:1725
+#: merge-recursive.c:1727
 #, c-format
 msgid "Removing %s"
 msgstr "Đang xóa %s"
 
-#: merge-recursive.c:1750
+#: merge-recursive.c:1752
 msgid "file/directory"
 msgstr "tập-tin/thư-mục"
 
-#: merge-recursive.c:1756
+#: merge-recursive.c:1758
 msgid "directory/file"
 msgstr "thư-mục/tập tin"
 
-#: merge-recursive.c:1761
+#: merge-recursive.c:1763
 #, 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:1771
+#: merge-recursive.c:1773
 #, c-format
 msgid "Adding %s"
 msgstr "Thêm \"%s\""
 
-#: merge-recursive.c:1788
+#: merge-recursive.c:1790
 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:1807
+#: merge-recursive.c:1809
 msgid "Already up-to-date!"
 msgstr "Đã cập nhật rồi!"
 
-#: merge-recursive.c:1816
+#: merge-recursive.c:1818
 #, 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:1846
+#: merge-recursive.c:1848
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "Đường dẫn chưa được xử lý??? %s"
 
-#: merge-recursive.c:1891
+#: merge-recursive.c:1893
 msgid "Merging:"
 msgstr "Đang trộn:"
 
-#: merge-recursive.c:1904
+#: merge-recursive.c:1906
 #, 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:1941
+#: merge-recursive.c:1943
 msgid "merge returned no commit"
 msgstr "hòa trộn không trả về lần chuyển giao nào"
 
-#: merge-recursive.c:1998
+#: merge-recursive.c:2000
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Không thể phân tích đối tượng “%s”"
 
-#: merge-recursive.c:2010 builtin/merge.c:665
+#: merge-recursive.c:2012 builtin/merge.c:668
 msgid "Unable to write index."
 msgstr "Không thể ghi bảng mục lục"
 
@@ -873,33 +867,33 @@ msgstr "Từ chối ghi đè ghi chú trong %s (nằm ngoài refs/notes/)"
 msgid "Bad %s value: '%s'"
 msgstr "Giá trị %s sai: “%s”"
 
-#: object.c:202
+#: object.c:229
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "không thể phân tích đối tượng: “%s”"
 
-#: parse-options.c:537
+#: parse-options.c:532
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:555
+#: parse-options.c:550
 #, 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:559
+#: parse-options.c:554
 #, c-format
 msgid "   or: %s"
 msgstr "     hoặc: %s"
 
-#: parse-options.c:562
+#: parse-options.c:557
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:596
+#: parse-options.c:591
 msgid "-NUM"
 msgstr "-SỐ"
 
@@ -950,11 +944,6 @@ msgstr "%s: “%s” ngoài một kho chứa"
 msgid "Pathspec '%s' is in submodule '%.*s'"
 msgstr "Đặc tả đường dẫn “%s” thì ở trong mô-đun-con “%.*s”"
 
-#.
-#. * We may want to substitute "this command" with a command
-#. * name. E.g. when add--interactive dies when running
-#. * "checkout -p"
-#.
 #: pathspec.c:353
 #, c-format
 msgid "%s: pathspec magic not supported by this command: %s"
@@ -973,57 +962,74 @@ msgstr ""
 "Ở đây không có gì bị loại trừ bởi: các mẫu (loại trừ).\n"
 "Có lẽ bạn đã quên thêm hoặc là “:/” hoặc là “.”?"
 
-#: remote.c:753
+#: progress.c:224
+msgid "done"
+msgstr "xong"
+
+#: read-cache.c:1238
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"index.version được đặt, nhưng giá trị của nó lại không hợp lệ.\n"
+"Dùng phiên bản %i"
+
+#: read-cache.c:1248
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"GIT_INDEX_VERSION được đặt, nhưng giá trị của nó lại không hợp lệ.\n"
+"Dùng phiên bản %i"
+
+#: remote.c:758
 #, 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:757
+#: remote.c:762
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s thường theo dõi %s, không phải %s"
 
-#: remote.c:761
+#: remote.c:766
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s theo dõi cả %s và %s"
 
-#.
-#. * This last possibility doesn't occur because
-#. * FETCH_HEAD_IGNORE entries always appear at
-#. * the end of the list.
-#.
-#: remote.c:769
+#: remote.c:774
 msgid "Internal error"
 msgstr "Lỗi nội bộ"
 
-#: remote.c:1871
+#: remote.c:1948
 #, 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:1875
+#: remote.c:1952
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "   (dùng \" git branch --unset-upstream\" để sửa)\n"
 
-#: remote.c:1878
+#: remote.c:1955
 #, 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:1882
+#: remote.c:1959
 #, 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"
 
-#: remote.c:1888
+#: remote.c:1965
 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:1891
+#: remote.c:1968
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1035,11 +1041,11 @@ msgstr[1] ""
 "Nhánh của bạn ở đằng sau “%s” %d lần chuyển giao, và có thể được fast-"
 "forward.\n"
 
-#: remote.c:1899
+#: remote.c:1976
 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:1902
+#: remote.c:1979
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1055,7 +1061,7 @@ msgstr[1] ""
 "Your branch and “%s” have diverged,\n"
 "and have %d and %d different commit each, respectively.\n"
 
-#: remote.c:1912
+#: remote.c:1989
 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 "
@@ -1070,14 +1076,14 @@ msgstr "gặp lỗi khi mở “/dev/null”"
 msgid "dup2(%d,%d) failed"
 msgstr "dup2(%d,%d) gặp lỗi"
 
-#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896
-#: builtin/merge.c:1006 builtin/merge.c:1016
+#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
+#: builtin/merge.c:1009 builtin/merge.c:1019
 #, 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:786
-#: builtin/merge.c:1008 builtin/merge.c:1021
+#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
+#: builtin/merge.c:1011 builtin/merge.c:1024
 #, c-format
 msgid "Could not write to '%s'"
 msgstr "Không thể ghi vào “%s”"
@@ -1100,7 +1106,7 @@ msgstr ""
 "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:870 sequencer.c:953
+#: sequencer.c:245 sequencer.c:879 sequencer.c:962
 #, c-format
 msgid "Could not write to %s"
 msgstr "Không thể ghi vào %s"
@@ -1136,31 +1142,31 @@ msgstr "Không thể phân giải commit (lần chuyển giao) HEAD\n"
 msgid "Unable to update cache tree\n"
 msgstr "Không thể cập nhật cây bộ nhớ đệm\n"
 
-#: sequencer.c:423
+#: sequencer.c:430
 #, 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:428
+#: sequencer.c:435
 #, 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:494
+#: sequencer.c:501
 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:513
+#: sequencer.c:520
 #, 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:521
+#: sequencer.c:528
 #, 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:525
+#: sequencer.c:532
 #, c-format
 msgid "Mainline was specified but commit %s is not a merge."
 msgstr ""
@@ -1169,153 +1175,153 @@ msgstr ""
 
 #. TRANSLATORS: The first %s will be "revert" or
 #. "cherry-pick", the second %s a SHA1
-#: sequencer.c:538
+#: sequencer.c:545
 #, 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:542
+#: sequencer.c:549
 #, 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:628
+#: sequencer.c:635
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "không thể revert %s... %s"
 
-#: sequencer.c:629
+#: sequencer.c:636
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "không thể apply (áp dụng miếng vá) %s... %s"
 
-#: sequencer.c:665
+#: sequencer.c:672
 msgid "empty commit set passed"
 msgstr "lần chuyển giao trống rỗng đặt là hợp quy cách"
 
-#: sequencer.c:673
+#: sequencer.c:680
 #, 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:678
+#: sequencer.c:685
 #, 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:736
+#: sequencer.c:743
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr "Không thể %s trong khi %s"
 
-#: sequencer.c:758
+#: sequencer.c:765
 #, c-format
 msgid "Could not parse line %d."
 msgstr "Không phân tích được dòng %d."
 
-#: sequencer.c:763
+#: sequencer.c:770
 msgid "No commits parsed."
 msgstr "Không có lần chuyển giao nào được phân tích."
 
-#: sequencer.c:776
+#: sequencer.c:783
 #, c-format
 msgid "Could not open %s"
 msgstr "Không thể mở %s"
 
-#: sequencer.c:780
+#: sequencer.c:787
 #, c-format
 msgid "Could not read %s."
 msgstr "Không thể đọc %s."
 
-#: sequencer.c:787
+#: sequencer.c:794
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr "Bảng chỉ thị không thể dùng được: %s"
 
-#: sequencer.c:815
+#: sequencer.c:824
 #, c-format
 msgid "Invalid key: %s"
 msgstr "Khóa không đúng: %s"
 
-#: sequencer.c:818
+#: sequencer.c:827
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr "Giá trị không hợp lệ %s: %s"
 
-#: sequencer.c:830
+#: sequencer.c:839
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr "Bảng tùy chọn dị hình: %s"
 
-#: sequencer.c:851
+#: sequencer.c:860
 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:852
+#: sequencer.c:861
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr "hãy thử \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: sequencer.c:856
+#: sequencer.c:865
 #, 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:872 sequencer.c:957
+#: sequencer.c:881 sequencer.c:966
 #, c-format
 msgid "Error wrapping up %s."
 msgstr "Lỗi bao bọc %s."
 
-#: sequencer.c:891 sequencer.c:1025
+#: sequencer.c:900 sequencer.c:1036
 msgid "no cherry-pick or revert in progress"
 msgstr "không cherry-pick hay revert trong tiến trình"
 
-#: sequencer.c:893
+#: sequencer.c:902
 msgid "cannot resolve HEAD"
 msgstr "không thể phân giải HEAD"
 
-#: sequencer.c:895
+#: sequencer.c:904
 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:917 builtin/apply.c:4061
+#: sequencer.c:926 builtin/apply.c:4061
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "không thể mở %s: %s"
 
-#: sequencer.c:920
+#: sequencer.c:929
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "không thể đọc %s: %s"
 
-#: sequencer.c:921
+#: sequencer.c:930
 msgid "unexpected end of file"
 msgstr "gặp kết thúc tập tin đột xuất"
 
-#: sequencer.c:927
+#: sequencer.c:936
 #, 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:950
+#: sequencer.c:959
 #, c-format
 msgid "Could not format %s."
 msgstr "Không thể định dạng “%s”."
 
-#: sequencer.c:1093
+#: sequencer.c:1104
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr "%s: không thể cherry-pick một %s"
 
-#: sequencer.c:1096
+#: sequencer.c:1107
 #, c-format
 msgid "%s: bad revision"
 msgstr "%s: điểm xét duyệt sai"
 
-#: sequencer.c:1130
+#: sequencer.c:1141
 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:1131
+#: sequencer.c:1142
 msgid "Can't cherry-pick into empty head"
 msgstr "Không thể cherry-pick vào một đầu (head) trống rỗng"
 
@@ -1343,21 +1349,21 @@ msgstr ""
 "này\n"
 "bằng cách chạy lệnh \"git config advice.objectNameWarning false\""
 
-#: sha1_name.c:1070
+#: sha1_name.c:1072
 msgid "HEAD does not point to a branch"
 msgstr "HEAD không chỉ đến một nhánh nào cả"
 
-#: sha1_name.c:1073
+#: sha1_name.c:1075
 #, c-format
 msgid "No such branch: '%s'"
 msgstr "Không có nhánh nào như thế: “%s”"
 
-#: sha1_name.c:1075
+#: sha1_name.c:1077
 #, 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:1079
+#: sha1_name.c:1081
 #, c-format
 msgid "Upstream branch '%s' not stored as a remote-tracking branch"
 msgstr ""
@@ -1374,52 +1380,34 @@ msgstr ""
 msgid "Could not find section in .gitmodules where path=%s"
 msgstr "Không thể tìm thấy phần trong .gitmodules nơi mà đường_dẫn=%s"
 
-#. Maybe the user already did that, don't error out here
 #: submodule.c:76
 #, c-format
 msgid "Could not update .gitmodules entry %s"
 msgstr "Không thể cập nhật mục .gitmodules %s"
 
-#. Maybe the user already did that, don't error out here
 #: submodule.c:109
 #, c-format
 msgid "Could not remove .gitmodules entry for %s"
 msgstr "Không thể gỡ bỏ mục .gitmodules dành cho %s"
 
-#: submodule.c:127
-msgid "could not find .gitmodules in index"
-msgstr "không tìm thấy .gitmodules trong bảng mục lục"
-
-#: submodule.c:133
-msgid "reading updated .gitmodules failed"
-msgstr "gặp lỗi khi đọc cập nhật .gitmodules"
-
-#: submodule.c:135
-msgid "unable to stat updated .gitmodules"
-msgstr "không thể lấy thống kê .gitmodules đã cập nhật"
-
-#: submodule.c:139
-msgid "unable to remove .gitmodules from index"
-msgstr "không thể gỡ bỏ .gitmodules từ mục lục"
-
-#: submodule.c:141
-msgid "adding updated .gitmodules failed"
-msgstr "gặp lỗi khi thêm .gitmodules đã cập nhật"
-
-#: submodule.c:143
+#: submodule.c:120
 msgid "staging updated .gitmodules failed"
 msgstr "gặp lỗi khi tổ chức .gitmodules đã cập nhật"
 
-#: submodule.c:1144 builtin/init-db.c:363
+#: submodule.c:1121 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:1155
+#: submodule.c:1132
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "Không thể đặt “core.worktree” trong “%s”."
 
+#: unpack-trees.c:206
+msgid "Checking out files"
+msgstr "Đang lấy ra các tập tin"
+
 #: urlmatch.c:120
 msgid "invalid URL scheme name or missing '://' suffix"
 msgstr "tên lược đồ URL không hợp lệ, hoặc thiếu hậu tố “://”"
@@ -1531,88 +1519,97 @@ msgid "  (use \"git %s <file>...\" to include in what will be committed)"
 msgstr ""
 "  (dùng \"git %s <tập-tin>...\" để thêm vào những gì cần được chuyển giao)"
 
-#: wt-status.c:254
-msgid "bug"
-msgstr "lỗi"
-
-#: wt-status.c:259
+#: wt-status.c:252
 msgid "both deleted:"
 msgstr "bị xóa bởi cả hai:"
 
-#: wt-status.c:260
+#: wt-status.c:254
 msgid "added by us:"
 msgstr "được thêm vào bởi chúng ta:"
 
-#: wt-status.c:261
+#: wt-status.c:256
 msgid "deleted by them:"
 msgstr "bị xóa đi bởi họ:"
 
-#: wt-status.c:262
+#: wt-status.c:258
 msgid "added by them:"
 msgstr "được thêm vào bởi họ:"
 
-#: wt-status.c:263
+#: wt-status.c:260
 msgid "deleted by us:"
 msgstr "bị xóa bởi chúng ta:"
 
-#: wt-status.c:264
+#: wt-status.c:262
 msgid "both added:"
 msgstr "được thêm vào bởi cả hai:"
 
-#: wt-status.c:265
+#: wt-status.c:264
 msgid "both modified:"
 msgstr "bị sửa bởi cả hai:"
 
-#: wt-status.c:275
-msgid "new file"
-msgstr "tập tin mới"
+#: wt-status.c:266
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr "lỗi: không thể tiếp nhận trạng thái chưa hòa trộn %x"
+
+#: wt-status.c:274
+msgid "new file:"
+msgstr "tập tin mới:"
+
+#: wt-status.c:276
+msgid "copied:"
+msgstr "đã chép:"
 
-#: wt-status.c:277
-msgid "copied"
-msgstr "đã chép"
+#: wt-status.c:278
+msgid "deleted:"
+msgstr "đã xoá:"
 
-#: wt-status.c:279
-msgid "deleted"
-msgstr "bị xoá"
+#: wt-status.c:280
+msgid "modified:"
+msgstr "đã sửa:"
 
-#: wt-status.c:285
-msgid "typechange"
-msgstr "đổi-kiểu"
+#: wt-status.c:282
+msgid "renamed:"
+msgstr "đã đổi tên:"
 
-#: wt-status.c:287
-msgid "unknown"
-msgstr "không hiểu"
+#: wt-status.c:284
+msgid "typechange:"
+msgstr "đổi-kiểu:"
 
-#: wt-status.c:289
-msgid "unmerged"
-msgstr "chưa hòa trộn"
+#: wt-status.c:286
+msgid "unknown:"
+msgstr "không hiểu:"
 
-#: wt-status.c:336
+#: wt-status.c:288
+msgid "unmerged:"
+msgstr "chưa hòa trộn:"
+
+#: wt-status.c:370
 msgid "new commits, "
 msgstr "lần chuyển giao mới, "
 
-#: wt-status.c:338
+#: wt-status.c:372
 msgid "modified content, "
 msgstr "nội dung bị sửa đổi, "
 
-#: wt-status.c:340
+#: wt-status.c:374
 msgid "untracked content, "
 msgstr "nội dung chưa được theo dõi, "
 
-#: wt-status.c:357
+#: wt-status.c:391
 #, c-format
 msgid "bug: unhandled diff status %c"
 msgstr "lỗi: không thể tiếp nhận trạng thái lệnh diff %c"
 
-#: wt-status.c:732
+#: wt-status.c:765
 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:734
+#: wt-status.c:767
 msgid "Submodule changes to be committed:"
 msgstr "Những mô-đun-con thay đổi đã được chuyển giao:"
 
-#: wt-status.c:836
+#: wt-status.c:846
 msgid ""
 "Do not touch the line above.\n"
 "Everything below will be removed."
@@ -1620,72 +1617,72 @@ msgstr ""
 "Không động đến đường ở trên.\n"
 "Mọi thứ phía dưới sẽ được xóa bỏ."
 
-#: wt-status.c:899
+#: wt-status.c:937
 msgid "You have unmerged paths."
 msgstr "Bạn có những đường dẫn chưa được hòa trộn."
 
-#: wt-status.c:902
+#: wt-status.c:940
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr "  (sửa các xung đột rồi chạy \"git commit\")"
 
-#: wt-status.c:905
+#: wt-status.c:943
 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:908
+#: wt-status.c:946
 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:918
+#: wt-status.c:956
 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:921
+#: wt-status.c:959
 msgid "The current patch is empty."
 msgstr "Miếng vá hiện tại bị trống rỗng."
 
-#: wt-status.c:925
+#: wt-status.c:963
 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:927
+#: wt-status.c:965
 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:929
+#: wt-status.c:967
 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:989 wt-status.c:1006
+#: wt-status.c:1027 wt-status.c:1044
 #, 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:994 wt-status.c:1011
+#: wt-status.c:1032 wt-status.c:1049
 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:997
+#: wt-status.c:1035
 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:999
+#: wt-status.c:1037
 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:1001
+#: wt-status.c:1039
 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:1014
+#: wt-status.c:1052
 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:1018
+#: wt-status.c:1056
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
@@ -1693,126 +1690,126 @@ msgstr ""
 "Bạn hiện nay đang thực hiện việc chia tách một lần chuyển giao trong khi "
 "đang “rebase” nhánh “%s” trên “%s”."
 
-#: wt-status.c:1023
+#: wt-status.c:1061
 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:1026
+#: wt-status.c:1064
 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:1030
+#: wt-status.c:1068
 #, 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:1035
+#: wt-status.c:1073
 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:1038
+#: wt-status.c:1076
 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:1040
+#: wt-status.c:1078
 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:1050
+#: wt-status.c:1088
 #, 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:1055
+#: wt-status.c:1093
 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:1058
+#: wt-status.c:1096
 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:1060
+#: wt-status.c:1098
 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:1069
+#: wt-status.c:1107
 #, 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:1074
+#: wt-status.c:1112
 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:1077
+#: wt-status.c:1115
 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:1079
+#: wt-status.c:1117
 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:1090
+#: wt-status.c:1128
 #, 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:1094
+#: wt-status.c:1132
 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:1097
+#: wt-status.c:1135
 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:1272
+#: wt-status.c:1310
 msgid "On branch "
 msgstr "Trên nhánh "
 
-#: wt-status.c:1279
+#: wt-status.c:1317
 msgid "rebase in progress; onto "
 msgstr "rebase đang được thực hiện: lên trên "
 
-#: wt-status.c:1286
+#: wt-status.c:1324
 msgid "HEAD detached at "
 msgstr "HEAD được tách rời tại "
 
-#: wt-status.c:1288
+#: wt-status.c:1326
 msgid "HEAD detached from "
 msgstr "HEAD được tách rời từ "
 
-#: wt-status.c:1291
+#: wt-status.c:1329
 msgid "Not currently on any branch."
 msgstr "Hiện tại chẳng ở nhánh nào cả."
 
-#: wt-status.c:1308
+#: wt-status.c:1346
 msgid "Initial commit"
 msgstr "Lần chuyển giao khởi tạo"
 
-#: wt-status.c:1322
+#: wt-status.c:1360
 msgid "Untracked files"
 msgstr "Những tập tin chưa được theo dõi"
 
-#: wt-status.c:1324
+#: wt-status.c:1362
 msgid "Ignored files"
 msgstr "Những tập tin bị lờ đi"
 
-#: wt-status.c:1328
+#: wt-status.c:1366
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1824,32 +1821,32 @@ msgstr ""
 "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:1334
+#: wt-status.c:1372
 #, 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:1336
+#: wt-status.c:1374
 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:1342
+#: wt-status.c:1380
 msgid "No changes"
 msgstr "Không có thay đổi nào"
 
-#: wt-status.c:1347
+#: wt-status.c:1385
 #, 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:1350
+#: wt-status.c:1388
 #, 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:1353
+#: wt-status.c:1391
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
@@ -1858,293 +1855,210 @@ msgstr ""
 "không có gì được thêm vào lần chuyển giao nhưng có những tập tin chưa được "
 "theo dõi hiện diện (dùng \"git add\" để đưa vào theo dõi)\n"
 
-#: wt-status.c:1356
+#: wt-status.c:1394
 #, 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:1359
+#: wt-status.c:1397
 #, 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:1362 wt-status.c:1367
+#: wt-status.c:1400 wt-status.c:1405
 #, c-format
 msgid "nothing to commit\n"
 msgstr "không có gì để chuyển giao\n"
 
-#: wt-status.c:1365
+#: wt-status.c:1403
 #, 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:1369
+#: wt-status.c:1407
 #, 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:1478
+#: wt-status.c:1516
 msgid "HEAD (no branch)"
 msgstr "HEAD (không nhánh)"
 
-#: wt-status.c:1484
+#: wt-status.c:1522
 msgid "Initial commit on "
 msgstr "Lần chuyển giao khởi tạo trên "
 
-#: wt-status.c:1514
+#: wt-status.c:1554
 msgid "gone"
 msgstr "đã ra đi"
 
-#: wt-status.c:1516
+#: wt-status.c:1556 wt-status.c:1564
 msgid "behind "
 msgstr "đằng sau "
 
-#: wt-status.c:1519 wt-status.c:1522
-msgid "ahead "
-msgstr "phía trước "
-
-#: wt-status.c:1524
-msgid ", behind "
-msgstr ", đằng sau "
-
 #: compat/precompose_utf8.c:55 builtin/clone.c:356
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "gặp lỗi khi bỏ liên kết (unlink) “%s”"
 
-#: builtin/add.c:20
+#: builtin/add.c:21
 msgid "git add [options] [--] <pathspec>..."
 msgstr "git add [các-tùy-chọn] [--]  <pathspec>..."
 
-#.
-#. * To be consistent with "git add -p" and most Git
-#. * commands, we should default to being tree-wide, but
-#. * this is not the original behavior and can't be
-#. * changed until users trained themselves not to type
-#. * "git add -u" or "git add -A". For now, we warn and
-#. * keep the old behavior. Later, the behavior can be changed
-#. * to tree-wide, keeping the warning for a while, and
-#. * eventually we can drop the warning.
-#.
-#: builtin/add.c:58
-#, c-format
-msgid ""
-"The behavior of 'git add %s (or %s)' with no path argument from a\n"
-"subdirectory of the tree will change in Git 2.0 and should not be used "
-"anymore.\n"
-"To add content for the whole tree, run:\n"
-"\n"
-"  git add %s :/\n"
-"  (or git add %s :/)\n"
-"\n"
-"To restrict the command to the current directory, run:\n"
-"\n"
-"  git add %s .\n"
-"  (or git add %s .)\n"
-"\n"
-"With the current Git version, the command is restricted to the current "
-"directory.\n"
-msgstr ""
-"Cách ứng xử của lệnh “git add %s (hay %s)” khi không có tham số đường dẫn "
-"từ\n"
-"thư-mục con của cây sẽ thay đổi kể từ Git 2.0 và không thể sử dụng như thế "
-"nữa.\n"
-"Để thêm nội dung cho toàn bộ cây, chạy:\n"
-"\n"
-"  git add %s :/\n"
-"  (hoặc git add %s :/)\n"
-"\n"
-"Để hạn chế lệnh cho thư-mục hiện tại, chạy:\n"
-"\n"
-"  git add %s .\n"
-"  (hoặc git add %s .)\n"
-"\n"
-"Với phiên bản hiện tại của Git, lệnh bị hạn chế cho thư-mục hiện tại.\n"
-
-#: builtin/add.c:100
-#, c-format
-msgid ""
-"You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
-"whose behaviour will change in Git 2.0 with respect to paths you removed.\n"
-"Paths like '%s' that are\n"
-"removed from your working tree are ignored with this version of Git.\n"
-"\n"
-"* 'git add --ignore-removal <pathspec>', which is the current default,\n"
-"  ignores paths you removed from your working tree.\n"
-"\n"
-"* 'git add --all <pathspec>' will let you also record the removals.\n"
-"\n"
-"Run 'git status' to check the paths you removed from your working tree.\n"
-msgstr ""
-"Bạn chạy “git add” mà không có “-A (--all)” cũng không “--ignore-removal”,\n"
-"cách ứng xử của nó sẽ thay đổi kể từ Git 2.0: nó quan tâm đến các đường dẫn "
-"mà\n"
-"bạn đã gỡ bỏ. Các đường dẫn như là “%s” cái mà\n"
-"bị gỡ bỏ từ cây làm việc của bạn thì bị bỏ qua với phiên bản này của Git.\n"
-"\n"
-"* “git add --ignore-removal <pathspec>”, cái hiện tại là mặc định,\n"
-"  bỏ qua các đường dẫn bạn đã gỡ bỏ từ cây làm việc của bạn.\n"
-"\n"
-"* “git add --all <pathspec>” sẽ đồng thời giúp bạn ghi lại việc dời đi.\n"
-"\n"
-"Chạy “git status” để kiểm tra các đường dẫn bạn đã gỡ bỏ từ cây làm việc của "
-"bạn.\n"
-
-#: builtin/add.c:144
+#: builtin/add.c:64
 #, c-format
 msgid "unexpected diff status %c"
 msgstr "trạng thái lệnh diff không như mong đợi %c"
 
-#: builtin/add.c:149 builtin/commit.c:260
+#: builtin/add.c:69 builtin/commit.c:261
 msgid "updating files failed"
 msgstr "Cập nhật tập tin gặp lỗi"
 
-#: builtin/add.c:163
+#: builtin/add.c:79
 #, c-format
 msgid "remove '%s'\n"
 msgstr "gỡ bỏ “%s”\n"
 
-#: builtin/add.c:237
+#: builtin/add.c:133
 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:299
+#: builtin/add.c:193
 msgid "Could not read the index"
 msgstr "Không thể đọc bảng mục lục"
 
-#: builtin/add.c:310
+#: builtin/add.c:204
 #, c-format
 msgid "Could not open '%s' for writing."
 msgstr "Không thể mở “%s” để ghi."
 
-#: builtin/add.c:314
+#: builtin/add.c:208
 msgid "Could not write patch"
 msgstr "Không thể ghi ra miếng vá"
 
-#: builtin/add.c:319
+#: builtin/add.c:213
 #, c-format
 msgid "Could not stat '%s'"
 msgstr "không thể lấy thông tin thống kê về “%s”"
 
-#: builtin/add.c:321
+#: builtin/add.c:215
 msgid "Empty patch. Aborted."
 msgstr "Miếng vá trống rỗng. Nên bỏ qua."
 
-#: builtin/add.c:327
+#: builtin/add.c:221
 #, c-format
 msgid "Could not apply '%s'"
 msgstr "Không thể áp dụng miếng vá “%s”"
 
-#: builtin/add.c:337
+#: builtin/add.c:231
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr ""
 "Các đường dẫn theo sau đây sẽ bị lờ đi bởi một trong các tập tin .gitignore "
 "của bạn:\n"
 
-#: builtin/add.c:354 builtin/clean.c:875 builtin/fetch.c:93 builtin/mv.c:70
-#: builtin/prune-packed.c:77 builtin/push.c:506 builtin/remote.c:1344
+#: 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/rm.c:269
 msgid "dry run"
 msgstr "chạy thử"
 
-#: builtin/add.c:355 builtin/apply.c:4410 builtin/check-ignore.c:19
-#: builtin/commit.c:1249 builtin/count-objects.c:95 builtin/fsck.c:612
+#: 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
 msgid "be verbose"
 msgstr "chi tiết"
 
-#: builtin/add.c:357
+#: builtin/add.c:251
 msgid "interactive picking"
 msgstr "sửa bằng cách tương tác"
 
-#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
 msgid "select hunks interactively"
 msgstr "chọn “hunks” theo kiểu tương tác"
 
-#: builtin/add.c:359
+#: builtin/add.c:253
 msgid "edit current diff and apply"
 msgstr "sửa diff hiện nay và áp dụng nó"
 
-#: builtin/add.c:360
+#: builtin/add.c:254
 msgid "allow adding otherwise ignored files"
 msgstr "cho phép thêm các tập tin bị bỏ qua khác"
 
-#: builtin/add.c:361
+#: builtin/add.c:255
 msgid "update tracked files"
 msgstr "cập nhật các tập tin được theo dõi"
 
-#: builtin/add.c:362
+#: builtin/add.c:256
 msgid "record only the fact that the path will be added later"
 msgstr "chỉ ghi lại sự việc mà đường dẫn sẽ được thêm vào sau"
 
-#: builtin/add.c:363
+#: builtin/add.c:257
 msgid "add changes from all tracked and untracked files"
 msgstr ""
 "thêm các thay đổi từ tất cả các tập tin có cũng như không được theo dõi dấu "
 "vết"
 
-#. takes no arguments
-#: builtin/add.c:366
+#: builtin/add.c:260
 msgid "ignore paths removed in the working tree (same as --no-all)"
 msgstr ""
 "lờ đi các đường dẫn bị gỡ bỏ trong cây thư mục làm việc (giống với --no-all)"
 
-#: builtin/add.c:368
+#: builtin/add.c:262
 msgid "don't add, only refresh the index"
 msgstr "không thêm, chỉ làm tươi mới bảng mục lục"
 
-#: builtin/add.c:369
+#: builtin/add.c:263
 msgid "just skip files which cannot be added because of errors"
 msgstr "chie bỏ qua những tập tin mà nó không thể được thêm vào bởi vì gặp lỗi"
 
-#: builtin/add.c:370
+#: builtin/add.c:264
 msgid "check if - even missing - files are ignored in dry run"
 msgstr ""
 "kiểm tra xem - thậm chí thiếu - tập tin bị bỏ qua trong quá trình chạy thử"
 
-#: builtin/add.c:392
+#: builtin/add.c:286
 #, c-format
 msgid "Use -f if you really want to add them.\n"
 msgstr "Sử dụng tùy chọn -f nếu bạn thực sự muốn thêm chúng vào.\n"
 
-#: builtin/add.c:393
+#: builtin/add.c:287
 msgid "no files added"
 msgstr "chưa có tập tin nào được thêm vào"
 
-#: builtin/add.c:399
+#: builtin/add.c:293
 msgid "adding files failed"
 msgstr "thêm tập tin gặp lỗi"
 
-#: builtin/add.c:438
+#: builtin/add.c:330
 msgid "-A and -u are mutually incompatible"
 msgstr "-A và -u xung khắc nhau"
 
-#: builtin/add.c:456
+#: builtin/add.c:337
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr "Tùy chọn --ignore-missing chỉ có thể được dùng cùng với --dry-run"
 
-#: builtin/add.c:486
+#: builtin/add.c:358
 #, 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:487
+#: builtin/add.c:359
 #, 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:492 builtin/check-ignore.c:172 builtin/clean.c:919
-#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:224 builtin/rm.c:299
+#: 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
 msgid "index file corrupt"
 msgstr "tập tin ghi bảng mục lục bị hỏng"
 
-#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432
+#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
 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"
 
@@ -2258,7 +2172,6 @@ msgstr "** cảnh báo: tập tin %s trở nên trống rỗng nhưng không b
 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"
 
-#. there has to be one hunk (forward hunk)
 #: builtin/apply.c:1900
 #, c-format
 msgid "unrecognized binary patch at line %d"
@@ -2330,7 +2243,7 @@ msgstr "gặp lỗi khi vá: %s:%ld"
 #: builtin/apply.c:3095
 #, c-format
 msgid "cannot checkout %s"
-msgstr "không thể \"checkout\" %s"
+msgstr "không thể lấy ra %s"
 
 #: builtin/apply.c:3140 builtin/apply.c:3149 builtin/apply.c:3194
 #, c-format
@@ -2401,7 +2314,7 @@ msgstr "%s: miếng vá không được áp dụng"
 msgid "Checking patch %s..."
 msgstr "Đang kiểm tra miếng vá %s..."
 
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127
+#: 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 gặp lỗi đối với đường dẫn “%s”"
@@ -2419,7 +2332,7 @@ msgstr "miếng vá sai hỏng cho mô-đun-con %s"
 #: builtin/apply.c:3855
 #, c-format
 msgid "unable to stat newly created file '%s'"
-msgstr "không thể lấy trạng thái về tập tin %s mới hơn đã được tạo"
+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
 #, c-format
@@ -2444,13 +2357,12 @@ msgstr "không thể ghi vào tập tin “%s” chế độ %o"
 #: builtin/apply.c:4032
 #, c-format
 msgid "Applied patch %s cleanly."
-msgstr "Ä\90ã Ã¡p dụng miếng và %s một cách sạch sẽ."
+msgstr "Ä\90ã Ã¡p dụng miếng vá %s một cách sạch sẽ."
 
 #: builtin/apply.c:4040
 msgid "internal error"
 msgstr "lỗi nội bộ"
 
-#. Say this even without --verbose
 #: builtin/apply.c:4043
 #, c-format
 msgid "Applying patch %%s with %d reject..."
@@ -2471,7 +2383,7 @@ msgstr "Khối nhớ #%d được áp dụng gọn gàng."
 #: builtin/apply.c:4077
 #, c-format
 msgid "Rejected hunk #%d."
-msgstr "hunk #%d bị từ chối."
+msgstr "đoạn dữ liệu #%d bị từ chối."
 
 #: builtin/apply.c:4227
 msgid "unrecognized input"
@@ -2546,7 +2458,7 @@ 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:452
+#: builtin/apply.c:4389 builtin/checkout-index.c:197 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"
 
@@ -2686,97 +2598,97 @@ msgstr "git blame [các-tùy-chọn] [rev-opts] [rev] [--] tập-tin"
 msgid "[rev-opts] are documented in git-rev-list(1)"
 msgstr "[rev-opts] được mô tả trong git-rev-list(1)"
 
-#: builtin/blame.c:2249
+#: builtin/blame.c:2242
 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:2250
+#: builtin/blame.c:2243
 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:2251
+#: builtin/blame.c:2244
 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:2252
+#: builtin/blame.c:2245
 msgid "Show work cost statistics"
 msgstr "Hiển thị thống kê công sức làm việc"
 
-#: builtin/blame.c:2253
+#: builtin/blame.c:2246
 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:2254
+#: builtin/blame.c:2247
 msgid "Show original filename (Default: auto)"
 msgstr "Hiển thị tên tập tin gốc (Mặc định: auto)"
 
-#: builtin/blame.c:2255
+#: builtin/blame.c:2248
 msgid "Show original linenumber (Default: off)"
 msgstr "Hiển thị số dòng gốc (Mặc định: off)"
 
-#: builtin/blame.c:2256
+#: builtin/blame.c:2249
 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:2257
+#: builtin/blame.c:2250
 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:2258
+#: builtin/blame.c:2251
 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:2259
+#: builtin/blame.c:2252
 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:2260
+#: builtin/blame.c:2253
 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:2261
+#: builtin/blame.c:2254
 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:2262
+#: builtin/blame.c:2255
 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:2263
+#: builtin/blame.c:2256
 msgid "Ignore whitespace differences"
 msgstr "Bỏ qua các khác biệt do khoảng trắng gây ra"
 
-#: builtin/blame.c:2264
+#: builtin/blame.c:2257
 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:2265
+#: builtin/blame.c:2258
 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:2266
+#: builtin/blame.c:2259
 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:2267 builtin/blame.c:2268
+#: builtin/blame.c:2260 builtin/blame.c:2261
 msgid "score"
 msgstr "điểm số"
 
-#: builtin/blame.c:2267
+#: builtin/blame.c:2260
 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:2268
+#: builtin/blame.c:2261
 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:2269
+#: builtin/blame.c:2262
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
 msgid "Process only line range n,m, counting from 1"
 msgstr "Xử lý chỉ dòng vùng n,m, tính từ 1"
 
@@ -2927,12 +2839,12 @@ msgstr " **** tham chiếu không hợp lệ ****"
 #: builtin/branch.c:594
 #, c-format
 msgid "(no branch, rebasing %s)"
-msgstr "(không nhánh, đang rebase %s)"
+msgstr "(không nhánh, đang cải tổ %s)"
 
 #: builtin/branch.c:597
 #, c-format
 msgid "(no branch, bisect started on %s)"
-msgstr "(không nhánh, bisect được bắt đầu tại %s)"
+msgstr "(không nhánh, di chuyển nửa bước được bắt đầu tại %s)"
 
 #: builtin/branch.c:600
 #, c-format
@@ -2999,7 +2911,7 @@ msgstr "hiển thị mã băm và chủ đề, đưa ra hai lần cho nhánh th
 
 #: builtin/branch.c:806
 msgid "suppress informational messages"
-msgstr "Thu hồi các thông điệp thông tin"
+msgstr "không xuất các thông tin"
 
 #: builtin/branch.c:807
 msgid "set up tracking mode (see git-pull(1))"
@@ -3011,17 +2923,18 @@ msgstr "thay đổi thông tin thượng nguồn"
 
 #: builtin/branch.c:813
 msgid "use colored output"
-msgstr "sử dụng kết xuất có tô màu"
+msgstr "tô màu kết xuất"
 
 #: builtin/branch.c:814
 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:1460 builtin/commit.c:1461
-#: builtin/commit.c:1462 builtin/commit.c:1463 builtin/tag.c:468
+#: 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
 msgid "commit"
-msgstr "commit"
+msgstr "lần_chuyển_giao"
 
 #: builtin/branch.c:818 builtin/branch.c:824
 msgid "print only branches that contain the commit"
@@ -3037,7 +2950,7 @@ msgstr "liệt kê cả nhánh “remote-tracking” và nội bộ"
 
 #: builtin/branch.c:833
 msgid "delete fully merged branch"
-msgstr "xóa một cách đầy đủ nhánh đã hòa trộn"
+msgstr "xóa một toàn bộ nhánh đã hòa trộn"
 
 #: builtin/branch.c:834
 msgid "delete branch (even if not merged)"
@@ -3073,7 +2986,7 @@ msgstr "chỉ hiển thị các nhánh chưa được hòa trộn"
 
 #: builtin/branch.c:850
 msgid "print only merged branches"
-msgstr "chỉ hiển thị các nhánh được hòa trộn"
+msgstr "chỉ hiển thị các nhánh đã hòa trộn"
 
 #: builtin/branch.c:854
 msgid "list branches in columns"
@@ -3093,7 +3006,7 @@ msgstr "tùy chọn --column và --verbose xung khắc nhau"
 
 #: builtin/branch.c:902 builtin/branch.c:941
 msgid "branch name required"
-msgstr "cần tên nhánh"
+msgstr "cần chỉ ra tên nhánh"
 
 #: builtin/branch.c:917
 msgid "Cannot give description to detached HEAD"
@@ -3205,44 +3118,44 @@ msgstr "Cần một kho chứa để có thể tạo một bundle."
 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:328
+#: builtin/cat-file.c:331
 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>"
+msgstr "git cat-file (-t|-s|-e|-p|<kiểu>|--textconv) <đối_tượng>"
 
-#: builtin/cat-file.c:329
+#: builtin/cat-file.c:332
 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:366
+#: builtin/cat-file.c:369
 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:367
+#: builtin/cat-file.c:370
 msgid "show object type"
 msgstr "hiển thị kiểu đối tượng"
 
-#: builtin/cat-file.c:368
+#: builtin/cat-file.c:371
 msgid "show object size"
 msgstr "hiển thị kích thước đối tượng"
 
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:373
 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:371
+#: builtin/cat-file.c:374
 msgid "pretty-print object's content"
 msgstr "in nội dung đối tượng dạng dễ đọc"
 
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:376
 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:375
+#: builtin/cat-file.c:378
 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:378
+#: builtin/cat-file.c:381
 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"
 
@@ -3271,7 +3184,7 @@ msgstr "đọc tên tập tin từ đầu vào tiêu chuẩn"
 msgid "terminate input and output records by a NUL character"
 msgstr "chấm dứt các bản ghi vào và ra bằng ký tự NULL"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
 msgid "suppress progress reporting"
 msgstr "chặn các báo cáo tiến trình hoạt động"
 
@@ -3424,60 +3337,59 @@ 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:451
+#: builtin/checkout.c:261 builtin/checkout.c:450
 msgid "corrupt index file"
 msgstr "tập tin ghi bảng mục lục bị hỏng"
 
-#: builtin/checkout.c:322 builtin/checkout.c:329
+#: builtin/checkout.c:321 builtin/checkout.c:328
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "đường dẫn “%s” không được hòa trộn"
 
-#: builtin/checkout.c:473
+#: builtin/checkout.c:472
 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:594
+#: builtin/checkout.c:593
 #, 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:632
+#: builtin/checkout.c:631
 msgid "HEAD is now at"
 msgstr "HEAD hiện giờ tại"
 
-#: builtin/checkout.c:639
+#: builtin/checkout.c:638
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Đặt lại nhánh “%s”\n"
 
-#: builtin/checkout.c:642
+#: builtin/checkout.c:641
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Đã sẵn sàng trên “%s”\n"
 
-#: builtin/checkout.c:646
+#: builtin/checkout.c:645
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
-msgstr "Đã chuyển tới và reset nhánh “%s”\n"
+msgstr "Đã chuyển tới và đặt lại nhánh “%s”\n"
 
-#: builtin/checkout.c:648 builtin/checkout.c:1033
+#: builtin/checkout.c:647 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:650
+#: builtin/checkout.c:649
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Đã chuyển đến nhánh “%s”\n"
 
-#: builtin/checkout.c:706
+#: builtin/checkout.c:705
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... và nhiều hơn %d.\n"
 
-#. The singular version
-#: builtin/checkout.c:712
+#: builtin/checkout.c:711
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -3502,7 +3414,7 @@ msgstr[1] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:730
+#: builtin/checkout.c:729
 #, c-format
 msgid ""
 "If you want to keep them by creating a new branch, this may be a good time\n"
@@ -3518,142 +3430,141 @@ msgstr ""
 " git branch tên_nhánh_mới %s\n"
 "\n"
 
-#: builtin/checkout.c:760
+#: builtin/checkout.c:759
 msgid "internal error in revision walk"
 msgstr "lỗi nội bộ trong khi di chuyển qua các điểm xét duyệt"
 
-#: builtin/checkout.c:764
+#: builtin/checkout.c:763
 msgid "Previous HEAD position was"
 msgstr "Vị trí trước kia của HEAD là"
 
-#: builtin/checkout.c:791 builtin/checkout.c:1028
+#: builtin/checkout.c:790 builtin/checkout.c:1027
 msgid "You are on a branch yet to be born"
 msgstr "Bạn tại nhánh mà nó chưa hề được sinh ra"
 
-#: builtin/checkout.c:935
+#: builtin/checkout.c:934
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "chỉ cần một tham chiếu, nhưng lại đưa ra %d."
 
-#: builtin/checkout.c:974
+#: builtin/checkout.c:973
 #, c-format
 msgid "invalid reference: %s"
 msgstr "tham chiếu không hợp lệ: %s"
 
-#. case (1): want a tree
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "tham chiếu không phải là một cây:%s"
 
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
 msgid "paths cannot be used with switching branches"
 msgstr "các đường dẫn không thể dùng cùng với các nhánh chuyển"
 
-#: builtin/checkout.c:1045 builtin/checkout.c:1049
+#: builtin/checkout.c:1044 builtin/checkout.c:1048
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "“%s” không thể được sử dụng với các nhánh chuyển"
 
-#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1052 builtin/checkout.c:1055 builtin/checkout.c:1060
+#: builtin/checkout.c:1063
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "“%s” không thể được dùng với “%s”"
 
-#: builtin/checkout.c:1069
+#: builtin/checkout.c:1068
 #, c-format
 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:1091 builtin/checkout.c:1093 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
 #: builtin/remote.c:159 builtin/remote.c:161
 msgid "branch"
 msgstr "nhánh"
 
-#: builtin/checkout.c:1092
+#: builtin/checkout.c:1091
 msgid "create and checkout a new branch"
 msgstr "tạo và checkout một nhánh mới"
 
-#: builtin/checkout.c:1094
+#: builtin/checkout.c:1093
 msgid "create/reset and checkout a branch"
 msgstr "tạo/đặt_lại và checkout một nhánh"
 
-#: builtin/checkout.c:1095
+#: builtin/checkout.c:1094
 msgid "create reflog for new branch"
 msgstr "tạo reflog cho nhánh mới"
 
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
 msgid "detach the HEAD at named commit"
 msgstr "rời bỏ HEAD tại lần chuyển giao danh nghĩa"
 
-#: builtin/checkout.c:1097
+#: builtin/checkout.c:1096
 msgid "set upstream info for new branch"
 msgstr "đặt thông tin thượng nguồn cho nhánh mới"
 
-#: builtin/checkout.c:1099
-msgid "new branch"
-msgstr "nhánh mới"
+#: builtin/checkout.c:1098
+msgid "new-branch"
+msgstr "nhánh-mới"
 
-#: builtin/checkout.c:1099
+#: builtin/checkout.c:1098
 msgid "new unparented branch"
 msgstr "nhánh không cha mới"
 
-#: builtin/checkout.c:1100
+#: builtin/checkout.c:1099
 msgid "checkout our version for unmerged files"
 msgstr ""
 "lấy ra (checkout) phiên bản của chúng ta cho các tập tin chưa được hòa trộn"
 
-#: builtin/checkout.c:1102
+#: builtin/checkout.c:1101
 msgid "checkout their version for unmerged files"
 msgstr ""
 "lấy ra (checkout) phiên bản của chúng họ cho các tập tin chưa được hòa trộn"
 
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1103
 msgid "force checkout (throw away local modifications)"
-msgstr "ép buộc lấy ra (checkout) (bỏ đi những thay đổi nội bộ)"
+msgstr "ép buộc lấy ra (bỏ đi những thay đổi nội bộ)"
 
-#: builtin/checkout.c:1105
+#: builtin/checkout.c:1104
 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:1106 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:225
 msgid "update ignored files (default)"
 msgstr "cập nhật các tập tin bị bỏ qua (mặc định)"
 
-#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248
+#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
 msgid "style"
 msgstr "kiểu"
 
-#: builtin/checkout.c:1108
+#: builtin/checkout.c:1107
 msgid "conflict style (merge or diff3)"
 msgstr "xung đột kiểu (hòa trộn hoặc diff3)"
 
-#: builtin/checkout.c:1111
+#: builtin/checkout.c:1110
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "không giới hạn đặc tả đường dẫn thành chỉ các mục thưa thớt"
 
-#: builtin/checkout.c:1113
+#: builtin/checkout.c:1112
 msgid "second guess 'git checkout no-such-branch'"
 msgstr "gợi ý thứ hai “git checkout không-nhánh-nào-như-vậy”"
 
-#: builtin/checkout.c:1136
+#: builtin/checkout.c:1135
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "Các tùy chọn -b, -B và --orphan loại từ lẫn nhau"
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
 msgid "--track needs a branch name"
 msgstr "--track cần tên một nhánh"
 
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1159
 msgid "Missing branch name; try -b"
 msgstr "Thiếu tên nhánh; hãy thử -b"
 
-#: builtin/checkout.c:1197
+#: builtin/checkout.c:1196
 msgid "invalid path specification"
 msgstr "đường dẫn đã cho không hợp lệ"
 
-#: builtin/checkout.c:1204
+#: builtin/checkout.c:1203
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3663,12 +3574,12 @@ msgstr ""
 "Bạn đã có ý định checkout “%s” cái mà không thể được phân giải như là lần "
 "chuyển giao?"
 
-#: builtin/checkout.c:1209
+#: builtin/checkout.c:1208
 #, 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:1213
+#: builtin/checkout.c:1212
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -3707,7 +3618,7 @@ msgstr "Nên bỏ qua kho chứa %s\n"
 msgid "failed to remove %s"
 msgstr "gặp lỗi khi gỡ bỏ %s"
 
-#: builtin/clean.c:294
+#: builtin/clean.c:295
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -3719,7 +3630,7 @@ msgstr ""
 "foo        - chọn mục trên cơ sở tiền tố duy nhất\n"
 "           - (trống rỗng) không chọn gì cả"
 
-#: builtin/clean.c:298
+#: builtin/clean.c:299
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -3737,37 +3648,37 @@ msgstr ""
 "foo        - chọn mục dựa trên tiền tố duy nhất\n"
 "-...       - không chọn các mục đã chỉ ra\n"
 "*          - chọn tất\n"
-"           - (trống rỗng) kết thúc việc chọn"
+"           - (để trống) kết thúc việc chọn"
 
-#: builtin/clean.c:516
+#: builtin/clean.c:517
 #, c-format
 msgid "Huh (%s)?"
 msgstr "Hả (%s)?"
 
-#: builtin/clean.c:659
+#: builtin/clean.c:660
 #, 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:696
+#: builtin/clean.c:697
 #, 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:717
+#: builtin/clean.c:718
 msgid "Select items to delete"
 msgstr "Chọn mục muốn xóa"
 
-#: builtin/clean.c:757
+#: builtin/clean.c:758
 #, c-format
 msgid "remove %s? "
 msgstr "gỡ bỏ “%s”? "
 
-#: builtin/clean.c:782
+#: builtin/clean.c:783
 msgid "Bye."
 msgstr "Tạm biệt."
 
-#: builtin/clean.c:790
+#: builtin/clean.c:791
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -3785,83 +3696,83 @@ msgstr ""
 "help                - hiển thị chính trợ giúp này\n"
 "?                   - trợ giúp dành cho chọn bằng cách nhắc"
 
-#: builtin/clean.c:817
+#: builtin/clean.c:818
 msgid "*** Commands ***"
 msgstr "*** Lệnh ***"
 
-#: builtin/clean.c:818
+#: builtin/clean.c:819
 msgid "What now"
 msgstr "Giờ thì sao"
 
-#: builtin/clean.c:826
+#: builtin/clean.c:827
 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:843
+#: builtin/clean.c:844
 msgid "No more files to clean, exiting."
 msgstr "Không còn tập-tin nào để dọn dẹp, đang thoát ra."
 
-#: builtin/clean.c:874
+#: builtin/clean.c:875
 msgid "do not print names of files removed"
 msgstr "không hiển thị tên của các tập tin đã gỡ bỏ"
 
-#: builtin/clean.c:876
+#: builtin/clean.c:877
 msgid "force"
 msgstr "ép buộc"
 
-#: builtin/clean.c:877
+#: builtin/clean.c:878
 msgid "interactive cleaning"
 msgstr "dọn bằng kiểu tương tác"
 
-#: builtin/clean.c:879
+#: builtin/clean.c:880
 msgid "remove whole directories"
 msgstr "gỡ bỏ toàn bộ thư mục"
 
-#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:718
-#: builtin/ls-files.c:483 builtin/name-rev.c:314 builtin/show-ref.c:185
+#: 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
 msgid "pattern"
 msgstr "mẫu"
 
-#: builtin/clean.c:881
+#: builtin/clean.c:882
 msgid "add <pattern> to ignore rules"
 msgstr "thêm <mẫu> vào trong qui tắc bỏ qua"
 
-#: builtin/clean.c:882
+#: builtin/clean.c:883
 msgid "remove ignored files, too"
 msgstr "đồng thời gỡ bỏ cả các tập tin bị bỏ qua"
 
-#: builtin/clean.c:884
+#: builtin/clean.c:885
 msgid "remove only ignored files"
 msgstr "chỉ gỡ bỏ những tập tin bị bỏ qua"
 
-#: builtin/clean.c:902
+#: builtin/clean.c:903
 msgid "-x and -X cannot be used together"
-msgstr "-x và -X không thể dùng cùng một lúc với nhau"
+msgstr "-x và -X không thể dùng cùng nhau"
 
-#: builtin/clean.c:906
+#: builtin/clean.c:907
 msgid ""
-"clean.requireForce set to true and neither -i, -n nor -f given; refusing to "
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
 msgstr ""
-"clean.requireForce được đặt thành true và không đưa ra tùy chọn -n mà cũng "
-"không -f; từ chối lệnh dọn dẹp (clean)"
+"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:909
+#: builtin/clean.c:910
 msgid ""
-"clean.requireForce defaults to true and neither -i, -n nor -f given; "
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
 msgstr ""
-"clean.requireForce mặc định được đặt là true và không đưa ra tùy chọn -n mà "
-"cũng không -f; từ chối lệnh dọn dẹp (clean)"
+"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
 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:521
+#: builtin/push.c:504
 msgid "force progress reporting"
 msgstr "ép buộc báo cáo tiến triển công việc"
 
@@ -3869,7 +3780,7 @@ msgstr "ép buộc báo cáo tiến triển công việc"
 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:488
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
 msgid "create a bare repository"
 msgstr "tạo kho thuần"
 
@@ -3893,11 +3804,11 @@ msgstr "cài đặt đây là kho chia sẻ"
 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:485
+#: builtin/clone.c:82 builtin/init-db.c:483
 msgid "template-directory"
 msgstr "thư-mục-mẫu"
 
-#: builtin/clone.c:83 builtin/init-db.c:486
+#: builtin/clone.c:83 builtin/init-db.c:484
 msgid "directory from which templates will be used"
 msgstr "thư mục mà tại đó các mẫu sẽ được dùng"
 
@@ -3921,7 +3832,7 @@ msgstr "lấy ra <nhánh> thay cho HEAD của máy chủ"
 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:663
+#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
 msgid "depth"
 msgstr "độ-sâu"
 
@@ -3933,11 +3844,11 @@ msgstr "tạo bản sao không đầy đủ cho mức sâu đã cho"
 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:494
+#: builtin/clone.c:96 builtin/init-db.c:492
 msgid "gitdir"
 msgstr "gitdir"
 
-#: builtin/clone.c:97 builtin/init-db.c:495
+#: builtin/clone.c:97 builtin/init-db.c:493
 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"
 
@@ -3972,7 +3883,7 @@ msgstr "tạo thư mục \"%s\" gặp lỗi"
 #: builtin/clone.c:323 builtin/diff.c:83
 #, c-format
 msgid "failed to stat '%s'"
-msgstr "gặp lỗi stat (lấy trạng thái về) “%s”"
+msgstr "gặp lỗi khi lấy thống kê về “%s”"
 
 #: builtin/clone.c:325
 #, c-format
@@ -4025,7 +3936,7 @@ msgstr "máy chủ đã không gửi tất cả các đối tượng cần thi
 
 #: builtin/clone.c:626
 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ể 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
 msgid "unable to checkout working tree"
@@ -4230,69 +4141,69 @@ msgstr ""
 "Thế thì \"git cherry-pick --continue\" sẽ phục hồi lại việc cherry-pick\n"
 "những lần chuyển giao còn lại.\n"
 
-#: builtin/commit.c:287
+#: builtin/commit.c:288
 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:329
+#: builtin/commit.c:330
 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:335
+#: builtin/commit.c:336
 msgid "interactive add failed"
 msgstr "gặp lỗi khi thêm bằng cách tương"
 
-#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439
+#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
 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:420
+#: builtin/commit.c:421
 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:422
+#: builtin/commit.c:423
 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:432
+#: builtin/commit.c:433
 msgid "cannot read the index"
 msgstr "không đọc được bảng mục lục"
 
-#: builtin/commit.c:452
+#: builtin/commit.c:453
 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:543 builtin/commit.c:549
+#: builtin/commit.c:544 builtin/commit.c:550
 #, c-format
 msgid "invalid commit: %s"
 msgstr "lần chuyển giao không hợp lệ: %s"
 
-#: builtin/commit.c:571
+#: builtin/commit.c:572
 msgid "malformed --author parameter"
 msgstr "đối số cho --author bị dị hình"
 
-#: builtin/commit.c:591
+#: builtin/commit.c:592
 #, c-format
 msgid "Malformed ident string: '%s'"
 msgstr "Chuỗi thụt lề đầu dòng dị hình: “%s”"
 
-#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007
+#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
 #, 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:642 builtin/shortlog.c:273
+#: builtin/commit.c:641 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:644
+#: builtin/commit.c:643
 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:648
+#: builtin/commit.c:647
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "không đọc được tệp nhật ký “%s”"
@@ -4318,7 +4229,7 @@ msgstr "Không thể đọc “%s”."
 msgid "could not write commit template"
 msgstr "không thể ghi mẫu chuyển giao"
 
-#: builtin/commit.c:760
+#: builtin/commit.c:764
 #, c-format
 msgid ""
 "\n"
@@ -4333,7 +4244,7 @@ msgstr ""
 "\t%s\n"
 "và thử lại.\n"
 
-#: builtin/commit.c:765
+#: builtin/commit.c:769
 #, c-format
 msgid ""
 "\n"
@@ -4348,7 +4259,7 @@ msgstr ""
 "\t%s\n"
 "và thử lại.\n"
 
-#: builtin/commit.c:777
+#: builtin/commit.c:782
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4359,7 +4270,7 @@ msgstr ""
 "bắt đầu bằng “%c” sẽ được bỏ qua, nếu phần chú thích rỗng sẽ hủy bỏ lần "
 "chuyển giao.\n"
 
-#: builtin/commit.c:782
+#: builtin/commit.c:789
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4371,149 +4282,149 @@ msgstr ""
 "bắt đầu bằng “%c” sẽ được bỏ qua; bạn có thể xóa chúng đi nếu muốn thế.\n"
 "Phần chú thích này nếu trống rỗng sẽ hủy bỏ lần chuyển giao.\n"
 
-#: builtin/commit.c:795
+#: builtin/commit.c:802
 #, c-format
 msgid "%sAuthor:    %s"
 msgstr "%sTác giả:    %s"
 
-#: builtin/commit.c:802
+#: builtin/commit.c:809
 #, c-format
 msgid "%sCommitter: %s"
 msgstr "%sNgười chuyển giao: %s"
 
-#: builtin/commit.c:822
+#: builtin/commit.c:829
 msgid "Cannot read index"
 msgstr "Không đọc được bảng mục lục"
 
-#: builtin/commit.c:865
+#: builtin/commit.c:872
 msgid "Error building trees"
 msgstr "Gặp lỗi khi xây dựng cây"
 
-#: builtin/commit.c:880 builtin/tag.c:359
+#: builtin/commit.c:887 builtin/tag.c:391
 #, 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:982
+#: builtin/commit.c:989
 #, 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:997 builtin/commit.c:1237
+#: builtin/commit.c:1004 builtin/commit.c:1244
 #, 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:1034
+#: builtin/commit.c:1041
 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:1064
+#: builtin/commit.c:1071
 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:1075
+#: builtin/commit.c:1080
 msgid "You have nothing to amend."
 msgstr "Không có gì để mà “tu bổ” cả."
 
-#: builtin/commit.c:1078
+#: builtin/commit.c:1083
 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:1080
+#: builtin/commit.c:1085
 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:1083
+#: builtin/commit.c:1088
 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:1093
+#: builtin/commit.c:1098
 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:1095
+#: builtin/commit.c:1100
 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:1103
+#: builtin/commit.c:1108
 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:1120
+#: builtin/commit.c:1125
 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:1122
+#: builtin/commit.c:1127
 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:1124
+#: builtin/commit.c:1129
 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:1126
-msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
+#: builtin/commit.c:1131
+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; đang "
-"giả định --only những-đường-dẫn..."
+"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:1136 builtin/tag.c:572
+#: builtin/commit.c:1143 builtin/tag.c:639
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Chế độ dọn dẹp không hợp lệ %s"
 
-#: builtin/commit.c:1141
+#: builtin/commit.c:1148
 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:1251 builtin/commit.c:1482
+#: builtin/commit.c:1258 builtin/commit.c:1516
 msgid "show status concisely"
 msgstr "hiển thị trạng thái ở dạng súc tích"
 
-#: builtin/commit.c:1253 builtin/commit.c:1484
+#: builtin/commit.c:1260 builtin/commit.c:1518
 msgid "show branch information"
 msgstr "hiển thị thông tin nhánh"
 
-#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507
+#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
 msgid "machine-readable output"
 msgstr "kết xuất dạng máy-có-thể-đọc"
 
-#: builtin/commit.c:1258 builtin/commit.c:1488
+#: builtin/commit.c:1265 builtin/commit.c:1522
 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:1261 builtin/commit.c:1491
+#: builtin/commit.c:1268 builtin/commit.c:1525
 msgid "terminate entries with NUL"
 msgstr "chấm dứt các mục bằng NUL"
 
-#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:459
+#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
+#: builtin/fast-export.c:677 builtin/tag.c:514
 msgid "mode"
 msgstr "chế độ"
 
-#: builtin/commit.c:1264 builtin/commit.c:1494
+#: builtin/commit.c:1271 builtin/commit.c:1528
 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:1267
+#: builtin/commit.c:1274
 msgid "show ignored files"
 msgstr "hiển thị các tập tin ẩn"
 
-#: builtin/commit.c:1268 parse-options.h:156
+#: builtin/commit.c:1275 parse-options.h:153
 msgid "when"
 msgstr "khi"
 
-#: builtin/commit.c:1269
+#: builtin/commit.c:1276
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -4521,221 +4432,221 @@ msgstr ""
 "bỏ qua các thay đổi trong mô-đun-con, tùy chọn khi: all, dirty, untracked. "
 "(Mặc định: all)"
 
-#: builtin/commit.c:1271
+#: builtin/commit.c:1278
 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:1340
+#: builtin/commit.c:1347
 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:1342
+#: builtin/commit.c:1349
 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:1383
+#: builtin/commit.c:1390
 msgid "detached HEAD"
 msgstr "đã rời khỏi HEAD"
 
-#: builtin/commit.c:1385
+#: builtin/commit.c:1392
 msgid " (root-commit)"
 msgstr " (root-commit)"
 
-#: builtin/commit.c:1452
+#: builtin/commit.c:1486
 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:1453
+#: builtin/commit.c:1487
 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:1455
+#: builtin/commit.c:1489
 msgid "Commit message options"
 msgstr "Các tùy chọn ghi chú commit"
 
-#: builtin/commit.c:1456 builtin/tag.c:457
+#: builtin/commit.c:1490 builtin/tag.c:512
 msgid "read message from file"
 msgstr "đọc chú thích từ tập tin"
 
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
 msgid "author"
 msgstr "tác giả"
 
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
 msgid "override author for commit"
 msgstr "ghi đè tác giả cho commit"
 
-#: builtin/commit.c:1458 builtin/gc.c:261
+#: builtin/commit.c:1492 builtin/gc.c:272
 msgid "date"
 msgstr "ngày tháng"
 
-#: builtin/commit.c:1458
+#: builtin/commit.c:1492
 msgid "override date for commit"
 msgstr "ghi đè ngày tháng cho lần chuyển giao"
 
-#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405
-#: builtin/notes.c:562 builtin/tag.c:455
+#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:510
 msgid "message"
 msgstr "chú thích"
 
-#: builtin/commit.c:1459
+#: builtin/commit.c:1493
 msgid "commit message"
 msgstr "chú thích của lần chuyển giao"
 
-#: builtin/commit.c:1460
+#: builtin/commit.c:1494
 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:1461
+#: builtin/commit.c:1495
 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:1462
+#: builtin/commit.c:1496
 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:1463
+#: builtin/commit.c:1497
 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:1464
+#: builtin/commit.c:1498
 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:1465 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "(nên dùng) thêm dòng Signed-off-by:"
 
-#: builtin/commit.c:1466
+#: builtin/commit.c:1500
 msgid "use specified template file"
 msgstr "sử dụng tập tin mẫu đã cho"
 
-#: builtin/commit.c:1467
+#: builtin/commit.c:1501
 msgid "force edit of commit"
 msgstr "ép buộc sửa lần commit"
 
-#: builtin/commit.c:1468
+#: builtin/commit.c:1502
 msgid "default"
 msgstr "mặc định"
 
-#: builtin/commit.c:1468 builtin/tag.c:460
+#: builtin/commit.c:1502 builtin/tag.c:515
 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:1469
+#: builtin/commit.c:1503
 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:1470 builtin/merge.c:223 builtin/tag.c:461
-msgid "key id"
-msgstr "id của khóa"
+#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:516
+msgid "key-id"
+msgstr "mã-số-khóa"
 
-#: builtin/commit.c:1471 builtin/merge.c:224
+#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "ký lần chuyển giao dùng GPG"
 
-#. end commit message options
-#: builtin/commit.c:1474
+#: builtin/commit.c:1508
 msgid "Commit contents options"
 msgstr "Các tùy nội dung ghi chú commit"
 
-#: builtin/commit.c:1475
+#: builtin/commit.c:1509
 msgid "commit all changed files"
 msgstr "chuyển giao tất cả các tập tin có thay đổi"
 
-#: builtin/commit.c:1476
+#: builtin/commit.c:1510
 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:1477
+#: builtin/commit.c:1511
 msgid "interactively add files"
 msgstr "thêm các tập-tin bằng tương tác"
 
-#: builtin/commit.c:1478
+#: builtin/commit.c:1512
 msgid "interactively add changes"
 msgstr "thêm các thay đổi bằng tương tác"
 
-#: builtin/commit.c:1479
+#: builtin/commit.c:1513
 msgid "commit only specified files"
 msgstr "chỉ chuyển giao các tập tin đã chỉ ra"
 
-#: builtin/commit.c:1480
+#: builtin/commit.c:1514
 msgid "bypass pre-commit hook"
 msgstr "vòng qua móc (hook) pre-commit"
 
-#: builtin/commit.c:1481
+#: builtin/commit.c:1515
 msgid "show what would be committed"
 msgstr "hiển thị xem cái gì có thể được chuyển giao"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1526
 msgid "amend previous commit"
 msgstr "“tu bổ” (amend) lần commit trước"
 
-#: builtin/commit.c:1493
+#: builtin/commit.c:1527
 msgid "bypass post-rewrite hook"
 msgstr "vòng qua móc (hook) post-rewrite"
 
-#: builtin/commit.c:1498
+#: builtin/commit.c:1532
 msgid "ok to record an empty change"
 msgstr "ok để ghi lại một thay đổi trống rỗng"
 
-#: builtin/commit.c:1500
+#: builtin/commit.c:1534
 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:1529
+#: builtin/commit.c:1562
 msgid "could not parse HEAD commit"
 msgstr "không thể phân tích commit (lần chuyển giao) HEAD"
 
-#: builtin/commit.c:1567 builtin/merge.c:518
+#: builtin/commit.c:1601 builtin/merge.c:518
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "không thể mở “%s” để đọc"
 
-#: builtin/commit.c:1574
+#: builtin/commit.c:1608
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Tập tin MERGE_HEAD sai hỏng (%s)"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1615
 msgid "could not read MERGE_MODE"
 msgstr "không thể đọc MERGE_MODE"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1634
 #, 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:1611
+#: builtin/commit.c:1645
 #, 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:1616
+#: builtin/commit.c:1650
 #, 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:1631 builtin/merge.c:854 builtin/merge.c:879
+#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
 msgid "failed to write commit object"
 msgstr "gặp lỗi khi ghi đối tượng chuyển giao"
 
-#: builtin/commit.c:1652
+#: builtin/commit.c:1686
 msgid "cannot lock HEAD ref"
 msgstr "không thể khóa HEAD ref (tham chiếu)"
 
-#: builtin/commit.c:1656
+#: 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:1667
+#: builtin/commit.c:1701
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full or quota is\n"
@@ -4750,127 +4661,127 @@ msgstr ""
 msgid "git config [options]"
 msgstr "git config [các-tùy-chọn]"
 
-#: builtin/config.c:54
+#: builtin/config.c:53
 msgid "Config file location"
 msgstr "Vị trí tập tin cấu hình"
 
-#: builtin/config.c:55
+#: builtin/config.c:54
 msgid "use global config file"
 msgstr "dùng tập tin cấu hình toàn cục"
 
-#: builtin/config.c:56
+#: builtin/config.c:55
 msgid "use system config file"
 msgstr "sử dụng tập tin cấu hình hệ thống"
 
-#: builtin/config.c:57
+#: builtin/config.c:56
 msgid "use repository config file"
 msgstr "dùng tập tin cấu hình của kho"
 
-#: builtin/config.c:58
+#: builtin/config.c:57
 msgid "use given config file"
 msgstr "sử dụng tập tin cấu hình đã cho"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "blob-id"
 msgstr "blob-id"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "read config from given blob object"
 msgstr "đọc cấu hình từ đối tượng blob đã cho"
 
-#: builtin/config.c:60
+#: builtin/config.c:59
 msgid "Action"
 msgstr "Hành động"
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "get value: name [value-regex]"
 msgstr "lấy giá-trị: tên [value-regex]"
 
-#: builtin/config.c:62
+#: builtin/config.c:61
 msgid "get all values: key [value-regex]"
 msgstr "lấy tất cả giá-trị: khóa [value-regex]"
 
-#: builtin/config.c:63
+#: builtin/config.c:62
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr "lấy giá trị cho regexp: name-regex [value-regex]"
 
-#: builtin/config.c:64
+#: builtin/config.c:63
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "lấy đặc tả giá trị cho URL: phần[.biến] URL"
 
-#: builtin/config.c:65
+#: builtin/config.c:64
 msgid "replace all matching variables: name value [value_regex]"
 msgstr "thay thế tất cả các biến khớp mẫu: tên giá-trị [value_regex]"
 
-#: builtin/config.c:66
+#: builtin/config.c:65
 msgid "add a new variable: name value"
 msgstr "thêm biến mới: tên giá-trị"
 
-#: builtin/config.c:67
+#: builtin/config.c:66
 msgid "remove a variable: name [value-regex]"
 msgstr "gỡ bỏ biến: tên [value-regex]"
 
-#: builtin/config.c:68
+#: builtin/config.c:67
 msgid "remove all matches: name [value-regex]"
 msgstr "gỡ bỏ mọi cái khớp: tên [value-regex]"
 
-#: builtin/config.c:69
+#: builtin/config.c:68
 msgid "rename section: old-name new-name"
 msgstr "đổi tên phần: tên-cũ tên-mới"
 
-#: builtin/config.c:70
+#: builtin/config.c:69
 msgid "remove a section: name"
 msgstr "gỡ bỏ phần: tên"
 
-#: builtin/config.c:71
+#: builtin/config.c:70
 msgid "list all"
 msgstr "liệt kê tất"
 
-#: builtin/config.c:72
+#: builtin/config.c:71
 msgid "open an editor"
 msgstr "mở một trình biên soạn"
 
-#: builtin/config.c:73 builtin/config.c:74
+#: builtin/config.c:72 builtin/config.c:73
 msgid "slot"
 msgstr "khe"
 
-#: builtin/config.c:73
+#: builtin/config.c:72
 msgid "find the color configured: [default]"
 msgstr "tìm cấu hình màu sắc: [mặc định]"
 
-#: builtin/config.c:74
+#: builtin/config.c:73
 msgid "find the color setting: [stdout-is-tty]"
 msgstr "tìm các cài đặt về màu sắc: [stdout-là-tty]"
 
-#: builtin/config.c:75
+#: builtin/config.c:74
 msgid "Type"
 msgstr "Kiểu"
 
-#: builtin/config.c:76
+#: builtin/config.c:75
 msgid "value is \"true\" or \"false\""
 msgstr "giá trị là \"true\" hoặc \"false\""
 
-#: builtin/config.c:77
+#: builtin/config.c:76
 msgid "value is decimal number"
 msgstr "giá trị ở dạng số thập phân"
 
-#: builtin/config.c:78
+#: builtin/config.c:77
 msgid "value is --bool or --int"
 msgstr "giá trị là --bool hoặc --int"
 
-#: builtin/config.c:79
+#: builtin/config.c:78
 msgid "value is a path (file or directory name)"
 msgstr "giá trị là đường dẫn (tên tập tin hay thư mục)"
 
-#: builtin/config.c:80
+#: builtin/config.c:79
 msgid "Other"
 msgstr "Khác"
 
-#: builtin/config.c:81
+#: builtin/config.c:80
 msgid "terminate values with NUL byte"
 msgstr "chấm dứt giá trị với byte NUL"
 
-#: builtin/config.c:82
+#: builtin/config.c:81
 msgid "respect include directives on lookup"
 msgstr "tôn trọng kể cà các hướng trong tìm kiếm"
 
@@ -4890,47 +4801,47 @@ msgstr "git describe [các-tùy-chọn] <commit-ish>*"
 msgid "git describe [options] --dirty"
 msgstr "git describe [các-tùy-chọn] --dirty"
 
-#: builtin/describe.c:237
+#: builtin/describe.c:225
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "thẻ đã được ghi chú %s không sẵn để dùng"
 
-#: builtin/describe.c:241
+#: builtin/describe.c:229
 #, 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:243
+#: builtin/describe.c:231
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "thẻ “%s” đã thực sự ở đây “%s” rồi"
 
-#: builtin/describe.c:270
+#: builtin/describe.c:258
 #, 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:273
+#: builtin/describe.c:261
 #, 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:290
+#: builtin/describe.c:278
 #, 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:292
+#: builtin/describe.c:280
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "Đang tìm kiếm để mô tả %s\n"
 
-#: builtin/describe.c:332
+#: builtin/describe.c:327
 #, 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:359
+#: builtin/describe.c:354
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -4939,7 +4850,7 @@ msgstr ""
 "Không có thẻ được chú giải nào được mô tả là “%s”.\n"
 "Tuy nhiên, ở đây có những thẻ không được chú giải: hãy thử --tags."
 
-#: builtin/describe.c:363
+#: builtin/describe.c:358
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -4948,12 +4859,12 @@ msgstr ""
 "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:384
+#: builtin/describe.c:379
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "đã xuyên %lu qua lần chuyển giao\n"
 
-#: builtin/describe.c:387
+#: builtin/describe.c:382
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
@@ -4962,63 +4873,63 @@ msgstr ""
 "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:409
+#: builtin/describe.c:404
 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:410
+#: builtin/describe.c:405
 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:411
+#: builtin/describe.c:406
 msgid "use any ref"
 msgstr "dùng ref bất kỳ"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:407
 msgid "use any tag, even unannotated"
 msgstr "dùng thẻ bất kỳ, cả khi “unannotated”"
 
-#: builtin/describe.c:413
+#: builtin/describe.c:408
 msgid "always use long format"
 msgstr "luôn dùng định dạng dài"
 
-#: builtin/describe.c:414
+#: builtin/describe.c:409
 msgid "only follow first parent"
 msgstr "chỉ theo cha mẹ đầu tiên"
 
-#: builtin/describe.c:417
+#: builtin/describe.c:412
 msgid "only output exact matches"
 msgstr "chỉ xuất những gì khớp chính xác"
 
-#: builtin/describe.c:419
+#: builtin/describe.c:414
 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:421
+#: builtin/describe.c:416
 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:423 builtin/name-rev.c:321
+#: builtin/describe.c:418 builtin/name-rev.c:321
 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:424
+#: builtin/describe.c:419
 msgid "mark"
 msgstr "dấu"
 
-#: builtin/describe.c:425
+#: builtin/describe.c:420
 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:443
+#: builtin/describe.c:438
 msgid "--long is incompatible with --abbrev=0"
 msgstr "--long là xung khắc với tùy chọn --abbrev=0"
 
-#: builtin/describe.c:469
+#: builtin/describe.c:464
 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:489
+#: builtin/describe.c:484
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "--dirty là xung khắc với các tùy chọn commit-ish"
 
@@ -5314,7 +5225,7 @@ msgstr "Đang lấy về %s\n"
 msgid "Could not fetch %s"
 msgstr "không thể lấy về %s"
 
-#: builtin/fetch.c:1036
+#: builtin/fetch.c:1035
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -5356,10 +5267,10 @@ msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
 msgstr ""
 "git fmt-merge-msg [-m <chú_thích>] [--log[=<n>]|--no-log] [--file <tập-tin>]"
 
-#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702
-#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446
-#: parse-options.h:135 parse-options.h:242
+#: 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
+#: parse-options.h:132 parse-options.h:239
 msgid "n"
 msgstr "n"
 
@@ -5423,6 +5334,14 @@ msgstr "khóa"
 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
+msgid "Checking connectivity"
+msgstr "Đang kiểm tra kết nối"
+
+#: builtin/fsck.c:544
+msgid "Checking object directories"
+msgstr "Đang kiểm tra các thư mục đối tượng"
+
 #: builtin/fsck.c:607
 msgid "git fsck [options] [<object>...]"
 msgstr "git fsck [các-tùy-chọn] [<đối-tượng>...]"
@@ -5467,48 +5386,58 @@ msgstr "ghi các đối tượng không được quản lý trong .git/lost-foun
 msgid "show progress"
 msgstr "hiển thị quá trình"
 
+#: builtin/fsck.c:673
+msgid "Checking objects"
+msgstr "Đang kiểm tra các đối tượng"
+
 #: builtin/gc.c:24
 msgid "git gc [options]"
 msgstr "git gc [các-tùy-chọn]"
 
-#: builtin/gc.c:80
+#: builtin/gc.c:90
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "%s không hợp lệ: “%s”"
 
-#: builtin/gc.c:107
+#: builtin/gc.c:117
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "thư mục đối tượng dài một cách điên rồ  %.*s"
 
-#: builtin/gc.c:262
+#: builtin/gc.c:273
 msgid "prune unreferenced objects"
 msgstr "xóa bỏ các đối tượng không được tham chiếu"
 
-#: builtin/gc.c:264
+#: builtin/gc.c:275
 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:265
+#: builtin/gc.c:276
 msgid "enable auto-gc mode"
 msgstr "bật chế độ auto-gc"
 
-#: builtin/gc.c:266
+#: builtin/gc.c:277
 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:306
+#: builtin/gc.c:318
 #, c-format
-msgid ""
-"Auto packing the repository for optimum performance. You may also\n"
-"run \"git gc\" manually. See \"git help gc\" for more information.\n"
+msgid "Auto packing the repository in background 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"
-"chạy lệnh \"git gc\" một cách thủ công. Hãy xem \"git help gc\" để biết thêm "
-"chi tiết.\n"
+"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
+#, 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
+#, 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"
 
-#. be quiet on --auto
-#: builtin/gc.c:316
+#: builtin/gc.c:336
 #, c-format
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5516,7 +5445,7 @@ msgstr ""
 "gc đang được thực hiện trên máy “%s” pid %<PRIuMAX> (dùng --force nếu không "
 "phải thế)"
 
-#: builtin/gc.c:341
+#: builtin/gc.c:361
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
@@ -5547,212 +5476,212 @@ msgstr "không thể đọc cây (%s)"
 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:551
+#: builtin/grep.c:549
 #, 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:568
+#: builtin/grep.c:566
 #, c-format
 msgid "cannot open '%s'"
 msgstr "không mở được “%s”"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:640
 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:644
+#: builtin/grep.c:642
 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:646
+#: builtin/grep.c:644
 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:648
+#: builtin/grep.c:646
 msgid "search also in ignored files"
 msgstr "tìm cả trong các tập tin đã bị lờ đi"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:649
 msgid "show non-matching lines"
 msgstr "hiển thị những dòng không khớp với mẫu"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:651
 msgid "case insensitive matching"
 msgstr "phân biệt HOA/thường"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:653
 msgid "match patterns only at word boundaries"
 msgstr "chỉ khớp mẫu tại đường ranh giới từ"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:655
 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:659
+#: builtin/grep.c:657
 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:662
+#: builtin/grep.c:660
 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:664
+#: builtin/grep.c:662
 msgid "descend at most <depth> levels"
 msgstr "giảm xuống ít nhất mức <sâu>"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:666
 msgid "use extended POSIX regular expressions"
 msgstr "dùng biểu thức chính qui POSIX có mở rộng"
 
-#: builtin/grep.c:671
+#: builtin/grep.c:669
 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:674
+#: builtin/grep.c:672
 msgid "interpret patterns as fixed strings"
 msgstr "diễn dịch các mẫu như là chuỗi cố định"
 
-#: builtin/grep.c:677
+#: builtin/grep.c:675
 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:680
+#: builtin/grep.c:678
 msgid "show line numbers"
 msgstr "hiển thị số của dòng"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:679
 msgid "don't show filenames"
 msgstr "không hiển thị tên tập tin"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:680
 msgid "show filenames"
 msgstr "hiển thị các tên tập tin"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:682
 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:686
+#: builtin/grep.c:684
 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:688
+#: builtin/grep.c:686
 msgid "synonym for --files-with-matches"
 msgstr "đồng nghĩa với --files-with-matches"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:689
 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:693
+#: builtin/grep.c:691
 msgid "print NUL after filenames"
 msgstr "thêm NUL vào sau tên tập tin"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:693
 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:696
+#: builtin/grep.c:694
 msgid "highlight matches"
 msgstr "tô sáng cái khớp"
 
-#: builtin/grep.c:698
+#: builtin/grep.c:696
 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:700
+#: builtin/grep.c:698
 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:703
+#: builtin/grep.c:701
 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:706
+#: builtin/grep.c:704
 msgid "show <n> context lines before matches"
 msgstr "hiển thị <n> dòng nội dung trước khớp"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:706
 msgid "show <n> context lines after matches"
 msgstr "hiển thị <n> dòng nội dung sau khớp"
 
-#: builtin/grep.c:709
+#: builtin/grep.c:707
 msgid "shortcut for -C NUM"
 msgstr "dạng viết tắt của -C SỐ"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:710
 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:714
+#: builtin/grep.c:712
 msgid "show the surrounding function"
 msgstr "hiển thị hàm bao quanh"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:715
 msgid "read patterns from file"
 msgstr "đọc mẫu từ tập-tin"
 
-#: builtin/grep.c:719
+#: builtin/grep.c:717
 msgid "match <pattern>"
 msgstr "match <mẫu>"
 
-#: builtin/grep.c:721
+#: builtin/grep.c:719
 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:733
+#: builtin/grep.c:731
 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:735
+#: builtin/grep.c:733
 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:737
+#: builtin/grep.c:735
 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:741
+#: builtin/grep.c:739
 msgid "pager"
 msgstr "giấy"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:739
 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:744
+#: builtin/grep.c:742
 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:745 builtin/show-ref.c:187
+#: builtin/grep.c:743 builtin/show-ref.c:187
 msgid "show usage"
 msgstr "hiển thị cách dùng"
 
-#: builtin/grep.c:812
+#: builtin/grep.c:810
 msgid "no pattern given."
 msgstr "chưa chỉ ra mẫu."
 
-#: builtin/grep.c:870
+#: builtin/grep.c:868
 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:893
+#: builtin/grep.c:891
 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:898
+#: builtin/grep.c:896
 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:901
+#: builtin/grep.c:899
 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:909
+#: builtin/grep.c:907
 msgid "both --cached and trees are given."
 msgstr "cả hai --cached và các cây phải được chỉ ra."
 
@@ -5768,7 +5697,7 @@ msgstr ""
 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/hash-object.c:72 builtin/tag.c:521
 msgid "type"
 msgstr "kiểu"
 
@@ -6007,8 +5936,8 @@ msgstr "sự mâu thuẫn xả nén nghiêm trọng"
 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:171
-#: builtin/pack-objects.c:263
+#: builtin/index-pack.c:669 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
 #, c-format
 msgid "unable to read %s"
 msgstr "không thể đọc %s"
@@ -6274,63 +6203,61 @@ msgstr "không thể xử lý (handle) tập tin kiểu %d"
 msgid "unable to move %s to %s"
 msgstr "không di chuyển được %s vào %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:420
+#. 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 kho Git trong %s%s\n"
 
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
 msgid "Reinitialized existing"
 msgstr "Khởi tạo lại đã sẵn có rồi"
 
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
 msgid "Initialized empty"
 msgstr "Khởi tạo trống rỗng"
 
-#: builtin/init-db.c:422
+#: builtin/init-db.c:420
 msgid " shared"
 msgstr " đã chia sẻ"
 
-#: builtin/init-db.c:441
+#: 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:467
+#: 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=<thư-mục-tạm>] [--shared[=<các-"
 "quyền>]] [thư-mục]"
 
-#: builtin/init-db.c:490
+#: builtin/init-db.c:488
 msgid "permissions"
 msgstr "các quyền"
 
-#: builtin/init-db.c:491
+#: builtin/init-db.c:489
 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:493 builtin/prune-packed.c:79 builtin/repack.c:155
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
 msgid "be quiet"
 msgstr "im lặng"
 
-#: builtin/init-db.c:525 builtin/init-db.c:530
+#: builtin/init-db.c:523 builtin/init-db.c:528
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "không thể mkdir (tạo thư mục): %s"
 
-#: builtin/init-db.c:534
+#: builtin/init-db.c:532
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "không thể chdir (chuyển đổi thư mục) sang %s"
 
-#: builtin/init-db.c:556
+#: builtin/init-db.c:554
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -6339,11 +6266,11 @@ msgstr ""
 "%s (hoặc --work-tree=<thư-mục>) không cho phép không chỉ định %s (hoặc --git-"
 "dir=<thư-mục>)"
 
-#: builtin/init-db.c:580
+#: 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:587
+#: builtin/init-db.c:585
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "không thể truy cập cây (tree) làm việc “%s”"
@@ -6609,98 +6536,98 @@ msgstr ""
 msgid "Unknown commit %s"
 msgstr "Không hiểu lần chuyển giao %s"
 
-#: builtin/ls-files.c:398
+#: builtin/ls-files.c:401
 msgid "git ls-files [options] [<file>...]"
 msgstr "git ls-files [các-tùy-chọn] [<tập-tin>...]"
 
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:458
 msgid "identify the file status with tags"
 msgstr "nhận dạng các trạng thái tập tin với thẻ"
 
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:460
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr ""
 "dùng chữ cái viết thường cho các tập tin “assume unchanged” (giả định không "
 "thay đổi)"
 
-#: builtin/ls-files.c:459
+#: builtin/ls-files.c:462
 msgid "show cached files in the output (default)"
 msgstr "hiển thị các tập tin được nhớ tạm vào đầu ra (mặc định)"
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:464
 msgid "show deleted files in the output"
 msgstr "hiển thị các tập tin đã xóa trong kết xuất"
 
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:466
 msgid "show modified files in the output"
 msgstr "hiển thị các tập tin đã bị sửa đổi ra kết xuất"
 
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:468
 msgid "show other files in the output"
 msgstr "hiển thị các tập tin khác trong kết xuất"
 
-#: builtin/ls-files.c:467
+#: builtin/ls-files.c:470
 msgid "show ignored files in the output"
 msgstr "hiển thị các tập tin bị bỏ qua trong kết xuất"
 
-#: builtin/ls-files.c:470
+#: builtin/ls-files.c:473
 msgid "show staged contents' object name in the output"
 msgstr "hiển thị tên đối tượng của nội dung được đặt lên bệ phóng ra kết xuất"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:475
 msgid "show files on the filesystem that need to be removed"
 msgstr "hiển thị các tập tin trên hệ thống tập tin mà nó cần được gỡ bỏ"
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:477
 msgid "show 'other' directories' name only"
 msgstr "chỉ hiển thị tên của các thư mục “khác”"
 
-#: builtin/ls-files.c:477
+#: builtin/ls-files.c:480
 msgid "don't show empty directories"
 msgstr "không hiển thị thư mục rỗng"
 
-#: builtin/ls-files.c:480
+#: builtin/ls-files.c:483
 msgid "show unmerged files in the output"
 msgstr "hiển thị các tập tin chưa hòa trộn trong kết xuất"
 
-#: builtin/ls-files.c:482
+#: builtin/ls-files.c:485
 msgid "show resolve-undo information"
 msgstr "hiển thị thông tin resolve-undo"
 
-#: builtin/ls-files.c:484
+#: builtin/ls-files.c:487
 msgid "skip files matching pattern"
 msgstr "bỏ qua những tập tin khớp với một mẫu"
 
-#: builtin/ls-files.c:487
+#: builtin/ls-files.c:490
 msgid "exclude patterns are read from <file>"
 msgstr "mẫu loại trừ được đọc từ <tập tin>"
 
-#: builtin/ls-files.c:490
+#: builtin/ls-files.c:493
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "đọc thêm các mẫu ngoại trừ mỗi thư mục trong <tập tin>"
 
-#: builtin/ls-files.c:492
+#: builtin/ls-files.c:495
 msgid "add the standard git exclusions"
 msgstr "thêm loại trừ tiêu chuẩn kiểu git"
 
-#: builtin/ls-files.c:495
+#: builtin/ls-files.c:498
 msgid "make the output relative to the project top directory"
 msgstr "làm cho kết xuất liên quan đến thư mục ở mức cao nhất (gốc) của dự án"
 
-#: builtin/ls-files.c:498
+#: builtin/ls-files.c:501
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "nếu <tập tin> bất kỳ không ở trong bảng mục lục, xử lý nó như một lỗi"
 
-#: builtin/ls-files.c:499
+#: builtin/ls-files.c:502
 msgid "tree-ish"
 msgstr "tree-ish"
 
-#: builtin/ls-files.c:500
+#: builtin/ls-files.c:503
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 "giả định rằng các đường dẫn đã bị gỡ bỏ kể từ <tree-ish> nay vẫn hiện diện"
 
-#: builtin/ls-files.c:502
+#: builtin/ls-files.c:505
 msgid "show debugging data"
 msgstr "hiển thị dữ liệu gỡ lỗi"
 
@@ -6811,7 +6738,7 @@ msgstr "bỏ qua nếu fast-forward không thể được"
 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:738 builtin/revert.c:89
+#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
 msgid "strategy"
 msgstr "chiến lược"
 
@@ -6885,37 +6812,37 @@ msgstr "“%s” không chỉ đến một lần chuyển giao nào cả"
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Chuỗi branch.%s.mergeoptions sai: %s"
 
-#: builtin/merge.c:650
+#: builtin/merge.c:653
 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:678
+#: builtin/merge.c:681
 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:692
+#: builtin/merge.c:695
 #, 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:706
+#: builtin/merge.c:709
 #, c-format
 msgid "unable to write %s"
 msgstr "không thể ghi %s"
 
-#: builtin/merge.c:795
+#: builtin/merge.c:798
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "Không thể đọc từ “%s”"
 
-#: builtin/merge.c:804
+#: builtin/merge.c:807
 #, 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:810
+#: builtin/merge.c:813
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -6933,50 +6860,50 @@ msgstr ""
 "rỗng\n"
 "sẽ hủy bỏ lần chuyển giao.\n"
 
-#: builtin/merge.c:834
+#: builtin/merge.c:837
 msgid "Empty commit message."
 msgstr "Chú thích của lần commit (chuyển giao) bị trống rỗng."
 
-#: builtin/merge.c:846
+#: builtin/merge.c:849
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Thần kỳ.\n"
 
-#: builtin/merge.c:911
+#: builtin/merge.c:914
 #, 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:927
+#: builtin/merge.c:930
 #, 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:968
+#: builtin/merge.c:971
 msgid "No current branch."
 msgstr "không phải nhánh hiện hành"
 
-#: builtin/merge.c:970
+#: builtin/merge.c:973
 msgid "No remote for the current branch."
 msgstr "Không có máy chủ cho nhánh hiện hành."
 
-#: builtin/merge.c:972
+#: builtin/merge.c:975
 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:977
+#: builtin/merge.c:980
 #, 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:1133
+#: builtin/merge.c:1136
 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:1149 git-pull.sh:31
+#: builtin/merge.c:1152 git-pull.sh:31
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -6984,11 +6911,11 @@ 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."
 
-#: builtin/merge.c:1152 git-pull.sh:34
+#: builtin/merge.c:1155 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:1156
+#: builtin/merge.c:1159
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -6996,104 +6923,103 @@ 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:1159
+#: builtin/merge.c:1162
 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:1168
+#: builtin/merge.c:1171
 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:1177
+#: builtin/merge.c:1180
 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:1209
+#: builtin/merge.c:1212
 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:1212
+#: builtin/merge.c:1215
 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:1214
+#: builtin/merge.c:1217
 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:1219
+#: builtin/merge.c:1222
 #, 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:1270
+#: builtin/merge.c:1273
 #, 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:1273
+#: builtin/merge.c:1276
 #, 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."
 
-#. 'N'
-#: builtin/merge.c:1276
+#: builtin/merge.c:1279
 #, 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:1279
+#: builtin/merge.c:1282
 #, 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:1363
+#: builtin/merge.c:1366
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Đang cập nhật %s..%s\n"
 
-#: builtin/merge.c:1402
+#: builtin/merge.c:1405
 #, 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:1409
+#: builtin/merge.c:1412
 #, c-format
 msgid "Nope.\n"
 msgstr "Không.\n"
 
-#: builtin/merge.c:1441
+#: builtin/merge.c:1444
 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:1464 builtin/merge.c:1543
+#: builtin/merge.c:1467 builtin/merge.c:1546
 #, 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:1468
+#: builtin/merge.c:1471
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Đang thử chiến lược hòa trộn %s...\n"
 
-#: builtin/merge.c:1534
+#: builtin/merge.c:1537
 #, 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:1536
+#: builtin/merge.c:1539
 #, 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:1545
+#: builtin/merge.c:1548
 #, 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:1557
+#: builtin/merge.c:1560
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -7180,19 +7106,19 @@ msgstr "không cảnh báo về các xung đột xảy ra"
 msgid "set labels for file1/orig_file/file2"
 msgstr "đặt nhãn cho tập-tin-1/tập-tin-gốc/tập-tin-2"
 
-#: builtin/mktree.c:67
+#: builtin/mktree.c:64
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
 
-#: builtin/mktree.c:153
+#: builtin/mktree.c:150
 msgid "input is NUL terminated"
 msgstr "đầu vào được chấm dứt bởi NUL"
 
-#: builtin/mktree.c:154 builtin/write-tree.c:24
+#: builtin/mktree.c:151 builtin/write-tree.c:24
 msgid "allow missing objects"
 msgstr "cho phép thiếu đối tượng"
 
-#: builtin/mktree.c:155
+#: builtin/mktree.c:152
 msgid "allow creation of more than one tree"
 msgstr "cho phép tạo nhiều hơn một cây"
 
@@ -7241,46 +7167,46 @@ msgstr ""
 msgid "Huh? %.*s is in index?"
 msgstr "Hả? %.*s trong bảng mục lục à?"
 
-#: builtin/mv.c:168
+#: builtin/mv.c:169
 msgid "source directory is empty"
 msgstr "thư mục nguồn là trống rỗng"
 
-#: builtin/mv.c:200
+#: builtin/mv.c:205
 msgid "not under version control"
 msgstr "không nằm dưới sự quản lý mã nguồn"
 
-#: builtin/mv.c:202
+#: builtin/mv.c:207
 msgid "destination exists"
 msgstr "đích đã tồn tại sẵn rồi"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:215
 #, c-format
 msgid "overwriting '%s'"
 msgstr "đang ghi đè lên “%s”"
 
-#: builtin/mv.c:213
+#: builtin/mv.c:218
 msgid "Cannot overwrite"
 msgstr "Không thể ghi đè"
 
-#: builtin/mv.c:216
+#: builtin/mv.c:221
 msgid "multiple sources for the same target"
 msgstr "Nhiều nguồn cho cùng một đích"
 
-#: builtin/mv.c:218
+#: builtin/mv.c:223
 msgid "destination directory does not exist"
 msgstr "thư mục đích không tồn tại"
 
-#: builtin/mv.c:233
+#: builtin/mv.c:243
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, nguồn=%s, đích=%s"
 
-#: builtin/mv.c:243
+#: builtin/mv.c:253
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "Đổi tên %s thành %s\n"
 
-#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "gặp lỗi khi đổi tên “%s”"
@@ -7450,7 +7376,7 @@ msgstr "không thể đọc kết xuất “show”"
 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:341
+#: builtin/notes.c:167 builtin/tag.c:373
 #, c-format
 msgid "could not create file '%s'"
 msgstr "không thể tạo tập tin “%s”"
@@ -7460,7 +7386,7 @@ 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:844
+#: builtin/notes.c:207 builtin/notes.c:848
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Đang gỡ bỏ ghi chú (note) cho đối tượng %s\n"
@@ -7474,20 +7400,20 @@ msgstr "không thể ghi đối tượng ghi chú (note)"
 msgid "The note contents has been left in %s"
 msgstr "Nội dung ghi chú còn lại %s"
 
-#: builtin/notes.c:248 builtin/tag.c:537
+#: builtin/notes.c:248 builtin/tag.c:604
 #, c-format
 msgid "cannot read '%s'"
 msgstr "không thể đọc “%s”"
 
-#: builtin/notes.c:250 builtin/tag.c:540
+#: builtin/notes.c:250 builtin/tag.c:607
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "không thể mở hay đọc “%s”"
 
-#: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318
-#: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515
-#: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637
-#: builtin/notes.c:839 builtin/tag.c:553
+#: 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
 #, 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ệ."
@@ -7497,53 +7423,58 @@ msgstr "Gặp lỗi khi phân giải “%s” như là một tham chiếu (ref)
 msgid "Failed to read object '%s'."
 msgstr "Gặp lỗi khi đọc đối tượng “%s”."
 
-#: builtin/notes.c:312
+#: builtin/notes.c:276
+#, c-format
+msgid "Cannot read note data from non-blob object '%s'."
+msgstr "không thể đọc dữ liệu ghi chú từ đối tượng không-blob '%s'."
+
+#: builtin/notes.c:316
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "Dòng đầu vào dị hình: “%s”."
 
-#: builtin/notes.c:327
+#: builtin/notes.c:331
 #, 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:371 builtin/notes.c:425 builtin/notes.c:498
-#: builtin/notes.c:510 builtin/notes.c:583 builtin/notes.c:630
-#: builtin/notes.c:904
+#: 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 "quá nhiều đối số"
 
-#: builtin/notes.c:384 builtin/notes.c:643
+#: builtin/notes.c:388 builtin/notes.c:647
 #, 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:406 builtin/notes.c:563
+#: builtin/notes.c:410 builtin/notes.c:567
 msgid "note contents as a string"
 msgstr "nội dung ghi chú (note) nằm trong một chuỗi"
 
-#: builtin/notes.c:409 builtin/notes.c:566
+#: builtin/notes.c:413 builtin/notes.c:570
 msgid "note contents in a file"
 msgstr "nội dung ghi chú (note) nằm trong một tập tin"
 
-#: builtin/notes.c:411 builtin/notes.c:414 builtin/notes.c:568
-#: builtin/notes.c:571 builtin/tag.c:474
+#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
+#: builtin/notes.c:575 builtin/tag.c:539
 msgid "object"
 msgstr "đối tượng"
 
-#: builtin/notes.c:412 builtin/notes.c:569
+#: builtin/notes.c:416 builtin/notes.c:573
 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:415 builtin/notes.c:572
+#: builtin/notes.c:419 builtin/notes.c:576
 msgid "reuse specified note object"
 msgstr "dùng lại đối tượng ghi chú (note) đã chỉ ra"
 
-#: builtin/notes.c:417 builtin/notes.c:485
+#: builtin/notes.c:421 builtin/notes.c:489
 msgid "replace existing notes"
 msgstr "thay thế ghi chú trước"
 
-#: builtin/notes.c:451
+#: builtin/notes.c:455
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7552,24 +7483,24 @@ msgstr ""
 "Không thể thêm các ghi chú. Đã tìm thấy các ghi chú đã có sẵn cho đối tượng "
 "%s. Sử dụng tùy chọn “-f” để ghi đè lên các ghi chú cũ"
 
-#: builtin/notes.c:456 builtin/notes.c:533
+#: builtin/notes.c:460 builtin/notes.c:537
 #, 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:486
+#: builtin/notes.c:490
 msgid "read objects from stdin"
 msgstr "đọc các đối tượng từ đầu vào tiêu chuẩn"
 
-#: builtin/notes.c:488
+#: builtin/notes.c:492
 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:506
+#: builtin/notes.c:510
 msgid "too few parameters"
 msgstr "quá ít đối số"
 
-#: builtin/notes.c:527
+#: builtin/notes.c:531
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7578,12 +7509,12 @@ msgstr ""
 "Không thể sao chép các ghi chú. Đã tìm thấy các ghi chú đã có sẵn cho đối "
 "tượng %s. Sử dụng tùy chọn “-f” để ghi đè lên các ghi chú cũ"
 
-#: builtin/notes.c:539
+#: builtin/notes.c:543
 #, 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:588
+#: builtin/notes.c:592
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -7592,15 +7523,15 @@ msgstr ""
 "Các tùy chọn -m/-F/-c/-C đã cổ không còn dùng nữa cho lệnh con “edit”.\n"
 "Xin hãy sử dụng lệnh sau để thay thế: “git notes add -f -m/-F/-c/-C”.\n"
 
-#: builtin/notes.c:735
+#: builtin/notes.c:739
 msgid "General options"
 msgstr "Tùy chọn chung"
 
-#: builtin/notes.c:737
+#: builtin/notes.c:741
 msgid "Merge options"
 msgstr "Tùy chọn về hòa trộn"
 
-#: builtin/notes.c:739
+#: builtin/notes.c:743
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -7608,208 +7539,232 @@ msgstr ""
 "phân giải các xung đột “notes” sử dụng chiến lược đã đưa ra (manual/ours/"
 "theirs/union/cat_sort_uniq)"
 
-#: builtin/notes.c:741
+#: builtin/notes.c:745
 msgid "Committing unmerged notes"
 msgstr "Chuyển giao các note chưa được hòa trộn"
 
-#: builtin/notes.c:743
+#: builtin/notes.c:747
 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:745
+#: builtin/notes.c:749
 msgid "Aborting notes merge resolution"
 msgstr "Hủy bỏ phân giải ghi chú (note) hòa trộn"
 
-#: builtin/notes.c:747
+#: builtin/notes.c:751
 msgid "abort notes merge"
 msgstr "bỏ qua hòa trộn các ghi chú (note)"
 
-#: builtin/notes.c:842
+#: builtin/notes.c:846
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "Đối tượng %s không có ghi chú (note)\n"
 
-#: builtin/notes.c:854
+#: builtin/notes.c:858
 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:857
+#: builtin/notes.c:861
 msgid "read object names from the standard input"
 msgstr "đọc tên đối tượng từ thiết bị nhập chuẩn"
 
-#: builtin/notes.c:938
-msgid "notes_ref"
-msgstr "notes_ref"
+#: builtin/notes.c:942
+msgid "notes-ref"
+msgstr "notes-ref"
 
-#: builtin/notes.c:939
+#: builtin/notes.c:943
 msgid "use notes from <notes_ref>"
 msgstr "dùng “notes” từ <notes_ref>"
 
-#: builtin/notes.c:974 builtin/remote.c:1593
+#: builtin/notes.c:978 builtin/remote.c:1593
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Không hiểu câu lệnh con: %s"
 
-#: builtin/pack-objects.c:23
+#: builtin/pack-objects.c:25
 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:24
+#: builtin/pack-objects.c:26
 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:184 builtin/pack-objects.c:187
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
 #, c-format
 msgid "deflate error (%d)"
 msgstr "lỗi giải nén (%d)"
 
-#: builtin/pack-objects.c:2396
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr "Đang ghi lại các đối tượng"
+
+#: builtin/pack-objects.c:1012
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr "tắt ghi bitmap, như vậy một số đối tượng sẽ không được đóng gói"
+
+#: builtin/pack-objects.c:2174
+msgid "Compressing objects"
+msgstr "Đang nén các đối tượng"
+
+#: builtin/pack-objects.c:2530
 #, 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:2400
+#: builtin/pack-objects.c:2534
 #, c-format
 msgid "bad index version '%s'"
 msgstr "phiên bản mục lục sai “%s”"
 
-#: builtin/pack-objects.c:2423
+#: builtin/pack-objects.c:2557
 #, 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:2427
+#: builtin/pack-objects.c:2561
 #, 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:2446
+#: builtin/pack-objects.c:2580
 msgid "do not show progress meter"
 msgstr "không hiển thị bộ đo tiến trình"
 
-#: builtin/pack-objects.c:2448
+#: builtin/pack-objects.c:2582
 msgid "show progress meter"
 msgstr "hiển thị bộ đo tiến trình"
 
-#: builtin/pack-objects.c:2450
+#: builtin/pack-objects.c:2584
 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:2453
+#: builtin/pack-objects.c:2587
 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:2454
+#: builtin/pack-objects.c:2588
 msgid "version[,offset]"
 msgstr "phiên bản[,offset]"
 
-#: builtin/pack-objects.c:2455
+#: builtin/pack-objects.c:2589
 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:2458
+#: builtin/pack-objects.c:2592
 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:2460
+#: builtin/pack-objects.c:2594
 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:2462
+#: builtin/pack-objects.c:2596
 msgid "ignore packed objects"
 msgstr "bỏ qua các đối tượng đóng gói"
 
-#: builtin/pack-objects.c:2464
+#: builtin/pack-objects.c:2598
 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:2466
+#: builtin/pack-objects.c:2600
 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:2468
+#: builtin/pack-objects.c:2602
 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:2470
+#: builtin/pack-objects.c:2604
 msgid "reuse existing deltas"
 msgstr "dùng lại các delta sẵn có"
 
-#: builtin/pack-objects.c:2472
+#: builtin/pack-objects.c:2606
 msgid "reuse existing objects"
 msgstr "dùng lại các đối tượng sẵn có"
 
-#: builtin/pack-objects.c:2474
+#: builtin/pack-objects.c:2608
 msgid "use OFS_DELTA objects"
 msgstr "dùng các đối tượng OFS_DELTA"
 
-#: builtin/pack-objects.c:2476
+#: builtin/pack-objects.c:2610
 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:2478
+#: builtin/pack-objects.c:2612
 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"
 
-#: builtin/pack-objects.c:2480
+#: builtin/pack-objects.c:2614
 msgid "read revision arguments from standard input"
 msgstr " đọc tham số “revision” từ thiết bị nhập chuẩn"
 
-#: builtin/pack-objects.c:2482
+#: builtin/pack-objects.c:2616
 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:2485
+#: builtin/pack-objects.c:2619
 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:2488
+#: builtin/pack-objects.c:2622
 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:2491
+#: builtin/pack-objects.c:2625
 msgid "output pack to stdout"
 msgstr "xuất gói ra đầu ra tiêu chuẩn"
 
-#: builtin/pack-objects.c:2493
+#: builtin/pack-objects.c:2627
 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:2495
+#: builtin/pack-objects.c:2629
 msgid "keep unreachable objects"
 msgstr "giữ lại các đối tượng không thể đọc được"
 
-#: builtin/pack-objects.c:2496 parse-options.h:143
+#: builtin/pack-objects.c:2630 parse-options.h:140
 msgid "time"
 msgstr "thời-gian"
 
-#: builtin/pack-objects.c:2497
+#: builtin/pack-objects.c:2631
 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:2500
+#: builtin/pack-objects.c:2634
 msgid "create thin packs"
 msgstr "tạo gói nhẹ"
 
-#: builtin/pack-objects.c:2502
+#: builtin/pack-objects.c:2636
 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:2504
+#: builtin/pack-objects.c:2638
 msgid "pack compression level"
 msgstr "mức nén gói"
 
-#: builtin/pack-objects.c:2506
+#: builtin/pack-objects.c:2640
 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
+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
+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
+msgid "Counting objects"
+msgstr "Đang đếm các đối tượng"
+
 #: builtin/pack-refs.c:6
 msgid "git pack-refs [options]"
 msgstr "git pack-refs [các-tùy-chọn]"
@@ -7826,6 +7781,10 @@ msgstr "prune (cắt cụt) những tham chiếu (refs) bị mất (mặc địn
 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 "Đang gỡ các đối tượng trùng lặp"
+
 #: builtin/prune.c:12
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <thời-gian>] [--] [<head>...]"
@@ -7846,15 +7805,15 @@ msgstr "các đối tượng hết hạn cũ hơn khoảng <thời gian>"
 msgid "git push [<options>] [<repository> [<refspec>...]]"
 msgstr "git push [<các-tùy-chọn>] [<kho-chứa> [<refspec>...]]"
 
-#: builtin/push.c:86
+#: builtin/push.c:85
 msgid "tag shorthand without <tag>"
 msgstr "dùng tốc ký tag không có <thẻ>"
 
-#: builtin/push.c:96
+#: 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"
 
-#: builtin/push.c:141
+#: builtin/push.c:140
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -7863,7 +7822,7 @@ msgstr ""
 "Để chọn mỗi tùy chọn một cách cố định, xem push.default trong “git help "
 "config”."
 
-#: builtin/push.c:144
+#: builtin/push.c:143
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -7888,7 +7847,7 @@ msgstr ""
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:159
+#: builtin/push.c:158
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -7903,7 +7862,7 @@ msgstr ""
 "\n"
 "    git push %s HEAD:<tên-của-nhánh-máy-chủ>\n"
 
-#: builtin/push.c:173
+#: builtin/push.c:172
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -7917,12 +7876,12 @@ msgstr ""
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:181
+#: builtin/push.c:180
 #, 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:184
+#: builtin/push.c:183
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -7934,11 +7893,11 @@ msgstr ""
 "nhánh hiện tại “%s” của bạn, mà không báo cho tôi biết là cái gì được push\n"
 "để cập nhật nhánh máy chủ nào."
 
-#: builtin/push.c:207
+#: builtin/push.c:206
 msgid ""
-"push.default is unset; its implicit value is changing in\n"
+"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 current behavior after the default changes, use:\n"
+"and maintain the traditional behavior, use:\n"
 "\n"
 "  git config --global push.default matching\n"
 "\n"
@@ -7949,7 +7908,7 @@ msgid ""
 "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"
-"In Git 2.0, Git will default to the more conservative 'simple'\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"
@@ -7960,9 +7919,7 @@ msgid ""
 msgstr ""
 "biến push.default chưa được đặt; giá trị ngầm định của nó\n"
 "đã được thay đổi trong Git 2.0 từ “matching” thành “simple”.\n"
-"Để không hiển thị nhắc nhở này và duy trì cách xử lý hiện nay sau thay đổi "
-"mặc định,\n"
-"hãy chạy lệnh:\n"
+"Để không hiển thị nhắc nhở này và duy trì cách xử lý cũ, hãy chạy lệnh:\n"
 "\n"
 "  git config --global push.default matching\n"
 "\n"
@@ -7971,7 +7928,7 @@ msgstr ""
 "  git config --global push.default simple\n"
 "\n"
 "Khi push.default được đặt thành “matching”, git sẽ đẩy các nhánh nội bộ\n"
-"lên các nhánh trên máy chủ, cái mà  cùng tên.\n"
+"lên các nhánh trên máy chủ, cái mà đã sẵn có và cùng tên.\n"
 "\n"
 "Trong 2.0, Git sẽ mặc định duy trì các ứng xử “simple”,\n"
 "cái này chỉ đẩy những nhánh hiện hành lên các nhánh tương ứng\n"
@@ -7982,57 +7939,40 @@ msgstr ""
 "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:274
+#: builtin/push.c:273
 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:281
+#: builtin/push.c:280
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
 "'git pull ...') before pushing again.\n"
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
-"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh được push nằm đằng sau bộ\n"
-"phận tương ứng của máy chủ. Hòa trộn với các thay đổi từ máy chủ (v.d. “git "
-"pull...”)\n"
-"trước khi lại push lần nữa.\n"
-"Xem “Note about fast-forwards” từ lệnh “git push --help” để có thông tin chi "
+"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh hiện tại của bạn nằm đằng\n"
+"sau bộ phận tương ứng của máy chủ. Hòa trộn với các thay đổi từ máy chủ\n"
+"(v.d. \"git pull ...\") trước khi đẩy lên lần nữa.\n"
+"Xem “Note about fast-forwards” trong “git push --help” để có thông tin chi "
 "tiết."
 
-#: builtin/push.c:287
-msgid ""
-"Updates were rejected because a pushed branch tip is behind its remote\n"
-"counterpart. If you did not intend to push that branch, you may want to\n"
-"specify branches to push or set the 'push.default' configuration variable\n"
-"to 'simple', 'current' or 'upstream' to push only the current branch."
-msgstr ""
-"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh được push nằm đằng sau bộ\n"
-"phận tương ứng của máy chủ. Nếu bạn không có ý định push nhánh đó, bạn có lẽ "
-"muốn\n"
-"chỉ định các nhánh để push hoặt là đặt nội dung cho biến cấu hình “push."
-"default”\n"
-"thành “simple”, “current” hoặc “upstream” để chỉ push nhánh hiện hành mà "
-"thôi."
-
-#: builtin/push.c:293
+#: builtin/push.c:286
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. Check out this branch and integrate the remote changes\n"
 "(e.g. 'git pull ...') before pushing again.\n"
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
-"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh được push nằm đằng sau bộ\n"
-"phận tương ứng của máy chủ. Checkou nhánh này và hòa trộn với các thay đổi "
-"từ máy chủ\n"
-"(v.d. “git pull ...”) trước khi lại push lần nữa.\n"
-"Xem “Note about fast-forwards” từ lệnh “git push --help” để có thông tin chi "
+"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh đã push nằm đằng sau bộ\n"
+"phận tương ứng của máy chủ. Checkou nhánh này và hòa trộn với các thay đổi\n"
+"từ máy chủ (v.d. “git pull ...”) trước khi lại push lần nữa.\n"
+"Xem “Note about fast-forwards” trong “git push --help” để có thông tin chi "
 "tiết."
 
-#: builtin/push.c:299
+#: builtin/push.c:292
 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"
@@ -8043,15 +7983,15 @@ msgstr ""
 "Việc cập nhật bị từ chối bởi vì máy chủ có chứa công việc mà bạn không\n"
 "có ở máy nội bộ của mình. Lỗi này thường có nguyên nhân bởi kho khác đẩy\n"
 "dữ liệu lên cùng một tham chiếu. Bạn có lẽ muốn hòa trộn với các thay đổi\n"
-"từ máy chủ(v.d. “git pull...”) trước khi lại push lần nữa.\n"
-"Xem “Note about fast-forwards” từ lệnh “git push --help” để có thông tin chi "
+"từ máy chủ (v.d. “git pull...”) trước khi lại push lần nữa.\n"
+"Xem “Note about fast-forwards” trong “git push --help” để có thông tin chi "
 "tiết."
 
-#: builtin/push.c:306
+#: builtin/push.c:299
 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:309
+#: builtin/push.c:302
 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"
@@ -8059,26 +7999,26 @@ msgid ""
 msgstr ""
 "Không thể cập nhật một tham chiếu trên máy chủ mà nó chỉ đến đối tượng "
 "không\n"
-"phải chuyển giao, hoặc cập nhật một tham chiếu máy chủ để nó chỉ đến đối "
-"tượng\n"
+"phải là lần chuyển giao, hoặc cập nhật một tham chiếu máy chủ để nó chỉ đến "
+"đối tượng\n"
 "không phải chuyển giao, mà không sử dụng tùy chọn “--force”.\n"
 
-#: builtin/push.c:375
+#: builtin/push.c:361
 #, c-format
 msgid "Pushing to %s\n"
-msgstr "Đang push (đẩy) lên %s\n"
+msgstr "Đang đẩy lên %s\n"
 
-#: builtin/push.c:379
+#: builtin/push.c:365
 #, c-format
 msgid "failed to push some refs to '%s'"
-msgstr "gặp lỗi khi push (đẩy lên) một số tham chiếu (ref) đến “%s”"
+msgstr "gặp lỗi khi đẩy tới một số tham chiếu (ref) đến “%s”"
 
-#: builtin/push.c:412
+#: builtin/push.c:395
 #, c-format
 msgid "bad repository '%s'"
 msgstr "repository (kho) sai “%s”"
 
-#: builtin/push.c:413
+#: builtin/push.c:396
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -8090,7 +8030,7 @@ msgid ""
 "\n"
 "    git push <name>\n"
 msgstr ""
-"Chưa cấu hình đích để push (đẩy lên).\n"
+"Chưa cấu hình đích để đẩy lên.\n"
 "Hoặc là chỉ ra URL từ dòng lệnh hoặc là cấu hình một kho máy chủ sử dụng\n"
 "\n"
 "    git remote add <tên> <url>\n"
@@ -8099,95 +8039,95 @@ msgstr ""
 "\n"
 "    git push <tên>\n"
 
-#: builtin/push.c:428
+#: builtin/push.c:411
 msgid "--all and --tags are incompatible"
 msgstr "--all và --tags xung khắc nhau"
 
-#: builtin/push.c:429
+#: builtin/push.c:412
 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:434
+#: builtin/push.c:417
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror và --tags xung khắc nhau"
 
-#: builtin/push.c:435
+#: builtin/push.c:418
 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:440
+#: builtin/push.c:423
 msgid "--all and --mirror are incompatible"
 msgstr "--all và --mirror xung khắc nhau"
 
-#: builtin/push.c:500
+#: builtin/push.c:483
 msgid "repository"
 msgstr "kho"
 
-#: builtin/push.c:501
+#: builtin/push.c:484
 msgid "push all refs"
-msgstr "push tất cả các tham chiếu"
+msgstr "đẩy tất cả các tham chiếu"
 
-#: builtin/push.c:502
+#: builtin/push.c:485
 msgid "mirror all refs"
 msgstr "mirror tất cả các tham chiếu"
 
-#: builtin/push.c:504
+#: builtin/push.c:487
 msgid "delete refs"
 msgstr "xóa các tham chiếu"
 
-#: builtin/push.c:505
+#: builtin/push.c:488
 msgid "push tags (can't be used with --all or --mirror)"
-msgstr "push các thẻ (không dùng cùng với --all hay --mirror)"
+msgstr "đẩy các thẻ (không dùng cùng với --all hay --mirror)"
 
-#: builtin/push.c:508
+#: builtin/push.c:491
 msgid "force updates"
 msgstr "ép buộc cập nhật"
 
-#: builtin/push.c:510
+#: builtin/push.c:493
 msgid "refname>:<expect"
 msgstr "tên-tham-chiếu>:<cần"
 
-#: builtin/push.c:511
+#: builtin/push.c:494
 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:513
+#: builtin/push.c:496
 msgid "check"
 msgstr "kiểm tra"
 
-#: builtin/push.c:514
+#: builtin/push.c:497
 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:516
+#: builtin/push.c:499
 msgid "use thin pack"
 msgstr "tạo gói nhẹ"
 
-#: builtin/push.c:517 builtin/push.c:518
+#: builtin/push.c:500 builtin/push.c:501
 msgid "receive pack program"
 msgstr "chương trình nhận gói"
 
-#: builtin/push.c:519
+#: builtin/push.c:502
 msgid "set upstream for git pull/status"
 msgstr "đặt thượng nguồn cho git pull/status"
 
-#: builtin/push.c:522
+#: builtin/push.c:505
 msgid "prune locally removed refs"
 msgstr "xén tỉa những tham chiếu (refs) bị gỡ bỏ"
 
-#: builtin/push.c:524
+#: builtin/push.c:507
 msgid "bypass pre-push hook"
-msgstr "vòng qua móc tiền-đẩy “pre-push”"
+msgstr "vòng qua móc tiền-đẩy (pre-push)"
 
-#: builtin/push.c:525
+#: builtin/push.c:508
 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:535
+#: builtin/push.c:518
 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:537
+#: builtin/push.c:520
 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"
 
@@ -8537,7 +8477,7 @@ msgstr " ???"
 #: builtin/remote.c:986
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
-msgstr "branch.%s.merge không hợp lệ; không thể rebase về phía > 1 nhánh"
+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
 #, c-format
@@ -8623,7 +8563,7 @@ msgstr "(không có URL)"
 #: builtin/remote.c:1182 builtin/remote.c:1184
 #, c-format
 msgid "  Push  URL: %s"
-msgstr "  URL để đẩy lên (push): %s"
+msgstr "  URL để đẩy lên: %s"
 
 #: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190
 #, c-format
@@ -8776,67 +8716,75 @@ msgstr "Sẽ không xóa những địa chỉ URL không-push"
 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:15
+#: builtin/repack.c:16
 msgid "git repack [options]"
 msgstr "git repack [các-tùy-chọn]"
 
-#: builtin/repack.c:143
+#: builtin/repack.c:156
 msgid "pack everything in a single pack"
 msgstr "đóng gói mọi thứ trong một gói đơn"
 
-#: builtin/repack.c:145
+#: builtin/repack.c:158
 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:148
+#: builtin/repack.c:161
 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:150
+#: builtin/repack.c:163
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "chuyển --no-reuse-delta cho git-pack-objects"
 
-#: builtin/repack.c:152
+#: builtin/repack.c:165
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "chuyển --no-reuse-object cho git-pack-objects"
 
-#: builtin/repack.c:154
+#: builtin/repack.c:167
 msgid "do not run git-update-server-info"
 msgstr "không chạy git-update-server-info"
 
-#: builtin/repack.c:157
+#: builtin/repack.c:170
 msgid "pass --local to git-pack-objects"
 msgstr "chuyển --local cho git-pack-objects"
 
-#: builtin/repack.c:158
+#: builtin/repack.c:172
+msgid "write bitmap index"
+msgstr "ghi mục lục ánh xạ"
+
+#: builtin/repack.c:173
 msgid "approxidate"
 msgstr "ngày ước tính"
 
-#: builtin/repack.c:159
+#: builtin/repack.c:174
 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:161
+#: builtin/repack.c:176
 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:162 builtin/repack.c:166
+#: builtin/repack.c:177 builtin/repack.c:181
 msgid "bytes"
 msgstr "byte"
 
-#: builtin/repack.c:163
+#: builtin/repack.c:178
 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:165
+#: builtin/repack.c:180
 msgid "limits the maximum delta depth"
 msgstr "giới hạn độ sâu tối đa của “delta”"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:182
 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:343
+#: builtin/repack.c:184
+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
 #, c-format
 msgid "removing '%s' failed"
 msgstr "gặp lỗi khi xóa bỏ “%s”"
@@ -8929,76 +8877,84 @@ msgstr "Gặp lỗi khi tìm cây của %s."
 msgid "HEAD is now at %s"
 msgstr "HEAD hiện giờ tại %s"
 
-#: builtin/reset.c:172
+#: builtin/reset.c:182
 #, 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:262
+#: builtin/reset.c:273
 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:264
+#: builtin/reset.c:275
 msgid "reset HEAD and index"
 msgstr "đặt lại (reset) HEAD và bảng mục lục"
 
-#: builtin/reset.c:265
+#: builtin/reset.c:276
 msgid "reset only HEAD"
 msgstr "chỉ đặt lại (reset) HEAD"
 
-#: builtin/reset.c:267 builtin/reset.c:269
+#: builtin/reset.c:278 builtin/reset.c:280
 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:271
+#: builtin/reset.c:282
 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:289
+#: builtin/reset.c:285
+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
 #, 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:292 builtin/reset.c:300
+#: builtin/reset.c:305 builtin/reset.c:313
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "không thể phân tích đối tượng “%s”."
 
-#: builtin/reset.c:297
+#: builtin/reset.c:310
 #, 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:306
+#: builtin/reset.c:319
 msgid "--patch is incompatible with --{hard,mixed,soft}"
 msgstr "--patch xung khắc với --{hard,mixed,soft}"
 
-#: builtin/reset.c:315
+#: builtin/reset.c:328
 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:317
+#: builtin/reset.c:330
 #, 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:327
+#: builtin/reset.c:340
 #, 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
+msgid "-N can only be used with --mixed"
+msgstr "-N chỉ được dùng khi có --mixed"
+
+#: builtin/reset.c:361
 msgid "Unstaged changes after reset:"
 msgstr "Những thay đổi được đưa ra khỏi bệ phóng sau khi reset:"
 
-#: builtin/reset.c:350
+#: builtin/reset.c:367
 #, 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:355
+#: builtin/reset.c:372
 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."
 
@@ -9018,7 +8974,7 @@ msgstr "dừng phân tích sau đối số đầu tiên không có tùy chọn"
 msgid "output in stuck long form"
 msgstr "kết xuất trong định dạng gậy dài"
 
-#: builtin/rev-parse.c:486
+#: builtin/rev-parse.c:497
 msgid ""
 "git rev-parse --parseopt [options] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -9089,35 +9045,35 @@ msgstr "tùy chọn"
 msgid "option for merge strategy"
 msgstr "tùy chọn cho chiến lược hòa trộn"
 
-#: builtin/revert.c:102
+#: builtin/revert.c:104
 msgid "append commit name"
 msgstr "nối thêm tên lần chuyển giao"
 
-#: builtin/revert.c:103
+#: builtin/revert.c:105
 msgid "allow fast-forward"
 msgstr "cho phép fast-forward"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:106
 msgid "preserve initially empty commits"
 msgstr "cấm khởi tạo lần chuyển giao trống rỗng"
 
-#: builtin/revert.c:105
+#: builtin/revert.c:107
 msgid "allow commits with empty messages"
 msgstr "chấp nhận chuyển giao mà không ghi chú gì"
 
-#: builtin/revert.c:106
+#: builtin/revert.c:108
 msgid "keep redundant, empty commits"
 msgstr "giữ lại các lần chuyển giao dư thừa, rỗng"
 
-#: builtin/revert.c:110
+#: builtin/revert.c:112
 msgid "program error"
 msgstr "lỗi chương trình"
 
-#: builtin/revert.c:195
+#: builtin/revert.c:197
 msgid "revert failed"
 msgstr "revert gặp lỗi"
 
-#: builtin/revert.c:210
+#: builtin/revert.c:212
 msgid "cherry-pick failed"
 msgstr "cherry-pick gặp lỗi"
 
@@ -9331,11 +9287,11 @@ msgstr "hiển thị <n> các mục “ref-log” gần nhất kể từ nền (
 
 #: 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"
@@ -9399,11 +9355,11 @@ msgstr "xóa tham chiếu (ref) tượng trưng"
 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:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
 msgid "reason"
 msgstr "lý do"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
 msgid "reason of the update"
 msgstr "lý do cập nhật"
 
@@ -9429,32 +9385,32 @@ msgstr ""
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <tên-thẻ>..."
 
-#: builtin/tag.c:60
+#: builtin/tag.c:67
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "đối tượng dị hình tại “%s”"
 
-#: builtin/tag.c:207
+#: builtin/tag.c:239
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "tên thẻ quá dài: %.*s..."
 
-#: builtin/tag.c:212
+#: builtin/tag.c:244
 #, c-format
 msgid "tag '%s' not found."
 msgstr "không tìm thấy tìm thấy thẻ “%s”."
 
-#: builtin/tag.c:227
+#: builtin/tag.c:259
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Thẻ đã bị xóa “%s” (trước là %s)\n"
 
-#: builtin/tag.c:239
+#: builtin/tag.c:271
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "không thể thẩm tra thẻ “%s”"
 
-#: builtin/tag.c:249
+#: builtin/tag.c:281
 #, c-format
 msgid ""
 "\n"
@@ -9465,7 +9421,7 @@ msgstr ""
 "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.\n"
 
-#: builtin/tag.c:253
+#: builtin/tag.c:285
 #, c-format
 msgid ""
 "\n"
@@ -9478,258 +9434,275 @@ msgstr ""
 "Những dòng được bắt đầu bằng “%c” sẽ được bỏ qua; bạn có thể xóa chúng đi "
 "nếu muốn.\n"
 
-#: builtin/tag.c:292
+#: builtin/tag.c:324
 msgid "unable to sign the tag"
 msgstr "không thể ký thẻ"
 
-#: builtin/tag.c:294
+#: builtin/tag.c:326
 msgid "unable to write tag file"
 msgstr "không thể ghi vào tập tin lưu thẻ"
 
-#: builtin/tag.c:319
+#: builtin/tag.c:351
 msgid "bad object type."
 msgstr "kiểu đối tượng sai."
 
-#: builtin/tag.c:332
+#: builtin/tag.c:364
 msgid "tag header too big."
 msgstr "đầu thẻ (tag) quá lớn."
 
-#: builtin/tag.c:368
+#: builtin/tag.c:400
 msgid "no tag message?"
 msgstr "không có chú thích gì cho cho thẻ à?"
 
-#: builtin/tag.c:374
+#: builtin/tag.c:406
 #, 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:423
+#: builtin/tag.c:455
 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:425
+#: builtin/tag.c:457
 #, c-format
 msgid "malformed object name '%s'"
 msgstr "tên đối tượng dị hình “%s”"
 
-#: builtin/tag.c:445
+#: 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
 msgid "list tag names"
 msgstr "chỉ liệt kê tên các thẻ"
 
-#: builtin/tag.c:447
+#: builtin/tag.c:502
 msgid "print <n> lines of each tag message"
 msgstr "hiển thị <n> dòng cho mỗi ghi chú"
 
-#: builtin/tag.c:449
+#: builtin/tag.c:504
 msgid "delete tags"
 msgstr "xóa thẻ"
 
-#: builtin/tag.c:450
+#: builtin/tag.c:505
 msgid "verify tags"
 msgstr "thẩm tra thẻ"
 
-#: builtin/tag.c:452
+#: builtin/tag.c:507
 msgid "Tag creation options"
 msgstr "Tùy chọn tạo tag"
 
-#: builtin/tag.c:454
+#: builtin/tag.c:509
 msgid "annotated tag, needs a message"
 msgstr "để chú giải cho thẻ, cần một lời ghi chú"
 
-#: builtin/tag.c:456
+#: builtin/tag.c:511
 msgid "tag message"
 msgstr "tin nhắn cho thẻ (tag)"
 
-#: builtin/tag.c:458
+#: builtin/tag.c:513
 msgid "annotated and GPG-signed tag"
 msgstr "thẻ chú giải và ký kiểu GPG"
 
-#: builtin/tag.c:462
+#: builtin/tag.c:517
 msgid "use another key to sign the tag"
 msgstr "dùng kháo khác để ký thẻ"
 
-#: builtin/tag.c:463
+#: builtin/tag.c:518
 msgid "replace the tag if exists"
 msgstr "thay thế nếu tag đó đã có trước"
 
-#: builtin/tag.c:464
+#: builtin/tag.c:519
 msgid "show tag list in columns"
 msgstr "hiển thị danh sách thẻ trong các cột"
 
-#: builtin/tag.c:466
+#: builtin/tag.c:521
+msgid "sort tags"
+msgstr "sắp xếp các thẻ"
+
+#: builtin/tag.c:525
 msgid "Tag listing options"
 msgstr "Các tùy chọn liệt kê thẻ"
 
-#: builtin/tag.c:469
+#: builtin/tag.c:528 builtin/tag.c:534
 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:475
+#: builtin/tag.c:540
 msgid "print only tags of the object"
 msgstr "chỉ hiển thị các thẻ của đối tượng"
 
-#: builtin/tag.c:501
+#: builtin/tag.c:566
 msgid "--column and -n are incompatible"
 msgstr "--column và -n xung khắc nhau"
 
-#: builtin/tag.c:518
+#: builtin/tag.c:578
+msgid "--sort and -n are incompatible"
+msgstr "--sort và -n xung khắc nhau"
+
+#: builtin/tag.c:585
 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:520
+#: builtin/tag.c:587
 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:522
+#: builtin/tag.c:589
 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:530
+#: builtin/tag.c:597
 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:550
+#: builtin/tag.c:617
 msgid "too many params"
 msgstr "quá nhiều đối số"
 
-#: builtin/tag.c:556
+#: builtin/tag.c:623
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "“%s” không phải thẻ hợp lệ."
 
-#: builtin/tag.c:561
+#: builtin/tag.c:628
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "Thẻ “%s” đã tồn tại rồi"
 
-#: builtin/tag.c:579
+#: 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:581
+#: 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:583
+#: builtin/tag.c:650
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Đã cập nhật thẻ “%s” (trước là %s)\n"
 
-#: builtin/update-index.c:402
+#: builtin/unpack-objects.c:483
+msgid "Unpacking objects"
+msgstr "Đang giải nén các đối tượng"
+
+#: builtin/update-index.c:399
 msgid "git update-index [options] [--] [<file>...]"
 msgstr "git update-index [các-tùy-chọn] [<tập-tin>...]"
 
-#: builtin/update-index.c:720
+#: builtin/update-index.c:748
 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:723
+#: builtin/update-index.c:751
 msgid "refresh: ignore submodules"
 msgstr "refresh: lờ đi mô-đun-con"
 
-#: builtin/update-index.c:726
+#: builtin/update-index.c:754
 msgid "do not ignore new files"
 msgstr "không bỏ qua các tập tin mới tạo"
 
-#: builtin/update-index.c:728
+#: builtin/update-index.c:756
 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:730
+#: builtin/update-index.c:758
 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:732
+#: builtin/update-index.c:760
 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:735
+#: builtin/update-index.c:763
 msgid "refresh stat information"
 msgstr "lấy lại thông tin thống kê"
 
-#: builtin/update-index.c:739
+#: builtin/update-index.c:767
 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:743
-msgid "<mode> <object> <path>"
-msgstr "<mode> <đối tượng> <đường dẫn>"
+#: builtin/update-index.c:771
+msgid "<mode>,<object>,<path>"
+msgstr "<chế_độ>,<đối_tượng>,<đường_dẫn>"
 
-#: builtin/update-index.c:744
+#: builtin/update-index.c:772
 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:748
+#: builtin/update-index.c:776
 msgid "(+/-)x"
 msgstr "(+/-)x"
 
-#: builtin/update-index.c:749
+#: builtin/update-index.c:777
 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:753
+#: builtin/update-index.c:781
 msgid "mark files as \"not changing\""
 msgstr "Đánh dấu các tập tin là \"không thay đổi\""
 
-#: builtin/update-index.c:756
+#: builtin/update-index.c:784
 msgid "clear assumed-unchanged bit"
 msgstr "xóa bít  assumed-unchanged"
 
-#: builtin/update-index.c:759
+#: builtin/update-index.c:787
 msgid "mark files as \"index-only\""
 msgstr "đánh dấu các tập tin là “chỉ-đọc”"
 
-#: builtin/update-index.c:762
+#: builtin/update-index.c:790
 msgid "clear skip-worktree bit"
 msgstr "xóa bít skip-worktree"
 
-#: builtin/update-index.c:765
+#: builtin/update-index.c:793
 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:767
+#: builtin/update-index.c:795
 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:769
+#: builtin/update-index.c:797
 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:771
+#: builtin/update-index.c:799
 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:775
+#: builtin/update-index.c:803
 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:779
+#: builtin/update-index.c:807
 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:783
+#: builtin/update-index.c:811
 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:787
+#: builtin/update-index.c:815
 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:790
+#: builtin/update-index.c:818
 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:792
+#: builtin/update-index.c:820
 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:796
+#: builtin/update-index.c:824
 msgid "write index in this format"
 msgstr "ghi mục lục ở định dạng này"
 
@@ -9745,19 +9718,19 @@ msgstr "git update-ref [các-tùy-chọn]    <refname> <biến-mới> [<biến-c
 msgid "git update-ref [options] --stdin [-z]"
 msgstr "git update-ref [các-tùy-chọn] --stdin [-z]"
 
-#: builtin/update-ref.c:255
+#: builtin/update-ref.c:256
 msgid "delete the reference"
 msgstr "xóa tham chiếu"
 
-#: builtin/update-ref.c:257
+#: builtin/update-ref.c:258
 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:258
+#: builtin/update-ref.c:259
 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:259
+#: builtin/update-ref.c:260
 msgid "read updates from stdin"
 msgstr "đọc cập nhật từ đầu vào tiêu chuẩn"
 
@@ -9815,23 +9788,23 @@ msgstr ""
 "hướng dẫn về khái niệm. Xem “git help <lệnh>” hay “git help <khái-niệm>”\n"
 "để xem các đặc tả cho lệnh hay khái niệm cụ thể."
 
-#: parse-options.h:146
-msgid "expiry date"
+#: parse-options.h:143
+msgid "expiry-date"
 msgstr "ngày hết hạn"
 
-#: parse-options.h:161
+#: parse-options.h:158
 msgid "no-op (backward compatibility)"
 msgstr "no-op (tương thích ngược)"
 
-#: parse-options.h:235
+#: parse-options.h:232
 msgid "be more verbose"
 msgstr "chi tiết hơn nữa"
 
-#: parse-options.h:237
+#: parse-options.h:234
 msgid "be more quiet"
 msgstr "im lặng hơn nữa"
 
-#: parse-options.h:243
+#: parse-options.h:240
 msgid "use <n> digits to display SHA-1s"
 msgstr "sử dụng <n> chữ số để hiển thị SHA-1s"
 
@@ -9923,11 +9896,11 @@ msgstr "Hiển thị trạng thái cây làm việc"
 msgid "Create, list, delete or verify a tag object signed with GPG"
 msgstr "Tạo, liệt kê, xóa hay xác thực một đối tượng thẻ được ký bằng GPG"
 
-#: git-am.sh:50
+#: 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 đã"
 
-#: git-am.sh:95
+#: git-am.sh:97
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
@@ -9935,7 +9908,7 @@ msgstr ""
 "Bạn có lẽ đã có HEAD đã bị di chuyển đi kể từ lần “am” thất bại cuối cùng.\n"
 "Không thể chuyển tới ORIG_HEAD"
 
-#: git-am.sh:105
+#: git-am.sh:107
 #, sh-format
 msgid ""
 "When you have resolved this problem, run \"$cmdline --continue\".\n"
@@ -9948,20 +9921,20 @@ msgstr ""
 "Để phục hồi lại thành nhánh nguyên thủy và dừng việc vá lại thì chạy "
 "\"$cmdline --abort\"."
 
-#: git-am.sh:121
+#: git-am.sh:123
 msgid "Cannot fall back to three-way merge."
 msgstr "Đang trở lại để hòa trộn kiểu “three-way”."
 
-#: git-am.sh:137
+#: git-am.sh:139
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr "Kho thiếu đối tượng blob cần thiết để trở về trên “3-way merge”."
 
-#: git-am.sh:139
+#: git-am.sh:141
 msgid "Using index info to reconstruct a base tree..."
 msgstr ""
 "Sử dụng thông tin trong bảng mục lục để cấu trúc lại một cây (tree) cơ sở..."
 
-#: git-am.sh:154
+#: git-am.sh:156
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
@@ -9969,28 +9942,28 @@ msgstr ""
 "Bạn đã sửa miếng vá của mình bằng cách thủ công à?\n"
 "Nó không thể áp dụng các blob đã được ghi lại trong bảng mục lục của nó."
 
-#: git-am.sh:163
+#: git-am.sh:165
 msgid "Falling back to patching base and 3-way merge..."
 msgstr "Đang trở lại để vá cơ sở và “3-way merge”..."
 
-#: git-am.sh:179
+#: git-am.sh:181
 msgid "Failed to merge in the changes."
 msgstr "Gặp lỗi khi trộn vào các thay đổi."
 
-#: git-am.sh:274
+#: git-am.sh:276
 msgid "Only one StGIT patch series can be applied at once"
 msgstr "Chỉ có một sê-ri miếng vá StGIT được áp dụng một lúc"
 
-#: git-am.sh:361
+#: git-am.sh:363
 #, sh-format
 msgid "Patch format $patch_format is not supported."
 msgstr "Định dạng miếng vá $patch_format không được hỗ trợ."
 
-#: git-am.sh:363
+#: git-am.sh:365
 msgid "Patch format detection failed."
 msgstr "Dò tìm định dạng miếng vá gặp lỗi."
 
-#: git-am.sh:389
+#: 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."
@@ -9998,16 +9971,16 @@ msgstr ""
 "Tùy chọn -b/--binary đã không dùng từ lâu rồi, và\n"
 "nó sẽ được bỏ đi. Xin đừng sử dụng nó thêm nữa."
 
-#: git-am.sh:479
+#: git-am.sh:486
 #, sh-format
 msgid "previous rebase directory $dotest still exists but mbox given."
 msgstr "thư mục rebase trước $dotest vẫn chưa sẵn sàng nhưng mbox được đưa ra."
 
-#: git-am.sh:484
+#: git-am.sh:491
 msgid "Please make up your mind. --skip or --abort?"
 msgstr "Xin hãy rõ ràng. --skip hay --abort?"
 
-#: git-am.sh:520
+#: git-am.sh:527
 #, sh-format
 msgid ""
 "Stray $dotest directory found.\n"
@@ -10016,16 +9989,16 @@ msgstr ""
 "Tìm thấy thư mục lạc $dotest.\n"
 "Dùng \"git am --abort\" để loại bỏ nó đi."
 
-#: git-am.sh:528
+#: git-am.sh:535
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr "Thao tác phân giải không được tiến hành, chúng ta không phục hồi lại."
 
-#: git-am.sh:594
+#: git-am.sh:601
 #, sh-format
 msgid "Dirty index: cannot apply patches (dirty: $files)"
 msgstr "Bảng mục lục sai: không thể áp dụng các miếng vá (sai: $files)"
 
-#: git-am.sh:698
+#: git-am.sh:705
 #, sh-format
 msgid ""
 "Patch is empty.  Was it split wrong?\n"
@@ -10038,34 +10011,34 @@ msgstr ""
 "Để phục hồi lại nhánh nguyên thủy và dừng vá lại hãy chạy lệnh \"$cmdline --"
 "abort\"."
 
-#: git-am.sh:725
+#: git-am.sh:732
 msgid "Patch does not have a valid e-mail address."
 msgstr "Miếng vá không có địa chỉ thư điện tử hợp lệ."
 
-#: git-am.sh:772
+#: git-am.sh:779
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
 "không thể được tương tác mà không có stdin kết nối với một thiết bị cuối"
 
-#: git-am.sh:776
+#: git-am.sh:783
 msgid "Commit Body is:"
 msgstr "Thân của lần chuyển giao là:"
 
 #. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
 #. in your translation. The program will only accept English
 #. input at this point.
-#: git-am.sh:783
+#: git-am.sh:790
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
 msgstr ""
 "Áp dụng? đồng ý [y]/khô[n]g/chỉnh sửa [e]/hiển thị miếng [v]á/đồng ý tất cả "
 "[a] "
 
-#: git-am.sh:819
+#: git-am.sh:826
 #, sh-format
 msgid "Applying: $FIRSTLINE"
 msgstr "Đang áp dụng (miếng vá): $FIRSTLINE"
 
-#: git-am.sh:840
+#: 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"
@@ -10076,7 +10049,7 @@ msgstr ""
 "đã sẵn được đưa vào với cùng nội dung thay đổi; bạn có lẽ muốn bỏ qua miếng "
 "vá này."
 
-#: git-am.sh:848
+#: git-am.sh:855
 msgid ""
 "You still have unmerged paths in your index\n"
 "did you forget to use 'git add'?"
@@ -10084,16 +10057,16 @@ msgstr ""
 "Bạn vẫn có những đường dẫn chưa được hòa trộn trong bảng mục lục của mình\n"
 "bạn đã quên sử dụng lệnh “git add” à?"
 
-#: git-am.sh:864
+#: git-am.sh:871
 msgid "No changes -- Patch already applied."
 msgstr "Không thay đổi gì cả -- Miếng vá đã được áp dụng rồi."
 
-#: git-am.sh:874
+#: git-am.sh:881
 #, sh-format
 msgid "Patch failed at $msgnum $FIRSTLINE"
 msgstr "Gặp lỗi khi vá tại $msgnum $FIRSTLINE"
 
-#: git-am.sh:877
+#: git-am.sh:884
 #, sh-format
 msgid ""
 "The copy of the patch that failed is found in:\n"
@@ -10102,7 +10075,7 @@ msgstr ""
 "Bản sao chép của miếng vá mà nó gặp lỗi thì được tìm thấy trong:\n"
 "   $dotest/patch"
 
-#: git-am.sh:895
+#: git-am.sh:902
 msgid "applying to an empty history"
 msgstr "áp dụng vào một lịch sử trống rỗng"
 
@@ -10170,8 +10143,6 @@ msgstr "Đầu vào rev sai: $rev"
 msgid "'git bisect bad' can take only one argument."
 msgstr "“git bisect bad” có thể lấy chỉ một đối số."
 
-#. have bad but not good.  we could bisect although
-#. this is less optimum.
 #: git-bisect.sh:273
 msgid "Warning: bisecting only with a bad commit."
 msgstr "Cảnh báo: chỉ thực hiện việc bisect với một lần chuyển giao sai."
@@ -10280,17 +10251,13 @@ 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:223
+#: git-pull.sh:247
 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"
 
-#. The fetch involved updating the current branch.
-#. The working tree and the index file is still based on the
-#. $orig_head commit, but we are merging into $curr_head.
-#. First update the working tree to match $curr_head.
-#: git-pull.sh:247
+#: git-pull.sh:271
 #, sh-format
 msgid ""
 "Warning: fetch updated the current branch head.\n"
@@ -10301,15 +10268,15 @@ msgstr ""
 "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:272
+#: git-pull.sh:296
 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:276
+#: git-pull.sh:300
 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"
 
-#: git-rebase.sh:55
+#: 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"
@@ -10322,16 +10289,16 @@ msgstr ""
 "Để phục hồi lại thành nhánh nguyên thủy và dừng việc vá lại thì chạy \"git "
 "rebase --abort\"."
 
-#: git-rebase.sh:158
+#: git-rebase.sh:164
 msgid "Applied autostash."
 msgstr "Đã áp dụng autostash."
 
-#: git-rebase.sh:161
+#: git-rebase.sh:167
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Không thể lưu $stash_sha1"
 
-#: git-rebase.sh:162
+#: git-rebase.sh:168
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
@@ -10342,35 +10309,35 @@ msgstr ""
 "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:201
+#: git-rebase.sh:207
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Móc (hook) pre-rebase từ chối rebase."
 
-#: git-rebase.sh:206
+#: git-rebase.sh:212
 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:346
+#: git-rebase.sh:350
 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:351
+#: git-rebase.sh:355
 msgid "No rebase in progress?"
 msgstr "Không có tiến trình rebase nào phải không?"
 
-#: git-rebase.sh:362
+#: git-rebase.sh:366
 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:369
+#: git-rebase.sh:373
 msgid "Cannot read HEAD"
 msgstr "Không thể đọc HEAD"
 
-#: git-rebase.sh:372
+#: git-rebase.sh:376
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -10378,12 +10345,12 @@ msgstr ""
 "Bạn phải sửa tất cả các lần hòa trộn xung đột và sau\n"
 "đó đánh dấu chúng là cần xử lý sử dụng lệnh git add"
 
-#: git-rebase.sh:390
+#: git-rebase.sh:394
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Không thể quay trở lại $head_name"
 
-#: git-rebase.sh:409
+#: git-rebase.sh:413
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -10406,66 +10373,65 @@ msgstr ""
 "\n"
 "TÔI: là lệnh bạn vừa gọi!"
 
-#: git-rebase.sh:456
+#: git-rebase.sh:464
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "thượng nguồn không hợp lệ $upstream_name"
 
-#: git-rebase.sh:480
+#: git-rebase.sh:488
 #, 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:483 git-rebase.sh:487
+#: git-rebase.sh:491 git-rebase.sh:495
 #, 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:492
+#: git-rebase.sh:500
 #, 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:515
+#: git-rebase.sh:523
 #, 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:548
+#: git-rebase.sh:556
 msgid "Cannot autostash"
 msgstr "Không thể autostash"
 
-#: git-rebase.sh:553
+#: git-rebase.sh:561
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Đã tạo autostash: $stash_abbrev"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:565
 msgid "Please commit or stash them."
 msgstr "Xin hãy commit hoặc tạm cất (stash) chúng."
 
-#: git-rebase.sh:577
+#: git-rebase.sh:585
 #, 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:581
+#: git-rebase.sh:589
 #, 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:592
+#: git-rebase.sh:600
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Thay đổi từ $mb thành $onto:"
 
-#. Detach HEAD and reset the tree
-#: git-rebase.sh:601
+#: git-rebase.sh:609
 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:611
+#: git-rebase.sh:619
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "Fast-forward $branch_name thành $onto_name."
@@ -10588,21 +10554,21 @@ msgstr "Không thể bỏ ra khỏi bệ phóng các tập tin đã được s
 msgid "Index was not unstashed."
 msgstr "Bảng mục lục đã không được bỏ stash."
 
-#: git-stash.sh:523
+#: git-stash.sh:529
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Đã xóa ${REV} ($s)"
 
-#: git-stash.sh:524
+#: git-stash.sh:530
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Không thể xóa bỏ mục stash"
 
-#: git-stash.sh:531
+#: git-stash.sh:537
 msgid "No branch name specified"
 msgstr "Chưa chỉ ra tên của nhánh"
 
-#: git-stash.sh:603
+#: git-stash.sh:609
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Để phục hồi lại chúng hãy gõ \"git stash apply\")"
 
@@ -10618,35 +10584,35 @@ msgstr ""
 "Không tìm thấy ánh xạ (mapping) mô-đun-con trong .gitmodules cho đường dẫn "
 "“$sm_path”"
 
-#: git-submodule.sh:281
+#: git-submodule.sh:287
 #, sh-format
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
 msgstr "Nhân bản “$url” vào đường dẫn mô-đun-con “$sm_path” gặp lỗi"
 
-#: git-submodule.sh:293
+#: git-submodule.sh:299
 #, 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:403
+#: git-submodule.sh:409
 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:413
+#: git-submodule.sh:419
 #, 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:430
+#: git-submodule.sh:436
 #, 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:434
+#: git-submodule.sh:440
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -10658,36 +10624,36 @@ msgstr ""
 "$sm_path\n"
 "Sử dụng -f nếu bạn thực sự muốn thêm nó vào."
 
-#: git-submodule.sh:452
+#: git-submodule.sh:458
 #, 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:454
+#: git-submodule.sh:460
 #, 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:462
+#: git-submodule.sh:468
 #, 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:464
+#: git-submodule.sh:470
 #, 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:466
+#: git-submodule.sh:472
 #, 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:467
+#: git-submodule.sh:473
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
@@ -10696,71 +10662,71 @@ msgstr ""
 "hay bạn không chắc chắn điều đó có nghĩa gì chọn tên khác với tùy chọn “--"
 "name”."
 
-#: git-submodule.sh:469
+#: git-submodule.sh:475
 #, 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:481
+#: git-submodule.sh:487
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
-msgstr "Không thể checkout mô-đun-con “$sm_path”"
+msgstr "Không thể lấy ra mô-đun-con “$sm_path”"
 
-#: git-submodule.sh:486
+#: git-submodule.sh:492
 #, 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:495
+#: git-submodule.sh:501
 #, 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:539
+#: git-submodule.sh:545
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "Đang vào “$prefix$displaypath”"
 
-#: git-submodule.sh:559
+#: git-submodule.sh:565
 #, 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:605
+#: git-submodule.sh:611
 #, 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:614
+#: git-submodule.sh:620
 #, 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:616
+#: git-submodule.sh:622
 #, 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:633
+#: git-submodule.sh:639
 #, 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:671
+#: git-submodule.sh:677
 #, 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:688
+#: git-submodule.sh:694
 #, 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:689
+#: git-submodule.sh:695
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
@@ -10768,7 +10734,7 @@ msgstr ""
 "(dùng “rm -rf” nếu bạn thực sự muốn gỡ bỏ nó cùng với tất cả lịch sử của "
 "chúng)"
 
-#: git-submodule.sh:695
+#: git-submodule.sh:701
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -10777,27 +10743,27 @@ msgstr ""
 "Cây làm việc mô-đun-con “$displaypath” chứa các thay đổi nội bộ; hãy dùng “-"
 "f” để loại bỏ chúng đi"
 
-#: git-submodule.sh:698
+#: git-submodule.sh:704
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Đã tạo thư mục “$displaypath”"
 
-#: git-submodule.sh:699
+#: git-submodule.sh:705
 #, 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:702
+#: git-submodule.sh:708
 #, 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:711
+#: git-submodule.sh:717
 #, 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:834
+#: git-submodule.sh:833
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
@@ -10806,45 +10772,55 @@ msgstr ""
 "Đường dẫn mô-đun-con “$displaypath” chưa được khởi tạo.\n"
 "Có lẽ bạn muốn sử dụng lệnh “update --init”?"
 
-#: git-submodule.sh:847
+#: git-submodule.sh:846
 #, 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:856
+#: git-submodule.sh:855
 #, 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:880
+#: git-submodule.sh:879
 #, 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
+#, 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
 #, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "Đường dẫn mô-đun-con “$displaypath”: đã checkout “$sha1”"
+
+#: git-submodule.sh:898
+#, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
-msgstr "Không thể rebase “$sha1” trong đường dẫn mô-đun-con “$displaypath”"
+msgstr "Không thể cải tổ “$sha1” trong đường dẫn mô-đun-con “$displaypath”"
 
-#: git-submodule.sh:895
+#: git-submodule.sh:899
 #, 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:900
+#: git-submodule.sh:904
 #, 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:901
+#: git-submodule.sh:905
 #, 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:906
+#: git-submodule.sh:910
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule  path '$prefix$sm_path'"
@@ -10852,67 +10828,173 @@ msgstr ""
 "Thực hiện không thành công lệnh “$command $sha1” trong đường dẫn mô-đun-con "
 "“$prefix$sm_path”"
 
-#: git-submodule.sh:907
+#: git-submodule.sh:911
 #, 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:912
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
-msgstr "Không thể checkout “$sha1” trong đường dẫn mô-đun-con “$displaypath”"
-
-#: git-submodule.sh:913
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr "Đường dẫn mô-đun-con “$displaypath”: đã checkout “$sha1”"
-
-#: git-submodule.sh:940
+#: git-submodule.sh:941
 #, 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:1048
+#: git-submodule.sh:1049
 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"
 
-#. unexpected type
-#: git-submodule.sh:1096
+#: git-submodule.sh:1097
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "chế độ không như mong chờ $mod_dst"
 
-#: git-submodule.sh:1116
+#: git-submodule.sh:1117
 #, 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:1119
+#: git-submodule.sh:1120
 #, 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:1122
+#: git-submodule.sh:1123
 #, 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:1147
+#: git-submodule.sh:1148
 msgid "blob"
 msgstr "blob"
 
-#: git-submodule.sh:1261
+#: git-submodule.sh:1262
 #, 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:1325
+#: git-submodule.sh:1326
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
 
+#~ msgid "key id"
+#~ msgstr "id của khóa"
+
+#~ msgid "Tracking not set up: name too long: %s"
+#~ msgstr "Việc theo dõi chưa được cài đặt: tên quá dài: %s"
+
+#~ msgid "bug"
+#~ msgstr "lỗi"
+
+#~ msgid "ahead "
+#~ msgstr "phía trước "
+
+#~ msgid ", behind "
+#~ msgstr ", đằng sau "
+
+#~ msgid "could not find .gitmodules in index"
+#~ msgstr "không tìm thấy .gitmodules trong bảng mục lục"
+
+#~ msgid "reading updated .gitmodules failed"
+#~ msgstr "gặp lỗi khi đọc cập nhật .gitmodules"
+
+#~ msgid "unable to stat updated .gitmodules"
+#~ msgstr "không thể lấy thống kê .gitmodules đã cập nhật"
+
+#~ msgid "unable to remove .gitmodules from index"
+#~ msgstr "không thể gỡ bỏ .gitmodules từ mục lục"
+
+#~ msgid "adding updated .gitmodules failed"
+#~ msgstr "gặp lỗi khi thêm .gitmodules đã cập nhật"
+
+#~ msgid ""
+#~ "The behavior of 'git add %s (or %s)' with no path argument from a\n"
+#~ "subdirectory of the tree will change in Git 2.0 and should not be used "
+#~ "anymore.\n"
+#~ "To add content for the whole tree, run:\n"
+#~ "\n"
+#~ "  git add %s :/\n"
+#~ "  (or git add %s :/)\n"
+#~ "\n"
+#~ "To restrict the command to the current directory, run:\n"
+#~ "\n"
+#~ "  git add %s .\n"
+#~ "  (or git add %s .)\n"
+#~ "\n"
+#~ "With the current Git version, the command is restricted to the current "
+#~ "directory.\n"
+#~ msgstr ""
+#~ "Cách ứng xử của lệnh “git add %s (hay %s)” khi không có tham số đường dẫn "
+#~ "từ\n"
+#~ "thư-mục con của cây sẽ thay đổi kể từ Git 2.0 và không thể sử dụng như "
+#~ "thế nữa.\n"
+#~ "Để thêm nội dung cho toàn bộ cây, chạy:\n"
+#~ "\n"
+#~ "  git add %s :/\n"
+#~ "  (hoặc git add %s :/)\n"
+#~ "\n"
+#~ "Để hạn chế lệnh cho thư-mục hiện tại, chạy:\n"
+#~ "\n"
+#~ "  git add %s .\n"
+#~ "  (hoặc git add %s .)\n"
+#~ "\n"
+#~ "Với phiên bản hiện tại của Git, lệnh bị hạn chế cho thư-mục hiện tại.\n"
+
+#~ msgid ""
+#~ "You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
+#~ "whose behaviour will change in Git 2.0 with respect to paths you "
+#~ "removed.\n"
+#~ "Paths like '%s' that are\n"
+#~ "removed from your working tree are ignored with this version of Git.\n"
+#~ "\n"
+#~ "* 'git add --ignore-removal <pathspec>', which is the current default,\n"
+#~ "  ignores paths you removed from your working tree.\n"
+#~ "\n"
+#~ "* 'git add --all <pathspec>' will let you also record the removals.\n"
+#~ "\n"
+#~ "Run 'git status' to check the paths you removed from your working tree.\n"
+#~ msgstr ""
+#~ "Bạn chạy “git add” mà không có “-A (--all)” cũng không “--ignore-"
+#~ "removal”,\n"
+#~ "cách ứng xử của nó sẽ thay đổi kể từ Git 2.0: nó quan tâm đến các đường "
+#~ "dẫn mà\n"
+#~ "bạn đã gỡ bỏ. Các đường dẫn như là “%s” cái mà\n"
+#~ "bị gỡ bỏ từ cây làm việc của bạn thì bị bỏ qua với phiên bản này của "
+#~ "Git.\n"
+#~ "\n"
+#~ "* “git add --ignore-removal <pathspec>”, cái hiện tại là mặc định,\n"
+#~ "  bỏ qua các đường dẫn bạn đã gỡ bỏ từ cây làm việc của bạn.\n"
+#~ "\n"
+#~ "* “git add --all <pathspec>” sẽ đồng thời giúp bạn ghi lại việc dời đi.\n"
+#~ "\n"
+#~ "Chạy “git status” để kiểm tra các đường dẫn bạn đã gỡ bỏ từ cây làm việc "
+#~ "của bạn.\n"
+
+#~ msgid ""
+#~ "Auto packing the repository for optimum performance. You may also\n"
+#~ "run \"git gc\" manually. See \"git help gc\" for more information.\n"
+#~ msgstr ""
+#~ "Tự động đóng gói kho chứa để tối ưu hóa hiệu suất làm việc.\n"
+#~ "chạy lệnh \"git gc\" một cách thủ công. Hãy xem \"git help gc\" để biết "
+#~ "thêm chi tiết.\n"
+
+#~ msgid ""
+#~ "Updates were rejected because a pushed branch tip is behind its remote\n"
+#~ "counterpart. If you did not intend to push that branch, you may want to\n"
+#~ "specify branches to push or set the 'push.default' configuration "
+#~ "variable\n"
+#~ "to 'simple', 'current' or 'upstream' to push only the current branch."
+#~ msgstr ""
+#~ "Việc cập nhật bị từ chối bởi vì đầu mút của nhánh được push nằm đằng sau "
+#~ "bộ\n"
+#~ "phận tương ứng của máy chủ. Nếu bạn không có ý định push nhánh đó, bạn có "
+#~ "lẽ muốn\n"
+#~ "chỉ định các nhánh để push hoặt là đặt nội dung cho biến cấu hình “push."
+#~ "default”\n"
+#~ "thành “simple”, “current” hoặc “upstream” để chỉ push nhánh hiện hành mà "
+#~ "thôi."
+
 #~ msgid "copied:     %s -> %s"
 #~ msgstr "đã sao chép:   %s -> %s"
 
@@ -10928,9 +11010,6 @@ msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
 #~ msgid "unmerged:   %s"
 #~ msgstr "chưa hòa trộn: %s"
 
-#~ msgid "done\n"
-#~ msgstr "xong\n"
-
 #~ msgid "input paths are terminated by a null character"
 #~ msgstr "các đường dẫn được  ngăn cách bởi ký tự null"
 
@@ -11058,15 +11137,9 @@ msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
 #~ msgstr[0] ", %d xóa(-)"
 #~ msgstr[1] ", %d xóa(-)"
 
-#~ 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"
-
 #~ msgid " (use \"git add\" to track)"
 #~ msgstr " (dùng \"git add\" để theo dõi dấu vết)"
 
-#~ msgid "-B cannot be used with -b"
-#~ msgstr "tùy chọn -B không thể dùng -b"
-
 #~ msgid "--detach cannot be used with -b/-B/--orphan"
 #~ msgstr "--detach không thể được sử dụng với tùy chọn -b/-B/--orphan"
 
index 09428357116be2c21f6b6ec260fa2b7871f70591..06cc173aca9808326ad98ab3ad81d2e3f18ef97e 100644 (file)
@@ -12,8 +12,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-02-01 08:06+0800\n"
-"PO-Revision-Date: 2014-02-03 10:53+0800\n"
+"POT-Creation-Date: 2014-04-23 12:50+0800\n"
+"PO-Revision-Date: 2014-04-23 12:53+0800\n"
 "Last-Translator: Jiang Xin <worldhello.net@gmail.com>\n"
 "Language-Team: GitHub <https://github.com/gotgit/git/>\n"
 "Language: zh_CN\n"
@@ -22,16 +22,12 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: advice.c:57
+#: advice.c:55
 #, c-format
 msgid "hint: %.*s\n"
 msgstr "提示:%.*s\n"
 
-#.
-#. * Message used both when 'git commit' fails and when
-#. * other commands doing a merge do.
-#.
-#: advice.c:87
+#: advice.c:85
 msgid ""
 "Fix them up in the work tree,\n"
 "and then use 'git add/rm <file>' as\n"
@@ -60,76 +56,76 @@ msgstr ""
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr "git archive --remote <版本库> [--exec <命令>] --list"
 
-#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328
+#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "路径规则 '%s' 未匹配任何文件"
 
-#: archive.c:327
+#: archive.c:328
 msgid "fmt"
 msgstr "格式"
 
-#: archive.c:327
+#: archive.c:328
 msgid "archive format"
 msgstr "归档格式"
 
-#: archive.c:328 builtin/log.c:1193
+#: archive.c:329 builtin/log.c:1193
 msgid "prefix"
 msgstr "前缀"
 
-#: archive.c:329
+#: archive.c:330
 msgid "prepend prefix to each pathname in the archive"
 msgstr "为归档中每个路径名加上前缀"
 
-#: archive.c:330 builtin/archive.c:88 builtin/blame.c:2265
-#: builtin/blame.c:2266 builtin/config.c:58 builtin/fast-export.c:680
-#: builtin/fast-export.c:682 builtin/grep.c:716 builtin/hash-object.c:77
-#: builtin/ls-files.c:486 builtin/ls-files.c:489 builtin/notes.c:408
-#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:154
+#: 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
 msgid "file"
 msgstr "文件"
 
-#: archive.c:331 builtin/archive.c:89
+#: archive.c:332 builtin/archive.c:89
 msgid "write the archive to this file"
 msgstr "归档写入此文件"
 
-#: archive.c:333
+#: archive.c:334
 msgid "read .gitattributes in working directory"
 msgstr "读取工作区中的 .gitattributes"
 
-#: archive.c:334
+#: archive.c:335
 msgid "report archived files on stderr"
 msgstr "在标准错误上报告归档文件"
 
-#: archive.c:335
+#: archive.c:336
 msgid "store only"
 msgstr "只存储"
 
-#: archive.c:336
+#: archive.c:337
 msgid "compress faster"
 msgstr "压缩速度更快"
 
-#: archive.c:344
+#: archive.c:345
 msgid "compress better"
 msgstr "压缩效果更好"
 
-#: archive.c:347
+#: archive.c:348
 msgid "list supported archive formats"
 msgstr "列出支持的归档格式"
 
-#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
 msgid "repo"
 msgstr "版本库"
 
-#: archive.c:350 builtin/archive.c:91
+#: archive.c:351 builtin/archive.c:91
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "从远程版本库(<版本库>)提取归档文件"
 
-#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487
+#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
 msgid "command"
 msgstr "命令"
 
-#: archive.c:352 builtin/archive.c:93
+#: archive.c:353 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr "远程 git-upload-archive 命令的路径"
 
@@ -146,81 +142,76 @@ msgstr ""
 msgid "Not setting branch %s as its own upstream."
 msgstr "未设置分支 %s 作为它自己的上游。"
 
-#: branch.c:82
+#: branch.c:83
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr "分支 %1$s 设置为使用变基来跟踪来自 %3$s 的远程分支 %2$s。"
 
-#: branch.c:83
+#: branch.c:84
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
 msgstr "分支 %1$s 设置为跟踪来自 %3$s 的远程分支 %2$s。"
 
-#: branch.c:87
+#: branch.c:88
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr "分支 %s 设置为使用变基来跟踪本地分支 %s。"
 
-#: branch.c:88
+#: branch.c:89
 #, c-format
 msgid "Branch %s set up to track local branch %s."
 msgstr "分支 %s 设置为跟踪本地分支 %s。"
 
-#: branch.c:92
+#: branch.c:94
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr "分支 %s 设置为使用变基来跟踪远程引用 %s。"
 
-#: branch.c:93
+#: branch.c:95
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
 msgstr "分支 %s 设置为跟踪远程引用 %s。"
 
-#: branch.c:97
+#: branch.c:99
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr "分支 %s 设置为使用变基来跟踪本地引用 %s。"
 
-#: branch.c:98
+#: branch.c:100
 #, c-format
 msgid "Branch %s set up to track local ref %s."
 msgstr "分支 %s 设置为跟踪本地引用 %s。"
 
-#: branch.c:118
-#, c-format
-msgid "Tracking not set up: name too long: %s"
-msgstr "跟踪未设置:名字太长:%s"
-
-#: branch.c:137
+#: branch.c:133
 #, c-format
 msgid "Not tracking: ambiguous information for ref %s"
 msgstr "未跟踪:引用 %s 有歧义"
 
-#: branch.c:182
+#: branch.c:178
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "'%s' 不是一个有效的分支名称。"
 
-#: branch.c:187
+#: branch.c:183
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "一个分支名 '%s' 已经存在。"
 
-#: branch.c:195
+#: branch.c:191
 msgid "Cannot force update the current branch."
 msgstr "无法强制更新当前分支。"
 
-#: branch.c:215
+#: branch.c:211
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr "无法设置跟踪信息;起始点 '%s' 不是一个分支。"
 
-#: branch.c:217
+#: branch.c:213
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "请求的上游分支 '%s' 不存在"
 
-#: branch.c:219
+#: branch.c:215
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -238,113 +229,113 @@ msgstr ""
 "如果您正计划推送一个能与对应远程分支建立跟踪的新的本地分支,\n"
 "您可能需要使用 \"git push -u\" 推送分支并配置和上游的关联。"
 
-#: branch.c:264
+#: branch.c:260
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "不是一个有效的对象名:'%s'。"
 
-#: branch.c:284
+#: branch.c:280
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "歧义的对象名:'%s'。"
 
-#: branch.c:289
+#: branch.c:285
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "无效的分支点:'%s'。"
 
-#: branch.c:295
+#: branch.c:291
 msgid "Failed to lock ref for update"
 msgstr "无法为更新锁定引用"
 
-#: branch.c:313
+#: branch.c:309
 msgid "Failed to write ref"
 msgstr "不能写引用"
 
-#: bundle.c:37
+#: bundle.c:33
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
 msgstr "'%s' 不像是一个 v2 版本的包文件"
 
-#: bundle.c:64
+#: bundle.c:60
 #, c-format
 msgid "unrecognized header: %s%s (%d)"
 msgstr "未能识别的包头:%s%s (%d)"
 
-#: bundle.c:90 builtin/commit.c:706
+#: bundle.c:86 builtin/commit.c:706
 #, c-format
 msgid "could not open '%s'"
 msgstr "不能打开 '%s'"
 
-#: bundle.c:141
+#: bundle.c:138
 msgid "Repository lacks these prerequisite commits:"
 msgstr "版本库缺少这些必备的提交:"
 
-#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332
+#: 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
 #: builtin/shortlog.c:158
 msgid "revision walk setup failed"
 msgstr "版本遍历设置失败"
 
-#: bundle.c:187
+#: bundle.c:184
 #, c-format
 msgid "The bundle contains this ref:"
 msgid_plural "The bundle contains these %d refs:"
 msgstr[0] "这个包中含有这个引用:"
 msgstr[1] "这个包中含有 %d 个引用:"
 
-#: bundle.c:194
+#: bundle.c:191
 msgid "The bundle records a complete history."
 msgstr "这个包记录一个完整历史。"
 
-#: bundle.c:196
+#: bundle.c:193
 #, c-format
 msgid "The bundle requires this ref:"
 msgid_plural "The bundle requires these %d refs:"
 msgstr[0] "这个包需要这个引用:"
 msgstr[1] "这个包需要 %d 个引用:"
 
-#: bundle.c:296
+#: bundle.c:293
 msgid "rev-list died"
 msgstr "rev-list 终止"
 
-#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "未能识别的参数:%s"
 
-#: bundle.c:337
+#: bundle.c:334
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "引用 '%s' 被 rev-list 选项排除"
 
-#: bundle.c:382
+#: bundle.c:379
 msgid "Refusing to create empty bundle."
 msgstr "不能创建空包。"
 
-#: bundle.c:398
+#: bundle.c:395
 msgid "Could not spawn pack-objects"
 msgstr "不能生成 pack-objects 进程"
 
-#: bundle.c:416
+#: bundle.c:413
 msgid "pack-objects died"
 msgstr "pack-objects 终止"
 
-#: bundle.c:419
+#: bundle.c:416
 #, c-format
 msgid "cannot create '%s'"
 msgstr "不能创建 '%s'"
 
-#: bundle.c:441
+#: bundle.c:438
 msgid "index-pack died"
 msgstr "index-pack 终止"
 
-#: commit.c:53
+#: commit.c:54
 #, c-format
 msgid "could not parse %s"
 msgstr "不能解析 %s"
 
-#: commit.c:55
+#: commit.c:56
 #, c-format
 msgid "%s %s is not a commit!"
 msgstr "%s %s 不是一个提交!"
@@ -375,43 +366,43 @@ msgstr "在将来"
 #, c-format
 msgid "%lu second ago"
 msgid_plural "%lu seconds ago"
-msgstr[0] "%lu 秒钟前"
-msgstr[1] "%lu 秒钟前"
+msgstr[0] "%lu 秒钟前"
+msgstr[1] "%lu 秒钟前"
 
 #: date.c:108
 #, c-format
 msgid "%lu minute ago"
 msgid_plural "%lu minutes ago"
-msgstr[0] "%lu 分钟前"
-msgstr[1] "%lu 分钟前"
+msgstr[0] "%lu 分钟前"
+msgstr[1] "%lu 分钟前"
 
 #: date.c:115
 #, c-format
 msgid "%lu hour ago"
 msgid_plural "%lu hours ago"
-msgstr[0] "%lu 小时前"
-msgstr[1] "%lu 小时前"
+msgstr[0] "%lu 小时前"
+msgstr[1] "%lu 小时前"
 
 #: date.c:122
 #, c-format
 msgid "%lu day ago"
 msgid_plural "%lu days ago"
-msgstr[0] "%lu 天前"
-msgstr[1] "%lu 天前"
+msgstr[0] "%lu 天前"
+msgstr[1] "%lu 天前"
 
 #: date.c:128
 #, c-format
 msgid "%lu week ago"
 msgid_plural "%lu weeks ago"
-msgstr[0] "%lu 周前"
-msgstr[1] "%lu 周前"
+msgstr[0] "%lu 周前"
+msgstr[1] "%lu 周前"
 
 #: date.c:135
 #, c-format
 msgid "%lu month ago"
 msgid_plural "%lu months ago"
-msgstr[0] "%lu 个月前"
-msgstr[1] "%lu 个月前"
+msgstr[0] "%lu 个月前"
+msgstr[1] "%lu 个月前"
 
 #: date.c:146
 #, c-format
@@ -420,12 +411,13 @@ msgid_plural "%lu years"
 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] "%s,%lu 个月之前"
-msgstr[1] "%s,%lu 个月之前"
+msgstr[0] "%s %lu 个月前"
+msgstr[1] "%s %lu 个月前"
 
 #: date.c:154 date.c:159
 #, c-format
@@ -439,6 +431,10 @@ msgstr[1] "%lu 年前"
 msgid "failed to read orderfile '%s'"
 msgstr "无法读取排序文件 '%s'"
 
+#: diffcore-rename.c:517
+msgid "Performing inexact rename detection"
+msgstr "正在进行非精确的重命名检测"
+
 #  译者:注意保持前导空格
 #: diff.c:113
 #, c-format
@@ -465,7 +461,7 @@ msgstr ""
 "发现配置变量 'diff.dirstat' 中的错误:\n"
 "%s"
 
-#: diff.c:3509
+#: diff.c:3495
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -474,7 +470,7 @@ msgstr ""
 "无法解析 --dirstat/-X 选项的参数:\n"
 "%s"
 
-#: diff.c:3523
+#: diff.c:3509
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "无法解析 --submodule 选项的参数:'%s'"
@@ -501,35 +497,35 @@ msgstr "不能创建临时文件 '%s':%s"
 msgid "failed writing detached signature to '%s': %s"
 msgstr "无法将分离式签名写入 '%s':%s"
 
-#: grep.c:1695
+#: grep.c:1698
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "'%s':无法读取 %s"
 
-#: grep.c:1712
+#: grep.c:1715
 #, c-format
 msgid "'%s': %s"
 msgstr "'%s':%s"
 
-#: grep.c:1723
+#: grep.c:1726
 #, c-format
 msgid "'%s': short read %s"
 msgstr "'%s':读取不完整 %s"
 
-#: help.c:210
+#: help.c:209
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "在 '%s' 下可用的 git 命令"
 
-#: help.c:217
+#: help.c:216
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "在 $PATH 路径中的其他地方可用的 git 命令"
 
-#: help.c:233
+#: help.c:232
 msgid "The most commonly used git commands are:"
 msgstr "最常用的 git 命令有:"
 
-#: help.c:290
+#: help.c:289
 #, c-format
 msgid ""
 "'%s' appears to be a git command, but we were not\n"
@@ -538,11 +534,11 @@ msgstr ""
 "'%s' 像是一个 git 命令,但却无法运行。\n"
 "可能是 git-%s 受损?"
 
-#: help.c:347
+#: help.c:346
 msgid "Uh oh. Your system reports no Git commands at all."
 msgstr "唉呀,您的系统中未发现 Git 命令。"
 
-#: help.c:369
+#: help.c:368
 #, c-format
 msgid ""
 "WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -551,17 +547,17 @@ msgstr ""
 "警告:您运行一个不存在的 Git 命令 '%s'。继续执行假定您要要运行的\n"
 "是 '%s'"
 
-#: help.c:374
+#: help.c:373
 #, c-format
 msgid "in %0.1f seconds automatically..."
 msgstr "在 %0.1f 秒钟后自动运行..."
 
-#: help.c:381
+#: help.c:380
 #, c-format
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git:'%s' 不是一个 git 命令。参见 'git --help'。"
 
-#: help.c:385 help.c:444
+#: help.c:384 help.c:443
 msgid ""
 "\n"
 "Did you mean this?"
@@ -575,7 +571,7 @@ msgstr[1] ""
 "\n"
 "您指的是这其中的某一个么?"
 
-#: help.c:440
+#: help.c:439
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s:%s - %s"
@@ -584,7 +580,7 @@ msgstr "%s:%s - %s"
 msgid "failed to read the cache"
 msgstr "无法读取缓存"
 
-#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559
+#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
 #: builtin/clone.c:661
 msgid "unable to write new index file"
 msgstr "无法写新的索引文件"
@@ -594,75 +590,73 @@ msgstr "无法写新的索引文件"
 msgid "(bad commit)\n"
 msgstr "(坏提交)\n"
 
-#: merge-recursive.c:206
+#: merge-recursive.c:208
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "为路径 '%s' addinfo_cache 失败"
 
-#: merge-recursive.c:269
+#: merge-recursive.c:271
 msgid "error building trees"
 msgstr "无法创建树"
 
-#: merge-recursive.c:673
+#: merge-recursive.c:675
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "无法创建路径 '%s'%s"
 
-#: merge-recursive.c:684
+#: merge-recursive.c:686
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "删除 %s 以便为子目录留出空间\n"
 
-#. something else exists
-#. .. but not some other error (who really cares what?)
-#: merge-recursive.c:698 merge-recursive.c:719
+#: merge-recursive.c:700 merge-recursive.c:721
 msgid ": perhaps a D/F conflict?"
 msgstr ":可能是一个目录/文件冲突?"
 
-#: merge-recursive.c:709
+#: merge-recursive.c:711
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "拒绝丢弃 '%s' 中的未跟踪文件"
 
-#: merge-recursive.c:749
+#: merge-recursive.c:751
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "不能读取对象 %s '%s'"
 
-#: merge-recursive.c:751
+#: merge-recursive.c:753
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "%s '%s' 应为数据(blob)对象"
 
-#: merge-recursive.c:774 builtin/clone.c:317
+#: merge-recursive.c:776 builtin/clone.c:317
 #, c-format
 msgid "failed to open '%s'"
 msgstr "无法打开 '%s'"
 
-#: merge-recursive.c:782
+#: merge-recursive.c:784
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "无法创建符号链接 '%s'"
 
-#: merge-recursive.c:785
+#: merge-recursive.c:787
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "不知道如何处理 %06o %s '%s'"
 
-#: merge-recursive.c:923
+#: merge-recursive.c:925
 msgid "Failed to execute internal merge"
 msgstr "无法执行内部合并"
 
-#: merge-recursive.c:927
+#: merge-recursive.c:929
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "不能添加 %s 至对象库"
 
-#: merge-recursive.c:943
+#: merge-recursive.c:945
 msgid "unsupported object type in the tree"
 msgstr "在树中有不支持的对象类型"
 
-#: merge-recursive.c:1022 merge-recursive.c:1036
+#: merge-recursive.c:1024 merge-recursive.c:1038
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -671,7 +665,7 @@ msgstr ""
 "冲突(%1$s/删除):%2$s 在 %3$s 中被删除,在 %5$s 中被 %4$s。%7$s 在 %6$s 中"
 "的版本被保留。"
 
-#: merge-recursive.c:1028 merge-recursive.c:1041
+#: merge-recursive.c:1030 merge-recursive.c:1043
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -680,20 +674,20 @@ msgstr ""
 "冲突(%1$s/删除):%2$s 在 %3$s 中被删除,在 %5$s 中被 %4$s。%7$s 在 %6$s 中"
 "的版本保留于 %8$s 中。"
 
-#: merge-recursive.c:1082
+#: merge-recursive.c:1084
 msgid "rename"
 msgstr "重命名"
 
-#: merge-recursive.c:1082 wt-status.c:283
+#: merge-recursive.c:1084
 msgid "renamed"
 msgstr "重命名"
 
-#: merge-recursive.c:1138
+#: merge-recursive.c:1140
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "%s 是 %s 中的一个目录而以 %s 为名被添加"
 
-#: merge-recursive.c:1160
+#: merge-recursive.c:1162
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -702,144 +696,144 @@ msgstr ""
 "冲突(重命名/重命名):在分支 \"%3$s\" 中重命名 \"%1$s\"->\"%2$s\",在分支 "
 "\"%6$s\" 中重命名 \"%4$s\"->\"%5$s\"%7$s"
 
-#: merge-recursive.c:1165
+#: merge-recursive.c:1167
 msgid " (left unresolved)"
 msgstr "(留下未解决)"
 
-#: merge-recursive.c:1219
+#: merge-recursive.c:1221
 #, 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:1249
+#: merge-recursive.c:1251
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "而是重命名 %s 至 %s,以及 %s 至 %s"
 
-#: merge-recursive.c:1448
+#: merge-recursive.c:1450
 #, 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:1458
+#: merge-recursive.c:1460
 #, c-format
 msgid "Adding merged %s"
 msgstr "添加合并后的 %s"
 
-#: merge-recursive.c:1463 merge-recursive.c:1661
+#: merge-recursive.c:1465 merge-recursive.c:1663
 #, c-format
 msgid "Adding as %s instead"
 msgstr "而是以 %s 为名添加"
 
-#: merge-recursive.c:1514
+#: merge-recursive.c:1516
 #, c-format
 msgid "cannot read object %s"
 msgstr "不能读取对象 %s"
 
-#: merge-recursive.c:1517
+#: merge-recursive.c:1519
 #, c-format
 msgid "object %s is not a blob"
 msgstr "对象 %s 不是一个数据(blob)对象"
 
-#: merge-recursive.c:1565
+#: merge-recursive.c:1567
 msgid "modify"
 msgstr "修改"
 
-#: merge-recursive.c:1565 wt-status.c:281
+#: merge-recursive.c:1567
 msgid "modified"
 msgstr "修改"
 
-#: merge-recursive.c:1575
+#: merge-recursive.c:1577
 msgid "content"
 msgstr "内容"
 
-#: merge-recursive.c:1582
+#: merge-recursive.c:1584
 msgid "add/add"
 msgstr "添加/添加"
 
-#: merge-recursive.c:1616
+#: merge-recursive.c:1618
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "略过 %s(已经做过相同合并)"
 
-#: merge-recursive.c:1630
+#: merge-recursive.c:1632
 #, c-format
 msgid "Auto-merging %s"
 msgstr "自动合并 %s"
 
-#: merge-recursive.c:1634 git-submodule.sh:1148
+#: merge-recursive.c:1636 git-submodule.sh:1149
 msgid "submodule"
 msgstr "子模组"
 
-#: merge-recursive.c:1635
+#: merge-recursive.c:1637
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "冲突(%s):合并冲突于 %s"
 
-#: merge-recursive.c:1725
+#: merge-recursive.c:1727
 #, c-format
 msgid "Removing %s"
 msgstr "删除 %s"
 
-#: merge-recursive.c:1750
+#: merge-recursive.c:1752
 msgid "file/directory"
 msgstr "文件/目录"
 
-#: merge-recursive.c:1756
+#: merge-recursive.c:1758
 msgid "directory/file"
 msgstr "目录/文件"
 
-#: merge-recursive.c:1761
+#: merge-recursive.c:1763
 #, 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:1771
+#: merge-recursive.c:1773
 #, c-format
 msgid "Adding %s"
 msgstr "添加 %s"
 
-#: merge-recursive.c:1788
+#: merge-recursive.c:1790
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "严重的合并错误,不应发生。"
 
-#: merge-recursive.c:1807
+#: merge-recursive.c:1809
 msgid "Already up-to-date!"
 msgstr "已经是最新的!"
 
-#: merge-recursive.c:1816
+#: merge-recursive.c:1818
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "无法合并树 %s 和 %s"
 
-#: merge-recursive.c:1846
+#: merge-recursive.c:1848
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "未处理的路径??? %s"
 
-#: merge-recursive.c:1891
+#: merge-recursive.c:1893
 msgid "Merging:"
 msgstr "合并:"
 
-#: merge-recursive.c:1904
+#: merge-recursive.c:1906
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "发现 %u 个共同祖先:"
 msgstr[1] "发现 %u 个共同祖先:"
 
-#: merge-recursive.c:1941
+#: merge-recursive.c:1943
 msgid "merge returned no commit"
 msgstr "合并未返回提交"
 
-#: merge-recursive.c:1998
+#: merge-recursive.c:2000
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "不能解析对象 '%s'"
 
-#: merge-recursive.c:2010 builtin/merge.c:665
+#: merge-recursive.c:2012 builtin/merge.c:668
 msgid "Unable to write index."
 msgstr "不能写入索引。"
 
@@ -864,34 +858,34 @@ msgstr "拒绝向 %s(在 refs/notes/ 之外)写入注解"
 msgid "Bad %s value: '%s'"
 msgstr "坏的 %s 值:'%s'"
 
-#: object.c:202
+#: object.c:229
 #, c-format
 msgid "unable to parse object: %s"
 msgstr "不能解析对象:%s"
 
-#: parse-options.c:537
+#: parse-options.c:532
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:555
+#: parse-options.c:550
 #, c-format
 msgid "usage: %s"
 msgstr "用法:%s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:559
+#: parse-options.c:554
 #, c-format
 msgid "   or: %s"
 msgstr "  或:%s"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: parse-options.c:562
+#: parse-options.c:557
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:596
+#: parse-options.c:591
 msgid "-NUM"
 msgstr "-数字"
 
@@ -939,11 +933,6 @@ msgstr "%s:'%s' 在版本库之外"
 msgid "Pathspec '%s' is in submodule '%.*s'"
 msgstr "路径规则 '%s' 在子模组 '%.*s' 中"
 
-#.
-#. * We may want to substitute "this command" with a command
-#. * name. E.g. when add--interactive dies when running
-#. * "checkout -p"
-#.
 #: pathspec.c:353
 #, c-format
 msgid "%s: pathspec magic not supported by this command: %s"
@@ -962,56 +951,73 @@ msgstr ""
 "没有为 :(exclude) 模式提供要忽略的内容。也许您忘记了\n"
 "添加 ':/' 或 '.' ?"
 
-#: remote.c:753
+#: progress.c:224
+msgid "done"
+msgstr "完成"
+
+#: read-cache.c:1238
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"设置了 index.version,但是取值无效。\n"
+"使用版本 %i"
+
+#: read-cache.c:1248
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"设置了 GIT_INDEX_VERSION,但是取值无效。\n"
+"使用版本 %i"
+
+#: remote.c:758
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "不能同时获取 %s 和 %s 至 %s"
 
-#: remote.c:757
+#: remote.c:762
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s 通常跟踪 %s,而非 %s"
 
-#: remote.c:761
+#: remote.c:766
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s 同时跟踪 %s 和 %s"
 
-#.
-#. * This last possibility doesn't occur because
-#. * FETCH_HEAD_IGNORE entries always appear at
-#. * the end of the list.
-#.
-#: remote.c:769
+#: remote.c:774
 msgid "Internal error"
 msgstr "内部错误"
 
-#: remote.c:1871
+#: remote.c:1948
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "您的分支基于 '%s',但此上游分支已经不存在。\n"
 
-#: remote.c:1875
+#: remote.c:1952
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (使用 \"git branch --unset-upstream\" 来修复)\n"
 
-#: remote.c:1878
+#: remote.c:1955
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "您的分支与上游分支 '%s' 一致。\n"
 
-#: remote.c:1882
+#: remote.c:1959
 #, 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:1888
+#: remote.c:1965
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (使用 \"git push\" 来发布您的本地提交)\n"
 
-#: remote.c:1891
+#: remote.c:1968
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1020,11 +1026,11 @@ msgstr[0] "您的分支落后 '%s' 共 %d 个提交,并且可以快进。\n"
 msgstr[1] "您的分支落后 '%s' 共 %d 个提交,并且可以快进。\n"
 
 #  译者:注意保持前导空格
-#: remote.c:1899
+#: remote.c:1976
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (使用 \"git pull\" 来更新您的本地分支)\n"
 
-#: remote.c:1902
+#: remote.c:1979
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1040,7 +1046,7 @@ msgstr[1] ""
 "并且分别有 %d 和 %d 处不同的提交。\n"
 
 #  译者:注意保持前导空格
-#: remote.c:1912
+#: remote.c:1989
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr "  (使用 \"git pull\" 来合并远程分支)\n"
 
@@ -1053,14 +1059,14 @@ msgstr "不能打开 /dev/null"
 msgid "dup2(%d,%d) failed"
 msgstr "不能调用 dup2(%d,%d)"
 
-#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896
-#: builtin/merge.c:1006 builtin/merge.c:1016
+#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
+#: builtin/merge.c:1009 builtin/merge.c:1019
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "不能为写入打开 '%s'"
 
-#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786
-#: builtin/merge.c:1008 builtin/merge.c:1021
+#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
+#: builtin/merge.c:1011 builtin/merge.c:1024
 #, c-format
 msgid "Could not write to '%s'"
 msgstr "不能写入 '%s'"
@@ -1082,7 +1088,7 @@ msgstr ""
 "冲突解决完毕后,用 'git add <paths>' 或 'git rm <paths>'\n"
 "对修正后的文件做标记,然后用 'git commit' 提交"
 
-#: sequencer.c:245 sequencer.c:870 sequencer.c:953
+#: sequencer.c:245 sequencer.c:879 sequencer.c:962
 #, c-format
 msgid "Could not write to %s"
 msgstr "不能写入 %s"
@@ -1118,184 +1124,184 @@ msgstr "不能解析 HEAD 提交\n"
 msgid "Unable to update cache tree\n"
 msgstr "不能更新缓存\n"
 
-#: sequencer.c:423
+#: sequencer.c:430
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr "不能解析提交 %s\n"
 
-#: sequencer.c:428
+#: sequencer.c:435
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr "不能解析父提交 %s\n"
 
-#: sequencer.c:494
+#: sequencer.c:501
 msgid "Your index file is unmerged."
 msgstr "您的索引文件未完成合并。"
 
-#: sequencer.c:513
+#: sequencer.c:520
 #, c-format
 msgid "Commit %s is a merge but no -m option was given."
 msgstr "提交 %s 是一个合并提交但未提供 -m 选项。"
 
-#: sequencer.c:521
+#: sequencer.c:528
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr "提交 %s 没有父提交 %d"
 
-#: sequencer.c:525
+#: sequencer.c:532
 #, 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:538
+#: sequencer.c:545
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s:不能解析父提交 %s"
 
-#: sequencer.c:542
+#: sequencer.c:549
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr "不能得到 %s 的提交说明"
 
-#: sequencer.c:628
+#: sequencer.c:635
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "不能还原 %s... %s"
 
-#: sequencer.c:629
+#: sequencer.c:636
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "不能应用 %s... %s"
 
-#: sequencer.c:665
+#: sequencer.c:672
 msgid "empty commit set passed"
 msgstr "提供了空的提交集"
 
-#: sequencer.c:673
+#: sequencer.c:680
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s:无法读取索引"
 
-#: sequencer.c:678
+#: sequencer.c:685
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s:无法刷新索引"
 
-#: sequencer.c:736
+#: sequencer.c:743
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr "无法 %s 在一个 %s 过程中"
 
-#: sequencer.c:758
+#: sequencer.c:765
 #, c-format
 msgid "Could not parse line %d."
 msgstr "不能解析第 %d 行。"
 
-#: sequencer.c:763
+#: sequencer.c:770
 msgid "No commits parsed."
 msgstr "没有提交被解析。"
 
-#: sequencer.c:776
+#: sequencer.c:783
 #, c-format
 msgid "Could not open %s"
 msgstr "不能打开 %s"
 
-#: sequencer.c:780
+#: sequencer.c:787
 #, c-format
 msgid "Could not read %s."
 msgstr "不能读取 %s。"
 
-#: sequencer.c:787
+#: sequencer.c:794
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr "无用的指令表单:%s"
 
-#: sequencer.c:815
+#: sequencer.c:824
 #, c-format
 msgid "Invalid key: %s"
 msgstr "无效键名:%s"
 
-#: sequencer.c:818
+#: sequencer.c:827
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr "%s 的值无效:%s"
 
-#: sequencer.c:830
+#: sequencer.c:839
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr "非法的选项表单:%s"
 
-#: sequencer.c:851
+#: sequencer.c:860
 msgid "a cherry-pick or revert is already in progress"
 msgstr "一个拣选或还原操作已在进行"
 
-#: sequencer.c:852
+#: sequencer.c:861
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr "尝试 \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: sequencer.c:856
+#: sequencer.c:865
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr "不能创建序列目录 %s"
 
-#: sequencer.c:872 sequencer.c:957
+#: sequencer.c:881 sequencer.c:966
 #, c-format
 msgid "Error wrapping up %s."
 msgstr "错误收尾 %s。"
 
-#: sequencer.c:891 sequencer.c:1025
+#: sequencer.c:900 sequencer.c:1036
 msgid "no cherry-pick or revert in progress"
 msgstr "拣选或还原操作并未进行"
 
-#: sequencer.c:893
+#: sequencer.c:902
 msgid "cannot resolve HEAD"
 msgstr "不能解析 HEAD"
 
-#: sequencer.c:895
+#: sequencer.c:904
 msgid "cannot abort from a branch yet to be born"
 msgstr "不能从尚未建立的分支终止"
 
-#: sequencer.c:917 builtin/apply.c:4061
+#: sequencer.c:926 builtin/apply.c:4061
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "不能打开 %s:%s"
 
-#: sequencer.c:920
+#: sequencer.c:929
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "不能读取 %s:%s"
 
-#: sequencer.c:921
+#: sequencer.c:930
 msgid "unexpected end of file"
 msgstr "意外的文件结束"
 
-#: sequencer.c:927
+#: sequencer.c:936
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr "保存拣选提交前的 HEAD 文件 '%s' 损坏"
 
-#: sequencer.c:950
+#: sequencer.c:959
 #, c-format
 msgid "Could not format %s."
 msgstr "不能格式化 %s。"
 
-#: sequencer.c:1093
+#: sequencer.c:1104
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr "%s:不能拣选一个%s"
 
-#: sequencer.c:1096
+#: sequencer.c:1107
 #, c-format
 msgid "%s: bad revision"
 msgstr "%s:错误的版本"
 
-#: sequencer.c:1130
+#: sequencer.c:1141
 msgid "Can't revert as initial commit"
 msgstr "不能作为初始提交还原"
 
-#: sequencer.c:1131
+#: sequencer.c:1142
 msgid "Can't cherry-pick into empty head"
 msgstr "不能拣选到空分支"
 
@@ -1320,21 +1326,21 @@ msgstr ""
 "可能需要删除它们。用 \"git config advice.objectNameWarning false\"\n"
 "命令关闭本消息通知。"
 
-#: sha1_name.c:1070
+#: sha1_name.c:1072
 msgid "HEAD does not point to a branch"
 msgstr "HEAD 没有指向一个分支"
 
-#: sha1_name.c:1073
+#: sha1_name.c:1075
 #, c-format
 msgid "No such branch: '%s'"
 msgstr "没有此分支:'%s'"
 
-#: sha1_name.c:1075
+#: sha1_name.c:1077
 #, c-format
 msgid "No upstream configured for branch '%s'"
 msgstr "尚未给分支 '%s' 设置上游"
 
-#: sha1_name.c:1079
+#: sha1_name.c:1081
 #, c-format
 msgid "Upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "上游分支 '%s' 没有存储为一个远程跟踪分支"
@@ -1348,52 +1354,34 @@ msgstr "无法修改未合并的 .gitmodules,先解决合并冲突"
 msgid "Could not find section in .gitmodules where path=%s"
 msgstr "无法在 .gitmodules 中找到 path=%s 的小节"
 
-#. Maybe the user already did that, don't error out here
 #: submodule.c:76
 #, c-format
 msgid "Could not update .gitmodules entry %s"
 msgstr "不能更新 .gitmodules 条目 %s"
 
-#. Maybe the user already did that, don't error out here
 #: submodule.c:109
 #, c-format
 msgid "Could not remove .gitmodules entry for %s"
 msgstr "无法移除 %s 的 .gitmodules 条目"
 
-#: submodule.c:127
-msgid "could not find .gitmodules in index"
-msgstr "无法在索引中找到 .gitmodules"
-
-#: submodule.c:133
-msgid "reading updated .gitmodules failed"
-msgstr "读取更新后的 .gitmodules 失败"
-
-#: submodule.c:135
-msgid "unable to stat updated .gitmodules"
-msgstr "不能枚举更新后的 .gitmodules"
-
-#: submodule.c:139
-msgid "unable to remove .gitmodules from index"
-msgstr "不能从索引中移除 .gitmodules"
-
-#: submodule.c:141
-msgid "adding updated .gitmodules failed"
-msgstr "添加更新后的 .gitmodules 失败"
-
-#: submodule.c:143
+#: submodule.c:120
 msgid "staging updated .gitmodules failed"
 msgstr "将更新后 .gitmodules 添加暂存区失败"
 
-#: submodule.c:1144 builtin/init-db.c:363
+#: submodule.c:1121 builtin/init-db.c:363
 #, c-format
 msgid "Could not create git link %s"
 msgstr "不能创建 git link %s"
 
-#: submodule.c:1155
+#: submodule.c:1132
 #, c-format
 msgid "Could not set core.worktree in %s"
 msgstr "不能在 %s 中设置 core.worktree"
 
+#: unpack-trees.c:206
+msgid "Checking out files"
+msgstr "正在检出文件"
+
 #: urlmatch.c:120
 msgid "invalid URL scheme name or missing '://' suffix"
 msgstr "无效的 URL 方案名称或丢失 '://' 后缀"
@@ -1507,94 +1495,100 @@ msgstr "  (提交或丢弃子模组中未跟踪或修改的内容)"
 msgid "  (use \"git %s <file>...\" to include in what will be committed)"
 msgstr "  (使用 \"git %s <file>...\" 以包含要提交的内容)"
 
-#: wt-status.c:254
-msgid "bug"
-msgstr "bug"
-
-#: wt-status.c:259
+#: wt-status.c:252
 msgid "both deleted:"
 msgstr "双方删除:"
 
-#: wt-status.c:260
+#: wt-status.c:254
 msgid "added by us:"
 msgstr "由我们添加:"
 
-#: wt-status.c:261
+#: wt-status.c:256
 msgid "deleted by them:"
 msgstr "由他们删除:"
 
-#: wt-status.c:262
+#: wt-status.c:258
 msgid "added by them:"
 msgstr "由他们添加:"
 
-#: wt-status.c:263
+#: wt-status.c:260
 msgid "deleted by us:"
 msgstr "由我们删除:"
 
-#: wt-status.c:264
+#: wt-status.c:262
 msgid "both added:"
 msgstr "双方添加:"
 
-#: wt-status.c:265
+#: wt-status.c:264
 msgid "both modified:"
 msgstr "双方修改:"
 
-#  译者:为保证在输出中对齐,注意调整句中空格!
-#: wt-status.c:275
-msgid "new file"
-msgstr "新文件"
+#: wt-status.c:266
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr "bug:无法处理的未合并状态 %x"
 
-#: wt-status.c:277
-msgid "copied"
-msgstr "æ\8b·è´\9d"
+#: wt-status.c:274
+msgid "new file:"
+msgstr "æ\96°æ\96\87件ï¼\9a"
 
-#: wt-status.c:279
-msgid "deleted"
-msgstr "删除"
+#: wt-status.c:276
+msgid "copied:"
+msgstr "拷贝:"
 
-#  译者:为保证在输出中对齐,注意调整句中空格!
-#: wt-status.c:285
-msgid "typechange"
-msgstr "类型变更"
+#: wt-status.c:278
+msgid "deleted:"
+msgstr "删除:"
 
-#  译者:为保证在输出中对齐,注意调整句中空格!
-#: wt-status.c:287
-msgid "unknown"
-msgstr "未知"
+#: wt-status.c:280
+msgid "modified:"
+msgstr "修改:"
+
+#: wt-status.c:282
+msgid "renamed:"
+msgstr "重命名:"
+
+#: wt-status.c:284
+msgid "typechange:"
+msgstr "类型变更:"
+
+#: wt-status.c:286
+msgid "unknown:"
+msgstr "未知:"
 
-#: wt-status.c:289
-msgid "unmerged"
-msgstr "未合并"
+#: wt-status.c:288
+msgid "unmerged:"
+msgstr "未合并"
 
 #  译者:末尾两个字节可能被删减,如果翻译为中文标点会出现半个汉字
-#: wt-status.c:336
+#: wt-status.c:370
 msgid "new commits, "
 msgstr "新提交, "
 
 #  译者:末尾两个字节可能被删减,如果翻译为中文标点会出现半个汉字
-#: wt-status.c:338
+#: wt-status.c:372
 msgid "modified content, "
 msgstr "修改的内容, "
 
 #  译者:末尾两个字节可能被删减,如果翻译为中文标点会出现半个汉字
-#: wt-status.c:340
+#: wt-status.c:374
 msgid "untracked content, "
 msgstr "未跟踪的内容, "
 
-#: wt-status.c:357
+#: wt-status.c:391
 #, c-format
 msgid "bug: unhandled diff status %c"
-msgstr "bugï¼\9aæ\9cª处理的差异状态 %c"
+msgstr "bugï¼\9aæ\97 æ³\95处理的差异状态 %c"
 
-#: wt-status.c:732
+#: wt-status.c:765
 msgid "Submodules changed but not updated:"
 msgstr "子模组已修改但尚未更新:"
 
-#: wt-status.c:734
+#: wt-status.c:767
 msgid "Submodule changes to be committed:"
 msgstr "要提交的子模组变更:"
 
-#: wt-status.c:836
+#: wt-status.c:846
 msgid ""
 "Do not touch the line above.\n"
 "Everything below will be removed."
@@ -1602,198 +1596,198 @@ msgstr ""
 "不要改动上面的一行。\n"
 "下面的所有内容均将被删除。"
 
-#: wt-status.c:899
+#: wt-status.c:937
 msgid "You have unmerged paths."
 msgstr "您有尚未合并的路径。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:902
+#: wt-status.c:940
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr "  (解决冲突并运行 \"git commit\")"
 
-#: wt-status.c:905
+#: wt-status.c:943
 msgid "All conflicts fixed but you are still merging."
 msgstr "所有冲突已解决但您仍处于合并中。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:908
+#: wt-status.c:946
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr "  (使用 \"git commit\" 结束合并)"
 
-#: wt-status.c:918
+#: wt-status.c:956
 msgid "You are in the middle of an am session."
 msgstr "您正处于 am 操作过程中。"
 
-#: wt-status.c:921
+#: wt-status.c:959
 msgid "The current patch is empty."
 msgstr "当前的补丁为空。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:925
+#: wt-status.c:963
 msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr "  (解决冲突,然后运行 \"git am --continue\")"
 
 #  译者:注意保持前导空格
-#: wt-status.c:927
+#: wt-status.c:965
 msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr "  (使用 \"git am --skip\" 跳过此补丁)"
 
 #  译者:注意保持前导空格
-#: wt-status.c:929
+#: wt-status.c:967
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr "  (使用 \"git am --abort\" 恢复原有分支)"
 
-#: wt-status.c:989 wt-status.c:1006
+#: wt-status.c:1027 wt-status.c:1044
 #, c-format
 msgid "You are currently rebasing branch '%s' on '%s'."
 msgstr "您在执行将分支 '%s' 变基到 '%s' 的操作。"
 
-#: wt-status.c:994 wt-status.c:1011
+#: wt-status.c:1032 wt-status.c:1049
 msgid "You are currently rebasing."
 msgstr "您在执行变基操作。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:997
+#: wt-status.c:1035
 msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr "  (解决冲突,然后运行 \"git rebase --continue\")"
 
 #  译者:注意保持前导空格
-#: wt-status.c:999
+#: wt-status.c:1037
 msgid "  (use \"git rebase --skip\" to skip this patch)"
 msgstr "  (使用 \"git rebase --skip\" 跳过此补丁)"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1001
+#: wt-status.c:1039
 msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr "  (使用 \"git rebase --abort\" 以检出原有分支)"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1014
+#: wt-status.c:1052
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr "  (所有冲突已解决:运行 \"git rebase --continue\")"
 
-#: wt-status.c:1018
+#: wt-status.c:1056
 #, c-format
 msgid ""
 "You are currently splitting a commit while rebasing branch '%s' on '%s'."
 msgstr "您在执行将分支 '%s' 变基到 '%s' 的操作时拆分提交。"
 
-#: wt-status.c:1023
+#: wt-status.c:1061
 msgid "You are currently splitting a commit during a rebase."
 msgstr "您在执行变基操作时拆分提交。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1026
+#: wt-status.c:1064
 msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr "  (一旦您工作目录提交干净后,运行 \"git rebase --continue\")"
 
-#: wt-status.c:1030
+#: wt-status.c:1068
 #, c-format
 msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr "您在执行将分支 '%s' 变基到 '%s' 的操作时编辑提交。"
 
-#: wt-status.c:1035
+#: wt-status.c:1073
 msgid "You are currently editing a commit during a rebase."
 msgstr "您在执行变基操作时编辑提交。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1038
+#: wt-status.c:1076
 msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr "  (使用 \"git commit --amend\" 修补当前提交)"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1040
+#: wt-status.c:1078
 msgid ""
 "  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr "  (当您对您的修改满意后执行 \"git rebase --continue\")"
 
-#: wt-status.c:1050
+#: wt-status.c:1088
 #, c-format
 msgid "You are currently cherry-picking commit %s."
 msgstr "您在执行拣选提交 %s 的操作。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1055
+#: wt-status.c:1093
 msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
 msgstr "  (解决冲突并运行 \"git cherry-pick --continue\")"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1058
+#: wt-status.c:1096
 msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr "  (所有冲突已解决:运行 \"git cherry-pick --continue\")"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1060
+#: wt-status.c:1098
 msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr "  (使用 \"git cherry-pick --abort\" 以取消拣选操作)"
 
-#: wt-status.c:1069
+#: wt-status.c:1107
 #, c-format
 msgid "You are currently reverting commit %s."
 msgstr "您在执行反转提交 %s 的操作。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1074
+#: wt-status.c:1112
 msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr "  (解决冲突并运行 \"git revert --continue\")"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1077
+#: wt-status.c:1115
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr "  (所有冲突已解决:运行 \"git revert --continue\")"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1079
+#: wt-status.c:1117
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr "  (使用 \"git revert --abort\" 以取消反转提交操作)"
 
-#: wt-status.c:1090
+#: wt-status.c:1128
 #, c-format
 msgid "You are currently bisecting, started from branch '%s'."
 msgstr "您在执行从分支 '%s' 开始的二分查找操作。"
 
-#: wt-status.c:1094
+#: wt-status.c:1132
 msgid "You are currently bisecting."
 msgstr "您在执行二分查找操作。"
 
 #  译者:注意保持前导空格
-#: wt-status.c:1097
+#: wt-status.c:1135
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr "  (使用 \"git bisect reset\" 以回到原有分支)"
 
-#: wt-status.c:1272
+#: wt-status.c:1310
 msgid "On branch "
 msgstr "位于分支 "
 
-#: wt-status.c:1279
+#: wt-status.c:1317
 msgid "rebase in progress; onto "
 msgstr "变基操作正在进行中;至 "
 
-#: wt-status.c:1286
+#: wt-status.c:1324
 msgid "HEAD detached at "
 msgstr "头指针分离于 "
 
-#: wt-status.c:1288
+#: wt-status.c:1326
 msgid "HEAD detached from "
 msgstr "头指针分离自 "
 
-#: wt-status.c:1291
+#: wt-status.c:1329
 msgid "Not currently on any branch."
 msgstr "当前不在任何分支上。"
 
-#: wt-status.c:1308
+#: wt-status.c:1346
 msgid "Initial commit"
 msgstr "初始提交"
 
-#: wt-status.c:1322
+#: wt-status.c:1360
 msgid "Untracked files"
 msgstr "未跟踪的文件"
 
-#: wt-status.c:1324
+#: wt-status.c:1362
 msgid "Ignored files"
 msgstr "忽略的文件"
 
-#: wt-status.c:1328
+#: wt-status.c:1366
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1803,316 +1797,234 @@ msgstr ""
 "耗费了 %.2f 秒以枚举未跟踪的文件。'status -uno' 也许能提高速度,\n"
 "但您需要小心不要忘了添加新文件(参见 'git help status')。"
 
-#: wt-status.c:1334
+#: wt-status.c:1372
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr "未跟踪的文件没有列出%s"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1336
+#: wt-status.c:1374
 msgid " (use -u option to show untracked files)"
 msgstr "(使用 -u 参数显示未跟踪的文件)"
 
-#: wt-status.c:1342
+#: wt-status.c:1380
 msgid "No changes"
 msgstr "没有修改"
 
-#: wt-status.c:1347
+#: wt-status.c:1385
 #, 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:1350
+#: wt-status.c:1388
 #, c-format
 msgid "no changes added to commit\n"
 msgstr "修改尚未加入提交\n"
 
-#: wt-status.c:1353
+#: wt-status.c:1391
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
 "track)\n"
 msgstr "提交为空,但是存在尚未跟踪的文件(使用 \"git add\" 建立跟踪)\n"
 
-#: wt-status.c:1356
+#: wt-status.c:1394
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
 msgstr "提交为空,但是存在尚未跟踪的文件\n"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1359
+#: wt-status.c:1397
 #, c-format
 msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr "无文件要提交(创建/拷贝文件并使用 \"git add\" 建立跟踪)\n"
 
-#: wt-status.c:1362 wt-status.c:1367
+#: wt-status.c:1400 wt-status.c:1405
 #, c-format
 msgid "nothing to commit\n"
 msgstr "无文件要提交\n"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1365
+#: wt-status.c:1403
 #, c-format
 msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr "无文件要提交(使用 -u 显示未跟踪的文件)\n"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1369
+#: wt-status.c:1407
 #, c-format
 msgid "nothing to commit, working directory clean\n"
 msgstr "无文件要提交,干净的工作区\n"
 
-#: wt-status.c:1478
+#: wt-status.c:1516
 msgid "HEAD (no branch)"
 msgstr "HEAD(非分支)"
 
 #  译者:注意保持句尾空格
-#: wt-status.c:1484
+#: wt-status.c:1522
 msgid "Initial commit on "
 msgstr "初始提交于 "
 
-#: wt-status.c:1514
+#: wt-status.c:1554
 msgid "gone"
 msgstr "丢失"
 
 #  译者:注意保持句尾空格
-#: wt-status.c:1516
+#: wt-status.c:1556 wt-status.c:1564
 msgid "behind "
 msgstr "落后 "
 
-#  译者:注意保持句尾空格
-#: wt-status.c:1519 wt-status.c:1522
-msgid "ahead "
-msgstr "领先 "
-
-#  译者:注意保持句尾空格
-#: wt-status.c:1524
-msgid ", behind "
-msgstr ",落后 "
-
 #: compat/precompose_utf8.c:55 builtin/clone.c:356
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "无法删除 '%s'"
 
-#: builtin/add.c:20
+#: builtin/add.c:21
 msgid "git add [options] [--] <pathspec>..."
 msgstr "git add [选项] [--] <路径规则>..."
 
-#  译者:字符串首行行首要添加“warning: ”字串,故此首行要较其余行短
-#.
-#. * To be consistent with "git add -p" and most Git
-#. * commands, we should default to being tree-wide, but
-#. * this is not the original behavior and can't be
-#. * changed until users trained themselves not to type
-#. * "git add -u" or "git add -A". For now, we warn and
-#. * keep the old behavior. Later, the behavior can be changed
-#. * to tree-wide, keeping the warning for a while, and
-#. * eventually we can drop the warning.
-#.
-#: builtin/add.c:58
-#, c-format
-msgid ""
-"The behavior of 'git add %s (or %s)' with no path argument from a\n"
-"subdirectory of the tree will change in Git 2.0 and should not be used "
-"anymore.\n"
-"To add content for the whole tree, run:\n"
-"\n"
-"  git add %s :/\n"
-"  (or git add %s :/)\n"
-"\n"
-"To restrict the command to the current directory, run:\n"
-"\n"
-"  git add %s .\n"
-"  (or git add %s .)\n"
-"\n"
-"With the current Git version, the command is restricted to the current "
-"directory.\n"
-msgstr ""
-"在 Git 2.0 版本,位于一个子目录下不带任何路径参数地执行命令\n"
-"'git add %s (或 %s)' 的行为将被改变,不要再继续使用了。\n"
-"如果要添加整个目录树的内容,执行:\n"
-"\n"
-"  git add %s :/\n"
-"  (或 git add %s :/)\n"
-"\n"
-"如果要限制该命令只作用于当前目录,执行:\n"
-"\n"
-"  git add %s .\n"
-"  (或 git add %s .)\n"
-"\n"
-"对于当前版本的 Git,这条命令只作用于当前目录。\n"
-
-#: builtin/add.c:100
-#, c-format
-msgid ""
-"You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
-"whose behaviour will change in Git 2.0 with respect to paths you removed.\n"
-"Paths like '%s' that are\n"
-"removed from your working tree are ignored with this version of Git.\n"
-"\n"
-"* 'git add --ignore-removal <pathspec>', which is the current default,\n"
-"  ignores paths you removed from your working tree.\n"
-"\n"
-"* 'git add --all <pathspec>' will let you also record the removals.\n"
-"\n"
-"Run 'git status' to check the paths you removed from your working tree.\n"
-msgstr ""
-"您在运行 'git add' 时没有指定 '-A (--all)' 或 '--ignore-removal',\n"
-"针对其中本地移除路径的行为将在 Git 2.0 版本库发生变化。\n"
-"像本地工作区移除的路径 '%s'\n"
-"在此版本的 Git 中被忽略。\n"
-"\n"
-"* 'git add --ignore-removal <路径规则>',是当前版本的默认操作,\n"
-"  忽略您本地工作区中移除的文件。\n"
-"\n"
-"* 'git add --all <路径规则>' 将让您同时对删除操作进行记录。\n"
-"\n"
-"运行 'git status' 来检查您本地工作区中移除的路径。\n"
-
-#: builtin/add.c:144
+#: builtin/add.c:64
 #, c-format
 msgid "unexpected diff status %c"
 msgstr "意外的差异状态 %c"
 
-#: builtin/add.c:149 builtin/commit.c:260
+#: builtin/add.c:69 builtin/commit.c:261
 msgid "updating files failed"
 msgstr "更新文件失败"
 
-#: builtin/add.c:163
+#: builtin/add.c:79
 #, c-format
 msgid "remove '%s'\n"
 msgstr "删除 '%s'\n"
 
-#: builtin/add.c:237
+#: builtin/add.c:133
 msgid "Unstaged changes after refreshing the index:"
 msgstr "刷新索引之后尚未被暂存的变更:"
 
-#: builtin/add.c:299
+#: builtin/add.c:193
 msgid "Could not read the index"
 msgstr "不能读取索引"
 
-#: builtin/add.c:310
+#: builtin/add.c:204
 #, c-format
 msgid "Could not open '%s' for writing."
 msgstr "不能打开 '%s' 以写入。"
 
-#: builtin/add.c:314
+#: builtin/add.c:208
 msgid "Could not write patch"
 msgstr "不能生成补丁"
 
-#: builtin/add.c:319
+#: builtin/add.c:213
 #, c-format
 msgid "Could not stat '%s'"
 msgstr "不能查看文件状态 '%s'"
 
-#: builtin/add.c:321
+#: builtin/add.c:215
 msgid "Empty patch. Aborted."
 msgstr "空补丁。异常终止。"
 
-#: builtin/add.c:327
+#: builtin/add.c:221
 #, c-format
 msgid "Could not apply '%s'"
 msgstr "不能应用 '%s'"
 
-#: builtin/add.c:337
+#: builtin/add.c:231
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr "下列路径根据您的一个 .gitignore 文件而被忽略:\n"
 
-#: builtin/add.c:354 builtin/clean.c:875 builtin/fetch.c:93 builtin/mv.c:70
-#: builtin/prune-packed.c:77 builtin/push.c:506 builtin/remote.c:1344
+#: 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/rm.c:269
 msgid "dry run"
 msgstr "演习"
 
-#: builtin/add.c:355 builtin/apply.c:4410 builtin/check-ignore.c:19
-#: builtin/commit.c:1249 builtin/count-objects.c:95 builtin/fsck.c:612
+#: 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
 msgid "be verbose"
 msgstr "冗长输出"
 
-#: builtin/add.c:357
+#: builtin/add.c:251
 msgid "interactive picking"
 msgstr "交互式拣选"
 
-#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
 msgid "select hunks interactively"
 msgstr "交互式挑选数据块"
 
-#: builtin/add.c:359
+#: builtin/add.c:253
 msgid "edit current diff and apply"
 msgstr "编辑当前差异并应用"
 
-#: builtin/add.c:360
+#: builtin/add.c:254
 msgid "allow adding otherwise ignored files"
 msgstr "允许添加忽略的文件"
 
-#: builtin/add.c:361
+#: builtin/add.c:255
 msgid "update tracked files"
 msgstr "更新已跟踪的文件"
 
-#: builtin/add.c:362
+#: builtin/add.c:256
 msgid "record only the fact that the path will be added later"
 msgstr "只记录,该路径稍后再添加"
 
-#: builtin/add.c:363
+#: builtin/add.c:257
 msgid "add changes from all tracked and untracked files"
 msgstr "添加所有改变的已跟踪文件和未跟踪文件"
 
-#. takes no arguments
-#: builtin/add.c:366
+#: builtin/add.c:260
 msgid "ignore paths removed in the working tree (same as --no-all)"
 msgstr "忽略工作区中移除的路径(和 --no-all 相同)"
 
-#: builtin/add.c:368
+#: builtin/add.c:262
 msgid "don't add, only refresh the index"
 msgstr "不添加,只刷新索引"
 
-#: builtin/add.c:369
+#: builtin/add.c:263
 msgid "just skip files which cannot be added because of errors"
 msgstr "跳过因出错不能添加的文件"
 
-#: builtin/add.c:370
+#: builtin/add.c:264
 msgid "check if - even missing - files are ignored in dry run"
 msgstr "检查在演习模式下文件(即使不存在)是否被忽略"
 
-#: builtin/add.c:392
+#: builtin/add.c:286
 #, c-format
 msgid "Use -f if you really want to add them.\n"
 msgstr "使用 -f 参数如果您确实要添加它们。\n"
 
-#: builtin/add.c:393
+#: builtin/add.c:287
 msgid "no files added"
 msgstr "没有文件被添加"
 
-#: builtin/add.c:399
+#: builtin/add.c:293
 msgid "adding files failed"
 msgstr "添加文件失败"
 
-#: builtin/add.c:438
+#: builtin/add.c:330
 msgid "-A and -u are mutually incompatible"
 msgstr "-A 和 -u 选项互斥"
 
-#: builtin/add.c:456
+#: builtin/add.c:337
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr "选项 --ignore-missing 只能和 --dry-run 同时使用"
 
-#: builtin/add.c:486
+#: builtin/add.c:358
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "没有指定文件,也没有文件被添加。\n"
 
-#: builtin/add.c:487
+#: builtin/add.c:359
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "也许您想要执行 'git add .'?\n"
 
-#: builtin/add.c:492 builtin/check-ignore.c:172 builtin/clean.c:919
-#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:224 builtin/rm.c:299
+#: 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
 msgid "index file corrupt"
 msgstr "索引文件损坏"
 
-#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432
+#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
 msgid "Unable to write new index file"
 msgstr "无法写入新索引文件"
 
@@ -2219,7 +2131,6 @@ msgstr "** 警告:文件 %s 成为空文件但并未删除"
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "二进制补丁在第 %d 行损坏:%.*s"
 
-#. there has to be one hunk (forward hunk)
 #: builtin/apply.c:1900
 #, c-format
 msgid "unrecognized binary patch at line %d"
@@ -2360,7 +2271,7 @@ msgstr "%s:补丁未应用"
 msgid "Checking patch %s..."
 msgstr "检查补丁 %s..."
 
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127
+#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "对路径 '%s' 的 make_cache_entry 操作失败"
@@ -2409,7 +2320,6 @@ msgstr "成功应用补丁 %s。"
 msgid "internal error"
 msgstr "内部错误"
 
-#. Say this even without --verbose
 #: builtin/apply.c:4043
 #, c-format
 msgid "Applying patch %%s with %d reject..."
@@ -2501,7 +2411,7 @@ msgstr "如果一个补丁不能应用则尝试三路合并"
 msgid "build a temporary index based on embedded index information"
 msgstr "创建一个临时索引基于嵌入的索引信息"
 
-#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452
+#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
 msgid "paths are separated with NUL character"
 msgstr "路径以 NUL 字符分隔"
 
@@ -2731,6 +2641,16 @@ msgstr "n,m"
 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:2347
+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]"
@@ -2971,8 +2891,9 @@ 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:1460 builtin/commit.c:1461
-#: builtin/commit.c:1462 builtin/commit.c:1463 builtin/tag.c:468
+#: 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
 msgid "commit"
 msgstr "提交"
 
@@ -3153,43 +3074,43 @@ msgstr "需要一个版本库来创建包。"
 msgid "Need a repository to unbundle."
 msgstr "需要一个版本库来解包。"
 
-#: builtin/cat-file.c:328
+#: builtin/cat-file.c:331
 msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
 msgstr "git cat-file (-t|-s|-e|-p|<类型>|--textconv) <对象>"
 
-#: builtin/cat-file.c:329
+#: builtin/cat-file.c:332
 msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
 msgstr "git cat-file (--batch|--batch-check) < <对象列表>"
 
-#: builtin/cat-file.c:366
+#: builtin/cat-file.c:369
 msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr "<类型> 可以是其中之一:blob、tree、commit、tag"
 
-#: builtin/cat-file.c:367
+#: builtin/cat-file.c:370
 msgid "show object type"
 msgstr "显示对象类型"
 
-#: builtin/cat-file.c:368
+#: builtin/cat-file.c:371
 msgid "show object size"
 msgstr "显示对象大小"
 
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:373
 msgid "exit with zero when there's no error"
 msgstr "当没有错误时退出并返回零"
 
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:374
 msgid "pretty-print object's content"
 msgstr "美观地打印对象的内容"
 
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:376
 msgid "for blob objects, run textconv on object's content"
 msgstr "对于数据(blob)对象,对其内容执行 textconv"
 
-#: builtin/cat-file.c:375
+#: builtin/cat-file.c:378
 msgid "show info and content of objects fed from the standard input"
 msgstr "显示从标准输入提供的对象的信息和内容"
 
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:381
 msgid "show info about objects fed from the standard input"
 msgstr "显示从标准输入提供的对象的信息"
 
@@ -3217,7 +3138,7 @@ msgstr "从标准输入读出文件名"
 msgid "terminate input and output records by a NUL character"
 msgstr "输入和输出的记录使用 NUL 字符终结"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
 msgid "suppress progress reporting"
 msgstr "不显示进度报告"
 
@@ -3368,61 +3289,60 @@ msgstr "'%s' 不能和 %s 同时使用"
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr "不能同时更新路径并切换到分支'%s'。"
 
-#: builtin/checkout.c:261 builtin/checkout.c:451
+#: builtin/checkout.c:261 builtin/checkout.c:450
 msgid "corrupt index file"
 msgstr "损坏的索引文件"
 
-#: builtin/checkout.c:322 builtin/checkout.c:329
+#: builtin/checkout.c:321 builtin/checkout.c:328
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "路径 '%s' 未合并"
 
-#: builtin/checkout.c:473
+#: builtin/checkout.c:472
 msgid "you need to resolve your current index first"
 msgstr "您需要先解决当前索引的冲突"
 
-#: builtin/checkout.c:594
+#: builtin/checkout.c:593
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr "不能对 '%s' 执行 reflog 操作\n"
 
-#: builtin/checkout.c:632
+#: builtin/checkout.c:631
 msgid "HEAD is now at"
 msgstr "HEAD 目前位于"
 
-#: builtin/checkout.c:639
+#: builtin/checkout.c:638
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "重置分支 '%s'\n"
 
-#: builtin/checkout.c:642
+#: builtin/checkout.c:641
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "已经位于 '%s'\n"
 
-#: builtin/checkout.c:646
+#: builtin/checkout.c:645
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "切换并重置分支 '%s'\n"
 
-#: builtin/checkout.c:648 builtin/checkout.c:1033
+#: builtin/checkout.c:647 builtin/checkout.c:1032
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "切换到一个新分支 '%s'\n"
 
-#: builtin/checkout.c:650
+#: builtin/checkout.c:649
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "切换到分支 '%s'\n"
 
 #  译者:注意保持前导空格
-#: builtin/checkout.c:706
+#: builtin/checkout.c:705
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... 及其它 %d 个。\n"
 
-#. The singular version
-#: builtin/checkout.c:712
+#: builtin/checkout.c:711
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -3443,7 +3363,7 @@ msgstr[1] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:730
+#: builtin/checkout.c:729
 #, c-format
 msgid ""
 "If you want to keep them by creating a new branch, this may be a good time\n"
@@ -3458,140 +3378,139 @@ msgstr ""
 " git branch new_branch_name %s\n"
 "\n"
 
-#: builtin/checkout.c:760
+#: builtin/checkout.c:759
 msgid "internal error in revision walk"
 msgstr "在版本遍历时遇到内部错误"
 
-#: builtin/checkout.c:764
+#: builtin/checkout.c:763
 msgid "Previous HEAD position was"
 msgstr "之前的 HEAD 位置是"
 
-#: builtin/checkout.c:791 builtin/checkout.c:1028
+#: builtin/checkout.c:790 builtin/checkout.c:1027
 msgid "You are on a branch yet to be born"
 msgstr "您位于一个尚未初始化的分支"
 
-#: builtin/checkout.c:935
+#: builtin/checkout.c:934
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "只要一个引用,却给出了 %d 个"
 
-#: builtin/checkout.c:974
+#: builtin/checkout.c:973
 #, c-format
 msgid "invalid reference: %s"
 msgstr "无效引用:%s"
 
-#. case (1): want a tree
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "引用不是一个树:%s"
 
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
 msgid "paths cannot be used with switching branches"
 msgstr "路径不能和切换分支同时使用"
 
-#: builtin/checkout.c:1045 builtin/checkout.c:1049
+#: builtin/checkout.c:1044 builtin/checkout.c:1048
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' 不能和切换分支同时使用"
 
-#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1052 builtin/checkout.c:1055 builtin/checkout.c:1060
+#: builtin/checkout.c:1063
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' 不能和 '%s' 同时使用"
 
-#: builtin/checkout.c:1069
+#: builtin/checkout.c:1068
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "不能切换分支到一个非提交 '%s'"
 
-#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
 #: builtin/remote.c:159 builtin/remote.c:161
 msgid "branch"
 msgstr "分支"
 
-#: builtin/checkout.c:1092
+#: builtin/checkout.c:1091
 msgid "create and checkout a new branch"
 msgstr "创建并检出一个新的分支"
 
-#: builtin/checkout.c:1094
+#: builtin/checkout.c:1093
 msgid "create/reset and checkout a branch"
 msgstr "创建/重置并检出一个分支"
 
-#: builtin/checkout.c:1095
+#: builtin/checkout.c:1094
 msgid "create reflog for new branch"
 msgstr "为新的分支创建引用日志"
 
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
 msgid "detach the HEAD at named commit"
 msgstr "成为指向该提交的分离头指针"
 
-#: builtin/checkout.c:1097
+#: builtin/checkout.c:1096
 msgid "set upstream info for new branch"
 msgstr "为新的分支设置上游信息"
 
-#: builtin/checkout.c:1099
-msgid "new branch"
+#: builtin/checkout.c:1098
+msgid "new-branch"
 msgstr "新分支"
 
-#: builtin/checkout.c:1099
+#: builtin/checkout.c:1098
 msgid "new unparented branch"
 msgstr "新的没有父提交的分支"
 
-#: builtin/checkout.c:1100
+#: builtin/checkout.c:1099
 msgid "checkout our version for unmerged files"
 msgstr "对尚未合并的文件检出我们的版本"
 
-#: builtin/checkout.c:1102
+#: builtin/checkout.c:1101
 msgid "checkout their version for unmerged files"
 msgstr "对尚未合并的文件检出他们的版本"
 
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1103
 msgid "force checkout (throw away local modifications)"
 msgstr "强制检出(丢弃本地修改)"
 
-#: builtin/checkout.c:1105
+#: builtin/checkout.c:1104
 msgid "perform a 3-way merge with the new branch"
 msgstr "和新的分支执行三路合并"
 
-#: builtin/checkout.c:1106 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:225
 msgid "update ignored files (default)"
 msgstr "更新忽略的文件(默认)"
 
-#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248
+#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
 msgid "style"
 msgstr "风格"
 
-#: builtin/checkout.c:1108
+#: builtin/checkout.c:1107
 msgid "conflict style (merge or diff3)"
 msgstr "冲突输出风格(merge 或 diff3)"
 
-#: builtin/checkout.c:1111
+#: builtin/checkout.c:1110
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "对路径不做稀疏检出的限制"
 
-#: builtin/checkout.c:1113
+#: builtin/checkout.c:1112
 msgid "second guess 'git checkout no-such-branch'"
 msgstr "再者猜测'git checkout no-such-branch'"
 
-#: builtin/checkout.c:1136
+#: builtin/checkout.c:1135
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b、-B 和 --orphan 是互斥的"
 
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
 msgid "--track needs a branch name"
 msgstr "--track 需要一个分支名"
 
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1159
 msgid "Missing branch name; try -b"
 msgstr "缺少分支名;尝试 -b"
 
-#: builtin/checkout.c:1197
+#: builtin/checkout.c:1196
 msgid "invalid path specification"
 msgstr "无效的路径规格"
 
-#: builtin/checkout.c:1204
+#: builtin/checkout.c:1203
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3600,12 +3519,12 @@ msgstr ""
 "不能同时更新路径并切换到分支'%s'。\n"
 "您是想要检出 '%s' 但其未能解析为提交么?"
 
-#: builtin/checkout.c:1209
+#: builtin/checkout.c:1208
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout:--detach 不能接收路径参数 '%s'"
 
-#: builtin/checkout.c:1213
+#: builtin/checkout.c:1212
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -3643,7 +3562,7 @@ msgstr "将忽略版本库 %s\n"
 msgid "failed to remove %s"
 msgstr "无法删除 %s"
 
-#: builtin/clean.c:294
+#: builtin/clean.c:295
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -3655,7 +3574,7 @@ msgstr ""
 "foo        - 通过标题选择一个选项\n"
 "           - (空)什么也不选择"
 
-#: builtin/clean.c:298
+#: builtin/clean.c:299
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -3675,35 +3594,35 @@ msgstr ""
 "*          - 选择所有选项\n"
 "           - (空)结束选择"
 
-#: builtin/clean.c:516
+#: builtin/clean.c:517
 #, c-format
 msgid "Huh (%s)?"
 msgstr "嗯(%s)?"
 
-#: builtin/clean.c:659
+#: builtin/clean.c:660
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "输入模版以排除条目>> "
 
-#: builtin/clean.c:696
+#: builtin/clean.c:697
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "警告:无法找到和 %s 匹配的条目"
 
-#: builtin/clean.c:717
+#: builtin/clean.c:718
 msgid "Select items to delete"
 msgstr "选择要删除的条目"
 
-#: builtin/clean.c:757
+#: builtin/clean.c:758
 #, c-format
 msgid "remove %s? "
 msgstr "删除 %s?"
 
-#: builtin/clean.c:782
+#: builtin/clean.c:783
 msgid "Bye."
 msgstr "再见。"
 
-#: builtin/clean.c:790
+#: builtin/clean.c:791
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -3721,71 +3640,71 @@ msgstr ""
 "help                - 显示本帮助\n"
 "?                   - 显示如何在提示符下选择的帮助"
 
-#: builtin/clean.c:817
+#: builtin/clean.c:818
 msgid "*** Commands ***"
 msgstr "*** 命令 ***"
 
-#: builtin/clean.c:818
+#: builtin/clean.c:819
 msgid "What now"
 msgstr "请选择"
 
-#: builtin/clean.c:826
+#: builtin/clean.c:827
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "将删除如下条目:"
 msgstr[1] "将删除如下条目:"
 
-#: builtin/clean.c:843
+#: builtin/clean.c:844
 msgid "No more files to clean, exiting."
 msgstr "没有要清理的文件,退出。"
 
-#: builtin/clean.c:874
+#: builtin/clean.c:875
 msgid "do not print names of files removed"
 msgstr "不打印删除文件的名称"
 
-#: builtin/clean.c:876
+#: builtin/clean.c:877
 msgid "force"
 msgstr "强制"
 
-#: builtin/clean.c:877
+#: builtin/clean.c:878
 msgid "interactive cleaning"
 msgstr "交互式清除"
 
-#: builtin/clean.c:879
+#: builtin/clean.c:880
 msgid "remove whole directories"
 msgstr "删除整个目录"
 
-#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:718
-#: builtin/ls-files.c:483 builtin/name-rev.c:314 builtin/show-ref.c:185
+#: 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
 msgid "pattern"
 msgstr "模式"
 
-#: builtin/clean.c:881
+#: builtin/clean.c:882
 msgid "add <pattern> to ignore rules"
 msgstr "添加<模式>到忽略规则"
 
-#: builtin/clean.c:882
+#: builtin/clean.c:883
 msgid "remove ignored files, too"
 msgstr "也删除忽略的文件"
 
-#: builtin/clean.c:884
+#: builtin/clean.c:885
 msgid "remove only ignored files"
 msgstr "只删除忽略的文件"
 
-#: builtin/clean.c:902
+#: builtin/clean.c:903
 msgid "-x and -X cannot be used together"
 msgstr "-x 和 -X 不能同时使用"
 
-#: builtin/clean.c:906
+#: builtin/clean.c:907
 msgid ""
-"clean.requireForce set to true and neither -i, -n nor -f given; refusing to "
+"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:909
+#: builtin/clean.c:910
 msgid ""
-"clean.requireForce defaults to true and neither -i, -n nor -f given; "
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
 msgstr ""
 "clean.requireForce 默认为 true 且未提供 -i、-n 或 -f 选项,拒绝执行清理动作"
@@ -3795,7 +3714,7 @@ msgid "git clone [options] [--] <repo> [<dir>]"
 msgstr "git clone [选项] [--] <版本库> [<路径>]"
 
 #: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:521
+#: builtin/push.c:504
 msgid "force progress reporting"
 msgstr "强制显示进度报告"
 
@@ -3803,7 +3722,7 @@ msgstr "强制显示进度报告"
 msgid "don't create a checkout"
 msgstr "不创建一个检出"
 
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
 msgid "create a bare repository"
 msgstr "创建一个裸版本库"
 
@@ -3827,11 +3746,11 @@ msgstr "设置为共享版本库"
 msgid "initialize submodules in the clone"
 msgstr "在克隆时初始化子模组"
 
-#: builtin/clone.c:82 builtin/init-db.c:485
+#: builtin/clone.c:82 builtin/init-db.c:483
 msgid "template-directory"
 msgstr "模板目录"
 
-#: builtin/clone.c:83 builtin/init-db.c:486
+#: builtin/clone.c:83 builtin/init-db.c:484
 msgid "directory from which templates will be used"
 msgstr "模板目录将被使用"
 
@@ -3855,7 +3774,7 @@ msgstr "检出<分支>而不是远程HEAD"
 msgid "path to git-upload-pack on the remote"
 msgstr "远程 git-upload-pack 路径"
 
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663
+#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
 msgid "depth"
 msgstr "深度"
 
@@ -3867,11 +3786,11 @@ msgstr "创建一个指定深度的浅克隆"
 msgid "clone only one branch, HEAD or --branch"
 msgstr "只克隆一个分支、HEAD 或 --branch"
 
-#: builtin/clone.c:96 builtin/init-db.c:494
+#: builtin/clone.c:96 builtin/init-db.c:492
 msgid "gitdir"
 msgstr "git目录"
 
-#: builtin/clone.c:97 builtin/init-db.c:495
+#: builtin/clone.c:97 builtin/init-db.c:493
 msgid "separate git dir from working tree"
 msgstr "git目录和工作区分离"
 
@@ -4154,67 +4073,67 @@ msgstr ""
 "然后执行 \"git cherry-pick --continue\" 继续对其余提交执行拣选\n"
 "操作。\n"
 
-#: builtin/commit.c:287
+#: builtin/commit.c:288
 msgid "failed to unpack HEAD tree object"
 msgstr "无法解包 HEAD 树对象"
 
-#: builtin/commit.c:329
+#: builtin/commit.c:330
 msgid "unable to create temporary index"
 msgstr "不能创建临时索引"
 
-#: builtin/commit.c:335
+#: builtin/commit.c:336
 msgid "interactive add failed"
 msgstr "交互式添加失败"
 
-#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439
+#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
 msgid "unable to write new_index file"
 msgstr "无法写 new_index 文件"
 
-#: builtin/commit.c:420
+#: builtin/commit.c:421
 msgid "cannot do a partial commit during a merge."
 msgstr "在合并过程中不能做部分提交。"
 
-#: builtin/commit.c:422
+#: builtin/commit.c:423
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "在拣选过程中不能做部分提交。"
 
-#: builtin/commit.c:432
+#: builtin/commit.c:433
 msgid "cannot read the index"
 msgstr "无法读取索引"
 
-#: builtin/commit.c:452
+#: builtin/commit.c:453
 msgid "unable to write temporary index file"
 msgstr "无法写临时索引文件"
 
-#: builtin/commit.c:543 builtin/commit.c:549
+#: builtin/commit.c:544 builtin/commit.c:550
 #, c-format
 msgid "invalid commit: %s"
 msgstr "无效的提交:%s"
 
-#: builtin/commit.c:571
+#: builtin/commit.c:572
 msgid "malformed --author parameter"
 msgstr "非法的 --author 参数"
 
-#: builtin/commit.c:591
+#: builtin/commit.c:592
 #, c-format
 msgid "Malformed ident string: '%s'"
 msgstr "非法的身份字符串:'%s'"
 
-#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007
+#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "不能查询提交 %s"
 
-#: builtin/commit.c:642 builtin/shortlog.c:273
+#: builtin/commit.c:641 builtin/shortlog.c:273
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(正从标准输入中读取日志信息)\n"
 
-#: builtin/commit.c:644
+#: builtin/commit.c:643
 msgid "could not read log from standard input"
 msgstr "不能从标准输入中读取日志信息"
 
-#: builtin/commit.c:648
+#: builtin/commit.c:647
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "不能读取日志文件 '%s'"
@@ -4240,7 +4159,7 @@ msgstr "不能读取 '%s'"
 msgid "could not write commit template"
 msgstr "不能写提交模版"
 
-#: builtin/commit.c:760
+#: builtin/commit.c:764
 #, c-format
 msgid ""
 "\n"
@@ -4254,7 +4173,7 @@ msgstr ""
 "\t%s\n"
 "然后重试。\n"
 
-#: builtin/commit.c:765
+#: builtin/commit.c:769
 #, c-format
 msgid ""
 "\n"
@@ -4268,7 +4187,7 @@ msgstr ""
 "\t%s\n"
 "然后重试。\n"
 
-#: builtin/commit.c:777
+#: builtin/commit.c:782
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4277,7 +4196,7 @@ msgstr ""
 "请为您的变更输入提交说明。以 '%c' 开始的行将被忽略,而一个空的提交\n"
 "说明将会终止提交。\n"
 
-#: builtin/commit.c:782
+#: builtin/commit.c:789
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -4288,355 +4207,355 @@ msgstr ""
 "也可以删除它们。一个空的提交说明将会终止提交。\n"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: builtin/commit.c:795
+#: builtin/commit.c:802
 #, c-format
 msgid "%sAuthor:    %s"
 msgstr "%s作者:     %s"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: builtin/commit.c:802
+#: builtin/commit.c:809
 #, c-format
 msgid "%sCommitter: %s"
 msgstr "%s提交者:   %s"
 
-#: builtin/commit.c:822
+#: builtin/commit.c:829
 msgid "Cannot read index"
 msgstr "无法读取索引"
 
-#: builtin/commit.c:865
+#: builtin/commit.c:872
 msgid "Error building trees"
 msgstr "无法创建树对象"
 
-#: builtin/commit.c:880 builtin/tag.c:359
+#: builtin/commit.c:887 builtin/tag.c:391
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "请使用 -m 或 -F 选项提供提交说明。\n"
 
-#: builtin/commit.c:982
+#: builtin/commit.c:989
 #, c-format
 msgid "No existing author found with '%s'"
 msgstr "没有找到匹配 '%s' 的作者"
 
-#: builtin/commit.c:997 builtin/commit.c:1237
+#: builtin/commit.c:1004 builtin/commit.c:1244
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "无效的未追踪文件参数 '%s'"
 
-#: builtin/commit.c:1034
+#: builtin/commit.c:1041
 msgid "--long and -z are incompatible"
 msgstr "--long 和 -z 选项不兼容"
 
-#: builtin/commit.c:1064
+#: builtin/commit.c:1071
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "同时使用 --reset-author 和 --author 没有意义"
 
-#: builtin/commit.c:1075
+#: builtin/commit.c:1080
 msgid "You have nothing to amend."
 msgstr "您没有可修补的提交。"
 
-#: builtin/commit.c:1078
+#: builtin/commit.c:1083
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "您正处于一个合并过程中 -- 无法修补提交。"
 
-#: builtin/commit.c:1080
+#: builtin/commit.c:1085
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "您正处于一个拣选过程中 -- 无法修补提交。"
 
-#: builtin/commit.c:1083
+#: builtin/commit.c:1088
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "选项 --squash 和 --fixup 不能同时使用"
 
-#: builtin/commit.c:1093
+#: builtin/commit.c:1098
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "只能用一个 -c/-C/-F/--fixup 选项。"
 
-#: builtin/commit.c:1095
+#: builtin/commit.c:1100
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "选项 -m 不能和 -c/-C/-F/--fixup 同时使用。"
 
-#: builtin/commit.c:1103
+#: builtin/commit.c:1108
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author 只能和 -C、-c 或 --amend 同时使用。"
 
-#: builtin/commit.c:1120
+#: builtin/commit.c:1125
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr "只能用一个 --include/--only/--all/--interactive/--patch 选项。"
 
-#: builtin/commit.c:1122
+#: builtin/commit.c:1127
 msgid "No paths with --include/--only does not make sense."
 msgstr "参数 --include/--only 不跟路径没有意义。"
 
-#: builtin/commit.c:1124
+#: builtin/commit.c:1129
 msgid "Clever... amending the last one with dirty index."
 msgstr "聪明... 在索引不干净下修补最后的提交。"
 
-#: builtin/commit.c:1126
-msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
-msgstr "æ\8c\87å®\9aäº\86æ\98\8eç¡®ç\9a\84è·¯å¾\84è\80\8c没æ\9c\89使ç\94¨ -i æ\88\96 -o é\80\89项ï¼\9b认为是 --only paths..."
+#: builtin/commit.c:1131
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
+msgstr "æ\8c\87å®\9aäº\86æ\98\8eç¡®ç\9a\84è·¯å¾\84è\80\8c没æ\9c\89使ç\94¨ -i æ\88\96 -o é\80\89项ï¼\8c认为是 --only paths..."
 
-#: builtin/commit.c:1136 builtin/tag.c:572
+#: builtin/commit.c:1143 builtin/tag.c:639
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "无效的清理模式 %s"
 
-#: builtin/commit.c:1141
+#: builtin/commit.c:1148
 msgid "Paths with -a does not make sense."
 msgstr "路径和 -a 选项同时使用没有意义。"
 
-#: builtin/commit.c:1251 builtin/commit.c:1482
+#: builtin/commit.c:1258 builtin/commit.c:1516
 msgid "show status concisely"
 msgstr "以简洁的格式显示状态"
 
-#: builtin/commit.c:1253 builtin/commit.c:1484
+#: builtin/commit.c:1260 builtin/commit.c:1518
 msgid "show branch information"
 msgstr "显示分支信息"
 
-#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507
+#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
 msgid "machine-readable output"
 msgstr "机器可读的输出"
 
-#: builtin/commit.c:1258 builtin/commit.c:1488
+#: builtin/commit.c:1265 builtin/commit.c:1522
 msgid "show status in long format (default)"
 msgstr "以长格式显示状态(默认)"
 
-#: builtin/commit.c:1261 builtin/commit.c:1491
+#: builtin/commit.c:1268 builtin/commit.c:1525
 msgid "terminate entries with NUL"
 msgstr "条目以NUL字符结尾"
 
-#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:459
+#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
+#: builtin/fast-export.c:677 builtin/tag.c:514
 msgid "mode"
 msgstr "模式"
 
-#: builtin/commit.c:1264 builtin/commit.c:1494
+#: builtin/commit.c:1271 builtin/commit.c:1528
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr "显示未跟踪的文件,“模式”的可选参数:all、normal、no。(默认:all)"
 
-#: builtin/commit.c:1267
+#: builtin/commit.c:1274
 msgid "show ignored files"
 msgstr "显示忽略的文件"
 
-#: builtin/commit.c:1268 parse-options.h:156
+#: builtin/commit.c:1275 parse-options.h:153
 msgid "when"
 msgstr "何时"
 
-#: builtin/commit.c:1269
+#: builtin/commit.c:1276
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
 msgstr ""
 "忽略子模组的更改,“何时”的可选参数:all、dirty、untracked。(默认:all)"
 
-#: builtin/commit.c:1271
+#: builtin/commit.c:1278
 msgid "list untracked files in columns"
 msgstr "以列的方式显示未跟踪的文件"
 
-#: builtin/commit.c:1340
+#: builtin/commit.c:1347
 msgid "couldn't look up newly created commit"
 msgstr "无法找到新创建的提交"
 
-#: builtin/commit.c:1342
+#: builtin/commit.c:1349
 msgid "could not parse newly created commit"
 msgstr "不能解析新创建的提交"
 
-#: builtin/commit.c:1383
+#: builtin/commit.c:1390
 msgid "detached HEAD"
 msgstr "分离头指针"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/commit.c:1385
+#: builtin/commit.c:1392
 msgid " (root-commit)"
 msgstr "(根提交)"
 
-#: builtin/commit.c:1452
+#: builtin/commit.c:1486
 msgid "suppress summary after successful commit"
 msgstr "提交成功后不显示概述信息"
 
-#: builtin/commit.c:1453
+#: builtin/commit.c:1487
 msgid "show diff in commit message template"
 msgstr "在提交说明模板里显示差异"
 
-#: builtin/commit.c:1455
+#: builtin/commit.c:1489
 msgid "Commit message options"
 msgstr "提交说明选项"
 
-#: builtin/commit.c:1456 builtin/tag.c:457
+#: builtin/commit.c:1490 builtin/tag.c:512
 msgid "read message from file"
 msgstr "从文件中读取提交说明"
 
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
 msgid "author"
 msgstr "作者"
 
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
 msgid "override author for commit"
 msgstr "提交时覆盖作者"
 
-#: builtin/commit.c:1458 builtin/gc.c:261
+#: builtin/commit.c:1492 builtin/gc.c:272
 msgid "date"
 msgstr "日期"
 
-#: builtin/commit.c:1458
+#: builtin/commit.c:1492
 msgid "override date for commit"
 msgstr "提交时覆盖日期"
 
-#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405
-#: builtin/notes.c:562 builtin/tag.c:455
+#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:510
 msgid "message"
 msgstr "说明"
 
-#: builtin/commit.c:1459
+#: builtin/commit.c:1493
 msgid "commit message"
 msgstr "提交说明"
 
-#: builtin/commit.c:1460
+#: builtin/commit.c:1494
 msgid "reuse and edit message from specified commit"
 msgstr "重用并编辑指定提交的提交说明"
 
-#: builtin/commit.c:1461
+#: builtin/commit.c:1495
 msgid "reuse message from specified commit"
 msgstr "重用指定提交的提交说明"
 
-#: builtin/commit.c:1462
+#: builtin/commit.c:1496
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr "使用 autosquash 格式的提交说明用以修正指定的提交"
 
-#: builtin/commit.c:1463
+#: builtin/commit.c:1497
 msgid "use autosquash formatted message to squash specified commit"
 msgstr "使用 autosquash 格式的提交说明用以压缩至指定的提交"
 
-#: builtin/commit.c:1464
+#: builtin/commit.c:1498
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "现在将该提交的作者改为我(和 -C/-c/--amend 参数共用)"
 
-#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "添加 Signed-off-by: 签名"
 
-#: builtin/commit.c:1466
+#: builtin/commit.c:1500
 msgid "use specified template file"
 msgstr "使用指定的模板文件"
 
-#: builtin/commit.c:1467
+#: builtin/commit.c:1501
 msgid "force edit of commit"
 msgstr "强制编辑提交"
 
 #  译者:可选值,不能翻译(或是原文中笔误,应为 mode)
-#: builtin/commit.c:1468
+#: builtin/commit.c:1502
 msgid "default"
 msgstr "default"
 
-#: builtin/commit.c:1468 builtin/tag.c:460
+#: builtin/commit.c:1502 builtin/tag.c:515
 msgid "how to strip spaces and #comments from message"
 msgstr "设置如何删除提交说明里的空格和#注释"
 
-#: builtin/commit.c:1469
+#: builtin/commit.c:1503
 msgid "include status in commit message template"
 msgstr "在提交说明模板里包含状态信息"
 
-#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461
-msgid "key id"
-msgstr "key id"
+#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:516
+msgid "key-id"
+msgstr "key-id"
 
-#: builtin/commit.c:1471 builtin/merge.c:224
+#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "GPG 提交签名"
 
-#. end commit message options
-#: builtin/commit.c:1474
+#: builtin/commit.c:1508
 msgid "Commit contents options"
 msgstr "提交内容选项"
 
-#: builtin/commit.c:1475
+#: builtin/commit.c:1509
 msgid "commit all changed files"
 msgstr "提交所有改动的文件"
 
-#: builtin/commit.c:1476
+#: builtin/commit.c:1510
 msgid "add specified files to index for commit"
 msgstr "添加指定的文件到索引区等待提交"
 
-#: builtin/commit.c:1477
+#: builtin/commit.c:1511
 msgid "interactively add files"
 msgstr "交互式添加文件"
 
-#: builtin/commit.c:1478
+#: builtin/commit.c:1512
 msgid "interactively add changes"
 msgstr "交互式添加变更"
 
-#: builtin/commit.c:1479
+#: builtin/commit.c:1513
 msgid "commit only specified files"
 msgstr "只提交指定的文件"
 
-#: builtin/commit.c:1480
+#: builtin/commit.c:1514
 msgid "bypass pre-commit hook"
 msgstr "绕过 pre-commit 钩子"
 
-#: builtin/commit.c:1481
+#: builtin/commit.c:1515
 msgid "show what would be committed"
 msgstr "显示将要提交的内容"
 
-#: builtin/commit.c:1492
+#: builtin/commit.c:1526
 msgid "amend previous commit"
 msgstr "修改先前的提交"
 
-#: builtin/commit.c:1493
+#: builtin/commit.c:1527
 msgid "bypass post-rewrite hook"
 msgstr "绕过 post-rewrite 钩子"
 
-#: builtin/commit.c:1498
+#: builtin/commit.c:1532
 msgid "ok to record an empty change"
 msgstr "允许一个空提交"
 
-#: builtin/commit.c:1500
+#: builtin/commit.c:1534
 msgid "ok to record a change with an empty message"
 msgstr "允许空的提交说明"
 
-#: builtin/commit.c:1529
+#: builtin/commit.c:1562
 msgid "could not parse HEAD commit"
 msgstr "不能解析 HEAD 提交"
 
-#: builtin/commit.c:1567 builtin/merge.c:518
+#: builtin/commit.c:1601 builtin/merge.c:518
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "不能为读入打开 '%s'"
 
-#: builtin/commit.c:1574
+#: builtin/commit.c:1608
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "损坏的 MERGE_HEAD 文件(%s)"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1615
 msgid "could not read MERGE_MODE"
 msgstr "不能读取 MERGE_MODE"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1634
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "不能读取提交说明:%s"
 
-#: builtin/commit.c:1611
+#: builtin/commit.c:1645
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "终止提交;您未更改来自模版的提交说明。\n"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1650
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "终止提交因为提交说明为空。\n"
 
-#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879
+#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
 msgid "failed to write commit object"
 msgstr "无法写提交对象"
 
-#: builtin/commit.c:1652
+#: builtin/commit.c:1686
 msgid "cannot lock HEAD ref"
 msgstr "无法锁定 HEAD 引用"
 
-#: builtin/commit.c:1656
+#: builtin/commit.c:1690
 msgid "cannot update HEAD ref"
 msgstr "无法更新 HEAD 引用"
 
-#: builtin/commit.c:1667
+#: builtin/commit.c:1701
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full or quota is\n"
@@ -4649,127 +4568,127 @@ msgstr ""
 msgid "git config [options]"
 msgstr "git config [选项]"
 
-#: builtin/config.c:54
+#: builtin/config.c:53
 msgid "Config file location"
 msgstr "配置文件位置"
 
-#: builtin/config.c:55
+#: builtin/config.c:54
 msgid "use global config file"
 msgstr "使用全局配置文件"
 
-#: builtin/config.c:56
+#: builtin/config.c:55
 msgid "use system config file"
 msgstr "使用系统级配置文件"
 
-#: builtin/config.c:57
+#: builtin/config.c:56
 msgid "use repository config file"
 msgstr "使用版本库级配置文件"
 
-#: builtin/config.c:58
+#: builtin/config.c:57
 msgid "use given config file"
 msgstr "使用指定的配置文件"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "blob-id"
 msgstr "数据对象ID"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "read config from given blob object"
 msgstr "从给定的数据对象读取配置"
 
-#: builtin/config.c:60
+#: builtin/config.c:59
 msgid "Action"
 msgstr "操作"
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "get value: name [value-regex]"
 msgstr "获取值:name [value-regex]"
 
-#: builtin/config.c:62
+#: builtin/config.c:61
 msgid "get all values: key [value-regex]"
 msgstr "获得所有的值:key [value-regex]"
 
-#: builtin/config.c:63
+#: builtin/config.c:62
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr "根据正则表达式获得值:name-regex [value-regex]"
 
-#: builtin/config.c:64
+#: builtin/config.c:63
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "获得 URL 取值:section[.var] URL"
 
-#: builtin/config.c:65
+#: builtin/config.c:64
 msgid "replace all matching variables: name value [value_regex]"
 msgstr "替换所有匹配的变量:name value [value_regex]"
 
-#: builtin/config.c:66
+#: builtin/config.c:65
 msgid "add a new variable: name value"
 msgstr "添加一个新的变量:name value"
 
-#: builtin/config.c:67
+#: builtin/config.c:66
 msgid "remove a variable: name [value-regex]"
 msgstr "删除一个变量:name [value-regex]"
 
-#: builtin/config.c:68
+#: builtin/config.c:67
 msgid "remove all matches: name [value-regex]"
 msgstr "删除所有匹配项:name [value-regex]"
 
-#: builtin/config.c:69
+#: builtin/config.c:68
 msgid "rename section: old-name new-name"
 msgstr "重命名小节:old-name new-name"
 
-#: builtin/config.c:70
+#: builtin/config.c:69
 msgid "remove a section: name"
 msgstr "删除一个小节:name"
 
-#: builtin/config.c:71
+#: builtin/config.c:70
 msgid "list all"
 msgstr "列出所有"
 
-#: builtin/config.c:72
+#: builtin/config.c:71
 msgid "open an editor"
 msgstr "打开一个编辑器"
 
-#: builtin/config.c:73 builtin/config.c:74
+#: builtin/config.c:72 builtin/config.c:73
 msgid "slot"
 msgstr "slot"
 
-#: builtin/config.c:73
+#: builtin/config.c:72
 msgid "find the color configured: [default]"
 msgstr "找到配置的颜色:[默认]"
 
-#: builtin/config.c:74
+#: builtin/config.c:73
 msgid "find the color setting: [stdout-is-tty]"
 msgstr "找到颜色设置:[stdout-is-tty]"
 
-#: builtin/config.c:75
+#: builtin/config.c:74
 msgid "Type"
 msgstr "类型"
 
-#: builtin/config.c:76
+#: builtin/config.c:75
 msgid "value is \"true\" or \"false\""
 msgstr "值是 \"true\" 或 \"false\""
 
-#: builtin/config.c:77
+#: builtin/config.c:76
 msgid "value is decimal number"
 msgstr "值是十进制数"
 
-#: builtin/config.c:78
+#: builtin/config.c:77
 msgid "value is --bool or --int"
 msgstr "值是 --bool or --int"
 
-#: builtin/config.c:79
+#: builtin/config.c:78
 msgid "value is a path (file or directory name)"
 msgstr "值是一个路径(文件或目录名)"
 
-#: builtin/config.c:80
+#: builtin/config.c:79
 msgid "Other"
 msgstr "其它"
 
-#: builtin/config.c:81
+#: builtin/config.c:80
 msgid "terminate values with NUL byte"
 msgstr "终止值是NUL字节"
 
-#: builtin/config.c:82
+#: builtin/config.c:81
 msgid "respect include directives on lookup"
 msgstr "查询时参照 include 指令递归查找"
 
@@ -4789,47 +4708,47 @@ msgstr "git describe [选项] <提交号>*"
 msgid "git describe [options] --dirty"
 msgstr "git describe [选项] --dirty"
 
-#: builtin/describe.c:237
+#: builtin/describe.c:225
 #, c-format
 msgid "annotated tag %s not available"
 msgstr "注释 tag %s 无效"
 
-#: builtin/describe.c:241
+#: builtin/describe.c:229
 #, c-format
 msgid "annotated tag %s has no embedded name"
 msgstr "注释 tag %s 没有嵌入名称"
 
-#: builtin/describe.c:243
+#: builtin/describe.c:231
 #, c-format
 msgid "tag '%s' is really '%s' here"
 msgstr "tag '%s' 的确是在 '%s'"
 
-#: builtin/describe.c:270
+#: builtin/describe.c:258
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "不是一个有效的对象名 %s"
 
-#: builtin/describe.c:273
+#: builtin/describe.c:261
 #, c-format
 msgid "%s is not a valid '%s' object"
 msgstr "%s 不是一个有效的 '%s' 对象"
 
-#: builtin/describe.c:290
+#: builtin/describe.c:278
 #, c-format
 msgid "no tag exactly matches '%s'"
 msgstr "没有 tag 准确匹配 '%s'"
 
-#: builtin/describe.c:292
+#: builtin/describe.c:280
 #, c-format
 msgid "searching to describe %s\n"
 msgstr "搜索描述 %s\n"
 
-#: builtin/describe.c:332
+#: builtin/describe.c:327
 #, c-format
 msgid "finished search at %s\n"
 msgstr "完成搜索 %s\n"
 
-#: builtin/describe.c:359
+#: builtin/describe.c:354
 #, c-format
 msgid ""
 "No annotated tags can describe '%s'.\n"
@@ -4838,7 +4757,7 @@ msgstr ""
 "没有注释 tag 能描述 '%s'。\n"
 "然而,有非注释 tag:尝试 --tags。"
 
-#: builtin/describe.c:363
+#: builtin/describe.c:358
 #, c-format
 msgid ""
 "No tags can describe '%s'.\n"
@@ -4847,12 +4766,12 @@ msgstr ""
 "没有注释 tag 能描述 '%s'。\n"
 "尝试 --always,或者创建一些 tag。"
 
-#: builtin/describe.c:384
+#: builtin/describe.c:379
 #, c-format
 msgid "traversed %lu commits\n"
 msgstr "已遍历 %lu 个提交\n"
 
-#: builtin/describe.c:387
+#: builtin/describe.c:382
 #, c-format
 msgid ""
 "more than %i tags found; listed %i most recent\n"
@@ -4861,63 +4780,63 @@ msgstr ""
 "发现多于 %i 个 tag,列出最近的 %i 个\n"
 "在 %s 放弃搜索\n"
 
-#: builtin/describe.c:409
+#: builtin/describe.c:404
 msgid "find the tag that comes after the commit"
 msgstr "寻找提交之后的 tag(用于描述提交)"
 
-#: builtin/describe.c:410
+#: builtin/describe.c:405
 msgid "debug search strategy on stderr"
 msgstr "在标准错误上调试搜索策略"
 
-#: builtin/describe.c:411
+#: builtin/describe.c:406
 msgid "use any ref"
 msgstr "使用任意引用"
 
-#: builtin/describe.c:412
+#: builtin/describe.c:407
 msgid "use any tag, even unannotated"
 msgstr "使用任意 tag,即使未带注解"
 
-#: builtin/describe.c:413
+#: builtin/describe.c:408
 msgid "always use long format"
 msgstr "始终使用长提交号格式"
 
-#: builtin/describe.c:414
+#: builtin/describe.c:409
 msgid "only follow first parent"
 msgstr "只跟随第一个父提交"
 
-#: builtin/describe.c:417
+#: builtin/describe.c:412
 msgid "only output exact matches"
 msgstr "只输出精确匹配"
 
-#: builtin/describe.c:419
+#: builtin/describe.c:414
 msgid "consider <n> most recent tags (default: 10)"
 msgstr "考虑最近 <n> 个 tags(默认:10)"
 
-#: builtin/describe.c:421
+#: builtin/describe.c:416
 msgid "only consider tags matching <pattern>"
 msgstr "只考虑匹配 <模式> 的 tags"
 
-#: builtin/describe.c:423 builtin/name-rev.c:321
+#: builtin/describe.c:418 builtin/name-rev.c:321
 msgid "show abbreviated commit object as fallback"
 msgstr "显示简写的提交号作为后备"
 
-#: builtin/describe.c:424
+#: builtin/describe.c:419
 msgid "mark"
 msgstr "标记"
 
-#: builtin/describe.c:425
+#: builtin/describe.c:420
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr "若工作区脏(有变更)在结尾添加 <标记>(默认:\"-dirty\")"
 
-#: builtin/describe.c:443
+#: builtin/describe.c:438
 msgid "--long is incompatible with --abbrev=0"
 msgstr "--long 与 --abbrev=0 不兼容"
 
-#: builtin/describe.c:469
+#: builtin/describe.c:464
 msgid "No names found, cannot describe anything."
 msgstr "没有发现名称,无法描述任何东西。"
 
-#: builtin/describe.c:489
+#: builtin/describe.c:484
 msgid "--dirty is incompatible with commit-ishes"
 msgstr "--dirty 不能与提交同时使用"
 
@@ -4948,7 +4867,7 @@ msgstr "提供了超过两个数据(blob)对象:'%s'"
 #: builtin/diff.c:416
 #, c-format
 msgid "unhandled object '%s' given."
-msgstr "æ\8f\90ä¾\9bäº\86æ\97 æ³\95å¤\84ç\90\86ç\9a\84对象 '%s'ã\80\82"
+msgstr "无法处理的对象 '%s'。"
 
 #: builtin/fast-export.c:22
 msgid "git fast-export [rev-list-opts]"
@@ -5213,7 +5132,7 @@ msgstr "正在获取 %s\n"
 msgid "Could not fetch %s"
 msgstr "不能获取 %s"
 
-#: builtin/fetch.c:1036
+#: builtin/fetch.c:1035
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -5253,10 +5172,10 @@ msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
 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:702
-#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446
-#: parse-options.h:135 parse-options.h:242
+#: 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
+#: parse-options.h:132 parse-options.h:239
 msgid "n"
 msgstr "n"
 
@@ -5320,6 +5239,14 @@ msgstr "key"
 msgid "field name to sort on"
 msgstr "排序的字段名"
 
+#: builtin/fsck.c:147 builtin/prune.c:172
+msgid "Checking connectivity"
+msgstr "检查连接中"
+
+#: builtin/fsck.c:544
+msgid "Checking object directories"
+msgstr "检查对象目录中"
+
 #: builtin/fsck.c:607
 msgid "git fsck [options] [<object>...]"
 msgstr "git fsck [选项] [<对象>...]"
@@ -5364,54 +5291,63 @@ msgstr "将摇摆对象写入 .git/lost-found 中"
 msgid "show progress"
 msgstr "显示进度"
 
+#: builtin/fsck.c:673
+msgid "Checking objects"
+msgstr "检查对象中"
+
 #: builtin/gc.c:24
 msgid "git gc [options]"
 msgstr "git gc [选项]"
 
-#: builtin/gc.c:80
+#: builtin/gc.c:90
 #, c-format
 msgid "Invalid %s: '%s'"
 msgstr "无效的 %s:'%s'"
 
-#: builtin/gc.c:107
+#: builtin/gc.c:117
 #, c-format
 msgid "insanely long object directory %.*s"
 msgstr "不正常的长对象目录 %.*s"
 
-#: builtin/gc.c:262
+#: builtin/gc.c:273
 msgid "prune unreferenced objects"
 msgstr "清除未引用的对象"
 
-#: builtin/gc.c:264
+#: builtin/gc.c:275
 msgid "be more thorough (increased runtime)"
 msgstr "更彻底(增加运行时间)"
 
-#: builtin/gc.c:265
+#: builtin/gc.c:276
 msgid "enable auto-gc mode"
 msgstr "启用自动垃圾回收模式"
 
-#: builtin/gc.c:266
+#: builtin/gc.c:277
 msgid "force running gc even if there may be another gc running"
 msgstr "强制执行 gc 即使另外一个 gc 正在执行"
 
-#: builtin/gc.c:306
+#: builtin/gc.c:318
 #, c-format
-msgid ""
-"Auto packing the repository for optimum performance. You may also\n"
-"run \"git gc\" manually. See \"git help gc\" for more information.\n"
-msgstr ""
-"自动打包版本库以求最佳性能。您还可以手动运行 \"git gc\"。\n"
-"参见 \"git help gc\" 以获取更多信息。\n"
+msgid "Auto packing the repository in background for optimum performance.\n"
+msgstr "自动在后台执行版本库打包以求最佳性能。\n"
+
+#: builtin/gc.c:320
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
+msgstr "自动打包版本库以求最佳性能。\n"
+
+#: builtin/gc.c:321
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
+msgstr "手工维护参见 \"git help gc\"。\n"
 
-#. be quiet on --auto
-#: builtin/gc.c:316
+#: builtin/gc.c:336
 #, 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:341
+#: builtin/gc.c:361
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr "有太多不可达的松散对象,运行 'git prune' 删除它们。"
@@ -5440,210 +5376,210 @@ msgstr "无法读取树(%s)"
 msgid "unable to grep from object of type %s"
 msgstr "无法抓取来自于 %s 类型的对象"
 
-#: builtin/grep.c:551
+#: builtin/grep.c:549
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "开关 `%c' 期望一个数字值"
 
-#: builtin/grep.c:568
+#: builtin/grep.c:566
 #, c-format
 msgid "cannot open '%s'"
 msgstr "不能打开 '%s'"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:640
 msgid "search in index instead of in the work tree"
 msgstr "在索引区搜索而不是在工作区"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:642
 msgid "find in contents not managed by git"
 msgstr "在未被 git 管理的内容中查找"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/grep.c:646
+#: builtin/grep.c:644
 msgid "search in both tracked and untracked files"
 msgstr "在跟踪和未跟踪的文件中搜索"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:646
 msgid "search also in ignored files"
 msgstr "也在忽略的文件中搜索"
 
-#: builtin/grep.c:651
+#: builtin/grep.c:649
 msgid "show non-matching lines"
 msgstr "显示未匹配的行"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:651
 msgid "case insensitive matching"
 msgstr "不区分大小写匹配"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:653
 msgid "match patterns only at word boundaries"
 msgstr "只在单词边界匹配模式"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:655
 msgid "process binary files as text"
 msgstr "把二进制文件当做文本处理"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:657
 msgid "don't match patterns in binary files"
 msgstr "不在二进制文件中匹配模式"
 
-#: builtin/grep.c:662
+#: builtin/grep.c:660
 msgid "process binary files with textconv filters"
 msgstr "用 textconv 过滤器处理二进制文件"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:662
 msgid "descend at most <depth> levels"
 msgstr "最多以指定的深度向下寻找"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:666
 msgid "use extended POSIX regular expressions"
 msgstr "使用扩展的 POSIX 正则表达式"
 
-#: builtin/grep.c:671
+#: builtin/grep.c:669
 msgid "use basic POSIX regular expressions (default)"
 msgstr "使用基本的 POSIX 正则表达式(默认)"
 
-#: builtin/grep.c:674
+#: builtin/grep.c:672
 msgid "interpret patterns as fixed strings"
 msgstr "把模式解析为固定的字符串"
 
-#: builtin/grep.c:677
+#: builtin/grep.c:675
 msgid "use Perl-compatible regular expressions"
 msgstr "使用 Perl 兼容的正则表达式"
 
-#: builtin/grep.c:680
+#: builtin/grep.c:678
 msgid "show line numbers"
 msgstr "显示行号"
 
-#: builtin/grep.c:681
+#: builtin/grep.c:679
 msgid "don't show filenames"
 msgstr "不显示文件名"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:680
 msgid "show filenames"
 msgstr "显示文件名"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:682
 msgid "show filenames relative to top directory"
 msgstr "显示相对于顶级目录的文件名"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:684
 msgid "show only filenames instead of matching lines"
 msgstr "只显示文件名而不显示匹配的行"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:686
 msgid "synonym for --files-with-matches"
 msgstr "和 --files-with-matches 同义"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:689
 msgid "show only the names of files without match"
 msgstr "只显示未匹配的文件名"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:691
 msgid "print NUL after filenames"
 msgstr "在文件名后输出 NUL 字符"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:693
 msgid "show the number of matches instead of matching lines"
 msgstr "显示总匹配行数,而不显示匹配的行"
 
-#: builtin/grep.c:696
+#: builtin/grep.c:694
 msgid "highlight matches"
 msgstr "高亮显示匹配项"
 
-#: builtin/grep.c:698
+#: builtin/grep.c:696
 msgid "print empty line between matches from different files"
 msgstr "在不同文件的匹配项之间打印空行"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:698
 msgid "show filename only once above matches from same file"
 msgstr "只在同一文件的匹配项的上面显示一次文件名"
 
-#: builtin/grep.c:703
+#: builtin/grep.c:701
 msgid "show <n> context lines before and after matches"
 msgstr "显示匹配项前后的 <n> 行上下文"
 
-#: builtin/grep.c:706
+#: builtin/grep.c:704
 msgid "show <n> context lines before matches"
 msgstr "显示匹配项前 <n> 行上下文"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:706
 msgid "show <n> context lines after matches"
 msgstr "显示匹配项后 <n> 行上下文"
 
-#: builtin/grep.c:709
+#: builtin/grep.c:707
 msgid "shortcut for -C NUM"
 msgstr "快捷键 -C 数字"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:710
 msgid "show a line with the function name before matches"
 msgstr "在匹配的前面显示一行函数名"
 
-#: builtin/grep.c:714
+#: builtin/grep.c:712
 msgid "show the surrounding function"
 msgstr "显示所在函数的前后内容"
 
-#: builtin/grep.c:717
+#: builtin/grep.c:715
 msgid "read patterns from file"
 msgstr "从文件读取模式"
 
-#: builtin/grep.c:719
+#: builtin/grep.c:717
 msgid "match <pattern>"
 msgstr "匹配 <模式>"
 
-#: builtin/grep.c:721
+#: builtin/grep.c:719
 msgid "combine patterns specified with -e"
 msgstr "组合用 -e 参数设定的模式"
 
-#: builtin/grep.c:733
+#: builtin/grep.c:731
 msgid "indicate hit with exit status without output"
 msgstr "不输出,而用退出码标识命中状态"
 
-#: builtin/grep.c:735
+#: builtin/grep.c:733
 msgid "show only matches from files that match all patterns"
 msgstr "只显示匹配所有模式的文件中的匹配"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:735
 msgid "show parse tree for grep expression"
 msgstr "显示 grep 表达式的解析树"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:739
 msgid "pager"
 msgstr "分页"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:739
 msgid "show matching files in the pager"
 msgstr "分页显示匹配的文件"
 
-#: builtin/grep.c:744
+#: builtin/grep.c:742
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "允许调用 grep(1)(本次构建忽略)"
 
-#: builtin/grep.c:745 builtin/show-ref.c:187
+#: builtin/grep.c:743 builtin/show-ref.c:187
 msgid "show usage"
 msgstr "显示用法"
 
-#: builtin/grep.c:812
+#: builtin/grep.c:810
 msgid "no pattern given."
 msgstr "未提供模式匹配。"
 
-#: builtin/grep.c:870
+#: builtin/grep.c:868
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager 仅用于工作区"
 
-#: builtin/grep.c:893
+#: builtin/grep.c:891
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached 或 --untracked 不能与 --no-index 同时使用。"
 
-#: builtin/grep.c:898
+#: builtin/grep.c:896
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index 或 --untracked 不能和版本同时使用。"
 
-#: builtin/grep.c:901
+#: builtin/grep.c:899
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard 不能用于已跟踪内容。"
 
-#: builtin/grep.c:909
+#: builtin/grep.c:907
 msgid "both --cached and trees are given."
 msgstr "同时给出了 --cached 和树对象。"
 
@@ -5659,7 +5595,7 @@ msgstr ""
 msgid "git hash-object  --stdin-paths < <list-of-paths>"
 msgstr "git hash-object  --stdin-paths < <路径列表>"
 
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:72 builtin/tag.c:521
 msgid "type"
 msgstr "类型"
 
@@ -5898,8 +5834,8 @@ msgstr "解压缩严重的不一致"
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "发现 %s 出现 SHA1 冲突!"
 
-#: builtin/index-pack.c:669 builtin/pack-objects.c:171
-#: builtin/pack-objects.c:263
+#: builtin/index-pack.c:669 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
 #, c-format
 msgid "unable to read %s"
 msgstr "不能读 %s"
@@ -6165,34 +6101,32 @@ msgstr "不能处理 %d 类型的文件"
 msgid "unable to move %s to %s"
 msgstr "不能移动 %s 至 %s"
 
-#.
-#. * TRANSLATORS: The first '%s' is either "Reinitialized
-#. * existing" or "Initialized empty", the second " shared" or
-#. * "", and the last '%s%s' is the verbatim directory name.
-#.
-#: builtin/init-db.c:420
+#. 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 Git 版本库于 %s%s\n"
 
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
 msgid "Reinitialized existing"
 msgstr "重新初始化现存的"
 
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
 msgid "Initialized empty"
 msgstr "初始化空的"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/init-db.c:422
+#: builtin/init-db.c:420
 msgid " shared"
 msgstr "共享"
 
-#: builtin/init-db.c:441
+#: builtin/init-db.c:439
 msgid "cannot tell cwd"
 msgstr "无法获知当前路径"
 
-#: builtin/init-db.c:467
+#: builtin/init-db.c:465
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [directory]"
@@ -6200,29 +6134,29 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<模板目录>] [--shared[=<权限>]] "
 "[目录]"
 
-#: builtin/init-db.c:490
+#: builtin/init-db.c:488
 msgid "permissions"
 msgstr "权限"
 
-#: builtin/init-db.c:491
+#: builtin/init-db.c:489
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "指定 git 版本库是多个用户之间共享的"
 
-#: builtin/init-db.c:493 builtin/prune-packed.c:79 builtin/repack.c:155
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
 msgid "be quiet"
 msgstr "保持安静"
 
-#: builtin/init-db.c:525 builtin/init-db.c:530
+#: builtin/init-db.c:523 builtin/init-db.c:528
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "不能创建目录 %s"
 
-#: builtin/init-db.c:534
+#: builtin/init-db.c:532
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "不能切换目录到 %s"
 
-#: builtin/init-db.c:556
+#: builtin/init-db.c:554
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -6231,11 +6165,11 @@ msgstr ""
 "不允许 %s(或 --work-tree=<directory>)而没有指定 %s(或 --git-"
 "dir=<directory>)"
 
-#: builtin/init-db.c:580
+#: builtin/init-db.c:578
 msgid "Cannot access current working directory"
 msgstr "不能访问当前工作目录"
 
-#: builtin/init-db.c:587
+#: builtin/init-db.c:585
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "不能访问工作区 '%s'"
@@ -6498,95 +6432,95 @@ msgstr "不能找到跟踪的远程分支,请手工指定 <upstream>。\n"
 msgid "Unknown commit %s"
 msgstr "未知提交 %s"
 
-#: builtin/ls-files.c:398
+#: builtin/ls-files.c:401
 msgid "git ls-files [options] [<file>...]"
 msgstr "git ls-files [选项] [<文件>...]"
 
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:458
 msgid "identify the file status with tags"
 msgstr "用标签标识文件的状态"
 
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:460
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr "使用小写字母表示 '假设未改变的' 文件"
 
-#: builtin/ls-files.c:459
+#: builtin/ls-files.c:462
 msgid "show cached files in the output (default)"
 msgstr "显示缓存的文件(默认)"
 
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:464
 msgid "show deleted files in the output"
 msgstr "显示已删除的文件"
 
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:466
 msgid "show modified files in the output"
 msgstr "显示已修改的文件"
 
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:468
 msgid "show other files in the output"
 msgstr "显示其它文件"
 
-#: builtin/ls-files.c:467
+#: builtin/ls-files.c:470
 msgid "show ignored files in the output"
 msgstr "显示忽略的文件"
 
-#: builtin/ls-files.c:470
+#: builtin/ls-files.c:473
 msgid "show staged contents' object name in the output"
 msgstr "显示暂存区内容的对象名称"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:475
 msgid "show files on the filesystem that need to be removed"
 msgstr "显示文件系统需要删除的文件"
 
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:477
 msgid "show 'other' directories' name only"
 msgstr "只显示“其他”目录的名称"
 
-#: builtin/ls-files.c:477
+#: builtin/ls-files.c:480
 msgid "don't show empty directories"
 msgstr "不显示空目录"
 
-#: builtin/ls-files.c:480
+#: builtin/ls-files.c:483
 msgid "show unmerged files in the output"
 msgstr "显示未合并的文件"
 
-#: builtin/ls-files.c:482
+#: builtin/ls-files.c:485
 msgid "show resolve-undo information"
 msgstr "显示 resolve-undo 信息"
 
-#: builtin/ls-files.c:484
+#: builtin/ls-files.c:487
 msgid "skip files matching pattern"
 msgstr "匹配排除文件的模式"
 
-#: builtin/ls-files.c:487
+#: builtin/ls-files.c:490
 msgid "exclude patterns are read from <file>"
 msgstr "从 <文件> 中读取排除模式"
 
-#: builtin/ls-files.c:490
+#: builtin/ls-files.c:493
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "从 <文件> 读取额外的每个目录的排除模式"
 
-#: builtin/ls-files.c:492
+#: builtin/ls-files.c:495
 msgid "add the standard git exclusions"
 msgstr "添加标准的 git 排除"
 
-#: builtin/ls-files.c:495
+#: builtin/ls-files.c:498
 msgid "make the output relative to the project top directory"
 msgstr "显示相对于顶级目录的文件名"
 
-#: builtin/ls-files.c:498
+#: builtin/ls-files.c:501
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "如果任何 <文件> 都不在索引区,视为错误"
 
-#: builtin/ls-files.c:499
+#: builtin/ls-files.c:502
 msgid "tree-ish"
 msgstr "树或提交"
 
-#: builtin/ls-files.c:500
+#: builtin/ls-files.c:503
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr "假装自从 <树或提交> 之后删除的路径仍然存在"
 
-#: builtin/ls-files.c:502
+#: builtin/ls-files.c:505
 msgid "show debugging data"
 msgstr "显示调试数据"
 
@@ -6697,7 +6631,7 @@ msgstr "如果不能快进就放弃合并"
 msgid "Verify that the named commit has a valid GPG signature"
 msgstr "验证指定的提交是否包含一个有效的 GPG 签名"
 
-#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89
+#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
 msgid "strategy"
 msgstr "策略"
 
@@ -6771,35 +6705,35 @@ msgstr "'%s' 没有指向一个提交"
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "坏的 branch.%s.mergeoptions 字符串:%s"
 
-#: builtin/merge.c:650
+#: builtin/merge.c:653
 msgid "git write-tree failed to write a tree"
 msgstr "git write-tree 无法写入一树对象"
 
-#: builtin/merge.c:678
+#: builtin/merge.c:681
 msgid "Not handling anything other than two heads merge."
 msgstr "不能处理两个头合并之外的任何操作。"
 
-#: builtin/merge.c:692
+#: builtin/merge.c:695
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "merge-recursive 的未知选项:-X%s"
 
-#: builtin/merge.c:706
+#: builtin/merge.c:709
 #, c-format
 msgid "unable to write %s"
 msgstr "不能写 %s"
 
-#: builtin/merge.c:795
+#: builtin/merge.c:798
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "不能从 '%s' 读取"
 
-#: builtin/merge.c:804
+#: builtin/merge.c:807
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr "未提交合并,使用 'git commit' 完成此次合并。\n"
 
-#: builtin/merge.c:810
+#: builtin/merge.c:813
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -6813,47 +6747,47 @@ msgstr ""
 "\n"
 "以 '%c' 开头的行将被忽略,而且空提交说明将会终止提交。\n"
 
-#: builtin/merge.c:834
+#: builtin/merge.c:837
 msgid "Empty commit message."
 msgstr "空提交信息。"
 
-#: builtin/merge.c:846
+#: builtin/merge.c:849
 #, c-format
 msgid "Wonderful.\n"
 msgstr "太棒了。\n"
 
-#: builtin/merge.c:911
+#: builtin/merge.c:914
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr "自动合并失败,修正冲突然后提交修正的结果。\n"
 
-#: builtin/merge.c:927
+#: builtin/merge.c:930
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "'%s' 不是一个提交"
 
-#: builtin/merge.c:968
+#: builtin/merge.c:971
 msgid "No current branch."
 msgstr "没有当前分支。"
 
-#: builtin/merge.c:970
+#: builtin/merge.c:973
 msgid "No remote for the current branch."
 msgstr "当前分支没有对应的远程版本库。"
 
-#: builtin/merge.c:972
+#: builtin/merge.c:975
 msgid "No default upstream defined for the current branch."
 msgstr "当前分支没有定义默认的上游分支。"
 
-#: builtin/merge.c:977
+#: builtin/merge.c:980
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "对于 %s 没有来自 %s 的远程跟踪分支"
 
-#: builtin/merge.c:1133
+#: builtin/merge.c:1136
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "没有要终止的合并(MERGE_HEAD 丢失)。"
 
-#: builtin/merge.c:1149 git-pull.sh:31
+#: builtin/merge.c:1152 git-pull.sh:31
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -6861,11 +6795,11 @@ msgstr ""
 "您尚未结束您的合并(存在 MERGE_HEAD)。\n"
 "请在合并前先提交您的修改。"
 
-#: builtin/merge.c:1152 git-pull.sh:34
+#: builtin/merge.c:1155 git-pull.sh:34
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "您尚未结束您的合并(存在 MERGE_HEAD)。"
 
-#: builtin/merge.c:1156
+#: builtin/merge.c:1159
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -6873,101 +6807,100 @@ msgstr ""
 "您尚未结束您的拣选(存在 CHERRY_PICK_HEAD)。\n"
 "请在合并前先提交您的修改。"
 
-#: builtin/merge.c:1159
+#: builtin/merge.c:1162
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "您尚未结束您的拣选(存在 CHERRY_PICK_HEAD)。"
 
-#: builtin/merge.c:1168
+#: builtin/merge.c:1171
 msgid "You cannot combine --squash with --no-ff."
 msgstr "您不能将 --squash 与 --no-ff 同时使用。"
 
-#: builtin/merge.c:1177
+#: builtin/merge.c:1180
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "未指定提交并且 merge.defaultToUpstream 未设置。"
 
-#: builtin/merge.c:1209
+#: builtin/merge.c:1212
 msgid "Can merge only exactly one commit into empty head"
 msgstr "只能将一个提交合并到空分支上"
 
-#: builtin/merge.c:1212
+#: builtin/merge.c:1215
 msgid "Squash commit into empty head not supported yet"
 msgstr "尚不支持到空分支的压缩提交"
 
-#: builtin/merge.c:1214
+#: builtin/merge.c:1217
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "到空分支的非快进式提交没有意义"
 
-#: builtin/merge.c:1219
+#: builtin/merge.c:1222
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - 不能被合并"
 
-#: builtin/merge.c:1270
+#: builtin/merge.c:1273
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr "提交 %s 有一个非可信的声称来自 %s 的 GPG 签名。"
 
-#: builtin/merge.c:1273
+#: builtin/merge.c:1276
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "提交 %s 有一个错误的声称来自 %s 的 GPG 签名。"
 
-#. 'N'
-#: builtin/merge.c:1276
+#: builtin/merge.c:1279
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "提交 %s 没有一个 GPG 签名。"
 
-#: builtin/merge.c:1279
+#: builtin/merge.c:1282
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "提交 %s 有一个来自 %s 的好的 GPG 签名。\n"
 
-#: builtin/merge.c:1363
+#: builtin/merge.c:1366
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "更新 %s..%s\n"
 
-#: builtin/merge.c:1402
+#: builtin/merge.c:1405
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "尝试非常小的索引内合并...\n"
 
-#: builtin/merge.c:1409
+#: builtin/merge.c:1412
 #, c-format
 msgid "Nope.\n"
 msgstr "无。\n"
 
-#: builtin/merge.c:1441
+#: builtin/merge.c:1444
 msgid "Not possible to fast-forward, aborting."
 msgstr "无法快进,终止。"
 
-#: builtin/merge.c:1464 builtin/merge.c:1543
+#: builtin/merge.c:1467 builtin/merge.c:1546
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "将树回滚至原始状态...\n"
 
-#: builtin/merge.c:1468
+#: builtin/merge.c:1471
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "尝试合并策略 %s...\n"
 
-#: builtin/merge.c:1534
+#: builtin/merge.c:1537
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "没有合并策略处理此合并。\n"
 
-#: builtin/merge.c:1536
+#: builtin/merge.c:1539
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "使用策略 %s 合并失败。\n"
 
-#: builtin/merge.c:1545
+#: builtin/merge.c:1548
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "使用 %s 以准备手工解决。\n"
 
-#: builtin/merge.c:1557
+#: builtin/merge.c:1560
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr "自动合并进展顺利,按要求在提交前停止\n"
@@ -7051,19 +6984,19 @@ msgstr "不要警告冲突"
 msgid "set labels for file1/orig_file/file2"
 msgstr "为 file1/orig_file/file2 设置标签"
 
-#: builtin/mktree.c:67
+#: builtin/mktree.c:64
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
 
-#: builtin/mktree.c:153
+#: builtin/mktree.c:150
 msgid "input is NUL terminated"
 msgstr "输入以 NUL 字符终止"
 
-#: builtin/mktree.c:154 builtin/write-tree.c:24
+#: builtin/mktree.c:151 builtin/write-tree.c:24
 msgid "allow missing objects"
 msgstr "允许丢失的对象"
 
-#: builtin/mktree.c:155
+#: builtin/mktree.c:152
 msgid "allow creation of more than one tree"
 msgstr "允许创建一个以上的树"
 
@@ -7110,46 +7043,46 @@ msgstr "请将您的修改缓存到 .gitmodules 中或保存进度后再继续"
 msgid "Huh? %.*s is in index?"
 msgstr "嗯?%.*s 在索引中?"
 
-#: builtin/mv.c:168
+#: builtin/mv.c:169
 msgid "source directory is empty"
 msgstr "源目录为空"
 
-#: builtin/mv.c:200
+#: builtin/mv.c:205
 msgid "not under version control"
 msgstr "不在版本控制之下"
 
-#: builtin/mv.c:202
+#: builtin/mv.c:207
 msgid "destination exists"
 msgstr "目标已存在"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:215
 #, c-format
 msgid "overwriting '%s'"
 msgstr "覆盖 '%s'"
 
-#: builtin/mv.c:213
+#: builtin/mv.c:218
 msgid "Cannot overwrite"
 msgstr "不能覆盖"
 
-#: builtin/mv.c:216
+#: builtin/mv.c:221
 msgid "multiple sources for the same target"
 msgstr "同一目标具有多个源"
 
-#: builtin/mv.c:218
+#: builtin/mv.c:223
 msgid "destination directory does not exist"
 msgstr "目标目录不存在"
 
-#: builtin/mv.c:233
+#: builtin/mv.c:243
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s,源=%s,目标=%s"
 
-#: builtin/mv.c:243
+#: builtin/mv.c:253
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "重命名 %s 至 %s\n"
 
-#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "重命名 '%s' 失败"
@@ -7317,7 +7250,7 @@ msgstr "不能读取 'show' 的输出"
 msgid "failed to finish 'show' for object '%s'"
 msgstr "无法为对象 '%s' 完成 'show'"
 
-#: builtin/notes.c:167 builtin/tag.c:341
+#: builtin/notes.c:167 builtin/tag.c:373
 #, c-format
 msgid "could not create file '%s'"
 msgstr "不能创建文件 '%s'"
@@ -7326,7 +7259,7 @@ msgstr "不能创建文件 '%s'"
 msgid "Please supply the note contents using either -m or -F option"
 msgstr "请通过 -m 或 -F 选项为注解提供内容"
 
-#: builtin/notes.c:207 builtin/notes.c:844
+#: builtin/notes.c:207 builtin/notes.c:848
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "删除对象 %s 的注解\n"
@@ -7340,20 +7273,20 @@ msgstr "不能写注解对象"
 msgid "The note contents has been left in %s"
 msgstr "注解内容被留在文件 %s 中"
 
-#: builtin/notes.c:248 builtin/tag.c:537
+#: builtin/notes.c:248 builtin/tag.c:604
 #, c-format
 msgid "cannot read '%s'"
 msgstr "不能读取 '%s'"
 
-#: builtin/notes.c:250 builtin/tag.c:540
+#: builtin/notes.c:250 builtin/tag.c:607
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "不能打开或读取 '%s'"
 
-#: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318
-#: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515
-#: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637
-#: builtin/notes.c:839 builtin/tag.c:553
+#: 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
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "无法解析 '%s' 为一个有效引用。"
@@ -7363,89 +7296,94 @@ msgstr "无法解析 '%s' 为一个有效引用。"
 msgid "Failed to read object '%s'."
 msgstr "无法读取对象 '%s'。"
 
-#: builtin/notes.c:312
+#: builtin/notes.c:276
+#, c-format
+msgid "Cannot read note data from non-blob object '%s'."
+msgstr "不能从非数据对象 '%s' 中读取注解数据"
+
+#: builtin/notes.c:316
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "非法的输入行:'%s'。"
 
-#: builtin/notes.c:327
+#: builtin/notes.c:331
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "无法从 '%s' 到 '%s' 拷贝注解"
 
-#: builtin/notes.c:371 builtin/notes.c:425 builtin/notes.c:498
-#: builtin/notes.c:510 builtin/notes.c:583 builtin/notes.c:630
-#: builtin/notes.c:904
+#: 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 "参数太多"
 
-#: builtin/notes.c:384 builtin/notes.c:643
+#: builtin/notes.c:388 builtin/notes.c:647
 #, c-format
 msgid "No note found for object %s."
 msgstr "未发现对象 %s 的注解。"
 
-#: builtin/notes.c:406 builtin/notes.c:563
+#: builtin/notes.c:410 builtin/notes.c:567
 msgid "note contents as a string"
 msgstr "注解内容作为一个字符串"
 
-#: builtin/notes.c:409 builtin/notes.c:566
+#: builtin/notes.c:413 builtin/notes.c:570
 msgid "note contents in a file"
 msgstr "注解内容到一个文件中"
 
-#: builtin/notes.c:411 builtin/notes.c:414 builtin/notes.c:568
-#: builtin/notes.c:571 builtin/tag.c:474
+#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
+#: builtin/notes.c:575 builtin/tag.c:539
 msgid "object"
 msgstr "对象"
 
-#: builtin/notes.c:412 builtin/notes.c:569
+#: builtin/notes.c:416 builtin/notes.c:573
 msgid "reuse and edit specified note object"
 msgstr "重用和编辑指定的注解对象"
 
-#: builtin/notes.c:415 builtin/notes.c:572
+#: builtin/notes.c:419 builtin/notes.c:576
 msgid "reuse specified note object"
 msgstr "重用指定的注解对象"
 
-#: builtin/notes.c:417 builtin/notes.c:485
+#: builtin/notes.c:421 builtin/notes.c:489
 msgid "replace existing notes"
 msgstr "替换已存在的注解"
 
-#: builtin/notes.c:451
+#: builtin/notes.c:455
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr "不能添加注解。发现对象 %s 已存在注解。使用 '-f' 覆盖现存注解"
 
-#: builtin/notes.c:456 builtin/notes.c:533
+#: builtin/notes.c:460 builtin/notes.c:537
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "覆盖对象 %s 现存注解\n"
 
-#: builtin/notes.c:486
+#: builtin/notes.c:490
 msgid "read objects from stdin"
 msgstr "从标准输入读取对象"
 
-#: builtin/notes.c:488
+#: builtin/notes.c:492
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr "重新加载 <命令> 的配置(隐含 --stdin)"
 
-#: builtin/notes.c:506
+#: builtin/notes.c:510
 msgid "too few parameters"
 msgstr "参数太少"
 
-#: builtin/notes.c:527
+#: builtin/notes.c:531
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
 "existing notes"
 msgstr "不能拷贝注解。发现对象 %s 已存在注解。使用 '-f' 覆盖现存注解"
 
-#: builtin/notes.c:539
+#: builtin/notes.c:543
 #, c-format
 msgid "Missing notes on source object %s. Cannot copy."
 msgstr "源对象 %s 缺少注解。不能拷贝。"
 
-#: builtin/notes.c:588
+#: builtin/notes.c:592
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -7454,215 +7392,239 @@ msgstr ""
 "子命令 'edit' 的选项 -m/-F/-c/-C 已弃用。\n"
 "请换用 'git notes add -f -m/-F/-c/-C'。\n"
 
-#: builtin/notes.c:735
+#: builtin/notes.c:739
 msgid "General options"
 msgstr "通用选项"
 
-#: builtin/notes.c:737
+#: builtin/notes.c:741
 msgid "Merge options"
 msgstr "合并选项"
 
-#: builtin/notes.c:739
+#: builtin/notes.c:743
 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:741
+#: builtin/notes.c:745
 msgid "Committing unmerged notes"
 msgstr "提交未合并的注解"
 
-#: builtin/notes.c:743
+#: builtin/notes.c:747
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "通过提交未合并的注解来完成注解合并"
 
-#: builtin/notes.c:745
+#: builtin/notes.c:749
 msgid "Aborting notes merge resolution"
 msgstr "中止注解合并的方案"
 
-#: builtin/notes.c:747
+#: builtin/notes.c:751
 msgid "abort notes merge"
 msgstr "中止注解合并"
 
-#: builtin/notes.c:842
+#: builtin/notes.c:846
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "对象 %s 没有注解\n"
 
-#: builtin/notes.c:854
+#: builtin/notes.c:858
 msgid "attempt to remove non-existent note is not an error"
 msgstr "尝试删除不存在的注解不是一个错误"
 
-#: builtin/notes.c:857
+#: builtin/notes.c:861
 msgid "read object names from the standard input"
 msgstr "从标准输入读取对象名称"
 
-#: builtin/notes.c:938
-msgid "notes_ref"
+#: builtin/notes.c:942
+msgid "notes-ref"
 msgstr "注解引用"
 
-#: builtin/notes.c:939
+#: builtin/notes.c:943
 msgid "use notes from <notes_ref>"
 msgstr "从 <注解引用> 使用注解"
 
-#: builtin/notes.c:974 builtin/remote.c:1593
+#: builtin/notes.c:978 builtin/remote.c:1593
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "未知子命令:%s"
 
-#: builtin/pack-objects.c:23
+#: builtin/pack-objects.c:25
 msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
 msgstr "git pack-objects --stdout [选项...] [< 引用列表 | < 对象列表]"
 
-#: builtin/pack-objects.c:24
+#: builtin/pack-objects.c:26
 msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
 msgstr "git pack-objects [选项...] base-name [< 引用列表 | < 对象列表]"
 
-#: builtin/pack-objects.c:184 builtin/pack-objects.c:187
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
 #, c-format
 msgid "deflate error (%d)"
 msgstr "压缩错误 (%d)"
 
-#: builtin/pack-objects.c:2396
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr "写入对象中"
+
+#: builtin/pack-objects.c:1012
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr "禁用 bitmap 写入,因为一些对象将不会被打包"
+
+#: builtin/pack-objects.c:2174
+msgid "Compressing objects"
+msgstr "压缩对象中"
+
+#: builtin/pack-objects.c:2530
 #, c-format
 msgid "unsupported index version %s"
 msgstr "不支持的索引版本 %s"
 
-#: builtin/pack-objects.c:2400
+#: builtin/pack-objects.c:2534
 #, c-format
 msgid "bad index version '%s'"
 msgstr "坏的索引版本 '%s'"
 
-#: builtin/pack-objects.c:2423
+#: builtin/pack-objects.c:2557
 #, c-format
 msgid "option %s does not accept negative form"
 msgstr "选项 %s 不接受否定格式"
 
-#: builtin/pack-objects.c:2427
+#: builtin/pack-objects.c:2561
 #, c-format
 msgid "unable to parse value '%s' for option %s"
 msgstr "不能解析选项 %1$s 的值 '%2$s'"
 
-#: builtin/pack-objects.c:2446
+#: builtin/pack-objects.c:2580
 msgid "do not show progress meter"
 msgstr "不显示进度表"
 
-#: builtin/pack-objects.c:2448
+#: builtin/pack-objects.c:2582
 msgid "show progress meter"
 msgstr "显示进度表"
 
-#: builtin/pack-objects.c:2450
+#: builtin/pack-objects.c:2584
 msgid "show progress meter during object writing phase"
 msgstr "在对象写入阶段显示进度表"
 
-#: builtin/pack-objects.c:2453
+#: builtin/pack-objects.c:2587
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "当进度表显示时类似于 --all-progress"
 
-#: builtin/pack-objects.c:2454
+#: builtin/pack-objects.c:2588
 msgid "version[,offset]"
 msgstr "版本[,偏移]"
 
-#: builtin/pack-objects.c:2455
+#: builtin/pack-objects.c:2589
 msgid "write the pack index file in the specified idx format version"
 msgstr "用指定的 idx 格式版本来写包索引文件"
 
-#: builtin/pack-objects.c:2458
+#: builtin/pack-objects.c:2592
 msgid "maximum size of each output pack file"
 msgstr "每个输出包的最大尺寸"
 
-#: builtin/pack-objects.c:2460
+#: builtin/pack-objects.c:2594
 msgid "ignore borrowed objects from alternate object store"
 msgstr "忽略从替代对象存储里借用对象"
 
-#: builtin/pack-objects.c:2462
+#: builtin/pack-objects.c:2596
 msgid "ignore packed objects"
 msgstr "忽略包对象"
 
-#: builtin/pack-objects.c:2464
+#: builtin/pack-objects.c:2598
 msgid "limit pack window by objects"
 msgstr "限制打包窗口的对象数"
 
-#: builtin/pack-objects.c:2466
+#: builtin/pack-objects.c:2600
 msgid "limit pack window by memory in addition to object limit"
 msgstr "除对象数量限制外设置打包窗口的内存限制"
 
-#: builtin/pack-objects.c:2468
+#: builtin/pack-objects.c:2602
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr "打包允许的 delta 链的最大长度"
 
-#: builtin/pack-objects.c:2470
+#: builtin/pack-objects.c:2604
 msgid "reuse existing deltas"
 msgstr "重用已存在的 deltas"
 
-#: builtin/pack-objects.c:2472
+#: builtin/pack-objects.c:2606
 msgid "reuse existing objects"
 msgstr "重用已存在的对象"
 
-#: builtin/pack-objects.c:2474
+#: builtin/pack-objects.c:2608
 msgid "use OFS_DELTA objects"
 msgstr "使用 OFS_DELTA 对象"
 
-#: builtin/pack-objects.c:2476
+#: builtin/pack-objects.c:2610
 msgid "use threads when searching for best delta matches"
 msgstr "使用线程查询最佳 delta 匹配"
 
-#: builtin/pack-objects.c:2478
+#: builtin/pack-objects.c:2612
 msgid "do not create an empty pack output"
 msgstr "不创建空的包输出"
 
-#: builtin/pack-objects.c:2480
+#: builtin/pack-objects.c:2614
 msgid "read revision arguments from standard input"
 msgstr "从标准输入读取修订号参数"
 
-#: builtin/pack-objects.c:2482
+#: builtin/pack-objects.c:2616
 msgid "limit the objects to those that are not yet packed"
 msgstr "限制那些尚未打包的对象"
 
-#: builtin/pack-objects.c:2485
+#: builtin/pack-objects.c:2619
 msgid "include objects reachable from any reference"
 msgstr "包括可以从任何引用访问到的对象"
 
-#: builtin/pack-objects.c:2488
+#: builtin/pack-objects.c:2622
 msgid "include objects referred by reflog entries"
 msgstr "包括被引用日志引用到的对象"
 
-#: builtin/pack-objects.c:2491
+#: builtin/pack-objects.c:2625
 msgid "output pack to stdout"
 msgstr "输出包到标准输出"
 
-#: builtin/pack-objects.c:2493
+#: builtin/pack-objects.c:2627
 msgid "include tag objects that refer to objects to be packed"
 msgstr "包括引用了打包对象的 tag"
 
-#: builtin/pack-objects.c:2495
+#: builtin/pack-objects.c:2629
 msgid "keep unreachable objects"
 msgstr "维持不可达的对象"
 
-#: builtin/pack-objects.c:2496 parse-options.h:143
+#: builtin/pack-objects.c:2630 parse-options.h:140
 msgid "time"
 msgstr "时间"
 
-#: builtin/pack-objects.c:2497
+#: builtin/pack-objects.c:2631
 msgid "unpack unreachable objects newer than <time>"
 msgstr "将比给定 <时间> 新的无法访问的对象解包"
 
-#: builtin/pack-objects.c:2500
+#: builtin/pack-objects.c:2634
 msgid "create thin packs"
 msgstr "创建精简包"
 
-#: builtin/pack-objects.c:2502
+#: builtin/pack-objects.c:2636
 msgid "ignore packs that have companion .keep file"
 msgstr "忽略配有 .keep 文件的包"
 
-#: builtin/pack-objects.c:2504
+#: builtin/pack-objects.c:2638
 msgid "pack compression level"
 msgstr "打包压缩级别"
 
-#: builtin/pack-objects.c:2506
+#: builtin/pack-objects.c:2640
 msgid "do not hide commits by grafts"
 msgstr "显示被嫁接隐藏的提交"
 
+#: builtin/pack-objects.c:2642
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr "使用 bitmap 索引(如果有的话)以提高对象计数时的速度"
+
+#: builtin/pack-objects.c:2644
+msgid "write a bitmap index together with the pack index"
+msgstr "在建立包索引的同时创建 bitmap 索引"
+
+#: builtin/pack-objects.c:2723
+msgid "Counting objects"
+msgstr "对象计数中"
+
 #: builtin/pack-refs.c:6
 msgid "git pack-refs [options]"
 msgstr "git pack-refs [选项]"
@@ -7679,6 +7641,10 @@ msgstr "清除松散的引用(默认)"
 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 "正在删除重复对象"
+
 #: builtin/prune.c:12
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <时间>] [--] [<头>...]"
@@ -7699,15 +7665,15 @@ msgstr "使早于给定时间的对象过期"
 msgid "git push [<options>] [<repository> [<refspec>...]]"
 msgstr "git push [<选项>] [<版本库> [<引用规则>...]]"
 
-#: builtin/push.c:86
+#: builtin/push.c:85
 msgid "tag shorthand without <tag>"
 msgstr "tag 简写没有跟 <tag> 参数"
 
-#: builtin/push.c:96
+#: builtin/push.c:95
 msgid "--delete only accepts plain target ref names"
 msgstr "--delete 只接受简单的目标引用名"
 
-#: builtin/push.c:141
+#: builtin/push.c:140
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -7715,7 +7681,7 @@ msgstr ""
 "\n"
 "为了永久地选择任一选项,参见 'git help config' 中的 push.default。"
 
-#: builtin/push.c:144
+#: builtin/push.c:143
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -7739,7 +7705,7 @@ msgstr ""
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:159
+#: builtin/push.c:158
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -7753,7 +7719,7 @@ msgstr ""
 "\n"
 "    git push %s HEAD:<name-of-remote-branch>\n"
 
-#: builtin/push.c:173
+#: builtin/push.c:172
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -7766,12 +7732,12 @@ msgstr ""
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:181
+#: builtin/push.c:180
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr "当前分支 %s 有多个上游分支,拒绝推送。"
 
-#: builtin/push.c:184
+#: builtin/push.c:183
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -7782,11 +7748,11 @@ msgstr ""
 "而没有告诉我要推送什么、更新哪个远程分支。"
 
 #  译者:字符串首行行首要添加“warning: ”字串,故此首行要较其余行短
-#: builtin/push.c:207
+#: builtin/push.c:206
 msgid ""
-"push.default is unset; its implicit value is changing in\n"
+"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 current behavior after the default changes, use:\n"
+"and maintain the traditional behavior, use:\n"
 "\n"
 "  git config --global push.default matching\n"
 "\n"
@@ -7797,7 +7763,7 @@ msgid ""
 "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"
-"In Git 2.0, Git will default to the more conservative 'simple'\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"
@@ -7806,7 +7772,7 @@ msgid ""
 "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
 "'current' instead of 'simple' if you sometimes use older versions of Git)"
 msgstr ""
-"push.default 尚未设置,它的默认值在 Git 2.0 从 'matching'\n"
+"push.default 尚未设置,它的默认值在 Git 2.0 从 'matching'\n"
 "变更为 'simple'。若要不再显示本信息并保持传统习惯,进行如下设置:\n"
 "\n"
 "  git config --global push.default matching\n"
@@ -7825,12 +7791,12 @@ msgstr ""
 "('simple' 模式由 Git 1.7.11 版本引入。如果您有时要使用老版本的 Git,\n"
 "为保持兼容,请用 'current' 代替 'simple')"
 
-#: builtin/push.c:274
+#: builtin/push.c:273
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr "您没有为推送指定任何引用规则,并且 push.default 为 \"nothing\"。"
 
-#: builtin/push.c:281
+#: builtin/push.c:280
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -7841,19 +7807,7 @@ msgstr ""
 "再次推送前,先与远程变更合并(如 'git pull ...')。详见\n"
 "'git push --help' 中的 'Note about fast-forwards' 小节。"
 
-#: builtin/push.c:287
-msgid ""
-"Updates were rejected because a pushed branch tip is behind its remote\n"
-"counterpart. If you did not intend to push that branch, you may want to\n"
-"specify branches to push or set the 'push.default' configuration variable\n"
-"to 'simple', 'current' or 'upstream' to push only the current branch."
-msgstr ""
-"更新被拒绝,因为推送的一个分支的最新提交落后于其对应的远程分支。\n"
-"如果您并非有意推送该分支,您可以在推送时指定要推送的分支,或者将\n"
-"配置变量 'push.default' 设置为 'simple'、'current' 或 'upstream'\n"
-"以便只推送当前分支。"
-
-#: builtin/push.c:293
+#: builtin/push.c:286
 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"
@@ -7864,7 +7818,7 @@ msgstr ""
 "检出该分支并整合远程变更(如 'git pull ...'),然后再推送。详见\n"
 "'git push --help' 中的 'Note about fast-forwards' 小节。"
 
-#: builtin/push.c:299
+#: builtin/push.c:292
 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"
@@ -7877,11 +7831,11 @@ msgstr ""
 "(如 'git pull ...')。\n"
 "详见 'git push --help' 中的 'Note about fast-forwards' 小节。"
 
-#: builtin/push.c:306
+#: builtin/push.c:299
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr "更新被拒绝因为 tag 在远程已经存在。"
 
-#: builtin/push.c:309
+#: builtin/push.c:302
 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"
@@ -7890,22 +7844,22 @@ msgstr ""
 "如果不使用 '--force' 参数,您不能更新一个指向非提交对象的远程引用,\n"
 "也不能更新远程引用让其指向一个非提交对象。\n"
 
-#: builtin/push.c:375
+#: builtin/push.c:361
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "推送到 %s\n"
 
-#: builtin/push.c:379
+#: builtin/push.c:365
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "无法推送一些引用到 '%s'"
 
-#: builtin/push.c:412
+#: builtin/push.c:395
 #, c-format
 msgid "bad repository '%s'"
 msgstr "坏的版本库 '%s'"
 
-#: builtin/push.c:413
+#: builtin/push.c:396
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -7926,95 +7880,95 @@ msgstr ""
 "\n"
 "    git push <name>\n"
 
-#: builtin/push.c:428
+#: builtin/push.c:411
 msgid "--all and --tags are incompatible"
 msgstr "--all 和 --tags 不兼容"
 
-#: builtin/push.c:429
+#: builtin/push.c:412
 msgid "--all can't be combined with refspecs"
 msgstr "--all 不能和引用规则同时使用"
 
-#: builtin/push.c:434
+#: builtin/push.c:417
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror 和 --tags 不兼容"
 
-#: builtin/push.c:435
+#: builtin/push.c:418
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror 不能和引用规则同时使用"
 
-#: builtin/push.c:440
+#: builtin/push.c:423
 msgid "--all and --mirror are incompatible"
 msgstr "--all 和 --mirror 不兼容"
 
-#: builtin/push.c:500
+#: builtin/push.c:483
 msgid "repository"
 msgstr "版本库"
 
-#: builtin/push.c:501
+#: builtin/push.c:484
 msgid "push all refs"
 msgstr "推送所有引用"
 
-#: builtin/push.c:502
+#: builtin/push.c:485
 msgid "mirror all refs"
 msgstr "镜像所有引用"
 
-#: builtin/push.c:504
+#: builtin/push.c:487
 msgid "delete refs"
 msgstr "删除引用"
 
-#: builtin/push.c:505
+#: builtin/push.c:488
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "推送 tags(不能使用 --all or --mirror)"
 
-#: builtin/push.c:508
+#: builtin/push.c:491
 msgid "force updates"
 msgstr "强制更新"
 
-#: builtin/push.c:510
+#: builtin/push.c:493
 msgid "refname>:<expect"
 msgstr "引用名>:<期望值"
 
-#: builtin/push.c:511
+#: builtin/push.c:494
 msgid "require old value of ref to be at this value"
 msgstr "要求引用旧的取值为设定值"
 
-#: builtin/push.c:513
+#: builtin/push.c:496
 msgid "check"
 msgstr "检查"
 
-#: builtin/push.c:514
+#: builtin/push.c:497
 msgid "control recursive pushing of submodules"
 msgstr "控制子模组的递归推送"
 
-#: builtin/push.c:516
+#: builtin/push.c:499
 msgid "use thin pack"
 msgstr "使用精简打包"
 
-#: builtin/push.c:517 builtin/push.c:518
+#: builtin/push.c:500 builtin/push.c:501
 msgid "receive pack program"
 msgstr "接收包程序"
 
-#: builtin/push.c:519
+#: builtin/push.c:502
 msgid "set upstream for git pull/status"
 msgstr "设置 git pull/status 的上游"
 
-#: builtin/push.c:522
+#: builtin/push.c:505
 msgid "prune locally removed refs"
 msgstr "清除本地删除的引用"
 
-#: builtin/push.c:524
+#: builtin/push.c:507
 msgid "bypass pre-push hook"
 msgstr "绕过 pre-push 钩子"
 
-#: builtin/push.c:525
+#: builtin/push.c:508
 msgid "push missing but relevant tags"
 msgstr "推送缺失的有关的 tags"
 
-#: builtin/push.c:535
+#: builtin/push.c:518
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete 与 --all、--mirror 及 --tags 不兼容"
 
-#: builtin/push.c:537
+#: builtin/push.c:520
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete 未接任何引用没有意义"
 
@@ -8598,67 +8552,75 @@ msgstr "将不会删除所有非推送URL地址"
 msgid "be verbose; must be placed before a subcommand"
 msgstr "冗长输出;必须置于子命令之前"
 
-#: builtin/repack.c:15
+#: builtin/repack.c:16
 msgid "git repack [options]"
 msgstr "git repack [选项]"
 
-#: builtin/repack.c:143
+#: builtin/repack.c:156
 msgid "pack everything in a single pack"
 msgstr "所有内容打包到一个包文件中"
 
-#: builtin/repack.c:145
+#: builtin/repack.c:158
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "和 -a 相同,并将不可达的对象设为松散对象"
 
-#: builtin/repack.c:148
+#: builtin/repack.c:161
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "删除多余的包,运行 git-prune-packed"
 
-#: builtin/repack.c:150
+#: builtin/repack.c:163
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "向 git-pack-objects 传递参数 --no-reuse-delta"
 
-#: builtin/repack.c:152
+#: builtin/repack.c:165
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "向 git-pack-objects 传递参数 --no-reuse-object"
 
-#: builtin/repack.c:154
+#: builtin/repack.c:167
 msgid "do not run git-update-server-info"
 msgstr "不运行 git-update-server-info"
 
-#: builtin/repack.c:157
+#: builtin/repack.c:170
 msgid "pass --local to git-pack-objects"
 msgstr "向 git-pack-objects 传递参数 --local"
 
-#: builtin/repack.c:158
+#: builtin/repack.c:172
+msgid "write bitmap index"
+msgstr "写 bitmap 索引"
+
+#: builtin/repack.c:173
 msgid "approxidate"
 msgstr "近似日期"
 
-#: builtin/repack.c:159
+#: builtin/repack.c:174
 msgid "with -A, do not loosen objects older than this"
 msgstr "使用 -A,不要将早于给定时间的对象过期"
 
-#: builtin/repack.c:161
+#: builtin/repack.c:176
 msgid "size of the window used for delta compression"
 msgstr "用于增量压缩的窗口值"
 
-#: builtin/repack.c:162 builtin/repack.c:166
+#: builtin/repack.c:177 builtin/repack.c:181
 msgid "bytes"
 msgstr "字节"
 
-#: builtin/repack.c:163
+#: builtin/repack.c:178
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr "和上面的相似,但限制内存大小而非条目数"
 
-#: builtin/repack.c:165
+#: builtin/repack.c:180
 msgid "limits the maximum delta depth"
 msgstr "限制最大增量深度"
 
-#: builtin/repack.c:167
+#: builtin/repack.c:182
 msgid "maximum size of each packfile"
 msgstr "每个包的最大尺寸"
 
-#: builtin/repack.c:343
+#: builtin/repack.c:184
+msgid "repack objects in packs marked with .keep"
+msgstr "对标记为 .keep 的包中的对象重新打包"
+
+#: builtin/repack.c:371
 #, c-format
 msgid "removing '%s' failed"
 msgstr "删除 '%s' 失败"
@@ -8751,76 +8713,84 @@ msgid "HEAD is now at %s"
 msgstr "HEAD 现在位于 %s"
 
 #  译者:汉字之间无空格,故删除%s前后空格
-#: builtin/reset.c:172
+#: builtin/reset.c:182
 #, c-format
 msgid "Cannot do a %s reset in the middle of a merge."
 msgstr "在合并过程中不能做%s重置操作。"
 
-#: builtin/reset.c:262
+#: builtin/reset.c:273
 msgid "be quiet, only report errors"
 msgstr "安静模式,只报告错误"
 
-#: builtin/reset.c:264
+#: builtin/reset.c:275
 msgid "reset HEAD and index"
 msgstr "重置 HEAD 和索引"
 
-#: builtin/reset.c:265
+#: builtin/reset.c:276
 msgid "reset only HEAD"
 msgstr "只重置 HEAD"
 
-#: builtin/reset.c:267 builtin/reset.c:269
+#: builtin/reset.c:278 builtin/reset.c:280
 msgid "reset HEAD, index and working tree"
 msgstr "重置 HEAD、索引和工作区"
 
-#: builtin/reset.c:271
+#: builtin/reset.c:282
 msgid "reset HEAD but keep local changes"
 msgstr "重置 HEAD 但保存本地变更"
 
-#: builtin/reset.c:289
+#: builtin/reset.c:285
+msgid "record only the fact that removed paths will be added later"
+msgstr "将删除的路径标记为稍后添加"
+
+#: builtin/reset.c:302
 #, c-format
 msgid "Failed to resolve '%s' as a valid revision."
 msgstr "无法将 '%s' 解析为一个有效的版本。"
 
-#: builtin/reset.c:292 builtin/reset.c:300
+#: builtin/reset.c:305 builtin/reset.c:313
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "不能解析对象 '%s'。"
 
-#: builtin/reset.c:297
+#: builtin/reset.c:310
 #, c-format
 msgid "Failed to resolve '%s' as a valid tree."
 msgstr "无法将 '%s' 解析为一个有效的树对象。"
 
-#: builtin/reset.c:306
+#: builtin/reset.c:319
 msgid "--patch is incompatible with --{hard,mixed,soft}"
 msgstr "--patch 与 --{hard、mixed、soft} 选项不兼容"
 
-#: builtin/reset.c:315
+#: builtin/reset.c:328
 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
 msgstr "--mixed 带路径已弃用,而是用 'git reset -- <paths>'。"
 
 #  译者:汉字之间无空格,故删除%s前后空格
-#: builtin/reset.c:317
+#: builtin/reset.c:330
 #, c-format
 msgid "Cannot do %s reset with paths."
 msgstr "不能带路径进行%s重置。"
 
 #  译者:汉字之间无空格,故删除%s前后空格
-#: builtin/reset.c:327
+#: builtin/reset.c:340
 #, c-format
 msgid "%s reset is not allowed in a bare repository"
 msgstr "不能对裸版本库进行%s重置"
 
 #: builtin/reset.c:344
+msgid "-N can only be used with --mixed"
+msgstr "-N 只能和 --mixed 同时使用"
+
+#: builtin/reset.c:361
 msgid "Unstaged changes after reset:"
 msgstr "重置后撤出暂存区的变更:"
 
-#: builtin/reset.c:350
+#: builtin/reset.c:367
 #, c-format
 msgid "Could not reset index file to revision '%s'."
 msgstr "不能重置索引文件至版本 '%s'。"
 
-#: builtin/reset.c:355
+#: builtin/reset.c:372
 msgid "Could not write new index file."
 msgstr "不能写入新的索引文件。"
 
@@ -8840,7 +8810,7 @@ msgstr "遇到第一个非选项参数后停止解析"
 msgid "output in stuck long form"
 msgstr "以固定长格式输出"
 
-#: builtin/rev-parse.c:486
+#: builtin/rev-parse.c:497
 msgid ""
 "git rev-parse --parseopt [options] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -8911,35 +8881,35 @@ msgstr "选项"
 msgid "option for merge strategy"
 msgstr "合并策略的选项"
 
-#: builtin/revert.c:102
+#: builtin/revert.c:104
 msgid "append commit name"
 msgstr "追加提交名称"
 
-#: builtin/revert.c:103
+#: builtin/revert.c:105
 msgid "allow fast-forward"
 msgstr "允许快进式"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:106
 msgid "preserve initially empty commits"
 msgstr "保留初始化的空提交"
 
-#: builtin/revert.c:105
+#: builtin/revert.c:107
 msgid "allow commits with empty messages"
 msgstr "允许提交说明为空"
 
-#: builtin/revert.c:106
+#: builtin/revert.c:108
 msgid "keep redundant, empty commits"
 msgstr "保持多余的、空的提交"
 
-#: builtin/revert.c:110
+#: builtin/revert.c:112
 msgid "program error"
 msgstr "程序错误"
 
-#: builtin/revert.c:195
+#: builtin/revert.c:197
 msgid "revert failed"
 msgstr "还原失败"
 
-#: builtin/revert.c:210
+#: builtin/revert.c:212
 msgid "cherry-pick failed"
 msgstr "拣选失败"
 
@@ -9206,11 +9176,11 @@ msgstr "删除符号引用"
 msgid "shorten ref output"
 msgstr "简短的引用输出"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
 msgid "reason"
 msgstr "原因"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
 msgid "reason of the update"
 msgstr "更新的原因"
 
@@ -9235,32 +9205,32 @@ msgstr ""
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <标签名>..."
 
-#: builtin/tag.c:60
+#: builtin/tag.c:67
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "非法的对象于 '%s'"
 
-#: builtin/tag.c:207
+#: builtin/tag.c:239
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "tag 名字太长:%.*s..."
 
-#: builtin/tag.c:212
+#: builtin/tag.c:244
 #, c-format
 msgid "tag '%s' not found."
 msgstr "tag '%s' 未发现。"
 
-#: builtin/tag.c:227
+#: builtin/tag.c:259
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "已删除 tag '%s'(曾为 %s)\n"
 
-#: builtin/tag.c:239
+#: builtin/tag.c:271
 #, c-format
 msgid "could not verify the tag '%s'"
 msgstr "不能校验 tag '%s'"
 
-#: builtin/tag.c:249
+#: builtin/tag.c:281
 #, c-format
 msgid ""
 "\n"
@@ -9271,7 +9241,7 @@ msgstr ""
 "输入一个 tag 说明\n"
 "以 '%c' 开头的行将被忽略。\n"
 
-#: builtin/tag.c:253
+#: builtin/tag.c:285
 #, c-format
 msgid ""
 "\n"
@@ -9283,254 +9253,271 @@ msgstr ""
 "输入一个 tag 说明\n"
 "以 '%c' 开头的行将被保留,如果您愿意也可以删除它们。\n"
 
-#: builtin/tag.c:292
+#: builtin/tag.c:324
 msgid "unable to sign the tag"
 msgstr "无法签署 tag"
 
-#: builtin/tag.c:294
+#: builtin/tag.c:326
 msgid "unable to write tag file"
 msgstr "无法写 tag 文件"
 
-#: builtin/tag.c:319
+#: builtin/tag.c:351
 msgid "bad object type."
 msgstr "坏的对象类型。"
 
-#: builtin/tag.c:332
+#: builtin/tag.c:364
 msgid "tag header too big."
 msgstr "tag 头信息太大。"
 
-#: builtin/tag.c:368
+#: builtin/tag.c:400
 msgid "no tag message?"
 msgstr "无 tag 说明?"
 
-#: builtin/tag.c:374
+#: builtin/tag.c:406
 #, c-format
 msgid "The tag message has been left in %s\n"
 msgstr "tag 说明被保留在 %s\n"
 
-#: builtin/tag.c:423
+#: builtin/tag.c:455
 msgid "switch 'points-at' requires an object"
 msgstr "开关 'points-at' 需要一个对象"
 
-#: builtin/tag.c:425
+#: builtin/tag.c:457
 #, c-format
 msgid "malformed object name '%s'"
 msgstr "非法的对象名 '%s'"
 
-#: builtin/tag.c:445
+#: builtin/tag.c:480
+#, c-format
+msgid "unsupported sort specification %s"
+msgstr "不支持的排序规格 %s"
+
+#: builtin/tag.c:500
 msgid "list tag names"
 msgstr "列出tag名称"
 
-#: builtin/tag.c:447
+#: builtin/tag.c:502
 msgid "print <n> lines of each tag message"
 msgstr "每个 tag 信息打印 <n> 行"
 
-#: builtin/tag.c:449
+#: builtin/tag.c:504
 msgid "delete tags"
 msgstr "删除 tags"
 
-#: builtin/tag.c:450
+#: builtin/tag.c:505
 msgid "verify tags"
 msgstr "验证 tags"
 
-#: builtin/tag.c:452
+#: builtin/tag.c:507
 msgid "Tag creation options"
 msgstr "Tag 创建选项"
 
-#: builtin/tag.c:454
+#: builtin/tag.c:509
 msgid "annotated tag, needs a message"
 msgstr "注解 tag,需要一个说明"
 
-#: builtin/tag.c:456
+#: builtin/tag.c:511
 msgid "tag message"
 msgstr "tag 说明"
 
-#: builtin/tag.c:458
+#: builtin/tag.c:513
 msgid "annotated and GPG-signed tag"
 msgstr "注解并 GPG 签名的 tag"
 
-#: builtin/tag.c:462
+#: builtin/tag.c:517
 msgid "use another key to sign the tag"
 msgstr "使用另外的私钥签名 tag"
 
-#: builtin/tag.c:463
+#: builtin/tag.c:518
 msgid "replace the tag if exists"
 msgstr "如果存在,替换现有的 tag"
 
-#: builtin/tag.c:464
+#: builtin/tag.c:519
 msgid "show tag list in columns"
 msgstr "以列的方式显示 tag"
 
-#: builtin/tag.c:466
+#: builtin/tag.c:521
+msgid "sort tags"
+msgstr "排序 tags"
+
+#: builtin/tag.c:525
 msgid "Tag listing options"
 msgstr "Tag 列表选项"
 
-#: builtin/tag.c:469
+#: builtin/tag.c:528 builtin/tag.c:534
 msgid "print only tags that contain the commit"
 msgstr "只打印包含提交的tags"
 
-#: builtin/tag.c:475
+#: builtin/tag.c:540
 msgid "print only tags of the object"
 msgstr "只打印tags对象"
 
-#: builtin/tag.c:501
+#: builtin/tag.c:566
 msgid "--column and -n are incompatible"
 msgstr "--column 和 -n 不兼容"
 
-#: builtin/tag.c:518
+#: builtin/tag.c:578
+msgid "--sort and -n are incompatible"
+msgstr "--sort 和 -n 不兼容"
+
+#: builtin/tag.c:585
 msgid "-n option is only allowed with -l."
 msgstr "-n 选项只允许和 -l 同时使用。"
 
-#: builtin/tag.c:520
+#: builtin/tag.c:587
 msgid "--contains option is only allowed with -l."
 msgstr "--contains 选项只允许和 -l 同时使用。"
 
-#: builtin/tag.c:522
+#: builtin/tag.c:589
 msgid "--points-at option is only allowed with -l."
 msgstr "--points-at 选项只允许和 -l 同时使用。"
 
-#: builtin/tag.c:530
+#: builtin/tag.c:597
 msgid "only one -F or -m option is allowed."
 msgstr "只允许一个 -F 或 -m 选项。"
 
-#: builtin/tag.c:550
+#: builtin/tag.c:617
 msgid "too many params"
 msgstr "太多参数"
 
-#: builtin/tag.c:556
+#: builtin/tag.c:623
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' 不是一个有效的tag名称。"
 
-#: builtin/tag.c:561
+#: builtin/tag.c:628
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "tag '%s' 已存在"
 
-#: builtin/tag.c:579
+#: builtin/tag.c:646
 #, c-format
 msgid "%s: cannot lock the ref"
 msgstr "%s:不能锁定引用"
 
-#: builtin/tag.c:581
+#: builtin/tag.c:648
 #, c-format
 msgid "%s: cannot update the ref"
 msgstr "%s:不能更新引用"
 
-#: builtin/tag.c:583
+#: builtin/tag.c:650
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "已更新tag '%s'(曾为 %s)\n"
 
-#: builtin/update-index.c:402
+#: builtin/unpack-objects.c:483
+msgid "Unpacking objects"
+msgstr "展开对象中"
+
+#: builtin/update-index.c:399
 msgid "git update-index [options] [--] [<file>...]"
 msgstr "git update-index [选项] [--] [<文件>...]"
 
-#: builtin/update-index.c:720
+#: builtin/update-index.c:748
 msgid "continue refresh even when index needs update"
 msgstr "当索引需要更新时继续刷新"
 
-#: builtin/update-index.c:723
+#: builtin/update-index.c:751
 msgid "refresh: ignore submodules"
 msgstr "刷新:忽略子模组"
 
-#: builtin/update-index.c:726
+#: builtin/update-index.c:754
 msgid "do not ignore new files"
 msgstr "不忽略新的文件"
 
-#: builtin/update-index.c:728
+#: builtin/update-index.c:756
 msgid "let files replace directories and vice-versa"
 msgstr "让文件替换目录(反之亦然)"
 
-#: builtin/update-index.c:730
+#: builtin/update-index.c:758
 msgid "notice files missing from worktree"
 msgstr "通知文件从工作区丢失"
 
-#: builtin/update-index.c:732
+#: builtin/update-index.c:760
 msgid "refresh even if index contains unmerged entries"
 msgstr "即使索引区包含未合并的条目也执行刷新"
 
-#: builtin/update-index.c:735
+#: builtin/update-index.c:763
 msgid "refresh stat information"
 msgstr "刷新统计信息"
 
-#: builtin/update-index.c:739
+#: builtin/update-index.c:767
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr "类似于 --refresh,但是忽略 assume-unchanged 设置"
 
-#: builtin/update-index.c:743
-msgid "<mode> <object> <path>"
-msgstr "<mode> <object> <path>"
+#: builtin/update-index.c:771
+msgid "<mode>,<object>,<path>"
+msgstr "<mode>,<object>,<path>"
 
-#: builtin/update-index.c:744
+#: builtin/update-index.c:772
 msgid "add the specified entry to the index"
 msgstr "添加指定的条目到索引区"
 
-#: builtin/update-index.c:748
+#: builtin/update-index.c:776
 msgid "(+/-)x"
 msgstr "(+/-)x"
 
-#: builtin/update-index.c:749
+#: builtin/update-index.c:777
 msgid "override the executable bit of the listed files"
 msgstr "覆盖列表里文件的可执行位"
 
-#: builtin/update-index.c:753
+#: builtin/update-index.c:781
 msgid "mark files as \"not changing\""
 msgstr "把文件标记为 \"没有变更\""
 
-#: builtin/update-index.c:756
+#: builtin/update-index.c:784
 msgid "clear assumed-unchanged bit"
 msgstr "清除 assumed-unchanged 位"
 
-#: builtin/update-index.c:759
+#: builtin/update-index.c:787
 msgid "mark files as \"index-only\""
 msgstr "把文件标记为 \"仅索引\""
 
-#: builtin/update-index.c:762
+#: builtin/update-index.c:790
 msgid "clear skip-worktree bit"
 msgstr "清除 skip-worktree 位"
 
-#: builtin/update-index.c:765
+#: builtin/update-index.c:793
 msgid "add to index only; do not add content to object database"
 msgstr "只添加到索引区;不添加对象到对象库"
 
-#: builtin/update-index.c:767
+#: builtin/update-index.c:795
 msgid "remove named paths even if present in worktree"
 msgstr "即使存在工作区里,也删除路径"
 
-#: builtin/update-index.c:769
+#: builtin/update-index.c:797
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr "携带 --stdin:输入的行以 null 字符终止"
 
-#: builtin/update-index.c:771
+#: builtin/update-index.c:799
 msgid "read list of paths to be updated from standard input"
 msgstr "从标准输入中读取需要更新的路径列表"
 
-#: builtin/update-index.c:775
+#: builtin/update-index.c:803
 msgid "add entries from standard input to the index"
 msgstr "从标准输入添加条目到索引区"
 
-#: builtin/update-index.c:779
+#: builtin/update-index.c:807
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr "为指定文件重新生成第2和第3暂存区"
 
-#: builtin/update-index.c:783
+#: builtin/update-index.c:811
 msgid "only update entries that differ from HEAD"
 msgstr "只更新与 HEAD 不同的条目"
 
-#: builtin/update-index.c:787
+#: builtin/update-index.c:815
 msgid "ignore files missing from worktree"
 msgstr "忽略工作区丢失的文件"
 
-#: builtin/update-index.c:790
+#: builtin/update-index.c:818
 msgid "report actions to standard output"
 msgstr "在标准输出显示操作"
 
-#: builtin/update-index.c:792
+#: builtin/update-index.c:820
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr "(for porcelains) 忘记保存的未解决的冲突"
 
-#: builtin/update-index.c:796
+#: builtin/update-index.c:824
 msgid "write index in this format"
 msgstr "以这种格式写入索引区"
 
@@ -9546,19 +9533,19 @@ msgstr "git update-ref [选项]    <引用名> <新值> [<旧值>]"
 msgid "git update-ref [options] --stdin [-z]"
 msgstr "git update-ref [选项] --stdin [-z]"
 
-#: builtin/update-ref.c:255
+#: builtin/update-ref.c:256
 msgid "delete the reference"
 msgstr "删除引用"
 
-#: builtin/update-ref.c:257
+#: builtin/update-ref.c:258
 msgid "update <refname> not the one it points to"
 msgstr "更新 <引用名> 本身而不是它指向的引用"
 
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:259
 msgid "stdin has NUL-terminated arguments"
 msgstr "标准输入有以 NUL 字符终止的参数"
 
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:260
 msgid "read updates from stdin"
 msgstr "从标准输入读取更新"
 
@@ -9615,23 +9602,23 @@ msgstr ""
 "命令 'git help -a' 和 'git help -g' 显示可用的子命令和一些指南。参见\n"
 "'git help <命令>' 或 'git help <指南>' 来查看给定的子命令帮助或指南。"
 
-#: parse-options.h:146
-msgid "expiry date"
+#: parse-options.h:143
+msgid "expiry-date"
 msgstr "逾期日期"
 
-#: parse-options.h:161
+#: parse-options.h:158
 msgid "no-op (backward compatibility)"
 msgstr "空操作(向后兼容)"
 
-#: parse-options.h:235
+#: parse-options.h:232
 msgid "be more verbose"
 msgstr "更加详细"
 
-#: parse-options.h:237
+#: parse-options.h:234
 msgid "be more quiet"
 msgstr "更加安静"
 
-#: parse-options.h:243
+#: parse-options.h:240
 msgid "use <n> digits to display SHA-1s"
 msgstr "用 <n> 位数字显示 SHA-1 哈希值"
 
@@ -9719,17 +9706,17 @@ msgstr "显示工作区状态"
 msgid "Create, list, delete or verify a tag object signed with GPG"
 msgstr "创建、列出、删除或校验一个GPG签名的 tag 对象"
 
-#: git-am.sh:50
+#: git-am.sh:52
 msgid "You need to set your committer info first"
 msgstr "您需要先设置你的提交者信息"
 
-#: git-am.sh:95
+#: git-am.sh:97
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
 msgstr "您好像在上一次 'am' 失败后移动了 HEAD。未回退至 ORIG_HEAD"
 
-#: git-am.sh:105
+#: git-am.sh:107
 #, sh-format
 msgid ""
 "When you have resolved this problem, run \"$cmdline --continue\".\n"
@@ -9740,19 +9727,19 @@ msgstr ""
 "如果您想跳过此补丁,则执行 \"$cmdline --skip\"。\n"
 "要恢复原分支并停止打补丁,执行 \"$cmdline --abort\"。"
 
-#: git-am.sh:121
+#: git-am.sh:123
 msgid "Cannot fall back to three-way merge."
 msgstr "无法求助于三路合并。"
 
-#: git-am.sh:137
+#: git-am.sh:139
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr "版本库缺乏必要的数据(blob)对象以进行三路合并。"
 
-#: git-am.sh:139
+#: git-am.sh:141
 msgid "Using index info to reconstruct a base tree..."
 msgstr "使用索引来重建一个(三路合并的)基础目录树..."
 
-#: git-am.sh:154
+#: git-am.sh:156
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
@@ -9760,28 +9747,28 @@ msgstr ""
 "您是否曾手动编辑过您的补丁?\n"
 "无法应用补丁到索引中的数据(blob)对象上。"
 
-#: git-am.sh:163
+#: git-am.sh:165
 msgid "Falling back to patching base and 3-way merge..."
 msgstr "转而在基础版本上打补丁及进行三路合并..."
 
-#: git-am.sh:179
+#: git-am.sh:181
 msgid "Failed to merge in the changes."
 msgstr "无法合并变更。"
 
-#: git-am.sh:274
+#: git-am.sh:276
 msgid "Only one StGIT patch series can be applied at once"
 msgstr "一次只能有一个 StGIT 补丁队列被应用"
 
-#: git-am.sh:361
+#: git-am.sh:363
 #, sh-format
 msgid "Patch format $patch_format is not supported."
 msgstr "不支持 $patch_format 补丁格式。"
 
-#: git-am.sh:363
+#: git-am.sh:365
 msgid "Patch format detection failed."
 msgstr "补丁格式检测失败。"
 
-#: git-am.sh:389
+#: 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."
@@ -9789,16 +9776,16 @@ msgstr ""
 "参数 -b/--binary 已经很长时间不做任何实质操作了,并且将被删除。\n"
 "请不要再使用它了。"
 
-#: git-am.sh:479
+#: git-am.sh:486
 #, sh-format
 msgid "previous rebase directory $dotest still exists but mbox given."
 msgstr "之前的变基目录 $dotest 仍然存在,但却提供了 mbox。"
 
-#: git-am.sh:484
+#: git-am.sh:491
 msgid "Please make up your mind. --skip or --abort?"
 msgstr "请下决心。--skip 或是 --abort ?"
 
-#: git-am.sh:520
+#: git-am.sh:527
 #, sh-format
 msgid ""
 "Stray $dotest directory found.\n"
@@ -9807,16 +9794,16 @@ msgstr ""
 "发现了错误的 $dotest 目录。\n"
 "使用 \"git am --abort\" 删除它。"
 
-#: git-am.sh:528
+#: git-am.sh:535
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr "解决操作未进行,我们不会继续。"
 
-#: git-am.sh:594
+#: git-am.sh:601
 #, sh-format
 msgid "Dirty index: cannot apply patches (dirty: $files)"
 msgstr "脏的索引:不能应用补丁(脏文件:$files)"
 
-#: git-am.sh:698
+#: git-am.sh:705
 #, sh-format
 msgid ""
 "Patch is empty.  Was it split wrong?\n"
@@ -9827,15 +9814,15 @@ msgstr ""
 "如果您想要跳过这个补丁,执行 \"$cmdline --skip\"。\n"
 "要恢复原分支并停止打补丁,执行 \"$cmdline --abort\"。"
 
-#: git-am.sh:725
+#: git-am.sh:732
 msgid "Patch does not have a valid e-mail address."
 msgstr "补丁中没有一个有效的邮件地址。"
 
-#: git-am.sh:772
+#: git-am.sh:779
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr "标准输入没有和终端关联,不能进行交互式操作。"
 
-#: git-am.sh:776
+#: git-am.sh:783
 msgid "Commit Body is:"
 msgstr "提交内容为:"
 
@@ -9843,16 +9830,16 @@ msgstr "提交内容为:"
 #. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
 #. in your translation. The program will only accept English
 #. input at this point.
-#: git-am.sh:783
+#: git-am.sh:790
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
 msgstr "应用?[y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
 
-#: git-am.sh:819
+#: git-am.sh:826
 #, sh-format
 msgid "Applying: $FIRSTLINE"
 msgstr "正应用:$FIRSTLINE"
 
-#: git-am.sh:840
+#: 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"
@@ -9862,22 +9849,22 @@ msgstr ""
 "如果没有什么要添加到暂存区的,则很可能是其它提交已经引入了相同的变更。\n"
 "您也许想要跳过这个补丁。"
 
-#: git-am.sh:848
+#: 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:864
+#: git-am.sh:871
 msgid "No changes -- Patch already applied."
 msgstr "没有变更 —— 补丁已经应用过。"
 
-#: git-am.sh:874
+#: git-am.sh:881
 #, sh-format
 msgid "Patch failed at $msgnum $FIRSTLINE"
 msgstr "补丁失败于 $msgnum $FIRSTLINE"
 
-#: git-am.sh:877
+#: git-am.sh:884
 #, sh-format
 msgid ""
 "The copy of the patch that failed is found in:\n"
@@ -9886,7 +9873,7 @@ msgstr ""
 "失败的补丁文件副本位于:\n"
 "   $dotest/patch"
 
-#: git-am.sh:895
+#: git-am.sh:902
 msgid "applying to an empty history"
 msgstr "正应用到一个空历史上"
 
@@ -9953,8 +9940,6 @@ msgstr "输入坏的版本:$rev"
 msgid "'git bisect bad' can take only one argument."
 msgstr "'git bisect bad' 只能带一个参数。"
 
-#. have bad but not good.  we could bisect although
-#. this is less optimum.
 #: git-bisect.sh:273
 msgid "Warning: bisecting only with a bad commit."
 msgstr "警告:在仅有一个坏提交下进行二分查找。"
@@ -10061,15 +10046,11 @@ msgstr ""
 msgid "Pull is not possible because you have unmerged files."
 msgstr "Pull 不可用,因为您尚有未合并的文件。"
 
-#: git-pull.sh:223
+#: git-pull.sh:247
 msgid "updating an unborn branch with changes added to the index"
 msgstr "更新尚未诞生的分支,变更添加至索引"
 
-#. The fetch involved updating the current branch.
-#. The working tree and the index file is still based on the
-#. $orig_head commit, but we are merging into $curr_head.
-#. First update the working tree to match $curr_head.
-#: git-pull.sh:247
+#: git-pull.sh:271
 #, sh-format
 msgid ""
 "Warning: fetch updated the current branch head.\n"
@@ -10079,15 +10060,15 @@ msgstr ""
 "警告:fetch 更新了当前的分支。您的工作区\n"
 "警告:从原提交 $orig_head 快进。"
 
-#: git-pull.sh:272
+#: git-pull.sh:296
 msgid "Cannot merge multiple branches into empty head"
 msgstr "无法将多个分支合并到空分支"
 
-#: git-pull.sh:276
+#: git-pull.sh:300
 msgid "Cannot rebase onto multiple branches"
 msgstr "无法变基到多个分支"
 
-#: git-rebase.sh:55
+#: 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"
@@ -10098,16 +10079,16 @@ msgstr ""
 "如果您想跳过此补丁,则执行 \"git rebase --skip\"。\n"
 "要恢复原分支并停止变基,执行 \"git rebase --abort\"。"
 
-#: git-rebase.sh:158
+#: git-rebase.sh:164
 msgid "Applied autostash."
 msgstr "成功应用 autostash。"
 
-#: git-rebase.sh:161
+#: git-rebase.sh:167
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "无法保存 $stash_sha1"
 
-#: git-rebase.sh:162
+#: git-rebase.sh:168
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
@@ -10117,31 +10098,31 @@ msgstr ""
 "您的修改安全地保存在 stash 中。\n"
 "您可以在任何时候运行 \"git stash pop\" 或 \"git stash drop\"。\n"
 
-#: git-rebase.sh:201
+#: git-rebase.sh:207
 msgid "The pre-rebase hook refused to rebase."
 msgstr "钩子 pre-rebase 拒绝变基操作。"
 
-#: git-rebase.sh:206
+#: git-rebase.sh:212
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "似乎正处于在 git-am 的执行过程中。无法变基。"
 
-#: git-rebase.sh:346
+#: git-rebase.sh:350
 msgid "The --exec option must be used with the --interactive option"
 msgstr "选项 --exec 必须和选项 --interactive 同时使用"
 
-#: git-rebase.sh:351
+#: git-rebase.sh:355
 msgid "No rebase in progress?"
 msgstr "没有正在进行的变基?"
 
-#: git-rebase.sh:362
+#: git-rebase.sh:366
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr "动作 --edit-todo 只能用在交互式变基过程中。"
 
-#: git-rebase.sh:369
+#: git-rebase.sh:373
 msgid "Cannot read HEAD"
 msgstr "不能读取 HEAD"
 
-#: git-rebase.sh:372
+#: git-rebase.sh:376
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -10149,12 +10130,12 @@ msgstr ""
 "您必须编辑所有的合并冲突,然后通过 git add\n"
 "命令将它们标记为已解决"
 
-#: git-rebase.sh:390
+#: git-rebase.sh:394
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "无法移回 $head_name"
 
-#: git-rebase.sh:409
+#: git-rebase.sh:413
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -10173,65 +10154,64 @@ msgstr ""
 "\t$cmd_clear_stale_rebase\n"
 "然后再重新执行变基操作。 为避免丢失重要数据,我已经停止当前操作。"
 
-#: git-rebase.sh:456
+#: git-rebase.sh:464
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "无效的上游 $upstream_name"
 
-#: git-rebase.sh:480
+#: git-rebase.sh:488
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: 有一个以上的合并基准"
 
-#: git-rebase.sh:483 git-rebase.sh:487
+#: git-rebase.sh:491 git-rebase.sh:495
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: 没有合并基准"
 
-#: git-rebase.sh:492
+#: git-rebase.sh:500
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "没有指向一个有效的提交:$onto_name"
 
-#: git-rebase.sh:515
+#: git-rebase.sh:523
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "严重错误:无此分支:$branch_name"
 
-#: git-rebase.sh:548
+#: git-rebase.sh:556
 msgid "Cannot autostash"
 msgstr "无法 autostash"
 
-#: git-rebase.sh:553
+#: git-rebase.sh:561
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "创建了 autostash: $stash_abbrev"
 
-#: git-rebase.sh:557
+#: git-rebase.sh:565
 msgid "Please commit or stash them."
 msgstr "请提交或为它们保存进度。"
 
-#: git-rebase.sh:577
+#: git-rebase.sh:585
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "当前分支 $branch_name 是最新的。"
 
-#: git-rebase.sh:581
+#: git-rebase.sh:589
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "当前分支 $branch_name 是最新的,强制变基。"
 
-#: git-rebase.sh:592
+#: git-rebase.sh:600
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "变更从 $mb 到 $onto:"
 
-#. Detach HEAD and reset the tree
-#: git-rebase.sh:601
+#: git-rebase.sh:609
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr "首先,重置头指针以便在上面重放您的工作..."
 
-#: git-rebase.sh:611
+#: git-rebase.sh:619
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "快进 $branch_name 至 $onto_name。"
@@ -10352,21 +10332,21 @@ msgstr "无法还原修改的文件"
 msgid "Index was not unstashed."
 msgstr "索引的进度没有被恢复。"
 
-#: git-stash.sh:523
+#: git-stash.sh:529
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "丢弃了 ${REV} ($s)"
 
-#: git-stash.sh:524
+#: git-stash.sh:530
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}:不能丢弃进度条目"
 
-#: git-stash.sh:531
+#: git-stash.sh:537
 msgid "No branch name specified"
 msgstr "未指定分支名"
 
-#: git-stash.sh:603
+#: git-stash.sh:609
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(为恢复数据输入 \"git stash apply\")"
 
@@ -10380,31 +10360,31 @@ msgstr "无法从 url '$remoteurl' 剥离一个组件"
 msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
 msgstr "未在 .gitmodules 中发现路径 '$sm_path' 的子模组映射"
 
-#: git-submodule.sh:281
+#: git-submodule.sh:287
 #, sh-format
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
 msgstr "无法克隆 '$url' 到子模组路径 '$sm_path'"
 
-#: git-submodule.sh:293
+#: git-submodule.sh:299
 #, sh-format
 msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
 msgstr "Gitdir '$a' 在子模组路径 '$b' 之下或相反"
 
-#: git-submodule.sh:403
+#: git-submodule.sh:409
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr "只能在工作区的顶级目录中使用相对路径"
 
-#: git-submodule.sh:413
+#: git-submodule.sh:419
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "版本库URL:'$repo' 必须是绝对路径或以 ./|../ 起始"
 
-#: git-submodule.sh:430
+#: git-submodule.sh:436
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' 已经存在于索引中"
 
-#: git-submodule.sh:434
+#: git-submodule.sh:440
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -10415,134 +10395,134 @@ msgstr ""
 "$sm_path\n"
 "如果您确实想添加它,使用 -f 参数。"
 
-#: git-submodule.sh:452
+#: git-submodule.sh:458
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "添加位于 '$sm_path' 的现存版本库到索引"
 
-#: git-submodule.sh:454
+#: git-submodule.sh:460
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path' 已存在且不是一个有效的 git 版本库"
 
-#: git-submodule.sh:462
+#: git-submodule.sh:468
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr "本地发现 '$sm_name' 的一个 git 目录,与其对应的远程版本库:"
 
-#: git-submodule.sh:464
+#: git-submodule.sh:470
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
 msgstr "如果您想重用此本地 git 目录而不是重新克隆自"
 
-#: git-submodule.sh:466
+#: git-submodule.sh:472
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
 msgstr "使用 '--force' 参数。如果本地 git 目录不是正确的版本库"
 
-#: git-submodule.sh:467
+#: git-submodule.sh:473
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
 "option."
 msgstr "或者您不确定其中含义使用 '--name' 参数选择另外一个名称。"
 
-#: git-submodule.sh:469
+#: git-submodule.sh:475
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "激活本地 git 目录到子模组 '$sm_name'。"
 
-#: git-submodule.sh:481
+#: git-submodule.sh:487
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "不能检出子模组 '$sm_path'"
 
-#: git-submodule.sh:486
+#: git-submodule.sh:492
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "无法添加子模组 '$sm_path'"
 
-#: git-submodule.sh:495
+#: git-submodule.sh:501
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "无法注册子模组 '$sm_path'"
 
-#: git-submodule.sh:539
+#: git-submodule.sh:545
 #, sh-format
 msgid "Entering '$prefix$displaypath'"
 msgstr "正在进入 '$prefix$displaypath'"
 
-#: git-submodule.sh:559
+#: git-submodule.sh:565
 #, sh-format
 msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
 msgstr "停止于 '$prefix$displaypath',脚本返回非零值。"
 
-#: git-submodule.sh:605
+#: git-submodule.sh:611
 #, sh-format
 msgid "No url found for submodule path '$displaypath' in .gitmodules"
 msgstr "在 .gitmodules 中未找到子模组路径 '$displaypath' 的 url"
 
-#: git-submodule.sh:614
+#: git-submodule.sh:620
 #, sh-format
 msgid "Failed to register url for submodule path '$displaypath'"
 msgstr "无法为子模组路径 '$displaypath' 注册 url"
 
-#: git-submodule.sh:616
+#: git-submodule.sh:622
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$displaypath'"
 msgstr "子模组 '$name' ($url) 未对路径 '$displaypath' 注册"
 
-#: git-submodule.sh:633
+#: git-submodule.sh:639
 #, sh-format
 msgid "Failed to register update mode for submodule path '$displaypath'"
 msgstr "无法为子模组路径 '$displaypath' 注册更新模式"
 
-#: git-submodule.sh:671
+#: git-submodule.sh:677
 #, sh-format
 msgid "Use '.' if you really want to deinitialize all submodules"
 msgstr "使用 '.' 如果您真的想要对所有子模组取消初始化"
 
-#: git-submodule.sh:688
+#: git-submodule.sh:694
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr "子模组工作区 '$displaypath' 包含一个 .git 目录"
 
-#: git-submodule.sh:689
+#: git-submodule.sh:695
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr "(使用 'rm -rf' 命令如果您真的想删除它及其全部历史)"
 
-#: git-submodule.sh:695
+#: git-submodule.sh:701
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
 "discard them"
 msgstr "子模组工作区 '$displaypath' 包含本地修改;使用 '-f' 丢弃它们"
 
-#: git-submodule.sh:698
+#: git-submodule.sh:704
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "已清除目录 '$displaypath'"
 
-#: git-submodule.sh:699
+#: git-submodule.sh:705
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "无法移除子模组工作区 '$displaypath'"
 
-#: git-submodule.sh:702
+#: git-submodule.sh:708
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "不能创建空的子模组目录 '$displaypath'"
 
-#: git-submodule.sh:711
+#: git-submodule.sh:717
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr "子模组 '$name' ($url) 未对路径 '$displaypath' 注册"
 
-#: git-submodule.sh:834
+#: git-submodule.sh:833
 #, sh-format
 msgid ""
 "Submodule path '$displaypath' not initialized\n"
@@ -10551,109 +10531,217 @@ msgstr ""
 "子模组路径 '$displaypath' 没有初始化\n"
 "也许您想用 'update --init'?"
 
-#: git-submodule.sh:847
+#: git-submodule.sh:846
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中找到当前版本"
 
-#: git-submodule.sh:856
+#: git-submodule.sh:855
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "无法在子模组路径 '$sm_path' 中获取"
 
-#: git-submodule.sh:880
+#: git-submodule.sh:879
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中获取"
 
+#: git-submodule.sh:893
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+msgstr "无法在子模组路径 '$displaypath' 中检出 '$sha1'"
+
 #: git-submodule.sh:894
 #, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "子模组路径 '$displaypath':检出 '$sha1'"
+
+#: git-submodule.sh:898
+#, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中变基 '$sha1'"
 
-#: git-submodule.sh:895
+#: git-submodule.sh:899
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "子模组路径 '$displaypath':变基至 '$sha1'"
 
-#: git-submodule.sh:900
+#: git-submodule.sh:904
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "无法合并 '$sha1' 到子模组路径 '$displaypath' 中"
 
-#: git-submodule.sh:901
+#: git-submodule.sh:905
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "子模组路径 '$displaypath':已合并入 '$sha1'"
 
-#: git-submodule.sh:906
+#: git-submodule.sh:910
 #, sh-format
 msgid ""
 "Execution of '$command $sha1' failed in submodule  path '$prefix$sm_path'"
 msgstr "在子模组路径 '$prefix$sm_path' 中执行 '$command $sha1' 失败"
 
-#: git-submodule.sh:907
+#: git-submodule.sh:911
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
 msgstr "子模组路径 '$prefix$sm_path': '$command $sha1'"
 
-#: git-submodule.sh:912
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
-msgstr "无法在子模组路径 '$displaypath' 中检出 '$sha1'"
-
-#: git-submodule.sh:913
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr "子模组路径 '$displaypath':检出 '$sha1'"
-
-#: git-submodule.sh:940
+#: git-submodule.sh:941
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "无法递归进子模组路径 '$displaypath'"
 
-#: git-submodule.sh:1048
+#: git-submodule.sh:1049
 msgid "The --cached option cannot be used with the --files option"
 msgstr "选项 --cached 不能和选项 --files 同时使用"
 
-#. unexpected type
-#: git-submodule.sh:1096
+#: git-submodule.sh:1097
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "意外的模式 $mod_dst"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:1116
+#: git-submodule.sh:1117
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  警告:$display_name 未包含提交 $sha1_src"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:1119
+#: git-submodule.sh:1120
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  警告:$display_name 未包含提交 $sha1_dst"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:1122
+#: git-submodule.sh:1123
 #, 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:1147
+#: git-submodule.sh:1148
 msgid "blob"
 msgstr "数据对象"
 
-#: git-submodule.sh:1261
+#: git-submodule.sh:1262
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "无法递归进子模组路径 '$sm_path'"
 
-#: git-submodule.sh:1325
+#: git-submodule.sh:1326
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "为 '$displaypath' 同步子模组 url"
 
+#~ msgid "key id"
+#~ msgstr "key id"
+
+#~ msgid "Tracking not set up: name too long: %s"
+#~ msgstr "跟踪未设置:名字太长:%s"
+
+#~ msgid "bug"
+#~ msgstr "bug"
+
+#  译者:注意保持句尾空格
+#~ msgid "ahead "
+#~ msgstr "领先 "
+
+#  译者:注意保持句尾空格
+#~ msgid ", behind "
+#~ msgstr ",落后 "
+
+#~ msgid "could not find .gitmodules in index"
+#~ msgstr "无法在索引中找到 .gitmodules"
+
+#~ msgid "reading updated .gitmodules failed"
+#~ msgstr "读取更新后的 .gitmodules 失败"
+
+#~ msgid "unable to stat updated .gitmodules"
+#~ msgstr "不能枚举更新后的 .gitmodules"
+
+#~ msgid "unable to remove .gitmodules from index"
+#~ msgstr "不能从索引中移除 .gitmodules"
+
+#~ msgid "adding updated .gitmodules failed"
+#~ msgstr "添加更新后的 .gitmodules 失败"
+
+#  译者:字符串首行行首要添加“warning: ”字串,故此首行要较其余行短
+#~ msgid ""
+#~ "The behavior of 'git add %s (or %s)' with no path argument from a\n"
+#~ "subdirectory of the tree will change in Git 2.0 and should not be used "
+#~ "anymore.\n"
+#~ "To add content for the whole tree, run:\n"
+#~ "\n"
+#~ "  git add %s :/\n"
+#~ "  (or git add %s :/)\n"
+#~ "\n"
+#~ "To restrict the command to the current directory, run:\n"
+#~ "\n"
+#~ "  git add %s .\n"
+#~ "  (or git add %s .)\n"
+#~ "\n"
+#~ "With the current Git version, the command is restricted to the current "
+#~ "directory.\n"
+#~ msgstr ""
+#~ "在 Git 2.0 版本,位于一个子目录下不带任何路径参数地执行命令\n"
+#~ "'git add %s (或 %s)' 的行为将被改变,不要再继续使用了。\n"
+#~ "如果要添加整个目录树的内容,执行:\n"
+#~ "\n"
+#~ "  git add %s :/\n"
+#~ "  (或 git add %s :/)\n"
+#~ "\n"
+#~ "如果要限制该命令只作用于当前目录,执行:\n"
+#~ "\n"
+#~ "  git add %s .\n"
+#~ "  (或 git add %s .)\n"
+#~ "\n"
+#~ "对于当前版本的 Git,这条命令只作用于当前目录。\n"
+
+#~ msgid ""
+#~ "You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
+#~ "whose behaviour will change in Git 2.0 with respect to paths you "
+#~ "removed.\n"
+#~ "Paths like '%s' that are\n"
+#~ "removed from your working tree are ignored with this version of Git.\n"
+#~ "\n"
+#~ "* 'git add --ignore-removal <pathspec>', which is the current default,\n"
+#~ "  ignores paths you removed from your working tree.\n"
+#~ "\n"
+#~ "* 'git add --all <pathspec>' will let you also record the removals.\n"
+#~ "\n"
+#~ "Run 'git status' to check the paths you removed from your working tree.\n"
+#~ msgstr ""
+#~ "您在运行 'git add' 时没有指定 '-A (--all)' 或 '--ignore-removal',\n"
+#~ "针对其中本地移除路径的行为将在 Git 2.0 版本库发生变化。\n"
+#~ "像本地工作区移除的路径 '%s'\n"
+#~ "在此版本的 Git 中被忽略。\n"
+#~ "\n"
+#~ "* 'git add --ignore-removal <路径规则>',是当前版本的默认操作,\n"
+#~ "  忽略您本地工作区中移除的文件。\n"
+#~ "\n"
+#~ "* 'git add --all <路径规则>' 将让您同时对删除操作进行记录。\n"
+#~ "\n"
+#~ "运行 'git status' 来检查您本地工作区中移除的路径。\n"
+
+#~ msgid ""
+#~ "Auto packing the repository for optimum performance. You may also\n"
+#~ "run \"git gc\" manually. See \"git help gc\" for more information.\n"
+#~ msgstr ""
+#~ "自动打包版本库以求最佳性能。您还可以手动运行 \"git gc\"。\n"
+#~ "参见 \"git help gc\" 以获取更多信息。\n"
+
+#~ msgid ""
+#~ "Updates were rejected because a pushed branch tip is behind its remote\n"
+#~ "counterpart. If you did not intend to push that branch, you may want to\n"
+#~ "specify branches to push or set the 'push.default' configuration "
+#~ "variable\n"
+#~ "to 'simple', 'current' or 'upstream' to push only the current branch."
+#~ msgstr ""
+#~ "更新被拒绝,因为推送的一个分支的最新提交落后于其对应的远程分支。\n"
+#~ "如果您并非有意推送该分支,您可以在推送时指定要推送的分支,或者将\n"
+#~ "配置变量 'push.default' 设置为 'simple'、'current' 或 'upstream'\n"
+#~ "以便只推送当前分支。"
+
 #  译者:为保证在输出中对齐,注意调整句中空格!
 #~ msgid "copied:     %s -> %s"
 #~ msgstr "拷贝:      %s -> %s"
@@ -10704,9 +10792,6 @@ msgstr "为 '$displaypath' 同步子模组 url"
 #~ "('simple' 模式由 Git 1.7.11 版本引入。如果您有时要使用老版本的 Git,\n"
 #~ "为保持兼容,请用 'current' 代替 'simple')"
 
-#~ msgid "done\n"
-#~ msgstr "完成\n"
-
 #~ msgid "input paths are terminated by a null character"
 #~ msgstr "输入路径以null字符终止"
 
@@ -10844,9 +10929,6 @@ msgstr "为 '$displaypath' 同步子模组 url"
 #~ msgid "Not removing %s\n"
 #~ msgstr "未删除 %s\n"
 
-#~ msgid "Auto packing the repository for optimum performance.\n"
-#~ msgstr "自动打包版本库以求最佳性能。\n"
-
 #~ msgid "git remote set-head <name> (-a | -d | <branch>])"
 #~ msgstr "git remote set-head <名称> (-a | -d | <分支>])"
 
@@ -10857,9 +10939,6 @@ msgstr "为 '$displaypath' 同步子模组 url"
 #~ msgid " (use \"git add\" to track)"
 #~ msgstr "(使用 \"git add\" 建立跟踪)"
 
-#~ msgid "-B cannot be used with -b"
-#~ msgstr "-B 不能和 -b 同时使用"
-
 #~ msgid "--detach cannot be used with -b/-B/--orphan"
 #~ msgstr "--detach 不能和 -b/-B/--orphan 同时使用"
 
index 3c43db558aee43b0ea69c23c6611dcc9fae0661f..e1e2cad36d6d2d2773f05c6e69b0013ed8d01240 100644 (file)
--- a/pretty.c
+++ b/pretty.c
@@ -393,8 +393,8 @@ static void add_rfc2047(struct strbuf *sb, const char *line, size_t len,
        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;
index ba13353b377d4f27b9ff6cf1b85811fcca61e224..7f5645e74546e459efdb584dbf63e1fd75857317 100644 (file)
@@ -1477,6 +1477,7 @@ int read_index_from(struct index_state *istate, const char *path)
        if (verify_hdr(hdr, mmap_size) < 0)
                goto unmap;
 
+       hashcpy(istate->sha1, (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);
@@ -1760,6 +1761,50 @@ static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce,
        return result;
 }
 
+/*
+ * This function verifies if index_state has the correct sha1 of the
+ * index file.  Don't die if we have any other failure, just return 0.
+ */
+static int verify_index_from(const struct index_state *istate, const char *path)
+{
+       int fd;
+       ssize_t n;
+       struct stat st;
+       unsigned char sha1[20];
+
+       if (!istate->initialized)
+               return 0;
+
+       fd = open(path, O_RDONLY);
+       if (fd < 0)
+               return 0;
+
+       if (fstat(fd, &st))
+               goto out;
+
+       if (st.st_size < sizeof(struct cache_header) + 20)
+               goto out;
+
+       n = pread_in_full(fd, sha1, 20, st.st_size - 20);
+       if (n != 20)
+               goto out;
+
+       if (hashcmp(istate->sha1, sha1))
+               goto out;
+
+       close(fd);
+       return 1;
+
+out:
+       close(fd);
+       return 0;
+}
+
+static int verify_index(const struct index_state *istate)
+{
+       return verify_index_from(istate, get_index_file());
+}
+
 static int has_racy_timestamp(struct index_state *istate)
 {
        int entries = istate->cache_nr;
@@ -1779,7 +1824,7 @@ static int has_racy_timestamp(struct index_state *istate)
 void update_index_if_able(struct index_state *istate, struct lock_file *lockfile)
 {
        if ((istate->cache_changed || has_racy_timestamp(istate)) &&
-           !write_index(istate, lockfile->fd))
+           verify_index(istate) && !write_index(istate, lockfile->fd))
                commit_locked_index(lockfile);
        else
                rollback_lock_file(lockfile);
diff --git a/refs.c b/refs.c
index 28d5eca8eaff7be48a4b89e6217886b8c96eb3b2..68982637ed89a2d679d5e2a9a86e76e6fb56a7b4 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -1999,7 +1999,6 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
 
        *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;
@@ -2008,12 +2007,9 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
                ref = resolve_ref_unsafe(path, hash, 1, 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;
@@ -3046,6 +3042,19 @@ int read_ref_at(const char *refname, unsigned long at_time, int cnt,
        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];
@@ -3243,9 +3252,9 @@ static struct ref_lock *update_ref_lock(const char *refname,
        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;
+               case UPDATE_REFS_MSG_ON_ERR: error(str, refname); break;
+               case UPDATE_REFS_DIE_ON_ERR: die(str, refname); break;
+               case UPDATE_REFS_QUIET_ON_ERR: break;
                }
        }
        return lock;
@@ -3258,15 +3267,118 @@ static int update_ref_write(const char *action, const char *refname,
        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;
+               case UPDATE_REFS_MSG_ON_ERR: error(str, refname); break;
+               case UPDATE_REFS_DIE_ON_ERR: die(str, refname); break;
+               case UPDATE_REFS_QUIET_ON_ERR: break;
                }
                return 1;
        }
        return 0;
 }
 
+/**
+ * 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;
+       int type;
+       const char refname[FLEX_ARRAY];
+};
+
+/*
+ * 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;
+};
+
+struct ref_transaction *ref_transaction_begin(void)
+{
+       return xcalloc(1, sizeof(struct ref_transaction));
+}
+
+static void ref_transaction_free(struct ref_transaction *transaction)
+{
+       int i;
+
+       for (i = 0; i < transaction->nr; i++)
+               free(transaction->updates[i]);
+
+       free(transaction->updates);
+       free(transaction);
+}
+
+void ref_transaction_rollback(struct ref_transaction *transaction)
+{
+       ref_transaction_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;
+}
+
+void ref_transaction_update(struct ref_transaction *transaction,
+                           const char *refname,
+                           unsigned char *new_sha1, unsigned char *old_sha1,
+                           int flags, int have_old)
+{
+       struct ref_update *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);
+}
+
+void ref_transaction_create(struct ref_transaction *transaction,
+                           const char *refname,
+                           unsigned char *new_sha1,
+                           int flags)
+{
+       struct ref_update *update = add_update(transaction, refname);
+
+       assert(!is_null_sha1(new_sha1));
+       hashcpy(update->new_sha1, new_sha1);
+       hashclr(update->old_sha1);
+       update->flags = flags;
+       update->have_old = 1;
+}
+
+void ref_transaction_delete(struct ref_transaction *transaction,
+                           const char *refname,
+                           unsigned char *old_sha1,
+                           int flags, int have_old)
+{
+       struct ref_update *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);
+       }
+}
+
 int update_ref(const char *action, const char *refname,
               const unsigned char *sha1, const unsigned char *oldval,
               int flags, enum action_on_err onerr)
@@ -3282,7 +3394,7 @@ 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,
@@ -3290,15 +3402,15 @@ static int ref_update_reject_duplicates(struct ref_update **updates, int n,
 {
        int i;
        for (i = 1; i < n; i++)
-               if (!strcmp(updates[i - 1]->ref_name, updates[i]->ref_name)) {
+               if (!strcmp(updates[i - 1]->refname, updates[i]->refname)) {
                        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:
+                       case UPDATE_REFS_MSG_ON_ERR:
+                               error(str, updates[i]->refname); break;
+                       case UPDATE_REFS_DIE_ON_ERR:
+                               die(str, updates[i]->refname); break;
+                       case UPDATE_REFS_QUIET_ON_ERR:
                                break;
                        }
                        return 1;
@@ -3306,26 +3418,21 @@ static int ref_update_reject_duplicates(struct ref_update **updates, int n,
        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,
+                          const char *msg, enum action_on_err onerr)
 {
        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)
+       if (!n)
                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)
@@ -3333,35 +3440,44 @@ int update_refs(const char *action, const struct ref_update **updates_orig,
 
        /* 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]) {
+               struct ref_update *update = updates[i];
+
+               update->lock = update_ref_lock(update->refname,
+                                              (update->have_old ?
+                                               update->old_sha1 : NULL),
+                                              update->flags,
+                                              &update->type, onerr);
+               if (!update->lock) {
                        ret = 1;
                        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 */
+       for (i = 0; i < n; i++) {
+               struct ref_update *update = updates[i];
+
+               if (!is_null_sha1(update->new_sha1)) {
+                       ret = update_ref_write(msg,
+                                              update->refname,
+                                              update->new_sha1,
+                                              update->lock, onerr);
+                       update->lock = NULL; /* freed by update_ref_write */
                        if (ret)
                                goto cleanup;
                }
+       }
 
        /* 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) {
+                       delnames[delnum++] = update->lock->ref_name;
+                       ret |= delete_ref_loose(update->lock, update->type);
                }
+       }
+
        ret |= repack_without_refs(delnames, delnum);
        for (i = 0; i < delnum; i++)
                unlink_or_warn(git_path("logs/%s", delnames[i]));
@@ -3369,12 +3485,10 @@ int update_refs(const char *action, const struct ref_update **updates_orig,
 
 cleanup:
        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);
+       ref_transaction_free(transaction);
        return ret;
 }
 
diff --git a/refs.h b/refs.h
index 87a1a79ad659f3520a22ae14bac1d5082cf2c27b..09ff483c19ec9484359864640da86f9a40418ecc 100644 (file)
--- a/refs.h
+++ b/refs.h
@@ -10,19 +10,7 @@ struct ref_lock {
        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.
- */
-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():
@@ -166,13 +154,19 @@ extern void unlock_ref(struct ref_lock *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);
+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,
                       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);
@@ -214,18 +208,80 @@ extern int rename_ref(const char *oldref, const char *newref, const char *logmsg
  */
 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
+ * eventually be commited using ref_transaction_commit() or rolled
+ * back using ref_transaction_rollback().
+ */
+struct ref_transaction *ref_transaction_begin(void);
+
+/*
+ * Roll back a ref_transaction and free all associated data.
+ */
+void ref_transaction_rollback(struct ref_transaction *transaction);
+
+
+/*
+ * 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, so the caller retains ownership of the parameter.  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.
+ */
+void ref_transaction_update(struct ref_transaction *transaction,
+                           const char *refname,
+                           unsigned char *new_sha1, unsigned char *old_sha1,
+                           int flags, int have_old);
+
+/*
+ * 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.
+ */
+void ref_transaction_create(struct ref_transaction *transaction,
+                           const char *refname,
+                           unsigned char *new_sha1,
+                           int flags);
+
+/*
+ * 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).
+ */
+void ref_transaction_delete(struct ref_transaction *transaction,
+                           const char *refname,
+                           unsigned char *old_sha1,
+                           int flags, int have_old);
+
+/*
+ * Commit all of the changes that have been queued in transaction, as
+ * atomically as possible.  Return a nonzero value if there is a
+ * problem.  The ref_transaction is freed by this function.
+ */
+int ref_transaction_commit(struct ref_transaction *transaction,
+                          const char *msg, enum action_on_err onerr);
+
+/** 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 *);
 
index 21b096932e033f0ebff92fc2224a79a132256ad2..eea2c8de45052e3e3a59fb150eef3f54c6086800 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -857,6 +857,32 @@ static int match_name_with_pattern(const char *key, const char *name,
        return ret;
 }
 
+static void query_refspecs_multiple(struct refspec *refs, int ref_count, struct refspec *query, struct string_list *results)
+{
+       int i;
+       int find_src = !query->src;
+
+       if (find_src && !query->dst)
+               error("query_refspecs_multiple: need either src or dst");
+
+       for (i = 0; i < ref_count; i++) {
+               struct refspec *refspec = &refs[i];
+               const char *key = find_src ? refspec->dst : refspec->src;
+               const char *value = find_src ? refspec->src : refspec->dst;
+               const char *needle = find_src ? query->dst : query->src;
+               char **result = find_src ? &query->src : &query->dst;
+
+               if (!refspec->dst)
+                       continue;
+               if (refspec->pattern) {
+                       if (match_name_with_pattern(key, needle, value, result))
+                               string_list_append_nodup(results, *result);
+               } else if (!strcmp(needle, key)) {
+                       string_list_append(results, value);
+               }
+       }
+}
+
 int query_refspecs(struct refspec *refs, int ref_count, struct refspec *query)
 {
        int i;
@@ -1455,7 +1481,7 @@ int match_push_refs(struct ref *src, struct ref **dst,
                                /*
                                 * Remote doesn't have it, and we have no
                                 * explicit pattern, and we don't have
-                                * --all nor --mirror.
+                                * --all or --mirror.
                                 */
                                goto free_name;
 
@@ -2043,25 +2069,37 @@ static int get_stale_heads_cb(const char *refname,
        const unsigned char *sha1, int flags, void *cb_data)
 {
        struct stale_heads_info *info = cb_data;
+       struct string_list matches = STRING_LIST_INIT_DUP;
        struct refspec query;
+       int i, stale = 1;
        memset(&query, 0, sizeof(struct refspec));
        query.dst = (char *)refname;
 
-       if (query_refspecs(info->refs, info->ref_count, &query))
-               return 0; /* No matches */
+       query_refspecs_multiple(info->refs, info->ref_count, &query, &matches);
+       if (matches.nr == 0)
+               goto clean_exit; /* No matches */
 
        /*
         * If we did find a suitable refspec and it's not a symref and
         * it's not in the list of refs that currently exist in that
-        * remote we consider it to be stale.
+        * remote, we consider it to be stale. In order to deal with
+        * overlapping refspecs, we need to go over all of the
+        * matching refs.
         */
-       if (!((flags & REF_ISSYMREF) ||
-             string_list_has_string(info->ref_names, query.src))) {
+       if (flags & REF_ISSYMREF)
+               goto clean_exit;
+
+       for (i = 0; stale && i < matches.nr; i++)
+               if (string_list_has_string(info->ref_names, matches.items[i].string))
+                       stale = 0;
+
+       if (stale) {
                struct ref *ref = make_linked_ref(refname, &info->stale_refs_tail);
                hashcpy(ref->new_sha1, sha1);
        }
 
-       free(query.src);
+clean_exit:
+       string_list_clear(&matches, 0);
        return 0;
 }
 
index 78b5c3ac0b2d7d436b35a69a3cf6c1b023c96dd5..71e233742331a435edeadacc7c6a52226bb18b7a 100644 (file)
@@ -1575,6 +1575,10 @@ static void read_revisions_from_stdin(struct rev_info *revs,
 {
        struct strbuf sb;
        int seen_dashdash = 0;
+       int save_warning;
+
+       save_warning = warn_on_object_refname_ambiguity;
+       warn_on_object_refname_ambiguity = 0;
 
        strbuf_init(&sb, 1000);
        while (strbuf_getwholeline(&sb, stdin, '\n') != EOF) {
@@ -1596,7 +1600,9 @@ static void read_revisions_from_stdin(struct rev_info *revs,
        }
        if (seen_dashdash)
                read_pathspec_from_stdin(revs, &sb, prune);
+
        strbuf_release(&sb);
+       warn_on_object_refname_ambiguity = save_warning;
 }
 
 static void add_grep(struct rev_info *revs, const char *ptn, enum grep_pat_token what)
@@ -1831,6 +1837,14 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
                revs->notes_opt.use_default_notes = 1;
        } else if (!strcmp(arg, "--show-signature")) {
                revs->show_signature = 1;
+       } else if (!strcmp(arg, "--show-linear-break") ||
+                  starts_with(arg, "--show-linear-break=")) {
+               if (starts_with(arg, "--show-linear-break="))
+                       revs->break_bar = xstrdup(arg + 20);
+               else
+                       revs->break_bar = "                    ..........";
+               revs->track_linear = 1;
+               revs->track_first_time = 1;
        } else if (starts_with(arg, "--show-notes=") ||
                   starts_with(arg, "--notes=")) {
                struct strbuf buf = STRBUF_INIT;
@@ -1954,6 +1968,8 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
                        unkv[(*unkc)++] = arg;
                return opts;
        }
+       if (revs->graph && revs->track_linear)
+               die("--show-linear-break and --graph are incompatible");
 
        return 1;
 }
@@ -2896,6 +2912,27 @@ enum commit_action simplify_commit(struct rev_info *revs, struct commit *commit)
        return action;
 }
 
+static void track_linear(struct rev_info *revs, struct commit *commit)
+{
+       if (revs->track_first_time) {
+               revs->linear = 1;
+               revs->track_first_time = 0;
+       } else {
+               struct commit_list *p;
+               for (p = revs->previous_parents; p; p = p->next)
+                       if (p->item == NULL || /* first commit */
+                           !hashcmp(p->item->object.sha1, commit->object.sha1))
+                               break;
+               revs->linear = p != NULL;
+       }
+       if (revs->reverse) {
+               if (revs->linear)
+                       commit->object.flags |= TRACK_LINEAR;
+       }
+       free_commit_list(revs->previous_parents);
+       revs->previous_parents = copy_commit_list(commit->parents);
+}
+
 static struct commit *get_revision_1(struct rev_info *revs)
 {
        if (!revs->commits)
@@ -2923,9 +2960,11 @@ static struct commit *get_revision_1(struct rev_info *revs)
                        if (revs->max_age != -1 &&
                            (commit->date < revs->max_age))
                                continue;
-                       if (add_parents_to_list(revs, commit, &revs->commits, NULL) < 0)
-                               die("Failed to traverse parents of commit %s",
-                                   sha1_to_hex(commit->object.sha1));
+                       if (add_parents_to_list(revs, commit, &revs->commits, NULL) < 0) {
+                               if (!revs->ignore_missing_links)
+                                       die("Failed to traverse parents of commit %s",
+                                               sha1_to_hex(commit->object.sha1));
+                       }
                }
 
                switch (simplify_commit(revs, commit)) {
@@ -2935,6 +2974,8 @@ static struct commit *get_revision_1(struct rev_info *revs)
                        die("Failed to simplify parents of commit %s",
                            sha1_to_hex(commit->object.sha1));
                default:
+                       if (revs->track_linear)
+                               track_linear(revs, commit);
                        return commit;
                }
        } while (revs->commits);
@@ -3101,14 +3142,23 @@ struct commit *get_revision(struct rev_info *revs)
                revs->reverse_output_stage = 1;
        }
 
-       if (revs->reverse_output_stage)
-               return pop_commit(&revs->commits);
+       if (revs->reverse_output_stage) {
+               c = pop_commit(&revs->commits);
+               if (revs->track_linear)
+                       revs->linear = !!(c && c->object.flags & TRACK_LINEAR);
+               return c;
+       }
 
        c = get_revision_internal(revs);
        if (c && revs->graph)
                graph_update(revs->graph, c);
-       if (!c)
+       if (!c) {
                free_saved_parents(revs);
+               if (revs->previous_parents) {
+                       free_commit_list(revs->previous_parents);
+                       revs->previous_parents = NULL;
+               }
+       }
        return c;
 }
 
index 1eb94c1548c019a4d41cb42af805918afbc237bf..a6205307cf3bb2364b8642b0a4857c5b0ae9b5a9 100644 (file)
@@ -7,6 +7,7 @@
 #include "commit.h"
 #include "diff.h"
 
+/* Remember to update object flag allocation in object.h */
 #define SEEN           (1u<<0)
 #define UNINTERESTING   (1u<<1)
 #define TREESAME       (1u<<2)
@@ -18,7 +19,8 @@
 #define SYMMETRIC_LEFT (1u<<8)
 #define PATCHSAME      (1u<<9)
 #define BOTTOM         (1u<<10)
-#define ALL_REV_FLAGS  ((1u<<11)-1)
+#define TRACK_LINEAR   (1u<<26)
+#define ALL_REV_FLAGS  (((1u<<11)-1) | TRACK_LINEAR)
 
 #define DECORATE_SHORT_REFS    1
 #define DECORATE_FULL_REFS     2
@@ -73,7 +75,8 @@ struct rev_info {
        enum rev_sort_order sort_order;
 
        unsigned int    early_output:1,
-                       ignore_missing:1;
+                       ignore_missing:1,
+                       ignore_missing_links:1;
 
        /* Traversal flags */
        unsigned int    dense:1,
@@ -137,6 +140,10 @@ struct rev_info {
                        preserve_subject:1;
        unsigned int    disable_stdin:1;
        unsigned int    leak_pending:1;
+       /* --show-linear-break */
+       unsigned int    track_linear:1,
+                       track_first_time:1,
+                       linear:1;
 
        enum date_mode date_mode;
 
@@ -197,6 +204,9 @@ struct rev_info {
 
        /* copies of the parent lists, for --full-diff display */
        struct saved_parents *saved_parents_slab;
+
+       struct commit_list *previous_parents;
+       const char *break_bar;
 };
 
 extern int ref_excluded(struct string_list *, const char *path);
index 3914d9c5117f29651b56772da143f0a226494a62..75abc478c6da75471e5fdbb55c74efdfcf3ad160 100644 (file)
@@ -760,13 +760,11 @@ char *find_hook(const char *name)
        return path;
 }
 
-int run_hook(const char *index_file, const char *name, ...)
+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;
-       const char *p, *env[2];
-       char index[PATH_MAX];
-       va_list args;
+       const char *p;
        int ret;
 
        p = find_hook(name);
@@ -775,23 +773,45 @@ int run_hook(const char *index_file, const char *name, ...)
 
        argv_array_push(&argv, p);
 
-       va_start(args, name);
        while ((p = va_arg(args, const char *)))
                argv_array_push(&argv, p);
-       va_end(args);
 
        memset(&hook, 0, sizeof(hook));
        hook.argv = argv.argv;
+       hook.env = env;
        hook.no_stdin = 1;
        hook.stdout_to_stderr = 1;
-       if (index_file) {
-               snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
-               env[0] = index;
-               env[1] = NULL;
-               hook.env = env;
-       }
 
        ret = run_command(&hook);
        argv_array_clear(&argv);
        return ret;
 }
+
+int run_hook_le(const char *const *env, const char *name, ...)
+{
+       va_list args;
+       int ret;
+
+       va_start(args, name);
+       ret = run_hook_ve(env, name, args);
+       va_end(args);
+
+       return ret;
+}
+
+int run_hook_with_custom_index(const char *index_file, const char *name, ...)
+{
+       const char *hook_env[3] =  { NULL };
+       char index[PATH_MAX];
+       va_list args;
+       int ret;
+
+       snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file);
+       hook_env[0] = index;
+
+       va_start(args, name);
+       ret = run_hook_ve(hook_env, name, args);
+       va_end(args);
+
+       return ret;
+}
index 6b985afd07a5b58ecadad8859ae90b3430ccb4c2..3653bfa6e123ca8497571a2ca1c47200c1b544a2 100644 (file)
@@ -47,7 +47,12 @@ int run_command(struct child_process *);
 
 extern char *find_hook(const char *name);
 LAST_ARG_MUST_BE_NULL
-extern int run_hook(const char *index_file, const char *name, ...);
+extern int run_hook_le(const char *const *env, const char *name, ...);
+extern int run_hook_ve(const char *const *env, const char *name, va_list args);
+
+LAST_ARG_MUST_BE_NULL
+__attribute__((deprecated))
+extern int run_hook_with_custom_index(const char *index_file, const char *name, ...);
 
 #define RUN_COMMAND_NO_STDIN 1
 #define RUN_GIT_CMD         2  /*If this is to be git sub-command */
index bde5f047b01376e05255a55516d3bdd261f497ea..0a80c58d1194c3476dfd2861a98fbd08610597a3 100644 (file)
@@ -281,8 +281,12 @@ static int fast_forward_to(const unsigned char *to, const unsigned char *from,
                exit(1); /* the callee should have complained already */
        ref_lock = lock_any_ref_for_update("HEAD", unborn ? null_sha1 : from,
                                           0, NULL);
+       if (!ref_lock)
+               return error(_("Failed to lock HEAD during fast_forward_to"));
+
        strbuf_addf(&sb, "%s: fast-forward", action_name(opts));
        ret = write_ref_sha1(ref_lock, to, sb.buf);
+
        strbuf_release(&sb);
        return ret;
 }
diff --git a/setup.c b/setup.c
index 613e3b3c13b3f09bce07c54dc440d03c0b5beb0c..0a22f8bd1d631fe5f0afe1d84162ca4064a00e4f 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -29,7 +29,7 @@ static int abspath_part_inside_repo(char *path)
                return -1;
        wtlen = strlen(work_tree);
        len = strlen(path);
-       off = 0;
+       off = offset_1st_component(path);
 
        /* check if work tree is already the prefix */
        if (wtlen <= len && !strncmp(path, work_tree, wtlen)) {
@@ -45,7 +45,7 @@ static int abspath_part_inside_repo(char *path)
                off = wtlen;
        }
        path0 = path;
-       path += offset_1st_component(path) + off;
+       path += off;
 
        /* check each '/'-terminated level */
        while (*path) {
index 400aa463a47c504feec3ca508e7340c6d5dc8268..3e9f55f1bb19a33908be174b2fa463f8142d4cae 100644 (file)
@@ -790,7 +790,7 @@ void close_pack_index(struct packed_git *p)
  * contain the same set of objects as an existing one.  In that case
  * the resulting file might be different even if its name would be the
  * same.  It is best to close any reference to the old pack before it is
- * replaced on disk.  Of course no index pointers nor windows for given pack
+ * replaced on disk.  Of course no index pointers or windows for given pack
  * must subsist at this point.  If ever objects from this pack are requested
  * again, the new version of the pack will be reinitialized through
  * reprepare_packed_git().
@@ -1126,7 +1126,7 @@ static void report_helper(const struct string_list *list,
        const char *msg;
        switch (seen_bits) {
        case 0:
-               msg = "no corresponding .idx nor .pack";
+               msg = "no corresponding .idx or .pack";
                break;
        case 1:
                msg = "no corresponding .idx";
index 6fca8692d2dd8875281fcb8379cc93805e647cea..2b6322fad064845f4c782286fe9764f6b958f30d 100644 (file)
@@ -819,6 +819,8 @@ static int get_sha1_1(const char *name, int len, unsigned char *sha1, unsigned l
  * For future extension, ':/!' is reserved. If you want to match a message
  * beginning with a '!', you have to repeat the exclamation mark.
  */
+
+/* Remember to update object flag allocation in object.h */
 #define ONELINE_SEEN (1u<<20)
 
 static int handle_one_ref(const char *path,
index ee96dcfb816625436582833d812a7156513d5d39..4d31567a1a6a67ae9697816d78da442f87ab5803 100644 (file)
--- a/strbuf.c
+++ b/strbuf.c
@@ -78,15 +78,8 @@ void strbuf_grow(struct strbuf *sb, size_t extra)
 
 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)
 {
index 2373a04f7aecab62b8575f8564020b10fb874843..8fd1a723576c773e4a63d7de7b0ad5cab5a04627 100644 (file)
@@ -36,11 +36,11 @@ test: pre-clean $(TEST_LINT)
        $(MAKE) aggregate-results-and-cleanup
 
 prove: pre-clean $(TEST_LINT)
-       @echo "*** prove ***"; GIT_CONFIG=.git/config $(PROVE) --exec '$(SHELL_PATH_SQ)' $(GIT_PROVE_OPTS) $(T) :: $(GIT_TEST_OPTS)
+       @echo "*** prove ***"; $(PROVE) --exec '$(SHELL_PATH_SQ)' $(GIT_PROVE_OPTS) $(T) :: $(GIT_TEST_OPTS)
        $(MAKE) clean-except-prove-cache
 
 $(T):
-       @echo "*** $@ ***"; GIT_CONFIG=.git/config '$(SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS)
+       @echo "*** $@ ***"; '$(SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS)
 
 pre-clean:
        $(RM) -r '$(TEST_RESULTS_DIRECTORY_SQ)'
index 45971f43b77142fe1bb90262974c83c786cfe43d..b170cbc0452ca1b5a624f5cf330d420c397cb760 100755 (executable)
@@ -16,12 +16,12 @@ sub err {
 
 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;
 }
index 957ae936e8b785f8b1afbffd9a5918a3260d213f..9e7d7962b0678dceefb93e3706b742cbfdc5b45e 100755 (executable)
@@ -281,7 +281,7 @@ helper_test_timeout() {
 cat >askpass <<\EOF
 #!/bin/sh
 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
index 5076718916388d6abf483220cd35f9f61394abc4..9b2bcfb1b0e38ec75e4d6d772e530a69eaaad874 100644 (file)
@@ -13,7 +13,7 @@ fi
 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*)
        ;;
index 05824fa8e4d18252f74c51531d6504039986c078..fd499e7c498449834992e67645f098d49c6290b8 100755 (executable)
@@ -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
index 9a2dca506a8d6c15f52e6ded3aa22a0f08f507a1..51845491bb42ee72a1f7ec33c504e65c5bf8b248 100644 (file)
@@ -1,6 +1,20 @@
 # Helpers for terminal output tests.
 
-test_expect_success PERL 'set up terminal for tests' '
+# Catch tests which should depend on TTY but forgot to. There's no need
+# to aditionally check that the TTY prereq is set here.  If the test declared
+# it and we are running the test, then it must have been set.
+test_terminal () {
+       if ! test_declared_prereq TTY
+       then
+               echo >&4 "test_terminal: need to declare TTY prerequisite"
+               return 127
+       fi
+       perl "$TEST_DIRECTORY"/test-terminal.perl "$@"
+}
+
+test_lazy_prereq TTY '
+       test_have_prereq PERL &&
+
        # Reading from the pty master seems to get stuck _sometimes_
        # on Mac OS X 10.5.0, using Perl 5.10.0 or 5.8.9.
        #
@@ -15,21 +29,8 @@ test_expect_success PERL 'set up terminal for tests' '
        # After 2000 iterations or so it hangs.
        # https://rt.cpan.org/Ticket/Display.html?id=65692
        #
-       if test "$(uname -s)" = Darwin
-       then
-               :
-       elif
-               perl "$TEST_DIRECTORY"/test-terminal.perl \
-                       sh -c "test -t 1 && test -t 2"
-       then
-               test_set_prereq TTY &&
-               test_terminal () {
-                       if ! test_declared_prereq TTY
-                       then
-                               echo >&4 "test_terminal: need to declare TTY prerequisite"
-                               return 127
-                       fi
-                       perl "$TEST_DIRECTORY"/test-terminal.perl "$@"
-               }
-       fi
+       test "$(uname -s)" != Darwin &&
+
+       perl "$TEST_DIRECTORY"/test-terminal.perl \
+               sh -c "test -t 1 && test -t 2"
 '
index 6cb5b0d55b6d6ed4a91f6d0674c210d98b962b66..5ee9211f988dce1f334d796623feccda85641bbe 100755 (executable)
@@ -8,7 +8,7 @@ test_perf_large_repo
 
 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
 '
index 9fb582b192e7d44856d3687234de922217e511f4..2f3020342a75f0d382af88e6ad35691ad0f183d5 100755 (executable)
@@ -12,8 +12,8 @@ check_config () {
                echo "expected a directory $1, a file $1/config and $1/refs"
                return 1
        fi
-       bare=$(GIT_CONFIG="$1/config" git config --bool core.bare)
-       worktree=$(GIT_CONFIG="$1/config" git config core.worktree) ||
+       bare=$(cd "$1" && git config --bool core.bare)
+       worktree=$(cd "$1" && git config core.worktree) ||
        worktree=unset
 
        test "$bare" = "$2" && test "$worktree" = "$3" || {
@@ -24,18 +24,12 @@ check_config () {
 }
 
 test_expect_success 'plain' '
-       (
-               sane_unset GIT_DIR GIT_WORK_TREE &&
-               mkdir plain &&
-               cd plain &&
-               git init
-       ) &&
+       git init plain &&
        check_config plain/.git false unset
 '
 
 test_expect_success 'plain nested in bare' '
        (
-               sane_unset GIT_DIR GIT_WORK_TREE &&
                git init --bare bare-ancestor.git &&
                cd bare-ancestor.git &&
                mkdir plain-nested &&
@@ -47,7 +41,6 @@ test_expect_success 'plain nested in bare' '
 
 test_expect_success 'plain through aliased command, outside any git repo' '
        (
-               sane_unset GIT_DIR GIT_WORK_TREE &&
                HOME=$(pwd)/alias-config &&
                export HOME &&
                mkdir alias-config &&
@@ -65,7 +58,6 @@ test_expect_success 'plain through aliased command, outside any git repo' '
 
 test_expect_failure 'plain nested through aliased command' '
        (
-               sane_unset GIT_DIR GIT_WORK_TREE &&
                git init plain-ancestor-aliased &&
                cd plain-ancestor-aliased &&
                echo "[alias] aliasedinit = init" >>.git/config &&
@@ -78,7 +70,6 @@ test_expect_failure 'plain nested through aliased command' '
 
 test_expect_failure 'plain nested in bare through aliased command' '
        (
-               sane_unset GIT_DIR GIT_WORK_TREE &&
                git init --bare bare-ancestor-aliased.git &&
                cd bare-ancestor-aliased.git &&
                echo "[alias] aliasedinit = init" >>config &&
@@ -90,66 +81,36 @@ test_expect_failure 'plain nested in bare through aliased command' '
 '
 
 test_expect_success 'plain with GIT_WORK_TREE' '
-       if (
-               sane_unset GIT_DIR &&
-               mkdir plain-wt &&
-               cd plain-wt &&
-               GIT_WORK_TREE=$(pwd) git init
-       )
-       then
-               echo Should have failed -- GIT_WORK_TREE should not be used
-               false
-       fi
+       mkdir plain-wt &&
+       test_must_fail env GIT_WORK_TREE="$(pwd)/plain-wt" git init plain-wt
 '
 
 test_expect_success 'plain bare' '
-       (
-               sane_unset GIT_DIR GIT_WORK_TREE GIT_CONFIG &&
-               mkdir plain-bare-1 &&
-               cd plain-bare-1 &&
-               git --bare init
-       ) &&
+       git --bare init plain-bare-1 &&
        check_config plain-bare-1 true unset
 '
 
 test_expect_success 'plain bare with GIT_WORK_TREE' '
-       if (
-               sane_unset GIT_DIR GIT_CONFIG &&
-               mkdir plain-bare-2 &&
-               cd plain-bare-2 &&
-               GIT_WORK_TREE=$(pwd) git --bare init
-       )
-       then
-               echo Should have failed -- GIT_WORK_TREE should not be used
-               false
-       fi
+       mkdir plain-bare-2 &&
+       test_must_fail \
+               env GIT_WORK_TREE="$(pwd)/plain-bare-2" \
+               git --bare init plain-bare-2
 '
 
 test_expect_success 'GIT_DIR bare' '
-
-       (
-               sane_unset GIT_CONFIG &&
-               mkdir git-dir-bare.git &&
-               GIT_DIR=git-dir-bare.git git init
-       ) &&
+       mkdir git-dir-bare.git &&
+       GIT_DIR=git-dir-bare.git git init &&
        check_config git-dir-bare.git true unset
 '
 
 test_expect_success 'init --bare' '
-
-       (
-               sane_unset GIT_DIR GIT_WORK_TREE GIT_CONFIG &&
-               mkdir init-bare.git &&
-               cd init-bare.git &&
-               git init --bare
-       ) &&
+       git init --bare init-bare.git &&
        check_config init-bare.git true unset
 '
 
 test_expect_success 'GIT_DIR non-bare' '
 
        (
-               sane_unset GIT_CONFIG &&
                mkdir non-bare &&
                cd non-bare &&
                GIT_DIR=.git git init
@@ -160,7 +121,6 @@ test_expect_success 'GIT_DIR non-bare' '
 test_expect_success 'GIT_DIR & GIT_WORK_TREE (1)' '
 
        (
-               sane_unset GIT_CONFIG &&
                mkdir git-dir-wt-1.git &&
                GIT_WORK_TREE=$(pwd) GIT_DIR=git-dir-wt-1.git git init
        ) &&
@@ -168,23 +128,16 @@ test_expect_success 'GIT_DIR & GIT_WORK_TREE (1)' '
 '
 
 test_expect_success 'GIT_DIR & GIT_WORK_TREE (2)' '
-
-       if (
-               sane_unset GIT_CONFIG &&
-               mkdir git-dir-wt-2.git &&
-               GIT_WORK_TREE=$(pwd) GIT_DIR=git-dir-wt-2.git git --bare init
-       )
-       then
-               echo Should have failed -- --bare should not be used
-               false
-       fi
+       mkdir git-dir-wt-2.git &&
+       test_must_fail env \
+               GIT_WORK_TREE="$(pwd)" \
+               GIT_DIR=git-dir-wt-2.git \
+               git --bare init
 '
 
 test_expect_success 'reinit' '
 
        (
-               sane_unset GIT_CONFIG GIT_WORK_TREE GIT_CONFIG &&
-
                mkdir again &&
                cd again &&
                git init >out1 2>err1 &&
@@ -200,35 +153,22 @@ test_expect_success 'reinit' '
 test_expect_success 'init with --template' '
        mkdir template-source &&
        echo content >template-source/file &&
-       (
-               mkdir template-custom &&
-               cd template-custom &&
-               git init --template=../template-source
-       ) &&
+       git init --template=../template-source template-custom &&
        test_cmp template-source/file template-custom/.git/file
 '
 
 test_expect_success 'init with --template (blank)' '
-       (
-               mkdir template-plain &&
-               cd template-plain &&
-               git init
-       ) &&
-       test -f template-plain/.git/info/exclude &&
-       (
-               mkdir template-blank &&
-               cd template-blank &&
-               git init --template=
-       ) &&
-       ! test -f template-blank/.git/info/exclude
+       git init template-plain &&
+       test_path_is_file template-plain/.git/info/exclude &&
+       git init --template= template-blank &&
+       test_path_is_missing template-blank/.git/info/exclude
 '
 
 test_expect_success 'init with init.templatedir set' '
        mkdir templatedir-source &&
        echo Content >templatedir-source/file &&
+       test_config_global init.templatedir "${HOME}/templatedir-source" &&
        (
-               test_config="${HOME}/.gitconfig" &&
-               git config -f "$test_config"  init.templatedir "${HOME}/templatedir-source" &&
                mkdir templatedir-set &&
                cd templatedir-set &&
                sane_unset GIT_TEMPLATE_DIR &&
@@ -240,78 +180,55 @@ test_expect_success 'init with init.templatedir set' '
 '
 
 test_expect_success 'init --bare/--shared overrides system/global config' '
-       (
-               test_config="$HOME"/.gitconfig &&
-               git config -f "$test_config" core.bare false &&
-               git config -f "$test_config" core.sharedRepository 0640 &&
-               mkdir init-bare-shared-override &&
-               cd init-bare-shared-override &&
-               git init --bare --shared=0666
-       ) &&
+       test_config_global core.bare false &&
+       test_config_global core.sharedRepository 0640 &&
+       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="$HOME"/.gitconfig &&
-               git config -f "$test_config" core.sharedRepository 0666 &&
-               mkdir shared-honor-global &&
-               cd shared-honor-global &&
-               git init
-       ) &&
+       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' '
-       (
-               insane=$(printf "x%09999dx" 1) &&
-               mkdir test &&
-               cd test &&
-               test_must_fail git init --template=$insane
-       )
+       test_must_fail git init --template=$(printf "x%09999dx" 1) test
 '
 
 test_expect_success 'init creates a new directory' '
        rm -fr newdir &&
-       (
-               git init newdir &&
-               test -d newdir/.git/refs
-       )
+       git init newdir &&
+       test_path_is_dir newdir/.git/refs
 '
 
 test_expect_success 'init creates a new bare directory' '
        rm -fr newdir &&
-       (
-               git init --bare newdir &&
-               test -d newdir/refs
-       )
+       git init --bare newdir &&
+       test_path_is_dir newdir/refs
 '
 
 test_expect_success 'init recreates a directory' '
        rm -fr newdir &&
-       (
-               mkdir newdir &&
-               git init newdir &&
-               test -d newdir/.git/refs
-       )
+       mkdir newdir &&
+       git init newdir &&
+       test_path_is_dir newdir/.git/refs
 '
 
 test_expect_success 'init recreates a new bare directory' '
        rm -fr newdir &&
-       (
-               mkdir newdir &&
-               git init --bare newdir &&
-               test -d newdir/refs
-       )
+       mkdir newdir &&
+       git init --bare newdir &&
+       test_path_is_dir newdir/refs
 '
 
 test_expect_success 'init creates a new deep directory' '
        rm -fr newdir &&
        git init newdir/a/b/c &&
-       test -d newdir/a/b/c/.git/refs
+       test_path_is_dir newdir/a/b/c/.git/refs
 '
 
 test_expect_success POSIXPERM 'init creates a new deep directory (umask vs. shared)' '
@@ -321,7 +238,7 @@ test_expect_success POSIXPERM 'init creates a new deep directory (umask vs. shar
                # the repository itself should follow "shared"
                umask 002 &&
                git init --bare --shared=0660 newdir/a/b/c &&
-               test -d newdir/a/b/c/refs &&
+               test_path_is_dir newdir/a/b/c/refs &&
                ls -ld newdir/a newdir/a/b > lsab.out &&
                ! grep -v "^drwxrw[sx]r-x" lsab.out &&
                ls -ld newdir/a/b/c > lsc.out &&
@@ -331,52 +248,46 @@ test_expect_success POSIXPERM 'init creates a new deep directory (umask vs. shar
 
 test_expect_success 'init notices EEXIST (1)' '
        rm -fr newdir &&
-       (
-               >newdir &&
-               test_must_fail git init newdir &&
-               test -f newdir
-       )
+       >newdir &&
+       test_must_fail git init newdir &&
+       test_path_is_file newdir
 '
 
 test_expect_success 'init notices EEXIST (2)' '
        rm -fr newdir &&
-       (
-               mkdir newdir &&
-               >newdir/a
-               test_must_fail git init newdir/a/b &&
-               test -f newdir/a
-       )
+       mkdir newdir &&
+       >newdir/a &&
+       test_must_fail git init newdir/a/b &&
+       test_path_is_file newdir/a
 '
 
 test_expect_success POSIXPERM,SANITY 'init notices EPERM' '
        rm -fr newdir &&
-       (
-               mkdir newdir &&
-               chmod -w newdir &&
-               test_must_fail git init newdir/a/b
-       )
+       mkdir newdir &&
+       chmod -w newdir &&
+       test_must_fail git init newdir/a/b
 '
 
 test_expect_success 'init creates a new bare directory with global --bare' '
        rm -rf newdir &&
        git --bare init newdir &&
-       test -d newdir/refs
+       test_path_is_dir newdir/refs
 '
 
 test_expect_success 'init prefers command line to GIT_DIR' '
        rm -rf newdir &&
        mkdir otherdir &&
        GIT_DIR=otherdir git --bare init newdir &&
-       test -d newdir/refs &&
-       ! test -d otherdir/refs
+       test_path_is_dir newdir/refs &&
+       test_path_is_missing otherdir/refs
 '
 
 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 -d realgitdir/refs
+       test_path_is_dir realgitdir/refs
 '
 
 test_expect_success 're-init on .git file' '
@@ -388,10 +299,10 @@ test_expect_success 're-init to update git link' '
        cd newdir &&
        git init --separate-git-dir ../surrealgitdir
        ) &&
-       echo "gitdir: `pwd`/surrealgitdir" >expected &&
+       echo "gitdir: $(pwd)/surrealgitdir" >expected &&
        test_cmp expected newdir/.git &&
-       test -d surrealgitdir/refs &&
-       ! test -d realgitdir/refs
+       test_path_is_dir surrealgitdir/refs &&
+       test_path_is_missing realgitdir/refs
 '
 
 test_expect_success 're-init to move gitdir' '
@@ -401,9 +312,9 @@ test_expect_success 're-init to move gitdir' '
        cd newdir &&
        git init --separate-git-dir ../realgitdir
        ) &&
-       echo "gitdir: `pwd`/realgitdir" >expected &&
+       echo "gitdir: $(pwd)/realgitdir" >expected &&
        test_cmp expected newdir/.git &&
-       test -d realgitdir/refs
+       test_path_is_dir realgitdir/refs
 '
 
 test_expect_success SYMLINKS 're-init to move gitdir symlink' '
@@ -415,10 +326,10 @@ test_expect_success SYMLINKS 're-init to move gitdir symlink' '
        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 -d realgitdir/refs &&
-       ! test -d newdir/here
+       test_cmp expected newdir/here &&
+       test_path_is_dir realgitdir/refs
 '
 
 test_done
index e45a9e40e432524454e94a041599b201a092879a..5657c5a87b6e253b8c8ca7d18dfa7535c295dc83 100755 (executable)
@@ -14,7 +14,7 @@ do
        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 @@ do
        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"'
index e526184a0bfa3c8ad2171d0c41a7bee22cf9a04e..d2e51a81bc0897b19f8f087894187ed705ce29e3 100755 (executable)
@@ -20,14 +20,14 @@ test_expect_success setup '
 
        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 @@ test_expect_success 'update with autocrlf=input' '
                }
        done &&
 
-       differs=`git diff-index --cached HEAD` &&
+       differs=$(git diff-index --cached HEAD) &&
        test -z "$differs" || {
                echo Oops "$differs"
                false
@@ -135,7 +135,7 @@ test_expect_success 'update with autocrlf=true' '
                }
        done &&
 
-       differs=`git diff-index --cached HEAD` &&
+       differs=$(git diff-index --cached HEAD) &&
        test -z "$differs" || {
                echo Oops "$differs"
                false
@@ -158,9 +158,9 @@ test_expect_success 'checkout with autocrlf=true' '
                        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 @@ test_expect_success 'checkout with autocrlf=input' '
                        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 @@ test_expect_success 'apply patch (autocrlf=input)' '
        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 @@ test_expect_success 'apply patch --cached (autocrlf=input)' '
        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 @@ test_expect_success 'apply patch --index (autocrlf=input)' '
        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 @@ test_expect_success 'apply patch (autocrlf=true)' '
        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 @@ test_expect_success 'apply patch --cached (autocrlf=true)' '
        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 @@ test_expect_success 'apply patch --index (autocrlf=true)' '
        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
        }
index f5f67a6337320c11a285b78be299fa955663991d..b0e5694ebd07b59e80823cd87825cc9ec8187c21 100755 (executable)
@@ -19,9 +19,9 @@ test_expect_success setup '
 
        git commit -m initial &&
 
-       one=`git rev-parse HEAD:one` &&
-       two=`git rev-parse HEAD:two` &&
-       three=`git rev-parse HEAD:three` &&
+       one=$(git rev-parse HEAD:one) &&
+       two=$(git rev-parse HEAD:two) &&
+       three=$(git rev-parse HEAD:three) &&
 
        echo happy.
 '
@@ -33,9 +33,9 @@ test_expect_success 'default settings cause no changes' '
 
        ! has_cr one &&
        has_cr two &&
-       onediff=`git diff one` &&
-       twodiff=`git diff two` &&
-       threediff=`git diff three` &&
+       onediff=$(git diff one) &&
+       twodiff=$(git diff two) &&
+       threediff=$(git diff three) &&
        test -z "$onediff" -a -z "$twodiff" -a -z "$threediff"
 '
 
@@ -48,7 +48,7 @@ test_expect_success 'crlf=true causes a CRLF file to be normalized' '
 
        # Note, "normalized" means that git will normalize it if added
        has_cr two &&
-       twodiff=`git diff two` &&
+       twodiff=$(git diff two) &&
        test -n "$twodiff"
 '
 
@@ -60,7 +60,7 @@ test_expect_success 'text=true causes a CRLF file to be normalized' '
 
        # Note, "normalized" means that git will normalize it if added
        has_cr two &&
-       twodiff=`git diff two` &&
+       twodiff=$(git diff two) &&
        test -n "$twodiff"
 '
 
@@ -72,7 +72,7 @@ test_expect_success 'eol=crlf gives a normalized file CRLFs with autocrlf=false'
        git read-tree --reset -u HEAD &&
 
        has_cr one &&
-       onediff=`git diff one` &&
+       onediff=$(git diff one) &&
        test -z "$onediff"
 '
 
@@ -84,7 +84,7 @@ test_expect_success 'eol=crlf gives a normalized file CRLFs with autocrlf=input'
        git read-tree --reset -u HEAD &&
 
        has_cr one &&
-       onediff=`git diff one` &&
+       onediff=$(git diff one) &&
        test -z "$onediff"
 '
 
@@ -96,7 +96,7 @@ test_expect_success 'eol=lf gives a normalized file LFs with autocrlf=true' '
        git read-tree --reset -u HEAD &&
 
        ! has_cr one &&
-       onediff=`git diff one` &&
+       onediff=$(git diff one) &&
        test -z "$onediff"
 '
 
@@ -108,9 +108,9 @@ test_expect_success 'autocrlf=true does not normalize CRLF files' '
 
        has_cr one &&
        has_cr two &&
-       onediff=`git diff one` &&
-       twodiff=`git diff two` &&
-       threediff=`git diff three` &&
+       onediff=$(git diff one) &&
+       twodiff=$(git diff two) &&
+       threediff=$(git diff three) &&
        test -z "$onediff" -a -z "$twodiff" -a -z "$threediff"
 '
 
@@ -123,9 +123,9 @@ test_expect_success 'text=auto, autocrlf=true _does_ normalize CRLF files' '
 
        has_cr one &&
        has_cr two &&
-       onediff=`git diff one` &&
-       twodiff=`git diff two` &&
-       threediff=`git diff three` &&
+       onediff=$(git diff one) &&
+       twodiff=$(git diff two) &&
+       threediff=$(git diff three) &&
        test -z "$onediff" -a -n "$twodiff" -a -z "$threediff"
 '
 
@@ -137,7 +137,7 @@ test_expect_success 'text=auto, autocrlf=true does not normalize binary files' '
        git read-tree --reset -u HEAD &&
 
        ! has_cr three &&
-       threediff=`git diff three` &&
+       threediff=$(git diff three) &&
        test -z "$threediff"
 '
 
@@ -148,7 +148,7 @@ test_expect_success 'eol=crlf _does_ normalize binary files' '
        git read-tree --reset -u HEAD &&
 
        has_cr three &&
-       threediff=`git diff three` &&
+       threediff=$(git diff three) &&
        test -z "$threediff"
 '
 
index fe0164be62ad9ae7a2ea426c6e576cd1133f3d67..e1126aa7cc05ff61ddf087fe13880da7f48219a6 100755 (executable)
@@ -20,8 +20,8 @@ test_expect_success setup '
 
        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,8 +34,8 @@ test_expect_success 'eol=lf puts LFs in normalized file' '
 
        ! has_cr one &&
        ! has_cr two &&
-       onediff=`git diff one` &&
-       twodiff=`git diff two` &&
+       onediff=$(git diff one) &&
+       twodiff=$(git diff two) &&
        test -z "$onediff" -a -z "$twodiff"
 '
 
@@ -47,8 +47,8 @@ test_expect_success 'eol=crlf puts CRLFs in normalized file' '
 
        has_cr one &&
        ! has_cr two &&
-       onediff=`git diff one` &&
-       twodiff=`git diff two` &&
+       onediff=$(git diff one) &&
+       twodiff=$(git diff two) &&
        test -z "$onediff" -a -z "$twodiff"
 '
 
@@ -61,8 +61,8 @@ test_expect_success 'autocrlf=true overrides eol=lf' '
 
        has_cr one &&
        has_cr two &&
-       onediff=`git diff one` &&
-       twodiff=`git diff two` &&
+       onediff=$(git diff one) &&
+       twodiff=$(git diff two) &&
        test -z "$onediff" -a -z "$twodiff"
 '
 
@@ -75,8 +75,8 @@ test_expect_success 'autocrlf=true overrides unset eol' '
 
        has_cr one &&
        has_cr two &&
-       onediff=`git diff one` &&
-       twodiff=`git diff two` &&
+       onediff=$(git diff one) &&
+       twodiff=$(git diff two) &&
        test -z "$onediff" -a -z "$twodiff"
 '
 
index a8e84d854636178224b1bbd52272d47fc686ece9..0333dd9875af9fbbad04cf05eb9f0e9fe37ae182 100755 (executable)
@@ -225,22 +225,22 @@ test_expect_success \
 
 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 \
index 65606df3ed8b87256273dc85056f57a404b71c99..a90c86bfa3e12cea6f917a32f4f3739e8f0dfc0c 100755 (executable)
@@ -30,7 +30,6 @@ String options
     --string2 <str>       get another string
     --st <st>             get another string (pervert ordering)
     -o <str>              get another string
-    --default-string      set string to default
     --list <str>          add str to list
 
 Magic arguments
@@ -293,7 +292,7 @@ cat > expect <<EOF
 boolean: 0
 integer: 0
 timestamp: 1
-string: default
+string: (not set)
 abbrev: 7
 verbose: 0
 quiet: yes
@@ -302,8 +301,8 @@ file: (not set)
 arg 00: foo
 EOF
 
-test_expect_success 'OPT_DATE() and OPT_SET_PTR() work' '
-       test-parse-options -t "1970-01-01 00:00:01 +0000" --default-string \
+test_expect_success 'OPT_DATE() works' '
+       test-parse-options -t "1970-01-01 00:00:01 +0000" \
                foo -q > output 2> output.err &&
        test_must_be_empty output.err &&
        test_cmp expect output
index 538ea5fb1c27bf5e4f9c4a0268f219f5d6d6e9c5..57ea5a10c5c716f52a8c8c7335ac7f68fe9dd92d 100755 (executable)
@@ -6,7 +6,7 @@ test_description='basic credential helper tests'
 
 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==
index babcdd23433348cd0e2397b2fb6968f7cfae4b0a..a0b79b4839fb21a96bf8aca769542d93b21bb90f 100755 (executable)
@@ -519,10 +519,10 @@ test_expect_success \
     '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'
 
index acaab07fac672e4b1b74161b58baf1f5e153840e..db1b6f5cf4dd8c7932946a53bc2e1c30b09b762b 100755 (executable)
@@ -18,7 +18,7 @@ In the test, these paths are used:
         frotz   - not in H added in M
         nitfol  - in H, stays in M unmodified
         rezrov  - in H, deleted in M
-        yomin   - not in H nor M
+       yomin   - not in H or M
 '
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-read-tree.sh
@@ -36,7 +36,7 @@ compare_change () {
 }
 
 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 @@ test_expect_success \
      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 @@ test_expect_success \
     '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 @@ test_expect_success \
      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 @@ test_expect_success \
     '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 @@ test_expect_success \
      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 @@ test_expect_success \
      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 @@ test_expect_success \
      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'
 
index a847709a1354a824c90a13d2c9e9ab6d6bc69b6c..fed877b20f428a1987357ad1f66dc678f5c7e2eb 100755 (executable)
@@ -21,7 +21,7 @@ compare_change () {
 }
 
 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 @@ test_expect_success \
      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 @@ test_expect_success \
     '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 @@ test_expect_success \
      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'
index 8c6d67edda1468ba0f1c7afc6d13ea3a7bbe0a90..b6111cd150fdd69973142808cf4a86a4fa6b7e76 100755 (executable)
@@ -11,7 +11,7 @@ test_description='git read-tree --prefix test.
 test_expect_success setup '
        echo hello >one &&
        git update-index --add one &&
-       tree=`git write-tree` &&
+       tree=$(git write-tree) &&
        echo tree is $tree
 '
 
index 3e72aff470f8d9e5e79689de459904d1f3271d0d..c70cf423008cfb6f3f3fd735c1f6ee2d1408de2c 100755 (executable)
@@ -30,7 +30,7 @@ test_expect_success 'two-way not clobbering' '
 
        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 @@ echo file2 >.gitignore
 
 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 (1)' '
 
 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 @@ test_expect_success 'three-way not clobbering a working tree file' '
        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
index 6902320e819651553beac7d80971b984b9168a8a..62c0d25af4ca1c8ef5d0d63b6e3ea329a6d75205 100755 (executable)
@@ -20,27 +20,27 @@ test_expect_success setup '
 
 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 @@ rm -f actual dir/actual
 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 'diff-files' '
 '
 
 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 'checkout-index' '
 
 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 &&
index fd105280092b7f655f5c48f09b2e8f5e0ee6d351..aea493646e4400e733749768e48f2a3d1a470299 100755 (executable)
@@ -131,7 +131,7 @@ test_expect_success 'git-show a large file' '
 '
 
 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 +140,7 @@ test_expect_success 'repack' '
 '
 
 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 &&
index c9c426c273e556302338f7a30fc46de64b856eb2..3f80ff0c14c47b87bbbecb74d1951a1abe6bc5ba 100755 (executable)
@@ -461,7 +461,7 @@ test_expect_success 'new variable inserts into proper section' '
        test_cmp expect .git/config
 '
 
-test_expect_success 'alternative GIT_CONFIG (non-existing file should fail)' '
+test_expect_success 'alternative --file (non-existing file should fail)' '
        test_must_fail git config --file non-existing-config -l
 '
 
@@ -508,10 +508,10 @@ test_expect_success 'refer config from subdirectory' '
 
 '
 
-test_expect_success 'refer config from subdirectory via GIT_CONFIG' '
+test_expect_success 'refer config from subdirectory via --file' '
        (
                cd x &&
-               GIT_CONFIG=../other-config git config --get ein.bahn >actual &&
+               git config --file=../other-config --get ein.bahn >actual &&
                test_cmp expect actual
        )
 '
@@ -523,8 +523,8 @@ cat > expect << EOF
        park = ausweis
 EOF
 
-test_expect_success '--set in alternative GIT_CONFIG' '
-       GIT_CONFIG=other-config git config anwohner.park ausweis &&
+test_expect_success '--set in alternative file' '
+       git config --file=other-config anwohner.park ausweis &&
        test_cmp expect other-config
 '
 
@@ -955,11 +955,11 @@ test_expect_success 'inner whitespace kept verbatim' '
 
 test_expect_success SYMLINKS 'symlinked configuration' '
        ln -s notyet myconfig &&
-       GIT_CONFIG=myconfig git config test.frotz nitfol &&
+       git config --file=myconfig test.frotz nitfol &&
        test -h myconfig &&
        test -f notyet &&
-       test "z$(GIT_CONFIG=notyet git config test.frotz)" = znitfol &&
-       GIT_CONFIG=myconfig git config test.xyzzy rezrov &&
+       test "z$(git config --file=notyet test.frotz)" = znitfol &&
+       git config --file=myconfig test.xyzzy rezrov &&
        test -h myconfig &&
        test -f notyet &&
        cat >expect <<-\EOF &&
@@ -967,31 +967,22 @@ test_expect_success SYMLINKS 'symlinked configuration' '
        rezrov
        EOF
        {
-               GIT_CONFIG=notyet git config test.frotz &&
-               GIT_CONFIG=notyet git config test.xyzzy
+               git config --file=notyet test.frotz &&
+               git config --file=notyet test.xyzzy
        } >actual &&
        test_cmp expect actual
 '
 
 test_expect_success 'nonexistent configuration' '
-       (
-               GIT_CONFIG=doesnotexist &&
-               export GIT_CONFIG &&
-               test_must_fail git config --list &&
-               test_must_fail git config test.xyzzy
-       )
+       test_must_fail git config --file=doesnotexist --list &&
+       test_must_fail git config --file=doesnotexist test.xyzzy
 '
 
 test_expect_success SYMLINKS 'symlink to nonexistent configuration' '
        ln -s doesnotexist linktonada &&
        ln -s linktonada linktolinktonada &&
-       (
-               GIT_CONFIG=linktonada &&
-               export GIT_CONFIG &&
-               test_must_fail git config --list &&
-               GIT_CONFIG=linktolinktonada &&
-               test_must_fail git config --list
-       )
+       test_must_fail git config --file=linktonada --list &&
+       test_must_fail git config --file=linktolinktonada --list
 '
 
 test_expect_success 'check split_cmdline return' "
@@ -1167,4 +1158,14 @@ test_expect_failure 'adding a key into an empty section reuses header' '
        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
index 0e476624069a4ac4259f35b07f36bf0945bfe986..0d9388afc4e20a5c536d214bfe25e630242ed667 100755 (executable)
@@ -19,7 +19,7 @@ test_expect_success 'setup' '
 
        test_create_repo "test" &&
        test_create_repo "test2" &&
-       GIT_CONFIG=test2/.git/config git config core.repositoryformatversion 99
+       git config --file=test2/.git/config core.repositoryformatversion 99
 '
 
 test_expect_success 'gitdir selection on normal repos' '
index 6ffd82fe321cd3154d6f193c21198218e762f1b2..4e2459afc549d5d2985024e8c23bf5fa117d570a 100755 (executable)
@@ -350,22 +350,28 @@ test_expect_success 'stdin fails on unknown command' '
        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
+       grep "fatal: create: missing <ref>" err
 '
 
 test_expect_success 'stdin fails create with bad ref name' '
@@ -377,19 +383,19 @@ test_expect_success 'stdin fails create with bad ref name' '
 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
+       grep "fatal: update: missing <ref>" err
 '
 
 test_expect_success 'stdin fails update with bad ref name' '
@@ -401,19 +407,19 @@ test_expect_success 'stdin fails update with bad ref name' '
 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
+       grep "fatal: delete: missing <ref>" err
 '
 
 test_expect_success 'stdin fails delete with bad ref name' '
@@ -425,13 +431,13 @@ test_expect_success 'stdin fails delete with bad ref name' '
 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 +464,24 @@ test_expect_success 'stdin create ref works' '
        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 +518,21 @@ test_expect_success 'stdin update ref fails with wrong old value' '
 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 +556,7 @@ test_expect_success 'stdin delete ref fails with wrong old value' '
 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,7 +697,7 @@ test_expect_success 'stdin -z fails on unknown command' '
 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
+       grep "fatal: create: missing <ref>" err
 '
 
 test_expect_success 'stdin -z fails create with bad ref name' '
@@ -685,7 +709,7 @@ test_expect_success 'stdin -z fails create with bad ref name' '
 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 +721,39 @@ test_expect_success 'stdin -z fails create with too many arguments' '
 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 too few args' '
+       printf $F "update $a" "$m" >stdin &&
+       test_must_fail git update-ref -z --stdin <stdin 2>err &&
+       grep "fatal: update $a: unexpected end of input when reading <oldvalue>" err
 '
 
 test_expect_success 'stdin -z fails update with bad ref name' '
-       printf $F "update ~a" "$m" >stdin &&
+       printf $F "update ~a" "$m" "" >stdin &&
        test_must_fail git update-ref -z --stdin <stdin 2>err &&
        grep "fatal: invalid ref format: ~a" 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,7 +765,7 @@ test_expect_success 'stdin -z fails update with too many arguments' '
 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
+       grep "fatal: delete: missing <ref>" err
 '
 
 test_expect_success 'stdin -z fails delete with bad ref name' '
@@ -739,7 +777,7 @@ test_expect_success 'stdin -z fails delete with bad ref name' '
 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 +795,7 @@ test_expect_success 'stdin -z fails verify with too many arguments' '
 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,21 +854,32 @@ test_expect_success 'stdin -z update ref fails with wrong old value' '
 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
 '
 
+test_expect_success 'stdin -z create ref fails when ref exists' '
+       git update-ref $c $m &&
+       git rev-parse "$c" >expect &&
+       printf $F "create $c" "$m~1" >stdin &&
+       test_must_fail git update-ref -z --stdin <stdin 2>err &&
+       grep "fatal: Cannot lock the ref '"'"'$c'"'"'" err &&
+       git rev-parse "$c" >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'stdin -z create ref fails with bad new value' '
+       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
 '
 
@@ -854,7 +903,7 @@ test_expect_success 'stdin -z delete ref fails with wrong old value' '
 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
@@ -912,7 +961,7 @@ test_expect_success 'stdin -z update refs works with identity updates' '
 
 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 &&
index 236b13a3ab27f54808fa88574738747e3c3936b1..8cab06f90a52b82518aca6f7baa0530eb77ab986 100755 (executable)
@@ -245,4 +245,12 @@ test_expect_success 'gc.reflogexpire=false' '
 
 '
 
+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_done
index 178694ee63937a9ec1f8d182d54441c2d20bd4a3..1978947c4196fb666d55395bedc53ae149b6d13d 100755 (executable)
@@ -121,7 +121,7 @@ test_expect_success 'merge my-side@{u} records the correct name' '
        git branch -D new ;# can fail but is ok
        git branch -t new my-side@{u} &&
        git merge -s ours new@{u} &&
-       git show -s --pretty=format:%s >actual &&
+       git show -s --pretty=tformat:%s >actual &&
        echo "Merge remote-tracking branch ${sq}origin/side${sq}" >expect &&
        test_cmp expect actual
 )
index cf2ee7885ac9c2172deccc27dfb994546593e842..e1b2a99f105f8700e72974428c126ea049247194 100755 (executable)
@@ -777,9 +777,7 @@ test_expect_success '#30: core.worktree and core.bare conflict (gitfile version)
        setup_repo 30 "$here/30" gitfile true &&
        (
                cd 30 &&
-               GIT_DIR=.git &&
-               export GIT_DIR &&
-               test_must_fail git symbolic-ref HEAD 2>result
+               test_must_fail env GIT_DIR=.git git symbolic-ref HEAD 2>result
        ) &&
        grep "core.bare and core.worktree" 30/result
 '
index 5fd7bbb65244bdf6470508b6bc79aef58e79e86d..4029c9c8c06d24887e7d9fa7c97c2c8c5826eb42 100755 (executable)
@@ -14,7 +14,11 @@ test_description='merge-recursive options
 . ./test-lib.sh
 
 test_have_prereq SED_STRIPS_CR && SED_OPTIONS=-b
-test_have_prereq GREP_STRIPS_CR && export GREP_OPTIONS=-U
+if test_have_prereq GREP_STRIPS_CR
+then
+       GREP_OPTIONS=-U
+       export GREP_OPTIONS
+fi
 
 test_expect_success 'setup' '
        conflict_hunks () {
index 83037b1cd94046ea1ec82819b7d30790b28634d2..ac31b711f29139470308d9062fea33259cf004ab 100755 (executable)
@@ -859,11 +859,7 @@ test_expect_success 'detect typo in branch name when using --edit-description' '
        write_script editor <<-\EOF &&
                echo "New contents" >"$1"
        EOF
-       (
-               EDITOR=./editor &&
-               export EDITOR &&
-               test_must_fail git branch --edit-description no-such-branch
-       )
+       test_must_fail env EDITOR=./editor git branch --edit-description no-such-branch
 '
 
 test_expect_success 'refuse --edit-description on unborn branch for now' '
@@ -871,11 +867,7 @@ test_expect_success 'refuse --edit-description on unborn branch for now' '
                echo "New contents" >"$1"
        EOF
        git checkout --orphan unborn &&
-       (
-               EDITOR=./editor &&
-               export EDITOR &&
-               test_must_fail git branch --edit-description
-       )
+       test_must_fail env EDITOR=./editor git branch --edit-description
 '
 
 test_expect_success '--merged catches invalid object names' '
index 3bb79a47af5e2f619753c61436ec577ec025a8ae..cfd67ff3dfc64b160bbc53318df3eb661970f2e1 100755 (executable)
@@ -17,7 +17,7 @@ GIT_EDITOR=./fake_editor.sh
 export GIT_EDITOR
 
 test_expect_success 'cannot annotate non-existing HEAD' '
-       (MSG=3 && export MSG && test_must_fail git notes add)
+       test_must_fail env MSG=3 git notes add
 '
 
 test_expect_success setup '
@@ -32,22 +32,16 @@ test_expect_success setup '
 '
 
 test_expect_success 'need valid notes ref' '
-       (MSG=1 GIT_NOTES_REF=/ && export MSG GIT_NOTES_REF &&
-        test_must_fail git notes add) &&
-       (MSG=2 GIT_NOTES_REF=/ && export MSG GIT_NOTES_REF &&
-        test_must_fail git notes show)
+       test_must_fail env MSG=1 GIT_NOTES_REF=/ git notes show &&
+       test_must_fail env MSG=2 GIT_NOTES_REF=/ git notes show
 '
 
 test_expect_success 'refusing to add notes in refs/heads/' '
-       (MSG=1 GIT_NOTES_REF=refs/heads/bogus &&
-        export MSG GIT_NOTES_REF &&
-        test_must_fail git notes add)
+       test_must_fail env MSG=1 GIT_NOTES_REF=refs/heads/bogus git notes add
 '
 
 test_expect_success 'refusing to edit notes in refs/remotes/' '
-       (MSG=1 GIT_NOTES_REF=refs/remotes/bogus &&
-        export MSG GIT_NOTES_REF &&
-        test_must_fail git notes edit)
+       test_must_fail env MSG=1 GIT_NOTES_REF=refs/heads/bogus git notes edit
 '
 
 # 1 indicates caught gracefully by die, 128 means git-show barked
@@ -865,11 +859,7 @@ test_expect_success 'create note from non-existing note with "git notes add -c"
        git add a10 &&
        test_tick &&
        git commit -m 10th &&
-       (
-               MSG="yet another note" &&
-               export MSG &&
-               test_must_fail git notes add -c deadbeef
-       ) &&
+       test_must_fail env MSG="yet another note" git notes add -c deadbeef &&
        test_must_fail git notes list HEAD
 '
 
index 6d94b1fcd94e9f724c93a389c50066c92c46e1b9..80e0a951ea3b699dc57530c1749a2e727ec6779d 100755 (executable)
@@ -88,6 +88,23 @@ test_expect_success 'rebase from ambiguous branch name' '
        git rebase master
 '
 
+test_expect_success 'rebase off of the previous branch using "-"' '
+       git checkout master &&
+       git checkout HEAD^ &&
+       git rebase @{-1} >expect.messages &&
+       git merge-base master HEAD >expect.forkpoint &&
+
+       git checkout master &&
+       git checkout HEAD^ &&
+       git rebase - >actual.messages &&
+       git merge-base master HEAD >actual.forkpoint &&
+
+       test_cmp expect.forkpoint actual.forkpoint &&
+       # the next one is dubious---we may want to say "-",
+       # instead of @{-1}, in the message
+       test_i18ncmp expect.messages actual.messages
+'
+
 test_expect_success 'rebase a single mode change' '
        git checkout master &&
        git branch -D topic &&
index 50e22b1cadff4252dfb552a4db930f49544952aa..8197ed29a9ecedb43679200f1485a7b50984fdff 100755 (executable)
@@ -67,6 +67,14 @@ test_expect_success 'setup' '
 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 &&
        (
@@ -102,12 +110,8 @@ test_expect_success 'rebase -i with the exec command runs from tree root' '
 
 test_expect_success 'rebase -i with the exec command checks tree cleanness' '
        git checkout master &&
-       (
        set_fake_editor &&
-       FAKE_LINES="exec_echo_foo_>file1 1" &&
-       export FAKE_LINES &&
-       test_must_fail git rebase -i HEAD^
-       ) &&
+       test_must_fail env FAKE_LINES="exec_echo_foo_>file1 1" git rebase -i HEAD^ &&
        test_cmp_rev master^ HEAD &&
        git reset --hard &&
        git rebase --continue
@@ -116,12 +120,9 @@ test_expect_success 'rebase -i with the exec command checks tree cleanness' '
 test_expect_success 'rebase -i with exec of inexistent command' '
        git checkout master &&
        test_when_finished "git rebase --abort" &&
-       (
        set_fake_editor &&
-       FAKE_LINES="exec_this-command-does-not-exist 1" &&
-       export FAKE_LINES &&
-       test_must_fail git rebase -i HEAD^ >actual 2>&1
-       ) &&
+       test_must_fail env FAKE_LINES="exec_this-command-does-not-exist 1" \
+       git rebase -i HEAD^ >actual 2>&1 &&
        ! grep "Maybe git-rebase is broken" actual
 '
 
@@ -375,11 +376,7 @@ test_expect_success 'commit message used after conflict' '
        git checkout -b conflict-fixup conflict-branch &&
        base=$(git rev-parse HEAD~4) &&
        set_fake_editor &&
-       (
-               FAKE_LINES="1 fixup 3 fixup 4" &&
-               export FAKE_LINES &&
-               test_must_fail git rebase -i $base
-       ) &&
+       test_must_fail env FAKE_LINES="1 fixup 3 fixup 4" git rebase -i $base &&
        echo three > conflict &&
        git add conflict &&
        FAKE_COMMIT_AMEND="ONCE" EXPECT_HEADER_COUNT=2 \
@@ -394,11 +391,7 @@ test_expect_success 'commit message retained after conflict' '
        git checkout -b conflict-squash conflict-branch &&
        base=$(git rev-parse HEAD~4) &&
        set_fake_editor &&
-       (
-               FAKE_LINES="1 fixup 3 squash 4" &&
-               export FAKE_LINES &&
-               test_must_fail git rebase -i $base
-       ) &&
+       test_must_fail env FAKE_LINES="1 fixup 3 squash 4" git rebase -i $base &&
        echo three > conflict &&
        git add conflict &&
        FAKE_COMMIT_AMEND="TWICE" EXPECT_HEADER_COUNT=2 \
@@ -469,11 +462,7 @@ test_expect_success 'interrupted squash works as expected' '
        git checkout -b interrupted-squash conflict-branch &&
        one=$(git rev-parse HEAD~3) &&
        set_fake_editor &&
-       (
-               FAKE_LINES="1 squash 3 2" &&
-               export FAKE_LINES &&
-               test_must_fail git rebase -i HEAD~3
-       ) &&
+       test_must_fail env FAKE_LINES="1 squash 3 2" git rebase -i HEAD~3 &&
        (echo one; echo two; echo four) > conflict &&
        git add conflict &&
        test_must_fail git rebase --continue &&
@@ -487,11 +476,7 @@ test_expect_success 'interrupted squash works as expected (case 2)' '
        git checkout -b interrupted-squash2 conflict-branch &&
        one=$(git rev-parse HEAD~3) &&
        set_fake_editor &&
-       (
-               FAKE_LINES="3 squash 1 2" &&
-               export FAKE_LINES &&
-               test_must_fail git rebase -i HEAD~3
-       ) &&
+       test_must_fail env FAKE_LINES="3 squash 1 2" git rebase -i HEAD~3 &&
        (echo one; echo four) > conflict &&
        git add conflict &&
        test_must_fail git rebase --continue &&
@@ -528,11 +513,7 @@ test_expect_success 'aborted --continue does not squash commits after "edit"' '
        FAKE_LINES="edit 1" git rebase -i HEAD^ &&
        echo "edited again" > file7 &&
        git add file7 &&
-       (
-               FAKE_COMMIT_MESSAGE=" " &&
-               export FAKE_COMMIT_MESSAGE &&
-               test_must_fail git rebase --continue
-       ) &&
+       test_must_fail env FAKE_COMMIT_MESSAGE=" " git rebase --continue &&
        test $old = $(git rev-parse HEAD) &&
        git rebase --abort
 '
@@ -547,11 +528,7 @@ test_expect_success 'auto-amend only edited commits after "edit"' '
        echo "and again" > file7 &&
        git add file7 &&
        test_tick &&
-       (
-               FAKE_COMMIT_MESSAGE="and again" &&
-               export FAKE_COMMIT_MESSAGE &&
-               test_must_fail git rebase --continue
-       ) &&
+       test_must_fail env FAKE_COMMIT_MESSAGE="and again" git rebase --continue &&
        git rebase --abort
 '
 
@@ -559,11 +536,7 @@ test_expect_success 'clean error after failed "exec"' '
        test_tick &&
        test_when_finished "git rebase --abort || :" &&
        set_fake_editor &&
-       (
-               FAKE_LINES="1 exec_false" &&
-               export FAKE_LINES &&
-               test_must_fail git rebase -i HEAD^
-       ) &&
+       test_must_fail env FAKE_LINES="1 exec_false" git rebase -i HEAD^ &&
        echo "edited again" > file7 &&
        git add file7 &&
        test_must_fail git rebase --continue 2>error &&
@@ -947,12 +920,8 @@ test_expect_success 'rebase -i --root retain root commit author and message' '
 
 test_expect_success 'rebase -i --root temporary sentinel commit' '
        git checkout B &&
-       (
-               set_fake_editor &&
-               FAKE_LINES="2" &&
-               export FAKE_LINES &&
-               test_must_fail git rebase -i --root
-       ) &&
+       set_fake_editor &&
+       test_must_fail env FAKE_LINES="2" git rebase -i --root &&
        git cat-file commit HEAD | grep "^tree 4b825dc642cb" &&
        git rebase --abort
 '
@@ -1042,11 +1011,7 @@ test_expect_success 'rebase -i error on commits with \ in message' '
        test_when_finished "git rebase --abort; git reset --hard $current_head; rm -f error" &&
        test_commit TO-REMOVE will-conflict old-content &&
        test_commit "\temp" will-conflict new-content dummy &&
-       (
-       EDITOR=true &&
-       export EDITOR &&
-       test_must_fail git rebase -i HEAD^ --onto HEAD^^ 2>error
-       ) &&
+       test_must_fail env EDITOR=true git rebase -i HEAD^ --onto HEAD^^ 2>error &&
        test_expect_code 1 grep  "      emp" error
 '
 
index 098b75507bf2ef6906f3f4fd4c532bb4c55ce7bd..b6833e9a5fead6d2b47ce8a3d517f64cba6a1514 100755 (executable)
@@ -118,11 +118,7 @@ test_expect_success 'pre-rebase hook stops rebase (1)' '
 test_expect_success 'pre-rebase hook stops rebase (2)' '
        git checkout test &&
        git reset --hard side &&
-       (
-               EDITOR=:
-               export EDITOR
-               test_must_fail git rebase -i master
-       ) &&
+       test_must_fail env EDITOR=: git rebase -i master &&
        test "z$(git symbolic-ref HEAD)" = zrefs/heads/test &&
        test 0 = $(git rev-list HEAD...side | wc -l)
 '
index 19c99d7ef1bc02e67a7b995206b9f66c04c1b31c..b457333e1865de794e47fa6b601648fd67a02a7c 100755 (executable)
@@ -65,12 +65,15 @@ test_expect_success 'output to keep user entertained during multi-pick' '
        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 @@ test_expect_success 'output during multi-pick indicates merge strategy' '
        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
 
index 3d305814b9d755a827d27ed9036ebb2f8d48abe6..e00d7d2b6186023642bc9d0b5d5dd6a526278767 100755 (executable)
@@ -711,8 +711,7 @@ test_expect_success 'checking out a commit after submodule removal needs manual
        git submodule update &&
        git checkout -q HEAD^ 2>actual &&
        git checkout -q master 2>actual &&
-       echo "warning: unable to rmdir submod: Directory not empty" >expected &&
-       test_i18ncmp expected actual &&
+       test_i18ngrep "^warning: unable to rmdir submod:" actual &&
        git status -s submod >actual &&
        echo "?? submod/" >expected &&
        test_cmp expected actual &&
index a5e7e6b2ba3138d06c400e965decf1389da3274a..f372fc8ca8e3b311b03313a46db1aa8f35de2ea9 100755 (executable)
@@ -96,8 +96,8 @@ test_expect_success 'stash pop after save --include-untracked leaves files untra
        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
index e4ba6013e41927bc0ec3ff3876648a71a71ce6e1..831935665e012c04bbe4c57feee92c0310df5c04 100755 (executable)
@@ -14,13 +14,13 @@ then
 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$Alongc$Alongc$Alongc$Alongc           #250 Byte
 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 @@ test_expect_success "Add long precomposed filename" '
        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"
 '
 
index 77d7f4946fb51a766399549e3c7364033d7668f0..7d2c6e13a2a7f5d8e9e863d83e6b7b716810c970 100755 (executable)
@@ -66,7 +66,7 @@ test_expect_success \
 
 # tree has COPYING and rezrov.  work tree has the same COPYING and
 # copy-edited COPYING.1, and unchanged rezrov.  We should not say
-# anything about rezrov nor COPYING, since the revised again diff-raw
+# anything about rezrov or COPYING, since the revised again diff-raw
 # nows how to say Copy.
 
 test_expect_success \
index 05911492ca6df386bfe344ffcfb9562beeaceabf..76f643b2c2a2c7e307135de6942cf46743b6cbef 100755 (executable)
@@ -13,7 +13,7 @@ sed_script='s/\(:100644 100755\) \('"$_x40"'\) \2 /\1 X X /'
 test_expect_success 'setup' '
        echo frotz >rezrov &&
        git update-index --add rezrov &&
-       tree=`git write-tree` &&
+       tree=$(git write-tree) &&
        echo $tree
 '
 
index f22c8e3dbaee8882160b6132160fcc3ccd7db057..57c094fdcea160a7816680d66efac9c05dd57cc8 100755 (executable)
@@ -73,7 +73,7 @@ test_expect_success \
 
 # tree has COPYING and rezrov.  work tree has the same COPYING and
 # copy-edited COPYING.1, and unchanged rezrov.  We should not say
-# anything about rezrov nor COPYING, since the revised again diff-raw
+# anything about rezrov or COPYING, since the revised again diff-raw
 # nows how to say Copy.
 
 test_expect_success \
index 2bb973655bf043cc43292764ffd68becda25aa2e..bf078418662c4bab4e512be8fc22a5aa76466119 100755 (executable)
@@ -18,7 +18,7 @@ test_expect_success \
      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 @@ test_expect_success 'diff multiple wildcard pathspecs' '
        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
index 1215ae544b6915fe2cc6df4d193c8f3a805beba1..643d729157d23ce501258710640e4090c34922fc 100755 (executable)
@@ -67,18 +67,18 @@ test_expect_success C_LOCALE_OUTPUT 'apply detecting corrupt patch correctly' '
        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 'initial commit' 'git commit -a -m initial'
 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 'diff-index with --binary' '
 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"
 '
 
index e77c09c37eede2f039610199ba8e3c45e94213d4..805b055c899e7c9f5653eb740572f67417c9dcb6 100755 (executable)
@@ -107,14 +107,14 @@ test_expect_success setup '
 +*++ [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"
 
index 73194b2c3dbe267b759bfd036367366b4955f0c4..282bee4a54c924b8168b6a28dfdbeb7ab300d7b7 100755 (executable)
@@ -43,7 +43,7 @@ test_expect_success setup '
 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 @@ test_expect_success "format-patch --ignore-if-in-upstream" '
 
        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 @@ test_expect_success "format-patch doesn't consider merge commits" '
        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 @@ test_expect_success "format-patch result applies" '
 
        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 @@ test_expect_success "format-patch --ignore-if-in-upstream result applies" '
 
        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
 '
 
@@ -764,22 +764,14 @@ test_expect_success 'format-patch --signature="" suppresses signatures' '
 
 test_expect_success TTY 'format-patch --stdout paginates' '
        rm -f pager_used &&
-       (
-               GIT_PAGER="wc >pager_used" &&
-               export GIT_PAGER &&
-               test_terminal git format-patch --stdout --all
-       ) &&
+       test_terminal env GIT_PAGER="wc >pager_used" git format-patch --stdout --all &&
        test_path_is_file pager_used
 '
 
  test_expect_success TTY 'format-patch --stdout pagination can be disabled' '
        rm -f pager_used &&
-       (
-               GIT_PAGER="wc >pager_used" &&
-               export GIT_PAGER &&
-               test_terminal git --no-pager format-patch --stdout --all &&
-               test_terminal git -c "pager.format-patch=false" format-patch --stdout --all
-       ) &&
+       test_terminal env GIT_PAGER="wc >pager_used" git --no-pager format-patch --stdout --all &&
+       test_terminal env GIT_PAGER="wc >pager_used" git -c "pager.format-patch=false" format-patch --stdout --all &&
        test_path_is_missing pager_used &&
        test_path_is_missing .git/pager_used
 '
index 38a092a0dadbe09b903484c1d34e240a9d819c77..34591c23da82230f2412b46620f0d3a12188656f 100755 (executable)
@@ -7,179 +7,103 @@ test_description='Test custom diff function name patterns'
 
 . ./test-lib.sh
 
-LF='
-'
-cat >Beer.java <<\EOF
-public class Beer
-{
-       int special;
-       public static void main(String args[])
-       {
-               String s=" ";
-               for(int x = 99; x > 0; x--)
-               {
-                       System.out.print(x + " bottles of beer on the wall "
-                               + x + " bottles of beer\n"
-                               + "Take one down, pass it around, " + (x - 1)
-                               + " bottles of beer on the wall.\n");
-               }
-               System.out.print("Go to the store, buy some more,\n"
-                       + "99 bottles of beer on the wall.\n");
-       }
-}
-EOF
-sed 's/beer\\/beer,\\/' <Beer.java >Beer-correct.java
-cat >Beer.perl <<\EOT
-package Beer;
-
-use strict;
-use warnings;
-use parent qw(Exporter);
-our @EXPORT_OK = qw(round finalround);
-
-sub other; # forward declaration
-
-# hello
-
-sub round {
-       my ($n) = @_;
-       print "$n bottles of beer on the wall ";
-       print "$n bottles of beer\n";
-       print "Take one down, pass it around, ";
-       $n = $n - 1;
-       print "$n bottles of beer on the wall.\n";
-}
-
-sub finalround
-{
-       print "Go to the store, buy some more\n";
-       print "99 bottles of beer on the wall.\n");
-}
-
-sub withheredocument {
-       print <<"EOF"
-decoy here-doc
-EOF
-       # some lines of context
-       # to pad it out
-       print "hello\n";
-}
-
-__END__
-
-=head1 NAME
-
-Beer - subroutine to output fragment of a drinking song
-
-=head1 SYNOPSIS
-
-       use Beer qw(round finalround);
-
-       sub song {
-               for (my $i = 99; $i > 0; $i--) {
-                       round $i;
-               }
-               finalround;
-       }
+test_expect_success 'setup' '
+       # a non-trivial custom pattern
+       git config diff.custom1.funcname "!static
+!String
+[^     ].*s.*" &&
 
-       song;
+       # a custom pattern which matches to end of line
+       git config diff.custom2.funcname "......Beer\$" &&
 
-=cut
-EOT
-sed -e '
-       s/hello/goodbye/
-       s/beer\\/beer,\\/
-       s/more\\/more,\\/
-       s/song;/song();/
-' <Beer.perl >Beer-correct.perl
+       # alternation in pattern
+       git config diff.custom3.funcname "Beer$" &&
+       git config diff.custom3.xfuncname "^[   ]*((public|static).*)$" &&
 
-test_expect_funcname () {
-       lang=${2-java}
-       test_expect_code 1 git diff --no-index -U1 \
-               "Beer.$lang" "Beer-correct.$lang" >diff &&
-       grep "^@@.*@@ $1" diff
-}
+       # for regexp compilation tests
+       echo A >A.java &&
+       echo B >B.java
+'
 
-for p in ada bibtex cpp csharp fortran html java matlab objc pascal perl php python ruby tex
+diffpatterns="
+       ada
+       bibtex
+       cpp
+       csharp
+       fortran
+       html
+       java
+       matlab
+       objc
+       pascal
+       perl
+       php
+       python
+       ruby
+       tex
+       custom1
+       custom2
+       custom3
+"
+
+for p in $diffpatterns
 do
        test_expect_success "builtin $p pattern compiles" '
                echo "*.java diff=$p" >.gitattributes &&
                test_expect_code 1 git diff --no-index \
-                       Beer.java Beer-correct.java 2>msg &&
-               ! grep fatal msg &&
-               ! grep error msg
+                       A.java B.java 2>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 \
-                       Beer.java Beer-correct.java 2>msg &&
-               ! grep fatal msg &&
-               ! grep error msg
+                       A.java B.java 2>msg &&
+               ! test_i18ngrep fatal msg &&
+               ! test_i18ngrep error msg
        '
 done
 
-test_expect_success 'default behaviour' '
-       rm -f .gitattributes &&
-       test_expect_funcname "public class Beer\$"
-'
-
-test_expect_success 'set up .gitattributes declaring drivers to test' '
-       cat >.gitattributes <<-\EOF
-       *.java diff=java
-       *.perl diff=perl
-       EOF
-'
-
-test_expect_success 'preset java pattern' '
-       test_expect_funcname "public static void main("
-'
-
-test_expect_success 'preset perl pattern' '
-       test_expect_funcname "sub round {\$" perl
-'
-
-test_expect_success 'perl pattern accepts K&R style brace placement, too' '
-       test_expect_funcname "sub finalround\$" perl
-'
-
-test_expect_success 'but is not distracted by end of <<here document' '
-       test_expect_funcname "sub withheredocument {\$" perl
-'
-
-test_expect_success 'perl pattern is not distracted by sub within POD' '
-       test_expect_funcname "=head" perl
-'
-
-test_expect_success 'perl pattern gets full line of POD header' '
-       test_expect_funcname "=head1 SYNOPSIS\$" perl
-'
-
-test_expect_success 'perl pattern is not distracted by forward declaration' '
-       test_expect_funcname "package Beer;\$" perl
-'
-
-test_expect_success 'custom pattern' '
-       test_config diff.java.funcname "!static
-!String
-[^     ].*s.*" &&
-       test_expect_funcname "int special;\$"
-'
-
 test_expect_success 'last regexp must not be negated' '
+       echo "*.java diff=java" >.gitattributes &&
        test_config diff.java.funcname "!static" &&
-       test_expect_code 128 git diff --no-index Beer.java Beer-correct.java 2>msg &&
-       grep ": Last expression must not be negated:" msg
+       test_expect_code 128 git diff --no-index A.java B.java 2>msg &&
+       test_i18ngrep ": Last expression must not be negated:" msg
 '
 
-test_expect_success 'pattern which matches to end of line' '
-       test_config diff.java.funcname "Beer\$" &&
-       test_expect_funcname "Beer\$"
+test_expect_success 'setup hunk header tests' '
+       for i in $diffpatterns
+       do
+               echo "$i-* diff=$i"
+       done > .gitattributes &&
+
+       # add all test files to the index
+       (
+               cd "$TEST_DIRECTORY"/t4018 &&
+               git --git-dir="$TRASH_DIRECTORY/.git" add .
+       ) &&
+
+       # place modified files in the worktree
+       for i in $(git ls-files)
+       do
+               sed -e "s/ChangeMe/IWasChanged/" <"$TEST_DIRECTORY/t4018/$i" >"$i" || return 1
+       done
 '
 
-test_expect_success 'alternation in pattern' '
-       test_config diff.java.funcname "Beer$" &&
-       test_config diff.java.xfuncname "^[     ]*((public|static).*)$" &&
-       test_expect_funcname "public static void main("
-'
+# check each individual file
+for i in $(git ls-files)
+do
+       if grep broken "$i" >/dev/null 2>&1
+       then
+               result=failure
+       else
+               result=success
+       fi
+       test_expect_$result "hunk header: $i" "
+               test_when_finished 'cat actual' &&      # for debugging only
+               git diff -U1 $i >actual &&
+               grep '@@ .* @@.*RIGHT' actual
+       "
+done
 
 test_done
diff --git a/t/t4018/README b/t/t4018/README
new file mode 100644 (file)
index 0000000..283e01c
--- /dev/null
@@ -0,0 +1,18 @@
+How to write RIGHT test cases
+=============================
+
+Insert the word "ChangeMe" (exactly this form) at a distance of
+at least two lines from the line that must appear in the hunk header.
+
+The text that must appear in the hunk header must contain the word
+"right", but in all upper-case, like in the title above.
+
+To mark a test case that highlights a malfunction, insert the word
+BROKEN in all lower-case somewhere in the file.
+
+This text is a bit twisted and out of order, but it is itself a
+test case for the default hunk header pattern. Know what you are doing
+if you change it.
+
+BTW, this tests that the head line goes to the hunk header, not the line
+of equal signs.
diff --git a/t/t4018/cpp-c++-function b/t/t4018/cpp-c++-function
new file mode 100644 (file)
index 0000000..9ee6bbe
--- /dev/null
@@ -0,0 +1,4 @@
+Item RIGHT::DoSomething( Args with_spaces )
+{
+       ChangeMe;
+}
diff --git a/t/t4018/cpp-class-constructor b/t/t4018/cpp-class-constructor
new file mode 100644 (file)
index 0000000..ec4f115
--- /dev/null
@@ -0,0 +1,4 @@
+Item::Item(int RIGHT)
+{
+       ChangeMe;
+}
diff --git a/t/t4018/cpp-class-constructor-mem-init b/t/t4018/cpp-class-constructor-mem-init
new file mode 100644 (file)
index 0000000..49a69f3
--- /dev/null
@@ -0,0 +1,5 @@
+Item::Item(int RIGHT) :
+       member(0)
+{
+       ChangeMe;
+}
diff --git a/t/t4018/cpp-class-definition b/t/t4018/cpp-class-definition
new file mode 100644 (file)
index 0000000..11b61da
--- /dev/null
@@ -0,0 +1,4 @@
+class RIGHT
+{
+       int ChangeMe;
+};
diff --git a/t/t4018/cpp-class-definition-derived b/t/t4018/cpp-class-definition-derived
new file mode 100644 (file)
index 0000000..3b98cd0
--- /dev/null
@@ -0,0 +1,5 @@
+class RIGHT :
+       public Baseclass
+{
+       int ChangeMe;
+};
diff --git a/t/t4018/cpp-class-destructor b/t/t4018/cpp-class-destructor
new file mode 100644 (file)
index 0000000..5487665
--- /dev/null
@@ -0,0 +1,4 @@
+RIGHT::~RIGHT()
+{
+       ChangeMe;
+}
diff --git a/t/t4018/cpp-function-returning-global-type b/t/t4018/cpp-function-returning-global-type
new file mode 100644 (file)
index 0000000..1084d59
--- /dev/null
@@ -0,0 +1,4 @@
+::Item get::it::RIGHT()
+{
+       ChangeMe;
+}
diff --git a/t/t4018/cpp-function-returning-nested b/t/t4018/cpp-function-returning-nested
new file mode 100644 (file)
index 0000000..d9750aa
--- /dev/null
@@ -0,0 +1,5 @@
+get::Item get::it::RIGHT()
+{
+       ChangeMe;
+}
+
diff --git a/t/t4018/cpp-function-returning-pointer b/t/t4018/cpp-function-returning-pointer
new file mode 100644 (file)
index 0000000..ef15657
--- /dev/null
@@ -0,0 +1,4 @@
+const char *get_it_RIGHT(char *ptr)
+{
+       ChangeMe;
+}
diff --git a/t/t4018/cpp-function-returning-reference b/t/t4018/cpp-function-returning-reference
new file mode 100644 (file)
index 0000000..01b051d
--- /dev/null
@@ -0,0 +1,4 @@
+string& get::it::RIGHT(char *ptr)
+{
+       ChangeMe;
+}
diff --git a/t/t4018/cpp-gnu-style-function b/t/t4018/cpp-gnu-style-function
new file mode 100644 (file)
index 0000000..08c7c75
--- /dev/null
@@ -0,0 +1,5 @@
+const char *
+RIGHT(int arg)
+{
+       ChangeMe;
+}
diff --git a/t/t4018/cpp-namespace-definition b/t/t4018/cpp-namespace-definition
new file mode 100644 (file)
index 0000000..6749980
--- /dev/null
@@ -0,0 +1,4 @@
+namespace RIGHT
+{
+       ChangeMe;
+}
diff --git a/t/t4018/cpp-operator-definition b/t/t4018/cpp-operator-definition
new file mode 100644 (file)
index 0000000..1acd827
--- /dev/null
@@ -0,0 +1,4 @@
+Value operator+(Value LEFT, Value RIGHT)
+{
+       ChangeMe;
+}
diff --git a/t/t4018/cpp-skip-access-specifiers b/t/t4018/cpp-skip-access-specifiers
new file mode 100644 (file)
index 0000000..4d4a9db
--- /dev/null
@@ -0,0 +1,8 @@
+class RIGHT : public Baseclass
+{
+public:
+protected:
+private:
+       void DoSomething();
+       int ChangeMe;
+};
diff --git a/t/t4018/cpp-skip-comment-block b/t/t4018/cpp-skip-comment-block
new file mode 100644 (file)
index 0000000..3800b99
--- /dev/null
@@ -0,0 +1,9 @@
+struct item RIGHT(int i)
+// Do not
+// pick up
+/* these
+** comments.
+*/
+{
+       ChangeMe;
+}
diff --git a/t/t4018/cpp-skip-labels b/t/t4018/cpp-skip-labels
new file mode 100644 (file)
index 0000000..b9c10ab
--- /dev/null
@@ -0,0 +1,8 @@
+void RIGHT (void)
+{
+repeat:                // C++ comment
+next:          /* C comment */
+       do_something();
+
+       ChangeMe;
+}
diff --git a/t/t4018/cpp-struct-definition b/t/t4018/cpp-struct-definition
new file mode 100644 (file)
index 0000000..521c59f
--- /dev/null
@@ -0,0 +1,9 @@
+struct RIGHT {
+       unsigned
+       /* this bit field looks like a label and should not be picked up */
+               decoy_bitfield: 2,
+               more : 1;
+       int filler;
+
+       int ChangeMe;
+};
diff --git a/t/t4018/cpp-struct-single-line b/t/t4018/cpp-struct-single-line
new file mode 100644 (file)
index 0000000..a0de5fb
--- /dev/null
@@ -0,0 +1,7 @@
+void wrong()
+{
+}
+
+struct RIGHT_iterator_tag {};
+
+int ChangeMe;
diff --git a/t/t4018/cpp-template-function-definition b/t/t4018/cpp-template-function-definition
new file mode 100644 (file)
index 0000000..0cdf5ba
--- /dev/null
@@ -0,0 +1,4 @@
+template<class T> int RIGHT(T arg)
+{
+       ChangeMe;
+}
diff --git a/t/t4018/cpp-union-definition b/t/t4018/cpp-union-definition
new file mode 100644 (file)
index 0000000..7ec94df
--- /dev/null
@@ -0,0 +1,4 @@
+union RIGHT {
+       double v;
+       int ChangeMe;
+};
diff --git a/t/t4018/cpp-void-c-function b/t/t4018/cpp-void-c-function
new file mode 100644 (file)
index 0000000..153081e
--- /dev/null
@@ -0,0 +1,4 @@
+void RIGHT (void)
+{
+       ChangeMe;
+}
diff --git a/t/t4018/custom1-pattern b/t/t4018/custom1-pattern
new file mode 100644 (file)
index 0000000..e8fd59f
--- /dev/null
@@ -0,0 +1,17 @@
+public class Beer
+{
+       int special, RIGHT;
+       public static void main(String args[])
+       {
+               String s=" ";
+               for(int x = 99; x > 0; x--)
+               {
+                       System.out.print(x + " bottles of beer on the wall "
+                               + x + " bottles of beer\n" // ChangeMe
+                               + "Take one down, pass it around, " + (x - 1)
+                               + " bottles of beer on the wall.\n");
+               }
+               System.out.print("Go to the store, buy some more,\n"
+                       + "99 bottles of beer on the wall.\n");
+       }
+}
diff --git a/t/t4018/custom2-match-to-end-of-line b/t/t4018/custom2-match-to-end-of-line
new file mode 100644 (file)
index 0000000..f88ac31
--- /dev/null
@@ -0,0 +1,8 @@
+public class RIGHT_Beer
+{
+       int special;
+       public static void main(String args[])
+       {
+               System.out.print("ChangeMe");
+       }
+}
diff --git a/t/t4018/custom3-alternation-in-pattern b/t/t4018/custom3-alternation-in-pattern
new file mode 100644 (file)
index 0000000..5f3769c
--- /dev/null
@@ -0,0 +1,17 @@
+public class Beer
+{
+       int special;
+       public static void main(String RIGHT[])
+       {
+               String s=" ";
+               for(int x = 99; x > 0; x--)
+               {
+                       System.out.print(x + " bottles of beer on the wall "
+                               + x + " bottles of beer\n" // ChangeMe
+                               + "Take one down, pass it around, " + (x - 1)
+                               + " bottles of beer on the wall.\n");
+               }
+               System.out.print("Go to the store, buy some more,\n"
+                       + "99 bottles of beer on the wall.\n");
+       }
+}
diff --git a/t/t4018/java-class-member-function b/t/t4018/java-class-member-function
new file mode 100644 (file)
index 0000000..298bc7a
--- /dev/null
@@ -0,0 +1,8 @@
+public class Beer
+{
+       int special;
+       public static void main(String RIGHT[])
+       {
+               System.out.print("ChangeMe");
+       }
+}
diff --git a/t/t4018/perl-skip-end-of-heredoc b/t/t4018/perl-skip-end-of-heredoc
new file mode 100644 (file)
index 0000000..c22d39b
--- /dev/null
@@ -0,0 +1,8 @@
+sub RIGHTwithheredocument {
+       print <<"EOF"
+decoy here-doc
+EOF
+       # some lines of context
+       # to pad it out
+       print "ChangeMe\n";
+}
diff --git a/t/t4018/perl-skip-forward-decl b/t/t4018/perl-skip-forward-decl
new file mode 100644 (file)
index 0000000..a98cb8b
--- /dev/null
@@ -0,0 +1,10 @@
+package RIGHT;
+
+use strict;
+use warnings;
+use parent qw(Exporter);
+our @EXPORT_OK = qw(round finalround);
+
+sub other; # forward declaration
+
+# ChangeMe
diff --git a/t/t4018/perl-skip-sub-in-pod b/t/t4018/perl-skip-sub-in-pod
new file mode 100644 (file)
index 0000000..e39f024
--- /dev/null
@@ -0,0 +1,18 @@
+=head1 NAME
+
+Beer - subroutine to output fragment of a drinking song
+
+=head1 SYNOPSIS_RIGHT
+
+       use Beer qw(round finalround);
+
+       sub song {
+               for (my $i = 99; $i > 0; $i--) {
+                       round $i;
+               }
+               finalround;
+       }
+
+       ChangeMe;
+
+=cut
diff --git a/t/t4018/perl-sub-definition b/t/t4018/perl-sub-definition
new file mode 100644 (file)
index 0000000..a507d1f
--- /dev/null
@@ -0,0 +1,4 @@
+sub RIGHT {
+       my ($n) = @_;
+       print "ChangeMe";
+}
diff --git a/t/t4018/perl-sub-definition-kr-brace b/t/t4018/perl-sub-definition-kr-brace
new file mode 100644 (file)
index 0000000..330b3df
--- /dev/null
@@ -0,0 +1,4 @@
+sub RIGHT
+{
+       print "ChangeMe\n";
+}
index ba43f185494630c50fc2a168df8dcd45c0b2421b..98d9713d8b2454eb1dfc4f137133a7cb0174bd0d 100755 (executable)
@@ -42,7 +42,7 @@ test_expect_success 'attach and signoff do not duplicate mime headers' '
 
        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
 
 '
 
index 1019d7b35fcb350761a44cf4ccd5ae156ce8d577..41913c3aa30de6d55b016fa9331e0877579b2d6b 100755 (executable)
@@ -94,7 +94,7 @@ test_expect_success 'setup for --cc --raw' '
        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"
index 097e63215e1ffc349ae9e3803f953aa70882b6a4..dff36b77ec8856573da26685376d156d49f8e021 100755 (executable)
@@ -5,7 +5,7 @@ test_description='combined diff show only paths that are different to all parent
 . ./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
index b04fc8fc12238c3326306ed0e055b7d67bf950b4..9e29b5262d3f2e8514d5742951e28a3a339218dc 100755 (executable)
@@ -111,7 +111,6 @@ sed -e 's/T/        /g' > main.c.final <<\EOF
 #include <stdio.h>
 
 void print_int(int num);
-T/* a comment */
 int func(int num);
 
 int main() {
@@ -154,7 +153,8 @@ test_expect_success 'patch2 reverse applies with --ignore-space-change' '
 git config apply.ignorewhitespace change
 
 test_expect_success 'patch2 applies (apply.ignorewhitespace = change)' '
-       git apply patch2.patch
+       git apply patch2.patch &&
+       test_cmp main.c.final main.c
 '
 
 test_expect_success 'patch3 fails (missing string at EOL)' '
@@ -165,12 +165,8 @@ test_expect_success 'patch4 fails (missing EOL at EOF)' '
        test_must_fail git apply patch4.patch
 '
 
-test_expect_success 'patch5 applies (leading whitespace)' '
-       git apply patch5.patch
-'
-
-test_expect_success 'patches do not mangle whitespace' '
-       test_cmp main.c main.c.final
+test_expect_success 'patch5 fails (leading whitespace differences matter)' '
+       test_must_fail git apply patch5.patch
 '
 
 test_expect_success 're-create file (with --ignore-whitespace)' '
index 1e4d4380bf01c081aeb1df44cef40319063f2faa..ce8567f496438c18501f30632269ecbe7de15fd3 100755 (executable)
@@ -30,10 +30,10 @@ test_expect_success setup '
 
 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 'setup separate repository lacking postimage' '
 
 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"
        )
 '
index 3d0384daa8a7b7369826b05bcb793cb445c3f9ee..c393be691be42a0b0a982c07ffeee489d4075bce 100755 (executable)
@@ -68,7 +68,7 @@ test_expect_success 'apply --whitespace=strip from config' '
        check_result sub/file1
 '
 
-D=`pwd`
+D=$(pwd)
 
 test_expect_success 'apply --whitespace=strip in subdir' '
 
index d2c930de87f721a0e876351e511295ae0b094108..7940f6f0b952b5accd3f1263f08e131a018de140 100755 (executable)
@@ -45,8 +45,8 @@ test_expect_success 'patch-id supports git-format-patch output' '
        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' '
index 38fb80f643534a2bd724e13ef271f90167ac11a3..844df760f7d1c2b1b25eb01fada039efd0354711 100755 (executable)
@@ -3,82 +3,72 @@
 test_description='log --grep/--author/--regexp-ignore-case/-S/-G'
 . ./test-lib.sh
 
+test_log () {
+       expect=$1
+       kind=$2
+       needle=$3
+       shift 3
+       rest=$@
+
+       case $kind in
+       --*)
+               opt=$kind=$needle
+               ;;
+       *)
+               opt=$kind$needle
+               ;;
+       esac
+       case $expect in
+       expect_nomatch)
+               match=nomatch
+               ;;
+       *)
+               match=match
+               ;;
+       esac
+
+       test_expect_success "log $kind${rest:+ $rest} ($match)" "
+               git log $rest $opt --format=%H >actual &&
+               test_cmp $expect actual
+       "
+}
+
+# test -i and --regexp-ignore-case and expect both to behave the same way
+test_log_icase () {
+       test_log $@ --regexp-ignore-case
+       test_log $@ -i
+}
+
 test_expect_success setup '
+       >expect_nomatch &&
+
        >file &&
        git add file &&
        test_tick &&
        git commit -m initial &&
+       git rev-parse --verify HEAD >expect_initial &&
 
        echo Picked >file &&
+       git add file &&
        test_tick &&
-       git commit -a --author="Another Person <another@example.com>" -m second
-'
-
-test_expect_success 'log --grep' '
-       git log --grep=initial --format=%H >actual &&
-       git rev-parse --verify HEAD^ >expect &&
-       test_cmp expect actual
-'
-
-test_expect_success 'log --grep --regexp-ignore-case' '
-       git log --regexp-ignore-case --grep=InItial --format=%H >actual &&
-       git rev-parse --verify HEAD^ >expect &&
-       test_cmp expect actual
-'
-
-test_expect_success 'log --grep -i' '
-       git log -i --grep=InItial --format=%H >actual &&
-       git rev-parse --verify HEAD^ >expect &&
-       test_cmp expect actual
-'
-
-test_expect_success 'log --author --regexp-ignore-case' '
-       git log --regexp-ignore-case --author=person --format=%H >actual &&
-       git rev-parse --verify HEAD >expect &&
-       test_cmp expect actual
-'
-
-test_expect_success 'log --author -i' '
-       git log -i --author=person --format=%H >actual &&
-       git rev-parse --verify HEAD >expect &&
-       test_cmp expect actual
-'
-
-test_expect_success 'log -G (nomatch)' '
-       git log -Gpicked --format=%H >actual &&
-       >expect &&
-       test_cmp expect actual
-'
-
-test_expect_success 'log -G (match)' '
-       git log -GPicked --format=%H >actual &&
-       git rev-parse --verify HEAD >expect &&
-       test_cmp expect actual
-'
-
-test_expect_success 'log -G --regexp-ignore-case (nomatch)' '
-       git log --regexp-ignore-case -Gpickle --format=%H >actual &&
-       >expect &&
-       test_cmp expect actual
+       git commit --author="Another Person <another@example.com>" -m second &&
+       git rev-parse --verify HEAD >expect_second
 '
 
-test_expect_success 'log -G -i (nomatch)' '
-       git log -i -Gpickle --format=%H >actual &&
-       >expect &&
-       test_cmp expect actual
-'
+test_log       expect_initial  --grep initial
+test_log       expect_nomatch  --grep InItial
+test_log_icase expect_initial  --grep InItial
+test_log_icase expect_nomatch  --grep initail
 
-test_expect_success 'log -G --regexp-ignore-case (match)' '
-       git log --regexp-ignore-case -Gpicked --format=%H >actual &&
-       git rev-parse --verify HEAD >expect &&
-       test_cmp expect actual
-'
+test_log       expect_second   --author Person
+test_log       expect_nomatch  --author person
+test_log_icase expect_second   --author person
+test_log_icase expect_nomatch  --author spreon
 
-test_expect_success 'log -G -i (match)' '
-       git log -i -Gpicked --format=%H >actual &&
-       git rev-parse --verify HEAD >expect &&
-       test_cmp expect actual
-'
+test_log       expect_nomatch  -G picked
+test_log       expect_second   -G Picked
+test_log_icase expect_nomatch  -G pickle
+test_log_icase expect_second   -G picked
 
 test_expect_success 'log -G --textconv (missing textconv tool)' '
        echo "* diff=test" >.gitattributes &&
@@ -89,46 +79,19 @@ test_expect_success 'log -G --textconv (missing textconv tool)' '
 test_expect_success 'log -G --no-textconv (missing textconv tool)' '
        echo "* diff=test" >.gitattributes &&
        git -c diff.test.textconv=missing log -Gfoo --no-textconv >actual &&
-       >expect &&
-       test_cmp expect actual &&
+       test_cmp expect_nomatch actual &&
        rm .gitattributes
 '
 
-test_expect_success 'log -S (nomatch)' '
-       git log -Spicked --format=%H >actual &&
-       >expect &&
-       test_cmp expect actual
-'
-
-test_expect_success 'log -S (match)' '
-       git log -SPicked --format=%H >actual &&
-       git rev-parse --verify HEAD >expect &&
-       test_cmp expect actual
-'
-
-test_expect_success 'log -S --regexp-ignore-case (match)' '
-       git log --regexp-ignore-case -Spicked --format=%H >actual &&
-       git rev-parse --verify HEAD >expect &&
-       test_cmp expect actual
-'
-
-test_expect_success 'log -S -i (match)' '
-       git log -i -Spicked --format=%H >actual &&
-       git rev-parse --verify HEAD >expect &&
-       test_cmp expect actual
-'
-
-test_expect_success 'log -S --regexp-ignore-case (nomatch)' '
-       git log --regexp-ignore-case -Spickle --format=%H >actual &&
-       >expect &&
-       test_cmp expect actual
-'
+test_log       expect_nomatch  -S picked
+test_log       expect_second   -S Picked
+test_log_icase expect_second   -S picked
+test_log_icase expect_nomatch  -S pickle
 
-test_expect_success 'log -S -i (nomatch)' '
-       git log -i -Spickle --format=%H >actual &&
-       >expect &&
-       test_cmp expect actual
-'
+test_log       expect_nomatch  -S p.cked --pickaxe-regex
+test_log       expect_second   -S P.cked --pickaxe-regex
+test_log_icase expect_second   -S p.cked --pickaxe-regex
+test_log_icase expect_nomatch  -S p.ckle --pickaxe-regex
 
 test_expect_success 'log -S --textconv (missing textconv tool)' '
        echo "* diff=test" >.gitattributes &&
@@ -139,8 +102,7 @@ test_expect_success 'log -S --textconv (missing textconv tool)' '
 test_expect_success 'log -S --no-textconv (missing textconv tool)' '
        echo "* diff=test" >.gitattributes &&
        git -c diff.test.textconv=missing log -Sfoo --no-textconv >actual &&
-       >expect &&
-       test_cmp expect actual &&
+       test_cmp expect_nomatch actual &&
        rm .gitattributes
 '
 
index 3fa171541a161e0a5549c316b7c85608eb2d93d6..58b792bf20a1cd64435fca0b3d24b2417303f819 100755 (executable)
@@ -82,11 +82,9 @@ test_expect_success 'date parser recognizes time_t overflow' '
 '
 
 # date is within 2^63-1, but enough to choke glibc's gmtime
-test_expect_success 'absurdly far-in-future dates produce sentinel' '
+test_expect_success 'absurdly far-in-future date' '
        commit=$(munge_author_date HEAD 999999999999999999) &&
-       echo "Thu Jan 1 00:00:00 1970 +0000" >expect &&
-       git log -1 --format=%ad $commit >actual &&
-       test_cmp expect actual
+       git log -1 --format=%ad $commit
 '
 
 test_done
index 1cf0a4e10301fe1bbfb3acced0c010da7b8df7f8..74fc5a88ecdaf66e34449df1a3429f8ee22cb1da 100755 (executable)
@@ -123,7 +123,7 @@ 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` &&
+     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)'
@@ -207,7 +207,7 @@ test_expect_success \
 
 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 +215,7 @@ test_expect_success 'clients cannot access unreachable commits' '
 
 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 &&
index 75d6b3843ad4070f225e82aec160eca494ab6238..82c33b88e710b5fb6163a7bdcd9ecb783633aa83 100755 (executable)
@@ -223,7 +223,13 @@ test_expect_success 'pull request format' '
                git request-pull initial "$downstream_url" tags/full:refs/tags/full
        ) >request &&
        sed -nf fuzz.sed <request >request.fuzzy &&
-       test_i18ncmp expect request.fuzzy
+       test_i18ncmp expect request.fuzzy &&
+
+       (
+               cd local &&
+               git request-pull initial "$downstream_url" full
+       ) >request &&
+       grep " tags/full\$" request
 '
 
 test_expect_success 'request-pull ignores OPTIONS_KEEPDASHDASH poison' '
index 66c9a41739e5d75633a239c55fd516341f8a98e3..377d3d3899737fec47f34f0db28ac876eb146af8 100755 (executable)
@@ -213,7 +213,7 @@ test_expect_success 'garbage report in count-objects -v' '
 warning: garbage found: .git/objects/pack/fake.bar
 warning: garbage found: .git/objects/pack/foo
 warning: garbage found: .git/objects/pack/foo.bar
-warning: no corresponding .idx nor .pack: .git/objects/pack/fake2.keep
+warning: no corresponding .idx or .pack: .git/objects/pack/fake2.keep
 warning: no corresponding .idx: .git/objects/pack/foo.keep
 warning: no corresponding .idx: .git/objects/pack/foo.pack
 warning: no corresponding .pack: .git/objects/pack/fake3.idx
index b061864a8743636ae7759ff4e8ff2694410617a1..21517c70cd49ab91ab267544311d8c33173e3c3e 100755 (executable)
@@ -45,9 +45,7 @@ test_expect_success 'unpack objects' '
 test_expect_success 'check unpacked result (have commit, no tag)' '
        git rev-list --objects $commit >list.expect &&
        (
-               GIT_DIR=clone.git &&
-               export GIT_DIR &&
-               test_must_fail git cat-file -e $tag &&
+               test_must_fail env GIT_DIR=clone.git git cat-file -e $tag &&
                git rev-list --objects $commit
        ) >list.actual &&
        test_cmp list.expect list.actual
index d3a3afaba821f8b70c5f365f1046ba7a707e5085..f4f02ba918535d5c40a30585a54469bc12ab96d3 100755 (executable)
@@ -3,6 +3,10 @@
 test_description='exercise basic bitmap functionality'
 . ./test-lib.sh
 
+objpath () {
+       echo ".git/objects/$(echo "$1" | sed -e 's|\(..\)|\1/|')"
+}
+
 test_expect_success 'setup repo with moderate-sized history' '
        for i in $(test_seq 1 10); do
                test_commit $i
@@ -91,7 +95,10 @@ test_expect_success 'fetch (partial bitmap)' '
 
 test_expect_success 'incremental repack cannot create bitmaps' '
        test_commit more-1 &&
-       test_must_fail git repack -d
+       find .git/objects/pack -name "*.bitmap" >expect &&
+       git repack -d &&
+       find .git/objects/pack -name "*.bitmap" >actual &&
+       test_cmp expect actual
 '
 
 test_expect_success 'incremental repack can disable bitmaps' '
@@ -112,6 +119,33 @@ test_expect_success 'fetch (full bitmap)' '
        test_cmp expect actual
 '
 
+test_expect_success 'create objects for missing-HAVE tests' '
+       blob=$(echo "missing have" | git hash-object -w --stdin) &&
+       tree=$(printf "100644 blob $blob\tfile\n" | git mktree) &&
+       parent=$(echo parent | git commit-tree $tree) &&
+       commit=$(echo commit | git commit-tree $tree -p $parent) &&
+       cat >revs <<-EOF
+       HEAD
+       ^HEAD^
+       ^$commit
+       EOF
+'
+
+test_expect_success 'pack with missing blob' '
+       rm $(objpath $blob) &&
+       git pack-objects --stdout --revs <revs >/dev/null
+'
+
+test_expect_success 'pack with missing tree' '
+       rm $(objpath $tree) &&
+       git pack-objects --stdout --revs <revs >/dev/null
+'
+
+test_expect_success 'pack with missing parent' '
+       rm $(objpath $parent) &&
+       git pack-objects --stdout --revs <revs >/dev/null
+'
+
 test_lazy_prereq JGIT '
        type jgit
 '
index ab28594c62dd7cddc69d3afdb075b48c34091c45..29d59ef9fa2bf2bffb0075f07e03103387ab718e 100755 (executable)
@@ -113,6 +113,26 @@ test_expect_success 'fetch --prune with a namespace keeps other namespaces' '
        git rev-parse origin/master
 '
 
+test_expect_success 'fetch --prune handles overlapping refspecs' '
+       cd "$D" &&
+       git update-ref refs/pull/42/head master &&
+       git clone . prune-overlapping &&
+       cd prune-overlapping &&
+       git config --add remote.origin.fetch refs/pull/*/head:refs/remotes/origin/pr/* &&
+
+       git fetch --prune origin &&
+       git rev-parse origin/master &&
+       git rev-parse origin/pr/42 &&
+
+       git config --unset-all remote.origin.fetch
+       git config remote.origin.fetch refs/pull/*/head:refs/remotes/origin/pr/* &&
+       git config --add remote.origin.fetch refs/heads/*:refs/remotes/origin/* &&
+
+       git fetch --prune origin &&
+       git rev-parse origin/master &&
+       git rev-parse origin/pr/42
+'
+
 test_expect_success 'fetch --prune --tags prunes branches but not tags' '
        cd "$D" &&
        git clone . prune-tags &&
@@ -301,7 +321,7 @@ test_expect_success 'fetch via rsync' '
        mkdir rsynced &&
        (cd rsynced &&
         git init --bare &&
-        git fetch "rsync:$(pwd)/../.git" master:refs/heads/master &&
+        git fetch "rsync:../.git" master:refs/heads/master &&
         git gc --prune &&
         test $(git rev-parse master) = $(cd .. && git rev-parse master) &&
         git fsck --full)
@@ -312,7 +332,7 @@ test_expect_success 'push via rsync' '
        (cd rsynced2 &&
         git init) &&
        (cd rsynced &&
-        git push "rsync:$(pwd)/../rsynced2/.git" master) &&
+        git push "rsync:../rsynced2/.git" master) &&
        (cd rsynced2 &&
         git gc --prune &&
         test $(git rev-parse master) = $(cd .. && git rev-parse master) &&
@@ -323,7 +343,7 @@ test_expect_success 'push via rsync' '
        mkdir rsynced3 &&
        (cd rsynced3 &&
         git init) &&
-       git push --all "rsync:$(pwd)/rsynced3/.git" &&
+       git push --all "rsync:rsynced3/.git" &&
        (cd rsynced3 &&
         test $(git rev-parse master) = $(cd .. && git rev-parse master) &&
         git fsck --full)
index be951a46797c6b88d2a8d420cf160ea4f3ad71b0..a980574682012fbb3f5f7c28a011df980f45c3de 100755 (executable)
@@ -173,33 +173,6 @@ EOF
        )
 '
 
-if test -n "$NO_CURL" -o -z "$GIT_TEST_HTTPD"; then
-       say 'skipping remaining tests, git built without http support'
-       test_done
-fi
-
-LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5537'}
-. "$TEST_DIRECTORY"/lib-httpd.sh
-start_httpd
-
-test_expect_success 'clone http repository' '
-       git clone --bare --no-local shallow "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
-       git clone $HTTPD_URL/smart/repo.git clone &&
-       (
-       cd clone &&
-       git fsck &&
-       git log --format=%s origin/master >actual &&
-       cat <<EOF >expect &&
-7
-6
-5
-4
-3
-EOF
-       test_cmp expect actual
-       )
-'
-
 test_expect_success POSIXPERM,SANITY 'shallow fetch from a read-only repo' '
        cp -R .git read-only.git &&
        find read-only.git -print | xargs chmod -w &&
@@ -213,5 +186,4 @@ EOF
        test_cmp expect actual
 '
 
-stop_httpd
 test_done
index 9be9ae3436c929921bc0a2cd2a458e4e4500c154..aa73eeaef82adff56083fdc2d5d35d599b73edee 100755 (executable)
@@ -5,12 +5,16 @@ test_description='test git-http-backend-noserver'
 
 HTTPD_DOCUMENT_ROOT_PATH="$TRASH_DIRECTORY"
 
-test_have_prereq GREP_STRIPS_CR && export GREP_OPTIONS=-U
+if test_have_prereq GREP_STRIPS_CR
+then
+       GREP_OPTIONS=-U
+       export GREP_OPTIONS
+fi
 
 run_backend() {
        echo "$2" |
-       QUERY_STRING="${1#*\?}" \
-       PATH_TRANSLATED="$HTTPD_DOCUMENT_ROOT_PATH/${1%%\?*}" \
+       QUERY_STRING="${1#*[?]}" \
+       PATH_TRANSLATED="$HTTPD_DOCUMENT_ROOT_PATH/${1%%[?]*}" \
        git http-backend >act.out 2>act.err
 }
 
index 3f353d99e8f4255b131b4d44d7ec2a2c73140f0f..cbcceab9d56b591ee851374c9030a23a4c65a462 100755 (executable)
@@ -12,21 +12,14 @@ test_expect_success setup '
 '
 
 test_expect_success 'clone calls git upload-pack unqualified with no -u option' '
-       (
-               GIT_SSH=./not_ssh &&
-               export GIT_SSH &&
-               test_must_fail git clone localhost:/path/to/repo junk
-       ) &&
+       test_must_fail env GIT_SSH=./not_ssh git clone localhost:/path/to/repo junk &&
        echo "localhost git-upload-pack '\''/path/to/repo'\''" >expected &&
        test_cmp expected not_ssh_output
 '
 
 test_expect_success 'clone calls specified git upload-pack with -u option' '
-       (
-               GIT_SSH=./not_ssh &&
-               export GIT_SSH &&
-               test_must_fail git clone -u ./something/bin/git-upload-pack localhost:/path/to/repo junk
-       ) &&
+       test_must_fail env GIT_SSH=./not_ssh \
+               git clone -u ./something/bin/git-upload-pack localhost:/path/to/repo junk &&
        echo "localhost ./something/bin/git-upload-pack '\''/path/to/repo'\''" >expected &&
        test_cmp expected not_ssh_output
 '
index c4903687fbc801ffd1db9e619065996f97986ccb..3c087e907c4fbe6d8a05854f1d1051a9f9afec7c 100755 (executable)
@@ -12,8 +12,8 @@ test_expect_success 'preparing origin repository' '
        : >file && git add . && git commit -m1 &&
        git clone --bare . a.git &&
        git clone --bare . x &&
-       test "$(GIT_CONFIG=a.git/config git config --bool core.bare)" = true &&
-       test "$(GIT_CONFIG=x/config git config --bool core.bare)" = true &&
+       test "$(cd a.git && git config --bool core.bare)" = true &&
+       test "$(cd x && git config --bool core.bare)" = true &&
        git bundle create b1.bundle --all &&
        git bundle create b2.bundle master &&
        mkdir dir &&
@@ -24,7 +24,7 @@ test_expect_success 'preparing origin repository' '
 test_expect_success 'local clone without .git suffix' '
        git clone -l -s a b &&
        (cd b &&
-       test "$(GIT_CONFIG=.git/config git config --bool core.bare)" = false &&
+       test "$(git config --bool core.bare)" = false &&
        git fetch)
 '
 
index c33cc25805d2a913725355a183118a0dd5547800..a00a660763451d57b2a9537ec1b99fcfd0c9a831 100755 (executable)
@@ -212,29 +212,42 @@ test_expect_success 'push update refs failure' '
        echo "update fail" >>file &&
        git commit -a -m "update fail" &&
        git rev-parse --verify testgit/origin/heads/update >expect &&
-       GIT_REMOTE_TESTGIT_PUSH_ERROR="non-fast forward" &&
-       export GIT_REMOTE_TESTGIT_PUSH_ERROR &&
-       test_expect_code 1 git push origin update &&
+       test_expect_code 1 env GIT_REMOTE_TESTGIT_FAILURE="non-fast forward" \
+               git push origin update &&
        git rev-parse --verify testgit/origin/heads/update >actual &&
        test_cmp expect actual
        )
 '
 
+clean_mark () {
+       cut -f 2 -d ' ' "$1" |
+       git cat-file --batch-check |
+       grep commit |
+       sort >$(basename "$1")
+}
+
+cmp_marks () {
+       test_when_finished "rm -rf git.marks testgit.marks" &&
+       clean_mark ".git/testgit/$1/git.marks" &&
+       clean_mark ".git/testgit/$1/testgit.marks" &&
+       test_cmp git.marks testgit.marks
+}
+
 test_expect_success 'proper failure checks for fetching' '
-       (GIT_REMOTE_TESTGIT_FAILURE=1 &&
-       export GIT_REMOTE_TESTGIT_FAILURE &&
-       cd local &&
-       test_must_fail git fetch 2> error &&
+       (cd local &&
+       test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git fetch 2>error &&
        cat error &&
        grep -q "Error while running fast-import" error
        )
 '
 
 test_expect_success 'proper failure checks for pushing' '
-       (GIT_REMOTE_TESTGIT_FAILURE=1 &&
-       export GIT_REMOTE_TESTGIT_FAILURE &&
-       cd local &&
-       test_must_fail git push --all
+       (cd local &&
+       git checkout -b crash master &&
+       echo crash >>file &&
+       git commit -a -m crash &&
+       test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git push --all &&
+       cmp_marks origin
        )
 '
 
index 98744038eccb396c752e6a4b6ced702733c0d396..9d9d9de08e1926525c24fc01c1217a96964fa1ee 100755 (executable)
@@ -190,12 +190,9 @@ test_expect_success '%C(auto) respects --no-color' '
 '
 
 test_expect_success TTY '%C(auto) respects --color=auto (stdout is tty)' '
-       (
-               TERM=vt100 && export TERM &&
-               test_terminal \
-                       git log --format=$AUTO_COLOR -1 --color=auto >actual &&
-               has_color actual
-       )
+       test_terminal env TERM=vt100 \
+               git log --format=$AUTO_COLOR -1 --color=auto >actual &&
+       has_color actual
 '
 
 test_expect_success '%C(auto) respects --color=auto (stdout not tty)' '
index dfee7d159b3b5198b4773f2d3869e809095b11f7..a86087be955a65d62a596f10cdbac1b6669cf2db 100755 (executable)
@@ -388,7 +388,7 @@ test_expect_failure 'git detects conflict w/ criss-cross+contrived resolution' '
 
 #
 # criss-cross + d/f conflict via add/add:
-#   Commit A: Neither file 'a' nor directory 'a/' exist.
+#   Commit A: Neither file 'a' nor directory 'a/' exists.
 #   Commit B: Introduce 'a'
 #   Commit C: Introduce 'a/file'
 #   Commit D: Merge B & C, keeping 'a' and deleting 'a/'
diff --git a/t/t6039-merge-ignorecase.sh b/t/t6039-merge-ignorecase.sh
new file mode 100755 (executable)
index 0000000..a977653
--- /dev/null
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+test_description='git-merge with case-changing rename on case-insensitive file system'
+
+. ./test-lib.sh
+
+if ! test_have_prereq CASE_INSENSITIVE_FS
+then
+       skip_all='skipping case insensitive tests - case sensitive file system'
+       test_done
+fi
+
+test_expect_success 'merge with case-changing rename' '
+       test $(git config core.ignorecase) = true &&
+       >TestCase &&
+       git add TestCase &&
+       git commit -m "add TestCase" &&
+       git tag baseline
+       git checkout -b with-camel &&
+       >foo &&
+       git add foo &&
+       git commit -m "intervening commit" &&
+       git checkout master &&
+       git rm TestCase &&
+       >testcase &&
+       git add testcase &&
+       git commit -m "rename to testcase" &&
+       git checkout with-camel &&
+       git merge master -m "merge" &&
+       test_path_is_file testcase
+'
+
+test_expect_success 'merge with case-changing rename on both sides' '
+       git checkout master &&
+       git reset --hard baseline &&
+       git branch -D with-camel &&
+       git checkout -b with-camel &&
+       git mv TestCase testcase &&
+       git commit -m "recase on branch" &&
+       >foo &&
+       git add foo &&
+       git commit -m "intervening commit" &&
+       git checkout master &&
+       git rm TestCase &&
+       >testcase &&
+       git add testcase &&
+       git commit -m "rename to testcase" &&
+       git checkout with-camel &&
+       git merge master -m "merge" &&
+       test_path_is_file testcase
+'
+
+test_done
index e3c8c2c1b8817acd85866470c6f76c4a4f8d17d7..54d78079e83d7d02f69035d3bf3999084f61834a 100755 (executable)
@@ -294,7 +294,8 @@ test_expect_success 'setup submodule' '
        git submodule add ./. sub &&
        echo content >file &&
        git add file &&
-       git commit -m "added sub and file"
+       git commit -m "added sub and file" &&
+       git branch submodule
 '
 
 test_expect_success 'git mv cannot move a submodule in a file' '
@@ -307,7 +308,7 @@ test_expect_success 'git mv moves a submodule with a .git directory and no .gitm
        (
                cd sub &&
                rm -f .git &&
-               cp -a ../.git/modules/sub .git &&
+               cp -R -P -p ../.git/modules/sub .git &&
                GIT_WORK_TREE=. git config --unset core.worktree
        ) &&
        mkdir mod &&
@@ -330,7 +331,7 @@ test_expect_success 'git mv moves a submodule with a .git directory and .gitmodu
        (
                cd sub &&
                rm -f .git &&
-               cp -a ../.git/modules/sub .git &&
+               cp -R -P -p ../.git/modules/sub .git &&
                GIT_WORK_TREE=. git config --unset core.worktree
        ) &&
        mkdir mod &&
@@ -446,8 +447,7 @@ test_expect_success 'checking out a commit before submodule moved needs manual u
        git mv sub sub2 &&
        git commit -m "moved sub to sub2" &&
        git checkout -q HEAD^ 2>actual &&
-       echo "warning: unable to rmdir sub2: Directory not empty" >expected &&
-       test_i18ncmp expected actual &&
+       test_i18ngrep "^warning: unable to rmdir sub2:" actual &&
        git status -s sub2 >actual &&
        echo "?? sub2/" >expected &&
        test_cmp expected actual &&
@@ -463,4 +463,14 @@ test_expect_success 'checking out a commit before submodule moved needs manual u
        ! test -s actual
 '
 
+test_expect_success 'mv -k does not accidentally destroy submodules' '
+       git checkout submodule &&
+       mkdir dummy dest &&
+       git mv -k dummy sub dest &&
+       git status --porcelain >actual &&
+       grep "^R  sub -> dest/sub" actual &&
+       git reset --hard &&
+       git checkout .
+'
+
 test_done
index 143a8ea60507a35bbdfb310eb74a33cf5b88bf1f..e4ab0f5b64194da05b159782a5e41479bf47de20 100755 (executable)
@@ -1423,4 +1423,30 @@ EOF
        test_cmp expect actual
 '
 
+run_with_limited_stack () {
+       (ulimit -s 64 && "$@")
+}
+
+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 4000
+       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
+'
+
 test_done
index b9365b431d1e412905ddd0efad1f809625224ba9..da958a8b569e6e8ad0c4d2e20b0454a0180155cc 100755 (executable)
@@ -146,11 +146,7 @@ test_expect_success 'no color when stdout is a regular file' '
 test_expect_success TTY 'color when writing to a pager' '
        rm -f paginated.out &&
        test_config color.ui auto &&
-       (
-               TERM=vt100 &&
-               export TERM &&
-               test_terminal git log
-       ) &&
+       test_terminal env TERM=vt100 git log &&
        colorful paginated.out
 '
 
@@ -158,11 +154,7 @@ test_expect_success TTY 'colors are suppressed by color.pager' '
        rm -f paginated.out &&
        test_config color.ui auto &&
        test_config color.pager false &&
-       (
-               TERM=vt100 &&
-               export TERM &&
-               test_terminal git log
-       ) &&
+       test_terminal env TERM=vt100 git log &&
        ! colorful paginated.out
 '
 
@@ -181,11 +173,7 @@ test_expect_success 'color when writing to a file intended for a pager' '
 test_expect_success TTY 'colors are sent to pager for external commands' '
        test_config alias.externallog "!git log" &&
        test_config color.ui auto &&
-       (
-               TERM=vt100 &&
-               export TERM &&
-               test_terminal git -p externallog
-       ) &&
+       test_terminal env TERM=vt100 git -p externallog &&
        colorful paginated.out
 '
 
index e41fa00b80e9b3eb47e45be848397ccda0f47c53..1b824fe5ede3b933350696b78b6f53c1c69d0fff 100755 (executable)
@@ -24,7 +24,8 @@ test_expect_success 'set up a bit of history' '
        git tag -m "annotated tag" annotated &&
        git checkout -b side HEAD^^ &&
        test_commit side2 &&
-       test_commit side3
+       test_commit side3 &&
+       test_merge merge main3
 '
 
 test_expect_success 'showing two commits' '
@@ -109,8 +110,11 @@ test_expect_success 'showing range' '
 '
 
 test_expect_success '-s suppresses diff' '
-       echo main3 >expect &&
-       git show -s --format=%s main3 >actual &&
+       cat >expect <<-\EOF &&
+       merge
+       main3
+       EOF
+       git show -s --format=%s merge main3 >actual &&
        test_cmp expect actual
 '
 
index f136ee7bb5300966c0c3c9d2250dc81763db9feb..16faa0781373bb3769ce9f0fa0a09be8c2b2ed81 100755 (executable)
@@ -33,7 +33,7 @@ test_expect_success 'reset --hard should restore unmerged ones' '
 
 '
 
-test_expect_success 'reset --hard did not corrupt index nor cached-tree' '
+test_expect_success 'reset --hard did not corrupt index or cached-tree' '
 
        T=$(git write-tree) &&
        rm -f .git/index &&
index c28e8d8ada68f37bc0090e07f7baf21c17c2de0b..7c882450317b85ffdeabc105ee62a18ce3b04ca9 100755 (executable)
@@ -249,8 +249,7 @@ test_expect_success 'submodule add in subdirectory with relative path should fai
 '
 
 test_expect_success 'setup - add an example entry to .gitmodules' '
-       GIT_CONFIG=.gitmodules \
-       git config submodule.example.url git://example.com/init.git
+       git config --file=.gitmodules submodule.example.url git://example.com/init.git
 '
 
 test_expect_success 'status should fail for unmapped paths' '
@@ -264,7 +263,7 @@ test_expect_success 'setup - map path in .gitmodules' '
        path = init
 EOF
 
-       GIT_CONFIG=.gitmodules git config submodule.example.path init &&
+       git config --file=.gitmodules submodule.example.path init &&
 
        test_cmp expect .gitmodules
 '
index 28ca76384f6472b5d74564450ed122da9d49fe70..29d3d2cca03d733245ab4d84899f10e78d542573 100755 (executable)
@@ -63,9 +63,6 @@ test_expect_success 'setup a submodule tree' '
         git submodule add ../none none &&
         test_tick &&
         git commit -m "none"
-       ) &&
-       (cd super &&
-        git tag initial-setup
        )
 '
 
@@ -706,7 +703,7 @@ test_expect_success 'submodule update places git-dir in superprojects git-dir re
        git clone super_update_r super_update_r2 &&
        (cd super_update_r2 &&
         git submodule update --init --recursive >actual &&
-        test_i18ngrep "Submodule path .submodule/subsubmodule.: .git reset --hard -q" actual &&
+        test_i18ngrep "Submodule path .submodule/subsubmodule.: checked out" actual &&
         (cd submodule/subsubmodule &&
          git log > ../../expected
         ) &&
@@ -777,38 +774,4 @@ test_expect_success 'submodule update --recursive drops module name before recur
         test_i18ngrep "Submodule path .deeper/submodule/subsubmodule.: checked out" actual
        )
 '
-
-test_expect_success 'submodule update --checkout clones detached HEAD' '
-       git clone super super4 &&
-       echo "detached HEAD" >expected &&
-       (cd super4 &&
-        git reset --hard initial-setup &&
-        git submodule init submodule &&
-        git submodule update >> /tmp/log 2>&1 &&
-        (cd submodule &&
-         git symbolic-ref HEAD > ../../actual ||
-         echo "detached HEAD" > ../../actual
-        )
-       ) &&
-       test_cmp actual expected &&
-       rm -rf super4
-'
-
-test_expect_success 'submodule update --merge clones attached HEAD' '
-       git clone super super4 &&
-       echo "refs/heads/master" >expected &&
-       (cd super4 &&
-        git reset --hard initial-setup &&
-        git submodule init submodule &&
-        git config submodule.submodule.update merge &&
-        git submodule update --merge &&
-        (cd submodule &&
-         git symbolic-ref HEAD > ../../actual ||
-         echo "detached HEAD" > ../../actual
-        )
-       ) &&
-       test_cmp actual expected &&
-       rm -rf super4
-'
-
 test_done
index bdc1f295030b61fd6d4fc0ef672dffa99c027d8b..116885a260a56f94550ace2b541498a5e6f8e877 100755 (executable)
@@ -223,7 +223,8 @@ test_expect_success 'Commit without message is allowed with --allow-empty-messag
        git add foo &&
        >empty &&
        git commit --allow-empty-message <empty &&
-       commit_msg_is ""
+       commit_msg_is "" &&
+       git tag empty-message-commit
 '
 
 test_expect_success 'Commit without message is no-no without --allow-empty-message' '
@@ -240,6 +241,14 @@ test_expect_success 'Commit a message with --allow-empty-message' '
        commit_msg_is "hello there"
 '
 
+test_expect_success 'commit -C empty respects --allow-empty-message' '
+       echo more >>foo &&
+       git add foo &&
+       test_must_fail git commit -C empty-message-commit &&
+       git commit -C empty-message-commit --allow-empty-message &&
+       commit_msg_is ""
+'
+
 commit_for_rebase_autosquash_setup () {
        echo "first content line" >>foo &&
        git add foo &&
index d58b097ff3b3d0e6e68d15491d38f1f32460f6e7..63e04277f99a08b15e12c3392f9e128147180fad 100755 (executable)
@@ -346,8 +346,21 @@ test_expect_success 'amend commit to fix date' '
 
 '
 
-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)' '
index 6313da2cdd979c6264e7a255711c6e444b768b96..051489ea334c9693c2d19823ad23947703f66d90 100755 (executable)
@@ -223,6 +223,22 @@ test_expect_success 'cleanup commit messages (whitespace option,-F)' '
 
 '
 
+test_expect_success 'cleanup commit messages (scissors option,-F,-e)' '
+
+       echo >>negative &&
+       cat >text <<EOF &&
+
+# to be kept
+# ------------------------ >8 ------------------------
+to be removed
+EOF
+       echo "# to be kept" >expect &&
+       git commit --cleanup=scissors -e -F text -a &&
+       git cat-file -p HEAD |sed -e "1,/^\$/d">actual &&
+       test_cmp expect actual
+
+'
+
 test_expect_success 'cleanup commit messages (strip option,-F)' '
 
        echo >>negative &&
@@ -328,6 +344,13 @@ test_expect_success 'message shows author when it is not equal to committer' '
          .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 &&
@@ -547,4 +570,30 @@ test_expect_success 'commit --status with custom comment character' '
        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
index 357375151d79d03d11275875dd10ceea42a3ba47..03dce09cfea5f1b5c19e7e8c4537a657cdf55dfc 100755 (executable)
@@ -134,14 +134,26 @@ test_expect_success 'with hook (-c)' '
 
 test_expect_success 'with hook (merge)' '
 
-       head=`git rev-parse HEAD` &&
-       git checkout -b other HEAD@{1} &&
-       echo "more" >> file &&
+       test_when_finished "git checkout -f master" &&
+       git checkout -B other HEAD@{1} &&
+       echo "more" >>file &&
+       git add file &&
+       git commit -m other &&
+       git checkout - &&
+       git merge --no-ff other &&
+       test "`git log -1 --pretty=format:%s`" = "merge (no editor)"
+'
+
+test_expect_success 'with hook and editor (merge)' '
+
+       test_when_finished "git checkout -f master" &&
+       git checkout -B other HEAD@{1} &&
+       echo "more" >>file &&
        git add file &&
        git commit -m other &&
        git checkout - &&
-       git merge other &&
-       test "`git log -1 --pretty=format:%s`" = merge
+       env GIT_EDITOR="\"\$FAKE_EDITOR\"" git merge --no-ff -e other &&
+       test "`git log -1 --pretty=format:%s`" = "merge"
 '
 
 cat > "$HOOK" <<'EOF'
@@ -151,34 +163,37 @@ EOF
 
 test_expect_success 'with failing hook' '
 
+       test_when_finished "git checkout -f master" &&
        head=`git rev-parse HEAD` &&
        echo "more" >> file &&
        git add file &&
-       ! GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit -c $head
+       test_must_fail env GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit -c $head
 
 '
 
 test_expect_success 'with failing hook (--no-verify)' '
 
+       test_when_finished "git checkout -f master" &&
        head=`git rev-parse HEAD` &&
        echo "more" >> file &&
        git add file &&
-       ! GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit --no-verify -c $head
+       test_must_fail env GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit --no-verify -c $head
 
 '
 
 test_expect_success 'with failing hook (merge)' '
 
+       test_when_finished "git checkout -f master" &&
        git checkout -B other HEAD@{1} &&
        echo "more" >> file &&
        git add file &&
        rm -f "$HOOK" &&
        git commit -m other &&
-       write_script "$HOOK" <<-EOF
+       write_script "$HOOK" <<-EOF &&
        exit 1
        EOF
        git checkout - &&
-       test_must_fail git merge other
+       test_must_fail git merge --no-ff other
 
 '
 
index c987b5ed652b977cc2169bdd4c64f42eccdf63db..148ab9ebc2fe24fff055d7af9662ef6bde5c6414 100755 (executable)
@@ -1350,8 +1350,7 @@ test_expect_success "status (core.commentchar with submodule summary)" '
 
 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/t7514-commit-patch.sh b/t/t7514-commit-patch.sh
new file mode 100755 (executable)
index 0000000..998a210
--- /dev/null
@@ -0,0 +1,34 @@
+#!/bin/sh
+
+test_description='hunk edit with "commit -p -m"'
+. ./test-lib.sh
+
+if ! test_have_prereq PERL
+then
+       skip_all="skipping '$test_description' tests, perl not available"
+       test_done
+fi
+
+test_expect_success 'setup (initial)' '
+       echo line1 >file &&
+       git add file &&
+       git commit -m commit1
+'
+
+test_expect_success 'edit hunk "commit -p -m message"' '
+       test_when_finished "rm -f editor_was_started" &&
+       rm -f editor_was_started &&
+       echo more >>file &&
+       echo e | env GIT_EDITOR=": >editor_was_started" git commit -p -m commit2 file &&
+       test -r editor_was_started
+'
+
+test_expect_success 'edit hunk "commit --dry-run -p -m message"' '
+       test_when_finished "rm -f editor_was_started" &&
+       rm -f editor_was_started &&
+       echo more >>file &&
+       echo e | env GIT_EDITOR=": >editor_was_started" git commit -p -m commit3 file &&
+       test -r editor_was_started
+'
+
+test_done
index 10aa028017833479c43bbb551741dfd36d9741aa..b16462132fd01f21cfd2af40a3c769803b0b7c50 100755 (executable)
@@ -57,11 +57,10 @@ create_merge_msgs () {
                git log --no-merges ^HEAD c2 c3
        } >squash.1-5-9 &&
        : >msg.nologff &&
-       echo >msg.nolognoff &&
+       : >msg.nolognoff &&
        {
                echo "* tag 'c3':" &&
-               echo "  commit 3" &&
-               echo
+               echo "  commit 3"
        } >msg.log
 }
 
@@ -71,7 +70,7 @@ verify_merge () {
        git diff --exit-code &&
        if test -n "$3"
        then
-               git show -s --pretty=format:%s HEAD >msg.act &&
+               git show -s --pretty=tformat:%s HEAD >msg.act &&
                test_cmp "$3" msg.act
        fi
 }
@@ -620,10 +619,10 @@ test_expect_success 'merge early part of c2' '
        git tag c6 &&
        git branch -f c5-branch c5 &&
        git merge c5-branch~1 &&
-       git show -s --pretty=format:%s HEAD >actual.branch &&
+       git show -s --pretty=tformat:%s HEAD >actual.branch &&
        git reset --keep HEAD^ &&
        git merge c5~1 &&
-       git show -s --pretty=format:%s HEAD >actual.tag &&
+       git show -s --pretty=tformat:%s HEAD >actual.tag &&
        test_cmp expected.branch actual.branch &&
        test_cmp expected.tag actual.tag
 '
index 5a193c500d282cc2b13e8de6e128229585897a16..dc30a514bf681dde44dea32e671632ef6f0a47a7 100755 (executable)
@@ -58,7 +58,7 @@ test_expect_success PERL 'custom tool commands override built-ins' '
 
 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
 '
index e7cac1db55113188c7149686399292bded9c07dd..2a3469bcbea39e832ab44280bb1223fc4ee20b61 100755 (executable)
@@ -191,4 +191,13 @@ test_expect_success 'indent of line numbers, ten lines' '
        test $(grep -c "  " actual) = 9
 '
 
+test_expect_success 'blaming files with CRLF newlines' '
+       git config core.autocrlf false &&
+       printf "testcase\r\n" >crlffile &&
+       git add crlffile &&
+       git commit -m testcase &&
+       git -c core.autocrlf=input blame crlffile >actual &&
+       grep "A U Thor" actual
+'
+
 test_done
index ee73013eed0b1c6410319aa3d7e4e57ea242a594..6e69fc4c65aeb77b1a4d784c7842762090ae6787 100755 (executable)
@@ -45,27 +45,27 @@ test_expect_success 'initialize old-style (v0) git svn layout' '
 test_expect_success 'initialize a multi-repository repo' '
        git svn init "$svnrepo" -T trunk -t tags -b branches &&
        git config --get-all svn-remote.svn.fetch > fetch.out &&
-       grep "^trunk:refs/remotes/trunk$" fetch.out &&
+       grep "^trunk:refs/remotes/origin/trunk$" fetch.out &&
        test -n "`git config --get svn-remote.svn.branches \
-                   "^branches/\*:refs/remotes/\*$"`" &&
+                   "^branches/\*:refs/remotes/origin/\*$"`" &&
        test -n "`git config --get svn-remote.svn.tags \
-                   "^tags/\*:refs/remotes/tags/\*$"`" &&
+                   "^tags/\*:refs/remotes/origin/tags/\*$"`" &&
        git config --unset svn-remote.svn.branches \
-                               "^branches/\*:refs/remotes/\*$" &&
+                               "^branches/\*:refs/remotes/origin/\*$" &&
        git config --unset svn-remote.svn.tags \
-                               "^tags/\*:refs/remotes/tags/\*$" &&
-       git config --add svn-remote.svn.fetch "branches/a:refs/remotes/a" &&
-       git config --add svn-remote.svn.fetch "branches/b:refs/remotes/b" &&
+                               "^tags/\*:refs/remotes/origin/tags/\*$" &&
+       git config --add svn-remote.svn.fetch "branches/a:refs/remotes/origin/a" &&
+       git config --add svn-remote.svn.fetch "branches/b:refs/remotes/origin/b" &&
        for i in tags/0.1 tags/0.2 tags/0.3; do
                git config --add svn-remote.svn.fetch \
-                                $i:refs/remotes/$i || exit 1; done &&
+                                $i:refs/remotes/origin/$i || exit 1; done &&
        git config --get-all svn-remote.svn.fetch > fetch.out &&
-       grep "^trunk:refs/remotes/trunk$" fetch.out &&
-       grep "^branches/a:refs/remotes/a$" fetch.out &&
-       grep "^branches/b:refs/remotes/b$" fetch.out &&
-       grep "^tags/0\.1:refs/remotes/tags/0\.1$" fetch.out &&
-       grep "^tags/0\.2:refs/remotes/tags/0\.2$" fetch.out &&
-       grep "^tags/0\.3:refs/remotes/tags/0\.3$" fetch.out &&
+       grep "^trunk:refs/remotes/origin/trunk$" fetch.out &&
+       grep "^branches/a:refs/remotes/origin/a$" fetch.out &&
+       grep "^branches/b:refs/remotes/origin/b$" fetch.out &&
+       grep "^tags/0\.1:refs/remotes/origin/tags/0\.1$" fetch.out &&
+       grep "^tags/0\.2:refs/remotes/origin/tags/0\.2$" fetch.out &&
+       grep "^tags/0\.3:refs/remotes/origin/tags/0\.3$" fetch.out &&
        grep "^:refs/${remotes_git_svn}" fetch.out
        '
 
@@ -73,14 +73,14 @@ test_expect_success 'initialize a multi-repository repo' '
 test_expect_success 'multi-fetch works on partial urls + paths' "
        git svn multi-fetch &&
        for i in trunk a b tags/0.1 tags/0.2 tags/0.3; do
-               git rev-parse --verify refs/remotes/\$i^0 >> refs.out || exit 1;
+               git rev-parse --verify refs/remotes/origin/\$i^0 >> refs.out || exit 1;
            done &&
        test -z \"\`sort < refs.out | uniq -d\`\" &&
        for i in trunk a b tags/0.1 tags/0.2 tags/0.3; do
          for j in trunk a b tags/0.1 tags/0.2 tags/0.3; do
                if test \$j != \$i; then continue; fi
-           test -z \"\`git diff refs/remotes/\$i \
-                                refs/remotes/\$j\`\" ||exit 1; done; done
+           test -z \"\`git diff refs/remotes/origin/\$i \
+                                refs/remotes/origin/\$j\`\" ||exit 1; done; done
        "
 
 test_expect_success 'migrate --minimize on old inited layout' '
@@ -98,27 +98,27 @@ test_expect_success 'migrate --minimize on old inited layout' '
        git svn migrate --minimize &&
        test -z "`git config -l | grep "^svn-remote\.git-svn\."`" &&
        git config --get-all svn-remote.svn.fetch > fetch.out &&
-       grep "^trunk:refs/remotes/trunk$" fetch.out &&
-       grep "^branches/a:refs/remotes/a$" fetch.out &&
-       grep "^branches/b:refs/remotes/b$" fetch.out &&
-       grep "^tags/0\.1:refs/remotes/tags/0\.1$" fetch.out &&
-       grep "^tags/0\.2:refs/remotes/tags/0\.2$" fetch.out &&
-       grep "^tags/0\.3:refs/remotes/tags/0\.3$" fetch.out &&
+       grep "^trunk:refs/remotes/origin/trunk$" fetch.out &&
+       grep "^branches/a:refs/remotes/origin/a$" fetch.out &&
+       grep "^branches/b:refs/remotes/origin/b$" fetch.out &&
+       grep "^tags/0\.1:refs/remotes/origin/tags/0\.1$" fetch.out &&
+       grep "^tags/0\.2:refs/remotes/origin/tags/0\.2$" fetch.out &&
+       grep "^tags/0\.3:refs/remotes/origin/tags/0\.3$" fetch.out &&
        grep "^:refs/${remotes_git_svn}" fetch.out
        '
 
 test_expect_success  ".rev_db auto-converted to .rev_map.UUID" '
        git svn fetch -i trunk &&
-       test -z "$(ls "$GIT_DIR"/svn/refs/remotes/trunk/.rev_db.* 2>/dev/null)" &&
-       expect="$(ls "$GIT_DIR"/svn/refs/remotes/trunk/.rev_map.*)" &&
+       test -z "$(ls "$GIT_DIR"/svn/refs/remotes/origin/trunk/.rev_db.* 2>/dev/null)" &&
+       expect="$(ls "$GIT_DIR"/svn/refs/remotes/origin/trunk/.rev_map.*)" &&
        test -n "$expect" &&
        rev_db="$(echo $expect | sed -e "s,_map,_db,")" &&
        convert_to_rev_db "$expect" "$rev_db" &&
        rm -f "$expect" &&
        test -f "$rev_db" &&
        git svn fetch -i trunk &&
-       test -z "$(ls "$GIT_DIR"/svn/refs/remotes/trunk/.rev_db.* 2>/dev/null)" &&
-       test ! -e "$GIT_DIR"/svn/refs/remotes/trunk/.rev_db &&
+       test -z "$(ls "$GIT_DIR"/svn/refs/remotes/origin/trunk/.rev_db.* 2>/dev/null)" &&
+       test ! -e "$GIT_DIR"/svn/refs/remotes/origin/trunk/.rev_db &&
        test -f "$expect"
        '
 
index d33d7140060613fbec4c45dc8d2c86394d64b4fa..fb41876677a9025f2d267ade0c8898e63022a704 100755 (executable)
@@ -48,7 +48,7 @@ test_expect_success 'setup svn repository' '
 test_expect_success 'setup git mirror and merge' '
        git svn init "$svnrepo" -t tags -T trunk -b branches &&
        git svn fetch &&
-       git checkout -b svn remotes/trunk &&
+       git checkout -b svn remotes/origin/trunk &&
        git checkout -b merge &&
        echo new file > new_file &&
        git add new_file &&
@@ -81,7 +81,7 @@ test_debug 'gitk --all & sleep 1'
 
 test_expect_success 'verify post-merge ancestry' "
        test x\`git rev-parse --verify refs/heads/svn\` = \
-            x\`git rev-parse --verify refs/remotes/trunk \` &&
+            x\`git rev-parse --verify refs/remotes/origin/trunk \` &&
        test x\`git rev-parse --verify refs/heads/svn^2\` = \
             x\`git rev-parse --verify refs/heads/merge\` &&
        git cat-file commit refs/heads/svn^ | grep '^friend$'
index cf4c05261b42ddd0711f78951adfc4a49ffdcc1e..45773ee560dab10a6dbec4bf19a82bbdae3fe7c4 100755 (executable)
@@ -20,20 +20,20 @@ test_expect_success 'setup repository and import' '
        ) &&
        git svn init "$svnrepo" -T trunk -b branches -t tags &&
        git svn fetch &&
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        echo bye >> README &&
        git commit -a -m bye &&
        git svn dcommit &&
-       git reset --hard a &&
+       git reset --hard origin/a &&
        echo why >> FEEDME &&
        git update-index --add FEEDME &&
        git commit -m feedme &&
        git svn dcommit &&
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        echo aye >> README &&
        git commit -a -m aye &&
        git svn dcommit &&
-       git reset --hard b &&
+       git reset --hard origin/b &&
        echo spy >> README &&
        git commit -a -m spy &&
        echo try >> README &&
@@ -42,26 +42,26 @@ test_expect_success 'setup repository and import' '
        '
 
 test_expect_success 'run log' "
-       git reset --hard a &&
-       git svn log -r2 trunk | grep ^r2 &&
-       git svn log -r4 trunk | grep ^r4 &&
+       git reset --hard origin/a &&
+       git svn log -r2 origin/trunk | grep ^r2 &&
+       git svn log -r4 origin/trunk | grep ^r4 &&
        git svn log -r3 | grep ^r3
        "
 
 test_expect_success 'run log against a from trunk' "
-       git reset --hard trunk &&
-       git svn log -r3 a | grep ^r3
+       git reset --hard origin/trunk &&
+       git svn log -r3 origin/a | grep ^r3
        "
 
 printf 'r1 \nr2 \nr4 \n' > expected-range-r1-r2-r4
 
 test_expect_success 'test ascending revision range' "
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        git svn log -r 1:4 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r1-r2-r4 -
        "
 
 test_expect_success 'test ascending revision range with --show-commit' "
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        git svn log --show-commit -r 1:4 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r1-r2-r4 -
        "
 
@@ -69,7 +69,7 @@ test_expect_success 'test ascending revision range with --show-commit (sha1)' "
        git svn find-rev r1 >expected-range-r1-r2-r4-sha1 &&
        git svn find-rev r2 >>expected-range-r1-r2-r4-sha1 &&
        git svn find-rev r4 >>expected-range-r1-r2-r4-sha1 &&
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        git svn log --show-commit -r 1:4 | grep '^r[0-9]' | cut -d'|' -f2 >out &&
        git rev-parse \$(cat out) >actual &&
        test_cmp expected-range-r1-r2-r4-sha1 actual
@@ -78,67 +78,67 @@ test_expect_success 'test ascending revision range with --show-commit (sha1)' "
 printf 'r4 \nr2 \nr1 \n' > expected-range-r4-r2-r1
 
 test_expect_success 'test descending revision range' "
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        git svn log -r 4:1 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r4-r2-r1 -
        "
 
 printf 'r1 \nr2 \n' > expected-range-r1-r2
 
 test_expect_success 'test ascending revision range with unreachable revision' "
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        git svn log -r 1:3 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r1-r2 -
        "
 
 printf 'r2 \nr1 \n' > expected-range-r2-r1
 
 test_expect_success 'test descending revision range with unreachable revision' "
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        git svn log -r 3:1 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r2-r1 -
        "
 
 printf 'r2 \n' > expected-range-r2
 
 test_expect_success 'test ascending revision range with unreachable upper boundary revision and 1 commit' "
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        git svn log -r 2:3 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r2 -
        "
 
 test_expect_success 'test descending revision range with unreachable upper boundary revision and 1 commit' "
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        git svn log -r 3:2 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r2 -
        "
 
 printf 'r4 \n' > expected-range-r4
 
 test_expect_success 'test ascending revision range with unreachable lower boundary revision and 1 commit' "
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        git svn log -r 3:4 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r4 -
        "
 
 test_expect_success 'test descending revision range with unreachable lower boundary revision and 1 commit' "
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        git svn log -r 4:3 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r4 -
        "
 
 printf -- '------------------------------------------------------------------------\n' > expected-separator
 
 test_expect_success 'test ascending revision range with unreachable boundary revisions and no commits' "
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        git svn log -r 5:6 | test_cmp expected-separator -
        "
 
 test_expect_success 'test descending revision range with unreachable boundary revisions and no commits' "
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        git svn log -r 6:5 | test_cmp expected-separator -
        "
 
 test_expect_success 'test ascending revision range with unreachable boundary revisions and 1 commit' "
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        git svn log -r 3:5 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r4 -
        "
 
 test_expect_success 'test descending revision range with unreachable boundary revisions and 1 commit' "
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        git svn log -r 5:3 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r4 -
        "
 
index 69e9c0db5d79c3c4c15db35970d61a91419c4fd7..a66f43c6b1a2d9194f87a17e1758f24018cf8b1b 100755 (executable)
@@ -83,36 +83,36 @@ EOF
        rm -f expect actual
 }
 
-test_expect_success 'init with -s/-T/-b/-t without --prefix warns' '
+test_expect_success 'init with -s/-T/-b/-t assumes --prefix=origin/' '
        test ! -d project &&
        git svn init -s "$svnrepo"/project project 2>warning &&
-       grep -q prefix warning &&
-       test_svn_configured_prefix "" &&
+       test_must_fail grep -q prefix warning &&
+       test_svn_configured_prefix "origin/" &&
        rm -rf project &&
        rm -f warning
        '
 
-test_expect_success 'clone with -s/-T/-b/-t without --prefix warns' '
+test_expect_success 'clone with -s/-T/-b/-t assumes --prefix=origin/' '
        test ! -d project &&
        git svn clone -s "$svnrepo"/project 2>warning &&
-       grep -q prefix warning &&
-       test_svn_configured_prefix "" &&
+       test_must_fail grep -q prefix warning &&
+       test_svn_configured_prefix "origin/" &&
        rm -rf project &&
        rm -f warning
        '
 
-test_expect_success 'init with -s/-T/-b/-t and --prefix does not warn' '
+test_expect_success 'init with -s/-T/-b/-t and --prefix "" still works' '
        test ! -d project &&
-       git svn init -s "$svnrepo"/project project --prefix="" 2>warning &&
+       git svn init -s "$svnrepo"/project project --prefix "" 2>warning &&
        test_must_fail grep -q prefix warning &&
        test_svn_configured_prefix "" &&
        rm -rf project &&
        rm -f warning
        '
 
-test_expect_success 'clone with -s/-T/-b/-t and --prefix does not warn' '
+test_expect_success 'clone with -s/-T/-b/-t and --prefix "" still works' '
        test ! -d project &&
-       git svn clone -s "$svnrepo"/project --prefix="" 2>warning &&
+       git svn clone -s "$svnrepo"/project --prefix "" 2>warning &&
        test_must_fail grep -q prefix warning &&
        test_svn_configured_prefix "" &&
        rm -rf project &&
index 15f93b4c2879d46309431f142b52ea61ece52215..ed4d1369cca6a232cdb7ed98fc75b074a808e46e 100755 (executable)
@@ -41,20 +41,20 @@ test_expect_success 'test clone with funky branch names' '
        git svn clone -s "$svnrepo/pr ject" project &&
        (
                cd project &&
-               git rev-parse "refs/remotes/fun%20plugin" &&
-               git rev-parse "refs/remotes/more%20fun%20plugin!" &&
-               git rev-parse "refs/remotes/$scary_ref" &&
-               git rev-parse "refs/remotes/%2Eleading_dot" &&
-               git rev-parse "refs/remotes/trailing_dot%2E" &&
-               git rev-parse "refs/remotes/trailing_dotlock%2Elock" &&
-               git rev-parse "refs/remotes/$non_reflog"
+               git rev-parse "refs/remotes/origin/fun%20plugin" &&
+               git rev-parse "refs/remotes/origin/more%20fun%20plugin!" &&
+               git rev-parse "refs/remotes/origin/$scary_ref" &&
+               git rev-parse "refs/remotes/origin/%2Eleading_dot" &&
+               git rev-parse "refs/remotes/origin/trailing_dot%2E" &&
+               git rev-parse "refs/remotes/origin/trailing_dotlock%2Elock" &&
+               git rev-parse "refs/remotes/origin/$non_reflog"
        )
        '
 
 test_expect_success 'test dcommit to funky branch' "
        (
                cd project &&
-               git reset --hard 'refs/remotes/more%20fun%20plugin!' &&
+               git reset --hard 'refs/remotes/origin/more%20fun%20plugin!' &&
                echo hello >> foo &&
                git commit -m 'hello' -- foo &&
                git svn dcommit
@@ -64,7 +64,7 @@ test_expect_success 'test dcommit to funky branch' "
 test_expect_success 'test dcommit to scary branch' '
        (
                cd project &&
-               git reset --hard "refs/remotes/$scary_ref" &&
+               git reset --hard "refs/remotes/origin/$scary_ref" &&
                echo urls are scary >> foo &&
                git commit -m "eep" -- foo &&
                git svn dcommit
@@ -74,7 +74,7 @@ test_expect_success 'test dcommit to scary branch' '
 test_expect_success 'test dcommit to trailing_dotlock branch' '
        (
                cd project &&
-               git reset --hard "refs/remotes/trailing_dotlock%2Elock" &&
+               git reset --hard "refs/remotes/origin/trailing_dotlock%2Elock" &&
                echo who names branches like this anyway? >> foo &&
                git commit -m "bar" -- foo &&
                git svn dcommit
index 1d92c05035f8fe68885a6338ceca4307f19e8663..1c84ce1023cedc5005009d3632784125180be075 100755 (executable)
@@ -58,19 +58,19 @@ test_expect_success 'test clone --stdlayout with percent escapes' '
        git svn clone --stdlayout "$svnrepo/pr%20ject" percent &&
        (
                cd percent &&
-               git rev-parse refs/remotes/trunk^0 &&
-               git rev-parse refs/remotes/b^0 &&
-               git rev-parse refs/remotes/tags/v1^0
+               git rev-parse refs/remotes/origin/trunk^0 &&
+               git rev-parse refs/remotes/origin/b^0 &&
+               git rev-parse refs/remotes/origin/tags/v1^0
        )
 '
 
 test_expect_success 'test clone -s with unescaped space' '
-       git svn clone -s "$svnrepo/pr ject" space &&
+       git svn clone -s "$svnrepo/pr ject" --prefix origin/ space &&
        (
                cd space &&
-               git rev-parse refs/remotes/trunk^0 &&
-               git rev-parse refs/remotes/b^0 &&
-               git rev-parse refs/remotes/tags/v1^0
+               git rev-parse refs/remotes/origin/trunk^0 &&
+               git rev-parse refs/remotes/origin/b^0 &&
+               git rev-parse refs/remotes/origin/tags/v1^0
        )
 '
 
index 096abd1fe5e37444a442e698a5d5734823a45798..0d53fc901497f49e95bf2644b31baf144aac8376 100755 (executable)
@@ -20,14 +20,14 @@ test_expect_success 'test clone with multi-glob in branch names' '
        git svn clone -T trunk -b branches/*/* -t tags \
                      "$svnrepo/project" project &&
        (cd project &&
-               git rev-parse "refs/remotes/v14.1/beta" &&
-               git rev-parse "refs/remotes/v14.1/gold"
+               git rev-parse "refs/remotes/origin/v14.1/beta" &&
+               git rev-parse "refs/remotes/origin/v14.1/gold"
        )
        '
 
 test_expect_success 'test dcommit to multi-globbed branch' "
        (cd project &&
-       git reset --hard 'refs/remotes/v14.1/gold' &&
+       git reset --hard 'refs/remotes/origin/v14.1/gold' &&
        echo hello >> foo &&
        git commit -m 'hello' -- foo &&
        git svn dcommit
index 4b034a67f305622f146e66914139e58045e2457e..4e95f791db1ff2be9781cf965d5a12a86c5a8ce3 100755 (executable)
@@ -29,30 +29,30 @@ test_expect_success 'initialize svnrepo' '
 test_expect_success 'import into git' '
        git svn init --stdlayout "$svnrepo" &&
        git svn fetch &&
-       git checkout remotes/trunk
+       git checkout remotes/origin/trunk
 '
 
 test_expect_success 'git svn branch tests' '
        git svn branch a &&
        base=$(git rev-parse HEAD:) &&
-       test $base = $(git rev-parse remotes/a:) &&
+       test $base = $(git rev-parse remotes/origin/a:) &&
        git svn branch -m "created branch b blah" b &&
-       test $base = $(git rev-parse remotes/b:) &&
+       test $base = $(git rev-parse remotes/origin/b:) &&
        test_must_fail git branch -m "no branchname" &&
        git svn branch -n c &&
-       test_must_fail git rev-parse remotes/c &&
+       test_must_fail git rev-parse remotes/origin/c &&
        test_must_fail git svn branch a &&
        git svn branch -t tag1 &&
-       test $base = $(git rev-parse remotes/tags/tag1:) &&
+       test $base = $(git rev-parse remotes/origin/tags/tag1:) &&
        git svn branch --tag tag2 &&
-       test $base = $(git rev-parse remotes/tags/tag2:) &&
+       test $base = $(git rev-parse remotes/origin/tags/tag2:) &&
        git svn tag tag3 &&
-       test $base = $(git rev-parse remotes/tags/tag3:) &&
+       test $base = $(git rev-parse remotes/origin/tags/tag3:) &&
        git svn tag -m "created tag4 foo" tag4 &&
-       test $base = $(git rev-parse remotes/tags/tag4:) &&
+       test $base = $(git rev-parse remotes/origin/tags/tag4:) &&
        test_must_fail git svn tag -m "no tagname" &&
        git svn tag -n tag5 &&
-       test_must_fail git rev-parse remotes/tags/tag5 &&
+       test_must_fail git rev-parse remotes/origin/tags/tag5 &&
        test_must_fail git svn tag tag1
 '
 
index c3443ceb251f87806312f4e6dadb54881b52a8fe..c44de267a1c0e2546eb06c3607d2daef41a6a330 100755 (executable)
@@ -67,7 +67,7 @@ test_expect_success 'fetch fails on ee' '
        '
 
 tmp_config_get () {
-       GIT_CONFIG=.git/svn/.metadata git config --get "$1"
+       git config --file=.git/svn/.metadata --get "$1"
 }
 
 test_expect_success 'failure happened without negative side effects' '
@@ -97,7 +97,6 @@ test_expect_success 'fresh clone with svn.authors-file in config' '
                test x = x"$(git config svn.authorsfile)" &&
                test_config="$HOME"/.gitconfig &&
                sane_unset GIT_DIR &&
-               sane_unset GIT_CONFIG &&
                git config --global \
                  svn.authorsfile "$HOME"/svn-authors &&
                test x"$HOME"/svn-authors = x"$(git config svn.authorsfile)" &&
index 5280e5f1e405f2a93620b496c64e85e73181f13a..93db45db7d69e460d7005815c19ccc63e916e50c 100755 (executable)
@@ -12,7 +12,7 @@ test_expect_success 'clone using git svn' 'git svn clone -s "$svnrepo" x'
 test_expect_success 'test that b1 exists and is empty' '
        (
                cd x &&
-               git reset --hard branch-c &&
+               git reset --hard origin/branch-c &&
                test -f b1 &&
                ! test -s b1
        )
index 3cd06718eb552794e04afe0860d0fc1e187eed66..8e7f7d68b7349cdbb11ee9337444c066ae590f99 100755 (executable)
@@ -66,18 +66,18 @@ test_expect_success 'clone multiple branch and tag paths' '
                      -t tags_A/* --tags tags_B \
                      "$svnrepo/project" git_project &&
        ( cd git_project &&
-               git rev-parse refs/remotes/first &&
-               git rev-parse refs/remotes/second &&
-               git rev-parse refs/remotes/1 &&
-               git rev-parse refs/remotes/2 &&
-               git rev-parse refs/remotes/tags/1.0 &&
-               git rev-parse refs/remotes/tags/2.0 &&
-               git rev-parse refs/remotes/tags/3.0 &&
-               git rev-parse refs/remotes/tags/4.0 &&
-               git rev-parse refs/remotes/tags/v5 &&
-               git rev-parse refs/remotes/tags/v6 &&
-               git rev-parse refs/remotes/tags/v7 &&
-               git rev-parse refs/remotes/tags/v8
+               git rev-parse refs/remotes/origin/first &&
+               git rev-parse refs/remotes/origin/second &&
+               git rev-parse refs/remotes/origin/1 &&
+               git rev-parse refs/remotes/origin/2 &&
+               git rev-parse refs/remotes/origin/tags/1.0 &&
+               git rev-parse refs/remotes/origin/tags/2.0 &&
+               git rev-parse refs/remotes/origin/tags/3.0 &&
+               git rev-parse refs/remotes/origin/tags/4.0 &&
+               git rev-parse refs/remotes/origin/tags/v5 &&
+               git rev-parse refs/remotes/origin/tags/v6 &&
+               git rev-parse refs/remotes/origin/tags/v7 &&
+               git rev-parse refs/remotes/origin/tags/v8
        )
 '
 
@@ -85,8 +85,8 @@ test_expect_success 'Multiple branch or tag paths require -d' '
        ( cd git_project &&
                test_must_fail git svn branch -m "No new branch" Nope &&
                test_must_fail git svn tag -m "No new tag" Tagless &&
-               test_must_fail git rev-parse refs/remotes/Nope &&
-               test_must_fail git rev-parse refs/remotes/tags/Tagless
+               test_must_fail git rev-parse refs/remotes/origin/Nope &&
+               test_must_fail git rev-parse refs/remotes/origin/tags/Tagless
        ) &&
        ( cd svn_project &&
                svn_cmd up &&
index 16852d26aea6d8c8aeee3633ce6aaf50200a2036..65591374938b0d8967e6cbc7fe6a96746304bff0 100755 (executable)
@@ -17,7 +17,7 @@ test_expect_success 'git svn clone --stdlayout sets up trunk as master' '
        git svn clone -s "$svnrepo" g &&
        (
                cd g &&
-               test x`git rev-parse --verify refs/remotes/trunk^0` = \
+               test x`git rev-parse --verify refs/remotes/origin/trunk^0` = \
                     x`git rev-parse --verify refs/heads/master^0`
        )
 '
index b780e0efe3de8939f12e408517510f3601de494d..a0150f057d00e67d66fcc877db067595fd350a82 100755 (executable)
@@ -22,7 +22,7 @@ test_expect_success 'add red branch' "
        "
 
 test_expect_success 'add gre branch' "
-       GIT_CONFIG=.git/svn/.metadata git config --unset svn-remote.svn.branches-maxRev &&
+       git config --file=.git/svn/.metadata --unset svn-remote.svn.branches-maxRev &&
        git config svn-remote.svn.branches 'branches/{red,gre}:refs/remotes/*' &&
        git svn fetch &&
        git rev-parse refs/remotes/red &&
@@ -31,7 +31,7 @@ test_expect_success 'add gre branch' "
        "
 
 test_expect_success 'add green branch' "
-       GIT_CONFIG=.git/svn/.metadata git config --unset svn-remote.svn.branches-maxRev &&
+       git config --file=.git/svn/.metadata --unset svn-remote.svn.branches-maxRev &&
        git config svn-remote.svn.branches 'branches/{red,green}:refs/remotes/*' &&
        git svn fetch &&
        git rev-parse refs/remotes/red &&
@@ -40,7 +40,7 @@ test_expect_success 'add green branch' "
        "
 
 test_expect_success 'add all branches' "
-       GIT_CONFIG=.git/svn/.metadata git config --unset svn-remote.svn.branches-maxRev &&
+       git config --file=.git/svn/.metadata --unset svn-remote.svn.branches-maxRev &&
        git config svn-remote.svn.branches 'branches/*:refs/remotes/*' &&
        git svn fetch &&
        git rev-parse refs/remotes/red &&
index a486a98f84e741d6f16da55bfc537abdacb9a58f..184336f34611c7b10da936ca0b78bb5e77afb77f 100755 (executable)
@@ -35,8 +35,8 @@ test_expect_success 'fetch deleted tags from same revision with checksum error'
        cd git_project &&
        git svn fetch &&
 
-       git diff --exit-code mybranch:trunk/subdir/file tags/mytag:file &&
-       git diff --exit-code master:subdir/file tags/mytag^:file
+       git diff --exit-code origin/mybranch:trunk/subdir/file origin/tags/mytag:file &&
+       git diff --exit-code master:subdir/file origin/tags/mytag^:file
 '
 
 test_done
index 5ce7e2f3b0e68c976c873fe11a2aec31897e6e6c..7a6e33ba3c50a2c1ed153664e18649043a96c048 100755 (executable)
@@ -36,9 +36,9 @@ test_expect_success 'fetch deleted tags from same revision with no checksum erro
        cd git_project &&
        git svn fetch &&
 
-       git diff --exit-code master:subdir3/file tags/mytag:file &&
-       git diff --exit-code master:subdir2/file tags/mytag^:file &&
-       git diff --exit-code master:subdir1/file tags/mytag^^:file
+       git diff --exit-code master:subdir3/file origin/tags/mytag:file &&
+       git diff --exit-code master:subdir2/file origin/tags/mytag^:file &&
+       git diff --exit-code master:subdir1/file origin/tags/mytag^^:file
 '
 
 test_done
index 1eab7015c7fce6fb9a41b52dc4bb1a173455a4d6..6cb0909afee7742965e4caa865fc68722512556c 100755 (executable)
@@ -18,8 +18,8 @@ test_expect_success 'load svn dump' "
 
 test_expect_success 'propagate merge information' '
        git config svn.pushmergeinfo yes &&
-       git checkout svnb1 &&
-       git merge --no-ff svnb2 &&
+       git checkout origin/svnb1 &&
+       git merge --no-ff origin/svnb2 &&
        git svn dcommit
        '
 
@@ -29,7 +29,7 @@ test_expect_success 'check svn:mergeinfo' '
        '
 
 test_expect_success 'merge another branch' '
-       git merge --no-ff svnb3 &&
+       git merge --no-ff origin/svnb3 &&
        git svn dcommit
        '
 
@@ -40,7 +40,7 @@ test_expect_success 'check primary parent mergeinfo respected' '
        '
 
 test_expect_success 'merge existing merge' '
-       git merge --no-ff svnb4 &&
+       git merge --no-ff origin/svnb4 &&
        git svn dcommit
        '
 
@@ -53,7 +53,7 @@ test_expect_success "check both parents' mergeinfo respected" '
        '
 
 test_expect_success 'make further commits to branch' '
-       git checkout svnb2 &&
+       git checkout origin/svnb2 &&
        touch newb2file &&
        git add newb2file &&
        git commit -m "later b2 commit" &&
@@ -64,8 +64,8 @@ test_expect_success 'make further commits to branch' '
        '
 
 test_expect_success 'second forward merge' '
-       git checkout svnb1 &&
-       git merge --no-ff svnb2 &&
+       git checkout origin/svnb1 &&
+       git merge --no-ff origin/svnb2 &&
        git svn dcommit
        '
 
@@ -78,8 +78,8 @@ test_expect_success 'check new mergeinfo added' '
        '
 
 test_expect_success 'reintegration merge' '
-       git checkout svnb4 &&
-       git merge --no-ff svnb1 &&
+       git checkout origin/svnb4 &&
+       git merge --no-ff origin/svnb1 &&
        git svn dcommit
        '
 
@@ -92,11 +92,11 @@ test_expect_success 'check reintegration mergeinfo' '
        '
 
 test_expect_success 'dcommit a merge at the top of a stack' '
-       git checkout svnb1 &&
+       git checkout origin/svnb1 &&
        touch anotherfile &&
        git add anotherfile &&
        git commit -m "a commit" &&
-       git merge svnb4 &&
+       git merge origin/svnb4 &&
        git svn dcommit
        '
 
index cd4c662ba21cdc460254ccd4901fdea5a41de982..d6245cee081059d98e72758a3ff7bb42730a7662 100755 (executable)
@@ -70,9 +70,9 @@ test_expect_success 'rebase looses SVN merge (m)' '
 #
 test_expect_success 'reset and fetch gets the SVN merge (m) correctly' '
        git svn reset -r 3 &&
-       git reset --hard trunk &&
+       git reset --hard origin/trunk &&
        git svn fetch &&
-       test 2 = $(git cat-file -p trunk|grep parent|wc -l)
+       test 2 = $(git cat-file -p origin/trunk|grep parent|wc -l)
 '
 
 test_done
index 13ae7e33f9de5402eaab7b41d277d1d7b1289c54..fa3ef3b1f7408840cabc5eacb1b1851f1c8afaac 100755 (executable)
@@ -53,7 +53,7 @@ test_expect_success 'clone svn repo' '
 '
 
 test_expect_success 'verify merge commit' 'x=$(git rev-parse HEAD^2) &&
-       y=$(git rev-parse branch2) &&
+       y=$(git rev-parse origin/branch2) &&
        test "x$x" = "x$y"
 '
 
index af0ec0e2e3d6508f9a65c250f7db40bec5c1a756..52f2e46a5b4d393ce8783584f075a5b17ff36d70 100755 (executable)
@@ -46,7 +46,7 @@ test_expect_success 'clone svn repo' '
 '
 
 test_expect_success 'verify merge commit' 'x=$(git rev-parse HEAD^2) &&
-       y=$(git rev-parse branch2) &&
+       y=$(git rev-parse origin/branch2) &&
        test "x$x" = "x$y"
 '
 
index 53def876edcf199afb35c2a6e09b0d35979499fc..ba35fc06fcee2e2dad41db682b29ede932a2e96f 100755 (executable)
@@ -31,7 +31,7 @@ test_expect_success 'import into git' '
        git svn init --trunk=trunk/project --branches=branches/*/project \
                --tags=tags/*/project "$svnrepo" &&
        git svn fetch &&
-       git checkout remotes/trunk
+       git checkout remotes/origin/trunk
 '
 
 test_expect_success 'git svn branch tests' '
index 3edc4086d860e38e4dddab97a223071ab8e3cfc0..6146c3fec293915b4599748e7a787539a7715e1a 100755 (executable)
@@ -25,7 +25,6 @@ perl -e 'use DBI; use DBD::SQLite' >/dev/null 2>&1 || {
     test_done
 }
 
-unset GIT_DIR GIT_CONFIG
 WORKDIR=$(pwd)
 SERVERDIR=$(pwd)/gitcvs.git
 git_config="$SERVERDIR/config"
@@ -512,7 +511,7 @@ test_expect_success 'cvs co -c (shows module database)' '
 # Known issues with git-cvsserver current log output:
 #  - Hard coded "lines: +2 -3" placeholder, instead of real numbers.
 #  - CVS normally does not internally add a blank first line
-#    nor a last line with nothing but a space to log messages.
+#    or a last line with nothing but a space to log messages.
 #  - The latest cvs 1.12.x server sends +0000 timezone (with some hidden "MT"
 #    tagging in the protocol), and if cvs 1.12.x client sees the MT tags,
 #    it converts to local time zone.  git-cvsserver doesn't do the +0000
index 4caf36e0066313f5402f61645c4330093ba23fcf..7fab2ed977a529c8754b9e5acd44b7f7c2cfaf2f 100755 (executable)
@@ -403,7 +403,8 @@ test_expect_success 'submit --prepare-p4-only' '
                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" &&
index 59f875e830df432ed200eeca96e70100a1fb2d2b..915098418495b488b748db9e610c79f81223a960 100755 (executable)
@@ -452,53 +452,53 @@ test_expect_success 'prompt - format string starting with dash' '
 '
 
 test_expect_success 'prompt - pc mode' '
-       printf "BEFORE: (master):AFTER" >expected &&
+       printf "BEFORE: (\${__git_ps1_branch_name}):AFTER\\nmaster" >expected &&
        printf "" >expected_output &&
        (
                __git_ps1 "BEFORE:" ":AFTER" >"$actual" &&
                test_cmp expected_output "$actual" &&
-               printf "%s" "$PS1" >"$actual"
+               printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
 test_expect_success 'prompt - bash color pc mode - branch name' '
-       printf "BEFORE: (${c_green}master${c_clear}):AFTER" >expected &&
+       printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear}):AFTER\\nmaster" >expected &&
        (
                GIT_PS1_SHOWCOLORHINTS=y &&
                __git_ps1 "BEFORE:" ":AFTER" >"$actual"
-               printf "%s" "$PS1" >"$actual"
+               printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
 test_expect_success 'prompt - bash color pc mode - detached head' '
-       printf "BEFORE: (${c_red}(%s...)${c_clear}):AFTER" $(git log -1 --format="%h" b1^) >expected &&
+       printf "BEFORE: (${c_red}\${__git_ps1_branch_name}${c_clear}):AFTER\\n(%s...)" $(git log -1 --format="%h" b1^) >expected &&
        git checkout b1^ &&
        test_when_finished "git checkout master" &&
        (
                GIT_PS1_SHOWCOLORHINTS=y &&
                __git_ps1 "BEFORE:" ":AFTER" &&
-               printf "%s" "$PS1" >"$actual"
+               printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
 test_expect_success 'prompt - bash color pc mode - dirty status indicator - dirty worktree' '
-       printf "BEFORE: (${c_green}master${c_clear} ${c_red}*${c_clear}):AFTER" >expected &&
+       printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_red}*${c_clear}):AFTER\\nmaster" >expected &&
        echo "dirty" >file &&
        test_when_finished "git reset --hard" &&
        (
                GIT_PS1_SHOWDIRTYSTATE=y &&
                GIT_PS1_SHOWCOLORHINTS=y &&
                __git_ps1 "BEFORE:" ":AFTER" &&
-               printf "%s" "$PS1" >"$actual"
+               printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
 test_expect_success 'prompt - bash color pc mode - dirty status indicator - dirty index' '
-       printf "BEFORE: (${c_green}master${c_clear} ${c_green}+${c_clear}):AFTER" >expected &&
+       printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_green}+${c_clear}):AFTER\\nmaster" >expected &&
        echo "dirty" >file &&
        test_when_finished "git reset --hard" &&
        git add -u &&
@@ -506,13 +506,13 @@ test_expect_success 'prompt - bash color pc mode - dirty status indicator - dirt
                GIT_PS1_SHOWDIRTYSTATE=y &&
                GIT_PS1_SHOWCOLORHINTS=y &&
                __git_ps1 "BEFORE:" ":AFTER" &&
-               printf "%s" "$PS1" >"$actual"
+               printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
 test_expect_success 'prompt - bash color pc mode - dirty status indicator - dirty index and worktree' '
-       printf "BEFORE: (${c_green}master${c_clear} ${c_red}*${c_green}+${c_clear}):AFTER" >expected &&
+       printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_red}*${c_green}+${c_clear}):AFTER\\nmaster" >expected &&
        echo "dirty index" >file &&
        test_when_finished "git reset --hard" &&
        git add -u &&
@@ -521,25 +521,25 @@ test_expect_success 'prompt - bash color pc mode - dirty status indicator - dirt
                GIT_PS1_SHOWCOLORHINTS=y &&
                GIT_PS1_SHOWDIRTYSTATE=y &&
                __git_ps1 "BEFORE:" ":AFTER" &&
-               printf "%s" "$PS1" >"$actual"
+               printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
 test_expect_success 'prompt - bash color pc mode - dirty status indicator - before root commit' '
-       printf "BEFORE: (${c_green}master${c_clear} ${c_green}#${c_clear}):AFTER" >expected &&
+       printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_green}#${c_clear}):AFTER\\nmaster" >expected &&
        (
                GIT_PS1_SHOWDIRTYSTATE=y &&
                GIT_PS1_SHOWCOLORHINTS=y &&
                cd otherrepo &&
                __git_ps1 "BEFORE:" ":AFTER" &&
-               printf "%s" "$PS1" >"$actual"
+               printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
 test_expect_success 'prompt - bash color pc mode - inside .git directory' '
-       printf "BEFORE: (${c_green}GIT_DIR!${c_clear}):AFTER" >expected &&
+       printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear}):AFTER\\nGIT_DIR!" >expected &&
        echo "dirty" >file &&
        test_when_finished "git reset --hard" &&
        (
@@ -547,13 +547,13 @@ test_expect_success 'prompt - bash color pc mode - inside .git directory' '
                GIT_PS1_SHOWCOLORHINTS=y &&
                cd .git &&
                __git_ps1 "BEFORE:" ":AFTER" &&
-               printf "%s" "$PS1" >"$actual"
+               printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
 test_expect_success 'prompt - bash color pc mode - stash status indicator' '
-       printf "BEFORE: (${c_green}master${c_clear} ${c_lblue}\$${c_clear}):AFTER" >expected &&
+       printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_lblue}\$${c_clear}):AFTER\\nmaster" >expected &&
        echo 2 >file &&
        git stash &&
        test_when_finished "git stash drop" &&
@@ -561,18 +561,18 @@ test_expect_success 'prompt - bash color pc mode - stash status indicator' '
                GIT_PS1_SHOWSTASHSTATE=y &&
                GIT_PS1_SHOWCOLORHINTS=y &&
                __git_ps1 "BEFORE:" ":AFTER" &&
-               printf "%s" "$PS1" >"$actual"
+               printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
 
 test_expect_success 'prompt - bash color pc mode - untracked files status indicator' '
-       printf "BEFORE: (${c_green}master${c_clear} ${c_red}%%${c_clear}):AFTER" >expected &&
+       printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_red}%%${c_clear}):AFTER\\nmaster" >expected &&
        (
                GIT_PS1_SHOWUNTRACKEDFILES=y &&
                GIT_PS1_SHOWCOLORHINTS=y &&
                __git_ps1 "BEFORE:" ":AFTER" &&
-               printf "%s" "$PS1" >"$actual"
+               printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
        ) &&
        test_cmp expected "$actual"
 '
@@ -582,7 +582,7 @@ test_expect_success 'prompt - zsh color pc mode' '
        (
                ZSH_VERSION=5.0.0 &&
                GIT_PS1_SHOWCOLORHINTS=y &&
-               __git_ps1 "BEFORE:" ":AFTER" >"$actual"
+               __git_ps1 "BEFORE:" ":AFTER" &&
                printf "%s" "$PS1" >"$actual"
        ) &&
        test_cmp expected "$actual"
index 569b52dc0fa32f48f37dc0d29771118cc624c5e7..c081668dfe16c85dda29bace564f7c1c3da77cb0 100644 (file)
@@ -283,7 +283,7 @@ error "Test script did not set test_description."
 
 if test "$help" = "t"
 then
-       echo "$test_description"
+       printf '%s\n' "$test_description"
        exit 0
 fi
 
@@ -334,7 +334,7 @@ test_failure_ () {
        test_failure=$(($test_failure + 1))
        say_color error "not ok $test_count - $1"
        shift
-       echo "$@" | sed -e 's/^/#       /'
+       printf '%s\n' "$*" | sed -e 's/^/#      /'
        test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; }
 }
 
@@ -655,7 +655,6 @@ else # normal case, use ../bin-wrappers only unless $with_dashes:
        fi
 fi
 GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt
-unset GIT_CONFIG
 GIT_CONFIG_NOSYSTEM=1
 GIT_ATTR_NOSYSTEM=1
 export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_ATTR_NOSYSTEM
index 0df748784bb7f6b6f286dd37ada293df17cffeee..dfe8a83261b3623e64f99ddf8dc775616771ec4d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This program can either change modification time of the given
- * file(s) or just print it. The program does not change atime nor
+ * file(s) or just print it. The program does not change atime or
  * ctime (their values are explicitly preserved).
  *
  * The mtime can be changed to an absolute value:
index 434e8b892981e3b052437d1c7eb2668a70cf2dfa..5dabce60f363430d3800bdadc77b3617abbcbfb6 100644 (file)
@@ -59,8 +59,6 @@ int main(int argc, char **argv)
                OPT_STRING(0, "st", &string, "st", "get another string (pervert ordering)"),
                OPT_STRING('o', NULL, &string, "str", "get another string"),
                OPT_NOOP_NOARG(0, "obsolete"),
-               OPT_SET_PTR(0, "default-string", &string,
-                       "set string to default", (unsigned long)"default"),
                OPT_STRING_LIST(0, "list", &list, "str", "add str to list"),
                OPT_GROUP("Magic arguments"),
                OPT_ARGUMENT("quux", "means --quux"),
index 86e1679c1e0e1e58ebe5297f4c5f48ca1a1f6418..b468e4f88e730f88a1d231a574585ace56e7066a 100644 (file)
@@ -58,7 +58,7 @@ static int recvline_fh(FILE *helper, struct strbuf *buffer, const char *name)
        if (strbuf_getline(buffer, helper, '\n') == EOF) {
                if (debug)
                        fprintf(stderr, "Debug: Remote helper quit.\n");
-               exit(128);
+               return 1;
        }
 
        if (debug)
@@ -71,12 +71,6 @@ static int recvline(struct helper_data *helper, struct strbuf *buffer)
        return recvline_fh(helper->out, buffer, helper->name);
 }
 
-static void xchgline(struct helper_data *helper, struct strbuf *buffer)
-{
-       sendline(helper, buffer);
-       recvline(helper, buffer);
-}
-
 static void write_constant(int fd, const char *str)
 {
        if (debug)
@@ -163,7 +157,8 @@ static struct child_process *get_helper(struct transport *transport)
        while (1) {
                const char *capname;
                int mandatory = 0;
-               recvline(data, &buf);
+               if (recvline(data, &buf))
+                       exit(128);
 
                if (!*buf.buf)
                        break;
@@ -200,15 +195,9 @@ static struct child_process *get_helper(struct transport *transport)
                } else if (!strcmp(capname, "signed-tags")) {
                        data->signed_tags = 1;
                } else if (starts_with(capname, "export-marks ")) {
-                       struct strbuf arg = STRBUF_INIT;
-                       strbuf_addstr(&arg, "--export-marks=");
-                       strbuf_addstr(&arg, capname + strlen("export-marks "));
-                       data->export_marks = strbuf_detach(&arg, NULL);
+                       data->export_marks = xstrdup(capname + strlen("export-marks "));
                } else if (starts_with(capname, "import-marks")) {
-                       struct strbuf arg = STRBUF_INIT;
-                       strbuf_addstr(&arg, "--import-marks=");
-                       strbuf_addstr(&arg, capname + strlen("import-marks "));
-                       data->import_marks = strbuf_detach(&arg, NULL);
+                       data->import_marks = xstrdup(capname + strlen("import-marks "));
                } else if (starts_with(capname, "no-private-update")) {
                        data->no_private_update = 1;
                } else if (mandatory) {
@@ -307,7 +296,9 @@ static int set_helper_option(struct transport *transport,
                quote_c_style(value, &buf, NULL, 0);
        strbuf_addch(&buf, '\n');
 
-       xchgline(data, &buf);
+       sendline(data, &buf);
+       if (recvline(data, &buf))
+               exit(128);
 
        if (!strcmp(buf.buf, "ok"))
                ret = 0;
@@ -379,7 +370,8 @@ static int fetch_with_fetch(struct transport *transport,
        sendline(data, &buf);
 
        while (1) {
-               recvline(data, &buf);
+               if (recvline(data, &buf))
+                       exit(128);
 
                if (starts_with(buf.buf, "lock ")) {
                        const char *name = buf.buf + 5;
@@ -430,6 +422,8 @@ static int get_exporter(struct transport *transport,
        struct helper_data *data = transport->data;
        struct child_process *helper = get_helper(transport);
        int argc = 0, i;
+       struct strbuf tmp = STRBUF_INIT;
+
        memset(fastexport, 0, sizeof(*fastexport));
 
        /* we need to duplicate helper->in because we want to use it after
@@ -440,10 +434,14 @@ static int get_exporter(struct transport *transport,
        fastexport->argv[argc++] = "--use-done-feature";
        fastexport->argv[argc++] = data->signed_tags ?
                "--signed-tags=verbatim" : "--signed-tags=warn-strip";
-       if (data->export_marks)
-               fastexport->argv[argc++] = data->export_marks;
-       if (data->import_marks)
-               fastexport->argv[argc++] = data->import_marks;
+       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);
+       }
 
        for (i = 0; i < revlist_args->nr; i++)
                fastexport->argv[argc++] = revlist_args->items[i].string;
@@ -563,7 +561,9 @@ static int process_connect_service(struct transport *transport,
                goto exit;
 
        sendline(data, &cmdbuf);
-       recvline_fh(input, &cmdbuf, name);
+       if (recvline_fh(input, &cmdbuf, name))
+               exit(128);
+
        if (!strcmp(cmdbuf.buf, "")) {
                data->no_disconnect_req = 1;
                if (debug)
@@ -739,16 +739,22 @@ static int push_update_ref_status(struct strbuf *buf,
        return !(status == REF_STATUS_OK);
 }
 
-static void push_update_refs_status(struct helper_data *data,
+static int push_update_refs_status(struct helper_data *data,
                                    struct ref *remote_refs,
                                    int flags)
 {
        struct strbuf buf = STRBUF_INIT;
        struct ref *ref = remote_refs;
+       int ret = 0;
+
        for (;;) {
                char *private;
 
-               recvline(data, &buf);
+               if (recvline(data, &buf)) {
+                       ret = 1;
+                       break;
+               }
+
                if (!buf.len)
                        break;
 
@@ -766,6 +772,7 @@ static void push_update_refs_status(struct helper_data *data,
                free(private);
        }
        strbuf_release(&buf);
+       return ret;
 }
 
 static int push_refs_with_push(struct transport *transport,
@@ -846,8 +853,7 @@ static int push_refs_with_push(struct transport *transport,
        sendline(data, &buf);
        strbuf_release(&buf);
 
-       push_update_refs_status(data, remote_refs, flags);
-       return 0;
+       return push_update_refs_status(data, remote_refs, flags);
 }
 
 static int push_refs_with_export(struct transport *transport,
@@ -905,7 +911,15 @@ static int push_refs_with_export(struct transport *transport,
 
        if (finish_command(&exporter))
                die("Error while running fast-export");
-       push_update_refs_status(data, remote_refs, flags);
+       if (push_update_refs_status(data, remote_refs, flags))
+               return 1;
+
+       if (data->export_marks) {
+               strbuf_addf(&buf, "%s.tmp", data->export_marks);
+               rename(buf.buf, data->export_marks);
+               strbuf_release(&buf);
+       }
+
        return 0;
 }
 
@@ -974,7 +988,8 @@ static struct ref *get_refs_list(struct transport *transport, int for_push)
 
        while (1) {
                char *eov, *eon;
-               recvline(data, &buf);
+               if (recvline(data, &buf))
+                       exit(128);
 
                if (!*buf.buf)
                        break;
index 11c3550177dbaab30596be2fc3c1633f2a0485f8..e7b378c8b2c8f145519410bb17811bf60eb29384 100644 (file)
 #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)
-{
-       unsigned mode1, mode2;
-       const char *path1, *path2;
-       const unsigned char *sha1, *sha2;
-       int cmp, pathlen1, pathlen2;
-       int old_baselen = base->len;
 
-       sha1 = tree_entry_extract(t1, &path1, &mode1);
-       sha2 = tree_entry_extract(t2, &path2, &mode2);
+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)
+{
+       struct name_entry *e1, *e2;
+       int cmp;
 
-       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;
-       }
+       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;
+}
 
-       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);
+
+/*
+ * 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)
+{
+       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;
                }
-               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);
+
+               opt->add_remove(opt, addremove, mode, sha1, 1, p->path, 0);
        }
-       strbuf_setlen(base, old_baselen);
-       return 0;
+
+       return 0;       /* we are done with p */
 }
 
-/* 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)
+
+/*
+ * 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)
 {
-       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_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;
 }
 
-/* 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)
+/*
+ * 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;
+
+       /* at least something has to be valid */
+       assert(t || tp);
 
-       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;
+       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);
 
-               tree = read_sha1_file(sha1, &type, &size);
-               if (!tree || type != OBJ_TREE)
-                       die("corrupt tree sha %s", sha1_to_hex(sha1));
+               isdir = S_ISDIR(mode);
+               sha1 = NULL;
+               mode = 0;
+       }
 
-               if (DIFF_OPT_TST(opt, TREE_IN_RECURSIVE))
-                       opt->add_remove(opt, *prefix, mode, sha1, 1, base->buf, 0);
+       if (DIFF_OPT_TST(opt, RECURSIVE) && isdir) {
+               recurse = 1;
+               emitthis = DIFF_OPT_TST(opt, TREE_IN_RECURSIVE);
+       }
 
-               strbuf_addch(base, '/');
+       if (emitthis) {
+               int keep;
+               struct combine_diff_path *pprev = p;
+               p = path_appendnew(p, nparent, base, path, pathlen, mode, sha1);
 
-               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);
+               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, '/');
+               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 @@ static void skip_uninteresting(struct tree_desc *t, struct strbuf *base,
        }
 }
 
-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;
+                       }
+               }
+
+               /* 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);
+               }
+
+               /* 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);
                }
-               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;
+
+               /* 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);
                }
-               die("git diff-tree: internal error");
        }
 
-       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 @@ static inline int diff_might_be_rename(void)
                !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 @@ static void try_to_follow_renames(struct tree_desc *t1, struct tree_desc *t2, co
        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 @@ static void try_to_follow_renames(struct tree_desc *t1, struct tree_desc *t2, co
        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;
-       int retval;
+       struct combine_diff_path phead, *p;
+       pathchange_fn_t pathchange_old = opt->pathchange;
 
-       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);
+       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);
        }
-       free(tree1);
-       free(tree2);
+
+       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;
+
+       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/unicode_width.h b/unicode_width.h
new file mode 100644 (file)
index 0000000..4db7803
--- /dev/null
@@ -0,0 +1,288 @@
+static const struct interval zero_width[] = {
+{ 0x0300, 0x036F },
+{ 0x0483, 0x0489 },
+{ 0x0591, 0x05BD },
+{ 0x05BF, 0x05BF },
+{ 0x05C1, 0x05C2 },
+{ 0x05C4, 0x05C5 },
+{ 0x05C7, 0x05C7 },
+{ 0x0600, 0x0604 },
+{ 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, 0x08FE },
+{ 0x0900, 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 },
+{ 0x0C3E, 0x0C40 },
+{ 0x0C46, 0x0C48 },
+{ 0x0C4A, 0x0C4D },
+{ 0x0C55, 0x0C56 },
+{ 0x0C62, 0x0C63 },
+{ 0x0CBC, 0x0CBC },
+{ 0x0CBF, 0x0CBF },
+{ 0x0CC6, 0x0CC6 },
+{ 0x0CCC, 0x0CCD },
+{ 0x0CE2, 0x0CE3 },
+{ 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 },
+{ 0x1B00, 0x1B03 },
+{ 0x1B34, 0x1B34 },
+{ 0x1B36, 0x1B3A },
+{ 0x1B3C, 0x1B3C },
+{ 0x1B42, 0x1B42 },
+{ 0x1B6B, 0x1B73 },
+{ 0x1B80, 0x1B81 },
+{ 0x1BA2, 0x1BA5 },
+{ 0x1BA8, 0x1BA9 },
+{ 0x1BAB, 0x1BAB },
+{ 0x1BE6, 0x1BE6 },
+{ 0x1BE8, 0x1BE9 },
+{ 0x1BED, 0x1BED },
+{ 0x1BEF, 0x1BF1 },
+{ 0x1C2C, 0x1C33 },
+{ 0x1C36, 0x1C37 },
+{ 0x1CD0, 0x1CD2 },
+{ 0x1CD4, 0x1CE0 },
+{ 0x1CE2, 0x1CE8 },
+{ 0x1CED, 0x1CED },
+{ 0x1CF4, 0x1CF4 },
+{ 0x1DC0, 0x1DE6 },
+{ 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 },
+{ 0xAA29, 0xAA2E },
+{ 0xAA31, 0xAA32 },
+{ 0xAA35, 0xAA36 },
+{ 0xAA43, 0xAA43 },
+{ 0xAA4C, 0xAA4C },
+{ 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, 0xFE26 },
+{ 0xFEFF, 0xFEFF },
+{ 0xFFF9, 0xFFFB },
+{ 0x101FD, 0x101FD },
+{ 0x10A01, 0x10A03 },
+{ 0x10A05, 0x10A06 },
+{ 0x10A0C, 0x10A0F },
+{ 0x10A38, 0x10A3A },
+{ 0x10A3F, 0x10A3F },
+{ 0x11001, 0x11001 },
+{ 0x11038, 0x11046 },
+{ 0x11080, 0x11081 },
+{ 0x110B3, 0x110B6 },
+{ 0x110B9, 0x110BA },
+{ 0x110BD, 0x110BD },
+{ 0x11100, 0x11102 },
+{ 0x11127, 0x1112B },
+{ 0x1112D, 0x11134 },
+{ 0x11180, 0x11181 },
+{ 0x111B6, 0x111BE },
+{ 0x116AB, 0x116AB },
+{ 0x116AD, 0x116AD },
+{ 0x116B0, 0x116B5 },
+{ 0x116B7, 0x116B7 },
+{ 0x16F8F, 0x16F92 },
+{ 0x1D167, 0x1D169 },
+{ 0x1D173, 0x1D182 },
+{ 0x1D185, 0x1D18B },
+{ 0x1D1AA, 0x1D1AD },
+{ 0x1D242, 0x1D244 },
+{ 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/update_unicode.sh b/update_unicode.sh
new file mode 100755 (executable)
index 0000000..000b937
--- /dev/null
@@ -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
+)
index 286a9ed3ea960d07c267f5e2992e63589361f5e9..01de944a0a23f752364de51d7f5a5be6480575e8 100644 (file)
@@ -17,7 +17,7 @@
 
 static const char upload_pack_usage[] = "git upload-pack [--strict] [--timeout=<n>] <dir>";
 
-/* bits #0..7 in revision.h, #8..10 in commit.c */
+/* Remember to update object flag allocation in object.h */
 #define THEY_HAVE      (1u << 11)
 #define OUR_REF                (1u << 12)
 #define WANTED         (1u << 13)
index 10b61ec37da035fb864c94a4037960ed30b1248c..fad52d6392fab8aadc8f6555db5aafcde224a120 100644 (file)
@@ -125,15 +125,13 @@ PATTERNS("tex", "^(\\\\((sub)*section|chapter|part)\\*{0,1}\\{.*)$",
         "\\\\[a-zA-Z@]+|\\\\.|[a-zA-Z0-9\x80-\xff]+"),
 PATTERNS("cpp",
         /* Jump targets or access declarations */
-        "!^[ \t]*[A-Za-z_][A-Za-z_0-9]*:.*$\n"
-        /* C/++ functions/methods at top level */
-        "^([A-Za-z_][A-Za-z_0-9]*([ \t*]+[A-Za-z_][A-Za-z_0-9]*([ \t]*::[ \t]*[^[:space:]]+)?){1,}[ \t]*\\([^;]*)$\n"
-        /* compound type at top level */
-        "^((struct|class|enum)[^;]*)$",
+        "!^[ \t]*[A-Za-z_][A-Za-z_0-9]*:[[:space:]]*($|/[/*])\n"
+        /* functions/methods, variables, and compounds at top level */
+        "^((::[[:space:]]*)?[A-Za-z_].*)$",
         /* -- */
         "[a-zA-Z_][a-zA-Z0-9_]*"
-        "|[-+0-9.e]+[fFlL]?|0[xXbB]?[0-9a-fA-F]+[lL]?"
-        "|[-+*/<>%&^|=!]=|--|\\+\\+|<<=?|>>=?|&&|\\|\\||::|->"),
+        "|[-+0-9.e]+[fFlL]?|0[xXbB]?[0-9a-fA-F]+[lLuU]*"
+        "|[-+*/<>%&^|=!]=|--|\\+\\+|<<=?|>>=?|&&|\\|\\||::|->\\*?|\\.\\*"),
 PATTERNS("csharp",
         /* Keywords */
         "!^[ \t]*(do|while|for|if|else|instanceof|new|return|switch|case|throw|catch|using)\n"
diff --git a/utf8.c b/utf8.c
index a831d5089908df61574119b01a29a1991196f63a..b30790d043aa4b01da00686654dfb615a92e75b6 100644 (file)
--- a/utf8.c
+++ b/utf8.c
@@ -80,53 +80,8 @@ static int git_wcwidth(ucs_char_t ch)
 {
        /*
         * 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, 0x0357 }, { 0x035D, 0x036F }, { 0x0483, 0x0486 },
-               { 0x0488, 0x0489 }, { 0x0591, 0x05A1 }, { 0x05A3, 0x05B9 },
-               { 0x05BB, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 },
-               { 0x05C4, 0x05C4 }, { 0x0600, 0x0603 }, { 0x0610, 0x0615 },
-               { 0x064B, 0x0658 }, { 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)
@@ -135,34 +90,16 @@ static int git_wcwidth(ucs_char_t ch)
                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;
 }
 
 /*
index 633596e06fcaa1154980f95c858c61379c968d49..1dd86b8f33e04cfc6c0616578416acb1160b5718 100644 (file)
--- a/walker.c
+++ b/walker.c
@@ -60,6 +60,7 @@ static int process_tree(struct walker *walker, struct tree *tree)
        return 0;
 }
 
+/* Remember to update object flag allocation in object.h */
 #define COMPLETE       (1U << 0)
 #define SEEN           (1U << 1)
 #define TO_SCAN                (1U << 2)
index 0cc56368bd8ccef90ff643ce091cae25007eeee7..bc1bfb86003cb4133cc4ce3ce6423ce780ed7c84 100644 (file)
--- a/wrapper.c
+++ b/wrapper.c
@@ -174,6 +174,24 @@ ssize_t xwrite(int fd, const void *buf, size_t len)
        }
 }
 
+/*
+ * xpread() is the same as pread(), but it automatically restarts pread()
+ * operations with a recoverable error (EAGAIN and EINTR). xpread() DOES
+ * NOT GUARANTEE that "len" bytes is read even if the data is available.
+ */
+ssize_t xpread(int fd, void *buf, size_t len, off_t offset)
+{
+       ssize_t nr;
+       if (len > MAX_IO_SIZE)
+               len = MAX_IO_SIZE;
+       while (1) {
+               nr = pread(fd, buf, len, offset);
+               if ((nr < 0) && (errno == EAGAIN || errno == EINTR))
+                       continue;
+               return nr;
+       }
+}
+
 ssize_t read_in_full(int fd, void *buf, size_t count)
 {
        char *p = buf;
@@ -214,6 +232,26 @@ ssize_t write_in_full(int fd, const void *buf, size_t count)
        return total;
 }
 
+ssize_t pread_in_full(int fd, void *buf, size_t count, off_t offset)
+{
+       char *p = buf;
+       ssize_t total = 0;
+
+       while (count > 0) {
+               ssize_t loaded = xpread(fd, p, count, offset);
+               if (loaded < 0)
+                       return -1;
+               if (loaded == 0)
+                       return total;
+               count -= loaded;
+               p += loaded;
+               total += loaded;
+               offset += loaded;
+       }
+
+       return total;
+}
+
 int xdup(int fd)
 {
        int ret = dup(fd);
index c89c3bb5373c49490980eba45f5a81707cc79bea..b8841e1dcaa73223345b6c24eec3a91de74a0222 100644 (file)
@@ -17,7 +17,7 @@
 #include "strbuf.h"
 #include "utf8.h"
 
-static char cut_line[] =
+static const char cut_line[] =
 "------------------------ >8 ------------------------\n";
 
 static char default_wt_status_colors[][COLOR_MAXLEN] = {
@@ -188,7 +188,7 @@ static void wt_status_print_unmerged_header(struct wt_status *s)
        } 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 @@ static void wt_status_print_cached_header(struct wt_status *s)
                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 @@ static void wt_status_print_dirty_header(struct wt_status *s,
        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 @@ static void wt_status_print_other_header(struct wt_status *s,
        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
@@ -826,7 +826,7 @@ static void wt_status_print_other(struct wt_status *s,
        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)
@@ -841,6 +841,17 @@ void wt_status_truncate_message_at_cut_line(struct strbuf *buf)
        strbuf_release(&pattern);
 }
 
+void wt_status_add_cut_line(FILE *fp)
+{
+       const char *explanation = _("Do not touch the line above.\nEverything below will be removed.");
+       struct strbuf buf = STRBUF_INIT;
+
+       fprintf(fp, "%c %s", comment_line_char, cut_line);
+       strbuf_add_commented_lines(&buf, explanation, strlen(explanation));
+       fputs(buf.buf, fp);
+       strbuf_release(&buf);
+}
+
 static void wt_status_print_verbose(struct wt_status *s)
 {
        struct rev_info rev;
@@ -866,14 +877,8 @@ static void wt_status_print_verbose(struct wt_status *s)
         * diff before committing.
         */
        if (s->fp != stdout) {
-               const char *explanation = _("Do not touch the line above.\nEverything below will be removed.");
-               struct strbuf buf = STRBUF_INIT;
-
                rev.diffopt.use_color = 0;
-               fprintf(s->fp, "%c %s", comment_line_char, cut_line);
-               strbuf_add_commented_lines(&buf, explanation, strlen(explanation));
-               fputs(buf.buf, s->fp);
-               strbuf_release(&buf);
+               wt_status_add_cut_line(s->fp);
        }
        run_diff_index(&rev, 1);
 }
@@ -908,7 +913,7 @@ static void wt_status_print_tracking(struct wt_status *s)
                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)
@@ -1324,7 +1329,7 @@ void wt_status_print(struct wt_status *s)
                                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)
@@ -1337,9 +1342,9 @@ void wt_status_print(struct wt_status *s)
        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);
@@ -1356,7 +1361,7 @@ void wt_status_print(struct wt_status *s)
                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"
@@ -1542,19 +1547,21 @@ static void wt_shortstatus_print_tracking(struct wt_status *s)
                return;
        }
 
+#define LABEL(string) (s->no_gettext ? (string) : _(string))
+
        color_fprintf(s->fp, header_color, " [");
        if (upstream_is_gone) {
-               color_fprintf(s->fp, header_color, _("gone"));
+               color_fprintf(s->fp, header_color, LABEL(N_("gone")));
        } else if (!num_ours) {
-               color_fprintf(s->fp, header_color, _("behind "));
+               color_fprintf(s->fp, header_color, LABEL(N_("behind ")));
                color_fprintf(s->fp, branch_color_remote, "%d", num_theirs);
        } else if (!num_theirs) {
-               color_fprintf(s->fp, header_color, _("ahead "));
+               color_fprintf(s->fp, header_color, LABEL(N_(("ahead "))));
                color_fprintf(s->fp, branch_color_local, "%d", num_ours);
        } else {
-               color_fprintf(s->fp, header_color, _("ahead "));
+               color_fprintf(s->fp, header_color, LABEL(N_(("ahead "))));
                color_fprintf(s->fp, branch_color_local, "%d", num_ours);
-               color_fprintf(s->fp, header_color, _(", behind "));
+               color_fprintf(s->fp, header_color, ", %s", LABEL(N_("behind ")));
                color_fprintf(s->fp, branch_color_remote, "%d", num_theirs);
        }
 
@@ -1599,5 +1606,6 @@ void wt_porcelain_print(struct wt_status *s)
        s->use_color = 0;
        s->relative_paths = 0;
        s->prefix = NULL;
+       s->no_gettext = 1;
        wt_shortstatus_print(s);
 }
index 30a481258366733ad5d6a65e3a9c3ae1ee74e833..283a9fef0335ce272c6799a5af17274e4798e15f 100644 (file)
@@ -50,6 +50,7 @@ struct wt_status {
        enum commit_whence whence;
        int nowarn;
        int use_color;
+       int no_gettext;
        int display_comment_prefix;
        int relative_paths;
        int submodule_summary;
@@ -92,6 +93,7 @@ struct wt_status_state {
 };
 
 void wt_status_truncate_message_at_cut_line(struct strbuf *);
+void wt_status_add_cut_line(FILE *fp);
 void wt_status_prepare(struct wt_status *s);
 void wt_status_print(struct wt_status *s);
 void wt_status_collect(struct wt_status *s);